Question2Answer – FAQ StackOverflow Like

Publié dans Geekeries | 2 commentaires

Ok, donc Question2Answer est définitivement un super système de FAQ en PHP ! Un Stack Overflow Q&A like si vous préférez. Je le trouve plus adapté à mes besoins que Coordino présenté récemment par Idleman. Au programme :

  • très simple à installer,
  • sous licence GPL,
  • Apache, Mysql 4, PHP 4.3+,
  • très paramétrables, notamment au niveau des droits d’accès (ce qui faisait parti de mes exigences),
  • plusieurs « add-on » sont disponibles, ce qui implique qu’il doit être possible d’en créer facilement,
  • la communauté a l’air active,
  • en prime, c’est un entrepreneur, Gideon Greenspan qui est derrière, je ne sais pas quel est son business model, mais cela assure une certaine pérennité.

Question2Answer

Bref, même pas besoin de détailler le fonctionnement, cette application Web de FAQ s’utilise très facilement !
Je n’ai essayé qu’en local, il faudra que je vois sur mon serveur ce que ça donne niveau consommation mémoire.

Faire un screenshot en C++ avec Qt

Publié dans C / C++ | Un commentaire

Faire un screenshot (imprim écran) en C++ à l’aide du framework Qt est étonnamment trivial. Il est très facile de « prendre en photo » tout votre écran, ou seulement une fenêtre (en connaissant son Window Id) à l’aide de la méthode grabWindow de la classe QPixmap. Un petit exemple simple pour l’écran entier (Window Id : QApplication::desktop()->winId()) que l’on enregistre dans le dossier courant en PNG.

// - Shoot the screen
QPixmap pixmap = QPixmap();
pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());

// - Save this picture
QString format = "png";
QString filePath = QDir::currentPath()+"/myscreen."+format;
pixmap.save(filePath, format.toAscii());

Continuer la lecture

La sécurisation des mots de passe et les poissons volants

Publié dans Geekeries | Un commentaire

Dans l’épisode précédent "La sécurisation des mots de passe, c’est salée", j’avais expliqué l’intérêt du sel pour protéger les mots de passe de ses utilisateurs. On va voir désormais que cela n’est toujours pas suffisant, et que seul les poissons volants (blowfish) pourront nous sauver la mise !

Ajouté en 2017 : Bien que tout ce qui est expliqué ci-dessous dans cet article reste valable, depuis l’avénement de PHP 5.5, il est préférable d’utiliser la fonction password-hash pour hasher ses mots de passe en PHP. Cette fonction permet de gérer le sel, l’évolution de la complexité, et sera même capable d’utiliser d’autres algorithmes que bcrypt à l’avenir si le besoin s’en fait ressentir.
Bonne lecture !

Saler et hacher ne suffit pas

A la lecture de deux très bons articles sur le sujet : How to safely store a password (en), Exemple de stockage de mot de passe en Java : hashage et salage, est-ce suffisant ? ; on se rend compte que saler et hacher ne suffit pas !
Continuer la lecture

La sécurisation des mots de passe, c’est salée !

Publié dans Geekeries | 8 commentaires

Dans un précédent billet (Comment sécuriser les mots de passe de mes utilisateurs), j’expliquais quelques bases pour bien comprendre comment stocker convenablement le mot de passe de ses utilisateurs. Comme on l’a vu, il suffit d’enregistrer la valeur hachée du mot de passe (avec une bonne méthode de hashage comme SHA-1 ou SHA-2), pour éviter les conséquences désagréables sur la sécurité d’un vol de base de données !
Aujourd’hui, nous allons aller encore plus loin en tentant de contre-carré les attaques par dictionnaire ou pire par rainbow tables ! Pour cela, on aura besoin d’une bonne technique de salage (oui, avec du sel !), voire de poissons volants (blowfish >) !
Continuer la lecture

Le paradoxe des anniversaires

Publié dans Geekeries | 2 commentaires

Connaissez-vous le paradoxe des anniversaires ? Voici deux petites questions qui l’illustrent.

Combien de personnes (n) faut-il réunir dans une pièce afin qu’il y ait au moins 50% de chances que quelqu’un ait la même date d’anniversaire que moi ?

Réponse : 0.5 = 1 – (364/365)n, soit n = 253 personnes.
Donc, à partir de 253 personnes, il y a plus d’une chance sur deux que quelqu’un ait la même date d’anniversaire que moi.

Combien de personnes (n) faut-il réunir dans une pièce afin qu’il y ait au moins 50% de chances qu’au moins deux personnes quelconques aient la même date d’anniversaire ?

Réponse : 0.5 = 1 – (365/365)(364/365)…((365-n+1)/365), soit n = 23.
Donc, à partir de 23 personnes, seulement 23 personnes, il y a plus d’une chance sur deux que deux personnes aient la même date d’anniversaire. C’est le « paradoxe des anniversaires ».

Et cette propriété a de grosses implications sur la sécurité des systèmes informatiques, notamment au niveau des mots de passe et des fonctions de hashage.

Installer et Configurer Eclipse

Publié dans Java | Laisser un commentaire

Avant, je préférais avoir un seul Eclipse avec tous les plugins qui vont bien pour mes différents projets (Java, PHP, Android) et je jouais avec les workspace quand il fallait passer d’un projet à un autre. Aujourd’hui, j’ai l’impression qu’il vaut mieux avoir des Eclipses séparés selon l’utilisation :

  • Un optimisé pour les projets PHP,
  • Un autre pour les projets Java, OSGi
  • Et un autre pour Android. Même si pour ces deux derniers, j’aurai plutôt tendance à les mettre ensemble, à voir…

Du coup, j’ai une petite procédure d’installation / configuration et optimisation de mon IDE. La voici en résumé.
Continuer la lecture

Service Android et TabActivity

Publié dans Java | Laisser un commentaire

Lors de l’utilisation conjointe d’une TabActivity sur Android, et d’un service Android dans l’une ou l’autre des Activity, il faut faire attention à la manière dont on se connecte / déconnecte au(x) service(s) !
Il n’est pas rare d’obtenir une erreur du style :

WARN/ActivityManager(784): Binding with unknown activity: android.os.BinderProxy@6545646

La solution consiste à utiliser :

getApplicationContext().bindService(...);
// et 
getApplicationContext().unbindService(...);

plutôt que :

bindService(...);
// et 
unbindService(...);

Ce serait dû à un bug du SDK Android. Mais personnellement, cela me semble assez logique qu’il y ait à faire attention à qui (l’Activity parente, ou bien les Activity des onglets) « bind » et « unbind » les services puisque l’on a plusieurs Activity en même temps.

Personnellement, chez moi, ça rendait mes Activity quasiment inopérante : impossible de cliquer sur des boutons, d’accéder aux services, bref, la galère !

Plus d’informations

Enable hardware keyboard on Android emulator

Publié dans Java | Laisser un commentaire

I thought it was possible in previous version, but it appears that now it is not possible to use the physical hardware keyboard of a computer in an Android emulator… Hopefully, this is just a small configuration to edit!

  • Open the AVD Manager: in Eclipse > AVD Manager
  • Select the particular AVD, or create a new one, and click on Edit
  • Go to the « Hardware » section, click on « New ».
  • Select the Property: « Keyboard Support », and change its value to « yes » (it is « no » by default)
  • That’s it! You can start your emulator and use your physical keyboard.

AVD Manager

More information

Activer le clavier physique sur un émulateur Android

Publié dans Java | Laisser un commentaire

Il me semble que dans les versions précédentes cela fonctionnait, mais toujours est-il qu’avec les derniers émulateurs Android, il n’est plus possible d’utiliser le clavier physique de mon ordinateur pour taper un texte sur l’émulateur !
Heureusement, ce n’est qu’une petite configuration à modifier 🙂

  • Dans Eclipse, aller dans l’AVD Manager
  • Sélectionner un AVD existant ou en créer un nouveau
  • Aller dans la section « Hardware » et cliquer sur « New »
  • Sélectionner la propriété « Keyboard Support » et changer sa valeur à « yes » (elle est à « no » par défaut)
  • L’émulateur est prêt à être redémarrer !

Continuer la lecture

To search a needle in a PHP haystack

Publié dans PHP | Laisser un commentaire

Vous connaissez l’expression « Chercher une aiguille dans une meule de foin » ? Figurez-vous qu’elle existe aussi en anglais « To search a needle in a haystack » ! Et vu que ça peut se traduire mot à mot, je soupçonne nos amis anglais de nous l’avoir piqué… Oui, c’est gratuit 😉

Mais saviez-vous que cette expression existe aussi en PHP ?
Prenons l’exemple de la fonction in_array qui permet de vérifier l’existence d’un élément dans un tableau.

$haystack = array('cow', 'duck', 'pig');
$needle = 'cow';
if (in_array($needle, $haystack)) {
 echo 'Oh yeah!';
}
else {
 echo 'What?';
}

Et c’est la documentation PHP officielle qui utilise « needle » et « haystack » comme nom de variables !
Continuer la lecture