Archives de l’auteur : Olivier

Sqlite concat

Sqlite ne supporte pas la fonction concat() qui permet de concaténer plusieurs champs d’une table.

Cependant il est possible d’arriver au même résultat avec l’opérateur de concaténation de sqlite : le double pipe : ||

Par exemple :

SELECT champs1 || champs2 || 'texte perso' || champs5 as meschamps FROM ma_table

Retournera sous le nom « meschamps » tous les champs demandé ainsi que le texte manuellement saisie.

Sqlite ,Truncate et auto incrément

Sqlite ne supporte pas la commande TRUNCATE , c’est assez problématique lorsque l’on à une colonne en autoincrément que l’on veut réinitialiser.

Il existe cependant une solution pour contourner cette « limitation » :

On supprime dans un premier temps tous les enregistrements de la table

DELETE FROM maTable

Puis on remet à zéro l’autoincrément via :

DELETE FROM sqlite_sequence WHERE name='maTable'

Documentation sqlite sur l’autoincrément

Emulateur Iphone pour Windows

Ayant en charge le développement d’une webApp pour iPhone/iPod , cela faisait un moment que je cherchais un émulateur d’iphone valable pour Windows.


J’avais bien jusqu’à maintenant testé IBBDemo mais il montre très rapidement ses limites, notamment car il ne supporte pas le POST, pas moyen de passer une page d’identification donc.
Je m’étais donc résigné à utiliser Safari redimensionné à une taille à peu près identique à celle de l’iphone jusqu’à ce que je tombe sur Mobi One et son Test Center.

En plus d’un outil de design (pas forcément très utile) Mobi one propose surtout le Test Center une application permettant de tester ses webApp sous windows dans un environnement extrêmement proche de l’iphone.

En plus du classique affichage , vous aurez le droit aux outils de développement inclus dans Safari. Le test center gère également le multi touch , les gestures , l’orientation , la géolocalisation , bref tout comme un vrai Iphone mais sur votre pc … indispensable pour les personnes comme moi qui développe en local (faute d’avoir internet sur mon poste de dev -_- )

Constante de Date

Je viens de tomber tout à fait par hasard sur des constantes fort utiles en php.
De nombreux standard tel que le RSS nécessite un format de date particulier, format généralement imbuvable totalement impossible à mémoriser …
Et c’est là que les constantes DATE_* interviennent :

echo date(DATE_RSS);// Affichera par exemple  Thu, 05 Aug 2010 13:45:58 +1000

Toutes les constantes sont visibles sur la documentation et disponibles depuis PHP 5.1.1

preg_replace et modificateur #e

Une petite info qui peut se révéler utile (parce que perso j’ai mis une heure à trouver d’ou venait le problème !).
Lorsque l’on utilise preg_replace avec un modificateur d’évaluation #e , comme par exemple  :

preg_replace('#\[liste\]([^\[]*?)\[\liste\]#e','$this->parseList(\'$1\')',$chaine);

Et bien la fonction rajoute des slashes sur les doubles quote comme pourrait le faire addslashes. Je n’ai pas trouver de réelle solution si ce n’est un gros :

str_replace('\"','"',$chaine);

Thème sombre pour Netbeans

–Edit du 23/12/2013

Mise à jour du thème pour Netbeans 7.4 : voir ici

Venant juste d’installer Netbeans 6.8 pour remplacer PDT j’étais à la recherche d’un thème sombre. N’ayant pas trouver de thème me convenant j’en ai finalement fait un , inspiré par les couleurs du thème bespin de notepad++.

Le thème supporte PHP,HTML,CSS,JS,SQL,XML

Petit aperçu de quelques langages :

Pour télécharger le thème ça ce passe par ici
Pour l’installation vous n’avez qu’à vous rendre dans les options et choisir d’importer le fichier zip. Vous aurez alors un nouveau thème disponible dans le réglage des couleurs.

Base de données multilingue

Lorsque l’on se lance dans un site multilingue, on pense tout de suite, à comment va être traduit l’interface. On opte en général pour gettext ou une solution reposant sur une bdd (pas top à mon gout).
Cependant traduire le contenu de la base de données est une tout autres histoire et demande un peu plus de réflexion.

Prenons par exemple la table suivante :

videos
-id
-fichier
-duree
-nbvu
-titre
-description

Pour traduire le contenu de cette table il existe 2 méthodes très répandues mais qui présentent beaucoup de désavantages :

1- Duplication des colonnes

Dans cette méthode on va dupliquer les colonnes ayant besoin d’être traduite. Ce qui donnerait pour 2 langues :

videos
-id
-fichier
-duree
-nbvu
-titre_fr
-titre_en
-description_fr
-description_en

Cette méthode à l’avantage d’éviter la duplication de contenu, cependant elle trouve très vite ses limites. Il est difficile d’y ajouter une langue et la maintenance est une horreur si vous avez beaucoup de langue différente. Cependant cette méthode est facile à implémenter et peut être une méthode viable si vous avez seulement deux langues et ne risquez pas d’en rajouter.

2- Duplication des lignes

Pour pallier au problème de l’ajout de nouvelle langue certains préfère dupliquer les lignes plutôt que les colonnes. On se retrouve alors avec une table du type :

videos
-id
-fichier
-duree
-nbvu
-titre
-description
-langue_id

langue
-id
-code

Vous aurez donc autant de lignes pour une vidéo que vous aurez de langue.
L’ajout de nouvelle langue est donc facilité mais la duplication de contenu que cette méthode induit est à mon avis une très mauvaise chose.

Comment peut-on traduire le contenu de notre table ?

J’ai opté pour une méthode différente. Elle oblige à créer une table supplémentaire pour chaque table ayant besoin d’être traduite mais à le mérite de combiner les avantages des deux méthodes précédentes :
– Pas de duplication de contenu
– Ajout de langue simple
– Facile à interroger

Nous allons donc nous retrouver avec trois tables :

Pour chaque vidéo on aura un enregistrement dans la table vidéo auquel on associera des enregistrements de la table videos_traduction.
La sélection des données reste simple :

SELECT v.id,v.fichierFROM videos vINNER JOIN videos_traduction vt ON vt.idVideo = v.idWHERE vt.idLangue = :langue

En plus de tous les avantages précédemment cités, cette méthode apporte un niveau de normalisation tout à fait satisfaisant.

Et vous quelle méthode utilisez vous ?

Auto complétion d’identification dans les mauvais textbox

C’est un problème que j’ai rencontré récemment avec divers navigateurs. Quand vous vous identifiez sur un site , votre navigateur peut vous demander si vous souhaitez conservez en mémoire ces identifiants pour ne plus avoir à les retaper.

Le problème c’est que lorsque l’on fait cela , Firefox et Chrome (je n’ai pas testé les autres) on la très mauvaise habitude de remplir tous les champs mot de passe et le champs texte précédent avec vos identifiants.
Vraiment pas pratique sur un formulaire de création ou d’édition !

Fort heureusement il existe une solution , il suffit de rajouter un attribut aux champs qui sont autocomplétés alors qui ne devraient pas l’être :

<input autocomplete="off" name="pass" type="password" />

Désactiver google Buzz

Si comme moi la vie des autres ne vous intéresse pas mais que vous vous sentez concerné par votre vie privée et que par dessus tout vous êtes fâché avec les sites sociaux voici comment désactivé la nouveauté google aussi inutile qu’envahissante , j’ai nommé Google Buzz.

Vous pouvez dans vos paramètre gmail modifier vos étiquettes pour supprimer le lien. Cependant cela ne désactivera pas Buzz et vos contact seront automatiquement vos followers.

Pour réellement désactiver buzz (du moins j’espère) il faut se rendre touuuuuuut en bas de la page :

Et choisir de désactiver le buzz

Sqlite Encryption Extension avec PHP

PHP intègre de base sqlite3 , cependant cette version ne supporte pas les bases cryptées avec SEE. La seule solution pour que PHP puisse intéragir avec des bases cryptée c’est de re-compiler l’extension sqlite3 avec l’extension SEE fournie par sqlite (après s’être acquitté de la licence à 2000$ ).
Nous verrons donc ici comment réaliser ceci sous Windows. Je n’ai effectuer la manipulation qu’avec un PHP VC9 , mais celà doit être plus ou moins équivalent avec un VC6.

Prérequis :

Divers outils sont nécessaire avant de commencer quoi que ce soit

  • Visual Studio 2008 (nom de code Vc9) version pro ou express.
  • Le SDK Windows 6.1 : Voir ici
  • Les Binary tools de PHP : Télécharger
  • Les sources PHP : Voir ici
  • Les librairies PHP annexes. Dans le doute je les ai toutes prises, c’est pas très gros , autant pas se priver. Voir ici
  • Les sources de SEE téléchargées sur le dépôt sqlite. Faites attention à la version utiliser dans PHP pour être en adéquation (3.6.19 avec un PHP 5.3.1).
  • Apache version VC9 si besoin : Apachelounge

Procédure :

1- Dans un premier temps installer Visual Studio puis le SDK windows. C’et sans doute la partie la plus longue de l’opération….
2- Pendant ce temps préparez le dossier qui va recevoir les sources à compiler. J’ai personnellement crée un dossier D:/php-sdk.
3- Extraire les binary tools dans le dossier php-sdk. Vous devriez vous retrouver avec un dossier bin et script.

A partir de ce point l’installation du SDK et Visual doit être terminée.

4- Depuis le menu démarrer ouvrir le shell Windows SDK puis taper :
setenv /x86 /xp /release
cd d:\php-sdk\
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat php531

Le nom php531 est bien évidemment à choisir en fonction de votre version de php / humeur.
5- Extraire les sources PHP dans \php531\vc9\x86\
6- Modifiez L’extension sqlite de php (\php531\vc9\x86\ext\sqlite3\libsqlite\) avec la version SEE. Voir la doc SEE pour les lignes de code à copier et insérer.
7- Extraire les librairies annexes dans \php531\vc9\x86\deps\ si vous en avez besoin.
8- Lancez la commande : D:\php-sdk\php53dev\vc9\x86\php5.3.1\buildconf pour créer le fichier de configuration
9- configure –help . Vous donnera les différentes options possible pour votre compilation. Gardez en tête que pour obtenir une dll les extension doivent être compilée en shared.
Par exemple : configure –enable-pdo –with-pdo-sqlite3=shared
10- Une fois la configuration terminée (sans erreur) lancez : nmake
11- Une fois la compilation terminée lancez : nmake install
Par défaut vous trouverez les binaire et dll dans C:/php5/
12- Copiez la dll sqlite3 nouvellement compilé et remplacez là dans vos binaires de production.

Attention : Il est indispensable que vos binaires soit compilé avec le même compilateur que votre extension ! Extension VC9 = binaire VC9.

Après un redémarrage de php vous pouvez desormais profiter de la version cryptée de sqlite directement dans php.
On peut par exemple ouvrir une base cryptée comme ceci :

$sql->query('PRAGMA key=\''aes256:maclesecrete\'');