Open Game

J’étais à une conférence où il était question entre autre d’Open Access et Démocratie.

J’ai été marqué par plusieurs choses. Par exemple dans l’opposition vis à vis des éditeurs privés (concentrations, prix abusif, opacité, …) plusieurs personnes semblaient rêver d’interventions de l’Etat afin de garantir un accès démocratique. Plusieurs fois l’intervention du secteur public semble vécue comme la panacée. Sur le fond je trouve aussi que sur de telles questions l’intervention de l’Etat est plus que légitime et pourrait aller encore plus loin de par ses prérogatives. Reste que vu l’évolution du paysage politique, je ne pense malheureusement pas que l’intervention de l’Etat soit l’ultime remède car certains prétendants au pouvoir (et pas les plus mal placés (( entretiennent apparemment de gros fantasmes de privatisations.

Le rempart cela semble être la publication de code open source permettant de traiter les données. Si tel service est privatisé ou absorbé par un méchant éditeur du secteur privé, au moins on sauve l’infrastructure logicielle de traitement. Ce raisonnement doit être modéré par les interrogations sur l’Open Source au sens logiciel. Pour ma part je relis très très rarement le code d’autres personnes. Peut-être suis-je une loup des steppes/circuits mais je vois rarement mes confrères proches évoquer ce  type d’activité non productrice à court terme.

Vu de l’extérieur code is code, il sera relu et tout ira bien.

Mon point principal, en tant que programmeur en perl, javascript, xml et/ou swift, c’est que le langage dans lequel sont développés ces projets est un enjeu majeur. Il suffit de peu d’observations pour se rendre compte que le public qui s’exprime en assembleur, C++, python ou dotnet sont très différents. Il y a une part d’idéologie sous-jacent, un constat générationnel et sociologique. C’est pourtant bien occulté au grand public. Pour un certain nombre de personnes plus proches du milieu vas vous tenir le raisonnement que pour tel type de job il n’y a pas à tergiverser quand au choix de l’outil qui doit s’imposer par lui même. Je n’y crois pas. Comme on dit souvent entre perlistes, « there’s more than one way to do it ».

J’y crois d’autant moins que j’ai connu professionnellement des cas où la décision du choix du langage incombe à la hiérarchie non technique. Je suis pour le pluralisme, je pratique certains langages mais j’en ignore bien d’autres. Je n’ai pas envie d’imposer mes choix, au mieux convaincre, et encore. J’aurai pu apprendre php il y a quelques années mais cela me révulse, j’aurai pu me mettre au python mais je trouve le code inélégant, et je suis trop jeune pour avoir un background en assembleur. Paysage d’autant plus compliqué avec l’explosion du nombre de librairies et fameworks, il y en a pour tous les goûts.

Code is not code. Ce n’est pas un tour de babel mais une ville avec ses quartiers et ses ghettos, sa politique et sa sociologie.


Open Game

Assembly types

Je crois qu’une dans grandes erreurs de la programmation moderne est que beaucoup pensent coder dans un langage proche de l’assembleur où il existe une forme de compréhension du poids de chaque instruction. Les langages modernes sont de si haut niveau que l’on peut avoir l’impression qu’un code compact est plus efficient.
Récemment je code un peu en Swift pour divers projets, mon casual load restant perl. C’est le grand écart. Le typage dans perl est tellement faible et la syntaxe libérée que swift semble bien coercitif. Je comprends que cette modernité est liée à des considérations d’optimisations qui sont réelles. J’avais fait des essais en objective-c et j’avais détesté car je trouvais la syntaxe vraiment trop inélégante.
Swift donc, les fonctions. Par convention le premier paramètre n’est pas nommé mais les paramètres suivants sont déclarés avec des préfixes nommés qui permettent, en plus du type qui est très fort, de savoir que passer. Reste que contrairement au premier, les suivants doivent être préfixés et en plus l’ordre est important: Que faire de la police ? La discipline m’est ici presque insupportable.

Reste qu’il y a des aspects plaisants, le code est propre et élégant selon mes standards, les curlies sont scopants, les ; optionnels, la surchage est classes est très bien faite, les parenthèses optionnelles sur les conditions. Par contre les strings qui nécessitent toujours des doubles quotes sont un grand malheur pour moi.

Comme le dit Larry Wall, programmer c’est trop compliqué, let’s go scripting !


Assembly types

Solar 5, premières notes

Je note ici mes premières impressions et difficultés avec le nouveau SolR 5. J’aime beaucoup l’idée principale qui est de se passer d’un container, rien contre. standalone me vas bien.

Auto-discovery des cores, je ne comprend toujours pas pourquoi il faut créer un core.properties dans le répertoire de chaque core, quitte à ce qu’il soit vide, ou alors un collection.properties.

Quelques types de données ont disparu, pint, sint, etc… pas bien grave, c’est même mieux.

Comme souvent le clustering est un peu chiant à mettre en place car il n’est pas dans la config par défaut donc il faut ajouter à son solr start -a ‘-Dsolr.clustering.enabled=true’ copier les jar du contrib/clustering vers $solrhome/lib/clustering avec le <lib> qui vas bien dans le solrconfig.xml

Quelques handlers devenus incompatible à enlever de la configuration.

J’ai supprimé les sections <indexDefaults> et <mainIndex> de mon solrconfig.xml.

Dans mon schema j’ai eu des problèmes avec enablePositionIncrements= »true » dans les stopFilterFactory.

J’ai eu un coup de flip car il ne retrouvait plus mes datas car le dataDir est relatif au solrhome et non au home du core comme je le croyais.

Enfin certain de mes vieux scripts avaient des curl que j’ai du adapter:

curl $sol5url/update?commit=true
curl -H ‘Content-type: text/xml’ -X POST -d ‘<optimize />’ $sol5url/update


Solar 5, premières notes

MTWrong

j’ai donc quitté MT pour WP. pas grand chose à en dire si ce n’est que c’est un peu le même type d’intérêt pour les technos qui gèrent leurs propres migrations qui m’avait poussé à revenir sous Ubuntu après un passage sous Mint, ce type de confort et le fait que MT a fini par me planter sec avec aucune possibilité autre que de déplacer mes datas de l’un à l’autre à la main.

Time will tell.

A l’occasion ce blog Resistance is Futile devient Bug or Feature ?


MTWrong

Double Itérateur

Je travaille à nouveau sur des codes, cette fois à partir du XML de la base Legi. Je vais mettre ici plusieurs morceaux du code. Aujourd’hui voici un exemple d’un patern de programmation que j’utilise beaucoup ces temps-ci, les itérateurs, ici dans une variante à double profondeur. A la base je récupère une liste d’éléments sans volume, des titres de niveaux variables et des articles de code. Il arrive que certaines branches de l’arborescence de titre soient vides car les articles qu’elles contenaient ont été abrogés. Une approche aurait consisté de donner du volume à cette cette liste de titres en fonction de leurs niveaux d’importance mais cela aurait été inutile car le but est ensuite de générer des PDF avec FOP et des EPubs avec perl. Bref, il faut supprimer certains titres car ils sont inutiles selon mes critères de droit positif.

$d est mon document vu en perl par XML::LibXML.
$root = $dom->getDocumentElement();
(@nodes) = $root->childNodes();
while ($node = shift(@nodes)) {
#iterateur principal
if ($node->nodeType ==3) {
#Si c’est une node de texte je la supprime si elle ne contient pas de texte
$node->parentNode->removeChild($node) unless($node->textContent =~ /\[\w\-]/);
} else {
if ($node->nodeName =~ /^h(\d)/) {
#Si c’est un titre, j’en inspecte le niveau hiérarchique.
$level = $1;
my @charette;
#Je prépare une charette dans laquel je mettrai l’hypothétique lot à supprimer si effectivement le soul arbre ne contient pas d’articles.
my @copie = @nodes
#Je fais une copie de mon nodeset pour itérer dans ses sous branches.
while ($cand = shift(@node)) {
#Itérateur secondaire
$ca = $cand->nodeName;
last() if ($ca eq ‘article’);
#Je sors de l’itérateur si un des enfants est un article
if (($ca =~ /hash(\d)/) and ($1 > $level)) {
#Si c’est un sous branche je l’inscrit à la charette sans la supprimer.
push(@charette,$cand);
}
if (($ca =~ /hash(\d)/) and ($1 <= $level)) {
#Si c’est un titre de niveau égal ou supérieur, je vide la charette je supprime les nodes
map {
$_->parentNode->removeChild($_);
} @charette;
$node->parentNode->removeChild($node);
}
}
}
}
}

Pas si compliqué que cela, j’ai juste longtemps hésité sur la copie.


Double Itérateur

JSON is fragile

La livebox Orange bugge. Après avoir fait le tour de mes browsers, même ceux du côté obscur, j’ai cherché dans les forums pour voir si d’autres avaient de problème d’interface de configuration indisponible sur livebox play. Me sentant décidément très seul, j’ai sorti mon firebug et me suis lancé dans un gros travail d’inspection.

Lors de JSON.parse il me dit:
[bus] error handling ajax request

SyntaxError: JSON.parse: bad control character in string literal

Ce sur plusieurs pages, les autres browsers loguant des choses tout à fait similaires.

Le JSON  en question ne semblait pas suspect dans la console mais, à le lire, observe que l’erreur de situe lorsqu’il récupère les infos sur les devices connectés. Un petit coup de JSONLint (http://jsonlint.com/) me révèle bel et bien une erreur dans la section relative à mon smart screen Samsung. J’ai cru au début à un problème d’encodage mais rien d’évident à la vue.

Ce n’est qu’en copiant la ligne dans un éditeur de texte orienté caractère comme pspad que je n’ai enfin compris quoi qu’en copiant la ligne dans mon terminal j’avais déjà un début de réponse.

« userClassID »: «  »,

Là on ne devine rien mais un prenant le même segment dans un éditeur précis (Sublime Text 2 sur mon mac) je vois non des doubles quotes vides mais contenant un caractère de contrôle S0H !! Je ne comprends pas vraiment la notation de Sublime mais il s’agit d’un caractère de contrôle que les gars d’Orange.fr ont oublié de filtrer, reste à savoir lequel. SOH est en fait le premier caractère de la table ascii, Start of Header pour être précis.

Je ne sais pas trop comment contourner ce bug pour le moment mais je l’ai identifié. Avec du XML l’erreur aurait été la même mais cela aurait été à mon avis plus simple à identifier.


JSON is fragile

Jason a tort

Pour moi il a deux erreurs fondamentales dans le format JSON que j’utilise par ailleurs.

La première est la gestion des encodages. A ce que je comprends elle est implicite et déduite des headers http mais elle peut être corrigée à la volée par les useragents (les navigateurs). C’est une erreur historique car cela fait perdre du temps à tout le monde et que c’est une source d’erreurs potentielle. Au moins en XML, les règles sont claires, si l’encodage n’est pas précisé c’est de l’UTF-8 et il n’y a pas à tergiverser.
L’autre erreur de design du format est la gestion du whitespace, problème qui impacte aussi de nombreux autres formats dont le XML bien sûr. Je reste convaincu que le whispace aurait du être normé dans JSON : cela aurait certes réduit sa lisibilité par les humains mais cela aurait produit un gain de performance non négligeable. Le JSON n’est pas voué à être human readeable donc l’argument relatif à sa lisibilité est fallacieux. Si le whitespace avait été réglementé voire réduit à néant alors les parseurs de JSON auraient été plus performants.
Quel dommage.

Jason a tort

Scale to fit

Je voulais jouer avec un composant qui serait space to fit mais pas mal de bugs liés au fait que les browser mettent le letter-spacing entre le lettres mais aussi après la dernière lettre. Donc ma formule devient pour une node hq sans enfants:

    hq.style.margin = hq.style.padding = ‘0’;
    var spana = document.createElement(‘span’);
    spana.appendChild(document.createTextNode(hq.firstChild.nodeValue));
    hq.replaceChild(spana,hq.firstChild);
    hq.style.letterSpacing = ‘0’;
    hq.style.textAlign = ‘center’;
    v = (hq.offsetWidth – hq.getElementsByTagName(‘span’)[0].offsetWidth) / (hq.getElementsByTagName(‘span’)[0].firstChild.nodeValue.length);
    hq.style.letterSpacing = ~~(v)+’px’;
    hq.style.marginRight = ~~(-1*v)+’px’;
Merci.

Scale to fit