Alors, pourquoi j'ai nommé nom blog, "la tribu des mini pouces" ?
Tout commence lorsque ma femme m'a parlé d'une tribu mystérieuse en Corée, la "Tribu des mini pouces" ... J'ai alors pensé d'une tribu autochtone, qui avait la particularité d'avoir des petit pouces, afin de mieux visé à l'arc ...
Mais il n'en était rien ... en fait, ce sont les personnes championnes d'écriture de Texto sur portable ! (ce qui n'est certainement pas mon cas ... )

Apparament, il n'est pas rare de rencontrer des jeunes coréens taper des texto à la vitesse de la lumière ! Voici donc un petit hommage,a tous les Geeks et Geekettes, et surtout aux développeurs dont certains se reconnaitront dans cette tribu ... ^^

dimanche 12 décembre 2010

Enlever le index.php de l'URL



Lorsque vous débutez un nouveau projet sur codeIgniter, a première chose est de supprimer le chaine "index.php" de l'url.
Ce mini tuto est une note pour moi même ...

1- ouvrir le fichier application/config/config.php et remplacer
$config['index_page'] = "index.php";

par
$config['index_page'] = "";


2- créer un fichier .htaccess et mettre :

RewriteEngine On
RewriteBase /modificationDuCheminDeBase
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]


Et maintenant, ca devrait marcher ...

dimanche 5 décembre 2010

Installation d'un compresseur Javascript YUI sur CodeIgniter


Bonsoir à tous,

Après un moment d'absence, je vais vous présenter comment installer YUI Compressor, et l'utiliser. Mais nous allons tout d'abord voir à quoi cela peut il servir ...

I. Introduction
YUI compressor a été développé par Julien Lecomte, il y a pas mal de temps, c'est à dire lors de YUI 2.0 (à vérifié...) En tout cas, son script est toujours apprécié et rend service à bien des développeur comme moi. YUI Compressor a été développé sous Java et permet de compresser des codes javascript. YUI Compressor est très utilisé pour des applications full-javascript ou le code peut aller à plusieurs centaines de milliers octets ! Mais aussi pour compresser des fichiers css(en enlevant tout le superflu). Je crois que la moyenne de compression est un facteur 44%, ce qui est plutôt pas mal ... !

II. Installation
Vous vous rendez sur la page suivante et vous téléchargez YUI Compressor.
page de téléchargement
A la racine de votre répertoire d'application (ou se trouve le répertoire "system" de CodeIgniter), vous allez créer le répertoire 'lib','min', et 'js'. Afin d'avoir un environnement plus développé, vous pouvez créer un répertoire 'media' ou vous mettrez tous les fichiers media, c'est à dire images, musics, et videos (créez les répertoires correspondants).
Vous ajouterez de plus le répertoire 'yuiCompressor', dans lequel vous décompresserez votre fichier zip.

on aura donc une arborescence de la manière suivante:

|- js
|- lib
|- yuiCompressor
|- media
|- images
|- musics
|- videos
|- min
|- system (répertoire de CodeIgniter)

le répertoire 'js' est votre répertoire de développement javascript,et le répertoire 'min' deviendra le lieu ou seront stocké vos fichier compréssés...

Maintenant, Il faut installer une partie de mon framework maison qui se nomme 'Corus'.
donc dans le répertoire system de Codeigniter, il faut aller sur lib et créer un répertoire 'corus' et vous mettrez le fichier explorer.php et yuiComressor.php. Le premier permet de récupérer l'arborescence d'un répertoire ainsi que tous ses fichiers existants, et le deuxième permet d'effectuer une compression javascript ou css.

ps :N'oubliez pas de rajouter les balise php !!!
voici le contenu des deux fichiers:
explorer.php


class explorer {

public $file = array();
public $dir = array();


public function __construct($path){
$this->mklist($path);
}


public function mklist($p) {
if(is_array($p) && isset($p{'path'}))
$path = $p{'path'};
else $path = $p;

if ($dir = opendir($path)) {
while($file = readdir($dir)) {
if($file!='.' && $file!='..'){
if(is_file("$path/$file"))
$this->file[] = "$path/$file";

if(is_dir("$path/$file"))
$this->dir[] = "$path/$file";
}

if(is_dir("$path/$file") && !in_array($file, array(".","..")))
$this->mklist("$path/$file");
}
closedir($dir);
}
}
}

yuiCompressor.php

/**
* Définir la version de yui compressor
* La version se trouve dans le nom du fichier yusiCompressor/build/yuicompressor-x.y.z.jar
* la forme est : x.y.z ou x,y,z sont des chiffres
*/
define('YUI_COMPRESSOR_VERSION','2.4.2');


class yuiCompressor {

public $directories = array();
public $files = array();
private $debugExist = false;
public $nom = '';



/*
Constructeur
*/
public function __construct($name=''){
if(empty($name))
$name = 'default';
$this->nom = $name{'name'};}



/*
Effacer les repertoire et fichiers ...
*/
public function delete(){
$this->directories = array();
$this->files = array();
$this->debugExist = false;
}




/*
Ajout d'un répertoire
*/
public function addDir($dir=''){
try{
if(empty($dir))
throw new Exception('argument vide');


if(!file_exists($dir))
throw new Exception('Repertoire inexistant');


$this->directories[] = $dir;
// Récupération de tous les fichiers à partir des repertoires selectionnés par l'utilisateur
$ci = & get_instance();
$param{'path'} = $dir;
if(!isset($ci->explorer))
$ci->load->library('corus/explorer',$param);
else
$ci->explorer->mklist($param);
$temp = $ci->explorer->file;
foreach($temp as $v)
$this->files[] = $v;
return true;
}
catch(Exception $e){
return '< pre>'.$e.'';
}
}



/*
Ajout d'un fichier
*/
public function addFile($file){
try{
if(empty($file))
throw new Exception('argument vide');


if(!file_exists($file))
throw new Exception('Fichier inexistant');


$this->files[] = $file;
return true;
}
catch(Exception $e){
return '< pre>'.$e.'';
}
}




/*
Création du fichier *.debug.js
*/
private function generateDebug($option,$type){
try{
$liste = array();
$ci = & get_instance();

// Efface le fichier précompilé si il existe
$path = FCPATH;
if(file_exists($path.'min/'.$this->nom.'.debug.'.$type.'.'.$option))
unlink($path.'min/'.$this->nom.'.debug.'.$type.'.'.$option);


// Vérification qu'il n y a pas de doublons
$verif = array();
foreach($this->files as $el){
if(array_search($el,$verif)===false && substr($el,strlen($option)*(-1)-1)=='.'.$option )
$verif[] = $el;
}
$this->files = $verif;
$this->directories = array();
if(empty($this->files))
throw new Exception('Aucun fichier trouvé');

// Création du fichier
$temp = '';
foreach($this->files as $v){
$temp .= file_get_contents($v);}
file_put_contents($path.'min/'.$this->nom.'.debug.'.$type.'.'.$option,$temp);
$this->debugExist = true;
return true;

}
catch(Exception $e){
return '< pre>'.$e.'';
}

}



/*
Création du fichier *.min.js
*/
private function generateMin($option,$type){
try{

// Supprime la dernière version du fichier
$path = str_replace('system/','',BASEPATH);
if(file_exists($path.'min/'.$this->nom.'.min.'.$type.'.'.$option))
unlink($path.'min/'.$this->nom.'.min.'.$type.'.'.$option);

// Création de la requête
$version = YUI_COMPRESSOR_VERSION;
$entre = $path.'min/'.$this->nom.'.debug.'.$type.'.'.$option;
$sortie = $path.'min/'.$this->nom.'.min.'.$type.'.'.$option;
$cmd = "java -jar ".$path."lib/yuiCompressor/build/yuicompressor-$version.jar $entre -o $sortie --charset utf-8";
exec($cmd,$out);
if(!empty($out))
throw new Exception('Erreur dans l\'execution de la commande');
return true;
}
catch(Exception $e){
return '< pre>'.$e.'';
}
}



/*
Minifier les fichiers
option : js ou css
type: mobile ou page
*/
public function min($option,$type){
try{
// type de page invalide
if($type!='page' && $type!='mobile')
throw new Exception('type de page invalide');

// Extension du fichier invalide
if($option!='js' && $option!='css')
throw new Exception('Extension de fichier invalide');

// si pas de fichier
if(empty($this->directories) && empty($this->files) ){
throw new Exception('pas de fichier');}


// création du fichier *.debug.js
$this->generateDebug($option,$type);


if($this->debugExist!==true)
throw new Exception('Erreur dans la création de *.debug.js');


// création du fichier *.min.js
$this->generateMin($option,$type);

return true;
}
catch(Exception $e){
return '< pre>'.$e.'';
}
}
}


Retenez que pour utiliser yuiCompressor, il vous faudra explorer.php ! (sinon, rien ne marchera ...)

Voila, nous somme arrivé au terme de notre installation ! Et nous allons pouvoir faire nos premiers compressions!

pour ceux qui utilise Linux, il faudra faire une modification à la fonction generateMin et modifier le contenu de la variable $cmd. Pour cela, il fau se référé à la documentation yui compressor.


III.Utilisation

L'utilisation est plutôt simple, et se décompose en 4 parties:

1. Appel de la librairie yui compressor
Dans une fonction d'une classe de parent Controller
mettre :

$this->load->library('corus/yuiCompressor',$param);


2. Ajouter les fichiers ou répertoire de votre projet javascript:

$path = 'PATHFC.'js/index';
$this->yuicompressor->addDir($path);//exemple d'ajout de répertoire
$this->yuicompressor->addFile($path.'/toto.js');// exemple d'ajout de fichier javascript


3. Action ! compresser les fichier en 1 seul fichier :

$this->yuicompressor->min('js');


4. Optionnel, si vous devez compressez en plusieurs fichiers, utlisez :

$this->yuicompressor->delete();

entre les différentes phases de compression

Commentaire: pour compresser des fichiers css, à l'étape 3, il faudra simplement remplacer 'js' par 'css'. Remarquons, que la classe yuiCompressor, sera distinguer les type de fichiers js du css !

Vous remarquerez les fichiers compressé sont dans le répertoire min !
vous avez une extension .debug.js (ou .debug.css) (qui est simplement un agglomérat des fichiers ajouté les uns aux autres)
et les extensions (.min.js ou .min.css) étant les fichier compressé et à utiliser en production... !


IV Conclusion
Nous avons vu comment compresser des fichiers javascript et css avec yui Compressor. Les fichiers compressés avec une compression zip (deflate) deviennent au final la meilleurs solution en terme de rapidité de chargement d'une application web full javascript !
imaginez ce module associé à extjs + Sencha Touch + intégration de la librairie Zend sur CodeIgniter, et vous obtiendrez un outil de développement ultra efficace !
nous verrons justement comment intégré extjs et sencha Touch sur CodeIgniter ... !

A très bientot
Takitano !

samedi 23 octobre 2010

Installer Zend Framework dans Codeigniter


I. Introduction

Alors pourquoi installer zend framework dans CodeIgniter ? C'est pour dire, que l'on est super fort, ou pour faire des choses inutiles ? Non, en fait la Zend est très riche en fonctionnalité, et couplé avec CodeIgniter, on obtient passe d'une mobylette à un super tank !
En effet, on pourra aisément utiliser les library d'Amazon, Twitter, yahoo, Delicious, flirck, et surtout GOOGLE API (qui est nommé aussi GDATA) !!!
Mais aussi les autres fonctionnalités qui se trouve dans Zend Framework ... ! bref, TOUT CE QUI SE TROUVE DANS LA DOC DE ZEND SERA ACCESSIBLE !


II. Une installation de 5 minutes

top chrono ... !
1. Tout d'abord, aller sur le site de Zend Framwork, puis télécharger toute la lirairie Zend.
2. Dezipper le fichier, et mettre tout le contenu du repertoire
Zend
dans
[MON_APPLICATION]/system/library/Zend

3. ouvrir le fichier
[MON_APPLICATION]/system/config/config.php
et remplacer
$config['enable_hooks'] = FALSE;

par
$config['enable_hooks'] = TRUE;

4. Créer un fichier zend.php dans
[MON_APPLICATION]/system/hook/

et mettre le contenu suivant :

<?php
/*
Ajout de la librarie Zend dans l'include _path
Chargement de la llibrairie Zend

Attention: il faut activer la la variable $config['enable_hooks'] à TRUE !
*/
function zend(){

set_include_path(get_include_path() .
PATH_SEPARATOR . str_replace(array('/','C:'),
array('\\','c:'),FCPATH.'system\libraries'));

require_once 'Zend/Loader/Autoloader.php';
$temp = Zend_Loader_Autoloader::getInstance();
}
?>

4. Dans le fichier
[MON_APPLICATION]/system/config/hook.php

rajouter le code suivant:
$hook['pre_controller'][] = array(
'class' => '',
'function' => 'zend',
'filename' => 'zend.php',
'filepath' => 'hooks',
'params' => array()
);


III .Comment ca marche ?
Alors, si vous avez bien suivi les instruction de la deuxieme partie, votre librarie sera installer.
Ce qui est intéressant, c'est que la Zend Framework sera automatiquement chargée et que surtout l'autoloader de zend framework sera activer ! donc EFFICACITE et RAPIDITE !

Pour utiliser Zend Framework, il suffira tout simplement de suivre la documentation de Zend (mélange du francais et de l'anglais :( ).

Je vous propose de suivre l'exemple suivante (utiliser le web service de yahoo pour faire une recherche ...):

1. aller à la page suivante de la documentation
2. Vous recopier le code d'exemple :
$yahoo = new Zend_Service_Yahoo("ID_APPLICATION_YAHOO");
$results = $yahoo->imageSearch('PHP');
foreach ($results as $result) {
echo $result->Title .'<br />';
}

et vous le coller dans un controller que vous aurez préalablement créé ...
3. vous appeler le controller ... et magique, vous obtenez le résultat de la recherche PHP !

IV. Conclusion
Je pense que l'installation proposée, n'est pas trop compliqué à suivre, sinon, n'hésitez pas à mettre un commentaire. Il était possible d'intégrer plus intimement Zend framework avec CodeIgniter, mais le chargement d'une librairie par instanciation sur CodeIgniter est difficilement compatible avec les design pattern de Zend qui utilise parfois un factory ou singleton ...
Le faite de suivre la documentation zend pour utiliser cette librairie, ne donnera pas de confusion à l'utilisateur sur le processus d'intanciation des objets zend.

mercredi 13 octobre 2010

Le dernière touche , vue sur Codeigniter


La vue sous codeIgniter , qu'est ce donc ?
C'est simplement l'une des trois composantes du modèle MVC (Modèle MVC étant un design pattern reconnu dans la communauté des développeurs ...)
Pour rappel, le Controleur est le chef d'orchestre, et c'est lui qui appellera les classes, méthodes, librairie et tout autre outils afin de pouvoir réponse à la requète. Il appellera notamment le Modèle (afin de récupérer les valeurs des variables) et la Vue afin de les mettre en formes.
Remarquons simplement que le Modèle, la Vue et le Controleur forme le MVC, comme Modèle MVC ... mm intéressant, non ? :)

Je vais donner dans cette présente article, une vue réutilisable (pour chaque controleur) et très simplement configurable, qui permet de finaliser la présentation du controleur.


I. Se mettre dans le contexte...
Le controleur après avoir récupérer les données, avec le modèle puis mise en page avec une vue particulière, il lui faut faire un bel encadrement pour mettre en valeur tout le code html qu'il a généré. Cet encadrement prend la forme d'une ou plusieurs balises div imbriquées les unes sur les autres(si l'on souhaite ou pas faire des coins arrondis).

Il y a deux écoles: les webdesigner auront tendances à mettre le code pour l'encadrement dans la vue de chaque controlleur, et les développeurs créront une autre vue pour l'encadrement qu'il appliqueront pour tous les controlleurs concernés. Les deux approches se valent, mais avec cependant avec un petit avantage pour les développeurs. En effet, si un jour, l'on souhaite intégré un nouveau type d'encadrement avec un structure différentes, alors le webdesigner devra modifier alors toutes les vues de tous les controleurs alors que le developpeur modifira uniquement la vue de cet encadrement...


II.Un peu de pratique, présentation de notre vue !
Sur CodeIgniter, la vue se situe dans le répertoire

Racine/system/application/view
Pour créer une vue, il vous suffit de créer un fichier dont l'extension est '.php', par exemple 'maVue.php'. Vous ouvrez le fichier, puis vous tapé:

<<?php
if(isset($type))echo $type;else echo 'div';
if(isset($id)) echo " id=\"$id\"";
if(isset($class)&& sizeof($class)>0)
echo ' class="'.implode(' ',$class).'"';
if(isset($autre)&& !empty($autre))
foreach($autre as $k=>$v)
echo " $k=\"$v\"";?>>
<?php echo $content;?>
</<?php if(isset($type))echo $type;else echo 'div';?>>

Ce code vous permettra de généré la plupart du code html, et pour être plus précis, il pourra généré toutes les balises ouvrantes, avec toutes les options que vous souhaitez ... !


III.Alors comment l'utiliser ?
Dans une méthode du controleur, il vous faut créer un tableau associé dans lequel vous devez renseigner au moins la valeur qui a pour clé 'content', afin de renseigner le contenu de la balise (a part les balises <a>, si l on souhaite faire une ancre...)
Sinon, pour le reste, c'est optionnel. Voici un exemple dans lequel on reseigne tous les champ utiles :

$t{'type'} = 'a';
$t{'autre'} = array('href'=>'www.yahoo.fr');
$t{'id'} = 'id_de_a';
$t{'class'} = array('class_1','class_2');
$t{'content'} = 'mon contenu de id_de_a';
$this->load->view('maVue',$t);

On peut remarquer que $t{'autre'} a pour type de valeur un tableau associé. En effet, pour rajouter des option à part l'identifiant et la classe, on a besoin d'une paire clé/valeur (Bases de xhtml).
De plus $t{'class'} est un tableau, cela vient du fait que l'on peut ajouter plusieur class dans une balise.
Je pense qu'il est aisément compréhensible que :
- $t{'type'} est le type de balise,
- $t{'autre'} est l'ajout de champ optionnel dans la balise
- $t{'id'} est l'identifiant de la balise
- $t{'class'} est les classes de la balise
- $t{'content'} est le contenu situé à l'intérieur de la balise


IV.Conclusion
Vous pouvez modifier cet objet à votre convenance et l'adapter a vos besoin ... cependant, je vous conseille fortement de replir $t{'autre'} au strict minimum, c'est à dire lorsque c'est nécessaire. Qu'est ce qui n'est pas nécessaire ? mm par exemple les styles ....Pourquoi? parce que lorsque vous appelerez d'autres controlleurs pour générer des petit bout de html, vous multiplierez inutilement le calcul de votre serveur ...
Ce bout de code est a utiliser (pour optimiser son efficacité) à la fin de chaque méthode du controleur, qui permettra de faire un belle mise en page avec le css.(donc ne pas appeler cette vue 50 fois dans une même méthode du controleur !)

mardi 12 octobre 2010

un .htaccess optimisé ...


Ah, aujourd'hui, avec GoogleSpeed, tout développeur se doit d'optimiser ses pages. C'est tout de même un travail de longue haleine :( ... Mais un bon fichier .htaccess, nous permettra de nous macher notre travail ! Voici le contenu d'un htaccess type:


RewriteEngine On
RewriteBase /projet
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

# MOD_DEFLATE COMPRESSION
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/x-httpd-php
#Pour les navigateurs incompatibles
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
#ne pas mettre en cache si ces fichiers le sont déjà
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
#les proxies doivent donner le bon contenu
Header append Vary User-Agent env=!dont-vary

# BEGIN Expire headers

ExpiresActive On
ExpiresDefault "access plus 7200 seconds"
ExpiresByType image/jpg "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 2592000 seconds"
ExpiresByType image/icon "access plus 2592000 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType text/css "access plus 2592000 seconds"
ExpiresByType text/javascript "access plus 2592000 seconds"
ExpiresByType text/html "access plus 7200 seconds"
ExpiresByType application/xhtml+xml "access plus 7200 seconds"
ExpiresByType application/javascript A259200
ExpiresByType application/x-javascript "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"

# END Expire headers

# BEGIN Cache-Control Headers


Header set Cache-Control "max-age=2592000, public"


Header set Cache-Control "max-age=2592000, public"


Header set Cache-Control "max-age=2592000, private"


Header set Cache-Control "max-age=7200, public"

# Disable caching for scripts and other dynamic files

Header unset Cache-Control


# END Cache-Control Headers

# KILL THEM ETAGS
Header unset ETag
FileETag none

# protect wpconfig.php

order allow,deny
deny from all


# protect the htaccess file

order allow,deny
deny from all


# protection de la lecture des répertoires
Options -Indexes


Ah ben maintenant c'est simple, il faut copié et coller le contenu ...
il ne faudra pas oublié d'activé certaine fonctionnalité sous apache !
Je parle de headers_module, rewrite_module et de defalte_module
!

De plus, vous avez un editeur de htaccess en ligne qui s'appelle HtaccessEditor. Voila, je crois avoir tout dit ...

Les outils de base de développement web


Je vous présente ma sélection des meilleurs outil web pour développer des sites web ou web application.

CodeIgniter: Framework PHP qui est à mon goût le meilleur.(même bien plus que Zend Framework ou Symfony). Son avantage ? Une documentation claire et précise qui répond à la grande majorité des problématiques des développeurs. De plus, il est simple à utiliser et sa prise en main est rapide. CodeIgniter se place parmi les plus légers, donc aussi les plus rapide, peut être. En tout cas, j'apprécie son ergonomie et sa facilité d'utilisation. Ses défauts ? Une librairie pas assez étoffé, mais qui peut être rattrappé, en téléchargeant ceux de PEAR ou Zend.

WAMP SERVER : Serveur local, qui s'installe sur la machine du développeur. WAMP est probablement le plus utilisé. Avantage ? simple et robuste ... défaut ? Après de longue journée, difficile à distingué le blanc du jaune... cela a tendance à énervé ... !

PHPUnit : Je pense que c'est le meilleur framework de test. D'ailleur Zend l'ont repris pour l'intégré dans leur IDE. Le problème, la syntaxe est parfois un peu verbeux, la documentation manques parfois de précision et c'est difficile de l'installer(notamment parce qu'il faut installer xdebug et PEAR) ...Pas mal de défauts, mais beacoup d'avantage:
- création automatique de rapport
- analyse de code mort
- possibilité de généré la classe fonctionnelle en fonction de la classe de test (pratique ...) et encore pas mal de choses à découvrir ...

DokuWiki:pour faire de la documentation. Très simple à installer, pas besoin d'avoir une base de donnée, et configuration rapide. De plus la prise en main et rapide ...

YUI 3: Framework Javascript, il est à mon sens le meilleur Framework javascript léger. En effet, on peut générer sa propre librairie en fonction de ses besoins. De plus la documentation est très bien fournit.

YUI Compressor : Compression des fichier javascript et css. Pas trop difficile à l'utiliser avec sa documentation. Il faudra préalablement installer Java sur la machine pour l'utiliser.

Extjs: Meilleur Framework Javascript pour faire des applications Web. Extjs, fait parti de Sencha, qui rachete les technologies les plus prometteurs. Extjs à pris une grande longeur d'avance sus ses concurents. on peut cité maintenant la possibilité d'exporter facilement ses application sur tout type de support:
- via le navigateur avec extjs
- via les smartphone avec jqtouch
- sous forme logiciel avec Adobe Air.
De plus, JQtouch est en HTML 5 et CSS3 ! et il y a une migration de ces nouvelles normes pour extjs. Son point fort est d'avoir une très bonne documentation, et de nombreux d'exemples...