Catégorie archive ‘ Développement ’

the prefuse visualization toolkit

Tags , , ,
9 janvier 2008 par Yohann CIURLIK

Tout est dans le titre. En effet, je souhaitais vous parler d’un ensemble d’outils destinés à la visualisation nommé Prefuse.

Prefuse est un ensemble d’outils pour créer des diagrammes, visualisées des données de manière interactive, des cartographies, de relations et pleins d’autres choses inimaginables.

A la manière des outils de visualisations de données pour le Web présentés par l’excellent Smashing Magazine, Prefuse permet de customiser de simples relations pour en faire des instruments vraiment très interactifs.

On pourra alors créer des choses simples comme

ou des choses plus évoluées comme

ou

Cette librairie est développé en Java. Elle s’utilisera donc avec des interfaces Swing ou des applet via la JPrefuseApplet. A noter qu’il existe également une version orientée Flash via Flare, une librairie ActionScript 3.

Voici une petite vidéo de démonstration pour voir ce que l’on peut réaliser :

Tout sur le site http://prefuse.org/.A essayer dans le même genre : Jung (Java Universal Network/Graph).

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Encodage des flux en J2EE

Tags , ,
19 décembre 2007 par Yohann CIURLIK

Si il y a bien un problème récurant en développement, c’est celui de l’encodage des caractères. On attend avec impatience le support de l’unicode avec PHP 6.… En J2EE, il n’y à pas le choix, il faut coder des filtre, à moins que je sois passé à côté de la solution miracle.

Une solution avec un filtre de servlet fourni par Seb qui fonctionne pour n’importe quel encodage:

1°) Il faut écrire un filtre de servlet qui va réencoder le flux avant envoi au client :

  1. import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;
  2.  
  3. import javax.servlet.ServletResponse;
  4.  
  5. public class EncodingFilter implements javax.servlet.Filter {
  6.  
  7. private String encoding;
  8.  
  9. public void init(FilterConfig filterConfig) throws ServletException {
  10.  
  11. this.encoding = filterConfig.getInitParameter("encoding");
  12.  
  13. }
  14.  
  15. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,  ServletException {
  16.  
  17. request.setCharacterEncoding(encoding);
  18.  
  19. filterChain.doFilter(request, response);
  20.  
  21. }
  22.  
  23. public void destroy() {
  24.  
  25. }
  26.  
  27. }

2°) Il faut ensuite faire appel à ce filtre par l’intérmediaire d’un mapping dans le fichier web.xml comme suit :

  1. <filter> <filter-name>Encoding Filter</filter-name>
  2.  
  3. <filter-class>EncodingFilter</filter-class>
  4.  
  5. <init-param>
  6.  
  7. <param-name>encoding</param-name>
  8.  
  9. <param-value>UTF-8</param-value>
  10.  
  11. </init-param>
  12.  
  13. </filter>
  14.  
  15. <filter-mapping>
  16.  
  17. <filter-name>Encoding Filter</filter-name>
  18.  
  19. <url-pattern>/*</url-pattern>
  20.  
  21. </filter-mapping>

Maintenant toutes les requêtes sont correctements lues avec l’encodage UTF-8.
Le filtre fonctionne tout autre encodage.

Une autre solution consiste à utiliser le servlet filter CharacterEncodingFilter dans le fichier web.xml afin de forcer l’encodage. Il est important de mettre ce filtre en premier dans la liste.

  1. <web-app><filter>
  2.  
  3. <filter-name>encodingFilter</filter-name>
  4.  
  5. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  6.  
  7. <init-param>
  8.  
  9. <param-name>encoding</param-name>
  10.  
  11. <param-value>UTF-8</param-value>
  12.  
  13. </init-param>
  14.  
  15. <init-param>
  16.  
  17. <param-name>forceEncoding</param-name>
  18.  
  19. <param-value>true</param-value>
  20.  
  21. </init-param>
  22.  
  23. </filter>
  24.  
  25. </web-app>

Voilà tout ! Pour ma part, j’ai utilisé la première solution qui à résolu pas mal de mes soucis au niveau des formulaires de saisies d’informations.

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

OpenCV : Librairie C++ de gestion vidéo & webcam

Tags , ,
29 novembre 2007 par Yohann CIURLIK

Pour un projet en SDL, j’ai eu besoin d’utiliser la webcam pour faire de l’acquisition. L’idée était au départ de créer un jeu piloté via la webcam (à la manière de EyeToy sur Playstation).

J’ai commencé par utiliser le driver Cap de Windows via cette classe de gestion de webcam :

Fichier Webcam.c

  1. // WebCam.cpp: implementation of the WebCam class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #include "WebCam.h"
  6.  
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10.  
  11. WebCam::WebCam()
  12. {
  13.         //Créé une surface sur laquel on va pouvoir mettre l’image charger depuis la cam
  14.         image = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 240, 32, 0xFF000000, 0×00FF0000, 0×0000FF00, 0×000000FF);
  15.         if ( image == NULL ) {                                  fprintf(stderr, "Impossible de creer la surface de la classe WebCam: %s\n", SDL_GetError());                           
  16.     }   
  17. }
  18.  
  19.  
  20. WebCam::~WebCam()
  21. {
  22.  
  23. }
  24.  
  25. bool WebCam::Connect()
  26. {
  27.         //Récupère le Hwnd et le HDC de la fenètre SDL
  28.         SDL_SysWMinfo wmInfo;
  29.         SDL_VERSION(&wmInfo.version);
  30.         SDL_GetWMInfo(&wmInfo);
  31.         WebCam::hWnd = wmInfo.window;
  32.         WebCam::hDC = GetDC(WebCam::hWnd);
  33.  
  34.         //Connection a la webcam
  35.         hWnd_WC = capCreateCaptureWindow("WebCam", WS_CHILD, 0, 0, 1, 1, hWnd, 0);     
  36.  
  37.         //Vérifie la connection
  38.         if(!capDriverConnect(hWnd_WC, 0))
  39.         {
  40.                 MessageBox(NULL, "Erreur lors de l’initialisation de la WebCam.\nReportez-vous à l’aide pour plus d’information.", "Erreur", MB_ICONERROR);
  41.                 return FALSE;
  42.         }
  43.  
  44.         //trouve le HDC associé a la cam
  45.         hDC_WC = GetDC(hWnd_WC);
  46.         return TRUE;   
  47. }
  48.  
  49. void WebCam::StopConnect()
  50. {
  51.         //Déconnect
  52.         capDriverDisconnect(hWnd_WC);
  53. }
  54.  
  55. void WebCam::GetImage_Init()
  56. {
  57.         BITMAPINFO bmpinfo;
  58.  
  59. //      capDlgVideoDisplay( hWnd_WC );
  60. //      capDlgVideoFormat ( hWnd_WC );
  61. //      capDlgVideoSource ( hWnd_WC );
  62.  
  63.         //Modifie les infos de la cam, et initialise la cam pour récuperer des image 320*240
  64.         capGetVideoFormat(hWnd_WC, &bmpinfo, sizeof(BITMAPINFO));
  65.  
  66.         bmpinfo.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
  67.         bmpinfo.bmiHeader.biWidth       = 320;
  68.         bmpinfo.bmiHeader.biHeight      = 240;
  69.         if(!capSetVideoFormat(hWnd_WC, &bmpinfo, sizeof(BITMAPINFO)))
  70.         {
  71.                 printf("erreur durant le setvideoformat\n");           
  72.         }
  73.  
  74.         //Définni la fonction de Callback en cas de nouvelle image     
  75.         capSetCallbackOnFrame(hWnd_WC, Main_CallBack);
  76. }
  77.  
  78. void WebCam::GetImage()
  79. {
  80.         //Charge une image
  81.         capCaptureSingleFrameOpen(hWnd_WC);
  82.         capCaptureSingleFrame(hWnd_WC);
  83.         capCaptureSingleFrameClose(hWnd_WC);
  84. }
  85.  
  86. void WebCam::CallBack(HWND hWnd, LPVIDEOHDR lpVHdr)
  87. {       
  88.         //Copie le buffer de la cam ds une surface SDL
  89.         SDL_LockSurface(WebCam::image);
  90.         for(unsigned int i=0;i<lpVHdr->dwBufferLength/3;i++)
  91.         {
  92.                 putpixel(WebCam::image,  319-i%320,     239-i/320,      SDL_MapRGB(WebCam::image->format, lpVHdr->lpData[i*3]+2, lpVHdr->lpData[i*3+1] , lpVHdr->lpData[i*3]));
  93.         }
  94.         SDL_UnlockSurface(WebCam::image);       
  95. }

fichier Webcam.h

  1. // WebCam.h: interface for the WebCam class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #if !defined(AFX_WEBCAM_H)
  6. #define AFX_WEBCAM_H
  7.  
  8.         #include <stdio.h>
  9.         #include <windows.h>
  10.         #include <vfw.h>
  11.        
  12.         #include <SDL\\SDL.h>
  13.  
  14.         #include "main.h"
  15.  
  16.         class WebCam  
  17.         {
  18.         public:
  19.                 WebCam();
  20.                 virtual ~WebCam();
  21.  
  22.                 bool WebCam::Connect()
  23.                 void WebCam::StopConnect();
  24.                 void WebCam::GetImage();
  25.                 void WebCam::GetImage_Init();
  26.                 void WebCam::CallBack(HWND hWnd, LPVIDEOHDR lpVHdr);
  27.  
  28.                 HWND    hWnd;
  29.                 HWND    hWnd_WC;
  30.                 HDC             hDC;
  31.                 HDC             hDC_WC;
  32.  
  33.                 SDL_Surface *image;
  34.         };
  35.  
  36. #endif
  37.  

Puis j’ai trouvé la solution miracle !Une librairie complète permettant de gérer les flux vidéos et le traitement : OpenCV.

Cette librairie open-source permet de gérer des flux de tout type et permet de faire de la motion capture ou de la reconnaissance faciale aisément. Elle fait bien plus (gestion colorimétrique, luminosité, contraste, perspective, triangulation, détection de contours, …).

Quelques liens :

Screenshot d’un test de reconnaissance faciale avec une webcam de mauvaise qualité :

Test Reconnaissance faciale SDL

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Solution de e-commerce via Joomla

Tags , , , ,
24 octobre 2007 par Yohann CIURLIK

Dans un précédent article, je vous parlé de Magento et d’OsCommerce : 2 solutions de site E-commerce open-source.

Si vous préférez vous baser sur un CMS tel que Joomla, il existe cependant une autre solution pour faire son site d’E-commerce open-source. C’est VirtueMart !

Ce dernier gère des produits aux vendeurs, en passant par des catégories et sous-catégories, les expéditions, les taxes, les téléchargements…

virtueMart

Joomla est l’un des meilleurs CMS open-source du “marché” et l’ajout d’un composant comme VirtueMart (ce composant est le successeur de MamboPHPshop) le transforme en solution de commerce électronique clés en main !

Une version française customisée se trouve sur le site de JoomlaFrance et dvdhome-video.com est un site qui utilise ce composant pour son commerce de tous les jours.

Reste maintenant à se poser la question de l’utilité d’un CMS pour un site de commerce électronique sachant que des solutions comme Magento ou OsCommerce existent et possédent moins de bugs qu’un CMS de type Joomla.

Edit: Suite au commentaire de l’auteur de Joomla.fr, il m’était nécessaire d’apporter une petite modification dans mon article :

Je ne peux affirmer que Joomla soit plus bugger qu’OsCommerce et Cie. Certe, l’ajout de composants bugger ou en version bétà dans Joomla est considéré comme une faille potentiel dans votre système car ces composants n’ont pas reçus tous les tests de sécurité nécessaires. Il est donc important de faire attention à celà ! En installant des composants approuvé, vous n’aurez aucun problème.

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !

Outils Web 2.0 en vrac

Tags , ,
23 octobre 2007 par Yohann CIURLIK

Encore (encore ?!) une liste d’outils Ajax mais cette fois-ci en vrac! Des centaines de liens pour tous les gouts. Certains sont déjà très connus d’autres pas mais vous serons peut être utiles… Cette liste est présentée sous forme d’un post sur un forum (dont le sujet principal n’a rien à voir!). C’est ici !
Voici un post de qualité sur l’utilité d’Ajax en entreprise. Il explique, par l’exemple, comment intégrer Ajax dans des applications sans trop en faire. C’est sur le blog de nalis.

Et si vous ne connaissez toujours pas blogmarks, il est grand temps d’aller y faire un tour. Alors on commence par la page Ajax?

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !


sideBarQA