Sur la route d'Oxiane digressions diverses

LeBlog OXiane

23 oct
2012

Location de salle de formation à nos copains d’Android EE

Je ne vous cache pas que lors du Devoxx 2012, j’ai beaucoup accroché lors de ma rencontre avec Mathias Seguy.

Au delà de l’homme, j’apprécie les entrepreneurs ayant des valeurs et œuvrant pour la communauté.

Celui ci voulait lancer son offre de formation, chose qui n’est pas aisée et j’ai voulu lui donner un coup de pouce en lui louant une salle de formation équipée pour qu’il puisse accueillir ses premiers clients.

Comme Oxiane dispense depuis fin 2008 ses propres cours Android, quel meilleur endroit aurait t il pu trouver sur Paris ;) ? Bon ok, Toulouse c’est très bien aussi ;)

La première session réalisée par Android EE a eu lieu dans les locaux d’Oxiane du 1er au 3 octobre.

Celui ci nous remercie aujourd’hui dans ce billet : http://blog.developpez.com/android2ee-mathias-seguy/p11439/android-2/presentation/formation-android-octobre-2012-avec-romain-zanon-cogenit-chez-oxiane-par-android2ee-a-paris-debriefing

Mathias est un super pédagogue, je vous invite vivement à participer à celle prévue du 05 au 09 novembre, toujours dans nos locaux à Boulogne.

Jean-Louis Rousselin

jlrousselin

19 oct
2012

Open World Forum : Edition 2012

Ce week end se tenait à Paris la cinquième édition de Open World Forum (Le premier forum Open Source en Europe). Comme son nom l’indique c’est un forum mondial sur les solutions Open Source, tant sur le niveau technologique, sociétal qu’économique. Les présentations du forum s’articulaient autour de trois volets :

  • Think qui se concentrait sur des réflexions tels que l’Open Data, le Cloud Computing, la Neutralité sur le net, l’internet des objets…
  • Code qui traitait du développement logiciel et des plateformes Open Source logicielles (Java, Javascript, Python, Android, Dart , PHP …)
  • Experiment qui était dédié à l’expérimentation de logiciels et de matériels.

Le volet Code, étalé sur les trois jours, était découpé en plusieurs sessions regroupées par thèmes :

  • Cloud computing : Google App Engine
  • Big Data : Hadoop , Talend, Websemantique
  • Mobililé : Android
  • Web : JavaScript, AngularJ, PHP, HTML 5, Dart
  • Java

L’accueil a été chaleureux. A l’entrée on trouve des revues informatiques offertes par les sponsors (Linux Mag, Programmez, L’Informatique…). Du matériel a été mobilisé pour l’évènement, mon badge a été imprimé sur place juste à mon arrivée. On peut noter également la présence de la ministre délégué de l’économie numérique. Les contenus des sessions étaient riches et variées. Il y a toutefois des corrections à apporter au niveau de la communication. C’est une fois dans la salle qu’on a les détails d’une session, au moment où c’est trop tard de changer pour aller voir une autre plus « intéressante » (Je fais la comparaison avec Devoxx où il y avait plus de transparence à ce niveau). Des changements de salles étaient effectués à la dernière minute sans laisser de trace d’informations.

Lire la suite du bllet »

ydabo

3 oct
2012

6H de Barheïn 2012 : Olivier Lombard sur la 2ème marche du podium

 

C’est finalement à Sakhir, le circuit du royaume insulaire de Bahreïn que la réussite, enfin, attendait Olivier Lombard et ses équipiers de l’Oreca 03- Nissan Signatech #23.

Chez Signatech-Nissan, pour compenser le déficit de roulage lors des dernières courses de Jordan Tresson, celui-ci été chargé de qualifier la voiture. « C’était une première pour lui et il a très bien roulé », précisait Olivier avant la course, « en signant son chrono à seulement 4/10e de la #26 pilotée par Roman Rusinov, qui a quand même beaucoup plus d’expérience. Jordan a pris le départ, relayé par Franck Mailleux. Quand j’ai pris le volant nous étions 4e des LMP2 avec un faible écart derrière les 3e. Mais ce premier relais a été un peu écourté, car nous avons eu un problème avec un feu arrière et ils m’ont demandé de rentrer un peu plus tôt. La voiture a dû être rentrée dans le box pour changer le bloc arrière et, une fois de retour en piste, nous sommes descendus à la 6e ou 7e place. »

Les conditions climatiques de forte chaleur ont rendu la tâche des pilotes assez difficile durant cette course disputée le samedi en milieu d’après-midi, comme le confirme Olivier : « Dans ce premier relais, ce n’était pas facile pour rester hydraté. Je n’avais plus d’eau dans ma gourde au bout de dix tours, alors qu’il m’en restait encore vingt à boucler. En réalité, c’était à cause du tuyau qui s’était un peu relevé. Il faut dire que la température dépassait allègrement les 35°C, avec un fort taux d’humidité, et ne descendait pas sous les 30°C la nuit. C’est la première fois aussi que j’allais ensuite entamer un relais avant le coucher du soleil et le finir en nocturne. C’est un beau circuit, mais l’effet visuel au crépuscule et de nuit n’a rien d’exceptionnel et n’égale pas la magie des 24 Heures du Mans. »

Cette fois, l’Oreca-Nissan Signatech #23 est constamment restée candidate au podium, même si un autre léger incident a fait perdre un peu de temps à Olivier. « A la fin de mon dernier relais, Minassian, avec l’Oreca-Pecom, m’a un peu touché à l’arrière dans le premier virage et mis en tête-à-queue. »

Bien installée à la 3e place, l’Oreca-Nissan 03 Signatech #23 s’est finalement hissée au 2e rang, le 7e au classement général, grâce à une perte de temps au stand de la redoutable HPD Starworks. Franck Mailleux a alors assuré un dernier relais de haute volée, en contenant Sarrazin derrière lui tout en veillant à économiser son carburant. A l’arrivée, joie et soulagement habitaient toute l’équipe lors de la cérémonie du podium, où Olivier, Franck et Jordan accédaient à la deuxième marche des LMP2.

Les manches asiatiques attendent désormais l’équipe Signatech et le “WEC circus“, dont le matériel est parti directement de Bahreïn vers le circuit japonais du Mont-Fuji. Une séance d’essai préliminaire y aura lieu dès le mercredi 10 octobre. Après les 6 Heures de Fuji, disputées le dimanche 14, le FIA World Endurance Championship rejoindra alors le circuit de Shanghai pour son huitième et ultime rendez-vous, programmé le 28 octobre …

Avant de repartir au Japon, Olivier a rendu visite au stand Nissan du Mondial de l’Automobile, où une version show car de l’Oreca-Nissan #23 est exposée à côté de l’atypique Delta Wing, vue aux dernières 24 Heures du Mans.

Toute l’équipe d’OXiane félicite encore son champion pour ce podium tant attendu cette saison !

Vous pouvez retrouver Olivier Lombard :

-      Sur son compte Twitter – @OLombardPilote

-      Sur sa page Facebook – Olivier Lombard / Pilote

-      Sur son site internet – Olivier Lombard site officiel

Jean-Louis Rousselin

jlrousselin

1 oct
2012

La richesse insoupçonnée de la TextView sous Android

Pour les besoins d’un client, j’ai été confronté à la problématique suivante: afficher du texte au format HTML dans une ListView. Ça semble tout simple, et pourtant…
La première chose à ne pas essayer, c’est de fournir des WebViews à votre ListView. C’est d’ailleurs déconseillé un peu partout (ici par exemple). Les problèmes rencontrés vont aller de la confusion du scroll entre la WebView et la ListView (si je déplace mon doigt verticalement, est-ce que je vais scroller dans la WebView ou dans la ListView?) à des problèmes bien plus graves: comment gérer le redimensionnement de ma cellule lors de la réutilisation de la vue?
Bref, le plus simple, c’est encore de s’en passer.
L’objet de cet article est justement de se passer des WebViews et d’utiliser uniquement des TextViews. On peut utiliser cette méthode magique
public static Spanned fromHtml (String source)

Elle permet de convertir une String qui représente du HTML en « Spanned ». Et les Spanned sont utilisables directement dans une TextView (setText(CharSequence cs)) car Spanned hérite de CharSequence.

C’est magique, mais souvent, ça ne suffit pas. En effet, si cette méthode permet bien de convertir les balises A en Spanned « lien » (cliquables, donc), elle ne gère que très peu d’autres balises. Voir ici la liste des balises « supportées ». Attention, car même les balises supportées ne sont pas forcément gérées comme on le voudrait. Par exemple, les balises DIV et P sont juste remplacées par un « \n ». Les alignements, marges sont moyennement gérées.

La solution, c’est comme d’habitude d’aller jeter un oeil sur les sources d’Android, notamment la méthode qui nous intéresse et de recopier/overrider.
On voit que cette méthode fait appel à un parseur XML basé sur TagSoup et qu’elle gère elle même ce qu’il faut faire pour chaque balise.
Par exemple, on voit qu’elle insère dans la méthode handleStartTag dans un objet de type SpannableStringBuilder un tas d’objets de types Bold, Italic, Underline etc.
Le SpannableStringBuilder, sans entrer trop dans les détails, est un constructeur de SpannableString, c’est-à-dire un constructeur de String « spannables », ce qui veut dire que c’est un objet qui contient une String et une liste d’attributs avec des indices.
Concrètement, si on prend l’exemple de cette phrase: « Bonjour »:
la SpannableString contiendra

  • la String « Bonjour »
  • ainsi qu’un objet de type StyleSpan(Bold)
  • mais aussi les indices 0 et 2, pour signifier qu’on doit appliquer le style « bold » aux 3 premiers caractères de la String.

Et la TextView d’Android permet d’afficher cette SpannableString directement!

Dans mon cas particulier, il fallait entre autres afficher quelque chose pour les balises HR. Piqûre de rappel: la balise HR, c’est une ligne horizontale, une balise qui est de plus en plus rarement utilisée.

Comme ma balise HR n’est pas gérée par les méthodes handleStartTag et handleEndTag, j’ai rajouté mon cas à la liste des « if »:

if (tag.equalsIgnoreCase("hr")) {
			startHR(mSpannableStringBuilder, new HorizontalLine());
		}

et la méthode startHR (dont j’ai largement pompé le modèle sur la façon dont sont écrites les autres méthodes startXXXX)

private void startHR(SpannableStringBuilder text, HorizontalLine horizontalLine) {
		text.append("\n");
		text.append("\uFFFC");

		text.setSpan(new HorizontalLineSpan(Color.BLACK, 0), text.length() - 1, text.length(),
				Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		text.append("\n");
	}

Le principe ici, c’est d’ajouter des « \n », mais surtout un objet de type Spanned (plus précisément de type DynamicDrawableSpan) dans notre SpannableString pour indiquer à la TextView, lorsqu’elle aura besoin d’afficher ce texte, qu’il y’aura un dessin à faire ici.

Voici donc ma classe HorizontalLineSpan, très largement pompée d’ici:

public class HorizontalLineSpan extends DynamicDrawableSpan {
	HorizontalLineDrawable mDrawable;
	private int width;

	public HorizontalLineSpan(int color, int width) {
		super(ALIGN_BOTTOM);
		mDrawable = new HorizontalLineDrawable(color, width);
		this.width = width;
	}

	@Override
	public Drawable getDrawable() {
		return mDrawable;
	}

	public void resetWidth(int width) {
		this.width = width;
		mDrawable.renewBounds(width);
	}

	@Override
	public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
		return width;
	}

	public int getColor() {
		return Color.BLACK;
	}
}

Son principe à elle, c’est de contenir un Drawable, qui sera affiché par la TextView quand cette dernière lui demandera (en appelant la méthode getDrawable()).
Dans mon cas particulier, j’avais besoin d’afficher une ligne horizontale, j’ai donc créé (enfin plutôt pompé et modifié) une classe qui hérite de ShapeDrawable qui dessine une ligne. La voici:

public class HorizontalLineDrawable extends ShapeDrawable {
	private static final String LOG_TAG = "HorizontalLineDrawable";
	private int mWidth;
	private Paint paint;

	public HorizontalLineDrawable(int color, int width) {
		super(new RectShape());
		mWidth = width;
		paint = new Paint();
		paint.setColor(color);
		renewBounds(width);
	}

	@Override
	public void draw(Canvas canvas) {
		Rect rect = new Rect(0, 9, mWidth, 10);
		canvas.drawRect(rect, paint);
	}

	public void renewBounds(int width) {
		int MARGIN = 20;
		int HEIGHT = 20;
		if (width > MARGIN) {
			width -= MARGIN;
		}
		mWidth = width;
		setBounds(0, 0, width, HEIGHT);
	}
}

Sans entrer trop dans les détails, là où ça se joue, c’est sur le onDraw(Canvas c). C’est là qu’on va dessiner un rectangle à x = 0, y = 9, d’une largeur variable et d’une hauteur de 1 pixel (car 10 – 9 =1!).

Sauf que justement, quand on est au stade de parser le HTML et de créer un SpannableString, on ne sait pas quelle sera la largeur de notre TextView. Cette SpannableString peut être ajoutée à une TextView gigantesque ou minuscule. D’où cette deuxième méthode, « renewBounds », qui permet justement de setter la largeur de la TextView.
Vous aurez peut-être remarqué que cette méthode est appelée par la méthode resetWidth(int w) de l’HorizontalLineSpan !

Et voici l’appel à la méthode resetWidth(int w) sur l’HorizontalLineSpan:

/*Attention, dans mon exemple, on fait tout le parsing HTML dans le getView, ce qui est fortement déconseillé. C'est une opération qui peut être coûteuse et rendre l'affichage tout saccadé, voire même causer un ANR (Application not responding).
Donc, dans un premier temps, on parse la String HTML et on remplit un objet de type Spanned.*/
Spanned fromHtml = Html.fromHtml(tmp);
// on récupère la largeur de notre TextView
				int width = contenuTxt.getWidth();
// On récupère tous les Spans de type "HorizontalLineSpan"
	            HorizontalLineSpan[] lines = fromHtml.getSpans(0, fromHtml.length(), HorizontalLineSpan.class);
//Pour chacun, on appelle resetWidth avec la largeur de la TextView
	            for (HorizontalLineSpan line : lines) {
	                line.resetWidth(width);
	            }
//et enfin, on setText sur notre TextView!
				contenuTxt.setText(fromHtml);

Et voici le résultat!
HR

Johann Hilbold

jhilbold

18 sept
2012

IBM Worklight plateforme mobile

ibm worklight
J’étais aujourd’hui chez IBM pour une journée de workshop sur leur plateforme mobile Worklight.

Au premier coup d’oeil, ça ressemble à un phonegap.

On a un environement de dev, un designer et on peut développer des applications hybrides en vue de déploiement multi-plateformes (Android, iOs, BlackBerry et Windows phone).

Au second coup d’oeil … ça n’a rien à voir … ou presque.

 

 

 

Je commence par les points, disons, négatifs.

  • On peut développer son application hybride avec les plus connus des frameworks web mobiles : jQuery mobile, dojo mobile et sencha touch, MAIS le designer intégré ne permet que d’utiliser dojo… grosse déception, et je n’ai rien contre dojo, au contraire, mais pourquoi faire semblant de faire du jQuery mobile si en fait … non.
  • Beaucoup de fonctionnalités sont réservées à Android et iPhone, les autres systèmes sont les parents pauvres, un peu là pour la galerie … notez que moi ça ne me dérange pas plus que ça, mais pour la cible de ce produit, c’est dommage. Pour blackberry, c’est encore plus complexe car visiblement leur OS évolue drastiquement pour sa dernière version et c’est donc tout une partie de worklight qu’il faudra repenser
  • Malgré la qualité des tutos à suivre, on ressent une impression de flou lors du développement, mais c’est sûrement du au fait qu’on aborde beaucoup de sujets différents, du montage des pages au déploiement des applications

Pour les points positifs, il y en a aussi, je dirais que globalement, j’ai été emballé par le côté serveur :

  • La possibilité de créer du code serveur worklight qui fournit les données aux terminaux, ce qui est intéressant pour agréger des contenus et d’une manière générale pour maitriser les ressources utilisées par les mobiles.
  • La création très facile d’un App Store privé, qui servira à une entreprise à déployer ses applications, à gérer les mises à jour, les commentaires etc…
  • L’approche MDM de la solution complète, qui permet de restreindre des fonctionnalités pour certaines applis, de gérer un ensemble de paramètres qui viennent enrichir les fonctions d’un simple App Store comme le direct update, comme une vraie sécurité, basée sur un système d’authentification existant dans l’entreprise.
  • La gestion unifiée (pour Android et iOs) des notification en mode push
  • Un outil de statistique simple pour connaitre les chiffres d’utilisation

ibm worklight direct update
Avec la technologie direct update, il est possible de mettre à jour le contenu « web » de son application hybride, comme du cache appilcatif par exemple. On ne passe pas pour ces fonctionnalités par le process lourd du store, mais directement par le serveur worklight. On peut ainsi gérer des versions différentes pour un même OS et une même appli.

Alors Worklight permet de développer des applis web « pures », mais ce n’est à mon avis pas la cible. En effet, l’outil ne me semble pas intéressant par rapport à ce qui peut se faire directement avec Phonegap ou pourquoi pas avec Dreamweaver et jQuery Mobile. Il est d’ailleurs possible de brancher des plugins Cordova pour étendre les capacités de son appli hybride. En revanche, en entreprise, la démarche en intéressera plus d’un, et principalement pour des aspects de sécurité, qui font cruellement défaut dans un déploiement classique d’applications mobiles. Comme Worklight sait gérer aussi bien les applications natives que les applications hybrides, c’est un moyen efficace d’intégrer ses applications d’entreprise dans une politique sérieuse de sécurité et de déploiement.

Alain Boudard

aboudard