World forum 2012 3/3

So here we are for my third and last article about the World Forum for responsible economy in Lille 2012.
This time I will report the conference “The third industrial revolution : renewable energies”.
This conference was split in three parts :
– Energetic mix in Roquette (biochemistry, potato starch specialist)
– Negawatt and network optimisation by Mr.Jaquin of Schneider Electrics
– Energetic revolution in Brasilia by Mr.Rielly of Renovaveis

Energetic mix : the future

Roquette is a french company specialised in the treatment of potato starch and its chemistry.
The company started thinking about renewable energies when  it came out that the source of all energies in the world is biomass and starch is the most flexible biomass product. It can be used as a way to produce polymers, energy (our body consume starch to live)… So what does Roquette do to include biomass -and other renewable energies- into its consumption?

Mr Roquette takes the example of his factory in Alsace – East of France- that has reduced its consuption of gas of 25% and in fine it gas has to be only 20% of the consumption of this factory. It is not enough. CO2 is released by the very production of starch. The factory found one solution : Almost 50% of carbon gas is sent to a tomatoe hydroponic cultivation that needs that gas !

About electrical production, it is assured by two sources : a wood unity -which is fed by the underused local forest- and a geothermal plant.

As a conclusion, Mr Roquette underlines a simple figure : From one provider -with nuclear, fuel and gas production (EDF)- Roquette opened to more than 10 (wood , water, farmers…). It has several pros. First of all : it is local, not centralized. Roquette saves so much because there is less inline loss. Moreover, it reduces the risk of a cut.

Mr Roquette concluded his talking with a proposition : what if the European Union took the head of industrial projects that deal with energy sources by applying an old mecanism that consist in deducting when we import (with tax) and giving back when we export (subvention)?

Negawatt in France and expansion in Brasilia?

Mr.Jaquin and Mr Rielli introduced us about two totally different situations :
In France -and more generally in Europe- we’re making huge efforts to reduce our consumption because it becomes very difficult to pay hydrocarbons, and winter peaks are hardly handled by the network.
In Brasilia, everything is growing up, especially middle class. Something that can look weird to us is that the first purchase of a new middle class familly is… a fridge.
That means an exponential consumption and even if Brasil has ressources, this power has to be provided as soon as possible. As a consequence, renewable energy are a choice that they are forced in because they are local whereas nuclear plants are centralised.

Conclusion

This world forum was really focused on the ideas J.Rifkin developps in his book “the third industrial revolution”, the need of energetic driving by information was the main idea. I think the best conclusion I can bring is just “we have to make it plural” : more technologies to produce, to save, to share… Centralism, monopoly and specialisation are not welcome in the 21th century.

PHP 5.5 déprécie Mysql

Ca y est ! la version 5.5 de PHP qui est actuellement en version alpha jusque jeudi a marqué l’API Mysql qui commençait à dater comme dépréciée.

Cela signifie que désormais, à chaque appel de mysql_connect (ou de son équivalent pour les connexions persistantes) un WARNING vous sera envoyé vous conseillant de passer à Mysqli ou PDO. Si vous ne l’avez pas déjà fait, il n’est pas trop tard, et je vais vous rappeler (ou du moins vous présenter) quelques bonnes raisons de ce passage :

La sécurité

On ne vous le dira jamais assez, mysqli et PDO sont plus sécurisés. Pas simplement parce qu’ils proposent les requêtes préparées, qui sont naturellement “sécurisées” (à condition qu’on sache s’en servir) mais aussi parce que l’un comme l’autre corrigent les failles de mysql_ en ce qui concernent l’encodage, les connexions persistantes etc. Cela impliques quelques règles à respecter :

  • Il est obligatoire de donner la ressource de connexion à chaque fonction qu’on appelle. La POO simplifie cela puisque la méthode est liée au $this. Par contre le style procédural permis par mysqli_ vous oblige à écrire par exemple :[cc lang=”php”]$query = mysqli_query($connexion,’SELECT * FROM yourtable’);
    $result = mysqli_fetch_all($query);[/cc]
  • Sauf pour les requêtes dont vous savez qu’elles n’utilisent pas de paramètres, utilisez la fonction prepare. Attention néanmoins mysqli_ et PDO n’utilisent pas cette fonction de la même manière. PDO a deux grands avantages sur MySQLi en ce qui concerne les requêtes préparées : il permet des paramètres nommés et il permet de lier une valeur plutôt qu’une variable. Enfin pour PDO aller chercher le résultat d’une requête “normale” ou d’une requête préparée c’est la même chose donc les méthodes fetchAll et fetch existeront. Pour mysqli seul fetch existera et encore, il fonctionnera d’une autre manière que le fetch d’une requête normale.
    • Exemple de requête préparée avec PDO : [cc lang=”php”]$pdo = new PDO(‘yourDSN’,’user’,’pw’);
      $prep = $pdo->prepare(‘SELECT * FROM yourtable WHERE yourcol=:yourcol’);
      $prep->bindValue(‘yourcol’,"une chaîne avec des c’haractères embêt@nts’");
      $prep->execute();
      $result= $prep->fetchAll(PDO::FETCH_ASSOC);[/cc]
    • Exemple de requête préparée avec MySQLi :[cc lang=”php”]$mysqli = new mysqli(‘yourhost’,’user’,’pw’,’db’);
      $prep = $mysqli->prepare(‘SELECT * FROM yourtable WHERE yourcol=?’);
      $var = "une chaîne avec des c’haractères embêt@nts’",
      $prep->bindParam(‘s’,$var);
      $prep->bindResult($col1,$col2,$col3);//les résultats de chaque colonnes seront mis dans les variables associés
      $prep->execute();
      while($prep->fetch()){
      $result[] = array($col1,$col2,$col3);
      }[/cc]

     

Les fonctionnalités

L’ancienne API est ancienne et n’a pas été mise à jour avec Mysql 5 donc contrairement à PDO et mysqli elle ne pourra pas tout faire.
Au programme : requêtes multiples, support amélioré des transaction, support amélioré des conexions persistantes…

Migrer? mais comment?

En utilisant l’outil développé par Oracle.
En allant chercher quelques infos sur stackoverflow.

NoSQL le future?

Tant dis que j’apprenais avec @hsablonniere les méandres du javascript et la puissance de la JavaScript Object Notation aka JSON, quelques recherches sur le web m’ont rapidement ouvert au monde du NoSQL. Je ne prétends pas être un pro dans ce domaine dans lequel je vais seulement démarrer la semaine prochaine, néanmoins j’ai pu découvrir une multitudes de nouvelles méthodes pour gérer une base de données. Les bases de données SQL (structured Query Language) ne sont pas encore morte (ouf !) mais il faut avouer qu’elles ont leur limitation, tant en terme de performance, d’occupation mémoire que de conception.

Lorsque j’ai appris l’existence des bases de données NoSQL, je me disais “bah ça sert à rien”. Non pas parce que j’étais un troll mais parce que je voyais déjà arriver le “web sémantique” et que pour moi, j’en avais la certitude, sémantique = relation entre les données. En effet donner un “sens” à une phrase c’est la mettre en relation avec son contexte, avec la manière dont elle est créée etc. Tout comme identifier une image c’est peut être l’intercorreler avec une autre.

Si tout cela semble vrai au premier abord, soyons honnête, est-ce que la conception “MCD” avec ses relations entre entité correspond vraiment à cette idée qu’on met en relation deux “instances”? Une base “clef=>valeur” semble être une bonne idée non?

Pourtant avec l’acquis de mes cours sur la méthode Merise, sur l’élaboration de modèles conceptuels de données, avec mon utilisation courante de MySQL he bien, j’ai encore et toujours continué à faire du MySQL et donc du relationnel. Jusqu’au jour où un projet que j’avais commencé avec des amis et qui a été avorté depuis m’a posé un gros problème de conception puisqu’il nécessitait un système de versionnage (en fait cette fonctionnalité alliée à deux autres bonnes idées de mes amis créaient une sorte de “killer functionality”). En SQL, versionner c’est… lourd, long, pas pratique… et j’en passe ! Et j’ai aussi eu ce regret, en migrant mon blog, que les articles ne soient pas versionnés par wordpress. En plus quand on voit comment ce dernier range les choses, j’ai un peu peur !

Aujourd’hui, je suis encore et toujours avec mon projet de concours de programmation avec mes amis du club informatique ISEN. Période de disette oblige, je n’ai pas pu obtenir de serveur Windows Server et donc pas de IIS. J’ai tenté une installation Mono sur mon kimsufi mais comme je n’ai pas de nom de domaine alors que ce serveur est lier à trois autres noms il y a des conflits que je n’arrive pas à résoudre. J’ai demandé quelque aide sur serverfault, sans succès pour l’instant. Je commence donc sérieusement à revenir vers un système php. Mais comme j’aimerai offrir des replay de parties, un versionnage serait bien plus intéressant qu’un simple enregistrement des coups à jouer dans une arènes. Aussi ça serait bien plus rapide.

Actuellement, je me dirige donc vers la solution PHPCR présenté par David Bruchmann lors du PHP Tour 2012 de Nantes.

Comment un langage lambda peut-il devenir cool?

Dans ce titre un peu étrange se cache un certain enthousiasme : le Java qui m’énerve, me fait râler, me fait faire des choses répétitives, crades (classes anonymes) mais pourtant si stricte qu’on dirait un grand père réac est en train, enfin, de disparaître. Une nouvelle fonctionnalité, les lambda functions arrivera avec Java 1.8 et j’avoue qu’à mon sens ces expressions sont crées en Java de la plus belle manière qui soit, petit aperçu.

Ce qui importe : les parties codantes

J’ai assisté au Ch’ti JUG mardi dernier, la conférence était animé par Rémi FORAX qui a d’emblée mis le doigt sur un problème important en JAVA : la part très importante de cérémonie et de code superflu face aux parties codantes. Eh oui, plus que la déclaration des classes et des fonctions, en JAVA vous pouvez surcharger votre ligne de code avec des “cérémonies” très -trop- nombreuses.

L’idée est donc d’incorporer des fonctionnalités qui feront que les parties codantes seront vraiment plus importantes. Premièrement, on va essayer d’arrêter de créer des classes anonymes quand on veut juste une expression. En plus d’être très inefficace pour différentes raisons (accès disque multipliés…) cela prend pas mal de temps à coder, et en plus c’est difficilement parallélisable. Alors on va créer les fonctions lambda et les expressions statiques.

Par exemple, pour reprendre ce que nous a montré R.Forax, pour lister tous les dossiers contenus dans le dossier courant, la “vieille version” consistait en cela :
[cc lang=”java”]
public class DirectoryLister{
public static File[] listDirectory(File rootDir){
File[] files = rootDir.listFiles(new FileFilter(){
@Override
public boolean accept(File path){
return path.isDirectory();
}
});
return files;
}
public static void main(String[] args){
File root = new File(".");
for(File f: listDirectory(rootDir)){
System.out.println(f);
}
}
}[/cc]
Avec les lambda on peut faire, a première vue :
[cc lang=”java”]
public static File[] listDirectory(File rootDir){
File[] files = rootDir.listFiles((File file)->file.isDirectory());
return files;
}
[/cc]
La syntaxe pour une lambda est [cci lang=”java”](Type1 var1,Type2 var2)->expression[/cci] et si vous avez besoin de plus de lignes :
[cc lang=”java”](Type1 var1,Type2 var2)->{
var1.fonction();
var2.fonction();
return /* ce qu’il y a a retourner*/;
}[/cc]
Mieux encore, comme dans notre exemple il s’agit simplement d’appeler une fonction de l’objet de type File, on peut réduire [cci lang=”java”](File file)->file.isDirectory()[/cci] à
[cci lang=”java”]File::isDirectory[/cci].

Là où Java devient cool : les Stream

Presque tous les langages dynamiques possèdent les fonctions lambda, peu importe leur nom. Mais en Java, quand on réforme le langage (car derrière les lambda, il y a un vrai gros changement de Java quand même), on ne le fait pas pour si peu…
Alors on va créer l’idée des “Streams” et là c’est vraiment immense.
Pour expliquer ce qu’est un stream, rien de mieux qu’un schéma (merci V.Plantevin). Partons d’une collection, un tableau par exemple. Nous voulons le filtrer puis faire une opération sur chaque élément restant.
Les filtres sont dit “méthodes intermédiaires”, alors que le “foreach” est dit “méthode finale”.flux7L’idée c’est que les méthodes intermédiaires vont créer un pipeline extrêmement optimisé et qui peut utiliser toutes les ressources processeur moderne. Ce pipeline n’est construit, à la compilation, que s’il y a une méthode finale : on ne peut pas filtrer un flux sans lui appliquer quelque chose à la fin, sinon le compilateur ne sait pas créer le pipeline.

Alea jacta est

Pour télécharger la dernière version de la JDK 8 :
JDK 8 with lambda
N’hésitez pas à remonter les bugs :
lambda-dev@openjdk.java.net

Les causes de la richesse de DateTime

Il y a peu, je digressais sur les forces de types complexes tels que DateTime en php sur le Timestamp unix. Une des raisons souvent invoquée (et que j’avais présentée comme pourtant peu importante) est que le timestamp est limité à 2038 en limite haute et à 1900 en limite basse (je rappelle : le timestamp est signé).

En php, DateTime est un type plus complexe et donc plus puissant. Mais certains me disaient “c’est inutile, DateTime ne fait qu’encapsuler un timestamp donc c’est plus lourd, plus lent pour juste des cas d’utilisation que les débutants n’utilisent pas”.

Premièrement c’est faux : mon expérience sur le site du zéro m’a montré que les débutants adoraient faire tout ce qui relève aujourd’hui des objet DatePeriod et DateInterval de manière assez crade. Par exemple, j’en trouve un la foi dernière qui veut retirer un mois à une date. Je lui répond : [cci lang=”php”]$taDate->add(new DateInterval(‘P1D’));[/cci]. Et de me faire allumer par un type qui dit qu’il suffit simplement de faire quelque chose type : [cci lang=”php”]strtotime(date("Y-",$time).(date(‘m’,$time)-1).date(‘-d’,$time));[/cci]. Heureusement que I.Jafrezic aka Zazou est venu à ma rescousse et a évangélisé pour DateTime.

Ensuite, d’un point de vue technique, DateTime n’est pas une simple encapsulation. Eh non, c’est bien plus complexe :

  • Le timestamp qu’elle contient est de type int64_t, c’est à dire que peu importe que votre architecture soit 32 ou 64 bits, vous stockez un entier sur 64 bits
  • D’autres champs tels que le jour, mois, année… sont aussi stockés. Le choix a été fait d’utiliser une nouvelle fois un int64_t, je ne sais pas pourquoi, mais sûrement pour éviter les pertes de temps en conversion.
  • Le support du fuseau horaire est ajouté

Voici, pour preuve de ce que j’avance, le code C de la structure à la base de dateTime :

[cc lang=”c”]struct timelib_time {
timelib_sll y, m, d; /* Year, Month, Day */
timelib_sll h, i, s; /* Hour, mInute, Second */
double f; /* Fraction */
int z; /* GMT offset in minutes */
char *tz_abbr; /* Timezone abbreviation (display only) */
timelib_tzinfo *tz_info; /* Timezone structure */
signed int dst; /* Flag if we were parsing a DST zone */
timelib_rel_time relative;

timelib_sll sse; /* Seconds since epoch */

unsigned int have_time, have_date, have_zone, have_relative, have_weeknr_day;

unsigned int sse_uptodate; /* !0 if the sse member is up to date with the date/time members */
unsigned int tim_uptodate; /* !0 if the date/time members are up to date with the sse member */
unsigned int is_localtime; /* 1 if the current struct represents localtime, 0 if it is in GMT */
unsigned int zone_type; /* 1 time offset,
* 3 TimeZone identifier,
* 2 TimeZone abbreviation */
}[/cc]