Monthly Archives

9 Articles

Oracle XE: verdict

Après différents tests de la version express d’Oracle, nous nous sommes aperçut qu’une fonction utile mais vraiment bête a été désactivée dans l’assistant de création de base. Il s’agit de la définition d’une valeur par défaut. Bon, on pouvait la définir en créant notre table directement grâce à une requête SQL mais où est l’intérêt dans ce cas ?

Au final nous avons décidés de nous tourner vers une Oracle 10g Enterprise Edition et là encore, j’ai eu quelques problèmes pour l’installation sur une distribution Linux x64 (malgré l’installation x86_64). Comme quoi, Oracle, c’est tellement en béton qu’il faut sûrement être chercheur à la NASA pour pouvoir l’installer.

A l’heure où je vous parle, j’ai enfin réussit à lancer l’installation et j’en ai pour quelques heures avant la fin (si j’y arrive bien).

Un conseil. Si vous devez utiliser Oracle, prenez une distribution RedHat 4 en 32 bits sinon vous aurez des problèmes.

Phing : PHing Is Not GNU make

by Throrïn 0 Comments

Au travail, j’ai découvert une extension PEAR pour PHP vraiment utile. Il s’agit de Phing (PHing Is Not GNU make). Phing est un projet servant à construire des projets ou à effectuer différentes étapes de façon automatique.

Pour résumer, C/C++ a son make, Linux a ses scripts bash, Windows a ses batch et PHP a Phing. Phing utilise le langage XML pour formater les scripts.

Je l’ai trouvé simple à prendre en main (en regardant la doc). Il intègre des solutions FTP, SQL (avec PDO), commandes systèmes et les règles de programmation de base (if, …). Pour vous donner une petite idée des performances de Phing, j’ai dû créer aujourd’hui un script permettant la création d’un SVN repository avec, la création sur le serveur ftp du dossier du projet (pour le site web) et pour finir à créer l’utilisateur et la base de données rattachée sur un autre serveur MySQL.

Je pense que j’aurais pu faire l’équivalent en scripts bash sur mon serveur Ubuntu mais on m’a demandé de l’effectuer avec ce langage. Des améliorations de ce script m’ont été demandées donc je vais bien voir ce qu’il est vraiment possible.

Voici justement un petit aperçu de script Phing (fournit dans le quickstart de la documentation).

<?xml version="1.0" encoding="UTF-8"?>
<project name="FooBar" default="dist">
    <!-- ============================================  -->   
    <!-- Target: prepare                               -->
    <!-- ============================================  -->
    <target name="prepare">
        <echo msg="Making directory ./build" />
        <mkdir dir="./build" />
    </target>



    <!-- ============================================  -->
    <!-- Target: build                                 -->
    <!-- ============================================  -->
    <target name="build" depends="prepare">
        <echo msg="Copying files to build directory..." />
        <echo msg="Copying ./about.php to ./build directory..." />
        <copy file="./about.php" tofile="./build/about.php" />
        <echo msg="Copying ./browsers.php to ./build directory..." />
        <copy file="./browsers.php" tofile="./build/browsers.php" />
        <echo msg="Copying ./contact.php to ./build directory..." />
        <copy file="./contact.php" tofile="./build/contact.php" />
    </target>



    <!-- ============================================  -->
    <!-- (DEFAULT)  Target: dist                       --> 
    <!-- ============================================  -->
    <target name="dist" depends="build">
        <echo msg="Creating archive..." />
        <tar destfile="./build/build.tar.gz" compression="gzip">
            <fileset dir="./build">
                <include name="*" />
            </fileset>
        </tar>
        <echo msg="Files copied and compressed in build directory OK!" />
    </target>
</project>

Et pour plus d’infos, je vous invite à aller sur leur site.

.htaccess et Active Directory

.htaccess et Active Directory

Aujourd’hui je vais vous parler de quelque chose d’assez spécial : L’authentification par apache de personnes à partir d’un annuaire Active Directory.

Pourquoi une telle chose ? Et bien il s’avère que ce n’est pas aussi simple que sa à mettre en œuvre mais quand on l’a fait une fois, on peut le refaire plusieurs fois facilement en copiant les règles dans un fichier « .htaccess ».

Vu que j’ai eu un peu de mal, je vais vous fournir les différentes étapes et le .htaccess final. Tout d’abord vous devez avoir un serveur Windows (2000, 2003 ou 2008) avec le rôle Active Directory. Moi j’ai effectué tout ceci sur un Windows Server 2000.

Ensuite, vous devez connaître votre nom de domine et la structure de l’arbre de votre annuaire. Pour vous aider, voici une application java que j’ai trouvée sur le net, permettant de réaliser ceci. Juste un conseil, laissez juste apparaître dans la base DN les DC=,DC=com.

Sachez que pour pouvoir parcourir votre annuaire, un compte Windows doit être utilisé, pour des raisons de sécurité, je vous conseil de créer un compte lambda avec un mot de passe bidon, non modifiable et verrouillé. Essayez de minimiser les droits de ce compte si un hacker vous le vole.

Pour cet exemple, sachez que je suis dans le domaine virtual.fr donc pour me connecté à mon serveur DNS ayant pour IP 192.168.0.12 je dois renseigner le DN suivant :

DC=virtual,DC=fr

Après avoir testé avec l’application, nous pouvons enfin nous attarder au fichier .htaccess. Vous devez tout d’abord activer les extensions apache2 authzn_ldap et ldap. Si votre .htaccess ne marche pas, activez le module rewrite.

Ensuite voici le fichier .htaccess

AuthName "Warning : Restricted Area !!"
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap://serveur.virtual.fr:389/DC=virtual,DC=fr?sAMAccountName?sub?(objectClass=*)" NONE
AuthLDAPBindDN "ldap@virtual.fr"
AuthLDAPBindPassword motpasse
require valid-user </code>

Donc je vais expliquer chaque ligne :

AuthName "Warning : Restricted Area !!"
# définit le message qui s’affichera sur notre fenêtre de connexion
AuthType Basic
# nous définissons une authentification dite basique
AuthBasicProvider ldap
# nous demandons de passer par les annuaires LDAP
AuthzLDAPAuthoritative off
# permet de dire que nous n’utilisons pas de certificat particulier 
# lors de la requête dans Active Directory
AuthLDAPURL "ldap://serveur.virtual.fr:389/DC=virtual,DC=fr?sAMAccountName?sub?(objectClass=*)" NONE
# url utilisée pour aller effectuée notre requête. Nous demandons d’aller vérifier le nom de compte
# à partir de n’importe quelle classe d’objet de notre annuaire mais ayant pour contrainte d’appartenir
# au domaine virtual.fr
# Le NONE veut dire qu'on utilise aucun protocole de sécurité
AuthLDAPBindDN ldap@virtual.fr
# définit le login du compte de test 
AuthLDAPBindPassword motpasse
# et là son mot de passe
require valid-user
# pour finir nous acceptons d’afficher le site si seulement l’utilisateur entré est valide.

Voilà. Si vous ne voulez pas vous embêter avec les sessions utilisateurs ou si l’espace est réservé aux personnes enregistrées dans votre annuaire, cette méthode s’avère assez simple à mettre en place. Vous pouvez aussi ajouter différentes contraintes comme le groupe, le poste de travail à utiliser, …

Introduction au Framework Zend – Partie 3

Comme promis, voici la suite du tutoriel mais, avant de vous faire l’intégration du Layout, j’aimerais corriger un oubli et pas n’importe lequel car, il est de taille.

J’ai oublié de vous parler de l’ErrorController. Ce contrôleur, d’une importance cruciale, sert à capturer toutes les erreurs Apache que génère votre projet. Il n’existe qu’un seul contrôleur d’erreur pour tout le site et il se trouve dans le module default. Je vais donc vous passer le controller officiel.

Certains le personnalisent afin d’avoir des informations supplémentaires et des fonctions de plus (ajout dans un log, …).

/application/modules/default/controllers/ErrorController.php :

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) { 
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 error -- controller or action not found
                $this->view->title = "Erreur 404: Page non trouvée";
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Erreur 404 : Page non trouvée';
                break;
            default:
                // application error 
                $this->view->title = "Erreur 500 : Problème d'Application";
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = "Erreur 500 : Problème d'Application";
                break;
        } 
        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }
}

Et la vue associée /application/modules/default/views/scripts/error/error.phtml :

<h1>Une erreur est apparue</h1> 
<h2><?php echo $this->message; ?></h2> 

<h3>Exception information:</h3> 
<p>
    <b>Message:</b> 
    <?php echo $this->exception->getMessage(); ?> 
</p> 
<h3>Stack trace:</h3> 
<pre>
    <?php echo $this->exception->getTraceAsString(); ?> 
</pre> 
<h3>Request Parameters:</h3> 
<pre>
    <?php var_dump($this->request->getParams()); ?> 
</pre>

Comme ceci, nous aurons plus de facilité pour débugger notre application en cas d’erreur. Bien, maintenant que cet oubli est réparé, nous allons pouvoir commencer à nous occuper du Layout.

Pour cette partie sachez que nous aurons un nouveau dossier. Le dossier application/layouts qui contiendra tous nos fichiers composant la structure du site. J’ai pour habitude de séparer le header, footer et structure globale afin de me faciliter les parties de maintenance du site.

La partie CSS sera stockée dans le dossier /public/styles, la partie JS sera stockée dans /public/scripts et les images du site seront stockées dans /public/images.

Tout d’abord, vous voudrez peut-être voir le rendu final du layout, le voici :

Ensuite je vous passe le CSS : /public/styles/styleprincipal.css

a{
    text-decoration: none;
    color: #FFFFFF;
}
a:visited{}
a:hover{
    color: #724C2A;
}
input{
    border: 1px solid #4083A4;
    font-size: 12px;
    font-family:Arial, Helvetica, sans-serif;
    color: #0A0A0A;
}
#page{
    width: 950px;
    margin-left: auto;
    margin-right: auto;
    overflow: auto;
    font-size: 12px;
    font-family:Arial, Helvetica, sans-serif;
    border: 1px solid #4083A4;
    text-align: left;
}
#header{
    background-color: #4083A4;
    color: #FDFDFD;
    text-align: center;
    padding-top: 40px;
    font-size: 25px;
    height: 105px;
}
#liensheader{
    background-color: #4083A4;
    font-size: 15px;
    padding-bottom: 5px;
    color: #FDFDFD;
}
#liensheader span
{
    margin-left: 15px;
}
#contenu
{
    overflow: hidden;
    padding-left: 10px;
    padding-right: 10px;
    padding-top: 5px;
    padding-bottom: 15px;
    font-size: 12px;
    font-family:Arial, Helvetica, sans-serif;
    position: relative;
}
#contenu a{
    text-decoration: none;
    color: #000000;
}
#contenu a:visited{}
#contenu a:hover{
    color: #724C2A;
}
#piedpage{
    padding-top: 5px;
    padding-bottom: 5px;
    text-align: center;
    border-top: 1px solid #4083A4;
}

Pour finir voici le Layout composé des fichiers : /application/layouts/layout.phtml

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <div id="page">
            <?php echo $this->partial('header.phtml'); ?>
            <div id="contenu">
                <?php 
                    //cette fonction permet de récupérer la vue de l'action appelée
                    echo $this->layout()->content; 
                ?>
            </div>
            <div id="piedpage">
                Ignoti posticas pervadendoque vero pervadendoque.
            </div>
        </div>
    </body>
</html>

/application/layouts/meta.phtml

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></code> 

/application/layouts/styles.phtml

<link rel="stylesheet" type="text/css" href="<?php echo $this->BaseUrl(); ?>/styles/styleprincipal.css" />

/application/layouts/header.phtml

<div id="header">Tutoriel ZF</div>
<div id="liensheader">
    <a href="#"><span>Accueil</span></a>
    <a href="#"><span>Identifiez-vous</span></a>
</div>
Le fichier /application/layouts/scripts.phtml est vide car il n’y a pas encore de fichiers Javascripts. Quand à la fonction $this->BaseUrl(); elle retourne le répertoire de base du site. Ici il retournera /tutosite.com. Cela permet à Zend de savoir qu’il faut chercher ces fichiers dans le répertoire public et non dans les actions (sauf si vous avez créer des routes pour sa).

Après tout ceci, il ne nous reste plus qu’à rajouter les lignes suivantes dans le fichier /application/configurations/app.ini à la fin de la partie [production].

; ADD THE FOLLOWING LINES
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"

Maintenant, si vous allez sur le site http://localhost/tutosite.com, vous devriez tomber sur le même rendu que moi. Après, libre à vous d’en créer de nouveaux et pourquoi pas, de les faire partager ici. Si votre thème est vraiment bien fait, je pourrais l’intégrer pour la suite du tutoriel.

La semaine prochaine, nous allons commencer le module admin avec l’authentification à travers la base de données. Bon week-end à tous.

Oracle version gratuite

Pendant longtemps, j’ai cru qu’Oracle était réservé aux professionnels vu le coût de la licence en fonction du nombre de processeur, de clients sur la base, … Enfin bref, un truc performant pour un prix exorbitant. Et bien je me suis trompé.

Aujourd’hui, il m’a été demandé de monter un serveur oracle sur le réseau de l’entreprise pour un site en développement. J’ai alors demandé où le récupérer et s’ils avaient une licence, et, j’appris qu’une version « express » existe.

Elle est gratuite, s’administre par une interface web (comme VMware server 2) et a certaines limitations dont :

  • Limitation à un processeur (ne me demandez pas, j’ai jamais compris cette histoire)
  • Limitation à 4Go de stockage des bases de données
  • Limitation à 1Go de ram d’utilisation
  • Version 10g utilisée ici (contre la 11g sur la version pro)

Enfin bon, passé ces limitations, on peut quand même s’en servir assez aisément (avant d’atteindre les 4Go pour du développement il y a le temps).

Je n’ai pas encore eu le temps de l’essayer (oublié les cours d’oracle chez moi) mais l’interface web semble être intuitive. Elle est assez sobre et je pense pouvoir rapidement m’y faire.

Je pense vous faire parvenir d’ici quelques semaines mes premières impressions sur cette version express.

Pour plus de renseignement, allez sur le site de l’éditeur. Et, pour finir, voici le screen de l’écran principal de gestion 🙂