Categories
Programming

Des nouvelles du projet JARR

Alors, quoi de neuf ?

L’interface graphique de JARR a beaucoup évoluée ces derniers temps ! L’ensemble est plus dynamique et plus moderne. Il y a encore un peu plus de JavaScript (avec React) grâce à jaesivsm. Un des avantages est qu’il est possible de lire les articles sans quitter la page principale (j’admets que j’aurais pu faire ça depuis longtemps). En tout cas avec React et compagnie, j’ai pas mal de choses à apprendre. Et comme vous le savez, moi et les interfaces…

Aussi, il est maintenant possible de catégoriser les flux. Enfin ! Beaucoup l’ont demandé. Et même si je ne fais pas un grand usage de cette fonctionnalité, je dois avouer que ceci permet d’avoir un menu plus clair et simple à lire.

Il y a également un certain nombre d’améliorations et corrections sous le capot. Notamment au niveau du crawler qui utilise dorénavant la syntaxe await des coroutines.

Enfin bref. Préparez-vous bien, car voici un aperçu de la nouvelle interface:

JARR-new-UI

Je vous invite à tester et me faire quelques retours. Vous pouvez aussi l’installer localement. Je pense que JARR est resté assez simple à déployer sur un serveur personnel. Y compris sur Heroku. Pour information, sur Heroku la version 3.5.1 de Python est utilisée.

Il y a 6 ans je n’aurais jamais pensé que ce projet arriverait à ce stade. Pour mémoire, voici la première version.

Categories
Programming

Apprendre Python avec Minecraft

Voici un nouveau livre pour appendre Python avec Minecraft. Je trouve ça vraiment super comme idée. Par contre, il faut avoir préalablement acheté le jeu. Il serait bien de plutôt pouvoir utiliser Minetest.

Categories
Programming

Pourquoi j’aime bien utiliser Flask

def post_postprocessor(updated_user=None, **kw):
    socketio.emit('update_user_representation', updated_user, namespace="/user")
 
with app.app_context():
    blueprint_user = manager.create_api_blueprint(models.User,
                                    methods=['GET', 'POST', 'PUT', 'DELETE'],
                                    allow_delete_many = True,
                                    postprocessors = {
                                        'POST': [post_postprocessor]
                                    })
    app.register_blueprint(blueprint_user)
 
if __name__ == "__main__":
    socketio.run(app,
                host=conf.WEBSERVER_HOST,
                port=conf.WEBSERVER_PORT,
                debug=conf.WEBSERVER_DEBUG)

Voici une API ReSTful pour un modèle (User) qui permet de propager vers différents clients les modifications effectuées sur un object.
Je trouve ça vraiment beau.

Categories
Programming

Just Another RSS Reader

JARR (Just Another RSS Reader) est le nouveau nom de pyAggr3g470r.

Ce changement répond à quelques critiques reçues. Le nouveau nom, qui me plaît bien, a été proposé par jaesivsm. Il est évidemment plus court, plus simple à écrire et à prononcer. Il manque juste le logo qui ira bien avec. Mais pour ça, il va falloir attendre un peu.

Voici la page officielle du projet.

Mais il n’y a pas uniquement le nom qui a changé. Un billet un peu plus technique va bientôt être publié.

Categories
Bidouillability Technology

Contrôler un Lego EV3 avec une API Web

Vous aussi vous voudriez commander votre robot avec une simple API Web? Par exemple pour embêter le chat ou surveiller votre domicile à distance (avec une arme sur son épaule il pourrait impressionner un cambrioleur et ressemblerait même à Johnny 5).
Dans ce cas, vous devez tester ceci et me dire ce que vous en pensez.

Il s’agit d’un micro serveur Web destiné à être installé sur un Lego Mindstorms EV3 avec le système ev3dev (basé sur Debian). J’ai simplement utilisé Flask afin de définir quelques endpoints correspondants aux différentes actions (avancer, reculer, tourner à droite, tourner à gauche et stopper).

Le README explique les quelques étapes nécessaires pour l’installation ainsi que l’utilisation. C’est vraiment simple. L’exemple ci-dessous ordonnera au robot d’avancer indéfiniment.

$ GET http://192.168.1.16:5000/move/forward
{"message": "OK", "direction": "forward", "action": "move"}

Le robot se stoppera dès qu’il recevra une requête GET sur l’endpoint /move/stop. Évidemment d’autres paramètres sont fournis par ev3dev. Je vais essayer de les rendre accessibles via l’API de manière simple. Par exemple demander au robot de se déplacer sur une distance ou de faire une rotation de x degrés. Il faudra prendre en compte la nature du sol ainsi que le niveau de charge de la batterie.

Je vais également ajouter au serveur une petite page Web avec du JavaScript qui permettra de contrôler le robot avec des boutons directionnels. Ce sera pratique pour commander le robot depuis un smartphone.

Categories
Steganography

Première contribution sur PyPI

Et voici ma première contribution sur le «Python Package Index». Le petit moment de fierté de la soirée.

J’ai récemment eu besoin de cet ancien code que je maintiens à jour de temps à autre. À cette occasion je m’étais dit que ce petit projet pourrait très bien avoir sa place sur PyPI. D’autres modules Python de stéganographie existent, mais ne sont généralement plus maintenus (ou ne supportent pas Python 3) et sont moins originaux.

Je serai aussi content que ce code puisse servir à quelqu’un. Voir attirer des contributeurs.

Il faut maintenant que j’améliore la documentation, afin que vous puissiez tranquillement exécuter la commande:

$ sudo pip install Stegano
Categories
Programming

Une nouvelle version majeure de pyAggr3g470r pointe son nez

pyAggr3g470r a vraiment bien évolué ces dernières semaines. Ceci grâce à d’excellentes contributions. Je dois dire que je suis très content de la tournure de ce projet. Il a atteint un très bon niveau de maturité avec une base de code bien structurée et solide. Et par-dessus tout, il s’agit d’un projet avec des contributions externes conséquentes.

Bref, listons ci-dessous les changements les plus notables.

Les filtres

La grosse nouveauté. Il est maintenant possible de créer des filtres sur les flux. La capture suivante illustre bien la fonctionnalité. Vous pouvez définir une correspondance (exacte ou avec des expressions régulières) entre une chaîne et le contenu d’un article. Si il y a correspondance au moment de la récupération du nouvel article du flux en question, l’article sera par exemple automatiquement marqué en tant que favori.

feed-filters

L’ajout de flux

L’ajout de flux est maintenant possible en fournissant l’adresse du flux ou du site. Dans le dernier cas pyAggr3g470r se chargera de trouver le flux automatiquement, lorsque c’est possible. Le bookmarklet fonctionne de la même manière (et utilise le même code en fait). Vous pouvez donc bookmarker une page Web quelconque.

add-a-feed

La recherche

La recherche est maintenant vraiment bien intégrée avec le reste. Elle prend en compte le flux courant (ou l’ensemble des flux), l’onglet courant (Tous les articles, Lus et Non lus) ainsi que le nombre maximum d’articles à afficher sur la page.

search

Les favoris

Le style de la page des favoris est également mieux intégré. Vous pouvez constater que les diverses listes de l’interface peuvent être triées sur les différentes colonnes.

Les favicons des flux sont récupérés. Par soucis de respect de la vie privée de l’utilisateur, pyAggr3g470r stock les favicons dans sa base de données.

favorites

Voilà, et je ne parlerai pas ici de toutes les améliorations du code (notamment du crawler client qui utilise l’API).

Categories
Programming

Évolutions récentes de pyAggr3g470r

pyAggr3g470r évolue vraiment bien ces derniers temps.

L’interface est maintenant plus homogène et plus rationnelle. Les articles favoris sont affichés sur la page principale ainsi que les résultats des recherches (avec le même template). Les différents filtres et tris peuvent ainsi être appliqués à ces vues.
Le menu principal a aussi été simplifié.

Cependant l’essentiel des évolutions réside dans les couches inférieures comme les controllers, l’API, la recherche (qui fonctionne maintenant sur Heroku), les deux crawlers (je rappel que pyAggr3g470r dispose d’un crawler pouvant être exécuté par le client et tirant parti de l’API de pyAggr3g470r).
Le module responsable de charger les variables de configurations a également largement été amélioré.
Dorénavant un flux de nouvelles qui rencontrera 6 erreurs consécutives de récupération sera automatiquement désactivé. Évidemment l’utilisateur a la possibilité de le réactiver.

Merci au contributeur sans qui pyAggr3g470r n’aurait pu bénéficier de toutes ces améliorations.

Vous pouvez tester les évolutions.

Categories
Programming

Déploiement simplifié de pyAggr3g470r

$ git clone https://bitbucket.org/cedricbonhomme/pyaggr3g470r.git
$ cd pyaggr3g470r/
$ ./install.sh postgres

Difficile de faire plus simple.

Il est aussi possible déployer l’application au sein d’une machine virtuelle avec Vagrant. Je viens de tester et ça fonctionne très bien. Vous pouvez utiliser SQLite au lieu de PostgreSQL.

Vous trouverez ici les différentes méthodes de déploiement.

Categories
Programming

Une nouvelle vue pour pyAggr3g470r

pyAggr3g471r-history

La version 6.4 introduit cette «nouvelle» vue qui permet de naviguer chronologiquement dans votre base d’articles. J’ai abandonné l’idée d’utiliser d3.js pour cette fonctionnalité. Finalement, rien de bien impressionnant. Mais j’aime bien le résultat.