Entropie anthropique

Aller au contenu | Aller au menu | Aller à la recherche

mardi 7 avril 2009

Cappath, appel à volontaires

Bonjour, comme certains savent, je fais un stage au LIP6, et j'ai besoin d'effectuer quelques mesures depuis les utilisateurs finaux des FAI. J'ai donc développé un petit outil qui permet de faire les mesures dont j'ai besoin et me les envoyer. Je vous laisse vous rendre sur la petite page dédiée au projet cappath . Merci d'avance pour votre participation.

vendredi 13 mars 2009

Google Summer of Code 2009

Bonne nouvelle, le GSoC aura lieu cette année, et les organisations peuvent commencer à enregistrer leurs projets. Si vous menez un projet open-source, c'est une occasion à prendre. http://socghop.appspot.com/

mardi 10 mars 2009

Archlinux

Ça y est, je pense avoir trouvé chaussure au pied de mon pc. Je suis passé de Slackware à Archlinux, à priori les concepts KISS sont respectés, on a pas 150 softs inutiles installés de base. Bref, ce qu'il me fallait : du geek mais pas trop. En plus, pas de soucis pour le matériel de mon pc portable, donc vouala grosso modo j'ai gagné un boot plus rapide et un gestionnaire de paquetages avec dépendances.

lundi 22 septembre 2008

Retour à la vie-rtuelle

Et bien il en a fallu peu pour que je reste coincé dans la vie réelle en vacances. Maintenant elles sont finies et je repars pour une sans doute dernière année de cours, dont cinq mois de projet de fin d'études.

Du coup je vais commencer à chercher ce stage ingénieur, si possible entre de l'informatique de réseau, du signal, de la radiofréquences ou des fibres optiques. Pour l'instant mes préférences sont à peu près équilibrées. On verra, avec les premiers cours de chacunes de ces matières, lesquelles m'inspirent le plus. Car pour l'instant je me sens trop curieux. Tout bêtement tout me plaît tant que j'ai l'impression de conduire un projet si possible utile et qui compte un peu comme un défi.

En attendant, j'ai remis les mains dans Férus car j'ai trouvé un "hack" pour faire des attentes bloquantes sans bloquer tous les green threads de Ruby (indice: il faut rajouter une socket et faire du polling avec select dessus), ainsi que démarré un client pour les mesures de Grenouille. Il faudra que je mette à jour l'API ruby pour le site VDM et puis voilà tout pour mes projets geek. Ensuite, je me suis mis un peu à la photo et je dois continuer mes travaux de vocalisation des fables de Lafontaine.

lundi 2 juin 2008

Implémentation de l'API du site "vie de merde"

Peut-être bien que vous en aviez pas rêvé, mais pour une raison quelconque j'avais commencé à utiliser l'API du site vie de merde, un site où les gens peuvent dévoiler leurs désillusions à la face du monde.

Une fois arrivé à mes besoins, j'ai remarqué qu'il ne manquait plus grand chose pour en faire une librairie, par contre je ne me suis pas tué à faire un beau gem, et il manque également la récupération des commentaires ainsi que la récupération des erreurs.

C'est téléchargeable à la forge Ruby, et voici un exemple simple d'utilisation:

require 'vdm.rb'

v0 = VDM.au_pif # marche aussi avec au_hasard, at_random
p v0.text
        # => du texte [...]
v0.vote! :plussoie


v1 = VDM.numero 1234
p v1.index
        # => "1234"
p v1.author
        # => "Muffin"

vlist = VDM.dernieres 10 #recupere les 15 dernieres VDM a la 10eme page
p vlist.collect{|v| v.cat}.uniq
        # => [:inclassable, :sexe, :travail, :sante, :amour, :argent]

Amusez-vous bien !

lundi 26 mai 2008

Imbriquer les templates ERB "à la :render chez rails"

Parfois on a envie de pouvoir profiter du templating ERB fourni dans Ruby pour se faire des bouts de codes, ou pour toutes autres raisons, toutefois, pour ceux que ça intéresse, je les laisse évaluer un template.run dans un autre template ERB pour voir le résultat. Pour s'en sortir, il va falloir utiliser les bindings Ruby. Il y a peut-être une autre façon de faire avec les obscurs "_erbout", mais il y a peu de documentation là dessus. Aussi, devant le défi et le travail sur les bindings, je me suis laissé tenté.

A noter que pour certains j'aurai l'impression de réinventer la roue, je ne suis pas allé vérifier dans la touffe de code de Rails s'ils utilisaient la même technique.

Tout d'abord, et car j'ai la flemme de faire un bel article avec toutes les étapes qui m'ont conduit à cette solution, il n'y aura qu'un gros bloc de code avec la classe et l'exemple (certains auront l'habitude). La classe est nommée Renderer et je n'ai défini que des méthodes de classe. On pourrait faire autrement avec des instances d'une classe, mais bon, ça ne me semble pas le point essentiel.

Le point essentiel est le binding dans Ruby. Un binding, c'est une référence au contexte d'éxecution d'un bout de code. Ainsi, passer un binding permet d'avoir accès à un contexte d'éxécution autre que le langage seul le permet. C'est ce qu'on passe à ERB pour qu'il sache à quoi correspond quel nom de variable, même si le fichier est évalué dans un objet différent.

Le but étant de passer dans un Hash le nom des variables de l'intérieur du template, et de les convertir en ce qui est pointé par la clé, on sent déjà venir le eval. Pour faire simple je veux pouvoir utiliser un sous-template dans mon template en faisant

<%= render(:template_1,{'x' => 42}) %>

Je vais donc itérer sur les élements du hash, la clé me servira de variable à déclarer, et la valeur sera justement la valeur pointée. Je dois en outre éviter de déclarer une variable qui écraserait, soit une méthode, soit une variable de mon algorithme de transformation lui même (ce serait la catastrophe). Pour rendre cette probabilité plus faible, j'ai donc utilisé des underscores, vu que je serai le seul à utiliser mon système de templates, je sais la convention qui est ne pas définir une variable "__trucmuche__" dans les paramètres.

L'élément binding me permet de pouvoir itérer à l'intérieur du hash, et de faire mes eval dans le bloc passé à each et en faisant survivre hors du bloc les valeurs créées par eval.

Après ces mises en garde, je dois ajouter que j'aurai pu faire des tests et générer une exception, mais pour laisser l'importance à l'algorithme, je ne l'ai pas fait. De même, j'ai effectué un appel à eval par paire clé/valeur, mais on aurait pu faire un seul appel en créant une chaîne plus longue (et limitant un peu plus les effets de bords des écrasements de variables)

Pour finir, l'évaluation d'un template ERB se fera avec le binding passé à eval. C'est à dire qu'en cas de valeur manquante, l'interpréteur ruby cherchera une méthode et lévera une erreur. Je définis donc method_missing afin d'éviter le carnage si d'aventure on veut pouvoir rendre optionnel une des variables du template.

Bon, j'espère ne pas vous avoir assommé. Voici le code, comme d'hab questionnez si vous le voulez. En tout cas je n'ai pas cherché à savoir ce que donnerait un template qui sortirai du code à son tour interprétable par ERB, pour générer un template de template de template de ... (je doute que ça marche "out of the box")

require 'erb'

class Renderer
    @@partials = {}

    def self.add_partial(name,str="")
        @@partials[name] = str
    end
  
    def self.render(__name__,__params__=nil)
        __b__ = binding
        __params__.each_key do |k|
            __str__ = %{#{k} = __params__['#{k}']}
            puts __str__ if $DEBUG
            eval  __str__ , __b__
        end
        ERB.new(@@partials[__name__]).result __b__
    end

    def self.method_missing(m,*args)
        puts "missing params or method: #{m}, nil-ed out" if $DEBUG
        nil
    end
end

#simple example
t1 = %q{
    str1 : <%= x %>
}

#calling another partial in a partial
t2 = %q{
str2:
<% values.each do |value| %>
    <%= render(:first,{'x' => value})%>
<% end %>
}

#now test missing functions
t3 = %q{
<%= str.class %>
<% unless params.nil? %>
    there are some params
<% end %>
}

Renderer.add_partial(:first , t1)
Renderer.add_partial(:second, t2)
Renderer.add_partial(:third , t3)

puts Renderer.render(:first , {'x'=>0})
puts Renderer.render(:second, {'values'=>(0 .. 10)})
puts Renderer.render(:third , {'str'=>Array.new})
puts Renderer.render(:third , {'str'=> "ok", 'params'=>Array.new})

samedi 24 mai 2008

Wmii moi itou

Bon, et bien, dans ma quête du tuning de distribution, j'ai essayé Wmii, les concepts de design correspondent mieux à ce dont j'ai besoin que les mamouths du window management, à savoir: des fenêtres qui prennent toute la place, quand elles en ont besoin seulement, pilotable au clavier et facilement scriptable.

Par exemple, pour voir combien de jus il reste dans la batterie, plutôt que de regarder l'uptime, j'utilise

echo -n $(cat /proc/acpi/battery/BAT1/state | grep remaining | sed 's/.*:\s*//') '|' $(date)

à l'intérieur de la fonction status() .

dimanche 18 mai 2008

Evaluation des arguments multiples et des blocs avec l'héritage en Ruby

Ça me servira à la fois de piqûre de rappel quand j'en aurais besoin, et ça peut aider à éclaircir les idées. On oubliera pas de ne pas oublier (oui oui, tout ça, j'insiste) que l'appel à super récupère lui-même le bloc. Ce peut être gênant si on a besoin de faire un yield dans la classe fille en même temps qu'on a besoin d'appeler super. Ceci rend plus difficile le changement de comportement d'une méthode qui detruit des informations quand on lui passe un bloc (par exemple l'ouverture/fermeture automatique des fichiers) : il faut faire son yield à l'intérieur d'un nouveau bloc, selon ce qui passe dans les paramètres du bloc ça peut être plus ou moins facile.

Au niveau des arguments multiples, on oubliera pas de ne pas oublier la différence entre *args et args. Il faut voir ça comme un pointeur sur un objet Array. Également, la classe d'un objet, même quand dans la méthode parente est celle de l'objet hérité, ça pourrait jouer des tours si on fait des tests avec == au lieu de is_a? (je n'ai pas mis dans le test, mais is_a? teste l'appartenance d'un objet à une classe et toutes les classes parentes.

Voici le code qui m'a servit pour tout mettre au clair :

class Test
    def initialize(*args,&block)
        puts args.size
        puts self.class
        yield self if block_given?
    end
end

class SubTest < Test
    def initialize(*args)
        super(*args)
        yield self if block_given?
    end
end

class SubSubTest < SubTest
    def initialize
        super(:un,:dos,:tres) {|l| puts "truc"}
        yield self if block_given?
    end
end

class SubSubSubTest < SubSubTest
    def initialize
        super() do |l|
                puts "sub-truc"
                yield self
        end
    end
end

Test.new(1,2) {|l| puts l.class}
SubTest.new {|l| puts l.class}
SubSubTest.new {|l| puts l.class}
SubSubSubTest.new {|l| puts l.class}

Et voici le résultat brut de décoffrage :

2
Test
Test
0
SubTest
SubTest
SubTest
3
SubSubTest
truc
truc
SubSubTest
3
SubSubSubTest
truc
truc
sub-truc
SubSubSubTest

On notera que le "puts self.class" dans la classe principale rajoute une occurence du texte, j'aurais pû mettre ici (ou équivalent plus bas dans la hierarchie) un "if self.class == Test" ou un "if self.is_a? Test" pour montrer la différence entre les deux.

Si vous avez des questions, questionnez, mais je ne promets rien pour les réponses.

vendredi 2 mai 2008

Kylie Minogue décorée par Albanel

Et oui, Lundi 5 Mai 2008, Kylie Minogue recevra l'insigne de "Chevalier dans l'ordre des Arts et des Lettres". Consécutivement à d'autres artistes émanants de l'industrie pure et dure (Bob Dylan, Meryl Streep et Uma Thurman). A quand Madonna ou Britney Spears pour leur passion des enfants? Bienvenue à la Cour.

http://news.bbc.co.uk/2/hi/entertainment/7380789.stm http://www.culture.gouv.fr/culture/actualites/index.htm

mardi 29 avril 2008

Conférence sur la Piraterie, à Bruxelles, avec des bouts de Olivennes dedans

Si des gens peuvent se rendre à Bruxelles, faîtes-vous invitez, et piratez de nombreux petits fours pour bibi s'il vous plaît. Toute une partie parlera du flicage de l'Internet (comprendre "industry cooperation") pour contrer les copies sauvages. Ce sera très certainement un exposé plus qu'une conférence apportant des choses intéressantes, car il y aura trois participants pour quarante-cinq minutes de parlotte. http://ec.europa.eu/internal_market/iprenforcement/index_fr.htm#conference

dimanche 27 avril 2008

Installer Slackware, le gros des étapes

A l'heure de "l'user friendly", il est toujours bon de revenir aux sources. Slackware, c'est une très belle distribution, elle laisse tout contrôle à l'utilisateur, et possède des concepts simples. Simples dans les concepts, mais pas forcément à la porté de tout le monde dans la réalisation.

L'installation (et configuration) Slackware est la suivante:

  • démarrage du CD
  • sélection de la langue de l'installation
  • partitionnement du disque
  • formatage des partitions, sélections des points de montages et de la partition swap
  • sélection et installation des packages
  • configurations supplémentaires (horloge, net, modem, environnement graphique, services auto-démarrés)
  • installation du boot-loader
  • mot de passe root
  • redémarrage (pas obligatoire si on fait un chroot, mais fortement conseillé)

A partir de là, l'utilisateur n'est plus guidé, à lui de se débrouiller, en ligne de commande. Coincé au runlevel 3, sans serveur graphique. Il devra:

  • ajouter un ou des utilisateurs/groupes
  • changer le /etc/inittab pour démarrer en mode graphique
  • configurer le serveur X avec xorgsetup (script pratique)
  • configurer le son avec alsaconf (script pratique)
  • lancer le serveur X ou redémarrer

Et voilà :) . Bien entendu, après on peut fignoler son kernel en le recompilant, il faut parfois rajouter un module pas chargé par défaut ou des firmwares, ainsi que du flash ou des drivers proprios si besoin.

Certes ce n'est pas évident, mais pour moi, ça reste un plaisir

dimanche 20 avril 2008

Ruby - RSS - Hpricot + data mining : all your base are belong to us !

C'est ce que je me suis écrié lorsque j'ai touché à Hpricot.

Somebody set up us the bomb

Si vous ne connaissez pas Hpricot, c'est le moment ou jamais d'apprendre à l'utiliser. Pour la petite introduction, Hpricot est une extension Ruby qui permet de facilement et avec des performances plus que correctes, d'extraire et modifier les données des pages web. Hpricot supporte en partie plus que suffisante le X-Path et le CSS-Path. Et, comme je l'ai déjà dit, et je le répète donc, c'est en Ruby, donc très naturel.

En outre, Hpricot sait plutôt bien se débrouiller avec des sites mal codés, et non respectueux des standards du web. Bref, Hpricot est l'outil idéal pour un explorateur du web sour Ruby.

We get the signal

Le premier intérêt d'Hpricot est de pouvoir extraire des données d'un site pour, par exemple, les afficher sur un autre. Une fois qu'on connais la structure du site, on peut donc lui tirer les bouts qui nous plaisent, par exemple, pour afficher tous les titres des fils de discussions d'un forum phpBB du site A, tous les titres de blogs du site B et d'en faire un mélange à sa sauce. Ça ne reste pas toujours très sympa d'extirper juste les données d'un site sans lui renvoyer de traffic, mais Hpricot ne fait pas que le mal. Il permet par exemple de facilement créer un robot d'exploration du web en suivant tous les liens d'une page. Il pourrait permettre d'effectuer simplement des remplacements de liens inutiles, de classes CSS etc. afin par exemple, de faciliter l'accès au web pour des personnes avec des handycap (j'imagine le cas où une liste de 30liens est présente avant que le contenu ne soit facilement ateignable).

Main screen turn on

Passons sur Hpricot, nous y reviendront. Reparlons de Ruby, et n'oublions pas que fourni de base se trouve le module RSS. Celui-ci, comme Hpricot, permet de simplement lire des flux RSS et de raisonner non pas en xml mais en beaux concepts haut-niveau. Comme un RSS contient généralement des liens vers des pages web, et que, réciproquement, les pages web contiennent souvent des liens vers des flux RSS, on peut sans trop d'effort dire que Hpricot et RSS permettent de glaner simplement des tas d'information.

It's you !!

Prenons un exemple pratique. Si nous voulons avoir accès rapidement aux dernieres machinations machiavéliques de nos députés. Le site de l'Assemblée Nationale propose un intéressant flux RSS : http://www.assemblee-nationale.fr/rss/rss.xml. On peut donc facilement le parser avec Ruby. Puis, ouvrir les liens avec Hpricot et en ayant au préalable remarqué que les contenus intéressants sont au chemin Xpath /html/body/div[i]//p avec i prenant une valeur qui varie selon les pages, et tout le reste dans des balises paragraphes (je ne ferai pas de commentaire sur la propreté d'un tel code).

How are you gentlemen!! All your base are belong to us. You are on the way to destruction.

On n'a plus qu'a analyser le contenu de ses pages, pour tenter de déterminer les sujets chauds, quels député oeuvre dans quels domaines, quel est le langage à la mode (je passerai sur et vous laisserai trouver ce qu'est la fléxicurité) chez les faiseurs de loi. Ça permettrai de savoir si nos députés ont des tendances sécuritaires paranoïaques, peut-être de déceler les sujets chauds. Mais pour ça, je pense que la quantité de données sur le RSS seulement risque d'être pas assez, il faudrait passer un coup d'Hpricot sur toutes les archives pour récupérer tous les anciens débats, ce pourrait être intéressant de voir comment les mots des lois évoluent.

You have no chance to survive make your time. Ha Ha Ha Ha

Il ne me reste plus qu'à trouver les bons modules restants, ou les coder si besoin pour mettre en place un outil de surveillance des faits-et-gestes de nos zélites. Sans forcément rendre une base de donnée publique, pour pas s'embêter trop avec la CNIL, faire que chacun puissse se faire la sienne.

For great justice !

Du coup, si vous voulez faire un truc de ce genre avec ouam, proposez vous, moi j'ai déjà Take off my Zig.

lundi 28 janvier 2008

Kerviel, bouc émissaire et présomption d'innocence

Une petite poésie amusant qui m'as été inspirée par l'actualité. Comme vous le remarquerez, on ne risque pas la page blanche en parlant des petites affaires et des divers maux de la société.

Kerviel, bouc émissaire,

Tes méfaits ne datent pas d'hier,

La marée noire de l'Erika,

Les attentats d'Al Qaida,

L'affaire du Sentier,

L'amiante dans nos cheminés,

L'explosion de Tchernobyl,

Pour celles-ci t'as été plus habile.

Mais on t'a démasqué,

Les témoins subordonnés,

La corruption de Carignon,

Et si tu veux, passons,

Sur le sang contaminé.

On a enfin élucidé,

Tant de suicides étranges,

Et le fournisseur d'agent orange.

Les abus de bien sociaux,

Le meurte de Litvinenko,

La grippe aviaire,

Le financement du RPR,

La Saint Barthélémy,

On y pense aussi.

Même en asséchant la mer Morte,

Tes mouillé bien plus haut que tes bottes.

Le crash boursier,

Les marchés truqués,

Les émeutes de banlieues,

Même pas besoin d'aveux.

Si tu te sens d'attaques,

Tu m'expliquera pour les ADM d'Irak,

Les emplois fictifs à Paris,

Et le non lieu de Tiberi,

L'affaire EADS,

Et les rayures sur ma caisse.

Tout ça on sait que c'est toi !

S'il en manque, n'hésitez pas à rallonger la liste, je suis sûr qu'on arrivera à lui faire avouer.

Vous remarquerez que vous avez été berné sur le titre, je parlais de présomption d'innocence mais je ne m'y intéresse pas. C'est tout à fait normal : j'ai suivi le mouvement.

Copyright 2008 © FrihD(Lucas Di Cioccio) Copyleft, cette oeuvre est libre, vous pouvez la modifier et la redistribuer selon les termes de la licence art-libre : http://artlibre.org/ .

samedi 1 décembre 2007

Que nous dit le port série de la GP2-X ?

Et bien, on a quelques traces de démarrage tout de même. Si ça peut vous intéresser. Je ne connais pas encore u-boot, mais il nous indique déjà vaguement où il va chercher à booter.

U-Boot 1.0.0 (Sep 10 2007 - 21:07:23)

U-Boot code: 03E00000 -> 03E49FA4 BSS: -> 03E82B70 IRQ Stack: 03ea3b6c FIQ Stack: 03ea4b6c DRAM Configuration: Bank #0: 00100000 63 MB Flash: 0 kB NAND:Probing at 0x9c000000 Flash chip found: Manufacturer ID: 0xEC, Chip ID: 0x76 (Samsung K9F1208 64Mb) 1 flash chips found. Total nand_chip size: 64 MB Get Environment from NAND offset 0x70000 ... *** Warning - bad CRC, using default environment

In: serial Out: serial Err: serial

NAND read: device 0 offset 0x1a0000, size 0x40000 ... 262144 bytes read: OK

NAND read: device 0 offset 0x80000, size 0xb0000 ... 720896 bytes read: OK ### main_loop: bootcmd="bootm" Hit any key to stop autoboot: 0 ## Booting image at 01000000 ... Image Name: GP2X Linux Kernel Created: 2007-10-08 9:22:48 UTC Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 673304 Bytes = 657.5 kB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK Uncompressing Kernel Image ... OK

Starting kernel ...

MMC/SD Card Detected wait SD CARD 2.0 Not 2.0(ONLY 1.0) Partition check: mmcsda: p1 Register SD: 1902MsB mount...1 mount...2: INIT: version 2.84 booting <7>**>>ecc error unfixed on chunk 3268:0 Started device management daemon v1.3.25 for /dev <7>**>>ecc error unfixed on chunk 3844:0 MSDOS FS: IO charset utf8 Touch driver open Touch calibration Apply LCD Timing ****nStatus : 1

read pointercal value write pointercal value

Après cela, un CTRL+C tue l'application (sinon on peut controler sa GP2X depuis le clavier). Et on obtient un shell en root, visiblement c'est prévu qu'on la connecte à internet, il y a des trucs comme dnsdomainname.

Enfin, la commande qu'on fait quand on arrive sur un tout nouveau système (non ce n'est pas ls):

[root@gp2x /]$uname -a Linux gp2x 2.4.25 #4374 Mon, 08 Oct 2007 18:22:37 +0900 armv4l unknown

Et puis, pour savoir ce qui tourne, un "ps aux".

PID Uid VmSize Stat Command 1 root 1348 S init [3] 2 root S [keventd] 3 root S [ksoftirqd_CPU0] 4 root S [kswapd] 5 root S [bdflush] 6 root S [kupdated] 7 root S [mtdblockd] 13 root 1404 S devfsd /dev 49 root 2068 S -sh 89 root 2556 R ps aux

On restera coi devant le numéro de révision et le numéro de série de mon processeur. (normalement il y en a deux, mais je ne connais pas assez le kernel linux et l'architecture choisie par les constructeurs pour

[root@gp2x /]$cat /proc/cpuinfo Processor : Arm920Tid(wb) rev 0 (v4l) BogoMIPS : 99.32 Features : swp half thumb

Hardware : MagicEye-MDK Revision : 0000 Serial : 0000000000000000

Et puis voilà le mapping mémoire.

[root@gp2x /]$cat /proc/iomem 00000000-01ffffff : System RAM 0004f000-0016fee7 : Kernel code 0016fee8-001b9bf7 : Kernel data

Désolé pour l'horrible formatage des sorties de commandes.

dimanche 30 septembre 2007

Premier billet

Bienvenue sur mon nouveau blog. Il fait suite à une série de tentatives plus ou moins réussies. Celui-là, je pense, sera le bon. J'ai changé d'hébergeur pour quelque chose qui me convient bien. Pas de pub pour me prendre la tête, pas besoin de faire partie d'une pseudo communauté, juste du contenu.