Christophe Jacquet — Carnet — Mot-clé : Programmation

Un émetteur FM-RDS à base de Raspberry Pi

20140420_smartphone.jpgDepuis 2012, PiFm (dû au club de robotique de l'Imperial College) permet de transformer son Raspberry Pi en émetteur de radio FM. Le principe ? Utiliser le générateur de PWM et faire varier sa fréquence : on peut ainsi moduler en fréquence une porteuse, ce signal étant disponible sur une broche GPIO du Raspberry Pi. On obtient un émetteur FM VHF, qui peut par exemple émettre dans la gamme des « radios FM » (bande II).

Depuis le début, j'avais dans l'idée d'ajouter à cet émetteur un générateur de signaux RDS. C'est désormais chose faite, avec le projet Pi-FM-RDS, qui est parfaitement fonctionnel depuis quelques jours.

Lire la suite...

Automatically merge calendars with Google Apps Script

I have several Google calendars: one for lectures, one for appointments, one for vacations, etc. I need to combine them automatically into a single ICS file. Surprisingly, this feature does not seem to exist off-the-shelf.

I have devised a solution based on Google Apps Script: a Javascript script runs periodically on the Google cloud, and generates the ICS file. Surprisingly, the script has to be in a Google Docs spreadsheet. The script editor is in the Tools menu. When the script works okay, it's possible to schedule its execution periodically in the script editor, via the Triggers menu. As easy as a good old cronjob.

Lire la suite...

Twenty years of computing

I recently realized that it has been 20 years since I started computer programming. Here's how it all started.

Lire la suite...

Minigeo

I'm releasing a new little project today. It's called Minigeo, it's shared on Google Project Hosting, it's released under GPLv3.

Minigeo is a lightweight Java library that allows one to plot geographical data (namely lines between points determined by a latitude-longitude pair), using Universal Transverse Mercator (UTM) projections.

The display is done using a Swing JFrame. The user may pan and zoom with the mouse à la Google Maps (i.e. drag to pan, scroll to zoom).

It is especially useful for educators, as students can very easily use this library during practical sessions. Minigeo is very basic, but ultra-simple to use.

20110717_minigeo_osmdata.png

The screenshot shows a Minigeo window displaying OpenStreetMap data as wireframe.

Vive la géométrie sphérique !

Soit le problème simple de calculer la longueur d'une balade, donnée par exemple sous forme d'une trace GPX, c'est-à-dire une suite de points dont on connaît les coordonnées dans le système WGS 84.

Ma première idée a été de projeter les points sur le plan (en utilisant par exemple une projection transverse de Mercator dans le bon fuseau UTM), puis de calculer la distance entre deux points successifs en utilisant bêtement le théorème de Pythagore. Cela fonctionne très bien, à condition que la projection soit valide pour toute la trace GPX. Aucun problème dans le cas d'une balade, mais pour un trajet réalisé en avion, qui s'étend sur plusieurs fuseaux UTM, cela n'est plus le cas. De plus, les formules de projection sont souvent assez compliquées.

En réalité, il est beaucoup plus simple, et plus universel, de raisonner directement en géométrie sphérique et de calculer les longueurs des arcs de grands cercles entre deux points successifs (les grands cercles sont les géodésiques d'une sphère, c'est-à-dire que les arcs de grands cercles sont les plus courts chemins entre deux points). Ceci est indépendant de toute projection.

Lire la suite...

Display GPX tracks using Google Maps API

Surprinsingly, the Google Maps Javascript API does not provide a built-in way to create an overlay from a GPX track, contrary to OpenLayers for instance.

Forum messages asking a way to add GPX overlays to Google Maps are numerous, and various solutions are proposed. Here I propose my own method, adapted to the Google Maps Javascript API v3. It relies on jQuery, so it is very simple.

Lire la suite...

POCSAG decoder

Two years ago, I did some experiments with the POCSAG paging protocol, that resulted in writing a POCSAG decoder in Java. I have no time and no desire to evolve it into a finished, packaged product, so I'm releasing it “as is” under the GPLv3, for the enjoyment of the radio enthusiast / amateur radio community.

The project, called jPOCSAG, is hosted on code.google.com[1].

The program is functional for my own use, but it is not intended to be a stable, released product. Rather, it is a codebase to experiment/play/tinker with, with no warranty of any kind. For these reasons, there is no “executable”; only the source code is available from a Subversion repository. Also, do not expect further updates to the source. I may, or may not, improve the program in the future, depending on my own needs. But feel free to use the code and improve it.

Notes

[1] By the way, Google Project Hosting is much more easy to use than SourceForge, although a little less customizable. Additionally, it's lightning fast compared to SourceForge.

ServerSpy update for Firefox 4

Server Spy is a little Firefox addon that displays the name of the server software serving the current page. The current version of Server Spy works with Firefox 3.6; it uses the status bar to display the server name.

Server Spy had to be adapted to Firefox 4 because the status bar is going away with the new release of Firefox. An “Add-on bar” is being introduced for extensions that desperately need a bar at the bottom of the window, but I don't want to force my users to display it. Therefore the new version of Server Spy will feature a new UI, not using the “Add-on bar”.

Lire la suite...

Environnement de développement de drivers sous Windows

J'ai eu besoin de mettre en place un environnement de développement de drivers pour Windows sur mon PC (qui fonctionne sous Windows Vista). Voici la procédure qu'il semble falloir suivre :

  1. Installer Visual Studio 2008.
  2. Installer le WDK (Windows Driver Kit) qui est disponible en version 7. À ce stade, cela ne fonctionne pas encore (messages du type « PASSIVE_LEVEL: undeclared identifier »). En effet, le dernier WDK semble n'être compatible qu'avec la version 7 du SDK de Windows. Or Visual Studio 2008 vient avec le SDK en versions 5 et 6...
  3. Installer alors le SDK Windows version 7 (attention, il fait 4 Go...).
  4. En l'état, cela ne fonctionne pas encore, il reste à sélectionner ce SDK, sinon Visual Studio continue à utiliser l'ancien. Procédure : lancer un shell avec l'environnement adapté au SDK (Démarrer > Tous les programmes > Windows SDK v7 > CMD Shell), puis taper la commande WindowsSdkVer.exe -version:v7.0.

Ouf ! Maintenant, cela devrait fonctionner. Encore que, j'ai eu des problèmes avec l'ordre des chemins des includes : il semble que si le DDK apparaît avant le SDK, ça génère des erreurs de compilation dans des fichiers de base. Par exemple, je me suis pris des « "_in_opt_" undeclared identifier » dans new.c ! J'ai résolu le problème en mettant directement le chemin des fichiers .h du DDK dans les directives #include.

Mais au fait, pourquoi tout ça ? Je poursuis mes expérimentations sur le RDS. J'ai voulu tester la clé USBFMRADIO-RD de chez Silicon Labs. Il s'agit de la réalisation d'une application note de leur chip tuner radio FM avec décodeur RDS, le Si4701. Ce « produit » clé radio étant ouvert (le code source est accessible : firmware et front-end Windows, schémas), je voulais l'utiliser pour récupérer facilement des flux RDS. Le front-end Windows fourni étant vraiment rudimentaire, j'ai dû le modifier et le recompiler pour mes premiers essais. Or il a besoin du DDK pour accéder aux périphériques USB HID...

Restez à l'écoute, je posterai bientôt des nouvelles de mes expérimentations RDS en général, et mon avis sur cette clé lorsque j'aurai poursuivi mes essais !

SQLite et Python

Généralement, quand on évoque une base de données disposant du langage SQL, on pense serveur à mettre en place, comptes utilisateurs à créer, et éventuellement bibliothèques à installer lorsque l'on veut accéder à la base depuis un programme. Bref, une lourdeur certaine, rédhibitoire pour stocker, par exemple, quelques données depuis un script lancé épisodiquement...

Cet article explique comment l'utilisation de bases de données devient simple avec SQLite : pas de serveur à installer, pas gestion des utilisateurs. L'utilisation est aussi simple que celle de fichiers textes. De plus, à partir de Python 2.5, le langage inclut en standard la bibliothèque d'accès aux bases sqlite3. SQLite est notamment utilisé par Firefox 3.

Lire la suite...

Dépendances circulaires dans Eclipse

Aussi étonnant que cela puisse paraître, Eclipse signale par défaut une erreur, et ne compile rien du tout, s'il y a des dépendances circulaires entre projets : il se contente de sortir un message d'erreur du type A cycle was detected in the build path of project.... Les dépendances circulaires sont pourtant nécessaires dans bien des cas.

Pour résoudre le problème, il faut aller modifier une préférence dans Java > Compiler > Building. Là, il faut régler Circular Dependencies sur Warning au lieu de Error.

C# : 1 – Java : 0

À l'occasion de quelques amusements en C# effectués en ce moment...

Il y a deux ans, je m'étais plaint des generics de Java. En effet, le paramétrage des types est effacé à la compilation, ce qui rend certaines opérations impossibles à faire. Par exemple la méthode toArray de l'interface List doit recevoir en paramètre un tableau du type paramètre, car celui-ci est oublié à la compilation. Mais hors de question de pouvoir écrire :

public static <T> T[] truc(T a) {
	List<T> liste = new ArrayList<T>();
	liste.add(a);
	return liste.toArray(new T[] {});
}

L'expression soulignée est incorrecte, parce que justement, à l'exécution la JVM ne connaît pas T... Problème insoluble.

Dans .Net, la CLR n'oublie pas le type des paramètres. Dans une méthode paramétrée par <T>, on peut donc parfaitement écrire une expression du type new T[] { ... }. Et la méthode ToArray n'a donc pas besoin qu'on lui fournisse un tableau du type paramètre. Le code ci-dessus, incorrect en Java, s'écrit de façon élégante en C# :

public static T[] truc<T>(T a)
{
	List<T> liste = new List<T>();
	liste.Add(a);
	return liste.ToArray();
}

Notons que pour ne rien simplifier, les concepteurs de Java et C# ont forcément trouvé le moyen de faire différer la syntaxe au niveau de la place du paramètre <T> dans la déclaration de fonction... Mais clairement, les generics me semblent avoir été traités à la légère en Java. Le système de l'erasure des informations de type, même s'il est suffisant pour assurer la type safety dans la plupart des cas, et même s'il permettait de garder la JVM inchangée, conduit à des solutions vraiment épouvantables (cast + @SuppressWarnings("unchecked")) dans des cas un peu complexes...

Conception d'OS

À partir de 2004, une série d'article très intéressants sur la conception et la réalisation d'un OS est parue dans GNU/Linux Magazine France (GLMF). Le code, les articles de GLMF en PDF, ainsi que divers documents sont disponibles sur le site de cet OS expérimental, appelé SOS.

Graphique de circulation

Soit le problème « ferroviaire » suivant :

Ce billet explique comment y arriver simplement, à l'aide d'un petit script en Ruby et de Gnuplot.

Lire la suite...

Ruby

Je me suis récemment mis à Ruby: je trouve ce langage assez agréable. Il reprend une bonne partie de la concision de Perl, tout en ayant un modèle objet assez propre. Il emprunte également aux langages fonctionnels, ce qui est aussi pratique à l'usage.

Comme petit exercice, j'ai réalisé un programme de résolution de Sudoku. Il n'est pas très intelligent, et procède comme suit :

  • pour chaque case inconnue de la grille, il maintient une liste de possibilités ;
  • il élimine donc les valeurs impossibles par ligne, colonne et bloc ;
  • si au sein d'une ligne, colonne ou bloc une possibilité n'apparaît qu'une seule fois, cela devient une certitude ;
  • si à ce stade la grille n'est pas résolue, on essaie une possibilité et on appelle récursivement la procédure de résolution (avec backtrack lorsqu'on tombe sur une incohérence).

Je n'ai pas regardé en détails le programme de Florent, mais je crois que le principe est assez voisin (mais il a quelques règles intelligentes en plus). Le programme (que je donne pour ceux qui veulent voir à quoi ressemble du Ruby, ou pour ceux qui veulent débuter un meilleur solveur de Sudoku) attend une grille au format texte, comme celles de Laurent, sur son entrée standard.

- page 1 de 2

Valid HTML5? © . ✍ Contact
Propulsé par DotClear.