[Android] NavigationDrawer, NavigationBar and NestedFragments without third library

After many search and tests, I would share with you my solution to have a Navigation Drawer and a Navigation Bar with all of you.

This is possible with nested fragment and without using any third library like ActionBarScherlock, … but only compatible with android 14+. Wich is, for me, the only platform version range that we should really support for new application.

In short : this will allow you to have a navigation tab inside fragment handled by the navigation drawer.

Read more

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

Install Oracle on Ubuntu/Debian server

Oracle is a powerfull database managment system, probably the powerfull solution to process a lot of data. In the past the install of this service was difficult, but now it’s not enough a problem. Oracle has released built-in packages for his free DBMS version, this package are available for almost all Linux plateform.

In this post I will explain how install this service on an Debian-based distribution, like Ubuntu.

Step 1 : Add the repository to the apt

Open file /etc/apt/source.list, and append the following line :

deb http://oss.oracle.com/debian unstable main non-free

After that import the key of this repository :

$ wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -

 

Step 2 : Ensure that you’ve enough swap

Oracle need at least 1GB of swap, if you don’t have enough swap, do the following commands :

$ sudo dd if=/dev/zero of=/moreSwap bs=1M count=1000
$ sudo mkswap /
moreSwap
$ sudo swapon /moreSwap

Step 3 : Install Oracle

We use the apt command to do that :

sudo apt-get update && sudo apt-get install oracle-xe-universal

Be patient, this installation can be long (around 250MB to download)

After that we need to configure Oracle with the following command :

sudo /etc/init.d/oracle-xe configure

Here, the program will ask you some informations like port number, administrator password, …

As written in the last line of this program, you can access to the database home page on the following URL : http://127.0.0.1:8080/apex (may change if you’ve change the port)

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

Load class / action on tomcat startup / deploy

I wrote this post, because few day ago I need to automaticaly load action when my application is deployed on tomcat (see my previous post).
In many case you should load some features on startup of your application on tomcat, like load configuration, connect some stuff, …

Tomcat can do this with a servlet loaded on deployment of your app.

First of all, you need edit the web.xml file present on the WEB-INF directory, to add the following line :

<servlet>
 <servlet-name>log4j-init</servlet-name>
 <servlet-class>info.octera.monit.utils.Log4jConfigLoader</servlet-class>
 <load-on-startup>1</load-on-startup>  
 </servlet>

The load-on-startup instruction is used to determine the order of the servlet is loaded. A servlet with a load-on-startup higher will be loaded after all lesser number.

 

After that we need to create our class wich will load all stuff we need. This one will seem like that :

package yourPackage;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class YourClass extends HttpServlet {

@Override
public void init() throws ServletException {
super.init();
 //Code to load all your needed stuff
}
@Override
public void destroy() {
 //Code in order to destroy all previously loaded stuff when the application is undeployed/exited
}
}

With this code your stuff will be loaded on startup with the init method, and detroy on exit with the destroy method

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

How to embed ActiveMQ in Tomcat

This post will explain how you can embed ActiveMQ in Tomcat and how start/stop itself as a WebApp

Step 1

You need to download ActiveMQ on their website, after that, unzip the files. Here you can launch it as a standalone application to make some tests.
To be able to launch ActiveMQ directly in Tomcat you must copy the following jar in the commons/lib/ directory of tomcat :

  • activemq-core-5.5.0.jar
  • geronimo-j2ee-management_1.1_spec-1.0.1.jar
  • geronimo-jms_1.1_spec-1.1.1.jar
  • geronimo-jta_1.0.1B_spec-1.0.1.jar
  • kahadb-5.5.0.jar
  • log4j-1.2.14.jar
  • slf4j-api-1.5.11.jar
  • slf4j-log4j12-1.5.11.jar

Version number may changes.

Step 2

Now we are going to configure tomcat to embed ActiveMQ.

Open server.xml file from tomcat directory, and add the following code in the GlobalNamingResources section

<Resource
name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://localhost:61616" brokerName="ActiveMQBroker"
useEmbeddedBroker="false"/>

<Resource
name="jms/topic/MyTopic"
auth="Container"
type="org.apache.activemq.command.ActiveMQTopic"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.TOPIC"/>

<Resource
name="jms/queue/MyQueue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="APP.JMS.QUEUE"/>

This code make an instance of ActiveMQ on localhost:61616, and create a Topic and a Queue.

Now open context.xml files and add this in the context section:

<ResourceLink global="jms/ConnectionFactory" name="jms/ConnectionFactory" type="javax.jms.ConnectionFactory"/>
<ResourceLink global="jms/topic/MyTopic" name="jms/topic/MyTopic" type="javax.jms.Topic"/>
<ResourceLink global="jms/queue/MyQueue" name="jms/queue/MyQueue" type="javax.jms.Queue"/>

This will link the global name of the ressources to a name that you can use in your application.

Step 3

In order to activate ActiveMQ you need to add the following line in the tomcat startup script:

-Dwebconsole.type=properties
-Dwebconsole.jms.url=tcp://localhost:61616
-Dwebconsole.jmx.url=service:jmx:rmi:///jndi/rmi://localhost:1099/Jmxrmi

The last line will open JMX to allow monitoring of ActiveMQ. Remember to disable it in production or protect it with password!

Step 4

We need to launch ActiveMQ with our Web Application, so a sevlet can do that. This servlet will open ActiveMQ when started, and close when finished.

First, open the web.xml file of your application in the WEB-INF directory, and add the following line :

<servlet>
<servlet-name>LoadActiveMQ</servlet-name>
<servlet-class>info.octera.utils.LoadActiveMQ</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

These line will create a servet and launch it when the application is started by tomcat, this servlet is automatically destroy when the application is exited.

Now the servlet code :

package info.octera.utils;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.activemq.broker.BrokerService;
import org.apache.log4j.Logger;

public class LoadActiveMQ extends HttpServlet {

/**
* serialVersionUID for serialization
*/
private static final long serialVersionUID = -8289081958495740549L;

private BrokerService broker;

private static final Logger logger = Logger.getLogger(LoadActiveMQ.class
.getName());

@Override
public void init() throws ServletException {
// / Automatically java script can run here
logger.info("Load activeMQ");
// configure the broker
try {
broker = new BrokerService();
broker.addConnector("tcp://localhost:61616");
broker.start();
logger.info("ActiveMQ loaded succesfully");
} catch (Exception e) {
e.printStackTrace();
logger.error("Unable to load ActiveMQ!");
}
}

@Override
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}

@Override
public void destroy() {
try {
logger.info("ActiveMQ exiting");
broker.stop();
logger.info("ActiveMQ exit succesfully");
} catch (Exception e) {
e.printStackTrace();
logger.error("Unable to exit ActiveMQ!");
}
}

Deploy your application, you will see in the log that ActiveMQ is correctly loaded and now listen on localhost:61616!

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

OpenEtna 6.1 RC5 disponible

Une nouvelle version d’OpenEtna vient de sortir.

Celle ci corrige entre autres les fonctions suivantes :

  • A lot of work into gps, fixed issue 295, mainly by Richard A. Burton
  • Fixed issue 262 « Speaker Mode doesn’t turn on (or doesn’t work properly) » by JoseMariaAraujo
  • Turn down the touch button led brightness a bit by Richard A. Burton
  • Fix low volume bug, issue 210
  • Added caps led by Gorgonzoland

Voir le ChangeLog complet

Télécharger la nouvelle version

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

En savoir plus sur les bases NoSQL

Limites du modèle relationnel

Les bases de données existent maintenant depuis environ 50 ans et le modèle relationnel depuis environ 40 ans, ce modèle bien que très puissant, a des limites que certains services/sites, tels que Google, Facebook, etc, ont atteintes depuis longtemps. En effet ce genre de site possède plusieurs millions voir milliard d’entrées dans leurs bases de données et tout autant de visites journalières en conséquence une seule machine ne peut pas gérer la base de données, de plus pour des raisons de fiabilité ces bases de données sont dupliquées pour que le service ne soit pas interrompu en cas de panne. La méthode consiste donc à rajouter des serveurs pour dupliquer les données et ainsi augmenter les performances et résister aux pannes.

Seulement, dû aux propriétés fondamentales sur lesquels une base de données repose cette approche a ses limites : une base de données relationnelle est construite sur les propriétés ACID (Atomicité, Cohérence, Isolation, Durabilité), ses propriétés bien que nécessaires à la logique du relationnel nuisent fortement aux performances surtout la propriété de cohérence. En effet, la cohérence est très difficile à mettre en place dans le cadre de plusieurs serveurs, car pour que celle-ci soit respectée tous les serveurs doivent être des miroirs les uns des autres, de ce fait deux problèmes apparaissent :

  • Le coût en stockage est énorme car chaque donnée est présente sur chaque serveur.
  • Le coût d’insertion/modification/suppression est très grand, car on ne peut valider une transaction que si on est certains qu’elle a été effectuée sur tous les serveurs et le système fait patienter l’utilisateur durant ce temps.

De plus certains types de requêtes ne sont pas du tout optimisés dans ce type de base de données : imaginons une table contenant toutes les personnes vivant en France, soit plus de 60 millions, les données dans une base de données relationnel classique sont stockées par lignes, ainsi si on effectue une requête pour extraire tous les noms des personnes ayant moins de 15 ans, il faudra parcourir les 60 millions d’entrées et accéder au champ âge, or dû à la manière dont sont stockées les données cette informations n’est pas contigüe en mémoire de ce fait ont perd en performances car il faut du temps pour se placer sur la bonne donnée.

A cause de ces limitations, de nouvelles technologies ont été créées pour répondre à ces besoins, c’est ainsi qu’a été inventé d’autres architectures, celles-ci se nomment dans leur ensemble « bases NoSQL » pour « Not Only SQL »

Les bases NoSQL

Les bases NoSQL répondent aux besoins que nous avons vus précédemment. Comme il n’existe pas de solution miracle, il existe de nombreux types de bases de données spécifiques à des besoins différents. En règle générale ces bases de données respectent le théorème de CAP d’Eric Brewer, ce théorème consiste en trois notions :

  • Consistance (consistency /C) : Tous les clients voient la même vue même lorsqu’il y a des mises-à-jour.
  • Haute disponibilité (availability /A) : L’ensemble des clients peuvent trouver des données répliquées, même lorsqu’une panne survient.
  • Tolérant à la partition (partition-tolerance /P) : Le système est tolérant au partitionnement.

Ce théorème nous apprend aussi qu’il est impossible de respecter ces trois propriétés simultanément, nous ne pouvons en respecter seulement deux à la fois. Dans la majorité des systèmes se sont les propriétés A et P qui sont respectées. En effet dans beaucoup d’applications la consistance peut ne pas être un problème immédiat : si une mise à jour survient, les serveurs n’ont pas tous les mêmes données juste après la mise à jour, mais cette mise à jour va se propager plus ou moins lentement suivant le type de base de données et les paramètres échéant, donc « au bout d’un moment » les serveurs auront tous effectués cette mise à jour. Prenons l’exemple de Facebook :

  • Si la propriétés C n’est pas présente : un de vos amis publie quelque chose, vous ne le voyez pas immédiatement mais au bout de quelques minutes
  • Si la propriétés A n’est pas présente : un serveur tombe en panne, la moitié de vos amis ne sont plus accessible et de plus à chaque fois que vous publiez quelque chose votre navigateur met plusieurs secondes à charger la page.
  • Si la propriété P n’est pas présente : un serveur tombe en panne, la moitié de vos amis ne sont plus accessible, tout le système est ralenti, et vous ne pouvez plus publier quoi que ce soit.

Pour les entreprises le choix est facile, même dans un monde plus professionnel tel qu’un site marchand, celui-ci préférera que le client commande un produit qui n’est plus en stock au risque de devoir le contacter pour annuler la transaction plutôt que de voir tout le site ralenti et ainsi perdre de nombreux client.

Dû à la perte de consistance des problèmes de mise à jour peuvent se produire, si par exemple un client A modifie une donnée sur un serveur et qu’au même moment un client B modifie la même donnée deux versions différentes de cette données va se propager. Il y a donc une incohérence dans cette donnée, il existe plusieurs solutions à ce problème :

  • Soit on prend la version la plus récente (pas forcément évidant du à l’impossibilité de synchronisé véritablement les horloges entres les serveurs)
  • Soit le serveur fait remonter aux clients l’erreur pour qu’ils le corrigent eux mêmes

Il existe différents types de base de données NoSQL spécifiques à différents besoins, en voici quelques uns avec le nom des solutions :

  • Orientées colonnes
    • HBase
    • Hypertable
    • Cassandra
    • BigTable
  • Orientées graphes (Euler)
    • Neo4J
  • Orientées clé-valeur
    • Voldemort
    • Dynomite
    • Riak
  • Orientées document
    • CouchBD
    • MongoDB

Nous allons donc maintenant décrire ces différents types de base de données NoSQL.

Bases orientées colonnes

Les bases de données orientées colonnes ne diffèrent pas beaucoup des bases SQL classique du point de vue architectural, généralement le modèle n’est pas présent pour des questions de performances. La principale différence se situe à la façon dont les données sont stockées en mémoire : dans une base de données relationnelles les données sont stockées par ligne, de ce fait une requête portant sur peu de lignes mais beaucoup de colonnes sera rapide car le système n’aura pas à beaucoup se déplacer en mémoire, alors que dans une base orientée colonnes les données sont stockées par colonnes, de ce fait le système sera beaucoup plus rapide pour des requêtes portant sur peu de colonnes, il est donc beaucoup plus rapide de parcourir les lignes d’une table.

Bases orientées graphes

Les bases de données orientées graphe permettent de résoudre des problèmes très difficiles voir impossibles à résoudre dans une base de données relationnelle. Prenons exemple sur Facebook, si nous devions stocker dans une base SQL classique les relations entres les personnes la base serait très grosse et donc longue à parcourir pour rechercher les amis d’une personne.

Une base de données orientée graphe stocke les informations sous forme de graphe, elle permet de relier les entités entre elles et de manière optimisée.

La performance de ce type de base de données est très difficile à évaluer car trouver les relations d’une entité est très rapide, mais trouver une entité spécifique si on a aucune connaissance du système est très long, ce système est donc utilisé en parallèle d’une base de données SQL, celle-ci stockera les informations sur les entités et où aller la chercher dans le graphe, alors que la base orientée graphe stockera les relations entres les entités.

Bases orientées clé-valeur

Les bases de données orientées clé-valeur permettent de stocker une valeur, cette valeur peut être de tous type (entier, chaine de caractères, flux binaire, etc.) En revanche les requêtes ne portent que sur la clef associée à cette valeur. Ce système de base de données est conçu pour être très fortement répliqué de manière à augmenter la disponibilité et les performances. La réplication est données est plus ou moins partielle pour trouver un bon compromis entre nombre de serveurs, disponibilité et espace disque.

Bases orientées document

Les bases de données orientées document sont une extension des bases orientées clé-valeur, à la place de stocker une valeur, nous stockons un document. Un document peut contenir plusieurs valeurs et d’autres documents, qui peuvent à leur tour en contenir d’autres et ainsi de suite. Un document peu donc posséder plusieurs niveaux de profondeur. Tous les documents de niveau 0 sont identifiés par une clef et sont regroupés dans une collection.

Ce système est capable de faire des recherches sur les valeurs d’un ou plusieurs documents, le système étant partiellement répliqué, la requête va être envoyée à tous les serveurs simultanément et chacun va effectuer celle-ci et rendre des résultats différents, car toutes les données ne sont pas présentes sur tous les serveurs, ces résultats vont être ré-agrégés pour former le résultat finale à la requête.

Pour conclure les bases de données NoSQL permettent de rendre le système beaucoup plus performant et résistants aux pannes, en revanche comme celles-ci ne permettent pas de cohérence des données, elles ne sont que très rarement utilisées seule : une base de données relationnelle va contenir les informations où une cohérence est vitale et une base de données de type NoSQL va contenir tout le reste.

Les bases de données de type NoSQL étant des technologies encore très récente, il n’y a pas encore de normes qui permettent de définir une architecture type pour tel ou tel type de base de données, ni de syntaxe particulière ; bien que le mouvement tend vers une convergence pour des requêtes basées sur le langage JavaScript.

Références :

http://davidmasclet.gisgraphy.com/post/2010/06/09/10-minutes-pour-comprendre…NoSQL

Article regroupant les grands principes des bases de données NoSQL et une brève description de chacune.

http://en.wikipedia.org/wiki/Nosql

http://en.wikipedia.org/wiki/Graph_database

http://en.wikipedia.org/wiki/Document-oriented_database

http://en.wikipedia.org/wiki/Column-oriented_DBMS

http://en.wikipedia.org/wiki/Relational_database

Diverses informations sur toutes les notions abordées durant la synthèse et la présentation.

http://www.mongodb.org/

Site officiel de MongoDB avec différents articles, tutoriels, documentations sur leur base de données et les bases de données orientées documents.

Article au format PDF

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

Itunes 10.1 disponible

Une mise à jour pour Itunes est maintenant disponible, voici les nouveautés (changelog)

  • Utilisez AirPlay pour diffuser en continu, sans fil, des vidéos depuis iTunes sur la toute nouvelle Apple TV.
  • Synchronisez vos iPhone, iPad ou iPod touch équipés d’iOS 4.2.
  • Profitez d’un certain nombre d’améliorations importantes de stabilité et de performances.
Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

Mac OSX 10.6.5 disponible

Mac OSX 10.6.5 vient tout juste d’être mis à disposition!

Voici le changelog de cette mise à jour :

  • améliorer la fiabilité avec les serveurs Microsoft Exchange
  • résoudre un problème de performances de certaines opérations de traitement d’image dans iPhoto et Aperture
  • améliorer la stabilité et les performances des applications graphiques et des jeux
  • éliminer le délai entre les tâches d’impression
  • résoudre un problème d’impression de certaines imprimantes HP connectées à une borne d’accès AirPort Extreme
  • résoudre un problème lorsque des contacts de Carnet d’adresses sont glissés vers iCal
  • résoudre un problème empêchant le masquage automatique du Dock en faisant glisser un élément de la pile
  • résoudre un problème d’affichage dans Dictionnaire des informations provenant de Wikipedia
  • améliorer les performances de MainStage sur certains systèmes Mac
  • résoudre des problèmes d’espacement des polices OpenType
  • améliorer la fiabilité de certains écrans braille Bluetooth
  • résoudre un problème de VoiceOver se produisant en parcourant certains sites web avec Safari 5
Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

[Android] Détection des Gestures

Cet article va traiter de la détection des Gestures sur une application Android.

Pour commencer qu’est-ce qu’une Gesture? C’est une forme que vous dessiné avec le doigt sur l’écran de votre Smartphone, par exemple une croix, un cercle,…

L’outil de base pour cet article est le GestureBuilderActivity présent dans les exemples du SDK d’Android : celui-ci va vous permettre de dessiner vos Gestures puis de les sauvegarder dans un fichier pour pouvoir les réutiliser dans votre application. Celui-ci sauvegarde les Gestures sur la carte SD, mais rien ne vous empêche de récupérer ce fichier pour l’intégrer en tant que ressource dans votre projet.

Tout d’abord pour commencer il vous faut rajouter un layout dans le fichier layout/main.xml. Ce layout devra être au dessus de tous les autres pour pouvoir écouter les évènements du doigt sur l’écran. Nous utiliserons donc le code suivant :

<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
android:gestureColor="#00FFFFFF"
android:gestureStrokeType="multiple"
/>

Ceci permet de détecter les Gestures avec un ou plusieurs doigts, de laisser traverser les événements pour pouvoir réagir au click sur un élément situé sous le GestureOverlayView. La balise android:gestureColor permet de forcer la couleur en transparent, sinon un trait jaune suivra votre doigt tout au long de la Gesture.

Bon, on sait les dessiner, les écouter, il ne nous reste plus qu’à les traiter, ceci est vraiment simple :

public class GestureHandler implements OnGestureListener {
	private Activity appli = null;
	private GestureLibrary mLibrary;

	public GestureHandler(Activity app) {
		appli = app;
		File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");
		mLibrary = GestureLibraries.fromFile(mStoreFile);
		if (!mLibrary.load()) {
			appli.finish();
		}
	}

	@Override
	public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
		ArrayList
 predictions = mLibrary.recognize(overlay.getGesture());
		// On veut au minimum une prédiction
		if (predictions.size() > 0) {
			Prediction prediction = predictions.get(0);
			// On veut que la prédiction soit sure
			if (prediction.score > 1.0) {
				Toast.makeText(appli, prediction.name, Toast.LENGTH_SHORT).show();
			}
		}
	}

	@Override
	public void onGesture(GestureOverlayView overlay, MotionEvent event) {}

	@Override
	public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {}

	@Override
	public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {}	

}

Alors passons à l’explication : dans le constructeur nous générons la librairie des Gestures a partir du fichier Gestures présent sur la mémoire externe (carte SD), si ca ne se charge pas on quitte le programme.

Ici seul la méthode onGestureEnded nous intéresse, puisque l’on attend qu’une Gesture soit fini de dessiner à l’écran pour essayer de la reconnaître. Pour information une Gesture commence lorsqu’au moins un doigt est posé sur l’écran et que l’on commence à le bouger, et elle fini lorsque l’on enlève le doigt de l’écran. Rien ne nous empêche donc de mettre 20 secondes à dessiner notre Gestures.

La méthode onGestureEnded sera donc appelée dès qu’on aura relâché le doigt. La fonction mLibrary.recognize(overlay.getGesture()) nous permet de reconnaître la Gesture qui vient d’être tracé et de retourner un tableau de Gestures classé de celle qui ressemble le plus à celle qui ressemble le moins, toutes ces Gestures provenant de la librairie chargé plus tôt bien évidemment, si vous n’avez pas défini de Gestures vous n’aurais donc aucun résultat.

Le premier élément de la liste est donc celui qui ressemble le plus à ce que nous venons de dessiner, le soucis est que la fonction recognize peut nous retourner quelque chose même si rien ne ressemble de ce fait on rajoute la condition suivante if (prediction.score > 1.0) qui nous permet de nous assurer que le résultat est quand même relativement ressemblant à ce qu’on vient de tracer.

Pour finir la fonction Toast (très pratique par ailleurs), nous affiche une petite popup contenant le nom de la Gestures que la fonction vient de reconnaître.

Il ne nous reste plus qu’a relier le layout à la classe, on peut faire ceci dans la fonction onCreate de votre Activity principale :

		GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
		GestureHandler gh = new GestureHandler(this);
		gestures.addOnGestureListener(gh);
Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace

OpenEtna 6.1 RC4 disponible

Une nouvelle version d’OpenEtna vient de sortir.

Celle ci corrige entre autres les fonctions suivantes :

  • Fixed ‘AGPS is not working’ by Richard A. Burton
  • Added support for using the Home- and Backbutton LEDs as notification by Richard A. Burton
  • Fixed ‘Gapps does not install on reboot’
  • Added support for overclocking by saxando4u

Voir le ChangeLog complet

Télécharger la nouvelle version

Share and Enjoy:
  • Print
  • Facebook
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • Add to favorites
  • MSN Reporter
  • MySpace