vendredi 31 décembre 2010

activeRecord sans Rails et métaprogrammation

Dans un post précédant, je détaillais le chargement d'une base NoSQL à partir d'une base de données relationnelle en mentionnant l'usage d'Active record sans Rails.
ActiveRecord et maintenant ActiveRelation sont des ORM qui s'utilisent indépendamment des autres composants de Rails.
Il suffit pour cela d'instancier un objet Base en lui fournissant les éléments de connexion à la base de données.


(clic pour agrandir)




J'utilise par la suite ActiveRecord en métaprogrammation :

def _create_class(tclass)

uftclass = "Tempo_" + tclass

eval "

class #{uftclass} < ActiveRecord::Base

set_table_name \"#{tclass}\"

end

"

fields= eval "#{uftclass}.column_names"



end



Ainsi je crée des classes à la volée qui héritent d'Activerecord. Cette opération dynamique se fait par une clause 'eval'.

L'instanciation se fait plus loin dans le code par là aussi un éval:


(clic pour agrandir)

Les photos trop bavardes


Une photo sur Internet ou qui circule de portable en portable c'est tout d'abord une image (ce que nous voyons) mais aussi des informations cachées. Ces informations sont stockées dans le fichier de la photo, mais ne sont pas interprétées comme de l'information visuelle par l'afficheur.
On appelle ca des méta-données (de la données sur la donnée). Ces métadonnées servent généralement à conserver avec l'image certaines informations liées à cette image. Par exemple :
La date de prise de vue , l'heure, l'appareil numérique ou encore l'ouverture de l'objectif. Il existe un standard pour ces informations le EXIF.

Le danger actuel vient de l'utilisation d'un smartphone comme appareil photo. Pourquoi ? .
Simplement un smartphone est doté d'un GPS et il accès à plein d'information sur vous.
La fonction GPS permet de géolocaliser la photographie: à 10 metres près il est possible de savoir où a été prise la photo. Le smartphone a accès à la carte sim et à des informations générales. Il très possible que la photo contienne le numéro de série de l'appareil et pourquoi pas le numéro du téléphone. Aussi, il faut respecter quelques précautions, la première étant de ne jamais utiliser des applications modifiées (tierces) pour prendre des photos. Tester aussi le contenu de vos photo avec un plugin firefox https://addons.mozilla.org/fr/firefox/addon/3905/.

Un clic droit sur l'image ouvrira une fenêtre d'information :




Dessous un exemple tiré d'un fait réel.
............
The original photo the woman uploaded was taken on an Apple iPhone 3GS and it encoded a series of EXIF data (extended data such as the date and time), as well as her GPS (global positioning system) co-ordinates.

Extracting the exact latitude and longitude of her location took around three minutes so, by 3:50 the 4chan community, feeling robbed of a free peep show had used Google Maps to convert the GPS data to photos of her house from Google Street View, which provided her address in a charming sea side town in Britain.

Using public computer databases they determined which school she attended and began searching Facebook to find a photo which matched the original. With ~350 students in the school, ~175 female it took less than 5 minutes to visually identify her from the photos.

By 4:00 pm, they’d order hundreds of pizzas to her home.

By 4:05, they’d called her mom.

By 4:15, they’d emailed photo edits of her to an email account purported to be used by her father at work.

By 4:30, they’d gotten bored and moved onto another thread and another person.

..........

jeudi 30 décembre 2010

2010 année du NoSQL


Dans cette présentation , Kevin Weil responsable du secteur analyse des données chez twitter (lien ici ) détaille comment l'architecture de twitter a évolué pour faire face à l'accroissement des volumes.

Le conférencier use d'un argument massue : Le volume quotidien de donnée sur twitter est de 12 TB. Sachant qu'un disque ne peut traiter que 80 MB/s , il faudrait 41 Heures pour traiter les données d'un journée.
Conclusion : il a été nécessaire de paralléliser les traitements et le stockage des données.
Aussi twitter utilise l'infrastructure distribuée HADOOP d'Apache avec tous les produits dérivés dont le langage 'PIG'.
PIG permet de réduire considérablement la quantité de code à écrire et le temps d'exécution

Ce qui est nouveau dans la démarche , c'est l'hétérogénéité des solutions employées.
Une entreprise cherche normalement à réduire au maximum le nombre de composant de son SI (un seul type de base données, un seul framework etc) . Twitter ou facebook utilisent une kyrielle de produits souvent concurrents (Ruby on Rails , scala , cassandra, HBase, FLockDB).
Alors pourquoi ces choix ? Et comment les assumer au sein de l'entreprise ?.

mercredi 29 décembre 2010

Cadeaux de Noel : pourquoi m'as tu offert ca ?

C'est parfois la question que l'on se pose. Il existe un site où vous pouvez poster la photo de l'objet et son contexte: lien ici : http://whydidyoubuymethat.com/

Mon podium est le suivant :
1) La photo de david Hasselhoff



2) La boite de mouchoir décorée


3) Le coussin



Pour ma part, j'ai recu un superbe cadeau cette année: un livre sur 'la route 66' et ca, c'était une sacrée bonne idée.



Lien ici: http://www.lerepairedesmotards.com/actualites/2010/actu_101029-route-66-livre-route-mythique.php

mardi 28 décembre 2010

idée cadeau: des armes en lego


Voici une idée de cadeau : un livre qui détaille la construction de 5 armes en Lego.
Chaque modèle fonctionne vraiment et grace à des élastiques, vous pouvez VRAIMENT tirer des projectiles de briques Lego ou des élastiques.

Une bonne alternative au paint-ball

Lien ici : http://www.nostarch.com/legoguns.htm

mardi 14 décembre 2010

Justin Bieber est il un geek ? Test du rubik's cube

Justin Bieber est un jeune chanteur canadien qui provoque chez les jeunes une forte hystérie.

Justin Bieber et lady GAGA sont les deux icônes 'hype' du moment. (ici le lien vers wikipédia)
Conscient du caractère irréductible de la domination du monde par les geeks, Justin Bieber s'est dévoilé: c'est un geek. Aussi, ce jeune homme a lancer deux signaux forts:

1) Il est capable de résoudre un rubik's cube dans des très bons délais.
Ici on peut voir la vidéo :


2) Il s'est vengé d'une personne qui avait tenté de pirater le compte twitter d'un de ses potes.
Justin Bieber demandé à ses fans sur twitter de lui envoyer des SMS.
Il a simplement donner le numéro de portable du pirate à la place du sien.

Résultat : le portable a été bombardé. (Justin Bieber est à la tête d'une armée de 4,4 millions de followers)

Respect pour le gamin.

En revanche , cela déclenche une série d'interrogation. Il ne rentre pas dans le cadre normal de la définition des geeks.




Plusieurs hypothèses:
1) C'est un cyborg
2) C'est un mutant
3) C'est un alien

Il est peut être issu d'un croisement entre un geek profond et un top model ? C'est un hybride.

Le papa:



La maman

dimanche 5 décembre 2010

django, rail3 comment démarrer



On va s'amuser avec les deux frameworks champions: django / python d'un coté et Rails3 / Ruby de l'autre.

Installation de django.

Avec django, il est est plus prudent d'utiliser la dernière version du logiciel. django se présente sous la forme d'une archive standard. Il s'installe en tapant dans le répertoire de l'archive:
python ./setup.py install

Installation de Rails3


L'utilisation de rvm est hautement recommandée.
La commande classique d'installation d'un gem:
rvm gem install rails
(j'ai utilisé la version 1.9.2 de Ruby sous rvm)
L'avantage de Rails est qu'il utilise le gem 'bundler' . Au démarrage d'une application, le fichier Gemfile listant les dépendances est lu et les gems manquants sont installés.



Création d'une application avec django

Django manipule la notion de projet et d'application. Un projet regroupe plusieurs applications.

La création du projet se fait par la commande :

/usr/local/bin/django-admin.py startproject djgolfare


Cette commande crée un répertoire au nom du projet. Ce répertoire contient un programme manage.py qui permet d'ajouter des applications par:

python ./manage.py startapp tableboard

L'arborescence sera de la forme :




Création d'une application avec Rails3

La commande à passer est :
rails new r3golfare

Une série de fichier et de répertoire est générée:



Configuration de la base de donnée pour django

Toute la configuration est contenue dans le fichier settings.py. C'est donc de la syntaxe python.


12 DATABASES = {
13 'default': {
14 'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
15 'NAME': '/usr/local/djgolfare/essai', # Or path to database file if using sqlite3.
16 'USER': '', # Not used with sqlite3.
17 'PASSWORD': '', # Not used with sqlite3.
18 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
19 'PORT': '', # Set to empty string for default. Not used with sqlite3.
20 }
21 }
22

Configuration de la base de donnée pour Rails


Un fichier database.yml se trouve dans le répertoire 'config'
Rails utilise le format YAML pour ces fichiers de configuration


 1 # SQLite version 3.x
2 # gem install sqlite3-ruby (not necessary on OS X Leopard)
3 development:
4 adapter: sqlite3
5 database: db/development.sqlite3
6 pool: 5
7 timeout: 5000
8
9 # Warning: The database defined as "test" will be erased and
10 # re-generated from your development database when you run "rake".
11 # Do not set this db to the same as development or production.
12 test:
13 adapter: sqlite3
14 database: db/test.sqlite3
15 pool: 5
16 timeout: 5000
17
18 production:
19 adapter: sqlite3
20 database: db/production.sqlite3
21 pool: 5
22 timeout: 5000


La base est déclinée en trois instance, une pour chaque environnement.


Le détail du répertoire config est ici :



Lancement de l'application django

 1 >python ./manage.py syncdb
2 No fixtures found.
3 >python ./manage.py runserver
4 Validating models...
5 0 errors found
6
7 Django version 1.2.3, using settings 'djgolfare.settings'
8 Development server is running at http://127.0.0.1:8000/
9 Quit the server with CONTROL-C.
10


Lancement d'un application Rails3


32 root@eric-1001PX:/usr/local/r3golfare# rails s
33 => Booting WEBrick
34 => Rails 3.0.3 application starting in development on http://0.0.0.0:3000
35 => Call with -d to detach
36 => Ctrl-C to shutdown server
37 [2010-12-04 17:21:17] INFO WEBrick 1.3.1
38 [2010-12-04 17:21:17] INFO ruby 1.8.7 (2010-08-16) [i686-linux]
39 [2010-12-04 17:21:22] INFO WEBrick::HTTPServer#start: pid=2639 port=3000
40

Dans un autre post, je détaillerai la mise en place d'un patron CRUD dans ces deux frameworks.