dadadi blog

To content | To menu | To search

May 2010

Thursday, May 27 2010

gisconverter.php: a kml <-> geojson <-> wkt converter

For my next personal project, I need to convert in php, geographic data between different formats. I need that, among other things to insert those data in postgis. Actually, postgis support a lot of data format as output formats, but quite few as input formats.

Instead of of integrating that to my main project, I decided to create a related autonomous project. So, I had to implement more features than strictly needed. But I think it's more profitable in the middle and long run.

  • This library is separated from my application. So it's more easy to test, debug and extend.
  • That allow other people to reuse it in their application more easily.
  • That allow me to reuse it in my future application with zero reintegration work.

So, here is gisconverter.php

gisconverter.php only work with php 5.3 (and probably higher). php 5.3 has a few nice new features. So, I decided to not care about backward compatibility. I use namespaces so I can include it in my project without having to care about name conflict. I also use late static binding. It allow to use class constants. Prior to php 5.3, it was not possible to use class constants in derived classes. I also use closure quite a lot (along with array_map). It saved me a couple of lines of code, but I could easily have done without.

I also used phpunit to test the library. It allowed me have a really efficient workflow. I first write the tests, then I implement a method, and when all tests pass, I known my method is bug free. The tricky part is to write the tests correctly, to test the code thoroughly without being redundant. Now, I'd like to use phpunit in my main application. It's is a full website with a database, so I've not yet understood how to use it.

Monday, May 17 2010

nouvelle version mineure de prvcat

prvcat, est un plugin dotclear pour avoir des catégories privées. Une nouvelle version vient de sortir. Elle ajoute un champ de confirmation de mot de passe lors de l'enregistrement des catégories privées. Cela permettra d'éviter de se tromper en rentrant le mot de passe.

Si vous avez des remarques ou des suggestions à propos de ce plugin, n'hésitez pas à me laisser m'en faire part dans les commentaires de ce blog, ou par email.

Sunday, May 16 2010

configuration d'une imprimante pixma 610 en réseau.

Nous avons plusieurs ordinateurs sous Ubuntu ou Debian, ainsi qu'un serveur également sous Debian. Nous avons une imprimante/scanner pixma 610, qui était reliée à un des ordinateurs. Nous avons décidé de brancher l'imprimante sur le serveur, et de le configurer en serveur d'impression afin de pouvoir imprimer depuis tous les ordinateurs.

La manipulation, sans être extrêmement complexe, n'est pas triviale. Je la pose donc par écrit, tout d'abord pour m'en souvenir si je dois un jour la refaire, d'autre part, parcequ'elle pourrait être utile à d'autres personne.

configuration de l'imprimante

Installation des drivers sur le serveur

La première étape consiste à branche l'imprimante sur le serveur, et à installer les drivers afin qu'elle soit reconnue par le serveur. Pour cela, il faut se rendre sur le site autrichien de canon. En effet, il semble, d'après plusieurs commentaires lus sur les forums ubuntu que ce soit le seul endroit où tous les paquets nécessaires soient disponibles. On trouve alors la page de téléchargement des drivers. Il faut prendre les 4 paquets: scangearmp-common, scangearmp-mp610series, cnijfilter-common et cnijfilter-mp610series. Par chance, il existe des paquets Debian. Mais malheureusement, à cause de quelques utilitaires, ils dépendent de librairies graphiques que je ne souhaitais pas installer sur mon serveur (libxi6, libxext6, gtk, pango, cairo, etc).

Sous debian, il est possible d'installer un paquet sans tenir compte des dépendances avec l'option --force-depends de dpkg, mais cette solution n'est pas pérenne car apt proposera ensuite systématiquement la désinstallation de ces paquets. Il est également possible, grâce à equivs, de faire croire au système qu'une librairie est installée, sans que ce ne soit le cas. Je ne souhaitais pas non plus utiliser cette solution, car si plus tard, je veux installer un paquet qui dépende d'une de ces librairies, le paquet s'installerait correctement sans me prévenir qu'il y a un problème. J'ai donc extrait les paquets avec dpkg -x et dpkg -e. Puis j'ai édité les fichiers DEBIAN/control pour supprimer les dépendances aux librairies graphiques, et pour finir j'ai reconstruit les paquets avec dpkg -b. Cette étape n'est pas obligatoire, il est possible, pour plus de simplicité, d'installer toutes les dépendances demandées par les paquets des drivers, mais je préférais la réaliser afin de garder mon serveur un peu plus propre.

J'ai ensuite installé les fichiers ppd destinés à améliorer la qualité d'impression sous linux. Une fois téléchargée l'archive, l'installation est simple et bien documentée dans le fichier README. Je n'ai pas testé l'imprimante avant l'installation de ces fichiers; je ne sais donc pas dans quelle mesure ils améliorent l'impression.

Installation et configuration de cups

Il faut maintenant installer le paquet cups sur le serveur. Il faut ensuite modifier la directive Listen du fichier /etc/cups/cupsd.conf afin de rendre accessible cups depuis l'extérieur. La directive correspondant à ma configuration était:

Listen 192.168.1.2:631

192.168.1.2 est l'adresse du serveur sur le réseau local. 631 est le port par défaut d'ipp. J'ai également du modifier le firewall du serveur pour laisser passer le trafic venant du réseau local sur le port 631.

J'ai ensuite défini les droits d'accès et d'administration au serveur. J'ai laissé l'accès normal sans authentification à partir du réseau local. J'ai mis en place l'authentification pour la partie administration. Il y a deux possibilités: soit laisser l'accès à des utilisateurs qui ont un compte unix sur le serveur, soit recourir à des utilisateurs virtuels. J'ai choisi cette dernière solution. J'ai donc installé le paquet cups-client pour pouvoir utiliser la commande lppasswd qui m'a permis de créer ces utilisateurs, et de leur attribuer un mot de passe.

Voici la portion de mon fichier /etc/cups/cupsd.conf qui définit les droits d'accès:


DefaultAuthType BasicDigest

<location>
Order allow,deny
Allow From 127.0.0.1
Allow From @LOCAL
</location>

<location /admin>
AuthType Default
Require valid-user
Order allow,deny
Allow From 127.0.0.1
Allow From @LOCAL
</location>
<location /admin/conf>
AuthType Default
Require valid-user
Order allow,deny
Allow From 127.0.0.1
Allow From @LOCAL
</location>

Maintenant que cups est installé, il faut configurer l'imprimante. J'ai ouvert un navigateur à l'adresse http://192.168.1.2:631/, et j'ai suivi la procédure indiquée pour installer et configurer l'imprimante, il n'y avait aucune difficulté. J'ai lancé une page de test de l'impression pour vérifier que tout fonctionnait correctement.

Il est à noter que l'accès à la partie administration de cups se fait par défaut en https.

configuration des clients

Une fois cups installé, le plus dur est fait, mais il faut encore configurer les clients pour qu'ils utilisent le serveur d'impression. Il m'a fallu ajouter dans le fichier ~/.cups/client.conf, les deux lignes suivantes:

Encryption IfRequested
ServerName 192.168.1.2

Pour l'impression en console, il faut utiliser la commande lpadmin -d pour définir l'imprimante par défaut. On peut alors utiliser la commande lp sans devoir spécifier l'imprimante à chaque fois. Il est également recommandé d'installer le paquet cups-bsd afin de disposer des commandes lpr, lpq, lprm, etc.

configuration du scanner

L'imprimante étant multifonctions, j'ai aussi configuré le scanner. J'ai installé le paquet sane-utils sur le serveur. Le démon saned peut être lancé soit en permanence, soit par inetd (comportement par défaut). Comme je voulais qu'il soit lancé en permanence, j'ai du lancer dpkg-reconfigure sane-utils pour demander ce comportement.

J'ai ensuite édité le fichier /etc/sane.d/saned.conf pour y ajouter la ligne 192.168.1.0/24 afin que saned réponde aux requêtes venant du réseau local. J'ai également dû charger le module nf_conntrack_sane, puis modifier le firewall du serveur pour laisser passer le trafic venant du réseau local sur le port 6566.

Enfin, sur les postes clients, j'ai modifié les fichiers /etc/sane.d/net.conf pour qu'ils contiennent la ligne suivante: 192.168.1.2 (l'adresse du serveur).

L'imprimante/scanner est enfin configurée pour être utilisée en réseau.

conclusion

Je suis assez content d'avoir réalisé cette opération. Auparavant, pour imprimer un fichier, je devais le mettre sur clé usb puis aller l'ouvrir sur l'ordinateur connecté à l'imprimante, ça va être beaucoup plus pratique maintenant.

Cela dit, j'ai trouvé l'installation des drivers laborieuse. Le fait de devoir se rendre sur le site autrichien pour trouver les bons fichiers est complètement ubuesque. Heureusement que j'ai trouvé cette information par hasard sur les forums ubuntu. D'autre part, j'aurais aimé que les utilitaires de canon soient dans des paquets à part, cela m'aurait évité de devoir extraire puis reconstruire les paquets. Je ne sais d'ailleurs pas à quoi servent ces outils, l'impression fonctionne sans que je n'ai eu à les utiliser. Enfin, les paquets ne sont disponibles que pour une architecture 32bits. Si mon serveur avait été en 64bits, l'opération aurait été encore plus compliquée.

Thursday, May 6 2010

OpenLayers class to draw and modify a path

To display a map on a webpage, you can often use directly the api of a commercial provider (such as cloudmade Web Maps Lite or google maps api). The other solution is to use OpenLayers, a free javascript library to display embed maps in a web document.

With OpenLayers, it's quite easy to draw a path on the map. But unfortunately, once a point has been added to the path, it's not possible to modify or delete it. This is possible with web maps lite, as can be seen in this distance calculator. I really like the ergonomy of the web maps lite path creator, and wanted to have something similar for OpenLayers.

So, I wrote ModifiablePath, a class to improve OpenLayers path creator. So, when creating a path with this handler, you can move, delete or even add new points. I've put a demo online, and code is available at github.