Sometimes I write things, sometimes I don't.

To content | To menu | To search

Tuesday 12 April 2011

Apache 2 en mode multithreadé

internet.pngVous le savez (ou pas) les installations classiques d’Apache 2 (avec PHP et MySQL bien souvent) sur Ubuntu (et même Debian) se basent sur une version bien spécifique du serveur web : la version prefork. Son comportement est donc de créer des processus (lourds) pour traiter les différents clients qui veulent accéder aux pages web. L’inconvénient c’est que la multiplication des processus pour le système d’exploitation c’est … lourd. Pour le soulager un peu, on peut utiliser une version d’Apache pas forcément ultra connue s’appelant worker. Cela permet de traiter les clients avec des threads (processus légers) et c’est particulièrement intéressant pour les processeurs récents (ou même assez vieux en fait).

Pour installer la version worker d’Apache, rien de plus simple :
# aptitude install apache2-mpm-worker

Ah ouais, mais il veut me virer le mod PHP5 ? Ça y est le voici l’inconvénient, le mod PHP5 n’est pas thread safe. On ne peut donc pas l’utiliser avec la version multithread de Apache. Mais comme PHP est quand même ultra répandu sur le web et que l’on ne peut se passer de ce magnifique blog (j’entends quelqu’un qui me dit que je devrais mettre plus de contenu pour qu’il soit magnifique), il existe tout de même une solution pour faire l’interprétation des scripts PHP.

On va utiliser la technique FastCGI. À la base CGI était utilisé pour faire du contenu dynamique sur le web avec plein de langages de programmation (Perl, C, script shell, etc…). En fait, il n’y a pas vraiment de limite de langages. FastCGI peut donc parfaitement interpréter du PHP. Pour activer cela, on installe alors 2 petits paquets :
# aptitude install libapache2-mod-fcgid php5-cgi

Si mod_fcgid n’est pas automatiquement activé dans Apache 2, on fera aussi un petit :
# a2enmod fcgid

Dans le cas où on a besoin de faire des modifications dans la configuration de PHP, on ira plus voir /etc/php5/apache2/php.ini mais plutôt /etc/php5/cgi/php.ini.

L’inconvénient c’est que, contrairement à mod_php5 pour apache2-mpm-prefork, les pages PHP ne seront pas interprétées sans modifier les différents VirtualHost qui peuvent servir des scripts PHP. Il faudra donc ajouter dans chaque directive Directory contenant désignant des répertoires avec du PHP les directives suivantes :
AddHandler fcgid-script .php
FCGIWrapper /usr/lib/cgi-bin/php5 .php
Options ExecCGI


La ligne AddHandler permet de spécifier quelle extension de fichier est à exécuter via FastCGI. FCGIWrapper donne le programme à exécuter pour traiter l’extension donnée. Et il ne faut pas oublier l’option ExecCGI sans quoi le PHP ne sera pas interprété.

Au final, cela pourra donner un VirtualHost dans le genre de celui-ci :
<VirtualHost *:80>
  DocumentRoot /var/www/mon_site

  <Directory "/var/www/mon_site">
    AddHandler fcgid-script .php
    FCGIWrapper /usr/lib/cgi-bin/php5 .php
    Options ExecCGI Indexes FollowSymLinks MultiViews
  </Directory>
</VirtualHost>


Comme vous pouvez le voir, ça peut vite être lourd si on a beaucoup de VirtualHost à changer. C’est pour ça que je vous encourage donc d’utiliser le mod_macro (merci Romain pour l’astuce) pour vous simplifier votre future administration du serveur web. Une fois tous les VirtualHost modifiés, il faudra redémarrer le serveur Apache.
# /etc/init.d/apache2 restart

Et là, si votre Apache avait l’habitude d’être un gros consommateur de ressources, il devrait se calmer.

Monday 24 January 2011

GNOME Split en version 1.0

astuce.pngJ’aurais du en parler plus tôt, beaucoup plus tôt même. Le 18 novembre 2010 a été pour moi l’occasion de partager la version 1.0 de GNOME Split, nom de code Stable Isotope.

Cette version est donc sortie plus ou moins un an après la toute première version tout public de GNOME Split. Elle apporte principalement des corrections de bugs plutôt gênants et qui étaient là depuis pas mal de temps.

split-view.png
Comme on peut le voir l’interface n’a pas changé et j’avoue qu’elle me plaît bien comme elle est actuellement. Donc a priori, ça ne devrait pas (ou peu) changer par la suite. Voyons tout de même les corrections et quelques nouveautés qu’apporte la version 1.0 par rapport à la 0.9.

  • Amélioration des performances : les opérations de découpages et d’assemblages prennent en moyenne 2 fois moins de temps par rapport aux versions précédentes.
  • Prise en compte des cas où un ou plusieurs fichiers à assembler ne sont pas disponibles.
  • Meilleure gestion des exceptions et des erreurs dans le code.
  • Fenêtre de préférences légèrement revue pour la rendre plus compacte.
  • Correction générale de l’assistant, les pages ne se dupliquent plus.
  • Meilleure gestion de la fermeture des flux de fichiers lors d’un arrêt brutal (CTRL + C par exemple).
  • Affichage du pourcentage d’avancement dans le titre de la fenêtre.
  • Correction d’un bug qui ne permettait pas de découper des fichiers de plus de 2 Gio.
  • Mise à jour des traductions (traduction française complète).

J’espère que cette nouvelle version répondra aux attentes de beaucoup de personnes. Et nous voilà donc sur le chemin vers la 2.0 qui devra permettre après toutes les versions intermédiaires de découper un fichier en cryptant les données via mot de passe et aussi d’uploader des fichiers directement sur des sites web dédiés afin de les partager.

Comme toujours, les archives de code sont et le dépôt pour les ubunteros est ici.

Thursday 6 January 2011

Et quand l'activité a besoin d'un objet ?

mobile.pngJe ne me souviens pas avoir parlé de programmation Android par ici. ce billet est donc l’occasion de commencer l’exploration du merveilleux OS mobile que nous fournit gracieusement Google. J’ai un smartphone qui carbure avec Android depuis bientôt 2 ans et je ne m’étais intéressé que vaguement à la programmation d’applications dessus. Dans mon parcours universitaire, j’ai eu l’occasion d’aborder ce sujet et mon projet tuteuré consiste principalement à faire une application pour Android. Trêve de blabla, passons à l’action.

Je ne vais pas refaire un cours sur Android, nombre de tutoriaux et d’exemples sont disponibles sur la toile. Dans le cadre de mon projet, j’avais donc un souci pour passer de l’information d’une activité à une autre. En effet, seuls les types primitifs et quelques autres trucs peuvent être passés d’une activité à une autre. Malheureusement, pas moyen de faire voyager un objet “simple” sans modification. Il faut qu’il implémente soit Serializable (connu par tous les bons programmeurs Java) soit Parcelable (propre à Android), “pour les surprendre on peut aussi faire les deux” (private joke).

Dans le cas présent, nous allons voir comment faire en implémentant l’interface Parcelable car cela demande un peu plus de code et de compréhension. Considérons un objet Message, sa classe (de base) s’écrirait très simplement.

class_message.png
Pour pouvoir faire naviguer cet objet entre plusieurs activités, on va donc le faire implémenter l’interface citée précédemment. Et c’est ici qu’il faut penser à quelques ajouts bien précis. L’objet implémentant Parcelable doit contenir un champ static appelé CREATOR de type Parcelable.Creator. De plus, 2 méthodes seront à redéfinir. Notre classe message se transforme alors comme la suivante.

class_message_parcelable.png
À ce stade, tous nos objets de type Message pourront être transférés d’une activité à une autre. Pour cela, on va donc utiliser un Bundle avec la méthode putParcelable(Parcelable).

class_sender.png
À noter qu'en tant qu’identifiant de l’objet dans le bundle, j’ai mis son nom complet (package + classe) ce n’est pas un hasard. Maintenant, on peut voir comment récupérer l’objet dans l’activité qui va le réceptionner.

class_receiver.png
Voilà qui est fait. Remarquez qu’il n’y a pas besoin de “caster” l’objet de type Parcelable récupéré, je vous laisse deviner grâce à quoi. Je ne prétends pas que ma méthode soit la meilleure, ni la plus sécurisée, etc… Tout ce que je sais, c’est que pour l’instant ça marche. L’expérience venant en codant, j’en saurai davantage sur l’efficacité de cette technique plus tard. Toutes améliorations et/ou remarques sont les bienvenues.

Tuesday 19 October 2010

My Book World, et que la lumière soit

bash.pngÇa commence à faire un moment que j’ai mon My Book World et je dois avouer que c’est terriblement pratique et efficace. Mais, depuis que je vis dans mon petit studio d’étudiant, la lumière blanche émise par les LED du disque externe est assez embêtante pour dormir.

Outre l’idée géniale du “tout est fichier”, GNU/Linux permet une personnalisation du système incroyable. Comme le My Book World utilise un système GNU/Linux léger autant en profiter non ? C’est ainsi que je me suis dit “hop un petit coup de echo dans les fichiers qui vont bien et je vais maîtriser les LED”. Grave erreur, enfin non, mais c’est un peu plus compliqué à cause justement du système minimal.

1. Activer SSH

Première chose, il faut activer le service SSH si ce n’est pas déjà fait. Pour cela, on se connecte sur l’interface web, on passe en Mode Avancé puis dans l’onglet Système on clique sur Avancés. Là, on coche la case Activer en face de Accès SSH.

ssh-mybookworld.png
On peut donc ensuite se logger avec… SSH. Le login est root et le mot de passe welc0me. Je vous invite bien évidemment à changer ce dernier à coup de passwd une fois connecté.
~$ ssh root@adresse_ip
~ # passwd

2. Vérification connexion Internet

Hé oui, au titre on le devine. On va avoir besoin d’une connexion Internet pour les quelques opérations à venir. Pour cela, il faut vérifier les paramètres réseaux. Dans l’interface d’administration, en mode avancé, cliquer sur l’onglet Réseau puis sur Réseau local. Si vous utilisez le client DHCP ça devrait être tout bon. En revanche, si comme moi vous utilisez le l’adressage en mode statique assurez-vous de bien avoir mis au moins un serveur DNS accessible (8.8.8.8 pour moi).

dns-mybookworld.png
Normalement, vous devriez pouvoir tester un ping sur une machine extérieure au réseau local depuis le SSH.
~ # ping respawner.fr
PING respawner.fr (88.191.119.214): 56 data bytes
84 bytes from 88.191.119.214: icmp_seq=0 ttl=56 time=30.9 ms

3. Installation de cron

Par défaut, il n’y a pas de cron sur le système du My Book World. Il est tout de même possible de l’ajouter car on va l’utiliser pour planifier l’extinction et l’allumage des LED. Il est existe un utilitaire nommé optware permettant d’installer des paquets IPK qui va nous faciliter la vie. On commence alors par installer optware. Toujours dans notre session SSH, on entre les commandes suivantes.
~ # wget http://mybookworld.wikidot.com/local--files/optware/setup-whitelight.sh
~ # sh setup-whitelight.sh


Maintenant, on met à jour (un peu à la façon APT) la liste des paquets avec :
~ # /opt/bin/ipkg update

Puis, on peut enfin installer cron :
~ # /opt/bin/ipkg install cron

4. Configuration

Comme on peut le voir, le binaire ipkg installe tous les paquets dans le dossier /opt/. C’est un bon moyen pour être certain de ne pas exploser le système. Le souci c’est que, du coup, cron ne se lancera pas au démarrage du disque dur externe. On va donc créer un lien du fichier /opt/etc/init.d/S10cron vers /etc/init.d/S10cron pour corriger le problème.
~ # ln -s /opt/etc/init.d/S10cron /etc/init.d/S10cron

Et puis, pour tester que notre cron fonctionne, on va mettre à jour l’heure via un serveur NTP. On édite (avec vi par exemple) alors le fichier /opt/etc/crontab pour y ajouter à la fin la ligne suivante :
* 4 * * * root ntpdate pool.ntp.org

Pour que l’ajout dans le fichier soit pris en compte, on redémarre le cron.
~ # /opt/etc/init.d/S10cron

5. Au tour des LED

On va enfin pouvoir nous occuper des LED. Comme je le disais plus haut, on peut contrôler les LED avec de simple echo de valeur dans les fichiers qui vont bien. Il suffira alors de mettre 192 pour éteindre ou 255 pour allumer les LED dans le fichier /sys/class/leds/oxnas-wd810-leds:sw/brightness. On peut tester rapidement les effets avec ces 2 commandes :
echo 192 > "/sys/class/leds/oxnas-wd810-leds:sw/brightness"
echo 255 > "/sys/class/leds/oxnas-wd810-leds:sw/brightness"


Mais bon, le but pour nous est de faire ça automatiquement. Par conséquent, ces 2 commandes prendront place dans le fichier /opt/etc/crontab. On ajoute donc à la fin de ce dernier les lignes suivantes :
30 23 * * * root echo 192 > "/sys/class/leds/oxnas-wd810-leds:sw/brightness"
30 9  * * * root echo 255 > "/sys/class/leds/oxnas-wd810-leds:sw/brightness"


On enregistre et on redémarre le cron. Et voilà, le tour est joué. Avec la configuration donnée ici, on constatera alors que les LED s’éteindront à 23h30 pour se rallumer à 9h30.

Monday 4 October 2010

Contrôler VLC avec son Android

astuce.pngDepuis que je suis rentré en Licence j’ai un nouvel appartement ("on s’en fiche" vous me direz, mais faut une introduction non ?) et j’ai surtout un nouveau canapé que j’apprécie beaucoup. Mon PC n’en est pas très loin, mais comme certains le savent j’aime en faire le moins possible. C’est donc suite à cette situation que j’ai rêvé d’une application pour contrôler VLC (et regarder des vidéos) à distance.

Étant l’heureux possesseur d’un HTC Hero depuis un peu plus d’un an, je me suis dit qu’il devait y avoir probablement quelques développeurs aussi fainéants que moi. Du coup, ils le sont un peu moins vue qu’ils ont pris le temps de coder leurs propres applications. Ainsi, je me suis lancé en quête d’une télécommande de VLC dans l’Android Market et j’ai découvert VLC Remote.

market-vlc-remote.png
Aussitôt, je l’ai installé. Cette application fonctionne grâce au serveur HTTP intégré dans VLC. Par défaut, il n’est pas actif mais on peut l’activer soit en quelques clics, soit en lançant la ligne de commande qui va bien.

vlc-httpd-graphique.png
Les deux clics ci-dessus sont plus ou moins l’équivalent de la ligne de commande suivante :
~$ vlc --extraintf=http --fullscreen --http-album-art --qt-start-minimized

Maintenant que le serveur HTTP de VLC est lancé, VLC Remote sera capable de le détecter. Il faut bien entendu que le mobile Android soit sur le même réseau que le PC contenant VLC. C’est possible entre autre par le Wi-Fi (qui est mis à disposition sur à peu près tous les smartphones et les boîtiers ADSL). Par exemple, avec ma Freebox, j’ai un réseau de classe C assez classique (faut que je songe à le changer peut-être) auquel mes 2 PCs ainsi que mon Hero sont connectés.

vlc-remote-settings.png
Sur la capture d’écran précédente, on constate donc que VLC est lancé sur le PC d’adresse IP 192.168.0.12 et que l’interface HTTP utilise le port 8080. On sélectionne donc cette machine dans l’interface pour contrôler VLC. On peut ensuite sélectionner un fichier à lire en utilisant le bouton en haut à droite. Une fois le fichier sélectionné, on peut mettre en pause, stopper, reprendre, avancer, reculer la lecture, gérer la playlist et gérer le mode plein écran.

vlc-remote-filechooser.png    vlc-remote-running.png

Voilà un outil bien pratique pour transformer son Android en télécommande pour VLC. Maintenant, vous pourrez rester sur votre fauteuil tout en regardant ce que vous voulez. Encore une technique pour bouger un peu moins.

Wednesday 25 August 2010

Effet de mode ou vrai plus ?

code.pngLes langages de programmation, il y en a énormément. Et beaucoup d’entre vous en connaissent une partie. Moi, je m’y suis intéressé un peu avant de rentrer en DUT. J’ai fait du Java surtout, et mon DUT a été l’occasion d’apprendre l’assembleur, le C et de me perfectionner en Java. J’ai bien entendu fait du script avec le shell sous Debian, Ubuntu, et compagnie. Aujourd’hui, je livre un sentiment personnel sur l’utilisation des langages de programmation dans le monde du Libre. Et j’ai cette impression que, bien que très diversifié dans la façon de faire un programme, le monde du FLOSS ne s’articule plus qu’autour d’un seul langage, à savoir, Python.

python.png
Si Python est si apprécié c’est qu’il possède des avantages. La puissance, la clarté du code, le côté script, la facilité d’apprentissage et j’en oublie certainement un bon paquet. Pour ma part, je n’arrive pas à m’y faire et ce n’est pas faute d’avoir essayé (même que GNOME Split devait être écrit en Python à la base). Aujourd’hui, Python est très utilisé et par énormément de monde. On sait par exemple que chez Canonical, ils aiment bien ce langage mais il n’y a pas qu’eux. J’ai constaté, qu’en ce moment, tous les débutants et les programmeurs expérimentés se tournent de plus en plus vers Python pour coder. Je trouve ça dommage. Il y a-t-il encore des gens qui s’intéressent à d’autres langages ? J’espère que oui, cela serait dommage de perdre une telle diversité. Je ne reproche rien à Python et c’est pour moi un langage comme un autre, je suis simplement triste de voir de moins en moins de programmes écrits en C, en C++, en Java ou que sais-je encore.

python-code.png
Pythonistes, je me répète, mais je tiens à dire que je ne blâme pas Python. J’ai simplement peur qu’un jour programmation veuille dire Python comme pour certains Linux veut dire Ubuntu. Je ne tiens pas non plus à lancer un troll du style “Python c’est nul, le C c’est de la vraie programmation”. J’aimerais seulement savoir si d’autres ont le même sentiment que moi à propos de l’abandon des autres langages de programmation. Beaucoup de monde le sait, je suis un Javaiste convaincu donc ce sentiment de solitude est assez naturel chez moi, peut-être à cause du fait que je travaille sur java-gnome et que ce n’est pas l’API la plus utilisée. Peu importe, suis-je le seul à me dire “je n’aime pas coder en Python, suis-je un irréductible gaulois non-pythoniste ?” ?

Si vous vous sentez attiré par Python, allez faire un tour du côté de l’AFPY. Ayant eu l’occasion de discuter avec des membres aux JDLL, je peux vous dire que vous aprendrez plein de choses.

Wednesday 30 June 2010

Sortie de GNOME Split 0.8

code.pngIl y a quelques heures, je viens de sortir une nouvelle version de GNOME Split. Cette dernière est numérotée 0.8 et représente une étape de plus vers la 1.0. Cela fait un an environ que le voyage a commencé après la mort inévitable de gSplit.

GNOME Split 0.8 tire donc partie de java-gnome 4.0.16 et des dernières nouveautés offertes. Aucune nouveauté géniale n’a été ajoutée. Il s’agit simplement d’une amélioration de l’interface graphique.

gnome-split-0.8.png
Au niveau des changements qui ont été effectués, on notera qu’une partie du code a été réécrite, que le fichier de configure (Gentoo, Fedora et ArchLinux, si y’en a qui sont intéressés pour tester hésitez pas) a été mis à jour. Les unités utilisées pour les tailles de fichiers respectent les standards et leur représentation en chaînes de caractères est confiée à GLib. On remarquera aussi l’utilisation des accelerators dans les menus.

gnome-split-0.8-file.png
Enfin, et en vrac, la nouvelle barre d’information disponible dans GTK+ est utilisée pour montrer les informations et les warnings à l’utilisateur, la fenêtre principale se redimensionne automatiquement si nécessaire, des méthodes dépréciées ont été retirées du code, le curseur change d’état selon l’état de l’interface et des traductions ont été mises à jour et ajoutées.

Je profite de cet article pour faire le point sur les noms de code que je donne à chaque version. Je ne sais pas si quelqu’un l’aura remarqué mais chaque nom de code est en rapport avec une expression ou une scène de la série The Big Bang Theory. La version 0.8 se nomme Happy Birthday mais ça n’a pas vraiment de rapport avec la série.

Pour terminer, GNOME Split 0.8 est disponible sur Ubuntu via le PPA ou avec le code source bien évidemment. N’hésitez pas à faire de paquets pour vos distributions favorites et à me donner vos avis et éventuellement à me dire les modifications à apporter.

Monday 21 June 2010

Sortie de java-gnome 4.0.16 et le futur

java.pngIl y a quelques jours, le 17 juin 2010 pour être précis, une nouvelle version de java-gnome est sortie. Cette dernière, numérotée 4.0.16, apporte comme toujours son lot d’amélioration. Il y a eu tout de même moins de modifications par rapport à ce que l’on a pu voir précédemment mais quand même. Une nouvelle version apporte toujours un peu de neuf (ou de vieux remis à neuf) et ça fait plaisir.

1. Nouvelle version : 4.0.16

Ainsi, java-gnome comporte maintenant le support complet pour l’utilisation des “accelerators” (on peut peut-être traduire par “raccourcis”), qui sont des combinaisons de touches permettant d’activer des actions et des entrées dans les menus. Je pense que bon nombre d’entre nous connaissent le très classique CTRL + Q pour quitter un programme. Le coeur de l’API se situe dans la classe AcceleratorGroup mais il faudra aussi utiliser les méthodes setAccelerator() des classes MenuItem et Action. L’API native étant presque incompréhensible, le travail pour porter tout ça en Java a été assez conséquent.

accelerators.png
De manière plus rapide, le support des opérateurs utilisables avec Cairo a été ajouter avec la classe Operator. Une bonne quantité d’exemple en image en montre le principe (images bien entendu générées avec java-gnome lors de la construction de la documentation. Le style CENTER a été ajouté dans la classe ButtonBoxStyle. Les fichiers .defs on été mis à jour pour prendre en compte les modifications apportées par GTK 2.18 et et le widget InfoBar a été ajouté (effectués par votre serviteur). Les interfaces Activatable et Editable ont reçu quelques changements tout comme la classe Glib qui comporte une nouvelle méthode formatSizeForDisplay() permettant de formater un taille d’octets en une chaîne de caractères plus lisibles pour nous humains. Enfin, une dernière méthode ensureNative() a été ajoutée à la classe Window de GDK.

2. Le futur

En tant que contributeur et avec les autres personnes travaillant sur java-gnome, nous nous sommes aperçu que maintenir un jeu de fichiers .defs pour générer la partie non publique de l’API commençait à être compliqué. Nous avons alors changer un peu le plan prévu. C’est pourquoi, en ce moment, certains travaillent sur l’utilisation du projet GObject Introspection pour générer une partie de l’API. C’est probablement le meilleur moyen d’avoir une source donnée la plus complète et la plus à jour afin de garder les bindings les plus proches des dernières versions des bibliothèques natives. Cependant, la migration vers GObject Introspection demande un travail long et délicat puisqu’il faut réécrire une partie du générateur de code que l’on sait stable puisqu’il commence à prendre de l’âge. J’espère tout de même que l’on aura quelque chose de fonctionnel assez vite afin de tester et stabiliser le code le plus rapidement possible.

Le futur de java-gnome prévoit de bonnes surprises, c’est certain. Tout ça dans le but d’améliorer encore l’API telle qu’on la connaît et de toucher un public toujours plus grand.

- page 2 of 24 -