mercredi 16 octobre 2013

Wercker


Build and deploy
#dartlang #continuousdelivery

Wercker est une plateforme de déploiement continue qui permet de builder et de déployer des applications. Depuis peu il est possible de l’utiliser pour builder des applications Dart !


En effet, Wercker est une plateforme ouverte, il est donc possible de définir une box, c’est-à-dire, la stack sur laquelle lancer le build. Ici la box Dart a été créée par un employé de l’entreprise, +Pieter Joost van de Sande, aussi auteur du plugin Dart sur Sublime Text 3. Il n’y a pas encore de step spécifique Dart mais il est très facile de configurer son projet pour le builder. Il suffit d’ajouter un fichier wercker.yml à la racine avec :

  box: wercker/dart
  build:
    steps:
      - script:
          name: build
          code: |
            pub install
      - script:
          name: test
          code: |
            dart --checked tool/hop_runner.dart test

Il ne reste plus qu’à déployer sur l’une des plateformes que propose Wercker, Heroku étant une possibilité grâce à l’Heroku Buildpack Dart (https://github.com/igrigorik/heroku-buildpack-dart)

jeudi 3 octobre 2013

Event Loop

Tournez manège !
#dartlang #eventloop

L’asynchronisme dans Dart est présent quasiment partout dans le SDK. Une bonne partie des fonctions retournent des futures ou des streams dès que l’on utilise l’I/O, les events du DOM, ou bien encore les Timers. Il est donc nécessaire d’avoir une architecture pour exécuter ces événements en asynchrone, à savoir une boucle d’événements (event loop). L’article suivant décrit sont fonctionnement :


Ce qu’il faut retenir :
  → Cette architecture s’applique à la fois pour les applications qui tourne sur la VM (standalone ou embarquée dans Dartium), que le code compilé en JavaScript par dart2js
  → Le code Dart s’exécute dans un seul Thread (pour exécuter du code en parallèle, cf. les Isolates ou les WebWorkers)
  → Il existe deux fils d’exécution dans la boucle d'évènements
    ↳ L’event queue qui contient tous les événements extérieurs dont l’I/O, les events du DOM, les Timers, les messages entre Isolates, etc.
    ↳ La microtask queue qui ne contient pour le moment que des tâches qui viennent du code Dart. Cette queue est nécessaire car le code répondant à un événement a parfois besoin de s’exécuter plus tard mais avant l’événement suivant.
    ⇒ Donc la microtask queue a priorité sur l’event queue !

Comment ajouter un événement ou une tâche dans ces queues :
  → new Future() et new Future.delayed() ajoutent un event dans l’event queue.
  → runAsync() ajoute une tâche dans la microtask queue

Ce qu’il faut savoir sur les Futures :
  → La fonction passée à la méthode then est exécutée immédiatement après que le Future se termine. Sauf lorsque le Future est déjà terminé, alors une tâche pour exécuter la fonction est ajoutée à la microtask queue.
  → Faire future.then((_) {new Future(...)}) pour lancer le code qui doit suivre en asynchrone, en l’ajoutant  dans l’event queue.

Les dernières recommandations :
  → Dans la majorité des cas, préférer ajouter un événement dans  l’event queue.
  → Conserver la microtask queue aussi petite que possible pour ne pas squeezer l’event queue.
  → Pour les longs processus, utiliser plutôt les Isolates ou les WebWorkers pour une exécution en parallèle.