Que devient Easy Ubuntu ?

Vous vous en souvenez certainement, il y a quelques années maintenant j’avais publié un petit logiciel qui eu un grand succès : Easy Ubuntu.

Easy Ubuntu servait à configurer automatiquement Ubuntu et à y installer les logiciels nécessaires à son utilisation courante (Flash, Java, codecs audio et vidéo, …). Il a participé à la démocratisation de cette distribution et a permis à un grand nombre de personnes de franchir le pas vers GNU/Linux.

Aujourd’hui, Ubuntu a évolué et Easy Ubuntu n’a plus aucune raison d’être. La distribution inclus désormais des utilitaires très “user friendly” qui permettent de récupérer et d’installer les modules propriétaires mais utiles par elle même.

Pourtant, de nombreuses requêtes arrivent toujours sur ce blog en provenances de recherches telles que “télécharger Easy Ubuntu”.

La première version, écrite en Bash et utilisant Zenity pour l’interface est toujours disponible dans les archives de mon ancien blog. (On y trouve aussi des scripts PHP et quelques mods pour PunBB et XOOPS sur lesquels je reviendrais peut-être ultérieurement.) Elle ne fonctionne que sur les veilles version d’Ubuntu (Warty, Breezy).

Capture d'écran d'Easy Ubuntu

J’avais ensuite ré-écrit entièrement le logiciel en Python / Glade pour qu’il soit plus stable et performant puis m’étais retiré du projet par manque de temps. Il avait été repris par une équipe de passionnés. À l’époque, nous avions créé un site internet pour Easy Ubuntu. Les archives de la version Python sont toujours disponible sur celui-ci.

Ce fût la fin de mon aventure avec Easy Ubuntu, mais pas celle avec Ubuntu. J’ai ensuite conçu Conceal, un gestionnaire de dossiers chiffrés pour GNU/Linux en général et Ubuntu en particulier, lors du Summer of Code 2007. J’ai du le mettre en demeure au cours de cette année suite à un emploi du temps chargé mais je reprend son développement. Une nouvelle version sortira très prochainement !

Un lecteur de flux RSS pour Android : la base de données intégrée

Après avoir réalisé notre tout premier programme avec Google Android, nous allons nous lancer dans la réalisation d’un projet un peu plus complexe : un lecteur de flux RSS.

Capture d’écran du lecteur de flux RSS

Ce sommaire lecteur de flux permettra juste de s’abonner, se désabonner et d’afficher des flux RSS. Vous pouvez récupérer l’archive incluant sources et binaires si vous souhaitez tester tout de suite le programme.

Présentation de SQLite

La plate-forme Android intègre le système de base de données relationnelle embarquée SQLite. SQLite est un mini SGBD ne nécessitant que peu de ressources, qui offre la possiblité de gérer facilement des bases de données de taille restreinte.

Comme son nom l’indique, SQLite s’utilise par le biais de requêtes SQL. Il est très bien intégré à Android, ce dernier propose un grand nombre de routines qui nous permettront d’interagir très simplement avec les données (par exemple, pour les afficher à l’écran). Nous l’utiliserons dans notre programme pour gérer la liste des flux RSS auxquels l’on est abonné.

Shéma de la base de donnée

Nous utiliserons un shéma assez simple pour notre base de donnée. Elle ne se constituera que deux trois colonnes :

_id url visit

Le champ _id est un nombre entier qui représente l’identifiant de chaque lien, il sera la clef primaire de notre table. Attention son nom est une convention Android / SQLite, veillez toujours à avoir une clef primaire nommée ainsi dans vos tables. Dans le cas contraire vous ne pourrez pas utiliser simplement les curseurs plus tard ! Ce champ est complètement géré par SQLite. Il s’occupera de l’incrémenter automatiquement et de veiller à sa cohérence.

Le champ url de type text contiendra l’adresse du flux RSS.

Le champ visit, qui n’a aucune utilisé dans l’état actuel du programme, pourrait servir à compter le nombre de chargement des flux RSS afin de les classer par ordre d’assiduité par la suite.

La classe Database

Nous allons placer tout ce qui a trait à la base de données dans une classe nommée Database. Après avoir créer un nouveau projet dans Eclipse, créez donc cette classe. Nous utiliserons deux variables qui portent sur tout la classe :

private SQLiteDatabase db;
  private RSSreader rss;

db permet d’agir sur la base de donnée tandis que rss représente le contexte, notre classe principale (nommée RSSreader). La variable rss nous permet d’utiliser les fonctions openDatabase et createDatabase fournies par la plate-forme.

Le constructeur ce contente d’instancier la variable rss et de lancer la procédure d’ouverture de la base de données.

public Database (RSSreader rss) {
 	this.rss = rss;
        open ();
 }

Cette procédure appelle la méthode fournie par Android openDatabase qui nous permettra d’interagir avec la base de donnée depuis la variable db. Si la base de données n’existe pas, on appelle la procédure qui la créera.

private void open () {
 	try {
    	    	db = rss.openDatabase ("rssreader", null);
    	 }
     	catch (FileNotFoundException e) {
    	 // Create the database
    	 createDb ();
     	open ();
     }
}

La procédure de création de la base de donnée :

private void createDb () {
    	String sql;
    /* Command to view the DB : sqlite3 data/data/net.lapinblanc.android.rssreader/databases/rssreader */
    try {
    	// Create the database
    	db = rss.createDatabase ("rssreader", 1, rss.MODE_PRIVATE, null);
    	sql = "CREATE TABLE IF NOT EXISTS feed(_id INTEGER PRIMARY KEY, url TEXT, visit INTEGER);";
    	db.execSQL (sql);
    	// Insert un example
    	    	add ("http://lapin-blanc.net/feed/");
    	}
    	 catch (FileNotFoundException e) {
    	    	// TODO Auto-generated catch block
    	    	e.printStackTrace();
    	}
}

La base de donnée est ici privée (MODE_PRIVATE), c’est à dire que seul notre programme pourra y accèder. La création en elle-même revient à envoyer une requête SQL classique de création de table. Nous créons donc notre base de donnée nommée rssreader puis nous insérons un flux d’exemple (celui de ce blog) en appelant la procédure add.

La base de donnée correspond en fait à un fichier texte rangé dans le répertoire /data/data/votre.package/databases/. Pour vous y connecter lancez la commande adb shell dans un terminal. Vous voici avec un shell au sein du système Android (celui de l’émulateur dans notre cas). Il s’agit en fait de BusyBox tournant au-dessus d’un noyau Linux. Pour utilisez la base de donnée en mode shell lancez sqlite3 /data/data/net.lapinblanc.android.rssreader/databases/rssreader. N’oubliez pas les points virgules terminaux à vos requêtes vous les exécuter !

La procédure add prend en paramètre une url et l’ajoute à la base de donnée :

public void add (String url) {
    	/* Insert feed into the database */
       SQLiteStatement st = db.compileStatement("INSERT INTO feed(url, visit) VALUES ('?, 0)");
       st.bindString(1, url);
       st.execute();
    }

Ici aussi, le code est limpide, il s’agit de simples requêtes SQL comme si l’on agissait sur serveur de base de données classique.

Voyons maintenant comment supprimer un flux de la base de donnée :

public void delete (String url) {
    	db.execSQL("DELETE FROM feed WHERE url='" + url + "';");
    	SQLiteStatement st = db.compileStatement("DELETE FROM feed WHERE url='?';"));
    	st.bindString(1, url);
    	st.execute();
}

Dernière méthode, certainement la plus intéressante, celle qui renvoi la liste des flux dans la base de données :

public Cursor list () {
    	/* Return a Cursor on a list of stored RSS feeds */
       String [] selectionArgs = {};
       String [] columns = {"_id", "url", "visit"};
       return db.query (true, "feed", columns, null, selectionArgs, null, null, null);
}

Elle retourne un curseur, c’est ce curseur qui nous permettra plus tard de placer les flux dans une liste déroulante. Le tableau de chaines de caractères selectionArgs, ici vide, permet de spécifier des critères de sélection, formatés à la manière d’une clause WHERE dans une requête SQL. Le tableau columns permet d’indiquer quels colonnes nous souhaitons sélectionner, à la manière d’un SELECT en SQL. N’oubliez de sélectionner la colonne _id quelque soit votre requête. Sans elle l’utilisation ultérieur des curseurs sera beaucoup plus difficile.

Nous avons maintenant une base de donnée fonctionnelle et très légère sous Android. Dans le prochain article nous verrons comment créer une interface graphique pour gérer ces données.

Note : Merci à Infernal Quark d’avoir corrigé l’affreuse faille par injection SQL que j’avais laissé trainé…

Plugin Scoopeo pour Wordpress v0.3

Voici une nouvelle version de mon plugin qui permet d’intégrer Scoopeo à Wordpress. Au programme :

Télécharger le plugin Scoopeo pour Wordpress version 0.3

Premier programme avec Android

Le kit de développement de Google Android désormais installé, commençons à coder ! L’objectif de cet article est de découvrir les bases de la programmation et de l’exécution de programmes pour Android. Il nécessite de maitriser la programmation en Java et de connaitre les rudiments du fonctionnement d’Eclipse.

Plugin Android pour Eclipse

Lançons Eclipse et créons un nouveau projet Android. Nous le nommerons Hello. Le package, dont le nom respectera les conventions Java, sera pour notre example net.lapinblanc.android.hello. Hello sera également l’Activity Name. L’Activity Name est simplement le nom de la classe principale du programme qui dérivera de la classe Activity d’Android. C’est simplement une classe exécutable. Application Name est le nom de votre application telle qu’elle apparaitra pour l’utilisateur.

Interface graphique par programmation

Modifions maintenant notre programme pour lui faire afficher un texte de bienvenue. Il est nécessaire de créer une interface simpliste afin d’afficher quelque chose. Modifions la classe autogérée Hello pour qu’elle ressemble à ceci :

package net.lapinblanc.android.hello;

import android.app.Activity;
import android.os.Bundle;

import android.widget.TextView;

public class Hello extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        // On crée une boîte de texte
        TextView tv = new TextView(this);
        // On lui assigne le texte que l'on souhaite
        tv.setText ("Salut Android !");
        // On affiche la boîte
        setContentView(tv);
    }
}

Android propose un grand nombre de “widgets”. Vous pourrez très simplement utiliser les classiques boutons, listes déroulantes, mais aussi des horloges, des sélecteurs de date et même des galerie photos et des afficheurs de vidéo !

Notre programme écrit, lançons-le depuis l’émulateur fourni. Il faudra créer une nouvelle configuration Eclipse. Cliquez sur la flèche verte et choisissez Open Run Dialog. Choisissez comme type Android Application, nommez votre application, indiquez le package et le même nom de projet que vous avez entrez un peu plus haut. C’est parti, l’émulateur doit se lancer et afficher notre magnifique programme.

Interface graphique par fichier XML

Nous avons créé notre sommaire interface graphique entièrement dans le code source Java. Une approche plus moderne, popularisée par Glade, est de décrire l’interface graphique dans un fichier XML. Ce dernier sera lu par le programme et l’interface graphique sera automatiquement générée en conséquence. Il devient ainsi beaucoup plus facile de modifier et de faire évoluer une interface graphique déjà existante.

Android offre cette fonctionnalité par défaut.

Notre Hello World est cette fois-ci déjà généré par Eclipse !
Restaurons la classe par défaut :

package net.lapinblanc.android.hello;

import android.app.Activity;
import android.os.Bundle;

public class Hello extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
    }
}

Intéressons nous au fichier res/layout/main.xml, c’est dans celui-ci qu’est décrit notre interface. C’est l’attribut text de la balise TextView qui permet de spécifier ce qui sera affiché à l’écran.

Bonjour Android !

Il existe plusieurs type de layouts, ils permettent d’agencer les objets à l’écran comme bon vous semble. Les principaux sont le LinearLayout, qui affiche les éléments de manière horizontale ou verticale, le RelativeLayout qui permet de placer les élements les uns par rapport aux autres (la boite de texte doit être à droite du bouton OK et en-dessous du label de bienvenu…), le TabularLayout qui agence les éléments de manière tabulaire ou encore le FrameLayout qui permet d’afficher plusieurs layouts au sein d’un seul. Pour de plus amples informations, référez-vous au tableau récapitulatif des différents layouts. Il est assez explicite.

Le fichier R.java, qu’il ne faut pas modifier, gère les liens entre le code source Java et le fichier XML de description d’interface.

Amusez-vous à modifier le fichier XML puis cliquez sur Run pour voir le résultat. Dans le prochain article nous attaquerons les choses sérieuses : nous commencerons enfin la réalisation de notre lecteur de flux RSS pour Android avec la partie base de donnée intégrée !

Plugin pour intégrer Scoopeo à votre blog Wordpress

Scoopeo, c’est le plus populaire des digg-like francophone. Scoopeo est un aggrégateur de liens. Ceux-ci sont classés suivant les votes des visiteurs. Le site permet également de poster des commentaires à propos des pages publiées.

C’est une pratique répandue chez les blogueurs de faire apparaître leurs articles sur les sites webs sociaux tels que Scoopeo, Blogasty ou encore Wikio. C’est une manière efficace de leurs assurer une forte visibilité et de générer du traffic sur leur blog.

J’ai développé un plugin pour Wordpress, un moteur de blog très répandu qui permet :

Ce plugin permet de maximiser le nombre de votes reçus pour vos articles, car vos visiteurs peuvent voter simplement même s’ils ne sont pas arrivés sur la page depuis Scoopeo. Il rapatrie également tout le contenu associé à votre article (les commentaires Scoopeo), tous les visiteurs pouvant ainsi en profiter.

Note : le plugin existe désormais en version 0.3.

Télécharger le plugin d’intégration de Scoopeo à Wordpress

Installation

  1. Décompressez le fichier scoopeo-0.2.zip
  2. Transférez le fichier scoopeo.php dans le répertoire wp-content/plugins
  3. Activez le plugin depuis le menu Plugins du Tableau de bord
  4. Placez <?php the_scoopeo_clicker (); ?> dans vos templates pour afficher le clicker. Par exemple après <?php the_content('» Lire la suite...'); ?> dans index.php et single.php (Modèle de l’index principal et Article seul depuis l’éditeur de thème).
  5. Placez <?php the_scoopeo_comments (); ?> dans vos templates pour afficher les commentaires postés sur Scoopeo. Par exemple après <?php if ('open' == $post-> comment_status) : ?> dans comments.php (Commentaires depuis l’éditeur de thème).

C’est tout, le plugin est installé !

Todo :

Notes :

Sécurisez votre blog Wordpress !

L’installation par défaut de Wordpress pose quelques gênants problèmes de sécurité. Nous allons nous employer à les corriger.

Cachez le contenu des répertoires internes

Par défaut, Wordpress ne bloque pas l’accès à tous les répertoires nécessaires à son fonctionnement que le public ne devrait pas pouvoir consulter. C’est le cas du très sensible répertoire wp-content/plugins. Les plugins que vous installez peuvent avoir étaient développés par des programmeurs novices ou ne pas avoir été correctement audités et contenir des failles de sécurité. Par défaut, Wordpress permet à n’importe qui de lister les plugins que vous avez installé. Pour y remédier, entrez la ligne suivante dans votre fichier .htaccess, à la racine de votre répertoire :
Options -Indexes
Désormais, si un curieux tente d’accéder à des répertoires sensibles, il ne verra qu’une erreur 403.

Supprimez le numéro de version des meta-tags

De nombreux thèmes Wordpress dont celui par défaut affichent un vilain meta-tag :
<meta name="generator" content="WordPress 2.3.3" /> <!-- leave this for stats please -->
Le petit commentaire associé ni changera rien, ce meta-tag est une très mauvaise idée ! Il permet aux pirates de connaitre instantanément quelle version du logiciel vous utilisez et quelles sont les failles de sécurité qui la touchent. Il pourrait même permettre à un robot d’attaquer massivement les sites utilisant des Wordpress non mis-à-jour.

La aussi, la correction est simple, ouvrez le fichier header.php de votre thème (dans le répertoire wp-content/themes/default/ pour le thème par défaut) et cherchez :
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats -->
Si vous êtes sans états d’âmes pour les statistiques de Wordpress supprimez simplement la ligne, sinon remplacez-la par :
<meta name="generator" content="WordPress" /> <!-- leave this for stats -->
Espérons que Wordpress 2.5 corrigera ces problèmes.

Pour finir, quelques conseils en vrac

Bien postuler au Google Summer of Code 2008

Cette année encore, Google propose le Summer of Code ! Ce programme offre une bourse de l’ordre 4 000 $ à des étudiants pour qu’ils participent à des projets Open Source pendant leurs vacances. Fort de mon expérience de l’édition passée, je vais tenter de vous expliquer comment être sélectionner et mener à bien votre projet.

En attendant les sélections

Du 3 au 12 mars, des organisations éditrices de logiciels et de projets Open Source se proposeront à Google pour bénéficier du programme. Celles qui seront sélectionnées assigneront des tuteurs aux étudiants du programme afin de les aider à s’intégrer au projet et de leur fournir un support technique.

Du 24 au 31 mars ce sera au tour des étudiants de proposer leurs projets. En attendant, c’est une bonne idée de consulter la liste des organisations retenues lors de l’édition précédente. Il y a de grandes chances pour que la liste de cette année y soit similaire. Les mastodontes du libre que sont Apache, Debian, Widimedia ou GNOME feront parti à coup sur des heureux élus… et nombre de prétendants au soutien de Mountain View tiennent une liste de projets nécessaires à leur évolution sur leur wiki.

Il faut savoir que se sont les organisations retenues (et non Google) qui sélectionnent les étudiants. Commencez à rédiger votre projet en vous inspirant de ceux proposés sur les sites des organisations sans attendre ! Mais surtout établissez un projet réalisable, sans sur-estimer vos compétences. Pour obtenir l’argent, il faudra que vous le terminiez et qu’il passe les deux évaluations intermédiaire de votre tuteur. Choisissez un domaine dans lequel vous êtes à l’aise, ce n’est pas pendant le Summer of Code que vous apprendrez un langage ! Si possible participez à un projet dont vous connaissez déjà l’architecture technique.

Profitez également du temps restant pour prendre contact avec l’organisation avec laquelle vous désirez travailler. Les tuteurs sélectionneront plus facilement quelqu’un dont ils ont déjà entendu parler ou mieux d’investi dans la communauté. Si vous êtes un parfait inconnu qui débarque le dernier jour avec un projet tout sauf imprégné de l’esprit de l’organisation, vos chances seront bien moindres… Les forums, les canaux IRC et les listes de diffusion sont les meilleurs moyens d’instaurer le contact avec la communauté !

Une fois sélectionné

Vous voici parti pour un été à la lumière de votre écran ! Un été c’est court et il va falloir avancer vite. Lors de l’élaboration de votre projet, vous aurez établi un planning : tenez-y vous !

Tout au long de votre projet, il est important d’entretenir des relations régulières avec votre mentor, si possible détaillez lui votre avancement plusieurs fois par jours. Ce n’est que comme ça qu’il pourra rapidement vous ré-orienter dans la bonne direction et qu’il se rendra compte de votre investissement dans le projet. Gardez toujours à l’esprit qu’outre le fait de participer à au développement d’un projet Open Source, l’objectif est que votre tuteur valide les deux évaluations afin que vous obteniez la bourse tant convoitée.

Ne négligez pas non plus le feedback de la communauté. Mettre en place un blog ou vous relaterez les avancées de votre projet et ou vous annoncerez ces versions bêta semble une bonne idée. Le public regorge de bonne idées et plus vous aurez de testeurs, plus facilement vous découvrirez les bugs !

← Previous Page