vendredi 25 février 2011

Le TIOBE-PCI

Le TIOBE Programming Community Index est un indicateur de popularité des langages de programmation. Cet index est basé sur le nombre de "hit" effectué sur différents moteurs de recherche concernant des noms de langages de programmation répértorié dans Wikipedia.

Cet index n'indique pas quel est le langage de le plus performant, ou celui qui détient le plus grand nombre de lignes de codes. Mais il s'agit d'un bon indicateur (remis à jour tous les mois) pour suivre les tendances ou les modes dans le domaine des langage de programmation.


Ici on remarque que pour 2011, Java et C tiennent le haut du sommet bien que leur utilisation semble décroître, par contre C# et Python semble prendre de l'importance. L'avenir nous le dira...

Le site internet du TIOBE contient toute une série de statistiques utiles qui peuvent vous aider dans la prise de décision de choix technologique. Maintenant, il est clair qu'une décision s'évalue aussi sur un tas d'autres paramètres que le top rank dans le TIOBE index ;-)

Source:TIOBE

mardi 22 février 2011

Les dix commandements de Steve Job

1er Commandement – Mettez-vous à l’écoute du monde
Pourquoi ? Parce que Steve Jobs explique qu’il a souvent trouvé ses idées en dehors de la profession, parfois avec des gens ordinaires. Il explique par exemple que lorsqu’en 1980 ils étaient en train de dessiner le nouveau Mac, il a aperçu un appareil ménager dans une vitrine et que séduit par son look il a dit à ses équipes que le prochain Mac devait y ressembler.

2ème Commandement – Limitez le nombre d’objectifs poursuivis
Peu de lancements, mais réussis. Une culture à l’opposé par exemple de Google qui lance tous azimuts, qui teste les réactions et accepte d’abandonner parce que c’est vraiment la politique de tester dans tous les sens.

3ème Commandement – Laissez tomber les dogmes
Et là, il l’illustre logiquement par un dogme, l’Open-Source … Pour lui ce qui importe c’est que le client prenne plaisir et intérêt à utiliser ses produits.

4ème Commandement – Sachez dire non aux perfectionnistes
Il explique qu’il joue le rôle de filtre, c'est à dire passer son temps à rappeler ses ingénieurs à l’ordre pour qu’ils fassent simple, pour éviter toutes ces fonctionnalités, ces touches, que l’utilisateur n’utilisera jamais selon lui. Il explique que les perfectionnistes cherchent à fabriquer un produit parfait … mais qui sera livré hors délais, et surtout hors de prix.

5ème Commandement – Dotez-vous d’un service après-vente irréprochable
Rien à dire, c'est logique.

6ème Commandement – Créez un mythe autour de vos produits
Il explique que les gens doivent acheter plus qu’un produit, ils doivent acheter du rêve, de la beauté, de la jeunesse !

7ème Commandement – Oubliez tout ce qui s’est fait par le passé
Exactement ! Par contre, il vous recommande de ne pas oublier de rêver. D’imaginer des produits, des développements incroyables, infaisables aujourd’hui. C’est ce qui vous donnera une avance sur vos concurrents.

8ème Commandement – Inspirez-vous des études … jusqu’à un certain point
Il parle ici des études clients, des focus groupes et autres. Il explique notamment qu’un client ne vous dira jamais quelle innovation il attend ! Par contre, ce même client va dire pourquoi il trouve vos produits et ceux de la concurrence géniaux ou nuls.

9ème Commandement - N’inventez pas, contentez-vous de perfectionner
Effectivement, Apple a rarement inventé des produits, comme Google d’ailleurs. Mais les deux entreprises sont attentives, ont le chic pour attirer des inventeurs ou pour racheter des innovations qu’elles intègrent dans leurs propres produits. En fait, la nouveauté pour la nouveauté, Steve Jobs trouve cela à la fois cher et dangereux.

10ème et dernier Commandement – Avancez à votre rythme, pas à celui des autres
Et imaginez juste que c’est un leader du marché qui dit qu’il faut avancer à son rythme. Il faut donc avancer, surveiller ce que fait la concurrence, mais surtout pas vous synchroniser sur une autre entreprise au péril de votre propre entreprise.

A méditer si vous voulez développer votre propre activité!
Source:http://www.lalibre.be/economie/actualite/article/643442/les-10-commandements-de-steve-jobs.html

jeudi 17 février 2011

Surrogate key in database design

L’usage de terme "surrogate" en informatique est parfois controversé.

Lorsque l’on conçoit une base de donnée, une des premières règles (imposées par les formes normales de conception) est de définir une clé primaire. Il s’agit d’un identifiant unique représentant un enregistrement donné et assurant qu’il ne peut être confondu avec une autre.
Les problèmes surviennent lors du choix de cette clé. Si je crée une table qui stocke les employés d’une entreprise, prendre le nom (ou le nom et le prénom) des personnes ne m’assurera pas forcémment l’unicité. Deux employés peuvent avoir les même noms et prénoms. D’où problème pour les reconnaître.
D’une manière général on introduit une colonne supplémentaire qui prend des valeurs entières uniques et qui identifie de manière distincte chaque enregistrement
ID Nom Prénom Age
1 Picard Jacques 30
2 Picard Jacques 24

En général les informaticiens appellent cette clé la clé primaire qui est par définition unique pour chaque enregistrement. (En pratique ça peut vite devenir différent). D'autres plus puristes diront qu'il s'agit d'une surrogate primary key (mais c'est plus rare).
En effet, une manière idiote de générer cette clé est qu’a chaque fois que j’enregistre un nouvel employé, je prends le maximum de la colonne ID et j’ajoute 1. “INSERT INTO tblEmployee (ID, Nom, PRENOM) VALUES (SELECT MAX(ID)+1, $Nom, $Prenom)”

Cela marchera bien si je suis l’unique utilisateur de la table employé, le problème est que le serveur de base de donnée sert plusieurs connections (utilisateurs connectés) en même temps. Que ce passe-t-il si deux personnes veulent faire une insertion dans la table employé au même moment.
U1 : veut insérer Alain Térieur qui a 36 ans. U1 Récupère le MAX(ID)+1=3 (ok)
U2 : veut insérer Jacques Cepte qui 28 ans. U2 Récupère le MAX(ID)+1 avant que U1 n’est eu le temps de faire l’insert=> Il obtient 3 aussi
U1 : fait son update et tout se passe bien
ID Nom Prénom Age
2 Picard Jacques 24
3 Térieur Alain 36
U2 : fait son update et il tente de mettre un second 3 dans le champ ID et là deux cas de figure, soit on a imposé une contrainte d’unicité sur le champ ID et heureusement la transaction explose, soit on ne l’a pas fait et on se retrouve avec clé primaire qui n’est plus unique (même si elle est censée l’être).
ID Nom Prénom Age
2 Picard Jacques 24
3 Térieur Alain 36
3 Cepte Jacques 28

Pour pallier à ce problème le vendeurs de bases de données ont crée des champs de type SERIAL ou AUTOINCREMENT, ce sont en général des entiers 32 bits. C'est-à-dire que ce n’est plus au programme de donner le numéro d’ID mais c’est le serveur de base de donnée qui s’en occupe. Ce type de clé primaire basée sur un tel champ est en général appelé par les informaticiens une surrogate key.
Avec une telle clé on se fiche de l’ID et pour insérer un utilisateur on indiquera simplement : INSERT INTO tblEmployee (Nom, Prenom) VALUES (‘Térieur’, ‘Alain’)
L’ID sera automatiquement incrémenté par la base de donnée dans ce cas de figure ma clé primaire sera toujours unique d’où le qualificatif de surrogate. Ceci est encore malheureusement de la théorie.
En pratique certains systèmes peuvent se connecter à une base de donnée y récupérer des données et puis s’en déconnecter. (Exemple : des moniteurs qui vont visiter un site clinique où il n’ont pas un accès directe à la base de donnée de la CRO, ils récupèrent les données sur leur PC, ajoute des nouvelles données lors de la visite, puis ils vont resyncrhoniser à leur retour avec la base de donnée d’origine). Même avec des clés primaires de type Autoincrement, l’utilisateur A aura de bonne chance d’avoir les mêmes valeurs de clé dans la base de donnée locale de son système que l’utilisateur B qui visitait le même site que lui au même moment.
Le système embarquer devra soit faire la réconciliation lui-même (ce qui est en pratique une très mauvaise idée)
Soit le système de base de donnée est sufisamment malin que pour réconcilier (ce n’est pas toujours gagné)
Soit on utilise un autre type de champ pour la clé primaire, pas mal de serveur de base de données aujourd’hui proposent des types GUID (Global Unique Identifier). Sa taille est de 16 octets (nettement plus lourd qu’un type integer) mais chaque valeurs générées est vraiment unique =>P(générer une valeur valeur existe)=0. Certains appelleront ce type de clé des surrogate keys alors qu'ils appelleront les autres type de champ clé des simple primary keys... Le principe consiste à définir clairement les conventions au sein d'une équipe.

mercredi 16 février 2011

Importer des données dans SAS

SAS Dataset et SAS DataStep

Chaque DATASET (tableau de données dans SAS) contient une partie métadonnée (PROC CONTENT) et une partie donnée (PROC PRINT). Le remplissage d'un DATASET se fait suivant différentes phases.

Phase de compilation :
Vérification de la syntaxe + Allocation mémoire définie par les métadonnées => On construit un dataset vide, si pas de place SAS s’arrête.
Le RUN indique à SAS que la phase de compile est terminée et qu’il peut exécuter

Phase d’exécution
Chaque ligne de la source des données est lue est ajoutée au dataset.
La variable _N_ est incrémentée, toutes les autre variables sont réinitialisée sauf si RETAIN.
Le contenu de input est mis dans un buffer puis copier dans le Program Data Vector (définit par les métadonnée). Une fois ceci fait on passe au datastep suivant. Il y a un datastep effectué par donnée à placer dans le dataset.

Importation
La première chose à faire lorsque l'on veut importer des données en SAS est en général de créer une bibliothèque (librairie) d'importation.

LIBNAME MALIB "c:\test"

Cette instruction est en général l'entête du fichier de code SAS. Le premier argument est le nom de la librairie, le second est la localisation physique sur le disque où les DATASET seront sauvés.

Cas simple:

Nous allons importer un simple fichier texte. Il faut savoir que par défaut SAS utilise l'espace comme séparateur de donnée et le CRLF comme séparateur d'enregistrement.

Voici donc le fichier testds.txt:


Nous avons deux champs et 3 enregistrement. Nous nommeront les champs VAL1 et VAL2. Le code pour importer ce fichier est le suivant:

LIBNAME MALIB "c:\temp\MALIB";

DATA MALIB.TESTDS ;
INFILE "c:\temp\malib\testds.txt";
INPUT VAL1 VAL2;
RUN;

Le fichier sera importer dans la bibliothèque MALIB et le dataset sera TESTDS


Il est bien sûr possible de compliquer les choses et d'importer des fichiers plus classiques comme les fichier csv ou tab delimited.

Considérons le fichier testds2.txt qui contient un enregistrement indiquant le nom des variables avec un 'tab' comme séparateur de champs:



Ici il faudra préciser à SAS le délimiteur et le fait que les observations commencent à la seconde ligne, pour cela on utilise deux options utiles dans le predicat INFILE qui sont DLM et FIRSTOBS.

LIBNAME MALIB "c:\temp\MALIB";

DATA MALIB.TESTDS2 ;
INFILE "c:\temp\malib\testds2.txt" DLM="09"x FIRSTOBS=2;
INPUT ID EVOLUTION;
RUN;

Remarquez que SAS utilise la convention "09"x pour spécifier un délimiteur de type tab. Remarquez aussi que contrairement à l'usage en cours chez les informaticiens, SAS commence à compter ses enregistrements à partir de 1 (et pas à partir de 0). La première observation valide est donc à la deuxième ligne...

Le résultat:


La suite un autre jour...

mardi 15 février 2011

MIDAS: a Delphi Three-Tiers approach

Three tiers architecture are generally defined by a Client thier (first thier), an application server (that contains the business logic and the database connection) and a database that stores the persistent information.

Some years ago Borland was proposing a quite easy approach to get benefit from those architectures.

Client computers
They know nothing about the database and database connection. They can access dataset but they don’t know the connection string. (The business logic remains in the Client software, but the dataset are contained in the application)

AppServer
contains the connection string and all the dataset required by the client on the database server.
Advantage : you have to install ADO (MDAC) components on the client machines and more important if configuration changes you have not to reconfigure all the computer park (if you have 2 machines it is ok, but if you have more, it can cost time)=>Zero configuration of thin clients.
You can also safe costs if you have to pay license for connection on the database server per client (because only one server is connected). This depends on the licensing mode.

The database server
Typically it stores the data on secure, transactional and persistent way. It can also do some business logic by using stored procedure.

Technical approach
Generally an application is based on component(s) that implement the interface IAppServer (provided by the Delphi MIDAS Multi tIer Distributed application Service most referred as DataSnap). So to create a Application Server you have to create at least one COM component. In the MIDAS philosophy the COM component (CoAppServer) contains the Dataset. We can create those dataset at design time and configure them with the proper database connection or connection string. The CoAppServer, provide easy way to make the client application communicates with the Datasets contained in the CoAppServer. Practically the client application contains a ClientDataset which is an image of the DataSet contained on the CoAppServer. The communication between the client and server can be done by DCOM, TCP/IP, HTTP, CORBA. The CoAppServer ensure that the communication is bidirectional so you can read and update dataset from the client without having an actual connection on the database itself. The only things you need is a copy of the midas.dll on the client and a valid CoAppServer that you can access.

Oui, je sais ça date un peu, mais bon nostalgie quand tu nous tiens ;-) ... Je n'ai pas eu le temps de traduire ce vieux document qui date de quelques années en français mais après l'avoir lu vous saurez que Midas n'était pas uniquement un roi qui par une grâce divine transformait tout ce qu'il touchait en or... En parlant de grâce divine, ce n'était pas si gracieux puisqu'il ne pouvait plus manger. Il pu heureusement pour lui se débarasser de ce don en se lavant les mains dans le fleuve Pactole qui depuis lors, selon la légende charie de l'or...

lundi 14 février 2011

Introduction à SAS

SAS (développé par SAS Institute depuis 1976) est un langage de programmation procédural dédidié à des traitements des données spécifiques (analyse de donnée, stockage, fusion, rapport, ...).

SAS définit deux concepts important qui forment le corps d'un programme SAS:
Le DATA block et le PROC block, ceci sépare clairement les données et les traitements à effectuer sur ses données. Un block se termine toujours par l'instruction RUN;

Le block donnée contient la définition des données, les types, formats, ... Les données seront stockées dans une bibliothèque : la SAS library.

Le block traitement (PROC) quant à la lui définit une série d'opération à effectuer sur ses données, comme par ex des tris, de la regréssion linéaire ou de l'ANOVA.

SAS dispose d'une syntaxe assez rigide. Chaque procédure dispose d'options spécifiques qu'il faut combiner judicieusement pour obtenir les résultats voulus.

Format de données en SAS
La première opération à effectuer lorsque l'on veut réaliser un programme SAS est de créer ou importer les données sur lesquelles on veut effectuer des opérations. Ces données seront contenues dans des variables dont il faudra définir le type (continue, catégorielle) mais aussi le format (date, variable de compte, montant en $ ou euro, ...)
Une fois le format défini SAS présentera toujours les valeurs en accord avec ce format pour la variable à afficher.

Formats courants:
Remarquez qu'en SAS il y a toujours un point dans les noms de format. Soit au milieu, soit à la fin.
L'instruction FORMAT s'utilise en précisant le nom de la variable et le format à lui appliquer.
FORMAT variable format

numérique : w.d : désigne le nombre de chiffres et le nombre de décimales:w : designe le nombre totale de chiffre, d désigne le nombre de chiffres destiné aux décimales.

Exemple:

DATA _NULL_;
FORMAT X 6.2;
X=101.25;
PUT X;
RUN;

affichera 101.25 (on utilise 6 car la virgule est comptée dedans) à la fin du log.
Il est aussi possible d'utiliser:
DOLLARw.d comme indicateur de format cela aura pour effet d'afficher un $ devant la valeur.

Alphanumérique: $w.; w indique le nombre de caractère.

Exemple:

DATA _NULL_;
FORMAT nm $6.;
nm="coucou";
PUT nm;
RUN;

Formats prédéfinis:
DATE9.; utilisé pour afficher des dates au format : ddMMMYYYY
DDMMYY10.; affiche une date au format dd/MM/YY
WORDDATX20.; affiche une date au format ddMONTHYYYY

SAS supporte par défaut un nombre assez impressionnant de format prédéfini, toutefois il est parfois utile de créer ses propres formats customisés.

Formats customisés:
Exemple: créer des labels pour une variable catégorielle. Les format doivent être stockés dans une bibliothèque (library) par défaut ce sera la bibliothèque WORK, qui sera détruite quand SAS sera fermé. Pour créer un format il faut utiliser une procédure:
PROC FORMAT LIBRARY=

Exemple:
PROC FORMAT ;
VALUE $SEXE 'G'='Garçon' 'F'='Fille';
RUN;

DATA _NULL_;
FORMAT S $SEXE.;
S='G';
PUT S;
RUN;

Le résultat affiché sera Garçon.