vendredi 2 mars 2012

#Ruby sur #android avec ruboto


Réaliser une simplement application pour android 

Remarque préalable.
Les smartphones sont divisés en deux familles les iphones sur IOS et les android.
La technologie à privilégier sur Iphone pour réaliser une application est objective-C.

Sur ANDROID , c'est le langage JAVA qui est utilisé. La pile java sur Android est différente de celle de votre PC. Sur un PC le schéma classique est le suivant: 
Confection d'un source java 
Compilation par le programme javac afin d'obtenir un fichier  de type pseudobyte  (.class) qui sera interprété par une JVM.

Sur ANDROID, le pseudobyte est à son tour compilé pour obtenir un fichier 'dex' interprété non pas par la JVM mais par un dispositif semblable : dalvik
conclusion intermédiaire: une application en  objective-c sera plus performante que son équivalant sur ANDROID. Son code est compilé, directement exécutable.
Source: 
http://www.technomicon.com/ElectroPolitics/ElectroPolitics-11-15-10.html

Installation sur le PC.
Pour ANDROID, le développement se fait sur un PC doté d'un kit de développement complété le plus souvent d'un émulateur de smartphone. Cet émulateur permet de tester très simplement et en toute sécurité vos applications sans avoir recours à un vrai smartphone.
L'outil privilégié pour réaliser tout ça est le plus souvent l'IDE éclipse avec les extensions pour ANDROID.

Il existe une solution alternative avec Ruby et RUBOTO. A l'origine tout commence par jruby, ce projet permet d'écrire des programmes en Ruby qui seront exécutés sur une JVM.  A partir d'un source Ruby, Jruby génère le bytecode qui sera interprété par la JVM. Le projet RUBOTO fourni plusieurs fonctionnalités: 
a) Génération de squelette d'application pour ANDROID
b) Outils pour créer un fichier directement en pseudo-code dex. Jruby intervient  pour la partie amont de traduction du source Ruby en pseudo-code java.  
c) Les librairies à installer sur le système ANDROID pour faire fonctionner les applications RUBOTO.

Le guide de démarrage du site RUBOTO donne la marche à suivre pour obtenir votre première application.
Les principales étapes sont les suivantes:

Les prérequis:
  • installation du
  • installation de jruby
  • SDK ANDROID
  • installation d'un émulateur ANDROID.
L'installation de jruby peut se faire avec l'utilitaire rvm (Ruby Virtual Machine). Pour le reste suivre la documentation du site RUBOTO. Tout fonctionne parfaitement sous Ubuntu
Sur votre ANDROID.

Il faudra récuperer le 'ruboto core' : c'est l'ensemble des librairies utilisées pour faire tourner vos application. L'installation se fait par l'android market. (copie d'écran) 

Un autre utilitaire sera necessaire pour faire passer votre application de votre PC à votre téléphone. J'ai utilisé l'application 'Apk Installer'  toujours par l'android market 

 Après avoir relié le smartphone au PC par le cable USB, il suffira de déposer le programme-archive (.apk)  dans l'arborescence de la SD.  L "APk installer" sera alors capable d'installer l'application comme si elle était issue de l'android market.

Un projet RUBOTO propose des dossiers pour ranger les ressources de l'application (icones).





L'application est ici: 


Elle ressemble à ceci:
L'émulateur  donne cet écran:


La doc  de Ruboto détaille comment accéder aux informations du GPS ou du wifi.

En conclusion:

Dans le cas présent on est dans le domaine des applications de type 'client lourd'.
Réaliser une application de type client léger serait encore plus simple (et plus portable)  mais il manquerait l'accès aux ressources locales (GPS, wifi etc) . L'annonce du portage de chrome sur Android est très importante. Car chrome vient avec son moteur javascript 'V8'.  L'objectif d'avoir un serveur web local léger comme node.js se rapproche.


mercredi 29 février 2012

La méthode DESC : savoir dire NON

Les formateurs en management utilisent les mêmes méthodes que l'armée : des sigles mnémotechniques.

La méthode - sigle :  DESC permet d'avoir une attitude cohérente face à un conflit.
- D : Décrire la situation : les faits
- E :  Exprimer ses sentiments (utiliser 'je' et non pas 'tu' )
- S : Suggérer une solution
- C : Conclure en mettant en place une solution

Cette méthode a été théorisée par Sharon A. et Gordon H. Bower :livre sur amazon : ASSERTING yourself.
Plus de détail ici.



lundi 27 février 2012

Les bistrots et les étudiants en deuil #flipper

L'inventeur du flipper moderne  Steve Kordek est mort. R.I.P.



Dessous une copie d'écran de Cobra pinball sur amstrad.
Il était possible de dessiner ses propres tables de flipper




jeudi 23 février 2012

Les 4 livres essentiels pour aller au bout de #ruby

1 ) Le livre de base :
Programming Ruby: The Pragmatic Programmers' Guide, Second Edition


La première édition est disponible gratuitement sur ce site ou encore sur celui-ci.

 2) The Ruby Programming Language.
 Livre vendu ici.

3) Eloquent Ruby :
Eloquent Ruby (Addison-Wesley Professional Ruby Series) 


C'est à mon opinion le meilleur livre sur Ruby et sa philosophie. A lire et à relire.
Comment créer un DSL interne ou externe.

4) Metaprogramming Ruby
Enfin, cet ouvrage pour vraiment aller au coeur de Ruby. A n'ouvrir qu'après un moment de pratique du langage.


dimanche 19 février 2012

3 conseils de survie pour la programmation asynchrone


Basculer vers le coté obscur de la programmation asynchrone avec node.js  n'est pas sans danger.
Voici trois conseils de jeidi ou de ninja.

Conseil 1: Asynchrone tu penseras
 En asynchrone l'enchaînement des opérations n'est pas linéaire. Pour dérouler les opérations A,B,C dans cet ordre vous aurez le choix entre 2 techniques:
1) L'imbrication des callback .
La dernière instruction de la fonction A appellera la fonction B , la fonction B à son tour appellera C dans sa dernière instruction.

Cette méthode a deux limites. 
a) Il faut s'assurer que la fonction A utilise des composants synchrones afin d'éviter que la fonction B démarre avant la réponse de la fonction A.
b) L'imbrication des fonctions au delà de 3 niveaux rend le code difficile à lire.

2) la gestion des enchaînements par événement.
La fonction B démarrera à la réception d'un événement déclenché par la fonction A.
Cette  approche est peut être moins performante mais permet de rendre le code plus lisible en évitant l'imbrication des fonctions.

Conseil 2: Synchrone  tu anticiperas
Une fonction asynchrone bien écrite se comportera toujours de manière asynchrone. Ce n'est pas forcement le cas de toutes les librairies.  Une fonction asynchrone peut  réagir comme une fonction synchrone dans certaines circonstances comme par exemple :
Utilisation d'un cache
Erreur de connexion
Prenons l'exemple d'une requete sur une base de données: normalement il est sensé s'ecouler un certain nombre de cycle avant d'obtenir la réponse. Ces cycle correspondant à une tour de la boucle de traitement est appelé 'tick'. Si la fonction de requete à mis en cache la réponse, elle pourra réponde dans le même cycle comme une fonction synchrone. Aussi , il est recommandé de placer au plus tôt et au plus près   les 'listeners' . Dans le même ordre d'idée, on évitera les appels chainés de méthode.  On peut se trouver dans le cas  d'appels de méthode sur des objets non encore instanciés.
exemple :
var client = net.connect(8124, function() {
    console
.log('client connected');
    client
.write('world!\r\n');
});
(code tiré de :Understanding process.nextTick()  )
Ici la l'objet client utilisé dans le callback peut ne pas etre crée si la connexion est  immédiate (meme tick).
 Une API  asynchrone bien écrite peut éviter un comportement synchrone en utilisant la fonction nextTick().  Cette fonction déporte l'exécution d'une fonction au prochain cycle.
Exemple dans socket.js :


    // Handle errors from any source (HTTP client, stream, etc)
    var errorListener = function(e) {
        process.nextTick(function() {
            self.emit('wserror', e);

Le développeur reporte l'émission du signal d'erreur au cycvle suivant afin de laisser au programme appelant le temps d'installer les listeners.

ici d'autres exemples pour jouer avec l'instruction nextTick. Il est à noter que  l'instruction setTimeout avec une durée de 0 a le même effet.


Conseil 3: comprendre le fonctionnement de variables.
En javascript  c'est  au moment ou la variable est sollicitée que le contenu est fixé. Au déclenchement  d'un callback , il utilisera la valeur actuelle des variables. C'est pour ca qu'on trouve souvent des installation de callback sur le schéma suivant: appel immédiat à une fonction avec une variable  , cette fonction installera le callback avec la variable passée en paramètre

for(var i = 0; i < 5; i++) {
 (function(i) {
  setTimeout(function() {console.log('st2:'+i)}, 0);
 })(i);
}
Resulting in 0, 1, 2, 3, 4.

lundi 30 janvier 2012

Votre age selon #google

En allant sur cette page google : https://www.google.com/settings/ads/onweb/ ,  google affichera vos centres d'interet, votre sexe et votre age. Il déduit ces informations en fonction de vos recherches et de votre navigation.

Résultat :Google ne se trompe jamais.


jeudi 26 janvier 2012

Etes vous pret pour le futur du web : #SPDY ou #websocket ?

Les concepteurs du web étaient loin d'imaginer qu'un simple système de partage de document allait devenir le support des applications métiers.

Le protocole HTTP sur TCP est arrivé en bout de course, il fallait trouver quelque de plus rapide.
Il existe deux techniques : les websockets et le protocole SPDY mis en avant par google.





Le protocole SPDY propose de multiplexer les requetes sur la même connexion TCP, de compresser les entetes , le tout sur le protocole sécurisé SSL.
Autre point important : l'initiative des  requetes est bi-directionnelle: Le serveur peut avertir le client qu'il va lui envoyer des informations sur un canal.

Le site suivant : https://spdy-twitlog.indutny.com/  permet de tester la compatibilité de votre navigateur à ces nouvelles technologies. Il est écrit en javaScript et tourne sur Node.js.


Avec un navigateur compatible :


Avec un navigateur non compatible: