Fedora-Fr - Communauté francophone Fedora - Linux

Planet de Fedora-Fr : la communauté francophone autour de la distribution Linux Fedora

A propos

Cette page est actualisée toutes les heures.

Cette page est une sélection de blogs autour de Fedora. Fedora-Fr.org décline toute responsabilité au sujet des propos tenus par les auteurs des blogs de ce planet. Leurs propos sont leur entière responsabilité.

Le contenu de ce planet appartient à leurs auteurs respectifs. Merci de consulter leur blogs pour obtenir les licences respectives.

Août 2012

Premier Samedi Date : samedi 4 août 2012 Horaires : de 14h00 à 18h00 Lieu : Carrefour Numérique, Cité des Sciences et de lIndustrie, Paris Pour une nouvelle installation ou pour des ajustements de votre distribution GNU/Linux Fedora, Mageia ou Ubuntu, venez nous retouver le samedi 4 août 2012 au Carrefour Numérique de la Cité des Sciences [...]

Ralonger l'historique du shell

Edouard Bourguignon

En shell, l'historique joue un rôle bien pratique en nous permettant de rappeler et/ou de retrouver d'anciennes commandes. Par défaut il ne conserve que 1000 entrées, ce qui suffit bien souvent. Mais sur des serveurs très utilisés, ou pour n'importe quelle autre raison, il est possible de changer cette valeur. Pour cela il suffit d'ajouter dans votre ~/.bashrc la ligne suivante (où de la corriger si elle existe déjà):

export HISTSIZE=3000

Cette valeur sera prise en compte au prochain login, mais pour que ce soit pris en compte immédiatement, au choix:

  • source ~/.bashrc
  • ou taper la commande export HISTSIZE=3000

Pour s'en assurer:

echo $HISTSIZE

Pour voir la taille actuelle de l'historique:

history | wc -l

J'avais déjà cité il y a quelques temps des raccourcis bien pratiques, certains utilisent l'historique.

PS: cette méthode a été testé sous bash uniquement.

Ralonger l'historique du shell

Edouard Bourguignon

En shell, l'historique joue un rôle bien pratique en nous permettant de rappeler et/ou de retrouver d'anciennes commandes. Par défaut il ne conserve que 1000 entrées, ce qui suffit bien souvent. Mais sur des serveurs très utilisés, ou pour n'importe quelle autre raison, il est possible de changer cette valeur. Pour cela il suffit d'ajouter dans votre ~/.bashrc la ligne suivante (où de la corriger si elle existe déjà):

export HISTSIZE=3000

Cette valeur sera prise en compte au prochain login, mais pour que ce soit pris en compte immédiatement, au choix:

  • source ~/.bashrc
  • ou taper la commande export HISTSIZE=3000

Pour s'en assurer:

echo $HISTSIZE

Pour voir la taille actuelle de l'historique:

history | wc -l

J'avais déjà cité il y a quelques temps des raccourcis bien pratiques, certains utilisent l'historique.

PS: cette méthode a été testé sous bash uniquement.

Réunion Fedora-Lyon : nouveau lieu, et décallage des semaines de réunion

Fedora Lyon

Bonjour tout le monde,

Contrairement à la prémonition concernant le mois de mai, il y a eu quune seul réunion : en effet elle sont dorénavant décalés dune semaine.
En résumé dès le mercredi 4 juillet 2012 elle seront un mercredi sur trois.

La réunion se tiendra donc mercredi 4 juillet 2012.

Et comme annoncé dans le titre du billet, le lieu aussi change ! (plusieurs raisons, vous naviez quà vous manifesté si cela ne vous convient pas).
Après de nombreuses hésitations (Rouge tendance, Ninkasi Kao), nous avons opté pour le Karnegie-Hall :
253 Rue Marcel Mérieux, 69007 Lyon.
Station de métro Gerland


View Larger Map

Et cerise sur le gâteau, Metal3d à enfin déclaré quil sera présent. je propose donc un lynchage publique si il ne montre pas son nez.

Bonne journée et à Mercredi.

php-5.3.14 et php-5.4.4

Remi Collet

Les RPM de PHP 5.3.14 sont disponibles pour Enterprise Linux dans le dépôt remi.

Les RPM de PHP 5.4.4 sont disponibles pour Fedora dans le dépôt remi et pour Enterprise Linux dans le dépôt remi-test.

Lire l'annonce de cette version : PHP 5.4.4 and PHP 5.3.14 released!

Utilisez YUM pour les installer : yum --enablerepo=remi update php-\* Ces versions seront aussi prochainement des mises à jour officielles pour : Fedora 17 - PHP 5.4.3 Pour toute question ou demande d'aide, merci d'utiliser les Forums.... Lire php-5.3.14 et php-5.4.4

FUDCon EMEA (Paris): Book your hotel!

Association Borsalinux-Fr

With this blog post, I announce the newly joined Fedora-Fr team to the Planet! We are going to use it for our communication across the Fedora World, and it starts with a FUDCon update!

As you should already know, the next EMEA FUDCon is going to be held in Paris, France, the 13-14-15th of October. Please register on the wiki.

Of course, you can book a more luxurious hotel, but we recommend you to book one room of the 30 locked for us in the Ibis hotel. There is free wifi, it's a "cheap" (it's Paris after all) but reasonable hotel. It's 81€/night (+7% of taxes). Look on the pre-registration table to find a roomate if you don't have one.

You can book from the 12 to the 15th (morning). Booking details are explained on the fudcon-planing mailing list. Book now, cancelling is free until the Dday!

If you have any queries, feel free to ask! We are currently working on our communication websites…

Juillet 2012

Premier Samedi Date : samedi 7 juillet 2012 Horaires : de 14h00 à 18h00 Lieu : Carrefour Numérique, Cité des Sciences et de lIndustrie, Paris Pour une nouvelle installation ou pour des ajustements de votre distribution GNU/Linux Fedora, Mageia ou Ubuntu, venez nous retouver le samedi 7 juillet 2012 au Carrefour Numérique de la Cité des Sciences [...]

Firefox 13

Remi Collet

Les RPM de la nouvelle version du navigateur de la Mozilla Foundation sont disponibles dans le dépôt remi pour fedora 14 et enterprise linux 6 (RHEL, CentOS, ...).

A lire : Mozilla Firefox Release Notes (notes de version, en anglais) Installation : yum --enablerepo=remi update firefoxCe paquet utilise xulrunner13, qui s'installe à côté de celui par défaut. Remarque : ce RPM est très proche de celui de firefox 12 présent dans fedora 15/16/17. Les RPM sont disponibles pour fedora 14 et pour enterprise linux... Lire Firefox 13

Thunderbird 13

Remi Collet

Le RPM de la nouvelle version du client de messagerie de la Fondation Mozilla est disponible dans le dépôt remi pour fedora 14 et enterprise linux 6 (rétro-portage de la version F-17).

Commencez par lire : Thunderbird Release Notes (Notes de version en anglais) Comme toujours : yum --enablerepo=remi update thunderbird\* L'extension enigmail (version 1.4.2) est aussi disponible. L'extension lightning n'est plus disponible. Les RPM de la version 13.0 sont disponibles ici pour fedora 14, et pour enterprise linux 6.... Lire Thunderbird 13

eZFluxBB 1.3

Guillaume Kulakowski

Je viens de publier la version 1.3 d'eZFluxBB l'extension permettant de lier votre forum FluxBB à votre CMS eZ Publish.

Mais quelles sont les nouveautés ?

  • Ajout d'une fonction eZJSCoreCallServer pour récupérer les informations sur l'utilisateur courant,
  • Ajout d'un bloc eZFlow pour afficher les informations de connexion.

Autres nouveautés invisibles pour l'utilisateur

eZFluxBB 1.3 marque la fin du support de PunBB/FluxBB 1.2. Jusquà présent lorsque vous configuriez eZFluxBB, vous instanciez au besoin la classe eZFluxBB12 ou eZFluxBB14 en fonction de votre version, toutes les 2 héritant de la classe eZFluxBB.

Le problème est que de plus en plus de différences apparaissent dans les versions mineures (cookie différent, etc...). J'ai donc arrêté d'utiliser cette façon de faire et j'ai maintenant recours à des appels à version_compare au sein du code.

Mais l'autre nouveauté est l'utilisation d'un fichier *.ini pour toutes les requêtes MySQL ! Cette façon de procéder quelque peu étrange permet :

  • De modifier une requête uniquement dans le fichier ini en fonction de la version de FluxBB,
  • de pouvoir modifier une requête sans toucher au core de l'extension. Utile si vous avez des mods comme les sondages ou les messages privés sur votre forums.

A noter également que cette version est issue du travail d'intégration continue que j'ai récemment mis en place pour tous mes projets. L'archive est dailleurs générées à partir de phing.

Comme d'habitude c'est téléchargeable sur la forge de projet d'eZ Systems :

Fedora 17 in da place !

Guillaume Kulakowski

Après un petit yum update suivie d'un preupgrade, ma station de travail (enterprise) est enfin sous Fedora 17 !

Mais une fois sous le nouvel opus il ne faut pas oublier de faire quelques contrôles notamment avec les commande suivante :

Détection des éventuels problèmes :

package-cleanup --problems

Détection des éventuels doublons :

package-cleanup --dupes

Détection des éventuels paquets qui ne seraient plus disponibles dans les dépôts :

package-cleanup --orphans

Détection des éventuels paquets qui ne seraient plus reliés à aucun autres RPM (leaves) :

package-cleanup --leaves

Et puis on réinstalle les paquets qui peuvent subsister en F16 :

root@zhukov ~> rpm -qa --qf "%{NAME} %{RELEASE}\n" | grep fc16 | cut -d' ' -f1 > list.txt
root@zhukov ~> yum reinstall $(cat list.txt)

Voila une Fedora 17 qui tourne.

IPB for Drupal: un connecteur IP.Board / Drupal

Guillaume Kulakowski

A l'occasion du projet de refonte de Scénario-Paintball sous Drupal, je suis en train de développer un connecteur IPB / Drupal.

Pourquoi IP.Board ?

SPB tourne maintenant depuis plusieurs années sous IP.Board. C'est malheureusement un logiciel propriétaire mais c'est aussi un forum terriblement efficace dont je possède une licence à vie (qui n'existe plus maintenant mais qui me permet de ne pas payer la redevance annuelle).

Le problème c'est que SPB ce n'est pas qu'un forum, c'est également un site. A chaque montée de version d'IPB, il faut trouver un portail et refaire pas mal de développements pour adapter les éléments hors forums à la nouvelle version.

J'ai donc décidé de migrer le portail de SPB sous un CMS et de ne maintenir que le connecteur, un peu à la manière de Fedora-Fr sous FluxBB & eZ Publish connectés via eZFluxBB.

Pourquoi Drupal ?

Pour le cas de SPB, les avantages par rapport à une solution comme eZ Publish sont nombreux :

  • Possibilité nativement pour les membres de personnaliser l'affichage des blocs.
  • Possibilité nativement pour les membres de créer des blogs (l'extension IP.Blog existe pour IP.Board mais est soumise à une redevance annuelle).
  • Comme le site fait pas mal appel à la base de membres, j'ai préféré Drupal qui stocke les membres comme une entité à part contrairement à eZ Publish qui les stocke comme des objets classiques. Le problème intervient lorsqu'on possède un site à faible contenu avec une grosse base d'utilisateur, on fait vite grimper les ressources nécessaires juste pour les membres.
  • Après presque 7 années de pratique d'eZ Publish, je commence à faire le tour et j'avais envie de profiter de SPB pour varier les plaisirs..

Où en est le projet ?

Pour le moment l'extension en est à ses balbutiements :

  • Interface de configuration depuis le back-office Drupal.
  • Utilisation du couple login / mot de passe pour se connecter au site Drupal.
  • La session IP.Board est récupérée dans Drupal pour connecter automatiquement l'utilisateur.
  • Création des utilisateurs Drupal à la volée lors de leur connexion.
  • Bloc de statistiques.

A venir :

  • Exploitation des données sur les forums et topics.

Bref, c'est un projet en cours de développement et sous licence GPL v2 :

Réunion Fedora-Lyon de début juin 2012

Fedora Lyon

Bonjour tout le monde,

Ce mois si fait partit des rares à avoir non pas une, mais 2 réunions Fedora :)" class="smiley

La première réunion si tiendra le mercredi 6 juin 2012 (la veille des PG days).

La réunion se tient comme dhabitude dans Le Jardin d'Amandine
pour 20h. 29, Rue Delandine - 69002 LYON
Tél. : 04 72 40 98 17.

Tout le monde est bienvenu, essayez de prévenir via le blog si vous venez et à combien (histoire davoir à manger pour tous).

Bonne journée et à Mercredi.

Correction orthographique et grammaticale avec Vim

Patrice Ferlet

J'en avais assez de voir que je tapais faute sur faute en préparant mes billets sous Vim... je suis mauvais en orthographe, et pire en grammaire. J'ai honte souvent de cette tare, alors j'ai décidé de fouiller pour trouver une méthode propre pour supprimer un bon paquets de fautes en utilisant mon éditeur favori. Voici ce que j'ai à vous proposer.

Vous êtes comme moi un mordu de Vim, vous tapez vos documents en RST, en Latex, ou je ne sais quel format brut. Vous avez un manque, celui d'avoir l'auto-correction orthographique et grammaticale. Je viens de me configurer mon éditeur favori pour avoir la correction des deux aspects.

Nous allons devoir installer quelques fichiers. En premier lieu, il faut récupérer les dictionnaires français de vim. La manière la plus simple est de faire:

mkdir -p ~/.vim/spell
cd ~/.vim/spell
wget http://ftp.vim.org/vim/runtime/spell/fr.latin1.spl
wget http://ftp.vim.org/vim/runtime/spell/fr.latin1.sug
wget http://ftp.vim.org/vim/runtime/spell/fr.utf-8.spl
wget http://ftp.vim.org/vim/runtime/spell/fr.utf-8.sug

Fermez vim si vous en avez déjà ouvert un. Cela permettra de s'assurer que tout soit pris en compte au démarrage.

Pour tester l'option spell, ouvrons un éditeur vim et rédigeons quelques phrases. Faites en sorte de faire des fautes, puis pressez: Echap, :set spelllang=fr spell

vim correction activé

Cela permet d'activer la langue française, puis de mettre en surbrillance les mots erronés. Toujours en mode commande (donc en ayant pressé sur Echap), allez au début du document en pressant "gg", puis "]s". Le curseur se déplace au premier mot mal orthographié. Vous avez alors plusieurs options :

  • pressez "z=" et vous entrez dans le mode "choix de mot" - taper Enter ou le numéro du mot que vous voulez utiliser.
  • presser "zg" pour ajouter le mot dans le dictionnaire local
  • presser "zG" pour l'ajouter au dictionnaire global
  • presser "]s" pour aller au prochain mot
  • presser "[s" pour aller au prochain mot

vim liste de suggestions

Ce procédé est sympa pour une phase finale, après avoir rédigé. Mais si vous voulez avoir une mode de correction en cours de frappe, il existe une autre commande. Vim permet de compléter un mot lorsque l'on s'en sert d'éditeur de code. On utilise alors CTRL+X puis une lettre correspondant à un mode de complétion.

Le mode utilisé pour "spell" est "s". Donc, après avoir tapé un mot de la mauvaise manière, il suffit, sans quitter le mode "insert", de presser CTRL+X puis "s". Une liste de propositions de mots s'affiche. Sélectionnez celui qui vous plait, puis pressez "espace" ou tout autre caractère pour continuer la rédaction. vim completion orthographique

Reste maintenant à avoir une correction grammaticale. Pour cela, nous allons utiliser un outil en Java servi dans les options d'OpenOffice, et un plugin Vim fortement bien pensé.

Commençons par l'outil Java en question. Il se nomme LanguageTool et se trouve à l'adresse: http://www.languagetool.org/

Il suffit de décompresser le fichier zip dans un répertoire de votre choix, cela va vous proposer deux fichiers, un ".jar" et un ".oxt" qui vont vous permettre la correction grammaticale. L'intégration à vim se fait avec le plugin: http://www.vim.org/scripts/script.php?script_id=3223

Suivons le procédé recommandé, on télécharge la dernière version, puis:

cd ~/.vim
unzip /chemin/vers/LanguageTool.zip

On finit par configurer l'outil en ouvrant le fichier ~/.vimrc, et en plaçant quelque part cette ligne:

:set spelllang=fr
let g:languagetool_jar='/chemin/vers/LanguageTool.jar'

En remplaçant évidemment le chemin par la bon. Je vous conseille d'utiliser un répertoire simple à retrouver, genre /usr/local/LanguageTool ou comme moi dans un répertoire utilisé pour compiler vous même l'outil. J'utilise pour ma part la version SVN que je mets à jour souvent et que je compile simplement avec "ant". Si vous éditez votre vimrc avec vim, n'oubliez pas le racourcis (en mode insert) "CTRL+X f" qui complète le chemin.

Voilà, on rouvre notre texte, et on va s'amuser. Activez si vous le souhaitez le mode "spell" en tapant: "Echap, :set spell"

Tapez avec des fautes, faites vraiment des erreurs (accords, temps, double virgule...), puis pressez: Echap, ":LanguageToolCheck" (la touche tabulation complète les commandes je vous rappelle).

Après quelques secondes, un mini buffer apparaît et vous donne une liste complète des fautes possibles que vous auriez faites, avec si possible des proposition de correction. Allez dans ce minibuffer en pressant CTRL+W w et faites défiler la liste. En pressant sur la touche Entrée votre curseur ira à la faute, ou parfois (je ne sais pas pourquoi) au début de la phrase erronée. Il suffit de les corriger au fur et à mesure. Pour nettoyer le texte des surlignages, vous pouvez simplement taper: Echap puis ":LanguageToolClean".

vim et LanguageTool

Et pour supprimer le surlignage du mode spell, Echap, ":set nospell"

Bref, voilà de quoi vous amuser à corriger la plupart de vos erreurs dans un éditeur tel que Vim. Vous prendrez vite cette habitude de lancer la commande, et de mettre le mode "spell" en marche.

Certes, il restera des erreurs parfois, à vous de relire et de ne pas vous lasser de vérifier mot à mot les coquilles possibles. Mais ces outils vont au moins permettre d'éliminer un bon paquet d'erreurs. Alors ne vous en privez pas. Personnellement j'en avais tellement assez de vous poster des billets bourrés de fautes que je suis passé à ces outils... Ne m'en voulez pas s'il en reste encore... je vous promet de faire des efforts.

Notez que LanguageTool - l'outil java - permet aussi de prendre en argument le fichier à corriger. Donc, vous pourrez vous en servir en dehors de vim ou en l'intégrant dans Emacs, Gedit, ou quelques autres éditeurs acceptant les greffons (plugins)

En espérant vous avoir fait découvrir un outil sympathique :)" class="smiley

Ha oui un dernier truc, comme je suis dans un terminal, et que je veux copier mon billet depuis vim vers mon navigateur, je sauve mon fichier et je fais simplement:

  • Echap
  • :!xclip %

Le fichier est alors copié dans le presse-papier, reste plus qu'à le coller dans l'éditeur (bouton central de la souris, ou Maj+Insert). On gagne du temps...

mysql-5.5.25

Remi Collet

Les RPM de MySQL Community Server 5.5.25 GA sont disponibles dans le dépôt remi pour fedora et pour Enterprise Linux (RHEL, CentOS, ...).

A lire : Introduction to MySQL 5.5 Changes in MySQL 5.5.25 MySQL 5.5 Reference Manual Cette construction utilise un fichier spec proche de celui de Rawhide. ATTENTION : avant la mise à jour, une sauvegarde de vos bases de données est très vivement conseillée (un vidage avec mysqldump par exemple).    L'installation la plus simple... Lire mysql-5.5.25

Fin de vie de la Fedora 15

Edouard Bourguignon

A chaque nouvelle sortie de Fedora, la même histoire recommence. La version n-2 devient obsolète et n'est plus maintenue. Alors si vous utilisez une Fedora 15, notez bien dans vos agenda qu'elle sera concidérée comme morte à partir du 26 juin prochain (EOL: End Of Life). Donc plus de mises à jour pour cette version, plus de correctifs de bugs ou de sécurité (le plus gênant). Il est donc important de passer à une version plus récente (Fedora 17 par exemple, autant prendre la dernière).

Pour télécharger une Fedora récente: Le site officiel

Fin de vie de la Fedora 15

Edouard Bourguignon

A chaque nouvelle sortie de Fedora, la même histoire recommence. La version n-2 devient obsolète et n'est plus maintenue. Alors si vous utilisez une Fedora 15, notez bien dans vos agenda qu'elle sera concidérée comme morte à partir du 26 juin prochain (EOL: End Of Life). Donc plus de mises à jour pour cette version, plus de correctifs de bugs ou de sécurité (le plus gênant). Il est donc important de passer à une version plus récente (Fedora 17 par exemple, autant prendre la dernière).

Pour télécharger une Fedora récente: Le site officiel

Fedora 17 disponible

Edouard Bourguignon

La version 17 de la Fedora, Beefy Miracle, vient de sortir. Vous pouvez la télécharger sur le site habituel: http://fedoraproject.org/

Concrêtement, la liste des nouveautés est la suivante:

  • Gnome 3.4
  • Gimp 2.8
  • Eclipse SDK juno (en pre-release)
  • GCC 4.7.x
  • Ruby 1.9.3, PHP 5.4, Erlan R15 etc
  • Et encore plus de support du "cloud"...

Rappelons aussi la migration vers /usr, donc /lib, /bin etc seront des liens symboliques vers /usr/lib /usr/bin etc. Du coup la procédure de mise à jour Fedora 16 vers Fedora 17 sera un peu plus complexe que d'habitude.

La liste complète des fonctionnalités de cette Fedora 17 est disponible ici.

Préférez la version torrent pour ne pas avoir de soucis lors du téléchargement.

Fedora 17 disponible

Edouard Bourguignon

La version 17 de la Fedora, Beefy Miracle, vient de sortir. Vous pouvez la télécharger sur le site habituel: http://fedoraproject.org/

Concrêtement, la liste des nouveautés est la suivante:

  • Gnome 3.4
  • Gimp 2.8
  • Eclipse SDK juno (en pre-release)
  • GCC 4.7.x
  • Ruby 1.9.3, PHP 5.4, Erlan R15 etc
  • Et encore plus de support du "cloud"...

Rappelons aussi la migration vers /usr, donc /lib, /bin etc seront des liens symboliques vers /usr/lib /usr/bin etc. Du coup la procédure de mise à jour Fedora 16 vers Fedora 17 sera un peu plus complexe que d'habitude.

La liste complète des fonctionnalités de cette Fedora 17 est disponible ici.

Préférez la version torrent pour ne pas avoir de soucis lors du téléchargement.

Go, routines et canaux - introduction au langage

Patrice Ferlet

Il y tellement de nouveaux langages, quand un de ceux là sort du lot c'est en général parce qu'il offre des concepts particuliers. Go est un de ceux là, et les concepts de routines, de canaux et de fonctions différées ne sont qu'une infime partie des possibilités que vous pouvez découvrir dans ce langage. Testons un peu ce langage.

Jai la chance daimer mon métier, et dans ce métier on apprend souvent de nouvelles choses, des concepts, des langages... Dans le panel de langages informatique que jai put entrevoir, certains mont vraiment surpris dans leur concept. Le premier dont jai eut beaucoup de mal à mapprocher est le Haskell, et depuis peu je me penche sur Go. Je mempresse donc de vous montrer un peu lintérêt que je vois dans ce langage.

Cest Nicolas Engel, avec qui jai travaillé sur un projet, qui men a reparlé et lenvie de me repencher sur Go sest vite manifesté.

Alors Go cest quoi ?

Ce langage a été créé par une équipe de Google depuis 2010 et a pour vocation de réduire des problématiques que beaucoup de développeurs doivent supporter dans dautres langages. Vous pouvez utiliser le compilateur Go à télécharger ici: http://golang.org/ ou utiliser gcc-go (package Fedora disponible dans les dépots officiels)

Cest un langage compilé, performant et sous licence BSD... La seule complication, et vous allez voir quelle est dominante au début, cest que le concept est vraiment différent de pas mal de langages. Amis développeurs Python, Java, PHP et même C/C++... vous allez être un peu surpris.

La raison principale de la création de ce langage a été motivée par la réduction de problématiques telles que les threads, les sémaphores, les transferts interprocessus, les fractures mémoire, et limpérativité des langages communs. Vous allez voir que des concepts ont été ajoutés à Go pour rendre tout cela vraiment très simple... si si, cest finalement très simple.

Tout dabord, cest un langage fortement typé, les habitués de langages typés dynamiquement vont devoir se faire une raison: il va falloir déclarer vos variables. Ensuite, Go nest pas un langage purement objet mais vous allez facilement pouvoir déclarer des struct avec des méthodes attachées. Jentends dici pas mal dentre vous rire doucement sur un fond de “huhu aujourdhui faire un langage non objet... cest juste revenir dans le passé, autant faire du C”. Je tiens à donner mon avis là dessus, les langages orientés objet ont leurs avantages certains, mais Go est surtout fait pour être performant dans un premier lieu, et le C na rien de vieillot car même votre Linux, votre Mac ou votre Windows est un système dexploitation quasiment entièrement écrit en C.

Enfin, pour ma part, je nai aucun mal à imaginer développer une grosse infrastructure logiciel avec un langage structuré non objet. Et surtout si cest en Go. Dans tous les cas, Go est adressé aux développeurs désirant un langage proche du processeur, un peu comme C/C++ tout en gardant des simplification en terme de threads, sémaphores et gestion mémoire. Bien que Go permette de créer aussi des application web, et se retrouve même dans Google AppEngine. Voyez le guide de démarrage: go appengine.

Bref, passons la polémique trollesque et passons au langage lui même.

On commence par installer le compilateur. Soit vous utilisez gcc-go (dans les dépots) soit vous utilisez le compilateur de google à cette adresse: Golang. Je vous conseille, pour commencer, d'utiliser celui de google et de suivre la manière dont on utilise le runtime. En général, cela revient à faire la commande

go run monfichier.go

Pour le compiler réellement:

go build monfichier.go

Je ne vais pas vous détailler les bases du langage, mais un exemple rapide pour vous donner la syntaxe de base:

package main
 
//fmt est le package de formatage de chaine
import “fmt”
 
//on retrouve une fonction main
func main () {
     fmt.Println(“Hello le mondo !);
}

Bon rien de bien compliqué, un hello world bateau. Vous remarquez donc quon a une notion de package, et donc quon pourra séparer des fonctions et structures dans différent package (ce qui est un plus quand on se réfère au C). Cela ressemble fortement aux espace de nom (namespace) mais lidée est plus claire selon moi.

Petite parenthèse, vous allez rapidement vous rendre compte au fur et à mesure que la plupart des concepts en Go se retrouve dune manière ou dune autre dans C.

Alors ya quoi de nouveau ?

Dabord, comment on déclare une variable ? et bien de deux façons:

// i variable de type int
var i int
i = 4
 
//ou bien
//i est une entier valant 4, le typage est déduit par inférence
i:=4

Pour faire simple, utiliser ":=" (oubliez pas les deux points) pour déclarer en assignant, sinon l'assignation se fait avec un simple "="

Voilà, pas plus pas moins... on va pas parler de pointeur et de structure de suite, mais vous naurez pas de mal à comprendre en lisant la documentation ou en faisant le gotour (voir les liens en fin de billtet)

Je vais vous lister 3 concepts qui mont plut dans ce langage. Le premier est le concept de “goroutine” qui est foncièrement parlant une méthode pour créer des threads sans se prendre la tignasse et se taper le front sur le clavier. Le second concept est le principe de canal (channel) qui permet tellement de choses quon sattriste de ne pas les avoir dans les autres langages (du moins pas sous cette forme). Un canal permet de faire transiter des valeurs dun processus à lautre, de bloquer un processus tant quun autre nest pas terminé et en plus de bufferiser tout ça. Cest le concept de sémaphore (mutex) amélioré dans sa conception. Le troisième concept est la possibilité de différer un appel dans le temps (defer). Cela rend le code lisible à souhait.

Un autre concept, que lon retrouve un peu en python, est le fait de pouvoir retourner plusieurs valeurs de plusieurs types depuis une fonction. Ceux qui nont pas compris lintérêt devrait penser simplement à cela: imaginez une fonction qui retourne un résultat et un code derreur. Plutôt que de devoir retourner une structure, ou un objet pour les langages qui le permettent, on retourne une liste simple de variables.

Bref, passons aux goroutines de suite.

Lappel à une routine se fait simplement via le mot clef “go”. La fonction sera appelée dans un thread (mais dans le même processus, on ne parle pas dun fork ici, mais bien dun thread) et rien dautre nest à faire !

Je ne vous ai pas encore parlé des canaux, donc cet exemple ne va pas fonctionner exactement comme on le veut, mais le concept est là. Ne cherchez pas si ça fonctionne mal chez vous.

package main
 
import "fmt"
 
func hello(you string){
    for i:=0; i<5; i++ {
        fmt.Println("hello you:" + you)
    }
}
 
func main (){
    go hello("Pierre")
    hello ("Paul")
}

Ce qui va vous donner (selon la manière dont les threads sont créé sur votre OS):

hello you:Paul
hello you:Pierre
hello you:Paul
hello you:Pierre
hello you:Paul
hello you:Pierre
hello you:Pierre
hello you:Pierre
hello you:Paul
hello you:Paul

Vous lavez remarqué, jai parfois 3 fois “Pierre” qui apparait, parfois 2 fois “Paul”. Cela est le fait que la routine est géré selon les disponibilités du CPU.

Bon, on passe aux canaux. Là vous risquez de perdre un peu le fil, mais je vous assure que la capacité de ce concept est tout bonnement génial.

Un canal est un type dont le principe est dempiler des valeurs et de bloquer le processus si on cherche à lire dedans, et que celui-ci si il est vide. Cest le principe du FIFO. Lintérêt est sa syntaxe aisée et lisible.

Il faut utiliser la fonction “make” (genre de malloc, mais orienté fabrique ou factory) pour créer un “chan”.

//canal prenant des entiers
c := make (chan int)

Un canal peut prendre n'importe quel type, entier, flottants, chaines... et même des structures.

Ensuite cest plutôt simple... On utilise “<-” pour placer des valeurs dans le flux.

Donc:

//empile un entier (1) dans le canal
c <- 1

Et pour lire le canal

//bloque tant que rien nest empilé dans c
//on peut récupérer la valeur empilée
int val := <-c2
//ou simplement attendre une écriture dans la canal
<-c2

Faisons simple, on va juste comprendre le principe du canal:

package main
 
import "fmt"
 
func routine(a, b chan int){
     i := <-a
     fmt.Printf("je viens de lire dans le canal: %d\n", i);
 
     //'main' attend toujours, je vais écrire dans le canal b
     //pour le débloquer
     b <- 0
}
 
func main(){
    a,b := make(chan int), make(chan int)
 
    //on écrit dans a
    a <- 2
    //on lance une fonction en parallèle
    //qui reçoit les deux canaux en paramètres
    go routine1(a,b)
 
    //on va attendre la fin de la routine
    //la routine doit écrire dans le canal b 
    //pour que cette instruction se débloque
    <- b
    fmt.Println("voilà, j'ai fini, b a été lut")
}

Pour le moment on s'amuse à débloquer des canaux en écrivant dedans. Sachez que vous pouvez fermer un canal avec la fonction "close" mais si vous en avez besoin, c'est que vous être dans un cas particulier. Car en fait, Go n'aime pas que des canaux restent ouverts avec une valeur bloquée et non lut... pensez à traiter correctement les canaux, sinon forcez la fermeture avec "close"

Voyons un autre exemple de code qui va fonctionner avec un canal dentier. Un peu plus salé par contre...

package main
 
import "fmt"
import "time"
 
 
func thread1 ( sem, done chan int) {
    fmt.Println("je suis le thread 1, je commence à bosser")
 
    //grosse fonction qui prend du temps
    time.Sleep(1 * 1e9)
 
    //on débloque le sémaphore
    sem<-0
    //on travaille encore un peu
    time.Sleep(1 * 1e9)
    fmt.Println("je suis le thread 1, je préviens main que je termine")
    //je préviens que la routine est finie
    done<-1
}
 
//voir plus bas (dans thread2), 
//cette méthode va permettre
//une exécution différée
func send(c chan int, num int) {
    c <- num
}
 
func thread2 (sem, done chan int) {
    //autre manière de s'assurer qu'on écrit bien à la
    //fin de la fonction :
    //defer permet de différer l'appel à "send" 
    //à la fin de ma fonction
    defer send(done, 2) 
 
    fmt.Println("je suis le thread 2, je commence à bosser")
 
    //on attend la fin de thread 1
    <-sem
    fmt.Println("je suis le thread 2, on m'a débloqué")
 
    //on bosse encore un peu
    time.Sleep(2 * 1e9)
 
    //quant sleep a terminé, la fonction différée va
    //être exécutée
}
 
func main(){
    //sem va me permettre de gérer les bloquage et débloquage
    //des goroutines
    sem := make (chan int)
 
    //ce canal sera emplilé par la seconde routine pour dire
    //à la fonction main qu'il a terminé
    done := make (chan int)
 
    //on lance les deux routine en parallèle, elle vont communiquer
    //au traver de sem
    //on remplira "done" pour dire que le thread est terminé
    go thread1 (sem, done)
    go thread2 (sem, done)
 
    fmt.Println("je suis dans main, j'attend la fin en lisant le canal 'done'")
 
    //les routines vont écrire dans "done",
    //j'attend que ce soit le cas pour les deux threads
    //donc on attend 2 fois
    //la variable i récupérera la valeur envoyé dans le canal
    var i int
    i = <-done
    fmt.Printf("routine %d vient d'écrire dans le canal 'done'\n", i)
    i = <-done
    fmt.Printf("routine %d vient d'écrire dans le canal 'done'\n", i)
 
    fmt.Println("je suis dans la fonction main, on m'a débloqué")
 
}

Voilà ce que donne mon programme:

je suis dans main, j'attend la fin en lisant le canal 'done'
je suis le thread 1, je commence à bosser
je suis le thread 2, je commence à bosser
je suis le thread 2, on m'a débloqué
je suis le thread 1, je préviens main que je termine
routine 1 vient d'écrire dans le canal 'done'
routine 2 vient d'écrire dans le canal 'done'
je suis dans la fonction main, on m'a débloqué

Ce qui est exactement ce que je voulais. La fonction main sest mise en attente, les deux threads on commencé à travailler en parralèle. La routine 1 déblique la routine 2, mais cette routine 1 fini certaines choses en même temps. Enfin, la fonction “main” remprend la main (non cest pas un jeu de mot)...

Plutôt que de créer une fonction "send" qui n'est utilisée que dans le thread 2, on peut utiliser un système de closure. Car en effet, les fonctions en Go sont des closures. Revoyons le code du thread 2:

func thread2 (sem, done chan int) {
    //autre manière de s'assurer qu'on écrit bien à la
    //fin de la fonction :
    //on crée une closure exécutée en fin de fonction
    //notez que c est local à la closure, la closure prend "done"
    //en argument, donc c correspondra à done
    defer func (c chan int) {
        c <- 2 
   }(done)
 
    fmt.Println("je suis le thread 2, je commence à bosser")
 
    //on attend la fin de thread 1
    <-sem
    fmt.Println("je suis le thread 2, on m'a débloqué")
 
    //on bosse encore un peu
    time.Sleep(2 * 1e9)
 
    //quant sleep a terminé, la fonction différée va
    //être exécutée
}

Vous pouvez donc supprimer la fonction "send". On retrouve ici un concept de fonction "inline" interne à une fonction. En bref, la capacité qu'à Go à vous simplifier la vie est vraiment intéressante.

Bref, là je nai fait quune introduction à Go... je nai pas le recul ni lexpérience nécessaire pour aller plus dans le détail (bien que je mamuse comme un fou avec des tests bourrins). Je vous conseille daller lire le “gotour” ici : GoTour. Je vous conseille de bien vous pencher sur les notions de "range", de retour de plusieurs variables depuis une fonction mais aussi sur les concepts de structure et fonctions de structure. Ce billet ne visait qu'à vous éclairer sur ce que peut vous apporter Go coté parallélisation.

Go est désormais utilisable dans appengine, vous pouvez aussi créer votre propre miniserveur HTTP très facilement avec le package (inclu) "net/http" et que des portage de Gtk, WX etc... ont vu le jour et fonctionnenent.

En ce qui concerne les deux compilateurs, le compilateur (et runtime) Go de Google compile de manière statique mais donne de superbe résultats en terme de performances. Vous pouvez utiliser gcc-go (dans les dépots Fedora du moins) qui vous permettra de compiler dynamiquement vos programmes (le compilateur go faisant de la compilation statique...)

Un dernier point, Go vous permet aussi de récupérer très aisément des librairies C et dutiliser les fonctions impémentées dans ce langage.

Page générée le 28 mai 2016 à 11:53