PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Progi1984 : Créer une miniature d’un site web adaptatif via PhantomJS et SlimerJS

lundi 30 septembre 2013 à 10:30

Un site doit désormais s’adapter à différents phériphériques que ce soit un terminal mobile, un ordinateur, une tablette ou un écran de télévision. La technologie dite de Responsive Design est là pour cela. Afin de tester un site aux différents points de rupture, il me fallait trouver une technique et automatiser ces tests : PhantomJS (Chrome) et SlimerJS (Firefox) sont les solutions.

PhantomJS : Installation

$ wget https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2
--2013-09-23 19:46:15--  https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2
Résolution de phantomjs.googlecode.com (phantomjs.googlecode.com)... 173.194.66.82, 2a00:1450:400c:c03::52
Connexion vers phantomjs.googlecode.com (phantomjs.googlecode.com)|173.194.66.82|:443...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 13279068 (13M) [application/x-bzip2]
Sauvegarde en : «phantomjs-1.9.2-linux-x86_64.tar.bz2»

100%[===========================================================================================================================================================================>] 13 279 068  1,39MB/s   ds 9,3s   

2013-09-23 19:46:25 (1,36 MB/s) - «phantomjs-1.9.2-linux-x86_64.tar.bz2» sauvegardé [13279068/13279068]

$ tar xf phantomjs-1.9.2-linux-x86_64.tar.bz2 phantomjs-1.9.2-linux-x86_64/

$ cp phantomjs-1.9.2-linux-x86_64/bin/phantomjs /usr/local/bin/
cp: impossible de créer le fichier standard « /usr/local/bin/phantomjs »: Permission non accordée
$ sudo !!
sudo cp phantomjs-1.9.2-linux-x86_64/bin/phantomjs /usr/local/bin/
[sudo] password for franck:

PhantomJS : Script

Voici un script de base qui va vous permettre de faire un screenshot d’une site en 1024*768 et de l’exporter vers un fichier PNG.

/*
    requires: phantomjs
    usage: phantomjs screenshot.js
*/
var page = new WebPage(),
    url, filename;

if (phantom.args.length < 2) {
    console.log('Usage: screenshot.js URL filename');
    phantom.exit();
} else {
    url = phantom.args[0];
    filename = phantom.args[1];

    page.viewportSize = { width: 1024, height: 768 };

    page.open(url, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
        } else {
            window.setTimeout(function () {PhantomJS
                page.render(page.viewportSize.width + 'x' + page.viewportSize.height +'_'+ filename);
                phantom.exit();
            }, 2000);
        }
    });
}

Malheureusement, on a qu’une seule taille de viewport, il en faudrait plusieurs afin de tout tester.
Modifions ce script pour gérer plusieurs viewports.

/*
    requires: phantomjs
    usage: phantomjs screenshot.js URL
*/
var sizes = [
        [320, 480],
        [320, 568],
        [600, 1024],
        [1024, 768],
        [1280, 800],
        [1440, 900]
    ],
    count, url, filename;

if (phantom.args.length < 1) {
    console.log('Usage: screenshot.js URL');
    phantom.exit();
} else {
   url = phantom.args[0];
   var filename = url.replace('http://','');
   filename = filename.replace('www.','');
   filename = filename.replace(/\\./g,'_');
   filename = filename.replace(/\\//g,'_');
   count = 0;
   sizes.forEach(function(vpSize){
    count++;
    var page = new WebPage();
    page.viewportSize = { width: vpSize[0], height: vpSize[1] };
    page.open(url, function (status) {
      if (status !== 'success') {
        console.log('Unable to load the address!');
      } else {

        window.setTimeout(function () {
          page.render(filename+'_'+page.viewportSize.width+ 'x' + page.viewportSize.height +'.png');
          page.close();
          count--;
          if(count == 0){
            phantom.exit();
          }
        }, 2000);
      }
    });
  });
}

PhantomJS : Exemple

Pour l’utiliser, la commande est simple :

$ phantomjs screenshot.js http://rootslabs.net/blog/

Et hop, cela vous génère vos 6 screenshots de votre site :
PhantomJS : Screenshot RootsLabs

Il reste un souci ; PhantomJS permet le rendu sous le moteur de Chrome. Mais comment faire pour le moteur de Firefox ?
La solution s’appelle SlimerJS.

SlimerJS : Installation

SlimerJS : Script

Ensuite, je teste mon précédent script pour l’adapter à SlimerJS.

Je remplace

var page = new WebPage();

par

var page = require("webpage").create();

Pourquoi ? L’objet Webpage est marqué “deprecated” dans PhantomJS (Merci LaurentJ).
Le code devient ainsi fonctionnel et valide sur PhantomJS et SlimerJS.

Et j’adapte le code pour détecter le moteur utilisé :

/*
    requires: phantomjs
    usage: phantomjs screenshot.js URL
*/
var sizes = [
        [320, 480],
        [320, 568],
        [600, 1024],
        [1024, 768],
        [1280, 800],
        [1440, 900]
    ],
    count, url, filename;
if(typeof(slimer) != 'undefined'){
  var sEngine = 'slimerjs';
} else {
  var sEngine = 'phantomjs';
}
if (phantom.args.length < 1) {
    console.log('Usage: screenshot.js URL');
    phantom.exit();
} else {
   url = phantom.args[0];
   var filename = url.replace('http://','');
   filename = filename.replace('www.','');
   filename = filename.replace(/\\./g,'_');
   filename = filename.replace(/\\//g,'_');
   count = 0;
   sizes.forEach(function(vpSize){
    count++;
    //var page = new WebPage();
    var page = require("webpage").create();
    page.viewportSize = { width: vpSize[0], height: vpSize[1] };
    page.open(url, function (status) {
      if (status !== 'success') {
        console.log('Unable to load the address!');
      } else {

        window.setTimeout(function () {
          page.render(filename+'_'+page.viewportSize.width+ 'x' + page.viewportSize.height + '_' + sEngine +'.png');
          page.close();
          count--;
          if(count == 0){
            phantom.exit();
          }
        }, 2000);
      }
    });
  });
}

SlimerJS : Exemple

Pour l’utiliser, la commande est simple :

$ xvfb-run ./slimerjs screenshot.js http://rootslabs.net/blog/

Conclusion

Dorénavant, via les deux commandes suivantes, il vous est possible de tester votre responsive design en ligne de commande et ainsi voir les anomalies sur un navigateur ou un autre rapidement.
PhantomJS (moteur de Chrome) :

$ phantomjs screenshot.js http://rootslabs.net/blog/

SlimerJS (moteur de Firefox) :

$ xvfb-run ./slimerjs screenshot.js http://rootslabs.net/blog/

Cet article Créer une miniature d’un site web adaptatif via PhantomJS et SlimerJS est apparu en premier sur RootsLabs.

Gravatar de Progi1984
Original post of Progi1984.Votez pour ce billet sur Planet Libre.

Articles similaires

Noireaude : Utliser la Syntaxe Markdown sous Gedit

lundi 30 septembre 2013 à 10:30

markdown-gedit-sample

Je n’ai jamais fait de mystère (quitte à passer pour un weak) sur le fait que Gedit a toujours été mon éditeur de texte préféré. J’aime sa simplicité et sa modularité qui moyennant l’ajout de quelques modules ou plugins, en font quoi qu’on en dise un outil très puissant. Si ça vous tente nous allons voir dans ce billet comment intégrer facilement une option qui va nous permettre d’utiliser la syntaxe Markdown sous Gedit. On précisera quand même pour ceux qui n’ont pas lu le billet précédent, que Markdown est un langage de balisage conçu par John Gruber et Aaron Swartz, dans le but de fournir une syntaxe simple à lire et à écrire, permettant d’obtenir un résultat similaire à ce que nous pourrions avoir avec des balises HTML par exemple. Si vous voulez plus de détails à ce sujet, vous pouvez vous rendre sur cette page Wikipedia pour en savoir plus.

Maintenant que vous en savez un peu plus nous allons voir comment profiter de cette syntaxe sous Gedit. Pour se faire il va falloir télécharger l’archive qui va bien, en entrant la ligne suivante dans votre terminal.

wget https://gitorious.org/projets-divers/gedit-markdown/archive/master.zip

Décompressez ensuite le contenu de l’archive à l’aide de cette commande :

unzip master.zip

Rendez-vous dans le répertoire concerné (toujours avec le terminal) :

cd projets-divers-gedit-markdown/

Et procédez à l’installation du module :

./gedit-markdown.sh install

Au cours de l’installation vous aurez deux processus de validation. Le premier vous demandant de choisir entre le mode standard ou spécial et le second vous demandant si vous voulez utiliser le mode d’aperçu dans la barre latérale ou inférieure. Dans les deux cas les réglages peuvent être modifiés après l’installation.

Ah j’oubliais !!! Si vous me demandez la différence entre le mode standard et le mode spécial je vous le dis tout de suite, je n’en sais fichtrement rien. Ça c’est fait…

markdown-install

Une fois que vous avez franchi toutes les étapes il ne vous restera plus qu’à sélectionner le mode Markdown dans Gedit, en passant par le menu Affichage/Balisage et en sélectionnant Markdown.

Vous pouvez voir maintenant la syntaxe Markdown en action dans l’exemple ci-dessous (cliquez pour agrandir). Vous avez le texte initial dans Gedit (à gauche) et le résultat final à droite.

markdown-exemple
Sympa non ?!! Il ne reste plus qu’à vous y mettre maintenant :)

Si toutefois cela ne vous plaît pas et que vous avez envie de vous en débarrasser, entrez la commande suivante dans votre terminal.

./gedit-markdown.sh uninstall

Amusez-vous bien.

source

flattr this!

Gravatar de Noireaude
Original post of Noireaude.Votez pour ce billet sur Planet Libre.

Noireaude : SpringSeed 1.0 – Un petit éditeur de notes sympa pour Ubuntu 12.04+ et Archlinux

lundi 30 septembre 2013 à 07:30

springseed

SpringSeed est un petit logiciel Libre publié sous licence MIT et malheureusement uniquement disponible sur Ubuntu pour le moment, qui propose à l’utilisateur de bénéficier d’une application de prise de note élégante et simple à utiliser. Le développement de cette application a débuté en janvier et la version 1.0 est disponible depuis le 25 Juillet. Pour le moment SpringSeed propose des options basiques vous permettant non seulement de prendre des notes, de les éditer, de bénéficier d’une option de recherche et enfin, de les partager via Dropbox. Sur la page officielle du projet les développeurs annoncent toutefois que d’autres fonctions vont être ajoutées au fur et à mesure et qu’un support pour Windows et Mac Os X est envisagé. Il ne reste plus qu’à espérer qu’il supportera également très vite d’autres distributions qu’Ubuntu et pour le reste, nous allons voir rapidement à quoi ressemble SpringSeed.

Utilisation :

Comme je vous le disais plus haut l’interface est minimaliste et au premier coup d’œil celle-ci se révèle d’emblée très agréable à regarder. Les options d’écriture sont également très basiques et vont vous permettre d’écrire normalement, en gras, en italique, en majuscule et d’insérer des liens. Cependant attention, la syntaxe est un peu particulière.

Quand vous voudrez écrire en gras ou en italique vous verrez s’afficher des astérisques, les titres en majuscules sont quant à eux obtenus grâce à l’ajout du symbole « # » devant la phrase, et vous pouvez également voir que les liens ont une structure particulière. Ils sont à placer entre des crochets pour l’url et entre parenthèses pour la description.

Je pense en fait qu’il s’agit d’une sorte de syntaxe Markdown (crée par John Gruber et feu Aaron Swartz), dont curieux hasard, nous reparlerons dans le prochain billet.

Voilà à quoi ça ressemble :

springseed-01

Et voilà ce que ça donne après l’enregistrement du document :

springseed-02

Comme je vous le disais plus haut vous pourrez ensuite enregistrer vos notes et au besoin, les exporter vers Dropbox très facilement.

springseed-03

Conclusion :

En résumé bien qu’assez basique ce soft est très sympa, léger et fait ce qu’on lui demande sans rechigner. J’ai également adoré le système de syntaxe.

Si vous voulez un soft de notes efficace et sans fioritures vous devriez l’essayer, il est très sympa.

Installation :

Si ça vous tente vous pouvez en profiter sur les versions d’Ubuntu et dérivé 12.04 minimum en procédant de la manière suivante. Téléchargez et installez le .deb à l’aide de ces deux lignes de commande :

Ubuntu 32 bits :

wget http://springseed.s3.amazonaws.com/dl/springseed_1.0.2_i386.deb
sudo dpkg -i springseed_1.0.2_i386.deb

Ubuntu 64 bits :

wget http://springseed.s3.amazonaws.com/dl/springseed_1.0.2_amd64.deb
sudo dpkg -i springseed_1.0.2_amd64.deb

Une fois que c’est fait vous ne trouverez pas forcement SpringSeed dans la liste des applications. Si c’est le cas rendez-vous dans le dossier /opt/springseed/ et lancez manuellement l’application en cliquant sur le fichier springseed-bin.

On me souffle vigoureusement dans les commentaires que SpreengSeed est également disponible sur Archlinux via AUR.

Et c’est tout!

Si vous voulez suivre ce projet voici quelques liens utiles.

Bon test, bon début de semaine et amusez-vous bien!

via

flattr this!

Gravatar de Noireaude
Original post of Noireaude.Votez pour ce billet sur Planet Libre.

Artisan Numérique : Les différents canaux de SSH

lundi 30 septembre 2013 à 00:03

Pour beaucoup, ssh est simplement l'outil permettant d'ouvrir une session sécurisée sur une machine distante. Et au fond, que devrions-nous comprendre de plus d'un outil appelé Secured Shell ?

En réalité SSH doit plutôt être vu comme un système client-serveur permettant d'établir un tunnel chiffré entre deux machines. Après ce que l'on peut faire de ce tunnel est tout le sujet de cet article.

Un canal pour les entrées/sorties standards

Pour commencer, voyons un peu ce qui se passe lorsque l'on tape un classique ssh gaston@titine.

  1. Le client SSH ouvre un tunnel chiffré sur le service SSHD (démon SSH) du serveur titine.
  2. Le serveur demande le mot de passe de l'utilisateur Gaston et l'authentifie.
  3. Le service SSHD crée un pseudo terminal (PTY) pour Gaston, récupère son shell par défaut (ex. /bin/bash) et le lance en l'associant au PTY.
  4. À partir de maintenant, tout ce qui est saisi sur l'entrée standard du client SSH est expédié au travers du tunnel chiffré vers le PTY distant, et est donc reçu par le shell distant comme si cela avait été saisi en local.
  5. Dans l'autre sens, tout ce que le shell a à nous raconter est envoyé vers son PTY, passe par le tunnel et est écrit sur la sortie standard par SSH.

Dans cette première approche, si l'on oublie deux minutes le PTY, SSH permet donc d'exécuter à distance une commande, le shell, et de l'exploiter comme si elle était locale. Le tunnel est donc ici exploiter pour véhiculer les canaux STDIN/STDOUT et STDERR de la commande distante.

Si l'on ajoute une commande à SSH, par exemple ssh gaston@titine hostname, la dite commande sera exécutée, à distance, au sein du shell de référence de l'utilisateur Gaston. À la différence du cas précédent, le shell n'exécutera que cette commande et mettra fin à ses jours juste après. Cette syntaxe nous permet donc de lancer n'importe quelle commande sur le serveur distant et de prendre en local connaissance de son résultat.

Pour conclure sur cet aspect, voyons deux exemples plus complet :

gastoncat ~/.ssh/id_dsa.pub | ssh robert@machine "cat >> ~/.ssh/authorized_keys"
Exemple de redirection simple

Ici la commande cat va envoyer le contenu du fichier id_dsa.pub dans l'entrée standard de ssh qui va s'empresser (après authentification) de transmettre cela dans son tunnel chiffré à l'entrée standard de la commande cat qui va l'ajouter au fichier distant authorized_keys. Dans la mesure où c'est Robert qui a lancé la commande, c'est son dossier HOME qui sera utilisé pour le tilde. Pour mémoire, cette commande est une version manuelle de ssh-copy-id.

Deuxième exemple, dans l'autre sens cette fois :

gastonssh gaston@serveur_avec_grosse_ligne "cat ~/Pas.Bien.S01E03.VOSTFR.HDTV.avi" | mplayer -
2nd exemple de redirection simple

Dans cet exemple la lancé dans le shell distant, cat, va débiter un fichier dans la sortie standard. Les données seront expédiées à tracers le tunnel et SSH les relayera sur sa propre sortie standard. Ensuite mplayer récupère ces données pour faire ce qu'il a à faire (le paramètre - dans le monde unix signifie souvent "entrée standard").

Pour ceux qui ne verrais pas à quel point cette commande peut être utile, je n'en dirais pas plus ;-)

Maintenant, SSH permet de véhiculer beaucoup plus de choses que les entrées/sorties standard des commandes. En réalité, et c'est la logique du titre de ce chapitre, SSH va multiplexer son tunnel en différents canaux. Voyons donc les autres.

Un canal pour rediriger un port

Redirection d'un port distant vers un port local

Nous avons vu que SSH fonctionnait comme un tunnel sécurisé permettant de faire passer, de manière chiffrée, des données d'une commande à une autre, l'une locale, l'autre distante. Mais ce ne serait pas rendre hommage à cet outil que de le limiter à ce simple usage.

En effet, ssh est parfaitement capable de faire la même chose mais directement sur un port TCP/IP cette fois. Imaginons un cas classique. J'ai un réseau local utilisant webmin. Ce dernier est un serveur WEB utilisant le port 10000. Or je n'ai pas très envie de publier ce port sur un réseau public, et pourtant pouvoir accéder à cette interface d'administration à distance peut-être très utile. La solution ? Passer par un routage de port avec ssh :

gastonssh titine -L 8080:localhost:10000
gaston@titine
routage du port distant titine:10000 vers le port local localhost:8080

Une fois la commande exécutée et la connexion établie, si vous prenez votre navigateur WEB et que vous allez à l'adresse localhost:8080 (le port 8080 de VOTRE machine locale), la requête va transiter par ssh et être effectuée sur le serveur distant au port localhost:10000. Le résultat de la requête va revenir par le même chemin et s'afficher sur votre navigateur. Et voilà :-)

Alors nous avons utilisé localhost, qui indique ici l'adresse local de la machine distante (faut suivre ;-) ). Cela désigne donc bien titine, mais via son IP locale (127.0.0.1). Cette commande permet donc d'atteindre toutes les machines qui peuvent être accessible de la machine distante, locales ou pas. A méditer très sérieusement lorsque vous ouvrez benoîtement un accès ssh à un tiers...

Redirection d'un port local vers un port distant

Il est aussi possible par ssh d'effectuer l'opération inverse et ainsi autoriser la machine distance à se connecter sur un serveur de votre lan

gastonssh titine -R 8080:localhost:10000
gaston@titine
Routage du port local localhost:10000 sur le port distant titine:8080

Si sur la machine distante je vais cette fois à l'adresse localhost:8080, j'accède en réalité au port 10000 de ma machine locale.

Un tunnel pour les applications graphiques (ou pas)

Le gros point fort de X11, notamment par rapport à ce wayland dont tout le monde parle, c'est sa trop méconnue transparence réseau. En effet, X11 est un serveur graphique auquel se connectent des clients que sont les applications graphiques. Lorsque les clients et le serveur sont locaux, les communications passent par les sockets UNIX, mais lorsque le serveur et les clients ne sont pas sur la même machine, tout passe par le réseau classique.

Du coup, techniquement il est possible de lancer des applications graphiques distantes qui utiliseraient notre serveur X11 local. Pour cela il faudrait :

  1. Modifier le paramétrage du serveur X11 pour accepter les connections externes en modifier /etc/X11/xinit/xserverrc, en enlevant le -nolisten et en relançant X11.
  2. Authoriser les clients à se connecter sur notre serveur par un xhost +
  3. Régler sur la machine distante la variable DISPLAY pour qu'elle pointe sur notre serveur (ex. DISPLAY=MA_MACHINE:0.0).

Bref, pas simple...

Où alors, autre solution, ne rien faire et laisser SSH établir une redirection de port tout seul comme un grand. Ainsi si vous lancez ssh -X machine_distante et qu'une fois connecté vous tapez echo $DISPLAY vous constaterez que la variable a été réglée par ssh à localhost:10.0. Si vous lancez une application dans ce shell, par exemple xcalc, elle va donc se connecter sur le port 6010 (6000 + Numéro du display), et ainsi contacter sans encombre notre serveur X11 local comme n'importe quelle application X11 locale.

Après la viabilité de la solution dépend grandement de la qualité des liaisons mais dans la mesure où X11 a été pensé pour les réseaux 1mb/s, je vous laisse imaginer ce que cela donne sur un réseau local gigabit.

Utilisation du tunnel en proxy SOCKS

SSH complète la panoplie du tunnel chiffré par un outil de poids : un proxy SOCKS.

Un proxy SOCKS est un petit serveur utilisant un protocole permettant à une application qui sait en faire usage (un navigateur WEB, un messenger, un client FTP, etc..) de se connecter sur le net sans avoir directement de connexion à internet. Toutes les demandes de l'application vont donc passer par le proxy SOCKS.

Un proxy SOCKS se distingue d'un Proxy HTTP par le fait qu'il n'est pas spécialisé à un seul protocole (contrairement au cas précédent) mais va router globalement le trafic qu'il soit FTP, HTTP, POP, etc...

Pour utiliser une machine distante comme passerelle internet et la machine locale comme proxy socks, il me suffit donc de lancer la commande suivante :

gastonssh titine -D 3128
gaston@titine
Établissement d'un proxy SOCKS à partir de la machine distante sur le port local 3128

Et si je configure par exemple FireFox pour utiliser le serveur SOCKS localhost:3128, je vais pouvoir, à travers la connexion SSH, utiliser la connexion Internet de la machine distante sans aucune limite. Je peux aller sur n'importe quelle machine du réseau distant, je peux aussi utiliser la connexion Internet du réseau distant. Bref, faire à peu près ce que je veux. La aussi, c'est le genre de chose à méditer avant de donner sans réfléchir un accès ssh sur une machine.

Un peu de configuration

Créer des automatiquement un canal de redirection

Le client SSH est totalement paramétrable par fichier de configuration. Et comble de la joie, la configuration peut être dans le fichier /etc/ssh/ssh_config mais surtout aussi dans votre dossier perso ~/.ssh/config.

Dans ce fichier il est possible de définir à peu prés tous les aspects de SSH, y compris donc les canaux de redirection. Cela se fait très simplement en ajoutant au fichier de configuration une directive Host

# on ne veut pas de redirection d'affichage par défaut
ForwardX11 no
Host titine
  # routage du port distant titine:10000 vers le port local localhost:8080
  LocalForward=8080 localhost:10000

  # Routage du port local localhost:10000 sur le port distant titine:8080
  RemoteForward=8080 localhost:10000

Host totoche
  # Redirection d'affichage
  ForwardX11 yes

  # Création d'un canal SOCKS5
  DynamicForward 3128
automatisation des redirections

Limiter un peu tout cela...

Il est bien évidement possible de paramétrer le serveur, notamment pour limiter un peu les dégâts d'une ouverture trop sauvage. Dans ce cas, la configuration à modifier se trouve dans le fichier /etc/ssh/sshd_config.

Pour désactiver globalement les redirections, il suffit d'ajouter/modifer la directive AllowTcpForwarding No. Même principe avec la directive X11Forwarding pour la redirection d'affichage.

Vous pouvez aussi (merci à Lord pour la précision :) limiter cela par utilisateur en en ajoutant cette fois une directive Match. À la mode Unix, le principe est donc de désactiver pour tout le monde, et d'activer au cas par cas :

AllowTcpForwarding No
X11Forwarding no
Match User robert
    AllowTCPForwarding yes
    X11Forwarding yes
Activation juste pour l'utilisateur Robert
Dans la série porte blindée sur murs en cartons, la désactivation des redirections n'apporte strictement aucune sécurité si vous autorisez l'accès au shell à un utilisateur.

Conclusion

Ce rapide tour d'horizon nous a permis de voir à quel point SSH est un outil versatile et souple. Et dangereux aussi. A manier donc avec d'infinies précautions dès qu'il s'agit d'ouvrir un accès ssh sur votre machine, ou de laisser passer ssh sur un firewall.

Gravatar de Artisan Numérique
Original post of Artisan Numérique.Votez pour ce billet sur Planet Libre.

Planet Libre : Brèves du Planet Libre - Monday 30, September 2013

lundi 30 septembre 2013 à 00:00

30gnu - laquadrature.net

GNU vidéo


antistress : :)


Portes ouvertes pour le logiciel libre - Région Île-de-France

salon OWF


antistress : "Du 3 au 5 octobre, l’Open World Forum réunira les principaux acteurs européens du logiciel libre à Montrouge. L’occasion de faire le point sur la place désormais prépondérante du « libre » dans le monde du logiciel et du numérique."


30 ans de GNU : interview de Richard Stallman - PC INpact

Stallman GNU


antistress : "En visite à Paris, Richard Stallman nous a accordé une longue interview à l’occasion des 30 ans de Gnu.org qui seront fêtés ce 27 septembre. Le fondateur du projet GNU, qui a corédigé la licence publique générale GNU GPL avec Eben Moglen, revient sur l'importance du soutien au mouvement du logiciel libre."


Gravatar de Planet Libre
Original post of Planet Libre.Votez pour ce billet sur Planet Libre.

Articles similaires