jeudi 18 décembre 2008
[PHP] Hacher un mot de pass pour stockage LDAP.
$newPassword = '{md5}' . base64_encode(pack('H*', md5($password)));
mercredi 3 décembre 2008
[MySQL] Exporter et Importer une base de données MySQL
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>
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 theAller dans le panneau de configuration -> Programmes et fonctionnalités -> Activer ou désactiver des fonctionnalités Windowsdeclaration is correct, and that the assembly and all its dependencies are available.
Activer ensuite le dot net framework et le tour est joué !
vendredi 24 octobre 2008
[DEPRECIER][Debian] Tenir son serveur à l'heure.
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
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
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
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
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 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
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.
dhclientVoila 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/interfacesIci vous devez déjà avoir quelque ligne du style :
auto loLa première interface correspond à l'interface de loopback utilisé en local pour le System d'exploitation. La deuxième est notre interface à configurer.
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Nous allons donc changer notre iface eth0 inet dhcp par
auto eth1Il 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 eth1 inet static
address 192.168.1.24
netmask 255.255.255.0
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
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 –eVous 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(La première ligne est un commentaire elle n'est pas exécuté.)
0 0 * * * ntpdate ntp.uhb.fr
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 :
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 :Minute, Heure, Jour, Mois, Jour de la semaine, commande
# 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
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
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
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 ?
Ce site web recense un nombre impressionnant de méthodes de connexions et pourrait en aider plus d'un ;)
http://www.connectionstrings.com/default.aspxBonne connexion !
[SQL Server] Mise en place du serveur, Mise en place d'un shema de base, activation du protocole TCP/IP
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.aspxAttention 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.mspxNous 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-5A0F62BF7796L'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 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)
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.
$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 :
Le type du captcha peux être le suivant :
'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',
)
- 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).
$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
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 = newDans cette ligne nous créons tout d'abord un nouveau objet de type Zend_Translate. Le constructeur prend trois paramètres :
Zend_Translate('gettext','/languages/fr/LC_MESSAGES/lang.mo','fr');
- 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).
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' :$translate->addTranslation('/languages/en/LC_MESSAGES/lang.mo','en');
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 :
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.// 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);
mardi 2 septembre 2008
[AS3] Convertir une string en int ou float
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
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
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
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
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
- Append! : Ecrit à la fin
- Replace! : Remplace
- 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
// 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
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
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
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
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é
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
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 >nulPar défaut Ping prend 1 seconde pour l'attente.