jeudi 18 décembre 2008

[PHP] Hacher un mot de pass pour stockage LDAP.

Si vous souhaitez comme moi modifier un mot de passe utilisateur LDAP via un script PHP il vous faudra calculer le hach de son mot de passe. Un simple md5() ne suffisant voici la syntaxe à employer :

$newPassword = '{md5}' . base64_encode(pack('H*', md5($password)));

mercredi 3 décembre 2008

[MySQL] Exporter et Importer une base de données MySQL

Il existe un outil intégré dans MySQL (sous Linux et sous Windows) nommé mysqldump. Il nous permet de faire une sauvegarde totale de notre base de données. Pour ce faire :
mysqldump -u admin -p --all-databases > dump.sql
admin étant le nom de votre compte administrateur ayant accès à toute votre base.

L'importation est toute aussi simple. Il suffit d'utiliser l'outil mysql en lui redirigeant le flux d'entré comme suit :
mysql -u admin -p < dump.sql

dump.sql étant le fichier précédemment généré avec mysqldump.

lundi 1 décembre 2008

[Visual Studio] Utiliser SVN avec Visual Studio




Il existe un petit add-in pour Visual Studio permettant de se connecter à un dépot SVN. Son nom ? AnkhSvn !
Vous pouvez le télécharger ici : http://ankhsvn.open.collab.net/
Une fois installé vous aurez de nouvelles options quand vous ferrez un clique droit dans l'explorateur de solution vous permettant d'utiliser les fonctionnalités de SVN que je ne détaillerai pas ici.

Il vous est aussi possible de faire un ajout à un dépôt directement à la création du projet en sélectionnant l'option "Add To Subversion" ou encore d'ouvrir un projet directement sur SVN (File->Open->Subversion Project).

[Visual Studio] Message : <"Microsoft.Build.Tasks.Windows.GetWinFXPath" task could not be loaded>

Si comme moi vous avez l'erreur ci-dessous, voici la méthode que j'ai utilisé pour corriger ce problème

Error 1 The "Microsoft.Build.Tasks.Windows.GetWinFXPath" task could not be loaded from the assembly PresentationBuildTasks, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. Could not load file or assembly 'PresentationBuildTasks, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Le fichier spécifié est introuvable. Confirm that the declaration is correct, and that the assembly and all its dependencies are available.
Aller dans le panneau de configuration -> Programmes et fonctionnalités -> Activer ou désactiver des fonctionnalités Windows


Activer ensuite le dot net framework et le tour est joué !

vendredi 24 octobre 2008

[DEPRECIER][Debian] Tenir son serveur à l'heure.

Attention il n'est pas conseillé de suivre les instructions de cet article. Veuillez vous référer aux commentaires pour plus d'informations.

Il est important pour un serveur d'être à l'heure. Pour cela il existe un moyen simple et automatique : ntpdate. ntpdate est un petit logiciel qui se connecte à un serveur ntp et se charge de garder votre serveur à l'heure.

Son installation est fort simple
aptitude install ntpdate


et sont utilisation l'est tout aussi
ntpdate ntp.serveur.tld


Enfin pour tenir à jour votre serveur, nous pouvons configurer un cron.
crontab -e

Ajouter la ligne
0 */1 * * * /usr/sbin/ntpdate ntp.serveur.tld

Ceci effectuera une mise à jour toute les heures de l'heure !!

(Avec bien sure l'adresse exacte de votre serveur ntp !)

lundi 20 octobre 2008

[NFS] Installer un serveur de partage sous debian

Il est souvent utile de partager des données dans un réseau. Il existe de nombreuses méthodes pour ceci, je vais ici présenter l'installation d'un serveur de partage basé sur NFS (Network File System) et son utilisation pour les clients.
L'installation du serveur est assez simple car il suffit de faire un
aptitude install nfs-kernel-server

et le tour est joué.

La configuration des partages se fait dans /etc/exports. Pour plus d'informations sur la rédaction de ce fichier de configuration vous pouvez consulter le man
man exports


Pour faire simple voici la syntaxe de ce fichier :
partage utilisateur(options)


Chaque ligne représente un partage et nous pouvons spécifier un groupe d'utilisateur (@groupe) ou des adresses IP (avec ou sans masque de sous-réseau) à la place d'un simple utilisateur.
Il y a beaucoup d'options disponibles. Les plus féquentes sont :
rw : pour partager les fichiers en lecture/ecriture (par défaut ils sont en lecture seul)
sync et async qui permet de spécifier si le serveur doit répondre avant (async) ou après(sync) avoir écrit les données sur le disque. async est plus performant mais peut corrompre des fichiers en cas de plantage du serveur.
Par exemple pour partager tout les dossiers home des utilisateurs sur notre réseau local, nous pourrions rajouter dans le fichier /etc/exports
/home/ 192.168.1.0/255.255.255.0(rw, sync)


Le client pour monter son partage NFS doit tout d'abord installer nfs-common
aptitude install nfs-common

Ensuite il peut effectuer la commande
mount -t nfs serveur_nfs:partage destination

Exemple :
mount -t nfs 192.168.1.25:/home/ /mnt/home/

ainsi le dossier partagé /home sera monté dans /mnt/home

jeudi 16 octobre 2008

[Apache2] Encodage de caractère

Il est fréquent qu'après la réinstallation d'un serveur apache2, que nos caractères spéciaux (é, à, û, ÿ, ...) ne s'affiche pas correctement. Ceci peut être du à plusieurs choses.

Soit vous n'avez pas bien spécifier votre encodage dans votre page web avec la balise :
<?xml version="1.0" encoding="ISO-8859-1" ?>


Soit votre serveur ne prend pas par défaut l'encodage de vos pages. Par exemples pour l'encodage ISO-8859-1. Il faut rajouter (ou dé-commenter) dans votre httpd.conf la ligne :
AddDefaultCharset ISO-8859-1

mercredi 15 octobre 2008

[PHPMyAdmin] Installer PHPMyAdmin sur un serveur distant du serveur MySQL

L'installation de PHPMyAdmin par défaut se connecte au serveur MySQL local (soit localhost). Si comme moi vous avez décentralisé votre base de données vous voudrez avoir accès à celle-ci via PHPMyAdmin tout de même. Et bien ... (comme toujours) ... c'est possible !

La configuration à faire n'est pas très compliquée car PHPMyAdmin n'est en soit qu'une application PHP. Il vous faudra éditer le fichier
/etc/phpmyadmin/config.inc.php

Dans celui-ci nous retrouvons, tout d'abord une syntaxe PHP, mais aussi beaucoup de lignes commentées. La variable à dé-commenter et éditer qui nous intéresse est :
$cfg['Servers'][$i]['host'] = 'localhost';

Il suffit de renseigner l'adresse de votre serveur MySQL et le tour est joué.
Remarquez que vous pouvez aussi éditer la variable $cfg['Servers'][$i]['port'] pour changer le port de connexion ou encore d'autres variables que je vous laisse le soin de découvrir.

[MySQL] Connaitre la version de MySQL sous Linux

Pour connaitre la version de MySQL rien de plus simple il suffit de taper
mysql -V
et vous obtiendrez une chaine où nous trouvons l'information. Cette chaine est du type :
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (i486) using readline 5.2

[MySQL] Installer un serveur MySQL accessible par le réseau et de l'extérieur

Tout le monde connait MySQL, le SGBD gratuit qui est abondamment utilisé sur le web. Nous allons donc voir ici comment installer MySQL et le rendre accessible aux machines de notre réseau local.

Tout d'abord il nous faut installer MySQL. Pour cela nous utiliserons la commande
aptitude install mysql-server

Si vous n'utilisez pas le système de package apt le nom du package doit être sensiblement le même. Reportez le donc dans votre syntaxe habituelle.

Il faut tout d'abord préciser le mot de passe root. Pour cela il faut se connecter à MySQL en ligne de commande via la commande :
mysql

Et taper ceci (avec votre mot de passe !) :
SET PASSWORD FOR root@localhost = PASSWORD('mot_de_pass');


Vous pouvez aussi changer le nom de l'utilisateur root (pour plus de sécurité) via :
UPDATE mysql.user SET user='nom_du_root' WHERE user='root';


Pour que vous puissiez vous connecter depuis l'extérieur il vous faut donner des droits à un utilisateur. Pour cela on utilisera la commande suivant :
GRANT ALL PRIVILEGES ON *.* TO 'nom'@'10.0.0.0/255.0.0.0';


Vous pouvez ajouter l'option WITH GRANT OPTION à cette commande ce qui permettra à l'utilisateur d'exécuter les commande GRANT (modification de privilèges).
Il vous faut bien entendu mettre l'adresse IP et le masque de sous réseau en rapport avec votre installation.
Le paramètre *.* représente la base de donnée et la table.


A ce moment là l'utilisateur qui à tout les droits n'a pas de mot de passe il faut donc lui en attribuer un. (Même si l'utilisateur est root par exemple et que vous lui avez déjà attribué un mot de passe pour localhost il vous faut en attribuer un autre (ou le même)).
SET PASSWORD FOR ‘nom’@’10.0.0.0/255.0.0.0’ = PASSWORD(‘mot_de_pass’);


Il vous faudra par contre recharger les privilèges:
FLUSH PRIVILEGES

vendredi 26 septembre 2008

[Ubuntu] Connection au réseau au démarage

Si comme moi vous avez un serveur qui tourne sous ubuntu server (7.10) vous avez surement remarqué qu'il faut se connecter au réseau à chaque démarrage. Bien sur faire un dhclient c'est rapide mais ce n’est pas pratique quand on est à l'autre bout du globe et qu'on a accès à cette machine seulement via ssh ou tout simplement si on est faignant.
Pour ma part c'est la deuxième proposition qui m'a motivé à trouver une solution à ce problème.

Rien de bien compliqué, le but est d’effectuer une connexion au réseau au démarrage.

Pendant le démarrage, il est exécuté plusieurs scripts et l'un d’eux est /etc/init.d/rc.local. C'est le dernier script exécuté par l'init.

Nous allons donc éditer ce script avec la commande :
sudo nano /etc/init.d/rc.local

Il faut maintenant rajouter la ligne de connexion. Un "dhclient" fera l'affaire.
dhclient
Voila mais cette configuration n'est pas très propre à mon gout même si elle à le mérite de fonctionner. Nous allons donc aussi étudier l'édition du fichier /etc/network/interfaces et utiliser une configuration IP static (ce qui est préférable pour un serveur tout de même !!)

Donc éditons le fichier /etc/network/interfaces
sudo nano /etc/network/interfaces
Ici vous devez déjà avoir quelque ligne du style :
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
La première interface correspond à l'interface de loopback utilisé en local pour le System d'exploitation. La deuxième est notre interface à configurer.

Nous allons donc changer notre iface eth0 inet dhcp par
auto eth1
iface eth1 inet static
address 192.168.1.24
netmask 255.255.255.0
Il faut bien entendu que vous renseigner votre interface, votre adresse IP et votre masque à vous car ma config n'est surement pas la votre !
iface représente notre interface et sa méthode de connexion, address l’adresse IP et netmask le masque de sous réseau.

Et voila nous sauvegardons le tout et redémarrons et là, miracle ... notre ifconfig nous informe que nous somme correctement connecté !

mercredi 17 septembre 2008

[eXtrem Programming] PowerBuilder, Team Foundation Server, OrcaScript, MsBuild, Exchange and many more !

Ceci est la première version du rapport des activités produites durant mon
stage de 3 mois en entreprise. Elle concerne la mise en place de techniques
d'eXtrem Programming (XP). Ici les techniques mises en place sont :
-
L'intégration continue : La génération d'un exécutable à partir de sources
récupérées depuis un source control.
- Tests unitaires : La mise en place de
test unitaire
Le tout devra être communiqué aux développeurs. Cette partie
sera appelée reporting.

Le but principal de la mise en place d'une telle installation est la
propriété collective du code. En effet toutes les sources étant stockées sur un
même serveur et toujours accessibles, tout les développeurs ont accès aux
mêmes sources en même temps. De même ils peuvent déposer leurs contributions aux
projets.

C'est ce dernier point qui pose problème. En effet, cette méthode ne garantit
nullement que deux personnes ne modifient pas deux fichiers (distincts) qui
compileront très bien indépendamment l'un de l'autre (sur les machines des
utilisateurs respectifs) mais qui seraient en conflit lors du build de
l'application.

Il est donc nécessaire de mettre en place une solution à ce problème. Nous
allons donc mettre en place un système d'intégration continue qui vérifiera à
chaque changement si l'application ne subit pas de régression, ceci couplé à des
tests unitaires, la non régression de l'application sera complètement
vérifiée.

Pour vérifier si l'application ne subit pas de régression nous compilerons à
chaque changement l'intégralité du programme. Ainsi si des erreurs surviennent
nous en informerons les fautifs pour qu'il corrige leurs erreurs. Aussi les
erreurs étant détectés au plus vite elles seront corrigées aussi au plus vite
évitant des heures de débuggage pour déterminer leurs sources si elles avaient
été détectés plus tard !
Nous
pouvons aussi noter que l'intégration continu permet d'avoir en permanence une
version compilé avec les dernières sources de
disponible.

Les tests unitaires, eux, serviront à savoir si les changements effectués sur
une fonction n'influent pas négativement sur ses actions et valeurs de retours.
Les tests unitaires ne sont pas présentés dans ce
document.

Le service à mettre en place ici se base sur une installation existante.
Celle-ci comprend plusieurs produit développez à l'aide de PowerBuilder© de la
société Sybase© ainsi qu'un source control basé sur Visual Studio Team
Foundation Server© de la société
Microsoft©.

Notre solution devra bien entendu s'autogérer.

Suite de l'article en telechargement ici. J'attends vos retours, nombreux je l'espère même si il n'y doit pas y avoir des centaines de malades qui souhaitent faire de l'intégration continue avec PowerBuilder !!

Attention j'ai mi la version doc (7.6Mo) et la version rtf pour ceux qui n'ont pas Microsoft Word qui est beaucoup plus grosse ... (77Mo)

mardi 16 septembre 2008

[Linux] Appeler une page web à distance et à intervalles reguliers avec Cron, wget et htaccess

Pour le besoin d'un site internet les taches automatisées et planifiées sont très importantes. Sous linux ces taches s'appellent Cron. De plus les développeurs, pour la sécurité de leurs applications, protègent (et ils ont tout intérêt à le faire) leurs scripts d'automatisations par des .htaccess limitant l'accès à ceux ci par un système de login/mot de passe.
Si nous voulons automatiser l'exécution de ces pages l'une des méthodes est donc l'utilisation d'un cron. Nous utiliserons la commande wget pour récupérer la page et préciser les login/mot de passe.

Tout d'abord nous devons éditer nos taches cron. Pour ce faire :

Crontab –e
Vous arrivez dans la liste de vos taches. Par exemple vous pourriez avoir la mise à jour automatique de l'heure toute les heures avec la ligne :

# m h dom mon dow command
0 0 * * * ntpdate ntp.uhb.fr
(La première ligne est un commentaire elle n'est pas exécuté.)
Expliquons la configuration d'une nouvelle tache :
Le commentaire tout en haut nous donne la structure de rédaction d'une tache. Cette structure est la suivante :

Minute, Heure, Jour, Mois, Jour de la semaine, commande

Pour les minutes, heures, jours, mois et jours de la semaine vous pouvez spécifier une ou plusieurs valeurs ou une étoile correspondant à "tout". Ainsi pour effectuer une tache tout les mardis de janvier à minuit nous aurions :

# m h dom mon dow command
0 0 * 0 2 commande

Attention toute les valeurs commence à 0 et le jour de la semaine 0 est dimanche.
Comme vous l'avez compris le dernier paramètre est la commande à exécuter.
Vous pouvez aussi directement éditer les cron (qui sont stockés dans /etc/cron.d/) mais il vous faudra en plus renseigner le login de l'utilisateur qui exécutera la tache.
Enfin si vous voulez exécuter une tache plusieurs fois par heures (par exemple) il vous suffit de renseigner les valeurs séparé par des virgules comme ceci :

# m h dom mon dow command
0,20,30 0 * 0 2 commande

Ainsi la commande s'exécutera tout les mardi de janvier à minuit, minuit 20 et minuit 30.
Enfin si vous voulez exécuter une tache à intervalles réguliers par exemple toute les 2 minutes vous pouvez préciser */intervalle.

# m h dom mon dow command
*/2 * * * * commande

La commande s'exécutera toutes les deux minutes

Reste à renseigner la commande pour exécuter notre page. Nous utiliserons wget.
L'option –O redirige le flux.
L'option --http-user précise le login du htaccess
L'option --http-passwd précise le mot de passe du htaccess.
Enfin le dernier paramètre est la page à charger.
Ainsi :


0 18 * * * wget -0 /dev/null --http-user=admin --http-passwd=XXXXXX
www.site.com/cron/cron.php

Attention si vous référencer un site de la forme http://www.monsite.com/ qui est hebergé sur votre serveur noubliez pas de mettre, dans votre fichier hosts (/etc/hosts) une ligne du type :



127.0.0.1 www.monsite.com

lundi 15 septembre 2008

[Zend Framework] Faire un join

Il se peut que vous rencontriez une erreur de type :
Select query cannot join with another table in /var/www/ etc ...

Ceci est du à Zend Framework qui n'autorise pas par défaut de faire une simple jointure sur une table sous jacente.

L'objet Zend_Db_Table_Select est destiné à sélectionner des données sur une table précise. Des jointures peuvent être faites, mais il n'est pas possible de sélectionner des colonnes ne faisant pas partie de la table sous jacente. Cependant, ceci aurait pu être utile dans certains cas, et l'objet Zend_Db_Table_Select possède une clause spéciale déverrouillant cette limitation. Passez la valeur false à sa méthode setIntegrityCheck. Il est alors possible de sélectionner des colonnes hors table. Attention toutefois, l'objet row/rowset résultant sera verrouillé. Impossible d'y appeler save(), delete() ou même d'affecter une valeur à certains de ses champs. Une exception sera systématiquement levée.

Pour enlever cette protection vous devez spécifier setIntegrityCheck(false) dans votre requête.

Par exemple pour une classe simple de récupération de news j'ai :
<?php

/**
* News
*
* @author Lermit
* @version 1
*/

require_once 'Zend/Db/Table/Abstract.php';

class News extends Zend_Db_Table_Abstract {

protected $_name = 'news';
protected $_primary = 'news_id';
protected $_dependentTables = array("Users");
protected $_referenceMap = array(
    'Reporter' => array(
    'columns' => 'user_id',
    'refTableClass' => 'Users',
    'refColumns' => 'user_id'
    )
);

/**
* getLast
* retourne les $numberOfNews dernières news à partir de $start
* @author lermit
* @version 1
* @param $numberOfNews nombre de news
* @param $start à partir de la n-ieme news
* @return les news
*/
public function getLast($numberOfNews,$start)
{
    $select = $this->select()
        ->setIntegrityCheck(false)
        ->from( array('n' => $this->_name), array('text','date','user_id'))
        ->join(array('u' =>'users'),'u.user_id=n.user_id','login')
        ->order('date DESC')
        ->limit($numberOfNews,$start);

    return $this->fetchAll($select);
}
}

Tout d'abord je spécifie le nom et la clef primaire de ma table puis les relations de jointure avec les autres tables.
$_dependentTable = tableau de la/les classe(s) de la(des) table(s) dépendante(s).
$_referenceMap = tableau de tableaux de dépendances. Chaque dépendance est listée sous la forme d'un tableau construisant comme suit :
'columns' => 'colonne de la classe courante',
'refTableClass' => 'classe de la table à joindre',
'refColumns' => 'colonne de la table à joindre'
Bref ma requête utilise bien ->setIntegrityCheck(false) ce qui m'enlèvera cette fâcheuse erreur !!

[Divertissement] L'effet papillon

Voici le site d'un grand magasin hollandais : HEMA. Cette enseigne compte plus de 150 magasins au Pays Bas, en Belgique, au Luxembourg et en Allemagne …
Bref une grosse boite mais … pas démuni d'humour.
Je vous laisse jeter un œil sur leur site :
http://producten.hema.nl/

Le développeur a dut bien s'amuser.

vendredi 12 septembre 2008

[HTML] Ajout d'une icone

Pour ajouter une icône dans une page HTML il faut tout d'abord avoir une icône !! (Taille 16*16 ou 32*32 extension : ico)

Après il vous suffit d'ajouter ces lignes :

<!-- Ci-dessous l'icone du site -->
<link rel="icon" type="image/png" href="/images/favicon.ico" />
<!--[if IE]>

<link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico" />
<![endif]-->


La première ligne est la ligne standard à tous les navigateurs sauf IE.
Les lignes suivantes correspondent à l'ajout pour internet explorer en utilisant un "hack". Ainsi seul Internet Explorer lira cette ligne.

[Base de Données] Recherche du provider et de la chaine de connection ?

Pour ne plus chercher comment se connecter à tel ou tel base avec quel provider ? etc ...

Ce site web recense un nombre impressionnant de méthodes de connexions et pourrait en aider plus d'un ;)
http://www.connectionstrings.com/default.aspx
Bonne connexion !

[SQL Server] Mise en place du serveur, Mise en place d'un shema de base, activation du protocole TCP/IP



Pour faire des tests sur Entity Framework j'ai du installer une base de donnée de test. J'ai choisi Microsoft SQL Server Express 2005 car il est complètement intégré avec l'Entity Framework.

Tout d'abord il convient de télécharger SQL Server Express 2005. Il se trouve à cette adresse (40.9 Mo) :

http://msdn.microsoft.com/fr-fr/express/bb410791.aspx
Attention pour installer le serveur il faut avoir au préalable installer Windows Installer 3.1 (ou supérieur) qui est disponible ici. Il faut aussi posséder le dot net Framework 2 ou supérieur.Une fois le téléchargement fini il faut exécuter l'exécutable, l'installateur décompresse tout d'abord les données, il faut ensuite accepter la licence et enfin cliquer sur installer ! Vous arrivez après dans l'installateur en lui même. Il faut tout d'abord une vérification du système et vous informe des non conformités avec l'installation. Il vous demande votre nom et société puis les composants que vous voulez installer. Il faut sélectionner ce que vous avez besoin. Ici nous avons tout sélectionné. Pour le mode d'authentification vous pouvez choisir entre l'authentification Windows (qui fonctionne avec votre compte Windows) ou l'authentification mixte qui rajoute une entrée "non-Windows". Ceci permet de récupérer la base en cas de problèmes avec le réseau d'authentification Windows.Ensuite deux choix s'offrent à vous : activer les instances d'utilisateur qui si il est coché permet aux utilisateurs d'exécuter des instances séparé de l'instance parent. Ainsi chaque utilisateur peut avoir sa propre instance. Nous l'avons coché. L'autre option : Ajouter l'utilisateur au rôle Administrateur SQL Server permet à l'utilisateur qui installe la base de données d'être administrateur de celle-ci. Ensuite vous pouvez spécifier si vous voulez ou non envoyer des rapports à Microsoft sur le fonctionnement de son produit. Enfin l'installation se lance et après quelques minutes tout est fini.

Pour activer votre base de données sur le réseau il faut aller dans Gestionnaire de configuration SQL Server (nouvellement installé) et dans Configuration du réseau SQL Server 2005 -> Protocoles pour SQLEXPRESS sélectionner TCP/IP, bouton de droite activer. Activer aussi canaux nommées. Il faut ensuite redémarrer le service. Pour ceci dans Services SQL Server 2005, sélectionner SQL Server (SQLEXPRESS), bouton de droite, redémarrer. Enfin pour que le serveur puisse être facilement listé par les clients nous allons démarrer SQL Server Browser. Faire bouton de droite sur celui ci propriétés, Service, changer le Mode de démarrage en Automatique, cliquer sur ok. Ensuite bouton de droite démarrer.

Une fois l'installation terminée nous allons intégrer un schéma de base, proposé par Microsoft pour nos tests. Vous trouverez plusieurs schémas de base à cette adresse :

http://www.microsoft.com/sql/editions/express/starterschemas.mspx
Nous utiliserons ici le schéma Customers and Orders.
Pour l'intégrer facilement à notre base de données nous utiliserons le logiciel (gratuit) de Microsoft : Microsoft SQL Server Management Studio Express. Il se trouve à cette adresse (en bas !) :

http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796
L'installation est très simple.
Lancer ensuite SQL Server Management Studio Express (non ce n'est pas un nom à rallonge ...), connecter vous à votre base de donnée (dans nom du serveur, cliquer sur parcourir et votre base de donnée devrait s'afficher)
Sélectionner Bases de données, bouton de droite, Nouvelle base de données. Pour créer une nouvelle base de données qui nous servira pour nos tests. Sur votre nouvelle base de donnée, bouton de droite, nouvelle requête, copier ici votre code SQL. Nous avons nous copier l'intégralité du fichier cre_customers_and_orders.sql. Puis faite bouton de droite sur l'éditeur et exécuter.

Voila votre serveur SQL Server 2005 Express est installer et votre base de données créé.

mercredi 10 septembre 2008

[PHP] Le design pattern : Singleton

Le design pattern du singleton permet d'avoir une seule et unique instance d'une classe dans un programme.

Le principe est simple : Nous créons une classe maClasse et nous spécifions son constructeur comme élément privé. Ainsi les utilisateurs de la classe ne pourrons pas l'instancier librement. Nous créons aussi une fonction getInstance(), publique cette fois, qui, elle, se chargera de retourner l'instance de la classe.


class maClasse
{
    private static $instance;

    private function __contruct()
    {
        // Instanciation
    }

    public static function getInstance {
        if( !isset(self::instance))
        {
            self::$instance = new maClasse();
        }
    return self::$instance;
    }

}

Notre variable $instance doit être de type static pour ne pas être supprimée à chaque fois ;)
Notre fonction getInstance est donc très simple :
Nous vérifions que l'instance à été déclaré sinon nous la créons et enfin la retournons !

vendredi 5 septembre 2008

[Zend Framework] Generation de captcha avec ZF (anti bot)

Vous savez surement tous que le net fourmille de robots spammeur qui envahissent nos forums, nos boites mails, etc …
Pour luter contre ceux-ci on utilise des captcha, c'est le nom des petites images qu'on vous demande de recopier dans une textbox lors d'une inscription ou de ces questions qui vous demande la somme de deux et cinq. Bref c'est un mécanisme anti robot. Zend Framework, dans sa version 1.6 et supérieur, propose une manière d'en générer facilement et de les intégrer facilement avec Zend_Form.

Tout d'abord il faut créer un nouvel element captcha dans notre formulaire. Ceci ce fait facilement car ZF propose la classe Zend_Form_Element_Captcha.

$captcha = new Zend_Form_Element_Captcha(nom, param);

nom représente biensure le nom de votre élément et param un tableau avec les paramètres (en soit comme un élément normal!). Dans le tableau on peut rajouter l'option captcha qui va configurer notre captcha. Celle ci se décline aussi sous la forme d'un tableau qui se construit comme ceci :

'captcha' => array(
'captcha' => 'Type du captcha',
'wordLen' => Nombre de caractère à afficher,
'timeout' => Temps avant fin du captcha,
// Seulement dans le cas d'une image
'font' => 'Chemin vers la police de caractère',
'imgurl' => 'Ou seront stocker les images',
)
Le type du captcha peux être le suivant :
  • Image : Image comme on les connait
  • Dumb : directement le texte (Non sécurisé !)
  • Figlet : Lettre sous forme de dessin textuel. (Utile si vous n'avez pas accès à la librairie GD).
Enfin voila à quoi ceci peut ressembler :
$captcha = new Zend_Form_Element_Captcha('captcha', array(
'label' => "Copiez le code suivant :",
'captcha' => array(
'captcha' => 'Image',
'wordLen' => 6,
'timeout' => 300,
'font' => '../application/fonts/Candara.ttf',
'imgurl' => '/images/captcha',
),
));

jeudi 4 septembre 2008

[Zend Framework] Utilisation de la classe de traduction de ZF

Le Zend Framework (ZF) propose par défaut une classe de traduction très simple d'utilisation. Elle prend en compte de nombreux moyens de traduction comme les Array (PHP), CSV, Gettext, INI, TBX, TMX, Qt, XLIFF et XmlTm. Il est aussi possible de créer ses propres adaptateurs. Ici nous utiliserons Gettext car c'est le plus professionnel à mon gout. L'inconvénient est que le fichier de traduction est binaire et donc non lisible par l'homme et qu'il faut un logiciel pour générer ce fichier (il en existe des gratuits).

La classe de traduction de Zend Framework est Zend_Translate. La mise en place de la traduction se résume simplement à l'instanciation de cette classe. Ceci est fait comme ceci :

$translate = new
Zend_Translate('gettext','/languages/fr/LC_MESSAGES/lang.mo','fr');
Dans cette ligne nous créons tout d'abord un nouveau objet de type Zend_Translate. Le constructeur prend trois paramètres :
  • Le premier est l'adaptateur utilisé. Ici nous utilisons gettext mais vous pouvez très bien utiliser csv, tbx, …
  • Le deuxième paramètre est le chemin vers le fichier de traduction. Avec gettext il s'agit d'un fichier binaire d'extension mo.
  • Enfin le dernier paramètre est la langue chargé. Ici le français (fr).
Si vous avez plusieurs fichier de traduction (comme c'est souvent le cas !) il faut les ajouter avec

$translate->addTranslation('/languages/en/LC_MESSAGES/lang.mo','en');

A ce moment là vous pouvez déjà afficher vos messages. Pour cela il existe deux méthodes : La première avec la chaine d'origine, par exemple pour traduire 'Ma chaine à traduire' :

Print $translate->_("Ma chaine à traduire");
La deuxième à partir de l'id de la phrase traduite, par exemple pour la chaine traduite d'id 3 :

Print $translate->_(3);
Pour savoir dans quelle langue sera traduit notre phrase nous pouvons utiliser la méthode getLocale() qui retourne une instance de Zend_Locale ou un identifiant de localisation.

$langue = $translate->getLocale();
Pour spécifier la langue à utiliser il faut utiliser la méthode setLocale().

$translate->setLocale("en");
Pour améliorer les performances de l'application on peut spécifier à Zend_Translate un cache où il stockera des données pour y accéder plus rapidement. Ceci ce fait comme suit :

// Options du frontend et du backend
$frontendOptions = array('lifetime'
=> 7200, 'automatic_serialization' => true);
$backendOptions =
array('cache_dir' => '/tmp/' );
// Création d'un cache
$cache = Zend_Cache::factory(Core','File',$frontendOption,
$backendOptions);
// Spécifier à Zend_Translate le cache
Zend_Translate::setCache($cache);

Ainsi l'exécution sera plus rapide. Nous créons tout d'abord un cache en utilisant la factory de Zend_Cache. Les paramètres sont tout d'abord le frontend (ici Core) et le backend (ici File) suivit de leurs options. Ensuite nous spécifions à la classe Zend_Translate ce cache avec la méthode setCache.

mardi 2 septembre 2008

[AS3] Convertir une string en int ou float

Pour convertir une chaine de caractère en nombre il existe deux fonctions :
parseInt et parseFloat.

parseInt convertit la chaine de caractère en entier.

parseFloat convertit la chaine de caractère en nombre décimal.

l'utilisation est simple :
var iNumber:int = parseInt("234");
ou
var iNumber:float = parseFloat("234.423");
parseInt peut prendre aussi un deuxième paramètre qui permet de spécifier la base du nombre.
Par exemple pour récupérer un entier codé en hexadécimal nous ferions :
var iNumber:int = parseInt("1F3",16);

La base peut être comprise entre 2 et 36

mercredi 27 août 2008

[svn] création d'un dépot subversion sous debian

La création d'un dépot subversion sous debian est simple.
Ici nos dépos subversion sont dans /var/svn/ mais la méthode présenté fonctionne ailleur aussi !
Avec l'outil svnadmin nous n'avons qu'à spécifier l'action à effectuer (create) et le path du dépot comme ceci :
svnadmin create /var/svn/monProjet

Il faut ensuite attribuer les droits qui vont bien à ce nouveau dépot. Nous utilisons l'option -R pour attribuer les droits récursivement. Ici pour apache2 :
chown -R www-data:www-data /var/svn/nomProjet

Votre dépot est créé !

[Linux] Configurer svn avec LDAP

Dans notre cas nous avons un serveur svn et nous voulons que nos utilisateurs se connectent que s'ils font partie du groupe svn_users. Le groupe svn_users a l'id 1000.
Tout les utilisateurs sont dans un anuaire LDAP (avec openLDAP) dans l'ou users. Nous utiliserons Apache2 avec le module LDAP de celui ci.

Nous créons un virtualhost svn.exemple.com

<VirtualHost *>

ServerName svn.exemple.com

Nous spécifions que nous voulons utiliser svn

<Location />


DAV svn


SVNParentPath /var/svn

Nous voulons interdire tout le monde de se connecter

# Autorisation


Order deny,allow


Deny from All

Connection l'authnetification LDAP


# Authentification


AuthType Basic


AuthName "depot SVN"


AuthBasicProvider ldap



# LDAP


AuthzLDAPAuthoritative on


AuthLDAPURL ldap://localhost/ou=users,dc=exemple,dc=com?uid?sub?(objectClass=*)


AuthLDAPGroupAttribute memberUid


AuthLDAPGroupAttributeIsDN off

Nous specifions le groupe


# groupe obligatoire


require ldap-group cn=svn_users,ou=groups,dc=exemple,dc=com


require ldap-attribute gidNumber=1000


Satisfy any

</Location>
</VirtualHost>

[PowerBuilder] Lire/Ecrire dans un fichier

Ecrire dans un fichier avec PowerBuilder ressemble beaucoup à écrire dans un fichier en C (et pour cause : PowerBuilder n'est qu'une "surcouche" du C++ !).

Il faut donc tout d'abord ouvrir le fichier et stocker sont ID dans une variable :
long ll_numFile
ll_numFile = FileOpen( fichier , mode , accès, verrou, mode d'écriture,
encodage)

fichier : Fichier à éditer
Mode :
  • LineMode! : lire/écrire ligne par ligne
  • StreamMode! : Lire par bloque binaire
  • TextMode! : Lire par bloque texte
accès : Read! ou Write!
verrou :
  • LockReadWrite! : Seul moi peut accéder au fichier
  • LockRead! : Seul moi peut lire
  • LockWrite! : Seul moi peut écrire
  • Shared! : tout le monde peut écrire et lire
mode d'écriture :
  • Append! : Ecrit à la fin
  • Replace! : Remplace
encodage :
  • EncodingANSI! : ANSI
  • EncodingUTF8! : UTF8
  • EncodingUTF16LE!
  • EncodingUTF16BE!

Pour écrire dans le fichier

fileWrite( ll_numFile, "Mon texte")


Pour lire dans le fichier
fileRead(ll_numFile, variable_destination)


Il faut ensuite fermer le fichier
fileClose( ll_numFile )

mardi 26 août 2008

[Flash] Faire communiquer Flash (AS3) et PHP

En actionscript 3 la communication avec PHP ne se fait plus avec LoadVars. Il faut utiliser la classe URLLoader.

// conteneur
var conteneur:URLLoader = new URLLoader();
// Fichier à charger
var fichier:URLRequest = new URLRequest("textes/script.php");

// CallBack fin chargement
function onComplete(e:Event):void
{
// Fini
}

// CallBack pendant le chargement
function onProgress(e:Event):void
{
// chargement en cour
}

// Lier l'événement chargement
conteneur.addEventListener(ProgressEvent.PROGRESS, onProgress);
// Lier l'événement fini
conteneur.addEventListener(Event.COMPLETE, onComplete);
// Chargement du fichier
conteneur.load(fichier);

[AS3] Les tableaux

En AS3 les tableaux sont déclarés comme ceci :
var nom:Array = newArray()

Ajout d'une valeur dans le tableau :
nom.push(valeur)

On y accède comme ceci :
nom[i]

Suppression de la dernière entrée :
nom.pop()

taille du tableau :
nom.length

[AS3] Declaration de variable

En ActionScript 3 la déclaration de variable ce fait avec le mot clef var comme ceci :
var nom:type = valeur, nom2:type = valeur2, ...

Les types standards sont :
int, String, Boolean, Number, Object, uint, ...


Pour déclarer une constant on utilise le mots clef const
const NOM:type = valeur

Par convention on met le nom de la constante en majuscule.

[Batch] Envoi de mail avec SendEmail

SendEmail© est un programme d'envoi d'e-mail via SMTP. Il est utilisé pour envoyer des e-mails via la ligne de commande et peut donc être facilement utilisé dans d'autres applications ou scripts. Il est écrit en perl et est distribué conformément à la Licence GPL. Tout les champs des e-mails envoyés (tel l'expéditeur, les destinataires, le corps du message, ...) sont spécifiés comme arguments de la ligne de commande comme les paramètres généraux d'envois (serveur SMTP, login, mot de passe, ...) SendEmail© a été écrit par Brandon Zehm.

Utilisation

Forme d'utilisation : sendEmail.exe -f ADDRESS [options]
Obligatoire :
-f ADDRESS
email de l'émetteur
Standard:
-t ADDRESS [ADDR ...]
email du destinataire.
-u SUBJECT
Sujet du message
-m MESSAGE
corps du message
-s SERVER[:PORT]
serveur SMTP à utiliser, par défaut : localhost:25
Optionnel:
-a FILE [FILE ...]
fichier joint
-cc ADDRESS [ADDR ...]
copie carbone
-xu USERNAME
login SMTP
-xp PASSWORD
mot de passe SMTP

Voir mon article sur wikipedia

[Batch] Récuperer les informations d'un utilisateur eXchange à partir de son ID mail

Pour récupérer les informations d'un utilisateur eXchange à partir de son ID mail (mailNickName) on utilise l'utilitaire dsquery qui est fourni avec l'adminpak.msi de Microsoft.
Cette utilitaire permet d'interroger un annuaire active directory.

dsquery * -filter "(&(objectCategory=user) (mailNickname=USR1*))"

Dsquery fait des recherche dans l'active directory. Il y a plusieurs option qui peuvent lui être passer.

dsquery computer

recherche un ordinateur

dsquery contact

recherche un contact
dsquery group

recherche un groupe
dsquery ou

recherche une unité d'organisation
dsquery site

recherche un site
dsquery server

recherche un serveur
dsquery user

recherche un utilisateur
dsquery quota

recherche un quota
dsquery partition

recherche une partition
dsquery *

recherche n'importe qu'elle type.

[Batch]Vérifier qu'un processus est lancé

Pour vérifier en Batch qu'un processus est lancé il faut utiliser la commande tasklist (qui liste tout les processus lancés et la commande find pour rechercher dans cette liste le processus voulu.
Find peut prendre, entre autre, les options /C : Affiche seulement le nombre de lignes contenant la chaîne et /I : Ignore la casse lors de la recherche de la chaîne.
Si aucun processus n'est trouvé la commande retournera une erreur de niveau 1.

Ainsi :

tasklist find "processus" /C /i > nul
if NOT ERRORLEVEL 1 goto est_lancer

[Batch] Attendre x seconde

Il n'y a pas de fonction Batch qui permet d'attendre un nombre x de seconde, il faut donc utiliser une astuce à l'aide de la commande Ping.

En effet la commande Ping permet de spécifier le nombre de requête que on veut exécuter (-n) et le temps d'attente pour chaque réponse (-w) en milliseconde.

Ainsi pour attendre une minute il faut :
Ping -n 61 127.0.0.1 -w 1000 >nul
Par défaut Ping prend 1 seconde pour l'attente.