theClimber

To content | To menu | To search

Thursday, January 26 2012

Présentation de Wazaabi UI Framework au Fosdem

I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting

Wazaabi est un framework open-source pour faciliter la création d'interfaces graphiques dans des applications de client riche tel que Eclipse RCP. Si vous avez déjà programmé des interfaces graphiques pour ce types d'applications, vous avez pu remarquer à quel point c'est une réelle prise de tête pour faire quelque chose de bien ficelé et de robuste. Je ne vous parle même pas de la maintenance de l'interface graphique lorsque le cahier des charges évolue et qu'il faut faire évoluer l'application. Et il est évidement impensable d'envisager de récupérer des parties de code d'une application pour la recoller dans une autre sous prétexte qu'on veut +/- la même interface graphique.

wazaabi.png

Tous les développeurs qui ont déjà du développer des interfaces graphiques pour des applications client riches (RCP) ont déjà rencontré ce type de problèmes qui sont des prises de têtes assez importante pour s'en sortir. C'est la raison pour laquelle Wazaabi est là. Nous avons remarqués que de plus en plus d'applications sont développées sur base d'une approche modèle (tel un modèle business) et qu'une interface graphique peut être structurée de la même manière.

L'approche Wazaabi est de rendre le développement de l'interface graphique : simple, facile à maintenir, portable. Wazaabi est depuis peu un projet officiel de la fondation Eclipse. Wazaabi n'est pas basé sur une librairie graphique en particulier. Si vous développez en Swing, en SWT ou même si vous développez sur Android, Wazaabi est une surcouche générique à la librairie que vous utilisez. L'idée est donc de vous permettre facilement, avec une même logique fonctionnelle, d'avoir plusieurs UI en fonction de votre librairie graphique.

Samedi prochain, à l'occasion du Fosdem, je tiendrais un lightning talk pour vous présenter wazaabi en détail. Ca aura lieu samedi 4 février à 18h40 dans l'auditoire Ferrer. Si vous êtes développeur eclipse/java, venez découvrir ce framework qui vous intéressera surement !

En attendant, pour en savoir plus, allez faire un tour sur le site de wazaabi ou sur la page de proposition du projet sur Eclipse.org :

Saturday, November 19 2011

Comment connecter un serveur NAS sous Linux avec CIFS

NAS.jpg

Nos ordinateurs stockent de plus en plus de choses, les disques durs sont de plus en plus grand ... mais leurs performances ne sont pas toujours au rendez-vous par rapport à l'évolution des autres ressources tels que les processeurs qui sont de plus en plus rapide. De plus en plus de gens s'orientent donc vers des disques durs de type SSD (solid state drive) comme moi.

Mais avoir un ssd c'est aussi un choix contraignant car à capacité égale, un disque classique sera parfois 10 fois moins cher qu'un disque ssd. Donc on a plus tendance à s'orienter vers des disques plus petits et à avoir un disque réseau pour stocker les données moins souvent utilisées. J'ai donc investi dans un petit serveur NAS (serveur de stockage) chez Seagate dont je suis très content. Voyons donc comment le configurer sur linux.

Premièrement assurez-vous d'avoir installé cifs et smbfs:

sudo apt-get install cifs-utils smbfs

Ensuite la manipulation est assez simple. Créez dans le répertoire /mnt (ou ailleurs en fonction de vos préférences) les différents partages que vous avez configuré sur votre NAS

sudo mkdir /mnt/share1
sudo mkdir /mnt/share2

Il ne reste plus qu'à configurer le système à monter (lier) votre disque réseau à cet emplacement à chaque démarrage. Pour ce faire, modifiez votre fichier /etc/fstab en ajoutant les deux lignes suivantes (adaptez en fonction de vos besoins)

# configure NAS
//IP_SERVEUR/SHARE1 /mnt/share1 smbfs username=VOTREUSER,password=VOTREPASSWD,uid=1000,gid=1000 0 0
//IP_SERVEUR/SHARE2 /mnt/share2 smbfs username=VOTREUSER,password=VOTREPASSWD,uid=1000,gid=1000 0 0

Pour illustrer avec un cas concret, imaginons les configurations suivantes :

  • IP_SERVEUR = 192.168.0.10
  • VOTREUSER = greg
  • VOTREPASSWD = mon_super_mot_de_passe
# configure NAS
//192.168.0.10/share1 /mnt/share1 smbfs username=greg,password=mon_super_mot_de_passe,uid=1000,gid=1000 0 0
//192.168.0.10/share2 /mnt/share2 smbfs username=greg,password=mon_super_mot_de_passe,uid=1000,gid=1000 0 0

Comment voir si ça fonctionne? Essayez de monter le répertoire manuellement :

sudo mount /mnt/share1

Si vous n'avez pas d'erreurs, allez voir dans le répertoire et normalement vous devriez y retrouver les fichiers que vous y avez déposé avant. C'est que la connexion est bien établie.

Maintenant redémarrez votre ordinateur, et à chaque démarrage les répertoires seront montés lorsque vous serez dans votre réseau local (évidement si vous n'êtes pas dans votre réseau local, le serveur NAS ne sera pas accessible.

Wednesday, February 2 2011

Récupérer les tweets d'une instance statusnet en live avec javascript

Recuperation des status en live

C'est en partant d'un script écrit pour twitter (jquery.livetwitter.js) que que j'ai mis en place un script compatible avec l'API de statusnet. Vous pouvez donc désormais facilement utiliser ce script pour afficher vos derniers status sur votre site. J'ai forké le plugin livetwitter car il y avait un bug (concernant les URL vers les utilisateurs). Mon code est disponible ici : https://github.com/theclimber/jquer...

Pour utiliser ce script c'est assez simple, Importez jquery et ce script dans votre page html, créez un div dans lequel on pourra insérer le contenu (ici twitterUserTimeline) et appellez la fonction suivante :

$('#twitterUserTimeline').liveTwitter('planetlibre', {limit: 5, mode: 'home_timeline', service:'status.planet-libre.org', rate:5000});

Vous avez désormais l'affichage de votre home_timeline en live. A savoir que d'autres affichages sont possibles :

Affichage de tous les status contenant le mot "linux" :

$('#twitterSearch').liveTwitter('linux', {mode: search, limit: 5, rate: 5000, service:'status.planet-libre.org'});

Affichage de tous les status de votre user_timeline :

$('#twitterUserTimeline').liveTwitter('planetlibre', {limit: 5, mode: 'user_timeline', service:'status.planet-libre.org', rate:5000});

Notifications en live

De plus j'ai mis en place une fonction callback qui se base sur jquery.toastmessage.js et qui permet d'afficher une notification à chaque fois qu'un nouveau message est affiché :

		var show_notice_at_start = 0;
		function showStickySuccessToast(noticeText) {
			$().toastmessage('showToast', {
				text     : noticeText,
				sticky   : false,
				stayTime:  3000,               // time in miliseconds before the item has to disappear
				position : 'top-right',
				type     : 'status',
				closeText: '',
			});
		}

		var callback_popup = function(divName, count) {
				if (show_notice_at_start) {
					for (var i = 0; i < count; i++) {
						var newTw = this.container.children[i].textContent;
						showStickySuccessToast(newTw);
					}
				} else {
					show_notice_at_start = 1;
				}
		};

Ensuite pour ajouter cette fonction de callback, il faut appeller le script livetwitter avec un paramètre en plus :

$('#twitterUserTimeline').liveTwitter('planetlibre', {limit: 5, mode: 'home_timeline', service:'status.planet-libre.org', rate:5000}, callback_popup);

Ca vous demande évidement d'avoir importé le script au préalable et d'avoir configuré la feuille de style qui va avec. Pour que vous puissiez tester, je vous invite à télécharger l'archive de démo que je met à votre disposition pour voir comment je m'y suis pris : live_statusnet.tar.bz2

Tuesday, December 21 2010

Extraire les strings d'une application basée sur Hyla TPL ou sur PHP Lib

Une fois une application crée, une fois un thème réalisé, on est heureux de pouvoir en faire profiter tout le monde. Seulement voilà, tout le monde ne parle pas la même langue que nous. Donc si nous souhaitons distribuer notre thème à plus grande échelle il est évident qu'une internationalisation (i18n ou l10n) du thème sera nécessaire. Les développeurs d'applications web PHP connaissent bien ce problème et il est maintenant courant d'utiliser gettext pour gérer les différentes langues dans une application.

hylatpl.png

py.gif

Ceci dit, une fois le thème crée, ça n'est pas toujours évident d'en extraire le texte pour créer un support gettext qui permet une traduction facile dans plusieurs langues. C'est donc en travaillant sur le Bilboplanet que je me suis confronté à cette difficulté. Mon but était de rendre l'application la plus générique possible : et donc traduisible en fonction des besoins. Extraire les strings de mon application à la main aurait été impossible ... d'autant plus que je modifie souvent mon code et il serait impensable de garder ma liste de traductions à jour. J'avais donc besoin d'un outil automatique.

J'ai donc mis en place un petit script d'extraction de strings automatique pour le moteur de templates Hyla TPL (qui est compatible avec PHP Lib) pour générer les fichiers .po dont j'avais besoin. Le code est disponible ici :

export_tpl-v1.0.py

La fonction à appeler pour lancer la génération du fichier gettext est la fonction "extract_tpl(tpldir)" à laquelle vous devez passer en paramètre le chemin vers votre répertoire de thème. La fonction ira automatiquement chercher le fichier "index.tpl" et suivra les liens internes du type "include" pour que tous les fichiers inclus soient aussi traduits. Le résultat est un fichier .po que vous pouvez ensuite traduire à votre guise :

def extract_tpl(tpldir):
	translate = Translation(tpldir)

	if os.path.isfile(os.path.join(os.path.abspath(tpldir), 'index.tpl')):
		translate.extract_from_tpl('', 'index.tpl')
	else:
		translate.extract_tpl()
	
	potcontent = translate.gettext_code()

	print potcontent

Pour ceux qui n'y connaissent rien en python mais qui souhaiteraient quand même tester ce script. Je vous invite à installer python et ipython chez vous. Puis dans le répertoire dans lequel se trouve le fichier python ci-dessus, faites :

greg@gsat:~/Desktop$ ls export_tpl.py 
export_tpl.py
greg@gsat:~/Desktop$ ipython
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
Type "copyright", "credits" or "license" for more information.

IPython 0.10 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]: from export_tpl import *

In [2]: extract_tpl('/home/greg/Public/bilboplanet/themes/gil-galad/')

Tuesday, November 30 2010

Créer une calculette en notation post-fixée

La notation polonaise inverse (NPI) (en anglais RPN pour Reverse Polish Notation), également connue sous le nom de notation post-fixée, permet de noter les formules arithmétiques sans utiliser de parenthèses. Dérivée de la notation polonaise présentée en 1920 par le mathématicien polonais Jan Łukasiewicz, elle s’en différencie par l’ordre des termes : les opérandes y sont présentés avant les opérateurs et non l’inverse.

hp.jpg

Cette notation est en fait très proche de celle utilisée dans le calcul écrit.

Par exemple, l’expression « 3 × (4 + 7) » peut s'écrire en NPI sous la forme « 4 7 + 3 × », ou encore sous la forme « 3 4 7 + × ».

C'est dans le cadre d'un entretien en entreprise en septembre dernier, on m'a demandé en une petite heure d'écrire un programme permettant de faire ce genre d'opérations. Un peu stressant au début (car quand on a un entretien il s'agit de faire bonne impression), mais finalement ça s'est bien passé.

#!/usr/bin/python
import sys, math

operations = ['sqrt', '+', '-', '*', '/', '^']
stack = []
op_list = sys.argv[1:]

print op_list
for val in op_list:
	if val in operations:
		if val == 'sqrt':
			x = stack.pop()
			stack.append(math.sqrt(x))
		elif val == '^':
			x = stack.pop()
			y = stack.pop()
			stack.append(math.pow(y, x))
		elif val == '+':
			x = stack.pop()
			y = stack.pop()
			stack.append(y + x)
		else:
			x = stack.pop()
			y = stack.pop()
			print "operation : %s %s %s" % (y, val, x)
			stack.append(eval("%s %s %s" % (y, val, x)))
	else:
		stack.append(float(val))
		print stack

print stack

Qu'est-ce qu'une calculette RPN (http://en.wikipedia.org/wiki/Reverse_Polish_notation) ? Il s'agit d'une calculette qui récupère les arguments dans l'ordre d'une pile. C'est ce qui était implémenté initialement sur les anciennes calculettes HP pour ceux qui les ont encore connues.

C'était donc le petit script "histoire de l'informatique" de la semaine :)

Tuesday, November 23 2010

Algorithmique : optimiser le nombre de transactions

Ca fait aujourd'hui un certain bout de temps que je n'ai plus mis à jour ce blog. C'est l'occasion donc de vous partager ce petit script qui m'a occupé pendant un dimanche après-midi d'hiver quand je m'embêtais ... Je m'étais pris la tête sur un problème la veille au soir, et je m'étais juré d'essayer de trouver une solution la plus optimale possible pour le régler.

Je vais donc essayer de vous expliquer le problème de la manière la plus simple qui soit. C'est d'ailleurs un problème que vous avez surement déjà rencontré dans votre vie de tous les jours. C'est hyper basique, mais on ne se rend pas toujours compte qu'il cache quand même un peu de subtilité (comme quoi, quand on est geek on peut s'occuper avec très peu ;) )

Lorsque vous êtes en vacances avec des amis et que vous demandez à chacun de tenir ses comptes, vient la fin des vacances où il faut évidement équilibrer les comptes. Alors tant qu'on n'est pas parti à plus de 4 en vacances c'est en général encore le genre de calculs abordables à conditions que les comptes ont bien été tenus, mais lorsque le nombre de participants augmente, la complexité du problème augmente de manière exponentielle pour notre petit cerveau. En effet, notre bon sens voudrait optimiser le nombre de remboursements pour se "faciliter" la vie, mais on se rend vite compte que cette optimisation est compliquée.

C'est l'autre jour en passant la soirée à bouffer des brochettes et à boire quelques bieres autour d'un feu de camp avant une nuit à la belle étoile qu'on a discuté de ce problème avec un ami qui est le fondateur de tricount (que vous connaissez surement, et si vous ne connaissez pas, utilisez le, c'est vraiment bien) Il semblait me dire que le problème est difficilement scalable lorsque le nombre de participants augmente de manière drastique.

Prennons un exemple pour illustrer le problème : Nous sommes partis en vacances à 4 et à la fin des vacances nous obtenons le résultat suivant :

  • Tom a dépensé 10 EUR
  • Bob a dépensé 100 EUR
  • Guy a dépensé 70 EUR
  • Val a dépensé 20 EUR

En total, on a dépensé 200 EUR. Donc chacun aurait du dépenser 50 EUR. Pour ré-équilibrer exprimons ça sous forme de compte (ceux qui sont en négatif doivent de l'argent, ceux qui sont en positif doivent recevoir de l'argent) :

  • Tom : -40 EUR
  • Bob : 50 EUR
  • Guy : 20 EUR
  • Val : -30 EUR

On voit désormais clairement que pour optimiser le nombre de transactions pour le remboursement, il faut chipoter un peu, et plusieurs solutions sont possibles : Solution 1 :

  • Tom rembourse 40 EUR à Bob
  • Val rembourse 20 EUR à Guy
  • Val rembourse 10 EUR à Bob

Solution 2 :

  • Tom rembourse 20 EUR à Guy
  • Tom rembourse 20 EUR à Bob
  • Val rembourse 30 EUR à Bob

Dans ce cas ci les 2 solutions proposent un nombre de transactions similaires. Mais ça n'est pas toujours le cas. De plus, si on voulait optimiser ce choix, qu'est-ce qui nous ferais choisir pour la solution 1 ou la solution 2?

Et si le nombre de participants était de X ... est-ce que le problème ne serait pas encore plus complexe?

J'ai donc essayé d'écrire un petit algorithme qui propose une solution. Qu'on pourrait peut-être améliorer. Je vous invite à vous pencher sur la question aussi :

Tant que tous les comptes ne sont pas à 0 :
    Pour tous les comptes :
        si on trouve deux comptes dont la somme fait 0
        alors on les annule et on compte une transaction
    X = celui qui doit le plus d'argent
    Y = celui a qui on doit le plus d'argent
    X rembourse un maximum a Y
    on compte une transation

Je suis sur que cet algorithme peut encore être amélioré ! En ce moment j'ai des performances en O(n) au niveau de mon petit script python que vous pourrez lire ci-dessous. Je suis toujours intéressé par les solutions plus optimales (après tout, je n'ai que passé quelques heures sur le problème)

opti1.png

  • En abscisse vous avez le nombre de personnes impliquées dans les comptes (donc le nombre de comptes)
  • En ordonnée vous avez le nombre de transactions nécessaires avec mon algo

On arrive plus ou moins à n/2 + delta transactions, avec n qui est le nombre de participants et delta qui tend vers 0 quand n tend vers l'infini

Vous pouvez télécharger le script python ici : transactions.py

Tuesday, September 21 2010

Gérer une communauté de développeurs, les bonnes raisons pour quitter SVN

Comme vous le savez, je suis assez actif sur le projet Open-source du Bilboplanet qui est un CMS de planet développé en PHP et qui se veut devenir une référence pour la création de planets, au même titre que wordpress et dotclear sont devenus une référence pour créer des blogs. C'est donc en me basant sur cette expérience et mes différentes expériences professionnelles que j'aborde ce sujet épineux (troll?) qui est de se poser la question par rapport à la pertinence du gestionnaire de version Subversion par rapport à ce qui existe d'autre sur le marché.

teamwork.gif

Je ne connais évidement pas tous les systèmes de versionning existant. Et j'en ai encore utilisé moins. Mais voici un petit topo de mon expérience dans le domaine :

  • Subversion : Je connais et j'ai beaucoup utilisé, et dans tous les sens (sorti en 2000)
  • Git : je connais et j'ai beaucoup utilisé (sorti en 2005)
  • Bazaar : je connais et j'ai déjà pas mal utilisé (j'irais pas jusqu'à dire que je maitrise bien le bazaar ^^) (sorti en 2004)
  • Mercurial : je sais comment ça marche en théorie, mais j'ai jamais utilisé (sorti en 2005)
  • CVS : je sais comment ça marche en théorie, mais j'ai jamais été plus loin (sorti en 1986)

D'un point de vue fonctionnement on peut vite mettre tous ces gestionnaires de version dans 3 catégories bien distinctes :

  • Système centralisé sur le réseau : subversion
  • Système décentralisé sur le réseau : Git, Bazaar, Mercurial
  • Système décentralisé sur fichiers : CVS

Je ne vais pas m'attarder sur CVS qui est le plus vieux d'entre tous et qui a malgré tout aussi les faiblesses de son temps. Mais je trouvais néanmoins qu'il était intéressant de le citer et de le resituer dans le temps pour plus de clarté. Il va de soi qu'il faut en tenir compte car ça a influencé le choix des technologies utilisées. En effet, si en 1986 on n'a pas fait un système basé sur le réseau, c'est aussi parce que le réseau en était qu'à ses débuts à cette époque là. Si subversion s'est mis en place sur un système centralisé, c'est parce qu'en 2000 on n'imaginait pas encore la puissance qu'on pouvait trouver dans la décentralisation des données, etc.

Continue reading...

Wednesday, November 18 2009

Monitorer les hôtes Linux (Debian) distant avec le serveur NRPE de Nagios

logofullsize.png

Des plus grosses installations aux plus petites, le monitoring du réseau reste un problème bien présent pour pouvoir garder un oeil permanent sur les installations et pouvoir réagir au plus vite en cas de problème. La solution la plus souvent utilisée n'est plus à présenter. Tout le monde connait aujourd'hui le moteur de monitoring réseau open-source mieux connu sous le nom de Nagios.

Mais comme ça marche? Pour ce qui est de l'installation et de la configuration d'un serveur Nagios, je vous renvoie vers d'autres très bon tutoriels détaillés comme ceux de Nicolargo. Mais une fois le serveur installé, on veux pouvoir monitorer tous les ordinateurs d'un même réseau. Voici un petit tutorial pour vous expliquer comment configurer un ordinateur de votre réseau pour qu'il puisse être monitoré par votre serveur Nagios. (Ce tutoriel vaut pour les Linux Debian-like, pour les autres distributions, ça sera similaire, mais surement pas identique).

Continue reading...

Tuesday, October 13 2009

Utilisez bazaar avec Launchpad avec un workflow décentralisé

Mais c'est quoi ce bazar? me direz vous ... :) eh oui, vous ne le connaissez peut-être pas tous, mais Bazaar est un système de gestion de version libre et sponsorisé par Canonical Ltd. C'est un peu comme CVS, Subversion ou Git, mais en différent. Je ne peux malheureusement pas vous faire une comparaison objective de tous les systèmes de versionning n'ayant pas encore eu l'occasion de les utiliser tous à leurs capacités maximales. Mais aujourd'hui je découvre bazaar et je trouve qu'il a pas mal d'attouts. Tout d'abord, il faut dire qu'il appartient à la catégorie des systèmes de gestion de version décentralisée, ainsi chaque copie de travail est un dépôt complet et celui-ci contient tout l'historique. Ceci permet donc une gestion plus facile qu'avec d'autres tel que Subversion (par exemple) qui nécessite l'utilisation d'un serveur central.

Les développements de bazaar se focalisent sur la facilité d'utilisation et la flexibilité. Bazaar repose donc sur un jeu de commande très restreint. Il est aussi possible de l'utiliser avec différents schémas de développements (chaque développeur dispose de sa propre branche, les développeurs disposent d'un dépôt commun, …). Bazaar est développé dans le langage Python. Il existe déjà plusieurs outils qui permettent une utilisation aisée de Bazaar, n'hésitez pas à vous renseigner sur leur site pour en savoir plus.

Etant donné que je me suis inscrit sur le Launchpad et que j'ai décidé de voir ce qu'il avait dans le ventre je me suis donc mis à utiliser Bazaar et à le tester. Voici donc un petit tutorial que j'ai écrit pour ne pas oublier comment s'y prendre par rapport au workflow choisi pour mon projet. En espérant qu'il puisse aussi servir à d'autres. Et peut-être qu'avec mon expérience et mon utilisation plus fréquente de Bazaar j'adapterais et j'améliorerais ce workflow.

Continue reading...

Thursday, October 1 2009

Open your OpenOffice files in MS Office 2003 and 2007 !!

I love OpenOffice.org, and have been using it for years. One of the benefits is the sheer amount of space that one can save when using OpenOffice Writer - the ODT files are much smaller. In an age where hard drives and other storage doesn't limit the size of files as much, it seems I am a dinosaur for even considering the amount of bytes I can save. Still, the more free space I have, the more I can store. Plus, when it comes to sending and receiving documents, the smaller they are the less impact it is on a network. In the grand scheme of things, I think bloated documents are as bad as low bandwidth in some areas.

This benefit of OpenOffice.org is lost when I have to send someone a Microsoft Office format for a text file. It bugs me, and I often forget to wipe the converted files to save space - maybe I am getting old. Thus, when I came across How to open ODT (openoffice.org text) files in Microsoft Word, I was surprised and happy.

Quoting from the original site:

Office 2007

  1. Install Service Pack 1 for Office 2007.
  2. Install Sun ODF Plugin for Microsoft Office.
  3. Open ODT document via File > Open, or by double-clicking the ODT file and when prompted for the application to open it with, choose Word.

If you have Office 2003, installing the Sun ODF Plugin should just work.

If you don’t have administrator privileges to install software, you can try an online converter such as Zamzar or Media Convert. You can also upload ODT documents to Google Docs or Zoho Writer.

Thank you. Now, when I accidentally send a smaller file and am short on time, I can simply point people to that and allow me to stop converting files because Microsoft itself had never supported ODT - an open standard with open source software that they could easily have allowed for to be intercompatible.

- page 1 of 6