Easy Peasy

linuxCela faisait quelque temps que j’avais délaissé mon Eee PC. Soyons franc, la xandros fournie avec est une horreur. Tout d’abord, une partie significative du disque est utilisée afin de permettre une réinstallation en cas de problème. Ensuite le packaging laisse vraiment à désirer et il n’est pas rare de se retrouver avec des packages qui ne s’installent pas ou mal. Cela ne m’a pas vraiment dérangé, car mon Netbook ne me servait, au départ, que de Netbook. Pour naviguer sur internet, lire mes mails et discuter via Skype c’est largement suffisant. Cependant, l’Eee PC est aussi une bonne solution pour développer sous Linux1 quand vous êtes coincé dans un train ou un avion. Malheureusement, pour ce dernier point, il ne faut pas compter sur xandros pour vous faciliter la tâche. En effet, à moins de rajouter les dépôts Debian vous pouvez toujours rêver si vous voulez installer Ruby ou avoir une version de Java récente. Mais là encore, en mélangeant les dépôts, vous prenez un risque de vous retrouver avec un ensemble peu cohérent. Bref, si vous aimez les choses belles et simples2 c’est un bon moyen pour vous prendre la tête. La meilleure solution : remplacer la xandros pas une vraie distribution Linux.

Je n’avais pas vraiment pris le temps de chercher. C’est chose faite, et j’ai trouvé mon salut avec Easy Peasy. Il s’agit d’une distribution basée sur ubuntu, adaptée à la petite taille des Netbooks.

L’installation est ubuntuesque. Il suffit d’installer Easy Peasy sur une clé USB puis de booter dessus. Vous pouvez ainsi prendre le temps de tester avant d’installer.

Sur le site d’Easy Peasy, vous trouverez les instructions pour faire cette installation. Malheureusement, je n’ai jamais réussi à utiliser UNetbootin. Cet outil est sensé vous permettre de créer la clé USB bootable. Mais sur mon portable équipé d’une ubuntu (classique) : rien… Et la présence d’une version d’UNetbootin pour Windows ne me servait à rien, je n’ai pas de machine sous Windows. La solution passe par isotostick.sh que vous trouverez sur la page d’installation d’Ubuntu Netbook Remix3 !!! Il faut cependant faire une petite correction si vous utilisez ubuntu 9.04. En effet, udevinfo a été remplacé par udevadm. Modifiez donc la ligne 42 du script :

42
p=$(udevinfo -q path -n $DEV)

comme ceci :

42
p=$(udevadm info -q path -n $DEV)

Ou, si vous voulez éviter de vous embêter, téléchargez ma version modifiée.

La suite est simple. Une fois l’image de la distribution téléchargée, il suffit de créer la clé via la commande :

chmod +x isotostick.sh
sudo ./isotostick.sh easypeasy-1.1.iso /dev/sdX1

Faites attention, la première partition de votre clé doit être en ext[23] ou vfat et être bootable.

Voilà. Il ne vous reste plus qu’à plugger votre clé dans votre netbook et a booter dessus.

easypeasy

Pour ceux qui préfèrent UNR à Easy Peasy, sachez qu’il n’y a pas d’image ISO mais IMG, la création de la clé est encore plus simple :

sudo dd if=ubuntu-9.04-netbook-remix-i386.img of=/dev/sdX bs=1M

1 Je flirte plutôt du côté de la pomme…
2 http://www.apple.fr
3 Bon, Ok, la prochaine fois j’installe une UNR !!!

Utiliser plusieurs claviers avec des mapping différents sous X.org

Les deux techniques présentées sont différentes selon la version de X.org utilisée.
Les versions de X.org >= 1.5 supportent l'hotplugging, en passant par HAL ; les versions précédentes non.

Pour connaître sa version de X:

X -version

Avec HAL

Pour lister les périphériques détectés par HAL:

lshal

Copie le fichier /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi dans /etc/hal/fdi/policy/.

Voici mon fichier une fois modifié:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keymap">
      <append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
    </match>
 
    <match key="info.capabilities" contains="input.keys">
      <merge key="input.xkb.rules" type="string">base</merge>
 
      <merge key="input.xkb.model" type="string">keyboard</merge>
      <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
             string="Linux">
        <merge key="input.xkb.model" type="string">evdev</merge>
      </match>
 
      <match key="info.product" string="TypeMatrix.com USB Keyboard">
              <merge key="input.xkb.variant" type="string">bepo</merge>
      </match>
      <match key="info.product" string="USB Multimedia Keyboard">
              <merge key="input.xkb.variant" type="string">latin9</merge>
      </match>
 
      <merge key="input.xkb.layout" type="string">fr</merge>
    </match>
  </device>
</deviceinfo>

La partie:

<match key="info.product" string="TypeMatrix.com USB Keyboard">
    <merge key="input.xkb.variant" type="string">bepo</merge>
</match>

spécifie que pour mon clavier TypeMatrix je souhaite une variante bépo.
Pour l'autre j'utilise du latin9.

Pour configurer ton fichier il faut reprendre les informations issues de lshal.
Les claviers sont repérables par leur info.capabilities qui contiennent 'input.keyboard'.

Une fois repérés il reste à récupérer la chaîne info.product (TypeMatrix.com USB Keyboard et USB Multimedia Keyboard dans mon cas) et configurer le fichier /etc/hal/fdi/policy/10-keymap.fdi avec.

Sans HAL:

Pour lister uniquement les périphériques d'entrée (souris, clavier, joystick...):

xinput list --short

On récupère l'identifiant du device qui nous intéresse et, par exemple:

setxkbmap -device 0 fr bepo
setxkbmap -device 1 fr latin9

L'inconvénient c'est que le changement n'est pas persistant lors de chaque redémarrage.

Cucumber>=0.3.4 et Merb. La dure cohabitation

Depuis la sortie de Cucumber 0.3.4 et pour les versions suivantes, une grosse modification dans Cucumber impose de changer un peu son utilisation avec Merb. En effet, si on peux lire dans le History.txt de Cucumber :

** IMPORTANT UPGRADE NOTES FOR RAILS USERS **
 
Running Cucumber features in the same Ruby interpreter as Rake doesn't seem to work,
so you have to explicitly tell the task to fork (like it was doing by default in prior
versions). In lib/tasks/cucumber.rake:
 
  Cucumber::Rake::Task.new(:features) do |t|
    t.fork = true # Explicitly fork
    t.cucumber_opts = %w{--format pretty}
  end
 
(If you run script/generate cucumber this will be done for you).
Alternatively you can omit forking and run features like this:
 
  RAILS_ENV=test rake features
 
However, setting the RAILS_ENV is easy to forget, so I don't recommend relying on this.

Cela est aussi vrai pour les utilisateurs de Merb. En général pour les utilisateurs de Merb, vous avez utilisé le plugin merb_cucumber de Roman. Hélas celui-ci a un générateur incomplet à l'heure actuel. En effet, la tâche rake features n'utilise pas les bonnes options pour cucumber.

Après un long et rude combat avec cucumber, j'ai fini par trouver les options adéquates pour avoir le même comportement que pour les précédentes version de Cucumber. Pour voir un exemple en "live" sur une application, vous pouvez regarder mon commit sur Oupsnow. Sinon, j'ai forké le merb_cucumber de roman, et ajouter un patch pour permettre l'utilisation de Cucumber 0.3.4 et plus

English translation


Article original écrit par Cyril Mougel et publié sur Shiny happy people coding | lien direct vers cet article | Si vous lisez cet article ailleurs que sur Shiny happy people coding, c'est qu'il a été reproduit illégalement et sans autorisation.

Engine Yard assurera le maintien de Ruby 1.8.6

Après un petit délai de mise en route interne, l'équipe de développement de Ruby a officiellement annoncé que le maintien de la branche 1.8.6 ne serait plus assurée par Urabe Shyouhei, mais par Kirk Haines, d'Engine Yard.

Cette branche a été lancée en 2007. Depuis lors, l'équipe de ruby-core a fourni du support, notamment par le traitement des bugs rapportés et par la communication d'alertes de sécurité. Ruby 1.8.6 a été un succès, si bien que ses utilisateurs ont manifesté le souhait que ce support perdure, au-delà des dates prévues en interne. Avec un accord de principe, restait à savoir qui allait s'en occuper. Engine Yard s'est proposée et il a été décidé de leur transférer les accès appropriés.

Du point de vue des utilisateurs, cette annonce officielle n'introduit aucun changement… si ce n'est que les fix et les mises-à-jour devraient sortir à un rythme un peu plus rapide.

Dans la peau d’Apple: iTv

Bizarrement la télévision est un produit qui n'a que très peu évolué ses dernières années.
Outre le fait que l'on soit passé à des écrans plats, les fonctionnalités sont très réduites.

Aujourd'hui les fournisseurs d'accès à Internet propose des forfaits avec des box offrant des services avancés.

Au final on se retrouve avec son téléviseur entouré de sa box, de son disque dur pour enregistrer des films ou faire du time-shifting, un lecteur DVD, une console, un téléphone…

Tout cela prend beaucoup de place, pourquoi ne pas avoir un certain nombre de fonctions inclues dans le téléviseur, qui aurait vraiment un rôle de plate forme multimédia ?

Pour en revenir au titre, un peu accrocheur, il me semble qu'Apple possède toutes les cartes pour sortir un produit vraiment innovant dans ce domaine.

Le design

Le produit pourrait simplement se présenter comme un gros imac avec une dalle plus grande.

Le matériel

Les besoins en puissance pourraient être réduits mais avec des capacités audio, vidéo et stockage améliorées et une gestion fine de l'énergie.

  • A l'intérieur un disque dur pour enregistrer des émissions et sur le côté un lecteur DVD, voire Blu-ray pour la lecture des films.
  • Un port ethernet et une connexion wifi pour se brancher directement à Internet.
  • Une isight permettant la vidéo-conférence.
  • Un combo microphone - haut parleurs pour faire de la téléphonie sur IP.
  • Un port bluetooth et infrarouge pour interagir avec des périphériques proches (iphone, oreillette pour les appels téléphoniques ou en vidéoconférence…).

Bref, cette iTv se présenterai simplement comme une agrégation de technologies existantes, rien de révolutionnaire au niveau du matériel.

Les applications

Côté logiciel c'est toute l'infrastructure Apple qui pourrait jouer avec un système de locations de films et d'achat de musique qui existe déjà avec iTunes et un système d'achat d'applications, déjà présent avec l'iPhone.
Des tonnes d'applications pourrait voir le jour:

  • Lecteur de flux RSS.
  • Application de domotique (pour piloter la fermeture de ses volets par exemple).
  • Consultation de vidéos en local et en ligne (miro-like).
  • iTunes light pour écouter de la musique, écouter la radio.
  • Téléphonie (via son FAI ou un système externe comme Skype).
  • Envoi de mail (en le dictant).
  • Gestion de contacts via le carnet d'adresse avec synchronisation gmail, mobile me…
  • Affichage de photos avec un iPhoto light permettant des fonctions basiques: consultation, diaporama, rotation…

La killer feature

Aujourd'hui ce qui empêche la télévision de s'imposer comme un centre multimédia de la maison, c'est l'aspect interaction.
Le système de télécommande est limité et utiliser un clavier sur sa télévision n'est pas forcément pratique.

La killer feature serait à mon goût un système de reconnaissance vocale avancé.
À l'installation un couplage entre personnes et téléviseur serait effectué.
L'intérêt serait de pouvoir piloter aussi les applications installées (c'est le système qui ferait la concordance voix - texte).

Bref, il me semble qu'il y a vraiment quelquechose d'intéressant à faire de ce côté ; et vite maintenant, parce que mon téléviseur à tube cathodique commence à fatiguer :-).

Client-side Database Storage avec Safari

appleJe vous propose d’explorer et tester les possibilités offertes par l’utilisation du système de base de données client-side de Safari.

L’idée vient avec HTML5. En effet, la norme du futur HTML prévoit la possibilité de stocker des données dans des bases, côté client. Cette possibilité était décrite dans le draft de la norme de février 2009, mais semble avoir disparu dans la dernière version. Pas grave, la solution existe déjà depuis 2007 dans Safari. Donc, que vous ayez une version 3 ou une version 4beta du navigateur, sous MacOSX ou sous Windows, vous pouvez tester ce qui va suivre1

Dans cet article, nous allons utiliser une simple base et faire des opérations CRUD classiques. Mais sachez que vous avez à disposition une base de données tout à fait classique2 avec laquelle vous pouvez utiliser presque toute la syntaxe SQL92.

S’agissant d’un stockage côté client, vous vous en seriez douté, mais les APIs d’accès sont en Javascript. Nous allons donc abondamment utiliser ce langage.

La création d’une base se fait via la fonction openDatabase qui prend 4 paramètres : le nom de la base, sa version, une description et la taille maximale utilisable pour le stockage des données. Cette fonction renvoie un objet Database. Avec cet objet nous allons pouvoir faire des transactions (via Database.transaction. Chaque transaction prend en paramètre une fonction à laquelle est passé un objet SQLTransaction. Nous utiliserons alors cet objet pour faire une requête via SQLTransaction.executeSql. Voici un petit exemple :

// Ouverture de la base
db = openDatabase("MaBase", "1.0", "Client-Side Database Storage - Example 1", 200000);
 
// Creation d'une table
db.transaction(function (tx) {
  tx.executeSql("CREATE TABLE MaTable (id REAL UNIQUE, key TEXT, value TEXT)");
}
 
// Insertion de données
db.transaction(function (tx) {
  tx.executeSql("INSERT INTO MaTable (id, key, value) VALUES (?, ?, ?)", [id, key, value]);
})
 
// Recherche de données
db.transaction(function (tx) {
  tx.executeSql("SELECT * FROM MaTable", [], function(tx, result) {
    // Traiter les résultats (result)
  }, function(tx, error) {
    alert( error );
  })
})

La récupération des données après un SELECT est elle aussi très simple. Dans la fonction passée après la requête, le paramètre result est un objet de type SQLResultSet. Nous pouvons en obtenir un objet de type SQLResultSetRowList via SQLResultSet.rows. Pour connaître le nombre de ligne retourné, nous utiliserons alors SQLResultSetRowList.length et pour obtenir les données d’une ligne en particulier, nous utilisons SQLResultSetRowList.item( i ) ou i est un numéro de ligne entre 0 et SQLResultSetRowList.length (exclu). La méthode SQLResultSetRowList.item( i ) renvois un objet Javascript classique ayant des attributs de même nom que les colonnes de la table.

db.transaction(function(tx) {
  tx.executeSql("SELECT id, key, value FROM MaTable", [], function(tx, result) {
    for( var i = 0; i < result.rows.length; ++i ) {
      var row = result.rows.item(i);
      // Faire quelque chose avec row.id, row.key et row.value
    }
  }, function(tx, error) {
    alert( error.message );
  })
})

Pour illustrer tout cela, voici un petit exemple avec son code.

Sachez que si vous avez opté pour Safari 4beta, vous pouvez visualiser le contenu de vos bases via l’inspecteur Web.

csds

Have fun !

1 Je vous conseil cependant d’utiliser la version 4beta.
2Il s’agit d’une base SQLite.

12e apéro Ruby de Paris.rb

RubyFrance vous annonce la tenue du 12e apéro Ruby du groupe Paris.rb

Cet apéro Ruby aura lieu le mercredi 20 Mai à partir de 20h. Comme nous commençons a en avoir l’habitude, nous nous retrouverons à Dune, 18 avenue Claude Vellefaux, 75010 Paris (métro Colonel Fabien ou Goncourt : e-dune.fr/acces ou googlemaps ).

Les sujets que nous pourrons aborder autour d’un verre :
  • Rails 3 étant annoncé en Alpha pour très bientôt, nous pourrons tous en discuter ;
  • RailsConf 09, qui s’est terminé le 10 Mai.

Vous pouvez voir quelque vidéo de cet conférence sur blip.tv: railsconf.blip.tv

Aucun enregistrement préalable n’est nécessaire, mais vous pouvez toujours m’indiquer votre venue par email. Si vous souhaitez réaliser une présentation, n’hésitez pas à me le signaler pour qu’on puisse l’organiser.

Venez nombreux ;-)

12ième apéro Ruby de Paris.rb

RubyFrance vous annonce la tenue du 12ème apéro ruby de Paris.rb

Cet apéro ruby aura donc lieu le Mercredi 20 Mai à partir de 20h. Comme nous commençons a en avoir l’habitude, nous nous retrouverons à Dune, 18 avenue Claude Vellefaux 75010 Paris (Metro Colonel Fabien ou Goncourt : e-dune.fr/acces ou googlemaps ).

Les sujets que nous pourrons abordé sont (avec un verre) :
  • Rails 3 étant annoncé en Alpha pour très bientôt, nous pourrons tous en parler entre nous.
  • RailsConf 09 qui s’est terminé le 10 Mai

Vous pouvez voir quelque vidéo de cet conférence sur blip.tv: railsconf.blip.tv

Aucun enregistrement préalable n’est nécessaire. mais vous pouvez toujours m’indiquer votre venue par email. Si vous souhaitez réaliser une présentation, n’hésitez pas à me l’indiquer pour qu’on puisse l’organiser.

Venez nombreux ;-)

12ième apéro Ruby de Paris.rb

RubyFrance vous annonce la tenue du 12ème apéro ruby de Paris.rb

Cet apéro ruby aura donc lieu le Mercredi 20 Mai à partir de 20h. Comme nous commençons a en avoir l’habitude, nous nous retrouverons à Dune, 18 avenue Claude Vellefaux 75010 Paris (Metro Colonel Fabien ou Goncourt : e-dune.fr/acces ou googlemaps ).

Les sujets que nous pourrons abordé sont (avec un verre) :
  • Rails 3 étant annoncé en Alpha pour très bientôt, nous pourrons tous en parler entre nous.
  • RailsConf 09 qui s’est terminé le 10 Mai

Vous pouvez voir quelque vidéo de cet conférence sur blip.tv: railsconf.blip.tv

Aucun enregistrement préalable n’est nécessaire. mais vous pouvez toujours m’indiquer votre venue par email. Si vous souhaitez réaliser une présentation, n’hésitez pas à me l’indiquer pour qu’on puisse l’organiser.

Venez nombreux ;-)

jQuery vs MooTools : Comment faire votre choix entre ces deux très bonnes librairies JavaScript ?