rss
Affichage des articles dont le libellé est développement. Afficher tous les articles
Affichage des articles dont le libellé est développement. Afficher tous les articles

npm et bower: fiche pratique

Cet article est une fiche pratique (commandes de base) pour npm et Bower package managers.
  • Commandes utiles pour configurer NPM:
npm config set proxy http://proxy:8080
npm config set https-proxy http://proxy:8080
npm config set strict-ssl false
  • Installation
npm install -g bower
  • Bower derrière un proxy : utiliser les variables d'environnement http_proxy et https_proxy ou le fichier .bowerrc
  • Installation d'une dépendance
bower install jquery
  • Mise à jour d'une dépendance
bower update jquery
  • Info et version d'une dépendance
bower info jquery
bower search angular%bootstrap%
  • Bower repose sur un fichier de configuration bower.json dont voici un exemple:
{
  "name": "myproject-webgui",
  "version": "0.0.0",
  "dependencies": {
    "angular": "1.3.1",
    "json3": "~3.2.6",
    "es5-shim": "~2.1.0",
    "jquery": "~1.11.0",
    "bootstrap": "~3.0.3",
    "angular-resource": "1.3.1",
    "angular-cookies": "1.3.1",
    "angular-sanitize": "1.3.1",
    "angular-route": "1.3.1",
    "ng-table": "0.3.3"
  },
  "devDependencies": {
    "angular-mocks": "1.3.1",
    "angular-scenario": "1.3.1"
  }
}

PHP : sFTP et timeout pour une connexion SSL

En PHP, je cherchais comment mettre en œuvre un timeout plus court pour une connexion ou des commandes sFTP (secure FTP).

Sur une connexion FTP sans chiffrement, l'option est prévue :

ftp_connect($host, $port, $timeout);

Mais si l'on utilise ssh2 par exemple, on ne retrouve pas l'option "timeout" (du moins je n'ai pas trouvé!)

Au passage, on peut très vite se perdre dans des options de stream inexistantes :)
J'avais tenté un code dans le genre suivant mais sans succès :

$streamDir = 'ssh2.sftp://'.$stream.$remoteDir;
$stream_options = array('ssh2' => array('timeout' => 1));
$stream_context = stream_context_create($stream_options);
$handle = opendir($streamDir, $stream_context);


Du coup j'ai opté pour un test d'ouverture de port préalable à la connexion.
Pour cela, je n'utilise pas un ping fait maison (car le test serait incorrect suivant les conf. de firewall)
mais une ouverture de socket directement avec un timeout réduit.

voici la fonction préalable à une connexion sFtp que j'utilise :

/**
* test l'ouverture d'un port sur une hôte distant
*
private function __testHostPort() {
$timeoutsec = 2;
$fp = @fsockopen($this->_host, $this->_port, $errno, $errstr, $timeoutsec);
if (!$fp) {
throw new Ftp_Exception("$errstr ($errno)");
} else {
@fclose($fp);
}
}

Elle est appelée préalablement à la connexion SSH et lève une exception si le serveur n'a pas le port ouvert avant toute connexion SSH.

protected function _connect() {
if (!$this->isConnected()) {
$this->_logger->debug("_connect :" . $this->__tostring());
$this->__testHostPort();
$connexion = @ssh2_connect($this->_host, $this->_port);
(...)

PS : si vous avez mieux, je suis preneur... j'utilise le module php "openssh".

ExtJS - la gestion des évènements : les bases

Mini sommaire :



-Préambule : les pré-requis


J'installe ExtJS (Sencha); Un serveur Web (au hasard : WampServer);

Je crée un fichier : une page html simple comportant les pré-requis ExtJS :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Essai ExtJS</title>
<!-- ** Javascript ** -->
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext/ext-all.js"></script>
</head>
<body>
Coucou
<div id="test-div"> </div>
</body>
</html>


Les pré-requis sont satisfaits si j'arrive à voir Coucou lorsque je vais sur l'adresse locale de ma page (ie. http://localhost/test.html)

-Exemple n°1 : gestion d'un évènement très simple


Je déclare un bouton, et sur le clic du bouton, j'affiche une alerte :

<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,text:'Cliquez moi'
,handler:function() {
alert(' you do it !');
}
,applyTo:'test-div'
});
});
</script>
<div id="test-div"/>

Dans cet exemple, l'attribut handler comporte une fonction (ou une référence vers une fonction) qui est invoquée lors de l'action sur le bouton.

-Exemple n°2 : gestion d'un évènement de composant


Chaque composant ExtJS est décrit dans la documentation en ligne. En dépliant le noeud "Ext" on retrouve bien "Button".
Sur chaque composants, la documentation décrit les évènements que génère ce dernier.
en se rendant sur le paragraphe "events" on constate donc qu'un bouton génère les évènements suivants : added, afterrender, beforedestroy, beforehide, ...

Dans l'exemple 2 nous allons déclencher un affichage sur réception de l'évènement "mouseover" et "mouseout". Les lignes de documentation relatives à ces évènements précisent les paramètres reçus lors du déclenchement de l'évènement. Ici dans les deux cas nous aurons 2 arguments : le bouton et un event (évènement levé par le navigateur avec notamment la position de la souris).


<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,text:'Cliquez moi'
,handler:function() {
alert(' you do it !');
}
,applyTo:'test-div'
});
buttonObject.on('mouseover', function(btn, evt) {
btn.setText("Cliquez-moi :o)");
});
buttonObject.on('mouseout', function(btn, evt) {
btn.setText("Nooon ici ! :o(");
});
});
</script>
<div id="test-div"/>


-Exemple n°3 : création d'un évènement spécifique


Une fois le pas pris de coder en mode "évènementiel", de nombreux cas de figure ou applications viennent à l'esprit (si si), et se pose la question alors de gérer ses propres évènements fait maison.

Voici un petit exemple simple (on ne demande que çà) qui va créer un évènement maison "troisclics" lorsque l'utilisateur en sera à son troisième clic sur le bouton.

Dans un premier temps il faut déclarer l'évènement du composant : on utilise "addEvents"
Dans un second temps on déclenche l'évènement : on utilise "fireEvent"


<script type="text/javascript">
Ext.onReady(function(){
var buttonObject = new Ext.Button({
id: 'monBeauButton'
,nbclic: 0
,text:'Cliquez moi'
,handler:function() {
this.nbclic++;
if (this.nbclic == 3) {
this.fireEvent("troisclics", this);
}
}
,applyTo:'test-div'
});
buttonObject.on('mouseover', function(btn, evt) {
btn.setText("Cliquez-moi :o)");
});
buttonObject.on('mouseout', function(btn, evt) {
btn.setText("Nooon ici ! :o(");
});
buttonObject.addEvents("troisclics");
//
// (...)
//
buttonObject.on('troisclics', function(btn) {
alert(' you do it 3 times !');
});
});
</script>

ExtJS - Ext.data.Store - traitement d'exception pour un service JSON

Aujourd'hui, voici un mini tutoriel permettant de comprendre comment gérer un retour en erreur pour un appel de service JSON depuis un client JavaScript utilisant ExtJS API doc..

Personnellement, je trouve qu'ExtJS est assez bien documenté pour les cas nominaux, mais manque cruellement d'exemples dans le cas des traitements d'exception. C'est dommage car on le sait bien, les cas nominaux ne sont pas toujours au rendez-vous ;)

Dans ce mini tutoriel, un service "getUsers" permet de retourner une liste d'utilisateurs (il peut être implémenté en PHP par exemple, mais ce n'est pas l'objet de ce tutorial).

Voici un exemple de retour fait par ce service lorsqu'aucune erreur ne survient :
{
"results":4,
"rows":
[{"id":"1",
"login":"brice",
"date_inscription":"2009-02-10 14:20:00",
"fullname":"Brice"},
{"id":"10",
"login":"toto",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto"},
{"id":"11",
"login":"toto2",
"date_inscription":"2009-10-28 08:10:00",
"fullname":"toto2"},
{"id":"13",
"login":"toto4",
"date_inscription":"2009-10-28 09:10:00",
"fullname":"toto4"}],
"success":true
}
A noter : dans cet exemple, 4 utilisateurs sont retournés sous le noeud "rows", et la propriété "success" vaut "true".

Voici le retour du même service lorsqu'une erreur survient (ie. Base de donnée injoignable) :
{
"results":1,
"success":false,
"errors":[
{"id":"500",
"msg":"Erreur de connexion à la base de donnée."
}]
}
A noter : dans cet exemple, 1 exception a été levée et traduite sous la forme d'un message d'erreur (id="500", msg="Erreur de connexion à la base de donnée."), et la propriété "success" vaut "false".

Voici maintenant comment gérer ces 2 types de retour côté client à l'aide d'ExtJS :
var dateFormat = 'Y-m-d G:i:s';
// ancienne valeur par defaut : 'm/d/Y'
// dateFormat correspond a une date
// de la forme : "2009-10-28 10:10:00"

var myStore = new Ext.data.Store({
url: 'http://localhost/getUsers.php5', // URL du service JSON
title: 'TOTO',
reader: new Ext.data.JsonReader({ // Reader JSON
idProperty: 'id',
root: 'rows',
totalProperty: 'results',
successProperty:'success',
fields: [
{name: 'id'},
{name: 'login'},
{name: 'date_inscription',
type: 'date',
dateFormat: dateFormat},
{name: 'fullname'}
]
})
});
A noter : dans cet exemple, on déclare l'Ext.data.Storedoc "myStore" qui va faire appel au service ('getUsers.php5'), et va lire le résultat grâce à un analyseur JSON (JSONReaderdoc). La lecture sera considérée comme un succès si la propriété "success" vaut "true". La manière d'interpréter les différents champs est également décrite.

On va également implémenter un analyseur JSON (JSONReader) capable d'interpréter un retour en erreur :
var errorReader = new Ext.data.JsonReader({
idProperty: 'id',
root: 'errors',
totalProperty: 'results',
fields: [
{name: 'id'},
{name: 'msg'}
]
});
A noter : dans cet exemple, la structure JSON lue doit posséder le nombre d'erreur sous "results" et les différentes erreurs sous la racine "errors". Ici une erreur comporte 2 champs : un "id" et un "msg".


Il convient ensuite de déclarer une méthode de traitement d'erreur de la manière suivante :
myStore.on('exception', usrException);
A noter : dans cet exemple, on indique pour myStore que sur réception de l'évènement "exception", un appel à la méthode "usrException(...)" doit être fait. Dans la version 3 d'ExtJSdoc, l'évènement "loadexception" est indiqué comme obsolète (deprecated) et ne doit donc plus être utilisé.

Voici maintenant comment interpréter le retour en erreur lors de l'appel au service :
function usrException(dataProxy, type, action, options, response) {
// alert('usrException type=' + type
// + ' action=' + action
// + ' response.status=' + response.status);
if (type == 'response' && action == 'read' && response.status == 200) {
var rs = errorReader.read(response);
if(rs.records) {
for(var i = 0, len = rs.records.length; i < len; i++) {
var r = rs.records[i];
alert("Erreur de chargement ERR"
+ r.data.id + ":" + r.data.msg);
}
}
} else if (type == 'response' && action == 'read') {
alert("Connexion impossible au serveur ("
+ response.status +")");
}
}
A noter : dans cet exemple, on traite un cas d'erreur sur lecture du résultat. On utilise l'analyseur d'erreur précédemment évoqué pour interpréter le retour d'erreur de service en JSON et afficher une alerte sur chaque erreur lue.

Enfin, il ne manque plus que l'appel à "myStore" permettant de lancer le service :
myStore.load();


Si l'appel au service "getUsers" se passe correctement, alors le store pourra afficher le resultat au sein d'un Ext.grid.GridPanel par exemple, sinon la méthode "usrException" sera invoquée.

Ce mini tutoriel peut sûrement être complété, ou bien si vous avez une autre solution, je suis preneur !

En attendant, à vous de jouer!

Correction du gadget iGoogle Wikipen

Bon, enfin la voilà ! Une petite correction aujourd'hui du gadget Wikipen ...

En effet, depuis la migration de Wikipen du 9 avril, ce dernier n'affichait plus aucun texte...


Le problème venait de la méthode de récupération d'un texte aléatoire effectué grâce à la page "Special:Random". La nouvelle version de MediaWiki semble plus attentive ;)


Si vous ne connaissez pas encore ce petit gadget ; il s'agît d'un petit bibelot iGoogle qui affiche un texte issu de l'odyssée Wikipen. Chaque jour, vous pouvez découvrir de nouvelles créations. Je vous invite d'ailleurs à proposer vos propres créations en rejoignant la communauté Wikipen ou l'association Wikipen.

En bas de cette page, vous avez une visualisation du gadget en action. Pour plus de détails (ou pour soumettre un bug aussi ;) rendez-vous sur la page projet de Wikipen Gadget.

Bonne lecture !

Mots clés du blog

10.1 4G acceptancetest adb androï Android androïd Android7 api appender appengine application applications archive array assistantematernelle astuce auth0 authentication authority automation Axis bash bearer blog boot bootloader bower build bundle c calendrier camille combal cdi certificate cf client cloudfoundry collaboratif command commandes connexion console css cyanogen decrypt démasquées démasquer développement dll dump easter eggs écologie écrit employeur EMUI EMUI5.0 encrypt enfant évènement export-package ExtJS fab fastboot fiche find firefox gadget galaxytab gelf gem git gmail gnupg gooelappengine google gparted gpg gpg2 gps graylog grenoble Grid gui harddrive heroku hover howto HTML http https IE ihm immobilier imprimante innovation insolite instance integration Java JavaScript jenkins jeu jobs json json-schema-validator key keystore labs linux livre log log4j logger logs lombok masquées masquer maven maven-gae-plugin Mémoire microsoft mobile mockito mondialisation monitor MUSE musique en ligne myopera nodejs npm NT NTEventLogger onglet openstack osgi paas package parameters parent php politique prosyst prototype proxies proxy quartz radio rappel recherche regex repository resize RIA ridge rock ROM route ruby rubygems s8500 samsung scheduler scm secret secure sel selenium Serializer server shared shell sign signature slf4j smartphone so société song spy ssh ssl struct swagger swig tâches téléphone téléréalité test thunderbird timeout token Tomcat tooltip tooltips truststore TWRP ubuntu unit test validator verify virgin virtualbox wave waze web WebApp wiki wikimedia wikipédia wikipen wiko windows windows10 yahoo youtube yum