Fedora-Fr - Communauté francophone Fedora - Linux

Planet de Fedora-Fr : la communauté francophone autour de la distribution Linux Fedora

A propos

Cette page est actualisée toutes les heures.

Cette page est une sélection de blogs autour de Fedora. Fedora-Fr.org décline toute responsabilité au sujet des propos tenus par les auteurs des blogs de ce planet. Leurs propos sont leur entière responsabilité.

Le contenu de ce planet appartient à leurs auteurs respectifs. Merci de consulter leur blogs pour obtenir les licences respectives.

Darktable

Edouard Bourguignon

Si vous êtes passionnés de photo, ou simplement que vous disposez d'un reflex numérique, il existe déjà quelques bons logiciels sous Linux pour traiter les images RAW. Il y a depuis peu un petit nouveau très prometteur, il s'agit de Darktable (on apprecie le clin d'oeil dans le nom en rapport avec Adobe Lightroom).

darktable 0.6

Darktable est sortie en version 0.6 à la fin du mois d'août et il est déjà suffisamment fonctionnel pour l'utiliser. Il dispose des fonctionnalités principales suivantes:

  • Une édition des images complètement non destructive (souvent les logiciels de traitement ne savent pas prendre en compte toutes les informations de l'image).
  • Les opérations sur les images sont modulaires et extensibles (support des plug-ins)
  • Des requêtes de base de données flexibles, gestion avancée des tags
  • Notation des images
  • Support de nombreux standards pour l'importation (jpeg, cr2, hdr, pfm, etc)
  • Une interface sans latence, plein écran et zoomable
  • Des opérations évoluées sur les images: rotation/rognage, correction des couleurs, gestion des profils de couleurs, contrôle de l'exposition, zone flexible de correspondance des couleurs (ex rendre toutes les couleurs monochrome sauf le rouge, imiter un filtre polarisant, etc), correction des distorsions des objectifs (grâce à lensfun), balance des blancs, courbes, etc
  • Support des profils icc: sRGB, Adobe RGB, xyz, et RGB linéaire.
  • Exportation vers différents formats (.jpg, .png, .tiff) mais aussi en 16 bits (.ppm et .tiff) et en HDR linéaire (.exr, .pfm)
  • Lecture et écriture des données EXIF (grâce à libexiv2)
  • Re-importation automatique des images si celles-ci ont été modifié entre temps (grâce à inotify)
  • Fonctionne sous Linux et Mac OS X
  • Système d'exportation modulaire supportant les albums picasaweb, sur disque ou par mail.
  • Des plugins artistiques

Du coup, j'ai fais une demande pour packager ce logiciel, il est maintenant dans les dépôts update-testing et devrait être disponibles dans les jours qui suivent. N'hesitez pas à l'essayer:

su -c yum install --enablerepo=updates-testing darktable

PHP-FPM et LIGHTTPD

Remi Collet

Depuis PHP 5.3.3, le moteur PHP-FPM est intégré. Le paquet php-fpm est disponible dans le dépôt remi est sera bientôt aussi dans rawhide.

Cet article montre comment l'utiliser avec le serveur lighttpd.

L'objectif est de faire fonctionner un serveur Web pour des applications locales et pour des applications livrées en RPM, je prendrais phpMyAdmin comme exemple. 1. Installation : yum --enablerepo=remi install php-fpm phpMyAdmin lighttpd-fastcgiCette commande va aussi installer le serveur apache, qui écoute sur le port 80. Nous ne l'utiliserons... Lire PHP-FPM et LIGHTTPD

Fedora 14 Beta

Edouard Bourguignon

Si ce n'est pas déjà le cas, la Fedora 14 devrait être en version Beta depuis peu. J'avais déjà abordé les principales nouveautés de la Fedora 14 dans un précédent billet, version qui comme à chaque fois à l'air prometteuse. Mais je profite de ce court message pour rappeler l'importance de tester la version Beta, car c'est le moment ou jamais de faire corriger certaines choses. Il est important de tester l'installation depuis les media de la F14, afin de voir si tout ce passe bien niveau matériel, nous sommes d'ailleurs dans les derniers Fedora Tests Days et si vous souhaitez contribuer aux Logiciels Libres: QA/Fedora_14_test_days

Aujourd'hui c'est le grand jour pour tester le pilote libre nouveau pour les cartes NVIDIA. Pour cela il suffit de se rendre sur la page Test_Day:2010-09-28_Nouveau, de faire les différents tests et de rapporter les résultats dans le tableau. Pour ma part c'est presque un sans faute, je n'ai vraiment plus besoin des pilotes proprio maintenant.

Demain (29 septembre 2010) sera le grand jour pour tester les pilotes libres ATI/AMD pour cartes RADEON: Test_Day:2010-09-29_Radeon. Le 30 septembre sera réservé pour les pilotes INTEL: Test_Day:2010-09-30_Intel.

A noter qu'un LiveCD basé sur la Fedora 14 et dédié à ces tests est disponibles, facilitant ainsi les tests. Et pour le moindre problème il y a leur canal IRC #fedora-test-day.

Mardi Artistique : Gcolor2 - Une palette de couleur bien pratique

Paquet Fedora du jour

Gcolor2Aujourd'hui je profite de 5 minutes de mon temps pour vous présenter un outil bien pratique lors de la rélisation d'un site Internet, d'icones ou tout simplement lors de la réalisation d'une oeuvre nécéssitant de la couleur !

Gcolor2 est un palette de couleur simple et dépourvu de toute autre fonctionnalité que celle de vous donner la valeur exacte d'une couleur en hexadécimale. Fonctionnalité qu'elle remplie pleinement. Cette palette se base sur GTK+2 et est évidemment libre.

Installation en ligne de commande : yum install gcolor2

Installation avec l'interface graphique : Graphisme > A simple color selector for GTK+2

Localisation dans le menu : Applications > Graphisme > GColor2

Lancement en ligne de commande : /usr/bin/gcolor2

Site web : http://gcolor2.sourceforge.net/

PHP-FPM et NGINX

Remi Collet

Depuis PHP 5.3.3, le moteur PHP-FPM est intégré. Le paquet php-fpm est disponible dans le dépôt remi est sera bientôt aussi dans rawhide.

Cet article montre comment l'utiliser avec le serveur nginx.

L'objectif est de faire fonctionner un serveur Web pour des applications locales et pour des applications livrées en RPM, je prendrais phpMyAdmin comme exemple. 1. Installation : yum --enablerepo=remi install php-fpm nginx phpMyAdminCette commande va aussi installer le serveur apache, qui écoute sur le port 80. Nous ne l'utiliserons pas mais... Lire PHP-FPM et NGINX

Mon serveur Zeus à rendu l’âme :(

Antoine Wallon Une triste nouvelle pour moi aujourd’hui, le serveur zeus qui hébergeait le site et les email à rendu l’ame (le serveur démarre mais il fait des « clac… clac » au niveau de la carte mère). Par chance j’ai pu tout récupérer pour le stocker sur mon second serveur ACTES et ainsi remettre la quasi totalité des [...]

mysql-5.1.51

Remi Collet

Les RPM de MySQL Community Server 5.1.51 GA sont disponibles dans le dépôt remi pour EL 4 & 5 et pour Fedora. Voir le Changelog.

Cette construction utilise un fichier .spec proche de celui de Rawhide.  Le nouveau plugin InnoDB (version 1.0.12 GA) est aussi disponible, le fichier de configuration (/etc/my.cnf) contient les options pour l'activer. ATTENTION : avant la mise à jour, une sauvegarde de vos bases de données est très vivement conseillée (un vidage avec mysqldump... Lire mysql-5.1.51

PHPUnit 3.5

Remi Collet

Les RPM de la dernière version de l'outil pour réaliser des tests unitaires en PHP sont disponibles dans le dépôt remi pour fedora 12 à 14 et remi-test pour EL-5.

Site officiel : www.phpunit.de Documentation : PHPUnit 3.5 Manual Pour cette nouvelle version, les développeurs du projet ont éclaté les sources en plusieurs paquets. De ce fait on doit désormais installer de nouvelles dépendances : php-phpunit-PHP-TokenStream-1.0.0. (Mise à jour en cours) php-phpunit-PHP-Timer-1.0.0 (Revue #615208, approuvée)... Lire PHPUnit 3.5

Open Hardware Summit 2010

Patrice Kadionik

Salut.

Il y a eu le 23 septembre le "Open Hardware Summit" 2010 à New York sur le Matériel Libre. Dans la lignée du Logiciel Libre, le matériel se libère de ses chaînes...

++

Retour sur la journée eZ parisienne du mardi 21 septembre 2010

Guillaume Kulakowski

Mardi dernier se tenait à l'espace Kiron la journée eZ. L'occasion pour se rencontrer entre clients, experts et éditeurs. A travers ce billet, je vais tenter de vous en faire un rapide résumé pas forcément d'en l'ordre chronologique.

Présentation du nouveau modèle de distribution

Il n'est jamais aisé pour une société de scinder son unique produit en 2 :

  • une version communautaire (généralement appelée « projet »),
  • et une version enterprise (appelée produit).

Il y a de très bons exemples de réussite, je ne citerai que Fedora / Red Hat, mais aussi (et surtout) de moins bon. Bref les commerciaux/dirigeants se sont efforcés de nous dire que cette scission serait une bonne chose, que l'innovation serait portée par la version communautaire et que la version enterprise subirait plus de QA.

Pour faire simple :

  • Le projet communautaire portera l'innovation. C'est là que les développeurs d'eZ System ainsi que la communauté apporteront les nouvelles fonctionnalités.
  • Le produit enterprise quant à lui n'aura pas de développeur mais juste des équipes QA. Il portera la stabilité. C'est lui qui recevra les patchs correctifs.

Remarque intéressante, contrairement à Fedora / Red Hat, le cycle de vie d'eZ Publish community et enterprise sera le même : une version tous les 6 mois. Je trouve cela très ambitieux quand on voit que l'innovation de Fedora met 2 ans à être stabilisée dans Red Hat. eZ Publish n'est pas une distribution Linux mais je pense que 2 release communautaires pour 1 release enterprise serait plus raisonnable. Surtout que personnellement généralement je conseille à mes client de sauter une version et de ne faire qu'une mise à jour sur 2.

Personnellement, je suis curieux de voir comment les choses vont évoluer mais je pense que cette scission peut apporter de bonnes choses.

Lors de cette présentation des teasers sur la future homepage d'eZ.no nous ont été présentés. L'idée est de marquer encore plus la différence entre le site communautaire (share.ez.no) et le site plus pro (ez.no).

De SVN à Git

Autre point, le passage vers GitHub. Les sources d'eZ Publish ne seront plus disponible via leur SVN mais via GIT (un autre VCS) à partir de la forge GitHub. Pour ceux qui ne connaissent pas GitHub, il s'agit d'une plateforme de VCS décentralisé et social où l'un peu commenter les commits des autres, de forker rapidement un projet, etc... Bref une bonne nouvelle, le nombre de personne contribuant au kernel (committeurs) d'eZ devrait augmenter. L'assemblée semblait inquiète du nombre de commiteurs autorisés sur le projet. Pour moi c'est un faux procès, l'avantage des VCS décentralisés est de mettre fin à la dictature du commit et de favoriser le pull. Vous pouvez en effet forker eZ Publish, les développeurs en seront avertis et pourront par la suite puller vos modifications pour les intégrer au kernel.

Le projet communautaire

Afin de porter sérieusement le projet, la communauté d'eZ Publish devrait s'armer d'une instance décisionnelle (board) afin de fixer la direction prise par le projet. Ce point là est particulièrement intéressant. En effet, tous les projets Open Source d'ambition (Debian, Fedora, etc...) possèdent se genre de structure afin de driver les participations.

Présentation de la version 4.4 d'eZ Publish

La présentation de la 4.4 s'est un peu divisée en 2. Une première partie moins technique le matin devant les clients, et une partie plus techos lors du track communautaire.

  • L'admin2 s'enrichie encore de fonctionnalités AJAX afin de la rendre encore plus ergonomique
  • L'éditeur d'image en ligne qui permet notamment :
    • de cropper
    • de rajouter des watermarks
    • de flouter des visages
    • etc...
  • eZ Network : La version Enterprise possède une extension appelée eZ Network permettant de monitorer l'instance eZ et de gérer les tickets en cour chez eZ. L'identification au portail client se fera via un SSO basé sous oAuth.
  • Nouveau datatype vidéo avec support des vidéos HTML 5. La volonté affichée et de mettre plus de HTML5 dans eZ
  • Gestion des commentaires avec eZ Comment.
  • eZ Find le moteur de recherche évolué d'eZ se trouve enrichit d'une recherche avec autocompletion come pour Google Suggest
  • CJW Newsletter sera la solution de newsletter officielle d'eZ Publish enterprise. La version communautaire sera disponible sur project.ez.no.
  • Nouveau système de session. Actuellement les sessions sont portées par la base de données. C'est bien en mode cluster vu que nous pouvons partager une même session sur un ensemble de serveurs apache mais le problème c'est que c'est couteux en ressources. La solution est donc de revenir à une session en mode file system. Quid du partage de sessions entre les différentes machines d'un cluster d'apache ? Et bien ce partage passe par un serveur de session voir un cluster de serveur de session...
  • Le système de session est aussi simplifié puisque les utilisateurs anonymes ne génèreront plus une session automatiquement et inutilement. Du coup on gagne en performance (c'est fou comme ne pas faire de traitement inutile fait gagner en performance ;-)).
  • Toujours dans le gain de performance, les fichiers de configuration .php et .apend ne seront plus utilisés. Seul les .ini et les .ini.append.php seront utilisés. Du coup, 2 fois moins I/O pour la gestion des settings donc de meilleures performances.
  • Autre nouveauté le Toolkit d'archivage. Pourquoi un archivage ? Car à partir d'10.000.000 d'objets eZ Publish lague. L'idée de ce système et d'aller au delà de 10.000.000 d'objets en stockant les objets dans un moteur XML donc pas en objets ;-)... Les nouveaux objets archivés sont donc stockés en XML hors de l'arborescence eZ Publish On les requête non plus avec des fetch classiques mais avec eZ Find. On est donc purement dans une initiative noSQL donc de performances.
  • Autre nouveauté bien pratique, les sections auront des identifiants en plus des ids. Il est en effet plus facile de manipuler un string unique qu'un id numéraire.
  • eZ Publish 4.4 introduira en bêta la nouvelle API.L'idée est d'avoir un max de retours pour la stabiliser en 4.5. Son but est de faciliter la manipulation d'eZ par des non experts eZ. Cette nouvelle API comprendra aussi une API REST. Au final cette nouvelle API sera une couche de haut niveau entre l'API actuelle (qui demeurera) et le développeur.
  • Amélioration du module d'export XML introduit en 4.3
  • L'ezinfo.php laisse sa place à un fichier XML. Ce fichier, en plus de définir l'extension, en définit aussi les dépendances permettant alors de charger une extension après une autre.

Pour résumer, le but est de faire d'eZ Publih quelque chose :

  • de plus HTML 5
  • de plus simple pour les développeurs / intégrateurs
  • de plus communicant

Une petite remarque (troll) sur l'éditeur d'image. Ce dernier utilise à la fois les librairies jQuery et YUI. Une fois de plus eZ Publish a le cul assis entre ces 2 framework JS. Je trouve regrettable de ne pas trancher pour l'un deux (jQuery par exemple ;-)) et de dégager l'autre (YUI !).

Roadmap de la 4.5

La version 4.4 n'est même pas encore sortie que l'on parle déjà de la 4.5 attendue pour Mars 2011.

  • Extension mobile
  • Workflow avec support des objects states ! Enfin on va avoir 1 vrai workflow et non pas 2 bouts de workflow
  • Cosmétique sur eZ Flow avec notamment eZWT qui devrait avoir un look plus admin2. Du coup La toolbar devrait demander moins d'intégration.
  • Version finale de la nouvelle API
  • Gestion de souscriptions récurrentes (abonnement, etc..)
  • Support de sémantique Web
  • eZ Network permettra de livrer des patch !

eXtend

La forge projects.ez.no sera confortée dans son rôle de forge communautaire et une nouvelle forge devrait arriver pour les applications certifiées. Appelée eXtend, les applications y seront publiées sur le modèle de la version enterprise.

SQLiImport

Jérôme Vieilledent nous a fait une présentation très intéressante de SQLiImport disponible en licence GPL. Cette extension permet :

  • L'import de données on shoot
  • L'import de données scheduled
  • De suivre l'avancement d'un import
  • D'arrêter un import
  • D'importer facilement grâce à un API simplifié
  • etc...

Bref, j'ai hâte d'avoir de l'importation à faire dans un projet ;-).

Troll de l'après midi

Gille Guirant reponsable technique chez Kaliop (mon ancienne boite) nous a fait une keynote sous le signe des vérités qui dérangent : les points faibles d'eZ Publish et les axes d'améliorations qui pourraient s'en suivre avec une touche de fonctionnel :

  • L'export RSS qui ne passe pas par des système de templates
  • Les outils dangereux (RAD, activations des extension, édition de settings et de template depuis l'admin).
  • Les custom tg dont on se sert toujours et qui ne sont pas built-in (Youtube, etc..)
  • La gestion des workflows (toujours elle)
  • etc..

Bref, une journée riche et intéressante aussi bien dans les prise de contact que dans les aspects techniques.

MySQL Community Server 5.5.6 RC

Remi Collet

Les RPM de la première Release Candidate de MySQL Community Server 5.5 sont disponibles dans le dépôt remi-test pour fedora 13, 14 et EL 5.

A lire : Introduction to MySQL 5.5 Changes in MySQL 5.5.6 MySQL 5.5 Reference Manual Cette construction utilise un fichier spec proche de celui de Rawhide. Les moteurs Federated, Archive et Blackhole sont fournis sous forme d'extension, voir les commentaires dans le fichier de configuration.. ATTENTION : avant la mise à jour, une... Lire MySQL Community Server 5.5.6 RC

tora-2.1.3

Remi Collet

Les RPM de la nouvelle version de TOra - Toolkit For Oracle, sont disponibles dans le dépôt remi pour Fedora 10 à 14.

Le site propose aussi des RPM pour Fedora 12. Pour fonctionner, il est nécessaire de disposer des RPM Oracle Instant Client. Pour l'installer, comme toujours : yum --enablerepo=remi install toraCet outil permet de gérer vos bases de données Oracle, PostgreSQL et MySQL. Ce logiciel, bien que GPLv2 n'est pas intégrable dans les dépôts de la... Lire tora-2.1.3

mysql-worbench-5.2.28

Remi Collet

MySQL Worbench, l'outil de modélisation graphique, de développement, de requêtage et d'administration des bases de données MySQL passe en version 5.2.28 (GA = stable). Les RPM pour Fedora 11 à 14 sont disponibles dans le dépôt remi.

Voir la Releases Page pour la liste des modifications ou Changes in MySQL Workbench 5.2.28. Le site de téléchargement propose uniquement des RPM pour Fedora 13 i386 et x86_64. Mon dépôt contient ceux pour Fedora 11, 12, 13 et 14, ainsi que ceux pour les architectures ppc et ppc64 (F-12). Les plus anciennes versions ne disposent pas des... Lire mysql-worbench-5.2.28

Making a web application as JEE in D Programming

Jonathan Mercier

Hello dear reader,
Today I present to you how to create a web application in D with Tango and Mango

Prerequisites

Repo for D programming

Add D repository as explained here: repo for D programming
Then install the mango-devel package

$ su -c 'yum install mango-devel'

FireWall

You need :

  • Open ports 8080 tcp and udp
  • Start httpd service
$ su -c 'service httpd start'

Software Architecture

.
|-- fr
|   `-- bioinfornatics
|       `-- bioinformatic
|           |-- controller
|           |   `-- Controller.d
|           |-- main.d
|           |-- model
|           `-- view
|               |-- Home.d
|               `-- Introduction.d

PFor this:

$ mkdir -p fr/bioinfornatics/bioinformatic/controller  fr/bioinfornatics/bioinformatic/viewfr/ bioinfornatics/bioinformatic/model

Code example

File main.d

module fr.bioinfornatics.bioinformatic.main;
private import tango.util.log.Log                                   : Log, Logger;
private import tango.net.InternetAddress                            : InternetAddress;
private import mango.net.servlet.ServletProvider                    : ServletProvider;
private import mango.net.servlet.ServletContext                     : ServletContext;
private import mango.net.http.server.HttpServer                     : HttpServer;
private import mango.net.servlet.tools.AdminServlet                 : AdminServlet;
private import fr.bioinfornatics.bioinformatic.controller.Controller: Controller;
 
void main(){
    Logger logger           = Log.lookup("fr.bioinfornatics.bioinformatic.main");
    // Construct a servlet-provider
    ServletProvider sp      = new ServletProvider(logger);
    logger.info ("registering servlets");
    // Create a log-admin servlet
    new AdminServlet (sp, sp.getDefaultContext);
    // Create a controller object for request uri web page
    Controller controller   = new Controller(logger);
    // Create a context for D_Programming servlets
    ServletContext context  = sp.addContext(new ServletContext (""));
    // Map all requests to our controller servlet
    sp.addMapping("/",                                          sp.addServlet (controller, context));
    sp.addMapping("/introduction",                              sp.addServlet (controller, context));
    sp.addMapping("/first_programm",                            sp.addServlet (controller, context));
    sp.addMapping("/basics_of_imperative_programming_language", sp.addServlet (controller, context));
    sp.addMapping("/object_oriented_programming",               sp.addServlet (controller, context));
    // Bind to port 80 on a local address
    InternetAddress addr    = new InternetAddress (8080);
    // Create a (1 thread) server using the ServiceProvider to service requests
    HttpServer server       = new HttpServer (sp, addr, 1, logger);
    // Start listening for requests (but this thread does not listen)
    logger.info("starting server");
    server.start;
}

Logger is a practical purpose to list the different events
We create an instance of class Controller, this item will receive different context that is defined later and redirect to the appropriate page
Then we create an instance of the ServletContext class that will handle the different context (web pages) requested.
It defines address and port for access to web site using an instance of InternetAddress,here port is set to 8080.
Then we built the server with an instance of class: ServletProvider, InternetAddress, Logger and we start it.

File Controller.d

module fr.bioinfornatics.bioinformatic.controller.Controller;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for logging
private import tango.util.log.Log                       : Logger;
// for get uri
private import tango.net.model.UriView                 : UriView;
private import fr.bioinfornatics.bioinformatic.view.Introduction;
private import fr.bioinfornatics.bioinformatic.view.Home;
 
public class Controller : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Controller");
        logger.info("Controller object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        switch(request.uri.getPath){
            case "/introduction":
                Introduction introduction = new Introduction(logger);
                introduction.service(request,response);
                break;
            case "/first_programm":
                break;
            case "/basics_of_imperative_programming_language":
                break;
            case "/object_oriented_programming":
                break;
            default:
                Home home = new Home(logger);
                home.service(request,response);
                break;
        }
 
    }
}

The Controller and the servlet application's main website, her work is to verify the user requests such as urls and input fields user forms and then redirect to the requested page.

File Home.d

module fr.bioinfornatics.bioinformatic.view.Home;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for write content web page
private import tango.io.model.IConduit                  : OutputBuffer;
private import mango.io.protocol.model.IWriter          : IWriter;
private import tango.util.log.Log                       : Logger;
 
class Home : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Home");
        logger.info("Home object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        logger.info ("Request for Home");
        // say we are writing html
        response.setContentType ("text/html");
        // get the response output ...
        OutputBuffer output = response.buffer;
        // write HTML preamble ...
        output  ("<HTML>\n\t<HEAD>\n\t\t<TITLE>Home Page</TITLE>\n\t</HEAD>\n\t<BODY>\n\t\t"c)
                ("<P>Hello</P>\n\t\t"c)
                ("<UL>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/introduction\">Introduction</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/first_program\">First program</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/basics_of_imperative_programming_language\">Basics of imperative programming language</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/object_oriented_programming\">Object oriented programming</a>\n\t\t\t"c)
                ("</UL>\n\t"c)
                ("</BODY>\n</HTML>"c);
    }
 
}

This class is used to generate the HTML for the main page where the service method is invoked.

File Introduction.d

module fr.bioinfornatics.bioinformatic.view.Introduction;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for write content web page
private import tango.io.model.IConduit                  : OutputBuffer;
private import tango.util.log.Log                       : Logger;
 
class Introduction : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Introduction");
        logger.info("Introduction object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        logger.info ("Request for Introduction");
        // say we are writing html
        response.setContentType ("text/html");
        // get the response output ...
        OutputBuffer output = response.buffer;
        // write HTML preamble ...
        output  ("<HTML>\n\t<HEAD>\n\t\t<TITLE>Introduction</TITLE>\n\t</HEAD>\n\t<BODY>\n\t")
                ("<P>D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. Special attention is given to the needs of quality assurance, documentation, management, portability and reliability. The D language is statically typed and compiles directly to machine code. It's multiparadigm, supporting many programming styles: imperative, object oriented, and metaprogramming. It's a member of the C syntax family, and its appearance is very similar to that of C++. Here's a quick list of <a href=\"http://www.digitalmars.com/d/2.0/comparison.html\">features</a>.</P>\n\t"c)
                ("<P>It is not governed by a corporate agenda or any overarching theory of programming. The needs and contributions of the <a href=\"http://www.digitalmars.com/NewsGroup.html\">D programming community</a> form the direction it goes.</P>\n"c)
                ("</BODY>\n</HTML>"c);
    }
 
}

This class is used to generate the HTML page introduction where the service method is invoked.

Compile and run the web application

$ cd /path/to/my/project
$ ldc  -w -L -lmango $(find -name "*.d") -of example

No compiles in recovering all the files whose extension is *.d with mango library, executable name will beexample.
Then run application

$ ./example

Now open your web browser and go to localhost

Faire une application web en D comme en JEE

Jonathan Mercier

Bonjour cher lecteur,
Aujourd'hui je vous présente comment créé une application web en D avec Tango et Mango

Prérequis

Dépôt D

Ajouter le dépôt D comme expliqué ici: Depôt pour le langage D
Installer ensuite le paquet mango-devel

$ su -c 'yum install mango-devel'

Pare-Feu

Vous devez :

  • ouvrir les ports 8080 tcp et udp
  • démarrer le service httpd
$ su -c 'service httpd start'

Architecture Logiciel

.
|-- fr
|   `-- bioinfornatics
|       `-- bioinformatic
|           |-- controller
|           |   `-- Controller.d
|           |-- main.d
|           |-- model
|           `-- view
|               |-- Home.d
|               `-- Introduction.d

Pour cela:

$ mkdir -p fr/bioinfornatics/bioinformatic/controller  fr/bioinfornatics/bioinformatic/viewfr/ bioinfornatics/bioinformatic/model

Exemple de code

Fichier main.d

module fr.bioinfornatics.bioinformatic.main;
private import tango.util.log.Log                                   : Log, Logger;
private import tango.net.InternetAddress                            : InternetAddress;
private import mango.net.servlet.ServletProvider                    : ServletProvider;
private import mango.net.servlet.ServletContext                     : ServletContext;
private import mango.net.http.server.HttpServer                     : HttpServer;
private import mango.net.servlet.tools.AdminServlet                 : AdminServlet;
private import fr.bioinfornatics.bioinformatic.controller.Controller: Controller;
 
void main(){
    Logger logger           = Log.lookup("fr.bioinfornatics.bioinformatic.main");
    // Construct a servlet-provider
    ServletProvider sp      = new ServletProvider(logger);
    logger.info ("registering servlets");
    // Create a log-admin servlet
    new AdminServlet (sp, sp.getDefaultContext);
    // Create a controller object for request uri web page
    Controller controller   = new Controller(logger);
    // Create a context for D_Programming servlets
    ServletContext context  = sp.addContext(new ServletContext (""));
    // Map all requests to our controller servlet
    sp.addMapping("/",                                          sp.addServlet (controller, context));
    sp.addMapping("/introduction",                              sp.addServlet (controller, context));
    sp.addMapping("/first_programm",                            sp.addServlet (controller, context));
    sp.addMapping("/basics_of_imperative_programming_language", sp.addServlet (controller, context));
    sp.addMapping("/object_oriented_programming",               sp.addServlet (controller, context));
    // Bind to port 80 on a local address
    InternetAddress addr    = new InternetAddress (8080);
    // Create a (1 thread) server using the ServiceProvider to service requests
    HttpServer server       = new HttpServer (sp, addr, 1, logger);
    // Start listening for requests (but this thread does not listen)
    logger.info("starting server");
    server.start;
}

Logger est un objet pratique pour lister les différents évènements.
On créé une instance de la classe Controller, cet objet recevra les différents context que l'on défini après et redirigera vers la page approprié
Ensuite on crée une instance de la classe ServletContext qui gérera les différents context (pages web) existant.
On définit l'adresse et le port pour accéder au site à l'aide d'une instance de la classe InternetAddress ici on on définit le port 8080 pour accéder au site web
Ensuite on construit le serveur avec une instance des classes: ServletProvider, InternetAddress, Logger et on le démarre

Fichier Controller.d

module fr.bioinfornatics.bioinformatic.controller.Controller;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for logging
private import tango.util.log.Log                       : Logger;
// for get uri
private import tango.net.model.UriView                 : UriView;
private import fr.bioinfornatics.bioinformatic.view.Introduction;
private import fr.bioinfornatics.bioinformatic.view.Home;
 
public class Controller : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Controller");
        logger.info("Controller object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        switch(request.uri.getPath){
            case "/introduction":
                Introduction introduction = new Introduction(logger);
                introduction.service(request,response);
                break;
            case "/first_programm":
                break;
            case "/basics_of_imperative_programming_language":
                break;
            case "/object_oriented_programming":
                break;
            default:
                Home home = new Home(logger);
                home.service(request,response);
                break;
        }
 
    }
}

Le Controller et la servlet principale de l'application web, son travail sera de vérifier les demandes utilisateurs comme les urls entrée et les champs utilisateurs des formulaires puis de rediriger vers la page demandé.

Fichier Home.d

module fr.bioinfornatics.bioinformatic.view.Home;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for write content web page
private import tango.io.model.IConduit                  : OutputBuffer;
private import mango.io.protocol.model.IWriter          : IWriter;
private import tango.util.log.Log                       : Logger;
 
class Home : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Home");
        logger.info("Home object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        logger.info ("Request for Home");
        // say we are writing html
        response.setContentType ("text/html");
        // get the response output ...
        OutputBuffer output = response.buffer;
        // write HTML preamble ...
        output  ("<HTML>\n\t<HEAD>\n\t\t<TITLE>Home Page</TITLE>\n\t</HEAD>\n\t<BODY>\n\t\t"c)
                ("<P>Hello</P>\n\t\t"c)
                ("<UL>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/introduction\">Introduction</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/first_program\">First program</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/basics_of_imperative_programming_language\">Basics of imperative programming language</a>\n\t\t\t"c)
                ("<LI><a href=\"http://localhost:8080/object_oriented_programming\">Object oriented programming</a>\n\t\t\t"c)
                ("</UL>\n\t"c)
                ("</BODY>\n</HTML>"c);
    }
 
}

Cette classe permet de générer le code HTML de la page principale lorsque la méthode service est invoqué.

Fichier Introduction.d

module fr.bioinfornatics.bioinformatic.view.Introduction;
// for testing the servlet-engine
private import mango.net.servlet.Servlet                : Servlet;
private import mango.net.servlet.model.IServletRequest  : IServletRequest;
private import mango.net.servlet.model.IServletResponse : IServletResponse;
// for write content web page
private import tango.io.model.IConduit                  : OutputBuffer;
private import tango.util.log.Log                       : Logger;
 
class Introduction : Servlet{
    private Logger logger;
 
    public this(Logger log){
        logger = log;
        logger  = log.lookup("fr.bioinfornatics.bioinformatic.controller.Introduction");
        logger.info("Introduction object is constructed");
    }
 
    //Handle all the different request methods ...
    void service (IServletRequest request, IServletResponse response){
        logger.info ("Request for Introduction");
        // say we are writing html
        response.setContentType ("text/html");
        // get the response output ...
        OutputBuffer output = response.buffer;
        // write HTML preamble ...
        output  ("<HTML>\n\t<HEAD>\n\t\t<TITLE>Introduction</TITLE>\n\t</HEAD>\n\t<BODY>\n\t")
                ("<P>D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. Special attention is given to the needs of quality assurance, documentation, management, portability and reliability. The D language is statically typed and compiles directly to machine code. It's multiparadigm, supporting many programming styles: imperative, object oriented, and metaprogramming. It's a member of the C syntax family, and its appearance is very similar to that of C++. Here's a quick list of <a href=\"http://www.digitalmars.com/d/2.0/comparison.html\">features</a>.</P>\n\t"c)
                ("<P>It is not governed by a corporate agenda or any overarching theory of programming. The needs and contributions of the <a href=\"http://www.digitalmars.com/NewsGroup.html\">D programming community</a> form the direction it goes.</P>\n"c)
                ("</BODY>\n</HTML>"c);
    }
 
}

Cette classe permet de générer le code HTML de la page introduction lorsque la méthode service est invoqué.

Compiler et lancer l'application web

$ cd /path/to/my/project
$ ldc  -w -L -lmango $(find -name "*.d") -of example

On compile en récupérant tout les fichier dont l'extention est *.d contre la bibliothèque mango le nom de l'éxécutable sera example
Ensuite on lance l'application

$ ./example

Maintenant ouvrez votre navigateur web et allez sur localhost

A bientôt

Signé: bioinfornatics, Jonathan MERCIER

Laughlin

Remi Collet

Mon ordinateur principal fonctionne désormais avec Fedora 14 Beta (x86_64)... Lire Laughlin

firefox-3.6.10

Remi Collet

Les RPM de la nouvelle version du navigateur de la Fondation Mozilla sont disponibles dans le dépôt remi pour Fedora ≤ 12. Cette version est fournie en 74 langues, mais seule la langue courante est activée.

Commencez par lire : Notes de version de Firefox 3.6 Comme toujours : yum --enablerepo=remi update firefox Pas de mise à jour de xulrunner, ce RPM embarque son propre moteur Gecko. Beaucoup d'extensions sont désormais compatibles et fonctionnent correctement. Concernant l'extension Java, la version fournie avec OpenJDK ne fonctionne pas... Lire firefox-3.6.10

thunderbird-3.1.4

Remi Collet

Le RPM de la nouvelle version du client de messagerie de la Fondation Mozilla est disponible dans le dépôt remi pour fedora ≤ 12 (rétro-portage de la version F-13).

Commencez par lire : Thunderbird Release Notes (Notes de version en anglais) Comme toujours : yum --enablerepo=remi update thunderbird Les extensions enigmail (version 1.1.2) et lightning (version 1.0b2) sont aussi disponibles. Les RPM sont disponibles ici pour fedora 8 à 12.... Lire thunderbird-3.1.4

Firefox 4.0 Beta 6

Remi Collet

Les RPM de la sixième beta de la prochaine version majeure du navigateur de la Fondation Mozilla est disponible dans le dépôt remi pour Fedora 11, 12 et 13. Disponible en 39 langues.

Le paquet firefox4-4.0-0.10.beta6 installe cette nouvelle version à côté de la version 3.x. Vous aurez donc 2 options dans le menu Internet. ATTENTION : une sauvegarde de votre profil (dossier ~/.mozilla/firefox) est indispensable. Commencez par lire : Mozilla Firefox 4 Beta Release Notes (Notes de version en anglais) Nouvelle beta pour... Lire Firefox 4.0 Beta 6

D Programming with SDL and openGL

Jonathan Mercier

Hello dear reader,

Today I present to you how to make D program using 2D and 3D with SDL and OpenGL.

Prerequisites

Add the D repository as explained here: Repo for D-programming
Then install the packages Derelict-SDL and Derelict-GL, static libraries and development :

# yum install  derelict-SDL* derelict-GL*

Example

Create a file that contains main.d

private import Display;
private import derelict.sdl.sdl:    SDL_Event, SDL_PollEvent, SDL_QUIT;
 
void main(){
    bool    isRunning   = true;
    Display display     = new Display();
    scope(exit) display.cleanup();
    while(isRunning){
        isRunning = display.event();
        // clear the screen. by default it clears to black
        display.clear();
        //display graphic
        display.drawGLFrame();
    }
}
  1. We set a boolean to the main program loop
  2. We creates an instance of display class that we will its contents later
  3. When program will exit , it will execute mandatory display.cleanup ()
  4. So an event not give the order to leave (close button for example) a boolean will be true
    • It is refreshed image

Now create our file Display.d

private import derelict.sdl.sdl;
private import derelict.opengl.gl;
private import derelict.opengl.glu;
private import tango.stdc.stringz;
//private import tango.io.Stdout;
 
class Display{
    // horizontal and vertical screen resolution
    private uint height;
    private uint width;
    // number of bits per pixel used for display. 24 => true color
    private uint bitsPerPixel;
    // field of view => the angle our camera will see vertically
    private float fov;
    // distance of the near clipping plane
    private float nearPlane;
    // distance of the far clipping plane
    private float farPlane;
    /**
     * Setup some basic OpenGL parameters
     */
    private void setupGL(){
        // switch to the projection mode matrix
        glMatrixMode(GL_PROJECTION);
        // load the identity matrix for projection
        glLoadIdentity();
        // setup a perspective projection matrix
        gluPerspective(fov, cast(float)height / width, nearPlane, farPlane);
        // switch back to the modelview transformation matrix
        glMatrixMode(GL_MODELVIEW);
        // load the identity matrix for modelview
        glLoadIdentity();
    }
    /**
     * Library initializer
     */
    private void init(){
        // initialize SDL, GL and GLU Derelict modules
        DerelictSDL.load();
        DerelictGL.load();
        DerelictGLU.load();
        // initialize SDL's VIDEO module
        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
        // enable double-buffering
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        // create our OpenGL window
        SDL_SetVideoMode(height, width, bitsPerPixel, SDL_OPENGL);
        SDL_WM_SetCaption(toStringz("D is the best"), null);
        setupGL();
    }
    /**
     * Constructor
     */
    public this(){
        height      = 800;
        width       = 600;
        bitsPerPixel= 24;
        fov         = 90;
        nearPlane   = 0.1f;
        farPlane    = 100.f;
        init();
    }
    public ~this(){
        //cleanup();
    }
    /**
     * be nice and release all resources
     */
    public static void cleanup(){
        // tell SDL to quit
        if(SDL_Quit !is null)
            SDL_Quit();
        // release GL, GLU and SDL's shared libs
        DerelictGLU.unload();
        DerelictGL.unload();
        DerelictSDL.unload();
    }
    public void clear(){
        glClear(GL_COLOR_BUFFER_BIT);
    }
    public void drawGLFrame(){
        glBegin(GL_TRIANGLES);
            glColor3f (1,  0,  0);
            glVertex3f(-1, -1, -2);
            glColor3f (0,  1,  0);
            glVertex3f(1, -1, -2);
            glColor3f (0,  0,  1);
            glVertex3f(0,  1, -2);
        glEnd();
        // swap the buffers, making our backbuffer the visible one
        SDL_GL_SwapBuffers();
    }
 
    public bool event(){
        bool isRunning = true;
        SDL_Event event;
        // handle all SDL events that we might've received in this loop iteration
        while(SDL_PollEvent(&event)){
            switch(event.type){
                // user has clicked on the window's close button
                case SDL_QUIT:
                    isRunning = false;
                    break;
                // by default, we do nothing => break from the switch
                default:
                    break;
            }
            //Stdout.formatln("event.type: {}",event.type);
        }
        return isRunning;
    }
}

Here we create a class to manage the display quel'on called Display.

It contains attributes for:

  • The resolution of a window (height, width)
  • The quality of the image (BitsPerPixel)
  • Camera angle (fov)
  • Specifies the minimum distance between the viewer from the plane (nearPlane)
  • Specifies the maximum distance between the viewer from the plan (farPlane)

The default constructor initializes the attributes and the OpenGL library / SDL by calling the init() function
The event function returns a boolean, false if it wishes to leave if true
The function drawGLFrame draw triangle
The static function cleanup is optional it ensures proper to leave

I will let you work on the code :)" class="smiley

Compilation

To compile the application you must specify the libraries with which it is bound to be here:

$ ldc -g -w -L -ldl -L -lDerelictGL -L -lDerelictGLU  -L -lDerelictSDL -L -lDerelictUtil *.d -of example

Produce an executable named example

Execution

Just after compiling

$ ./example

Result

Capture-D_is_the_best.png

It's beautiful

Link

Cheers

Signed: bioinfornatics, Jonathan MERCIER

Page générée le 14 avr 2014 à 16:22