Blog java

 
Home
 
Blog java
 
Dematerialization blog
 
Web - technophilie - entreprenariat
 
Projets web et multimedia
 
Incubateur
 
   

Cloud java grand public
01/12/2010 05:28 PM

Voci un petit panorama des solutions de cloud (grand public) et gratuite (ou à peu près) dédiée à JAVA et prêtes à l'emploi.

Google app engine - http://code.google.com/intl/fr/appengine/

La solution phare est sans conteste Google App Engine ; outre des capacités Python, cette solution propose une solution Java basée avec intégration de memcache, le datastore bigtable (via datanucleus, pour une utilisation via JDP ou JPA), et des services google.

C‘est bien, c‘est gratuit, mais c‘est limité : classpath limité, absence de RDBMS, contraintes fortes à de débit et de volumes sur toutes les fonctionnalités.

Mor.ph - http://panel.mor.ph/

Solution de cloud pour PHP/JAVA et ROR, basée sur un stockage S3 et proposant MYSQL ou POSTGRESQL en base de données.

Des limitations cohérentes pour la version gratuite développeur (une heap de 128 mo).

Le scaling se fait à la demande avec un système de cubes.

C‘est gratuit (pour la version de base) avec RDBMS, semble fiable, mais cela n‘est pas très connu.

STAX.net - http://www.stax.net/

Solution de cloud pour JAVA (JSP/STRUTS/WICKET/GWT).

La version beta propose une instance à 256 mo de heap.

A terme la plateforme supportera S3.

C‘est gratuit, un peu limité, mais profondément en travaux. Je ne sais pas si cela peut raisonnablement être durablement utilisé.

CLOUDFOUNDRY - http://www.cloudfoundry.com/

Tout java (apache tomcat mysql) proposé sur un support S3. Annoncé comme supportant parfaitement grails, spring and co.

Testable uniquement avec un compte S3, pas de stockage propre. Des fonctionnalités avancées d‘adaptation au traffic.

A suivre !


Google app engine et java
04/10/2009 01:56 PM

Google app engine supporte officiellement java !

On retrouve le périmètre fonctionnel précédemment déployé avec Python ; c'est à dire :
- memcache
- les librairies google de manipulation d'image, d'envoi de mail et d'accès distant http
plus (+) :
- une implémentation de JPA, JDO

Techniquement c'est du java 6, et le classpath bien que réduit (à l'aide d'une whitelist référence ic : http://code.google.com/intl/fr/appengine/docs/java/jrewhitelist.html) est plutôt complet.

De ce fait beaucoup de framework (dont Spring) et meta-langages (dont groovy) tournent dessus. (référene ici : http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine)

Cependant n'espérez pas faire tourner dessus (pour l'instant) des web-app grails.

Incidemment vous pourrez vous rendre compte que le conteneur de servlet est un jetty.

Pour l'instant on est pas encore en beta, il s'agit d'un 'early look' et cela marche sur invitation ; pour obtenir la votre ici : http://appengine.google.com/promo/java_runtime

Je teste plus avant et vous en dit rapidement d'avantage.

Cette annonce tombe par ailleurs bien, étant en train de travailler sur un mini-panorama de solutions d'hébergements java orientées cloud à venir très bientôt sur ce blog.


Orientation des développements mobiles MIDP
02/06/2009 06:06 PM

Un développement d'application multimedia se fait toujours sur des pré-supposés en terme de cible d'exécution, pour des questions de performance, de fonctionnalité et de compatibilité.

Le développement d'application pour les téléphones portables à la norme MIDP n'échappe pas à cette règle.

Pour rappel et en résumé une implémentation java mobile sur un téléphone portable se décompose en :
- un coeur CLDC (Connected Limited Device Configuration) en version 1.0 ou 1.1 apportant VM, un socle de librairie java
- un profil MIDP (Mobile Information Device Profile) en version 1.0 ou 2.0 apportant les librairies nécessaires aux fonctionnements des applications mobiles (socle de base, connectivité internet, graphisme, stockage).
- des extensions diverses variées (appelées génériquement JSR) fournies par le constructeur pour le multimedia, l'envoi de SMS/MMS, l'accès au système de fichier, au PIM etc

Différentes choses à noter :
- l'ensemble CLDC/MIDP/JSR(s) est statique et ne peut être modifié par le client final (l'utilisateur du mobile).
- chaque constructeur créé une combinaison d'un ensemble CLDS/MIDP/JSR(s) pour chaque modèle (donc segmente le marché)
- le comportement des implémentations CLDC/MIDP/des JSR peut s'avérer différent d'une marque ou d'un modèle à l'autre

Donc de facto il est important :
- de bien connaître techniquement sa cible
- d'adopter sur le développement soit une approche défensive (un code générique) ou soit une approche ciblée (un code par modèle spécifique)

L'approche défensive repose :
- sur une compétence forte en terme de développement
- un testing fort au cours du développement et avant release
- une cible un peu plus réduite et des limitations fonctionnelles induites

L'approche ciblée repose :
- sur des framework / pré-compilateur (c'est une analogie) opensource comme J2ME-POLISH (http://www.j2mepolish.org/cms/) ou payant comme MOBILE DISTILLERY (http://www.mobile-distillery.com/home.htm)
- sur l'efficacité et le consistance en nombre du code proposé par la solution

Donc, au final il faut :
- identifier la cible de votre application mobile (étudiez les parts de marché par fabricant ou device avec http://stats.getjar.com/statistics/ par exemple)
- par fonctionnalité identifier les modèles compatibles avec par exemple http://devices.j2mepolish.org/interactivedb/welcome.faces
- choisir votre approche défensive ou ciblée


Tests unitaires et test d'intégration
01/19/2009 06:34 PM

Voici ce que je préconise aujourd'hui de raisonnable et efficace dans le domaine du testing pour le WEB JAVA.

Deux couches de tests.
- des tests unitaires
- des tests d'intégration

Pour ce qui est des tests unitaires :
- Des tests de couches java développés avec JUNIT : http://www.junit.org/
- Des tests de Web-services développés avec HTTPUNIT : http://httpunit.sourceforge.net/ (on m'a conseillé HTMLUNIT récemment mais pas encore testé : http://htmlunit.sourceforge.net/)
- Des tests d'UI web développés avec WEBDRIVER : http://code.google.com/p/webdriver/.

Evidemment les tests unitaires doivent :
- être développés durant la phase de dev
- être inclus dans le code source

Pour ce qui est des tests d'intégration :
- des tests manuels basés sur des cahiers de test ; obligatoire selon moi
- des tests d'interfaces web et de parcours basés sur Selenium : http://seleniumhq.org/
- des tests 'systèmes' (charge, concurrence etc) basés sur JMETER : http://jakarta.apache.org/jmeter/

Pour bien faire ensuite, envisagez un serveur d'intégration continue (TeamCity, Hudson, Cruise Control) pour générer vos projets à intervalles réguliers et surtout passer les tests unitaires régulièrement. Mais cela fera l'objet d'un projet article.

Mais attention votre enchainement de tests unitaires n'est qu'un outil de dev ; votre application ne sera validée qu'une fois les tests d'intégration passés.


Reference card pour les design pattern
02/16/2008 08:48 PM

Personnellement je suis très attaché 'reference card' (refcard), ces petites fiches synthétiques et gratuites, aide mémoire sur des sujets informatiques.

Une collection personnelle (et gratuite) est toujours disponbile ici :
http://www.npolive.net/refcard/

La petite dernière est une refcard à propos des design pattern ; elle est dispo ici :
http://www.npolive.net/refcard/design-pattern/designpatternscard.pdf

Elle faisait cruellement défaut. Donc un grand merci à son auteur :
http://www.mcdonaldland.info/2007/11/28/40/


Connection http dans une application MIDP sur un blackberry
02/16/2008 08:32 PM

Si comme moi vous développez des applications mobiles pour les terminaux midp, peut être serez vous confrontés à quelques problèmes sur la plateforme Blackberry, notamment du point de vue du retour http.

Voici quelques explications et quelques astuces à propos de http sur blackberry.

MIDP est implémenté et disponible sur les terminaux Blackberry. L'implémentation n'est pas limitée ni réduite sur les versions plus ou moins récentes (supérieure à 4.0).

Les applications Java sont supportées sous deux formes différentes sur la plateforme Blackberry :
- un MIDlet (un fichier jad et un fichier jar) ; pour un déploiement en ligne uniquement
- une application Blackberry (un fichier cod) ; pour un déploiement en side-loading par exemple

Le système Blackberry repose sur un système de communication (couplage) un peu particulier :
- d'un côté vous trouvez votre terminal et de l'autre vous trouvez...
- soit un BES (Blackberry Enterprise Server), serveur / passerelle à déployer au sein de l'entreprise, composant connecté notamment au serveur de l'entreprise
- soit un BIS (Blackberry Internet Service), serveur / passerelle déployé chez RIM et accessible spécifiquement chez votre opérateur mobile

Le push e-mail est supporté dans ces deux cas. Concernant internet...

- couplé à un BES, votre terminal sera à même de se connecter à internet si le-dit serveur est bien configuré pour cette utilisation (gestion des ports).

- couplé à un BIS, votre terminal sera capable de se connecter à internet

Cependant la capacité du serveur ne fait pas tout. En effet la connectivité internet est gérée application par application au sein du terminal Blackberry par un 'service book'. La preuve en est, vous pourrez être à même de naviguer sur le browser, utiliser gtalk et ne pas à être à même d'utiliser un MIDlet connecté...

Il y a donc un item de service book par application ; le service book est affichables dans les options. Le hic est que ces service book sont gérés et pushés par l'opérateur, donc vous ne pourrez pas créer votre configuration aux petits oignons pour votre application.
(Certains forums reportent des succès dans la connection http depuis java après la réception (demandée à l'opérateur) d'un service book 'Blackberry [IPPP]', je ne sais pas quoi en penser personnellement).

Est ce à dire que l'on ne peut pas se connecter en http depuis une application MIDP sur un blackberry ?

Non pas vraiment, il reste toujours la possibilité de passer par la passerelle wap de l'opérateur. En effet cela est supporté et plutôt bien expliqué dans la doc Blackberry.

Cela pose quand même un certains nombres de problèmes :
- les paramètres de passerelle wap sont différents pour chaque opérateur
- la sélection d'une liste de paramètres embarqués impliquerait un choix utilisateur

Ces problèmes peuvent être supportés de la manière suivante :
- la liste des paramètres nécessaires pour les opérateurss déployant des terminaux Blackberry est accessibles très facilement sur internet (si, si une petite recherche)
- la sélection du set de paramètres peut être faite automatiquement grâce à la classe Branding de RIM (voir le javadoc du JDE) ; celle ci permet effectivement de détecter l'opérateur en cours d'utilisation.

Avec ça vous pourrez enfin envisager des applications connectées sur Blackberry.

Pour l'implémentation à vous de jouer.
Pour ma part cette approche semble marcher, mais mes tests sont pour l'instant limités à un seul opérateur.

Quelques liens :
http://www.blackberry.com/developers/docs/4.2api/javax/microedition/io/Connector.html
http://www.quickim.com/support/gprs-settings.html


Captcha et struts
12/16/2007 08:48 AM

Voici un captcha (“Completely Automated Public Turing test to tell Computers and Humans Apart“) code visuel de vérification propre à éliminer tout saisie automatisée (robots, redirection) utilisable dans vos dev java (JSP, Servlet, Struts ou autres).

Ce code a été trouvé sur dzone : http://snippets.dzone.com/tag/Captcha

Perso je l‘utilise dans mes dev Struts : le JSP doit être appelé pour un affichage en tant qu‘image img src=“captcha.jsp” ; ce JSP présente un code aléatoire et stocke le dit code dans une variable de session ‘captcha‘ ; j‘utilise ensuite le validateur du formbean correspondant à mon formulaire pour vérifier l‘adéquation captcha saisi dans le formulaire / captcha choisi aléatoirement


<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="javax.imageio.*"%>
<%@ page import="java.awt.geom.*"%>
<%
//========================================================
// Kick Ass Captcha JSP
//
// Michael Connor 2007
//
// I just couldn't handle the thought of downloading a
// big jar and configuring some servlet.xml and having
// little to no control of anything...
// You can send in height and width parameters.
// The captcha value will be placed in the session in
// a parameter called 'captcha'
//
// Feel free to use this code and do whatever the hell
// you want to it.
//========================================================

response.setContentType("image/jpg");

try {

Color backgroundColor = Color.red;
Color borderColor = Color.red;
Color textColor = Color.white;
Color circleColor = new Color(160, 160, 160);
Font textFont = new Font("Arial", Font.PLAIN, 24);
int charsToPrint = 6;
int width = request.getParameter("width") != null ? Integer.parseInt(request.getParameter("width")) : 150;
int height = request.getParameter("height") != null ? Integer.parseInt(request.getParameter("height")) : 80;
int circlesToDraw = 4;
float horizMargin = 20.0f;
float imageQuality = 0.95f; // max is 1.0 (this is for jpeg)
double rotationRange = 0.7; // this is radians
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D g = (Graphics2D) bufferedImage.getGraphics();

//Draw an oval
g.setColor(Color.red);
g.fillRect(0, 0, width, height);

// lets make some noisey circles
g.setColor(circleColor);
for (int i = 0; i < circlesToDraw; i++) {
int circleRadius = (int) (Math.random() * height / 2.0);
int circleX = (int) (Math.random() * width - circleRadius);
int circleY = (int) (Math.random() * height - circleRadius);
g.drawOval(circleX, circleY, circleRadius <strong> 2, circleRadius </strong> 2);
}

g.setColor(textColor);
g.setFont(textFont);

FontMetrics fontMetrics = g.getFontMetrics();
int maxAdvance = fontMetrics.getMaxAdvance();
int fontHeight = fontMetrics.getHeight();

// i removed 1 and l and i because there are confusing to users...
// Z, z, and N also get confusing when rotated
// 0, O, and o are also confusing...
// lowercase G looks a lot like a 9 so i killed it
// this should ideally be done for every language...
// i like controlling the characters though because it helps prevent confusion
String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789";
char[] chars = elegibleChars.toCharArray();

float spaceForLetters = -horizMargin * 2 + width;
float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);

AffineTransform transform = g.getTransform();

StringBuffer finalString = new StringBuffer();

for (int i = 0; i < charsToPrint; i++) {
double randomValue = Math.random();
int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
char characterToShow = chars[randomIndex];
finalString.append(characterToShow);

// this is a separate canvas used for the character so that
// we can rotate it independently
int charImageWidth = maxAdvance * 2;
int charImageHeight = fontHeight * 2;
int charWidth = fontMetrics.charWidth(characterToShow);
int charDim = Math.max(maxAdvance, fontHeight);
int halfCharDim = (int) (charDim / 2);

BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
Graphics2D charGraphics = charImage.createGraphics();
charGraphics.translate(halfCharDim, halfCharDim);
double angle = (Math.random() - 0.5) * rotationRange;
charGraphics.transform(AffineTransform.getRotateInstance(angle));
charGraphics.translate(-halfCharDim, -halfCharDim);
charGraphics.setColor(textColor);
charGraphics.setFont(textFont);

int charX = (int) (0.5 <strong> charDim - 0.5 </strong> charWidth);
charGraphics.drawString("" + characterToShow, charX,
(int) ((charDim - fontMetrics.getAscent()) / 2 + fontMetrics.getAscent()));

float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
int y = (int) ((height - charDim) / 2);
//System.out.println("x=" <ins> x </ins> " height=" <ins> height </ins> " charDim=" <ins> charDim </ins> " y=" <ins> y </ins> " advance=" <ins> maxAdvance </ins> " fontHeight=" <ins> fontHeight </ins> " ascent=" + fontMetrics.getAscent());
g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);

charGraphics.dispose();
}

//Write the image as a jpg
Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
if (iter.hasNext()) {
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(imageQuality);
writer.setOutput(ImageIO.createImageOutputStream(response.getOutputStream()));
IIOImage imageIO = new IIOImage(bufferedImage, null, null);
writer.write(null, imageIO, iwp);
} else {
throw new RuntimeException("no encoder found for jsp");
}

// let's stick the final string in the session
request.getSession().setAttribute("captcha", finalString.toString());

g.dispose();
} catch (IOException ioe) {
throw new RuntimeException("Unable to build image", ioe);
}

%>


Ajouter PHP5 a lighttpd sous ubuntu
12/15/2007 04:36 PM

Ajouter PHP5 a ligttpd sous ubuntu


sudo apt-get install php5-cgi

sudo apt-get install lighttpd

configurer /ect/lighttpd/lighttpd.conf avec

server.modules = (

...
"mod_fastcgi",
...

)


Installer et configurer FFMPEG pour encoder des videos Flash (flv) sous UBUNTU
12/15/2007 04:34 PM

Installer et configurer FFMPEG pour encoder des videos Flash (flv) sous UBUNTU :


sudo apt-get build-dep ffmpeg
sudo apt-get install liblame-dev libfaad2-dev libfaac-dev libxvidcore4-dev checkinstall fakeroot liba52-0.7.4 liba52-0.7.4-dev
apt-get source ffmpeg
cd ffmpeg
./configure <del>-enable</del>mp3lame
make
make install


Selection de pays dans un formulaire avec Struts
12/13/2007 11:08 PM

Un ensemble html:select présentant une liste de pays pour vos formulaires Struts.


<html:select property="country" value="France">
<html:option value=''><del>-Choisissez un pays dans cette liste</del>-</html:option>
<html:option value='Afrique du Sud'>Afrique du Sud</html:option>
<html:option value='Algérie'>Algérie</html:option>
<html:option value='Allemagne'>Allemagne</html:option>
<html:option value='Antigua et Barbuda'>Antigua et Barbuda</html:option>
<html:option value='Arabie Saoudite'>Arabie Saoudite</html:option>
<html:option value='Argentine'>Argentine</html:option>
<html:option value='Australie'>Australie</html:option>
<html:option value='Autriche'>Autriche</html:option>
<html:option value='Belgique'>Belgique</html:option>
<html:option value='Brésil'>Brésil</html:option>
<html:option value='Bulgarie'>Bulgarie</html:option>
<html:option value='Cambodge'>Cambodge</html:option>
<html:option value='Cameroon'>Cameroon</html:option>
<html:option value='Canada'>Canada</html:option>
<html:option value='Chili'>Chili</html:option>
<html:option value='Chine'>Chine</html:option>
<html:option value='Chypre'>Chypre</html:option>
<html:option value='Comores'>Comores</html:option>
<html:option value='Corée du Sud'>Corée du Sud</html:option>
<html:option value='Côte d\'Ivoire'>Côte d'Ivoire</html:option>
<html:option value='Cuba'>Cuba</html:option>
<html:option value='Danemark'>Danemark</html:option>
<html:option value='Egypte'>Egypte</html:option>
<html:option value='Emirats Arabes Unis'>Emirats Arabes Unis</html:option>
<html:option value='Equateur'>Equateur</html:option>
<html:option value='Espagne'>Espagne</html:option>
<html:option value='Etats-Unis'>Etats-Unis</html:option>
<html:option value='Fédération Russe'>Fédération Russe</html:option>
<html:option value='Finlande'>Finlande</html:option>
<html:option value='France'>France</html:option>
<html:option value='Gabon'>Gabon</html:option>
<html:option value='Grèce'>Grèce</html:option>
<html:option value='Guadeloupe'>Guadeloupe</html:option>
<html:option value='Guinée'>Guinée</html:option>
<html:option value='Hongrie'>Hongrie</html:option>
<html:option value='Ile Maurice'>Ile Maurice</html:option>
<html:option value='Ile Rodrigues'>Ile Rodrigues</html:option>
<html:option value='Inde'>Inde</html:option>
<html:option value='Indonésie'>Indonésie</html:option>
<html:option value='Irak'>Irak</html:option>
<html:option value='Irlande'>Irlande</html:option>
<html:option value='Islande'>Islande</html:option>
<html:option value='Israël'>Israël</html:option>
<html:option value='Italie'>Italie</html:option>
<html:option value='Jamaïque'>Jamaïque</html:option>
<html:option value='Japon'>Japon</html:option>
<html:option value='Jordanie'>Jordanie</html:option>
<html:option value='Kenya'>Kenya</html:option>
<html:option value='Koweit'>Koweit</html:option>
<html:option value='La Réunion'>La Réunion</html:option>
<html:option value='Liban'>Liban</html:option>
<html:option value='Libye'>Libye</html:option>
<html:option value='Luxembourg'>Luxembourg</html:option>
<html:option value='Madagascar'>Madagascar</html:option>
<html:option value='Malaisie'>Malaisie</html:option>
<html:option value='Mali'>Mali</html:option>
<html:option value='Malte'>Malte</html:option>
<html:option value='Maroc'>Maroc</html:option>
<html:option value='Martinique'>Martinique</html:option>
<html:option value='Mauritanie'>Mauritanie</html:option>
<html:option value='Mayotte'>Mayotte</html:option>
<html:option value='Mexique'>Mexique</html:option>
<html:option value='Myanmar'>Myanmar</html:option>
<html:option value='Népal'>Népal</html:option>
<html:option value='Niger'>Niger</html:option>
<html:option value='Nigeria'>Nigeria</html:option>
<html:option value='Norvège'>Norvège</html:option>
<html:option value='Nouvelle Zélande'>Nouvelle Zélande</html:option>
<html:option value='Nouvelle-Calédonie'>Nouvelle-Calédonie</html:option>
<html:option value='Panama'>Panama</html:option>
<html:option value='Papouasie Nouvelle Guinée'>Papouasie Nouvelle Guinée</html:option>
<html:option value='Pays-Bas'>Pays-Bas</html:option>
<html:option value='Pérou'>Pérou</html:option>
<html:option value='Philippines'>Philippines</html:option>
<html:option value='Pologne'>Pologne</html:option>
<html:option value='Polynésie française'>Polynésie française</html:option>
<html:option value='Portugal'>Portugal</html:option>
<html:option value='Quatar'>Quatar</html:option>
<html:option value='Republique Dominicaine'>Republique Dominicaine</html:option>
<html:option value='République Tchèque'>République Tchèque</html:option>
<html:option value='Roumanie'>Roumanie</html:option>
<html:option value='Royaume Uni'>Royaume Uni</html:option>
<html:option value='Saint Kitts et Nevis'>Saint Kitts et Nevis</html:option>
<html:option value='Saint-Martin'>Saint-Martin</html:option>
<html:option value='Sainte Lucie'>Sainte Lucie</html:option>
<html:option value='Sénégal'>Sénégal</html:option>
<html:option value='Seychelles'>Seychelles</html:option>
<html:option value='Singapour'>Singapour</html:option>
<html:option value='Suède'>Suède</html:option>
<html:option value='Suisse'>Suisse</html:option>
<html:option value='Taïwan'>Taïwan</html:option>
<html:option value='Thaïlande'>Thaïlande</html:option>
<html:option value='Tunisie'>Tunisie</html:option>
<html:option value='Turkey'>Turkey</html:option>
<html:option value='Ukraine'>Ukraine</html:option>
<html:option value='Vénézuela'>Vénézuela</html:option>
<html:option value='Vietnam'>Vietnam</html:option>
<html:option value='Virgin Islands'>Virgin Islands</html:option>
</html:select>



Retour
 

http://www.velior.net or http://www.npolive.net
Olivier Bergeret chef de projet java et multimédia est un site personnel. 
partenaires : P'Web création de sites Web [http://www.netcreateurs.info/] [http://www.creatorz.info/]
Olivier Bergeret sur LINKEDIN
2010 - Olivier Bergeret

Generated by Velior Portal Proxy - 1267710048128