[phpsymfony.com] - Blog par un programmeur pour les programmeurs

Aller au contenu | Aller au menu | Aller à la recherche

mercredi, août 25 2010

Redirection d'un domaine de 1&1 vers un serveur dédié

Pour des développements personnels, j'ai eu à faire une redirection de nom de domaine vers un serveur dédié.
Plus précisement, le nom de domaine était hébergé chez 1&1 et le serveur dédié était un RPS 1 de OVH. (Je profite d'ailleurs de ce billet pour dire que ce type de serveur est capable de supporter une application modeste sous symfony 1.4 correctement). Si votre serveur dédié est chez un autre hébergeur, vous pourrez suivre la même manipulation.

N'ayant jamais effectué ce type manipulation, je me suis renseigné et finalement, il apparait que cette manipulation est très facile.

Il suffit de :
  •   faire pointer le DNS vers l'IP fixe du serveur
  •   configurer un virtual host sur le serveur dédié

Faire pointer le DNS vers l'IP fixe du serveur

Pour cela, il faut aller dans l'interface d'administration 1&1.
Sélectionnez "Configuration des domaines"
Cochez votre nom de domaine puis dans l'onglet DNS, choisissez "Modifier les paramètres DNS"
Dans le fieldset "Paramètres DNS avancés", sélectionnez "Autre Adresse IP" pour Adresse IP (A-record). C'est ce qui va permettre de faire la redirection.
Saisissez alors l'IP de votre serveur dédié.

Configurer le virtual host sur le serveur dédié

Pour mes besoins, j'ai utilisé le serveur web Apache 2 sur une Debian Lenny.
Vous devez configurer un vhost (dans /etc/apache2/sites-available/)
On supposera que le code source de votre projet est dans /var/www/projet et que le index.php est dans /var/www/projet/web.
Dans ServerName et ServerAlias vous devez renseigner votre nom de domaine 1&1.

Voici un exemple de virtual host :

NameVirtualHost *:80

<VirtualHost *:80>
        ServerAdmin xxx@xxx.com
        DocumentRoot /var/www/projet/web/
        ServerName domaine.fr
        ServerAlias domaine.fr
         <Directory /var/www/projet/web>
                AllowOverride All
                Allow from All
        </Directory>
</VirtualHost>


Activez votre vhost (commande a2ensite) et redémarrez votre serveur apache : c'est terminé.
C'est pas plus compliqué que ça !

samedi, août 21 2010

[PHP] Désactivation et remplacement des short tags PHP

La syntaxe des short tags <?= ?> et <? ?> peuvent sembler plus rapide à saisir dans un premier temps mais celle-ci comporte des inconvénients :

Tout d'abord, le fait d'utiliser des balises PHP longues <?php ?> vous assurent une portabilité de votre application sur tous les serveurs, y compris ceux sur lesquels vous n'avez pas la main sur la configuration (je pense par exemple aux serveurs mutualisés).

Ensuite parce qu'il y a confusion possible avec la balise xml :

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

Enfin, les short tags seront obsolètes en PHP 6.

Donc, une bonne pratique de programmation est de désactiver leur utilisation. Pour cela, direction le php.ini et trouvez la ligne :

short_open_tag = On

Remplacer On par Off.

Maintenant que vous avez changé votre configuration, il vous faut remplacer les short tags par leur équivalent dans votre code. Ainsi :

<? devient <?php

et

<?= devient <?php echo

Pour le remplacement, ca se passe sur le blog de Geoffrey.

mardi, août 17 2010

[développement] Configurer ses vhosts sur Debian avec Apache 2

Dans un article précédent, je parlais de la mise en place d'un environnement de développement avec une machine virtuelle.

Si vous avez plusieurs projets en cours, vous aurez surement besoin d'héberger ces sites sur ce même serveur de développement. Vous aurez donc à attribuer des virtual host.

La manipulation suivante a été réalisée sous une Debian avec Apache 2.

Tout d'abord allez dans le répertoire contenant les fichiers de configuration des vhosts :

cd /etc/apache2/sites-available

créer un fichier myvhost.conf

vim myVhost.conf

Ajoutez y les information que vous souhaitez. Voici un exemple de vhost que j'utilise sur mon serveur de développement :

NameVirtualHost *

<VirtualHost *>
        DocumentRoot /var/www/fortunes/web
        ServerName dev.fortunes.com
        ServerAlias fortunes.com
        DirectoryIndex index.php
        <Directory /var/www/fortunes/web>
                AllowOverride All
                Allow from All
        </Directory>
</VirtualHost>



DocumentRoot : cette directive définit le répertoire racine
ServerName : définit le nom d'hôte du serveur
ServerAlias : définit un nom secondaire pour un hôte
DirectoryIndex : donne une liste de ressources à trouver lorsque le client demande un index du répertoire en spécifiant un / à la fin du nom de répertoire.
Directory : permet d'appliquer un ensemble de directives au répertoire spécifié.

N'oubliez pas la directive NameVirtualHost en début de fichier.

Il faut ensuite activer le nouveau vhost. Utilisez :

a2ensite myvhost.conf

Relancez le serveur web :

/etc/init.d/apache2 restart

Allez éditer le fichier /etc/hosts. Vous y ajouterez à la fin de la ligne commençant par 127.0.0.1 le ServerName renseigné dans la conf. Exemple :

127.0.0.1 [...] dev.fortunes.com

C'est tout pour la partie Linux.

Maintenant, vous devez éditer le fichier host de votre Windows. Vous le trouverez dans : C:\Windows\System32\drivers\etc\hosts

Ajoutez une ligne en commençant par l'ip de la machine virtuelle et le nom du
ServerName renseigné. Exemple :

xxx.xxx.xxx.xxx dev.fortunes.com

Pas besoin de redémarrer, vous pouvez tester immédiatement avec un navigateur.



lundi, août 9 2010

[BASH] Renommer des fichiers avec find et xargs

Un post rapide pour mon retour de vacances :

Voici une petite commande si vous voulez ajouter l'extension .old à un certain type de fichier en utilisant find :

find . -name '*.swf' -exec mv {} {}.old \;


Le code ci-dessus vous permettra d'ajouter '.old' à chaque fichier dont le nom se termine par '.swf'.

Je me suis posé la même question pour une utilisation de find et xargs. Et j'ai obtenu ceci :

find . -name "*.swf" -print0 | xargs -t -0 -I {} mv {} {}.old

Ce qui produit le même résultat.
L'option -t de xargs est juste utilisée pour le rendre verbeux.

lundi, juillet 19 2010

[PHP] Erreur date() sur PHP 5.3

Après un passage à PHP 5.3, vous aurez probablement le message d'erreur suivant :

PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. [...]

Comme le message le précise, il faut définir le paramètre date.timezone dans votre php.ini. Voici la liste des fuseaux horaires supportés : http://php.net/manual/fr/timezones.php.

Vous pouvez également utiliser la fonction date_default_timezone_set.

Notez que le paramètre date.timezone doit être setté pour Symfony2.

[PHP] Mise à jour php vers 5.3 sur Debian Lenny

Comme vous le savez, Symfony 2 nécessitera au moins PHP 5.3.2 pour tourner.
Voici comment mettre à jour votre PHP :

ATTENTION - certaines fonctions PHP sont devenues obsolètes. Vous devez vous assurez que la mise à jour de posera pas de problème surtout si vous mettez à jour un serveur de production.

Ajoutez ces deux lignes dans votre fichier /etc/apt/sources.list deb

deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all

Lancez ensuite les commandes :
gpg --keyserver keys.gnupg.net --recv-key 89DF5277
gpg -a --export 89DF5277 | sudo apt-key add -
Puis, lancez la commande

sudo apt-get update

Puis

sudo apt-get install php5

Pour vérifier, lancez la commande :

php -v

Source : http://www.dotdeb.org/instructions/

mercredi, juin 16 2010

Mettre en place un environnement de développement

Dans cet article, je vais vous présenter la méthodologie pour se construire un environnement de travail pour développer sous Windows avec une plate-forme LAMP.
Je pars du principe que vous ne disposez pas de serveur de développement et que vous allez installer le vôtre.
Dans ce tutoriel, je vous montrerais comment :
 - installer une machine virtuelle
 - configurer cette machine
 - tester des développements

Installation machine virtuelle

Cette étape n'est vraiment pas difficile, néanmoins, j'ai choisi de détailler un minimum pour les utilisateurs qui découvrent :).
Pour commencer, téléchargez d'abord un soft permettant de créer des machines virtuelles.
Pour ne citer que les plus connus, il existe :
 - VirtualBox,
 - Parallels
 - VMWare Server

Dans ce tutoriel, nous utiliserons VirtualBox qui à l'avantage d'être gratuit et très simple d'utilisation. Il est toutefois plus limité en terme de fonctionnalités.

Voici le lien pour le téléchargement : http://www.virtualbox.org/wiki/Downloads

Une fois le programme installé, créer votre machine virtuelle.
Choisissez lui un nom.
Comme OS sélectionnez Linux et Debian en version.
Sélectionnez ensuite la RAM qui sera allouée à la machine. Comme vous vous en doutez, plus vous allouez de mémoire vive, plus la VM sera rapide, mais cela peut ralentir votre OS. Sachant qu'il n'y aura qu'un serveur web sur la machine 256 Mo seront suffisants.
Créez ensuite un disque dur. 10 Go devraient suffirent pour une utilisation normale.
La machine virtuelle est crée et prête à fonctionner. Il faut maintenant lui installer un OS.

Pour cela, rendez-vous sur le site de Debian pour télécharger l'image de la dernière version stable.
Une fois le téléchargement terminé, il faut indiquer à votre VM d'utiliser l'image récupérée. Vous pourrez ajouter un lecteur optique des les préférences de votre VM (onglet Support). Chargez ensuite l'ISO dans le lecteur et lancez votre VM.

Vous arrivez directement sur le menu d'installation de DEBIAN. Choisissez "install". Si vous avez besoin de récupérer votre curseur, appuyez sur CTRL droit.
Il s'agit ensuite du processus normal d'installation, choix de la langue, du territoire, de la disposition du clavier ... Vous pourrez utiliser toute la configuration par défaut.
Faites attention et notez bien le nom d'utilisateur que vous aurez créé.
Pas la peine d'installer un serveur web ou un SGBD, nous l'installerons à la main par la suite. Inutile d'installer un environnement graphique, cette machine servira principalement de serveur et le seul contact que vous aurez avec elle sera le shell ;)

Votre serveur est maintenant disponible et prêt à être configuré.

Configuration du serveur

Nous allons maintenant installer tous les outils de développements nécessaires. Pour cela la commande aptitude sera votre amie. (Il est recommandé d'utiliser aptitude plutôt que apt-get).
Nous installerons donc au moins :
 - un serveur SSH,
 - un serveur web avec PHP 5.2,
 - un serveur samba pour accéder à vos fichiers depuis Windows,
 - un serveur de base de données (Mysql),
 - un client svn (si vos projets sont sur svn).

Tout d'abord, il faut configurer la gestion du réseau sur la VM. Celle-ci doit être éteinte pour effectuer des modifications. Dans les préférences -> onglet Réseau, choisissez "Accès par pont", une carte réseau de votre machine qui est active. Vous pourrez même configurer l'adresse MAC au besoin dans le menu des options avancées.

Lancez la machine virtuelle.

Installation serveur SSH

Pour plus de confort, vous pourrez utiliser putty en vous connectant en SSH à votre VM. Le programme est disponible ici.
Pour utiliser putty, commencez par installer un serveur SSH sur votre machine :

aptitude install ssh

Ensuite, récupérez l'IP de la machine virtuelle via la commande :

ifconfig eth0

Vous pourrez maintenant vous connecter à votre machine virtuelle via putty, ce qui est plus confortable.

Installation serveur SAMBA


Commençons avec l'installation du serveur samba

aptitude install samba

On va ajouter un utilisateur à samba :

smbpasswd -a %utilisateur%


Où vous l'aurez compris, il faut remplacer %utilisateur% par votre nom d'utilisateur !
Pour rendre accessible un dossier, vous devez éditer le fichier /etc/samba/smb.conf

vi /etc/samba/smb.conf

Ajouter en fin de fichier :

[www]
path = /var/www
public = no
browseable = yes
user = guigui
writable = yes
create mask = 0750


Ces lignes signifient que le dossier /var/www sera accessible en écriture à l'utilisateur guigui. Bien évidemment, vous devrez remplacer guigui par le nom de l'utilisateur que vous avez ajouté juste avant.
Pour le moment, le dossier /var/www n'existe pas, et vous aurez donc une erreur en tentant d'y accéder, ce qui est tout à fait normal. Ce répertoire sera créé automatiquement lors de l'installation d'apache2.

N'oubliez pas de redémarrer samba après l'édition du fichier :

/etc/init.d/samba restart


Vous pourrez alors accéder à votre machine virtuelle en vous connectant sur \\XXX.XXX.XXX.XXX depuis Windows.


Installation du SGBD Mysql


Pour installer mysql, il suffit de lancer la commande suivante :

aptitude install mysql-server

Vous devrez alors saisir un mot de passe root (et sa confirmation).

si vous voulez tester, lancez la commande "mysql -uroot -p", puis saisissez votre mot de passe.

mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.0.51a-24+lenny4 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> exit
Bye


Installation serveur Web et PHP


Pour installer un serveur web apache2 avec php5, lancer la commande suivante :

aptitude install apache2 php5 php5-cli phpmyadmin

Vous devrez alors choisir un serveur web pour phpmyadmin. Choisissez évidemment apache2.

Pour vérifier que votre serveur web est bien lancé, exécutez la commande :

/etc/init.d/apache2 status

Vous devreiez avoir : Apache is running ...

Pour tester, il faut simplement vous connecter via un navigateur à votre serveur :

dans firefox, par exemple, inscrivez : http://XXX.XXX.XXX.XXX où XXX.XXX.XXX.XXX correspond, à  ... l'ip du serveur bien sur !

Vous devriez voir le message :

It works!

Votre serveur est maintenant installé et prêt à être utilisé.

Pour tester vos développements vous pouvez ajouter/modifier les fichiers dans /var/www.
D'ailleurs vous pourrez acceder directement à vos fichier via \\XXX.XXX.XXX.XXX



mardi, mai 25 2010

[symfony] Pas de batch actions dans un module admin-generator

Pour retirer les batchs action d'un module admin-generator,

il faut éditer le fichier generator.yml comme ceci :

    config:
      actions: ~
      fields:  ~
      list:
        batch_actions: []
      filter:   ~
      form:    ~
      edit:    ~
      new:     ~

[symfony] Pas de filtre dans l'admin generator

Il est possible dans l'admin-generator de retirer les filtres.

Pour cela, il faut éditer le fichier generator.yml du module en question :

    config:
      actions: ~
      fields:  ~
      list:    ~
      filter:
        class: false
     
      form:    ~
      edit:    ~
      new:     ~

mercredi, avril 7 2010

[symfony] Sécurité

J'espère que vous avez bien configuré votre serveur web pour ne pas que les fichiers de configuration soient vus par le robot Google.

Ces sites là ne l'ont pas fait ... et ils s'exposent à de graves problèmes...


[MAGENTO] Les problèmes d'arrondi avec Magento 1.3

Dans Magento 1.3, il y a quelques problèmes d'arrondi.

J'ai eu le problème suivant :
Mon site doit avoir des codes de promotion qui rendent la commande gratuite, frais de ports compris. (Non, je ne donnerai pas ces codes :))
Ensuite, dans le tunnel de commande, l'idée était de n'afficher que la méthode "free" si celle-ci était trouvée. (D'ailleurs, il ne faut pas oublier d'activer l'option adéquate en backend).
Malheureusement, avec les problèmes d'arrondi, sur certaines commandes, j'obtenais un total non pas à 0.00 mais 0.000...x.
Ce qui, bien évidemment, empêche l'affichage de la méthode "free".

Le problème se situe dans la classe : Mage_Payment_Model_Method_Free et plus précisément dans la méthode isAvailable.

   public function isAvailable($quote=null)
    {
        if (is_null($quote)) {
           return false;
        }

        if (Mage::app()->getStore()->roundPrice($quote->getGrandTotal()) == 0) {
            return true;
        }

        return false;
    }


La méthode roundPrice peut renvoyer une valeur erronée à cause de l'utilisation de la fonction round() avec une précision de 2.

Une solution est d'ajouter le code suivant :

        if (number_format($quote->getGrandTotal(), 2) == '0.00')
        {
          return true;
        }

Cela devrait permettre d'avoir la méthode "free" disponible.

Si vous avez également des problèmes d'arrondi dans le total sur le panier, je vous conseille de modifier la précision de la méthode roundPrice().


jeudi, mars 18 2010

[MAGENTO] Liste des évènements

Dernièrement, j'ai été amené à travailler sur MAGENTO chez Sensio Labs pour le compte d'un gros client.
Ne connaissant rien à cette plate-forme, j'ai du tout apprendre sur le tas !

Personnellement, je trouve Magento intéressant dans la mesure où l'on peut déployer très rapidement un site de e-commerce. Le backend de l'application est très fourni et fourmille de fonctionnalités permettant de paramétrer son site.
Cependant, d'un point de vue développement, la courbe d'apprentissage est très élevée et il faut un peu de patience pour comprendre le fonctionnement du système. D'autant plus que les articles/tutoriaux ne sont pas légions sur Internet, ce qui est bien dommage.

J'écrirais donc dans ce blog quelques articles spécialement consacrés à Magento.

La toute première tâche que j'ai eu à réaliser était de déclencher une action lors de la sauvegarde d'un compte utilisateur.
Pour cela, il faut se tourner vers les évènements.

Voici la liste des évènements que l'on peut "hooker" (version 1.3).

Pour utiliser cet évènement, on va devoir surcharger le module customer de Magento.

Dans les bonnes pratiques, il est (fortement) conseillé de ne pas modifier le code de base de Magento. Il est en effet possible de surcharger les différents modules de base (que l'on peut voir dans app/code/core/Mage) et bien évidemment d'en créer des nouveaux.

Après avoir choisi un namespace (le nom de l'entreprise par exemple), il faut créer le répertoire dans app/code/

mkdir app/code/[NAMESPACE]

C'est dans ce répertoire que l'on mettra tout notre code perso, on NE touchera JAMAIS à app/code/core.

Maintenant que l'on a définit un nouveau namespace, il faut que Magento puisse le détecter.
On va donc créer un fichier [NAMESPACE]_All.xml

touch /app/etc/modules/[NAMESPACE]_All.xml

On va placer dans ce fichier tous les modules de notre namespace. Exemple de contenu :

<?xml version="1.0"?>
<config>
    <modules>
        <[NAMESPACE]_Customer>
        <active>true</active>
            <codePool>local</codePool>
        </[NAMESPACE]_Customer>
    </modules>
</config>



Le code précédent permet d'activer le module [NAMESPACE]_Customer. Attention, vous devez configurer le namespace dans le backend de l'application.

Ensuite :

mkdir app/code/[NAMESPACE]/Customer
mkdir app/code/[NAMESPACE]/Customer/etc
touch app/code/[NAMESPACE]/Customer/etc/config.xml


Le fichier etc/config.xml contient toute la configuration du module. C'est notamment dans ce fichier que l'on pourra déclarer les installers, les règles de réécriture, ...

En ce qui nous concerne, on doit juste préciser la version du module et l'évènement à utiliser.

<?xml version="1.0"?>
<config>
    <modules>
        <[Namespace]_Customer>
            <version>0.1.0</version>
        </[Namespace]_Customer>
    </modules>
    <global>
     <events>
       <customer_save_after>
          <observers>
            <evian_customer>
              <type>singleton</type>
              <class>customer/observer</class>
              <method>afterCustomerSave</method>
            </evian_customer>
          </observers>
        </customer_save_after>
      </events>
    <models>
      <customer>
        <rewrite>
          <observer>[NAMESPACE]_Customer_Model_Observer</observer>
        </rewrite>
      </customer>
    </models>
    </global>
</config>


Le code précèdent signifie que lors de l'évènement customer_save_after, la méthode afterCustomerSave de la classe Observer doit être exécutée.
Le code a exécuter doit se trouver dans app/code/local/[NAMESPACE]/Customer/Model/Observer.php.
Or le fichier Observer.php existe déjà dans app/code/core/Customer/Model, il faut donc le réécrire (noeud rewrite).

Il nous faut donc créer un répertoire Model avec un fichier Observer.php

mkdir app/code/[NAMESPACE]/Customer/Model
touch app/code/[NAMESPACE]/Customer/Model/Observer.php


Le fichier Observer.php contiendra le code suivant :

class [NAMESPACE]_Customer_Model_Observer extends Mage_Customer_Model_Observer
{
  public function afterCustomerSave(Varien_Event_Observer $observer)
  {
    //execute code here
  }
}


Maintenant, après la sauvegarde d'un client, votre code perso sera exécuté.

Attention : ne pas oublier de nettoyer le cache après chaque modification de fichiers XML (de même que certains templates).

Je proposerais par la suite d'autres articles sur Magento et son utilisation.


dimanche, mars 7 2010

[Javascript] Déclencher un évènement avec Prototype

Il est possible de déclencher (simuler) des évènements avec Prototype.
Pour cela il faut utiliser event.simulate.js

Ensuite, il suffit d'exécuter le code :

$('foo').simulate('click');

Voici tous les évènements supportés :


var eventMatchers = {
    'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
    'MouseEvents': /^(?:click|mouse(?:down|up|over|move|out))$/
  }

lundi, mars 1 2010

[PHP] Calcul d'intérets simples et composés

Voici un bout de code pour calculer des intérêts simples et composés.

Pour rappel :

Formule des intérets simples : Cn = Co(1+nt)
Formule des intérets composés : Cn = Co(1+t)^n

où Co est le capital de départ, Cn le capital d'arrivée, t le taux d'intérêts, n la durée du prêt.


Le fichier est dispo à cette adresse.
Il nécessite un serveur web pour s'exécuter. Mais je vais le réécrire pour du CLI :)

[symfony] Surcharger le message d'erreur d'unicité de Doctrine

Lorsque l'on définit une contrainte d'unicité (unique: true dans le schema.yml) sur un champ, Doctrine va automatiquement afficher un message d'erreur : La colonne "column" existe déjà. Ce message n'est pas très joli à voir puisque la colonne n'est pas traduite. Pour le personnaliser, il faut le surcharger.

 $validatorLabel      = new sfValidatorDoctrineUnique(array('model' => 'MoperMissionPlace', 'column' => ('label')));
   $validatorLabel->setMessage('invalid', 'An object with the same value already exists');
   $this->validatorSchema->setPostValidator(
     new sfValidatorAnd(array(
       $validatorLabel
   ))
   );

jeudi, février 18 2010

Symfony 2 annoncé !

Hier lors du symfony live 2010, Fabien Potencier a présenté le nouveau symfony : Symfony 2.

Rendez vous sur http://symfony-reloaded.org/ pour plus d'informations.

Live blogging

Lien vers la video

mercredi, février 10 2010

[symfony] Charger des helpers dans le contrôleur ou le modèle

Pour charger un helper dans un template, il suffit d'utiliser la fonction :

use_helper('helperName');

Mais qu'en est-il dans le contrôleur ou le modèle ?

On peut utiliser en sf 1.0 et 1.1 :

sfLoader::loadHelpers('helperName')


Mais cette méthode est obsolète dans les versions >= 1.2

Il faut utiliser à la place :


sfContext::getInstance()->getConfiguration()->loadHelpers('helperName');

Si vous êtes dans une task :

$configuration = ProjectConfiguration::getApplicationConfiguration('backend', 'dev', true);
$context       = sfContext::createInstance($configuration);
$configuration->loadHelpers('HelperName');

jeudi, janvier 28 2010

[JAVA] Affichage des évènements d'une semaine basé sur un export de Google Calendar

Comme promis dans un billet précédent, voici le programme qui permet d'afficher les évènements d'un export de Google Calendar.
Il affiche tous les évènements d'une semaine de référence. 

Le programme est actuellement en v1.0.
Il prend en paramètre :
 - le chemin vers le fichier .ics
 - le début de la semaine de référence au format AAAAMMDD

Pour le lancer :

java -jar calendarAnalyser.jar path/to/calendar/file 20100128

Pour la petite histoire, j'ai développé ce programme car mon employeur actuel, Sensio Labs, demande à chaque développeur de remplir un Google Calendar en fonction des activités effectuées. Le vendredi soir, nous devons envoyer par mail un récapitulatif de tout ce qui a été fait dans la semaine.

Télécharger le jar
Télécharger les sources

Corrections du 01/03/2010
 - Correction du bug de classement des évènements dans une même journée
 - Correction du bug qui affichait les évènements de J+7

mardi, janvier 19 2010

[symfony] Eviter la mise à jour de updated_at

Au cours d'un projet, j'ai eu à implémenter un système de verrouillage sur les objets d'une table. Ce verrouillage était réalisé avec la modification d'une colonne (locked_until) contenant un timestamp.

Le problème était que lorsque je mettais à jour cette colonne, le updated_at de mon objet était lui aussi mis à jour, ce qui est tout à fait normal.

J'ai donc essayé de trouver comment contourner la mise à jour du champ et j'ai finalement trouver ça :

  public function updateLock($userId)
  {
    $updatedAt = $this->getUpdatedAt();
    $this->setLockedUntil(time() + sfConfig::get('app_lock_delay'

));
    $this->setLockedBy($userId);
    $this->save();
    $this->setUpdatedAt($updatedAt);
    $this->save();
  }


On sauvegarde l'ancienne valeur de l'updated_at, puis on effectue les modifications sur l'objet et on sauvegarde. Ensuite (et voila l'astuce) il suffit de faire un appel à setUpdatedAt() et de sauvegarder à nouveau l'objet. Ainsi, la valeur n'aura pas changé !

mardi, janvier 12 2010

JAVA - Ouverture et lecture d'un fichier

Comme je le disais dans le premier post de ce blog, je vais mettre également quelques bouts de code de JAVA.

Le premier morceau de code que je propose est ultra basique : c'est une simple ouverture et lecture de fichier.

public class CalendarFile
{

    public String path;
    public BufferedReader reader;
   
    //constructor opens file
    public CalendarFile(String filename) throws IOException
    {
        this.reader = new BufferedReader(new FileReader(filename));
    }
   
    public void printContent() throws IOException
    {
        String ligne = null;
       
        while ((ligne = this.reader.readLine()) != null)
              System.out.println(ligne);
    }
}


Et dans votre méthode main :

public static void main(String[] args)
{
        // TODO Auto-generated method stub
        String filename = "C:\\Users\\guigui\\workspace\\RemiseEnForme\\calendar.ics";
        try
        {
            CalendarFile calendar = new CalendarFile(filename);
            calendar.printContent();
        }
        catch (IOException e)
        {
            System.out.println("An error occured while opening the file");
        }
}



Vous aurez surement remarqué le nom de la classe : CalendarFile.
En fait, je fais un programme en JAVA qui va permettre de récupérer les données d'un export de google calendar.
J'ajouterai un nouveau post lorsque le programme sera fini.

- page 1 de 2