Affichage des articles dont le libellé est programmation. Afficher tous les articles
Affichage des articles dont le libellé est programmation. Afficher tous les articles

dimanche 10 mars 2013

lazy evaluation avec ruby 2.0

Dans les nouveautés de Ruby 2.0 , une se distingue des autres : la lazy evaluation.
Cette fonctionnalité rapproche de plus en plus ruby du domaine des langages fonctionnels.

La présentation est disponible sur slideshare :



Le code des exemples est le suivant:
La programmation fonctionnelle  favorise l'usage des générateurs ou des suites pour résoudre un certain type de probleme  (List comprehension - map/reduce) .

Avec le mode lazy , ruby est capable de retarder l'évaluation d'expression et mieux encore de le faire à la demande.

Le principal cas d'usage reste l'utilisation des streams (flux) appliquée à des besoins de diffusions de video ou de fichier sous la forme de chunk (tronçons). Ainsi Node.js dispose d'une api permettant de brancher des flux entres eux un peu à la façon de la commande 'pipe' sous unix.






vendredi 8 juin 2012

Index TIOBE :Java perd sa place de langage numéro 1 après 10 ans

L'index TIOBE est un baromètre des popularités des langages de programmation. Le classement  du mois de mai marquait un évènement : après 10 ans de règne sans partage, Java a cédé sa place au bon vieux langage 'C'.
Une page qui se tourne.


vendredi 1 juin 2012

blockly : un langage de programmation visuel

Blockly un outil Web, de  langage de programmation en mode graphique. Le développeur assemble les blocs comme des pièces de puzzle pour construire une application. Aucune saisie n'est  nécessaire.

Le site propose des démonstrations comme cette petite application où il faut déplacer un robot entre deux coins.




Il est possible de construire de véritables petits programmes qui seront traduit en javascript ou en python. (ici un programme qui ajoute 6 à 10 puis calcule la racine carré du résultat . Sa traduction en javascript est affichée)  )



C'est une nouvelle approche de l'algorithmie et elle n'est pas seulement destinée aux enfants.



lundi 5 mars 2012

Programmez - mars 2012 (150) #coffeescript #jQuery

Dans le dernier numéro de Programmez : (numéro 150) .


Le titre du dossier est prometteur et  bonne nouvelle : il tient ses promesses.

Au sommaire:

  • Un très bon article sur coffeescript : ce langage permet aux développeurs 'coté serveur' de programmer en javascript comme des développeurs 'coté client'. L'article prend un exemple en java et le porte en coffeescript.
  • Une introduction au langage 'R' . R est le langage de programmation des statistiques.
  • Une guide pour bien démarrer avec jQuery.
  • Hadoop et du javascript .. 

jeudi 23 juin 2011

Embellir son code #javascript

J'ai déposé sur lemon-labs 2 versions du programmes 'beautify' en javascript. Le programme d'origine n'est de moi mais de Einar Lielmanis disponible sur : http://jsbeautifier.org/.
J'ai modifier son programme pour qu'il se lance en ligne de commande avec le framework 'rhino' .
Cette plateforme permet de l'utiliser sur windows ou  Linux.

Rhino se télécharge depuis le site http://www.mozilla.org/rhino/

Rhino est une librairie Java (jar) , aussi son installation et son utilisation sont simples.

 Le programme javascript à lancer est beautifier.js en spécifiant le fichier javascript à embellir.   La sortie se fait sur le terminal. Le signe '>' redirige la sortie vers un fichier.


J'ai transformé le programme pour obtenir une version pour node.js.
(voir depot sur lemon-labs).
Le lancement du programme par node.js se fait par :
node beautifyNode.js    /onglet108.js

Node.js est à réserver pour un usage sous Linux.

samedi 29 janvier 2011

Cucumber, RSPEC :Comment une rondelle de concombre peut changer votre vie



Si Ruby on rails connait un succès croissant, c'est grace notamment à sa capacité à s'intégrer dans des démarches agiles de gestion de projet. Je connaissais pour la pratiquer (à ma façon) la méthode TDD : conduite du développement par les tests. Dans cette technique le développement du produit commence par la réalisation de tests (unitaires,d'intégration et fonctionnels) avant toutes choses. Le cadriciel Rails intègre nativement tout ce que vous avez besoin pour couvrir ces trois volets de test. Rails propose en plus l'utilisation des fixtures (garnitures) pour remplir ou manipuler les données de tests. le TDD propose des objets 'fictifs' mock ou stub afin de retarder le développement en 'dur' des objets.

J'ai souvent entendu parlé de RSPEC , un environnement de test offrant des techniques de développement basées sur le comportement de l'utilisateur (des histoires) : Behaviour DD (BDD).
La lecture de ce livre m'a ouvert des nouveaux horizons



Un fichier RSPEC (Ruby spécification) va décrire des évènements , des actions ou des états et comment le système doit réagir vis à vis de ces situations. RSPEC utilise un DSL (langage spécifique à un domaine) orienté développeur. Les RSPEC seront traduits en assertions de test.

 2 describe Game do
3 describe "#start" do
4 it "sends a welcome message" do
5 output = double('output')
6 game = Game.new(output)
7
8 output.should_receive(:puts).with('Welcome to Codebreaker!')
9
10 game.start
11 end
12
13 it "prompts for the first guess"
14 end


Ce livre consacre plusieurs chapitres à un projet appelé : cucumber (concombre). Cucumber est le projet qui réalise le rêve de tous les développeurs: il traduit les spécifications de votre client(sponsor-moa etc) en test de comportement (RSPEC :la synthèse des 3 types de test) .

Ici le DSL est orienté client (MOA). Le client va décrire avec ses mots des situations. Exemple:


Feature: code-breaker starts game

As a code-breaker
I want to start a game
So that I can break the code

Scenario: start game
Given I am not yet playing
When I start a new game
Then I should see "Welcome to Codebreaker!"
And I should see "Enter guess:"
Cucumber va traduire les termes :'given', 'when' 'then' en scénario de test de type RSPEC.
Ce DSL existe en version française.

(ressource: http://blog.octo.com/cucumber-pour-les-railers/)



Pour terminer, il convient de signaler que cucumber fonctionne avec watir et selenium qui sont deux outils complémentaires de test fonctionnel


(synthèse des composants: cliquer pour agrandir)



Il est plaisant de voir ces outils envahir le monde Java. C'est par ce moyen que Ruby
penetre dans les entreprises.

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)

samedi 9 octobre 2010

Après java ? Lava !


Alors que java devrait normalement s'intégrer dans les nuages (cloud) , c'est l'inverse qui se passe : des nuages sombres penetrent dans les cieux de Java.

La grand messe JavaOne qui est d'habitude l'occasion d'annoncer des nouvelles promesses technologies et des nouveaux Everest à gravir, etait placée sous le signe de la morosité cette année. RCLE a un peu foiré sur cet évènement. A tel point que les accros de java se posent des questions. Avec comme illustration le post suivant :
Is it time to fork Java? (il est temps de créer une nouvelle branche java)

L'auteur propose un nom 'lava' (la lave). Il a assité à la javaOne et il reparti avec le sentiment que dans un avenir porche , RCLE va faire en sorte d'avoir un JDK basique gratuit mais limité , et un JAVA/JDK optimisé destiné aux entreprises ou aux fabriquants de mobile. Cette version serait payante. Les menaces de développement d'un JDK et d'un java entièrement libre de droit , portés par une fondation (comme mozilla) sont les moyens les plus surs d'infléchir la tendance.

Toute cette agitation a fait dire à un des créateurs de java (James Gosling ) :The shit finally hits the fan.... (la merde a atteint le ventilateur) lire ici. Avec en prime des motifs pour des t-shirts


Le débat se poursuit sur des groupes de discussion google... http://groups.google.com/group/javaposse/browse_thread/thread/21b313a55ca4511e#
et sur http://sacha.labourey.com/2010/10/04/time-to-fork-java-si-vis-pacem-para-bellum/ (Si tu veux la paix prépare la guerre)

mardi 27 avril 2010

PHP : classes et objets

J'ai jeté un coup d'œil sur la manière dont PHP implémente les objets.
La syntaxe ressemble globalement au JAVA. Un objet est une référence vers une construction qui se rapproche d'un tableau associatif.

Voici un exemple de manipulation




<?php
abstract class Mamifere {
// nom
var $nom;
function __construct($nickname) {

$this->nom= $nickname ;

}

function parle () { }
}

class Chien extends Mamifere {
function parle () {
echo "ouaf ouaf\n";
}
}
$a= new Chien ("fido");
print_r( $a);
var_dump($a);
echo get_class($a)."\n";
echo get_parent_class($a)."\n";
$method= "parle";
call_user_func(array ($a,$method));
$b= get_class_methods($a);
var_dump($b);
?>



La manipulation d'un attribut d'instance à l'intérieur d'une classe est un peu lourde ($this->attribut) .

Des fonctions comme :
get_class , get_parent_class, get_class_methods permettent d'obtenir des informations sur les objets.

La fonction call_user_func peut etre utilisée pour envoyer un message à un objet afin qu'il exécute une méthode. C'est une des façons de réaliser de la métaprogrammation en PHP.



La sortie du programme donne :


php ./essaiclasse.php
Chien Object
(
[nom] => fido
)
object(Chien)#1 (1) {
["nom"]=>
string(4) "fido"
}
Chien
Mamifere
ouaf ouaf
array(2) {
[0]=>
string(5) "parle"
[1]=>
string(11) "__construct"
}



J'ai installé PHP 'client' pour faire tourner mon programme sous forme de script et non pas de CGI afin de m'affranchir de la couche du serveur Apache.

vendredi 23 avril 2010

Métaprogrammation et introspection en JAVA

La métaprogrammation au sein d'un langage pseudo-compilé ou comilié est très difficile et surtout d'une utilité limitée. En revanche l'introspection est un moyen pour approfondir ses connaissances d'un langage.

En java la classe : java.lang.reflect permet d'obtenir des informations intéressantes. Cette classe utilisée avec l'utilitaire 'javap' (livré avec le jdk) seront de bons compagnons de jeux:

Reflec liste les méthodes d'une classe , les attributs publics , les constructeurs et aussi la classe Mère.

Ici un exemple d'utilisation :



import java.lang.reflect.*;
abstract class mammifere {
public String nom;
mammifere(String s){
nom = s;
}


abstract void parle();
void quiSuisJe(){
System.out.println( "--------------------------" );
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
System.out.println( " Je suis un " + s );
}
void jeSaisFaire() {
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
try {
Class c = Class.forName(s);

Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
{
System.out.println("je sais faire :" + m[i].toString());
}
}
catch (Throwable e) {
System.err.println(e);
}
}
void mesQualites() {
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
try {
Class c = Class.forName(s);

Field f[] = c.getFields();

for (int i = 0; i < f.length; i++)
{
System.out.println("Mes qualites sont :" + f[i].toString());
}
}
catch (Throwable e) {
System.err.println(e);
}
}

}
class Humain extends mammifere {
Humain( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "Bonjour je m'appelle " + nom +
" et je deteste la java !!" );
System.out.println("");
}
}

class Chien extends mammifere {
public String race ;
Chien( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "OUAF OUAF OUAF je m'appelle " + nom +
" et je ronge mon frein !! non !! mon os ..." );
System.out.println("");
}
void FaireLeBeau(){
System.out.println("sur deux pates");
}
}

class Chat extends mammifere {
Chat( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "MIAOUUUUUUUU je m'appelle " + nom +
" et je ronronne un max ..." );
System.out.println("");
}
}

class mam {
public static void main(String args[]){
mammifere mams[] = new mammifere[ 3 ];
mams[0] = new Humain( "Jean Valjean" );
mams[1] = new Chat( "O'Mallet" );
mams[2] = new Chien( "Droopy" );

for(int i=0; i<3; i++){
mams[ i ].parle();
mams[ i].jeSaisFaire();
mams[ i].mesQualites();

}
}
}

Avec des exemples de resultats.



je sais faire :void Chien.parle()
je sais faire :void Chien.FaireLeBeau()
Mes qualites sont :public java.lang.String Chien.race
Mes qualites sont :public java.lang.String mammifere.nom




La méthode GetMethods retourne les méthodes 'friendly' ,en revanche getFields ne fonctionne que sur les attributs explicitement publics.


Le programme javap est un décompilateur
Il s'utilise comme ceci :
javap <>


ex: javap Chien

Avec le résultat suivant:

javap Chien
Compiled from "mam.java"
class Chien extends mammifere{
Chien(java.lang.String);
void parle();
void FaireLeBeau();
}


Tout cela reste bien triste en raison de l'aspect statique de JAVA.


Ici un article complet sur le sujet.

samedi 5 décembre 2009

Selenium comme outil de test.

En visite dans un centre de développement de la DGFIP à Caen , j'ai assisté à une démonstration de l'outil SELENIUM dans un environnement JAVA. Il y a peu de temps encore, le quotidien de ces développeurs était constitué de COBOL/GCOS7. Quel chemin parcouru !.

Ce schéma illustre le principe de fonctionnement de Selenium.




Bien que les utilisateurs des applications soient sous IE6|7|8 , le développement est d'abord réalisé pour un client Firefox. Ainsi le débat n'est plus IE6|7|8 vs Firefox mais plutôt IE6|7|8 vs (Firefox et ses plugins) et là, il n'y a pas photo. Le comportement identique d'une application sous différents clients (IE6|7|8,firefox,opera, smartphone) est devenu un problème épineux. Quelques conseils :
  • Utiliser les feuilles de style et surtout s'en servir pour régler le problème du traitement erratique des marges (c'est le principal point de divergence des navigateurs) . Pour cela, en avant toutes choses, il convient de remettre toutes les marges à zéro.
  • Utiliser un javascript le plus standard possible : voir ici des conseils dans se sens (developpez.com).
Selenium permet de générer des scripts unitaires pour différents langages :
dont ruby :test::Unit et RSpec.
RSpec est un système de test basé sur le comportement (behavior). Pour réaliser un projet, il devient courant de 'raconter une histoire' plutot que de parler CU (cas d'utilisation') . Cette technique de narration est plus naturelle pour une MOA.
Avec RSpec cela va se traduire de cette facon :
Vous: j'ouvre un compte (créer) et son solde doit etre à zéro.
Cela va etre transcrit sous cette forme

describe Account, "when first created" do
it "should have a balance of $0" do
.....
end
end


Si tout va bien le rapport d'exécution donnera:

Account when first created
- should have a balance of $0

Cette notion de comportement est un concept qui émerge dans tous les nouveaux langages.

Selenium utilise le HTML comme format d'enregistrement, et le fait de manière très propre. Ainsi est il possible de générer le script d'enregistrement sans l'enregistrer préalablement ! Cela reviendrait à préparer les tests avant l'écriture des écrans de l'application.

jeudi 26 novembre 2009

f.... les programmeurs: tous des impolis

Les programmeurs en Perl sont les plus grossiers de tous : la preuve ce graphisme trouvé sur reddit.com

En réalisant une recherche sur le mot 'fuck' croisée avec le type de langage de programmation on arrive à cette dure réalité. Je comprends pour Perl , encore plus pour Haskell. Les programmeurs Ruby et Erlang sont eux polis.


jeudi 21 août 2008

Un programme pour lister les differences

Un outils très pratique pour les codeurs : beediff de beesoft.org

Ce programme permet de comparer visuellement deux fichiers.
Le résultat est présenté sous cette forme :


C'est pas beau ca ?

vendredi 2 mai 2008

A propos de la danse des canards et de la Java

Ce post sur la programmation à l'occasion de la sortie de Perl version 5.10.

Paresse, Impatience et orgueil (Lazyness, impatience , hubris) sont les trois qualités à avoir pour être un bon programmeur. Cette citation de Larry Wall est à mon avis la phrase qui résume le mieux le métier de développeur.

La paresse : chercher en permanence à se décharger de tâches répétitives. Le paresseux est aussi un bon gars (good guy) , il ne refilera pas son travail à un autre , il le fera faire par sa machine. Souvent cette recherche désespérée d'en faire le moins possible , se solde par une charge de travail démesurée. ainsi le paresseux devient un travailleur acharné sans s'en rendre compte.

Impatient : il faut que ça aille vite. car le paresseux déteste avoir l'impression d'accomplir une travail de longue haleine. Ainsi un programme complexe sera souvent découpé en plusieurs morceaux.

Orgueil : La fierté d'avoir créer quelque chose et surtout de le montrer aux autres, avec souvent des égos enflés comme puissant moteur. Le logiciel libre en est le meilleur exemple. Qui connait l'équipe qui à développé Windows 98 ? , qui à développé MSN ? . Par contre les créateurs des projets libres , Linus Torvald en tête sont clairement identifiés et accessibles. Le livre 'la cathédrale et le bazar" d'Eric S Raymond (projet Fetchmail) , traduction gratuite en français ici constitue une lecture essentielle pour comprendre l'acte de création en informatique.

Perl sort donc un opus 10 de la version majeure 5. Cette version est importante à plus d'un titre. Normalement c'est la dernière évolution de la version 5 avant la sortie de la révolutionnaire version 6 de Perl.
La version 6 de Perl doit être la dernière. En effet d'après les architectes , Perl6 sera LE langage , il n'y aura plus besoin d'évolution. Pour l'instant la version Perl 5.10 reprend a son compte des concepts introduits dans Perl6 comme le 'sucre' de programmation 'say' .
Au lieu d'écrire : print "coucou\n";
On aura : say "coucou" ;

Cette page reprend toutes les avancées de Perl 5.10
(On notera aussi la présence de l'opérateur 'given' => CASE) .

D'une manière générale Perl 5.10 intègre les innovations prévues pour Perl6.
L'énorme évolution de Perl6 se trouve dans son architecture: Il utilisera une machine virtuelle , comme java mais mieux que Java. A l'inverse de Java sa machine virtuelle sera basée sur des registres comme un microprocesseur.
Cette machine virtuelle sera capable de faire tourner n'importe quel langage de script (Perl ,Python, Ruby, PHP) et même du Java.

Un nouvel opérateur issu de Perl6 est implémenté : '~~' .
Cet opérateur est polymorphique: Son comportement dépend du type de donnée à comparer :
Son équivalent pour deux nombre sera '==' et 'eq' pour deux chaines .

Cet opérateur est un piège à c.. , il renforce la confusion intrinsèque de Perl entre les types de données.

Car Perl est un langage 'lazy typing' (typage souple) . Il n'est pas nécessaire (et possible) de déclarer le type d'une variable (string ou integer) , c'est le contenu et l'usage de la variable qui renseigne sur son type. Une variable peut changer dynamiquement de type en cours d'exécution.
Ainsi pour comparer deux chaines de caractères il faut utiliser l'opérateur 'eq' alors que pour la même opération avec des nombres il faudra employer '==' .


Exemple d'erreur très gênante :

perl -e "print ('eric' eq 'german')"
résultat : 0 (false ) normal
perl -e "print ('eric' ne 'german')" ;#ne => not egal
résultat 1 (true ) normal aussi
perl -e "print ('eric' == 'german')" ;
résultat 1 !!!! erreur , mais Perl évalue la première chaine la tente de la transformer en expression numérique et cela échoue . Idem pour la deuxième chaine DONC Perl considère la condition echec==echec VRAIE.

C'est un genre d'étourderie qui coute parfois plusieurs jours de travail pour trouver la ligne erronée.

En Ruby , on ne pratique plus le Lazzy Typing mais le duck typing: Le typage 'canard'. Dans plupart des langages c'est parce que vous avez déclaré une variable comme étant de type canard qu'elle peut et doit se comporter comme un canard. En ruby c'est différent ; si vous élevez déjà des canards et que vous recevez une pintade ,vous n'allez pas forcement créer une classe Pintade pour un seul animal. Vous allez plutôt utiliser la technique des 'singletons' qui consiste à surcharger ponctuellement une classe pour une instance donnée. Votre pintade se déplacera comme un canard , ne fera pas forcement le bruit du canard , peu importe ,une fois engraissée elle finira dans l'assiette comme un canard.

L'univers des langages informatiques fourmille d'anecdote pas toujours innocente . Par exemple le Cobol a été inventé par une femme (Amiral grace Hopper) et c'est pour cela qu'il est verbeux ..(c'est une blaque) . Perl a été inventé par un un informaticien ... non larry wall était avant tout un linguiste. L'inventeur de Ruby est japonais , il a fait la synthèse entre Perl , Php, java ou Python. Larry Wall piqué au vif ,c'est mis à apprendre le japonais pour comprendre les subtilités de ruby et pour creer le 'killer' langage Perl6.

comme dit notre maitre à tous Stallman : good Hacking