lundi 16 mars 2015

Highcharts 4.1.0 : la bibliothèque HTML5 / JavaScript

vendredi 13 mars 2015

La fin de Google Code !

jQuery UI 1.11.4 est disponible !

mercredi 11 mars 2015

Nouveautés Apple MacBook

Zoom sur Android 5.1

USB Type-C

Apple Watch / Batterie

SDK 5.1 d'Android

vendredi 27 février 2015

Webix : un framework javascript UI performant !

Trouver un Framework Web performant n'est pas une chose facile.

Une fois trouvé, il est nécessaire que la mise en oeuvre de ce Framework soit la plus "rapide" et la plus "intuitive" possible pour le développeur.

Ce Framework doit aussi correspondre à certaines exigences techniques (support HTML5, support des différents "devices" actuels, collection complète de widgets UI).

Webix correspond à ces exigences.

Ce Framework est proposé en version gratuite et en version pro (payante).

La version gratuite est très complète et permet de couvrir la plupart des besoins.

La version pro propose des fonctionnalités plus avancées.

Nous avons testé ce Framework sur une application qui doit être mise en production.

Voici les résultats de ce premier test :

Possibilité de choisir un thème (skin) pour les widgets UI utilisés.

Quelques thèmes sont fournis - nous avons toujours la possibilité d'ajouter de nouveaux skins (par fichier CSS), voire de modifier les skins existants

 Nous avons apprécié la collection de widgets UI très complète.

Chaque widget peut être "facilement" géré (styling, gestion des events, initialisation, validation).

 La documentation et les samples sont de qualité.

Vous pouvez aussi vous appuyer sur un Forum "réactif".

 Les widgets UI qui travaillent avec des données utilisent des appels AJAX asynchrones par défaut.

Très pratique - ce qui évite d'écrire du code supplémentaire.

A noter que le format des données gérées lors des appels AJAX est "souple" - par exemple support XML ou JSON.

 Moins de code à écrire.

 Meilleure architecture du code.

Vous distinguez très bien les données à extraire du code UI - Votre projet peut ainsi être bien architecturé.

A noter que vous trouverez sur le site des conseils à ce sujet.

 Exécution du code rapide.

vendredi 6 février 2015

Serveur Web / FTP et Linux

Vous avez fait l’acquisition d’un super hébergement externe avec une pré-installation de Linux.

C'est une bonne chose.

Mais comment installer et paramétrer un serveur Web et FTP sur cet hébergement ?

Car le but est de pouvoir utiliser au mieux votre hébergement.

Voici une procédure qui a été testée dans un environnement de production (Ubuntu Serveur 12.04).

Nous partons du principe que vous êtes connectés en ROOT (plus facile pour la suite du tutoriel).

Pour commencer, mettre à jour la liste des Packages : apt-get update

Créons ensuite l'utilisateur non « ROOT » qui va être utilisé pour l'accès FTP : adduser nom_user

Le mot de passe va être demandé : mon_pwd

Retapez le mot de passe.

Le reste des informations peut rester vide.


L'installation du serveur FTP

apt-get install proftpd

Comment configurer notre serveur FTP ?

vi /etc/proftpd/proftpd.conf

Nous partons du principe que vous connaissez suffisamment l'éditeur de texte vi.

Mettre à "
off" le paramètre "UseIpv6" (L'ipv6 peut être une source d'erreur, en fonction des routeurs des hébergeurs).


Chercher la Ligne "#
Use this to jail all users in their homes" et dé-commenter "DefaultRoot".

Cela empêche les utilisateurs de se déplacer dans les niveaux supérieurs de l’arborescence.


L'installation du serveur Web (LAMP)

apt-get install lamp-server^              

Note : "^" : ce n'est pas une faute de frappe.

Suivre les étapes d'installation : le mot de passe root de mysql va être demandé.

Ne pas oublier d'installer phpmyadmin : apt-get install phpmyadmin

Configurer automatiquement apache2 pendant l'installation en cochant "apache2" avec la touche espace, lorsque cela est demandé.


Association du dossier Home de l'utilisateur et apache

Cette étape est nécessaire pour pouvoir accéder aux fichiers sources de l'application web à partir de l'utilisateur.

Copier le fichier de configuration par défaut comme backup :

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default-backup

Modifier le fichier default : vi /etc/apache2/sites-available/default

Modifier les 2 entrées "/var/www" et "/var/www/" en "/home/nom_user" et "/home/nom_user/".

Valider et quitter.

Relancer le serveur : service apache2 restart

Créer un fichier "index.html" de test puis l'uploader sur le serveur ftp en utilisant les identifiants de l'utilisateur.

Tester la page sur un navigateur internet.


Attribution à apache les droits d'écriture sur le dossier d'utilisateur

  • Changer le propriétaire du dossier :
chown –R nom_user:www-data /home/nom_user

nom_user étant l’utilisateur et www-data pour apache.

  • Donner les droits d’écriture, d’exécution et de lecture :
chmod –R ug=rwxs /home/nom_user

-R : Récurrence ; C'est-à-dire s’applique au dossier, aux sous dossiers / fichiers


Et voilà nos serveurs Web et FTP sont opérationnels !

Liste des processus sous SQL SERVER

Voici un script fort utile pour lister les processus sous SQL SERVER.

Script

SELECT S.*, C.*, R.*,
       MRS.dbid AS DERNIERE_BD_REQUETE, MRS.text AS DERNIERE_REQUETE,
       Q.dbid AS BD_REQUETE, Q.text AS REQUETE,
       P.query_plan AS PLAN_REQUETE
FROM   sys.dm_exec_sessions AS S
       LEFT OUTER JOIN sys.dm_exec_connections AS
            ON S.session_id = C.session_id
            OUTER APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS MRS 
       LEFT OUTER JOIN sys.dm_exec_requests AS R
            ON S.session_id = R.session_id
            OUTER APPLY sys.dm_exec_sql_text(sql_handle) AS Q

            OUTER APPLY sys.dm_exec_query_plan(plan_handle) AS P;

Un exemple d'utilité de ce script : vous devez supprimer ("killer") un processus - il vous suffit juste de récupérer l'identifiant du processus dans  la liste.

lundi 2 février 2015

Caisse enregistreuse tactile et Cloud

Caisse enregistreuse tactile et Cloud : à la croisée des chemins

Qu’est-ce que Cloud apporte concrètement à nos caisses enregistreuses tactiles ? Il nous faudra d’abord cerner comment fonctionne un logiciel Cloud.

Cloud est un outil big data – aucun débat à ce propos. Avec ce système, les données d’une entité sont stockées sur un serveur distant. Outre la capacité de stockage, le niveau de sécurité est une exigence phare pour tout serveur Cloud.

Retour donc sur l’innovation apportée par Cloud et sur l’intérêt de stocker les données d’une caisse enregistreuse dans un serveur Cloud.

Le fonctionnement de Cloud

Comme évoqué ci-dessus, le niveau de sécurité élevé est la première raison qui convainc les nombreux professionnels utilisant à Cloud. Mais il existe d’autres raisons pratiques.

On pense notamment à la réactivité d’un serveur Cloud. Ça se traduit par la fluidité de l’accès aux données, mais pas seulement.

L’entité utilisant Cloud ne se prend pas la tête pour pas mal de problèmes informatiques. Le serveur peut lui-même se charger des tâches liées à la maintenance.

Cloud est en outre l’allié des professionnels qui se déplacent beaucoup. Les données sont consultables en temps réel, y compris depuis un Smartphone ou une tablette.

Sinon, Cloud vient maximiser, en quelque sorte, la performance d’une caisse enregistreuse tactile, en matière de stockage de données, mas pas seulement.

La place de Cloud dans le fonctionnement d’une caisse enregistreuse

La
caisse enregistreuse tactile est un outil informatique comme un autre. Grâce à un bon logiciel de caisse, elle emmagasine et exploite les données d’un commerce.

Sans Cloud, la caisse enregistreuse est toujours performante. En effet, en exploitant ses différentes données, elle les fait interagir entre elles.

Concrètement, les données du stock impactent sur celles de la gestion de la clientèle, par exemple en termes de préférences. Cette interconnexion de données est exploitée par les CHR et les salons de coiffure en particulier pour promouvoir une politique ciblée.

Alors, tout ce que la
caisse enregistreuse est capable de faire, elle le fait aussi quand les données sont stockées sur un serveur distant. D’un autre côté, Cloud devient un peu comme un système concurrent d’Ethernet.

Ethernet permet à plusieurs caisses d’un commerce d’émettre sur une ligne unique leurs données. Chacune peut exploiter voire modifier les données émises par d’autres. C’est très pratique dans les restaurants.

Alors, quand les données sont sur serveur Cloud, toutes les caisses d’un commerce y ont accès. L’utilisateur d’une des caisses exploitera les données dont il a besoin, et son action impactera sur l’état de la base de données.

vendredi 30 janvier 2015

Pourquoi opter pour le développement informatique en offshore ?

Il va de soi que la principale raison est d’ordre financier. 

En France, même en faisant appel à un freelance – ce qui suppose l’absence de charges salariales – la facture est toujours salée.

Mais au-delà de la considération financière, il y a aussi la recherche de compétences et de spécialités. Nous « baignons » au milieu d’outils technologiques performants, eux ont fait table rase de la notion même de frontière.

Quelques chiffres à titre de comparatif de prix

Ceci est une ébauche de comparatif des prix d’une prestation de développement informatique. On notera surtout qu’en France, les prix varient considérablement en fonction des villes et des régions, Paris étant toujours au sommet du podium.

En embauchant un développeur débutant, une entreprise devra débourser au minimum 200 € par jour de salaire. À cela s’ajoutent les charges sociales et fiscales.

Dans certains domaines, le recours à un freelance est une option rentable. Le domaine de l’informatique, et surtout du développement, échappe à cette réalité.

En moyenne, un développeur français facture sa prestation entre 300 et 500 € par jour. Dans certaines régions, les prix peuvent descendre en dessous de 300 €. Il faut aussi savoir que les tarifs dépendent du diplôme et de l’expérience.

En revanche, un développeur offshore facture sa prestation en moyenne à 140 € par jour. Ça descend à 70-80 € par jour dans certains pays asiatiques et africains notamment.

La
création de site internet pas cher, c’est bien beau. Mais qu’en est-il de la qualité du résultat ?

Le développeur et le client sont coresponsables de la qualité du résultat

On sait tous que le développeur offshore doit respecter à la lettre les consignes du cahier des charges. Il déploiera son expérience pour exploiter les meilleurs outils adéquats aux attentes de ses clients.

Mais le développeur offshore n’est pas à blâmer si les consignes du cahier de charges présentent des ambigüités. Le premier responsable de la qualité du résultat, c’est le client lui-même.

Élaborer un cahier des charges est assez complexe. Le client doit indiquer toutes les contraintes avec lesquelles le développeur devra travailler.

Ces contraintes, ce sont la technologie, le design, la durée de la prestation, les fonctionnalités à inclure et tout un tas de paramètres techniques. Bref, le cahier des charges est un document qui se doit d’être très précis.

L’indécision du cahier de charge aura un effet boomerang contre le client lui-même. Car le développeur ne considérera que les informations qu’il contient, et fera le travail de la manière qu’il juge la plus adaptée ou la plus rapide.

L’offshoring, c’est une affaire financièrement intéressante. Mais l’entreprise doit scruter au préalable la meilleure destination offshore pour une prestation donnée.

Par exemple, l’Afrique francophone du Maghreb, Madagascar et Maurice sont parmi les destinations prisées des Français pour la
rédaction web offshore. En revanche, il n’est pas rare que les connaisseurs de l’offshoring conseillent aux Français de se tourner plus vers l’Asie et l’Europe de l’Est.
  

vendredi 23 janvier 2015

Conversion Pixels / Inches

Une image / photo peut être affichée, scannée ou imprimée.

La taille réelle de cette image / photo va sensiblement varier selon le <device> utilisé.

L'unité utilisée (pixels, inches) pour exprimer la taille de l'image va aussi dépendre du <device> sur lequel l'image sera traitée.

En tant que développeur nous devons quelque fois faire des conversions sur des images (surtout si nous devons "propager" ces images sur différents <devices>) afin d'obtenir le meilleur rendu possible.

Vous trouverez cet outil très pratique :

Cliquez ici

Convertisseur décimal, hexadécimal, binaire

Qui n'a pas eu besoin un jour de faire une conversion en décimale, binaire ou hexadécimale ?

En tant que développeur, nous nous sommes tous confrontés à ce problème.

Voici un outil très utile.



jeudi 22 janvier 2015

Formater votre SQL !

Voici une astuce pour afficher du SQL correctement indenté, bref bien formaté.

Cliquez ici

Une fois votre code SQL saisi, cliquez sur le bouton <Format SQL>.

Votre code SQL est affiché dans une fenêtre parfaitement formaté, prêt à l'emploi.

Vous avez aussi la possibilité de copier le SQL formaté dans le presse-papier ou de l'imprimer.

Une astuce bien pratique.

mercredi 21 janvier 2015

JavaFX / ANT / MSI : le trio gagnant !

Pour pouvoir générer un fichier MSI (Windows Installer), il faut d'abord installer Wix Toolset.

Wix est un ensemble d'outils qui permettent de créer le <Windows Installer> de votre application (.MSI) à partir de documents XML.

Ces documents XML (.WXS, .WXL par exemple) vont "décrire" l'installation de votre application.

Une fois Wix installé, intéressons - nous au fichier <BUILD.XML> de notre application JavaFX.

Pour rappel, ce fichier va "builder" votre application et générer dans notre cas le fichier MSI.

L'exécution de ce fichier se fait par ANT.

Voici un extrait d'un fichier <BUILD.XML> type :

<?xml version="1.0" encoding="UTF-8"?>
<project name="mon application" default="do-deploy" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
<property name="classpath" location="chemin JDK\jre\lib\ext\jfxrt.jar;" />

<target name="init-fx-tasks">
<path id="fxant">
<filelist>
<file name="${basedir}" />
</filelist>
</path>

<taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpathref="fxant" classpath="chemin JDK\lib\ant-javafx.jar" />
</target>

<target name="setup-staging-area">
<delete dir="externalLibs" />
<delete dir="project" />
<delete dir="projectRefs" />

<mkdir dir="externalLibs" />

<copy todir="externalLibs">
<fileset dir="chemin mon projet\lib">
<include name="*" />
</fileset>
</copy>

<mkdir dir="project" />

<copy todir="project">
<fileset dir="chemin mon projet">
<include name="src/**" />
</fileset>
</copy>

<mkdir dir="projectRefs" />

</target>

<target name='do-compile'>
<delete dir="build" />
<mkdir dir="build/src" />
<mkdir dir="build/lib" />
<mkdir dir="build/classes" />

<copy todir="build/lib">
<fileset dir="externalLibs">
</fileset>
</copy>

<copy todir="build/src">
<fileset dir="project/src">
<include name="**/*" />
</fileset>
</copy>

<javac includeantruntime="false" source="1.8" target="1.8" srcdir="build/src" destdir="build/classes" encoding="Cp1252">
<classpath>
<fileset dir="build/lib">
<include name="*" />
</fileset>
</classpath>
</javac>

<copy todir="build/classes">
<fileset dir="project/src">
<exclude name="**/*.java" />
</fileset>
</copy>
</target>

<target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
<delete file="dist" />
<delete file="deploy" />

<mkdir dir="dist" />
<mkdir dir="dist/lib" />

<copy todir="dist/lib">
<fileset dir="externalLibs">
<include name="*" />
</fileset>
</copy>

<mkdir dir="dist/resources" />

<copy todir="dist/resources">
<fileset dir="../resources" />
</copy>

<mkdir dir="package" />

<fx:resources id="appRes">
<fx:fileset dir="dist" includes="mon_application.jar" />
<fx:fileset dir="dist" includes="lib/*" />
<fx:fileset dir="dist" includes="resources/**" />
</fx:resources>

<fx:application id="fxApplication" name="MonApplication" mainClass="application.Main" version="x.x.x" />

<mkdir dir="build/classes/META-INF" />

<fx:jar destfile="dist/mon_application.jar">
<fx:application refid="fxApplication" />
<fileset dir="build/classes" />
<fx:resources refid="appRes" />

<manifest>
<attribute name="Implementation-Vendor" value="Mon Entreprise" />
<attribute name="Implementation-Title" value="MonApplication" />
<attribute name="Implementation-Version" value="x.x.x" />
<attribute name="JavaFX-Feature-Proxy" value="None" />
</manifest>
</fx:jar>

<mkdir dir="deploy" />

<fx:deploy verbose="true" embedJNLP="false" extension="false" includeDT="false" offlineAllowed="true" outdir="${basedir}/deploy" outfile="mon_application" nativeBundles="msi" updatemode="background">
<fx:info title="mon application" vendor="mon entreprise" />
<fx:application refId="fxApplication" />

<fx:resources refid="appRes" />

<fx:info vendor="mon entreprise" description="deploiement de mon application" />

</fx:deploy>

</target>*
</project>

Nous ne rentrerons pas dans le détail de ce fichier mais vous noterez que la balise <fx:deploy> permet de spécifier le type de "bundle" à savoir dans notre cas le type "MSI".

Exécutez ce fichier <BUILD.XML> (après quelques customisations bien sûr) : votre fichier MSI est généré !

samedi 17 janvier 2015

Java / Log4J : Console & fichier LOG

LOG4J n'est plus à présenter : API puissante et indispensable pour tout développeur Java qui souhaite tracer certaines informations.

Nous allons nous attarder sur la façon "d'orienter" les traces vers la console et vers un fichier LOG.

Exemple d'un fichier log4j.properties.

Pour rappel ce fichier est le principal fichier pour le paramétrage de LOG4J.

log4j.rootLogger= , A1, A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Threshold=INFO

log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.Threshold=INFO
log4j.appender.A2.File= ${user.home}/mon_fichier.log

log4j.appender.A2.MaxFileSize=5000KB
log4j.appender.A2.MaxBackupIndex=1

log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d %-5p [%t] %-17c{2} %3x - %m%n

Dans cet exemple nous utilisons 2 "loggers" (autrement dit 2 "canaux" pour tracer les informations).

Le premier logger (A1) est la console.

Toutes les informations de type "INFO" seront tracées dans la console avec un format particulier (ConversionPattern).

Le deuxième logger (A2) : il va permettre de tracer les informations de type "INFO" dans un fichier LOG (mon_fichier.log).

A noter l'utilisation de ${user.home} qui spécifie le répertoire "HOME" de l'utilisateur.

Ce fichier est de type "RollingFile" : lorsque sa taille sera de 5000 KB (MaxFileSize) il sera automatiquement "vidé".

Le gros avantage de cette méthode est de pouvoir contrôler la taille des fichiers LOG.

L'inconvénient est de bien définir la taille du fichier selon nos besoins.

LOG4J permet aussi d'archiver ce type de fichier lorsqu'il a atteint la taille maximale. La propriété <MaxBackupIndex> définie le nombre de fichiers "archives" souhaité.

Les informations tracées dans le fichier sont formatées (ConversionPattern).

Java / Design Pattern Stratégie

Le pattern stratégie est utile pour des situations où il est nécessaire de choisir dynamiquement un algorithme à exécuter.

Vous mettez en place une stratégie dans l'exécution de votre code selon le contexte.

Par exemple : vous souhaitez gérer la première exécution d'une application nouvellement installée.

Lors de la première exécution, il est souvent demandé de saisir certaines informations utiles à l'application.

Il peut arriver que vous stoppiez pour différentes raisons cette saisie d'informations.

Lors d'une prochaine exécution de votre application, il vous sera demandé de compléter cette saisie d'informations inachevée.

Le pattern stratégie peut être utile pour définir quelles sont les données restantes à saisir.

Voici un exemple d'implémentation en Java.

Définissons d'abord notre <Strategy Manager>, c'est notre point d'entrée.

public class StrategyManager {
private static StrategyManager instance = null;

// contexte d'exécution
private StrategyContext ctx;

/**
* @return instance StrategyManager

* @throws Exception
*/
public static StrategyManager getInstance() throws Exception {
if (instance == null)
instance = new StrategyManager();

return instance;
}

/**
* exécuter stratégie de lancement
*
* @throws Exception
*/
public void execCtx() throws Exception {
ctx.exec();
}

/**
* @throws Exception
*/
private StrategyManager()
throws Exception {
ctx = new StrategyContext();

  boolean etat = getEtat();

if (etat == 1) 
ctx.setStrategy(new Launch1());
else if (etat == 2)
ctx.setStrategy(new Launch2());
 else
// erreur
}

private int getEtat() {
   int etat = 0;

   // définir l'état qui correspond au contexte que vous souhaitez traiter

  return etat;


}

Vous avez noté que nous avons utilisé un autre pattern, le pattern Singleton. De cette façon nous manipulons qu'une seule instance de notre manager.

Définissons la gestion du contexte <Strategy Context>.

public class StrategyContext {
private IStrategy strategy;

/**
* fixe la stratégie

* @param strategy
*            : stratégie à appliquer
*/
public void setStrategy(IStrategy strategy) {
this.strategy = strategy;
}

/**
* exécuter stratégie sélectionnée

         * @return 

* @throws Exception
*/
public boolean exec() throws Exception {
return strategy.go();
}
}

public interface IStrategy {

/**
* exécuter le code propre à la stratégie choisie

* @throws Exception
*/
public boolean go() throws Exception;
}

Définissons maintenant les différents algorithmes qui peuvent être utilisés selon le contexte.

public class Launch1 implements IStrategy {
public Launch1() {
super();
}

/**
* exécuter stratégie lancement de type 1
*/
@Override
public boolean go() throws Exception {
           boolean resp = true;

           // votre code...

          return resp;
        }
}

public class Launch2 implements IStrategy {
public Launch2() {
super();
}

/**
 * exécuter stratégie lancement de type 2
 */
@Override
public boolean go() throws Exception {
           boolean resp = true;

           // votre code...

          return resp;
        }
}

La dernière étape : comment utiliser notre pattern stratégie ?

StrategyManager instance = StrategyManager.getInstance();

boolean resp = instance.execCtx();

if (!resp) {
  // erreur
}

Un des avantages de ce pattern est la possibilité d'ajouter ou de modifier un algorithme facilement sans réellement toucher au "corps" du traitement.

mercredi 14 janvier 2015

Comment passer en mode Développeur sur votre appareil ANDROID ?

Vous souhaitez tester votre application sur votre appareil ANDROID version >= 4.0 ?

Pour cela il est nécessaire que votre appareil soit en mode "Développeur".

Sinon votre appareil ne sera pas "reconnu" par votre IDE préféré.

Hors par défaut ce "mode" n'est pas actif sur votre appareil.

Pour l'activer, dans l'application "Paramètres" / onglet "Général" / option "A propos de l'appareil" :

Tapez 7 fois sur le "numéro de version" (build) -> vous êtes en mode "Développeur".

Revenez sur l'onglet "général" : une nouvelle option est apparue  -> "Options de développement".

Cliquez sur cette option : activer le Débogage USB.

Une fois votre appareil en mode "Développeur", branchez votre appareil (via le cable USB) sur votre PC / MAC.

Sous Windows, veuillez à installer le driver USB Google (via le SDK manager).

Lancez par exemple Android Studio.

Dans la liste des "DEVICES" doit apparaître votre appareil.

Exécutez votre application : option "Choose a running device" (par défaut votre appareil est sélectionné sinon veuillez en choisir un dans la liste proposée).

Votre application est automatiquement exécutée sur votre appareil !

Evidemment cette "facilité" ne doit pas supplantée l'exécution de votre application sur l'émulateur qui reste importante.