Publié le 29 Juin 2015

En scala il est possible de saisir directement du code XML (XML literal). Ce code est en fait une séquence de nodes (NodeSeq), contrairement à d'autres langages comme Java où il faut saisir une chaîne de caractères qu'il faut ensuite parser.

Par exemple le code suivant est valide (pour l'instant*):

val xml = <root><node>value</node></root>

Noter qu'il n'y a pas de " autour du code xml.

Maintenant imaginons qu'au lieu de value on veuille utiliser une variable (ou appeler une fonction). Dans ce cas il faut utiliser des {}:

val myValue = "blablabla"
val xml = <root><node>{myValue}</node></root>

* Je dis pour l'instant car dans une future version de scala les XML literals seront remplacés par les string interpolations, ce qui donnera quelque chose comme ceci:

val xml = xml"<root><node>$myValue</node></root>"

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Publié le 22 Juin 2015

En fait rien de particulier sur ce cas là si ce n'est la façon de déstructurer les arguments de la fonction de mapping. Ça à l'air compliqué mais pas tant que ça en fait. Prenons un exemple avec une liste de paires:

val paires = List("Jurassic Park" -> 1993, "Star Wars" -> 1977, "Shaun the sheep" -> 2015)

Voilà notre conteneur. Maintenant effectuons un mapping dessus:

val films = paires.map( paire => s"${paire._2} sorti en ${paire._1}")

Rien de spécial ici, ça fonctionne mais l'utilisation des _1 et _2 pour accéder aux membres de notre paire n'est pas très lisible.

J'aurai préférai écrire quelque chose comme ceci:

val films = paires.map( (titre, année) => s"$titre sorti en $annee")

Voilà qui est plus clair mais cela ne compile pas. En fait il faut utiliser un pattern matching pour déstructurer la paire:

val films = paires.map(film => film match {
   case (titre, annee) -> s"$titre sort en $annee"
})

C'est pas mal et ça fonctionne mais le pattern matching est un peu lourd.

Heureusement on peut supprimer le "match" et ne garder que le "case":

val films = paires.map { case (titre, annee) => s"$titre sorti en $annee" }

A part le "case" en plus on est assez proche de la forme déstructurée mais voilà il faut bien penser à utiliser le "case" sinon ça ne compile pas.

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Publié le 18 Juin 2015

Si vous avez installé une clé 3G Huawei sur votre Mac, Brew n'a sans doute pas apprécié et affiche sans doute l'erreur suivante:

$ brew doctor
Warning: You have an outdated version of /usr/bin/install_name_tool installed.
This will cause binary package installations to fail.
This can happen if you install osx-gcc-installer or RailsInstaller.
To restore it, you must reinstall OS X or restore the binary from
the OS packages.

Et oui ce n'est pas vraiment cool. Reinstaller entièrement Mac OS je préfèrerai éviter et effectivement il y a bien un moyen de restaurer ce fichier mais il faut tout de même télécharger OS X depuis l'AppStore.

Une fois les 5,64G téléchargés, quitter l'installateur. Le .dmg, quant à lui, est télécharger directement dans /Applications.

Pour résoudre le problèmes il faut refaire une "Essentials installation" en lançant les commandes suivantes depuis un terminal:

$ open /Applications/Install\ OS\ X\ Yosemite.app/Contents/SharedSupport/InstallESD.dmg
$ open /Volumes/OS\ X\ Install\ ESD/Packages/Essentials.pkg

Après environ 20 minutes, l'installation se termine et brew semble plus joyeux.

 

Voir les commentaires

Rédigé par Bliz

Publié dans #mac

Publié le 12 Juin 2015

Si vous essayez de placer un datepicker à l'intérieur d'une popup (modal) vous verrez que ce dernier apparaît derrière la popup et n'est donc pas utilisable.

Cela vient du fait que la popup bootstrap a un z-index de 1050 et donc le date picker est masqué.

La correction se fait directement en css en spécifiant un z-index supérieur à 1050 pour le datepicker.

.datepicker {
   z-index: 1150 !important;
}

On prend un peu de marge en ne spécifiant pas directement 1051 au cas où d'autres éléments viendrait se glisser entre ces 2 z-index.

Voir les commentaires

Rédigé par Bliz

Publié dans #CSS

Publié le 22 Mai 2015

L'installation de R sur Max OS X est assez aisée avec homebrew. Il y a cependant un écueil car R n'est pas disponible par défaut. Il faut d'abord ajouter un nouveau "repo" à homebrew:

brew tap home-brew/science

Penser à mettre à jour les taps homebrew avant de commencer:

brew update

Ensuite il faut installer gcc si vous ne l'avez pas encore:

brew install gcc

ou éventuellement 

brew upgrade gcc

pour être sûr d'avoir la dernière version de gcc (gcc 5 qui inclut gfortran).

Enfin on peut installer R:

brew install R

Et voilà c'est tout.

Voir les commentaires

Rédigé par Bliz

Publié dans #R

Publié le 18 Mai 2015

La lecture d'un fichier est nettement plus aisée en Scala qu'en Java.

En effet en scala le code tient en une seule ligne (ou presque):

import scala.io.Source

Source.fromFile("mon/fichier.txt").getLines

 

 

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Publié le 11 Mai 2015

Par défaut 127.0.0.1 représente l'adresse locale (ou loopback). C'est à dire que rien est envoyé sur le réseau mais redirigé directement vers l'hôte local.

Il est intéressant d'avoir plusieurs adresses locales: 127.0.0.2, 127.0.0.3, ... afin de pouvoir faire tourner plusieurs instances d'une même application.

Pour ajouter une adresse locale cela se fait à l'aide de ifconfig et de la commande suivante:

sudo ifconfig lo0 alias 127.0.0.2 up

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux

Publié le 8 Mai 2015

Jusqu'à présent j'ai toujours générer les PDF côté serveur mais je viens de découvrir une librairie javascript qui permet de le faire directement dans le navigateur.

Il s'agit de jsPDF. Cette librairie est assez facile d'utilisation il suffit de voir les examples disponibles.

Il y a une fonctionnalité qui m'a l'air particulièrement prometteuse: la possibilité de générer un pdf directement à partir du HTML.

J'avais placé de grands espoirs dans cette fonctionnalité en pensant pouvoir générer le HTML à partir d'un template angular directement en javascript sans l'attacher au DOM mais ce fut malheureusement un échec à cause des CSS non pris en charge.

Pour être honnête les CSS sont plus ou moins gérer si le HTML est un élément du DOM (même masqué).

En fait je trouve cette librairie malgré tout sympathique car la génération du PDF est assez rapide et permet de décharger le serveur.

Je vais continuer à suivre son évolution d'un oeil, surtout concernant la prise en charge des CSS.

Voir les commentaires

Rédigé par Bliz

Publié dans #Javascript

Publié le 7 Mai 2015

Maintenant qu'on sait comment télécharger un template angular il va falloir le traiter ou le compiler. C'est à dire remplacer toutes les doubles accolades {{}} par les valeurs correspondantes.

Cela se fait en 2 étapes:

  1. La compilation qui va produite une fonction qui pourra être utilisée pour générer un element HTML en lui passant un contexte ou scope.
  2. La liaison où on utilise la fonction précédente pour lier un élément HTML à un scope

Ce qui donne:

// html est une string contenant un template html
var bind = $compile(angular.element(html));
var element = bind($scope);

ou en une seule ligne:

var element = $compile(angular.element(html))($scope);

Si au lieu d'un élément HTML on a besoin d'une string on peut utiliser $interpolate au lieu de $compile.

 

Voir les commentaires

Rédigé par Bliz

Publié dans #angular

Publié le 7 Mai 2015

Un template angular n'est rien de plus qu'un fichier html.

On peut donc le télécharge facilement à l'aide du service $http.

$http.get('mon/template.html', {cache: $templateCache});

L'astuce consiste à bien préciser de cacher le template avec $templateCache de sorte que le template soit dispo dans le cache et qu'on évite des téléchargement superflus.

 

Voir les commentaires

Rédigé par Bliz

Publié dans #angular