Catégorie : développement

Tout ce qui concerne le développement en général, que ce soit des choses générales, ou des choses bien précises. Cela va de la gestion de projet à la recherche du fonctionnement de pointeurs en C.

Motivation : mais bon sang ! T’as fait quoi là ?

C’est la traduction d’un article que j’ai lu ici.

Je crois qu’il y a un équilibre sain que tous les développeurs ont besoin d’établir, entre …

  1. S’enfermer dans un bureau privé et avoir un dialogue intime avec un compilateur et son programme ;
  2. Sortir en public et avoir un dialogue ouvert avec les autres êtres humains au sujet de son programme.

La plupart des programmeurs sont introvertis, ils n’ont pas besoin d’encouragements pour partir en courant, se retrouver seuls et passer du temps avec leur ordinateur. Ils le font naturellement. Livrés à eux mêmes, c’est la seule chose qu’ils feraient de toute façon. Je ne les blâme pas pour ça ; les ordinateurs sont incroyablement plus rationels que les gens. C’est d’ailleurs ce qui nous amène le plus souvent dans ce domaine. Mais il est possible d’aller trop loin dans l’autre sens aussi. C’est beaucoup plus rare, parce que cela va dans le sens inverse de l’introversion naturelle de la plupart des développeurs de logiciels, mais cela arrive.  Prenons moi, par exemple. Parfois, je crains de passer plus de temps de parler programmation que de programmer tout court.

Le jour où j’en suis arrivé au point de passer plus de temps à parler de développement que de développer, ma plus grandeur peur a été concrétisée : je suis devenu un expert. La dernière chose dont le monde a besoin, c’est d’avoir encore plus d’experts. Les experts ajoutent systématiquement des commentaires éphémères au lieu de faire quelque chose de concret et de réel. Ils ne participent en rien de matériel à la construction de quelque chose qui dure ; à l’inverse, ils observent passivement le travail des autres et se contentent de faire des commentaires à la blablablabla qui n’en finissent jamais en tournant des phrases dans un style complexe et tourmenté, de manière à se gonfler un peu l’ego. C’est pathétique.

C’est peut-être pour ça que cet article de SEO Black Hat m’a autant inspiré et motivé :

Do it F***ing Now.

Traduction :

P*tain, Fais Le Maintenant.

N’attends pas. Ne procrastine pas. Les vainqueurs ne sont pas ceux qui trouvent les meilleures excuses pour ne pas faire ce qu’ils savent comme un potentiel de gain d’argent. Les vainqueurs sont ceux qui savent organiser leurs priorités et remplir leurs journées.

Fais une liste des actions correspondantes aux tâches importantes et assure toi qu’elles soient réalisées. Tous les projets que tu as en tête devraient être en mouvement. Si tu n’avance pas, tu stagne.  Chaque pas que tu fais ne dois jamais se transformer en « pour le reste je m’y consacrerai la semaine prochaine ». Si ça peut te faire gagner de l’argent :

P*tain, Fais Le Maintenant.

Certains d’entre vous peuvent penser que le « P*tain » est en trop. C’est faux. Il vous faut l’impact. Il vous faut cette force, pour arriver à créer cet appel à agir, ce coup de pied au derrière qui va vous faire bouger. Sinon, vous allez finir comme la plupart des gros loosers qui avaient eu une super idée il y a longtemps mais qui n’ont jamais rien fait. Les rêveurs ne gagnent jamais d’argent. Ceux qui se bougent, si. Et ceux qui se bougent, p*tain, le font maintenant.

Note personnelle : cette suite d’expressions est intraduisible, mais j’aime bien

  1. Do it.
  2. Do it right.
  3. Do it right now.
  4. Do it f***ing right now.

vim : l'efficacité par la preuve directe

Depuis que j’ai vu ces vidéos, je sors avec plein de femmes, j’ai plein d’argent, et je suis aimé de la France entière.

Si vous parlez couramment l’Anglais, il faut absolument que vous voyez les vidéos de ce qu’il est possible de faire avec vim et qu’on n’a pas forcément en tête.

http://vimcasts.org/

Laissez d’autre sites en commentaire si vous avez des liens intéressants. Je n’hésiterai pas à les valider !

vim : expressions régulières rechercher remplacer (mémo)

Ci-suit une série d’expressions régulières qui fonctionnent sous vim, et dont j’ai fait la traduction en langue Française, afin que vous puissiez comprendre les subtilités :

  • /^ \+$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum un ou plus d’espaces (un antislash avant le « + »)
  • /^ *$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum zéro ou plus d’espaces (pas d’antislash avant le « * »)
  • /^ \*$ : rechercher toutes les lignes qui commencent par un espace et finissent par le caractère « * » (un antislash avant le « * »)
  • /^ \{1,1\}$ : rechercher toutes les lignes qui contiennent un et un seul espace (ne pas oublier l’antislash avant les « {} »)

Et maintenant une expression complexe qui m’a été très utile :
Si vous tapez exactement cela :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g

Vous aurez tous les ordres du type :

$this->Sejour_deb

Qui seront transformés en :

$this->SejourDeb

Très très utile.
Explication :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g
: = exécuter un ordre ;
% = appliquer sur la totalité du document ;
s = appliquer sur la chaine (ici ligne par ligne) ;
\($this->[a-z]\+\) = groupe qui a $this-> puis une série de lettres ;
\(_\) = groupe qui a un tiret bas ;
\(.\) = groupe qui contient un caractère quel qu’il soit ;
On voit qu’il y a trois groupes, ils sont accessibles via antislash puis le numéro du groupe, exemple : »\1« , et le cas concret :
/ = remplacer par… ;

  • \1 le groupe numéro 1 ;
  • \u mettre en majuscule ;
  • \3 le groupe numéro 3 ;

/g faire toutes les occurrences trouvées.

pygame : exemple de transparence

Voici un exemple simple pour gérer la transparence : cet exemple est très simple, il crée un petit carré qui suit la souris partout, et un autre « gros » carré qui apparait autour de la souris puis ne bouge plus, et dès que la souris sort de ce carré, hop, il fait un fondu au noir. Vous pouvez donc vous baser sur cet exemple pour comprendre comment transformer votre Surface en surface transparente destinée à être rapidement affichée à l’écran. Je parle de convert_alpha(). Avec cet appel, pour vous donner une idée, le temps pris est presque 40 fois plus rapide que sans l’appel. Vous pouvez tester par vous même !

Attention !
Le plus important c’est de faire dans l’ordre :

        self.image.set_alpha(valeur_transparence)
        pygame.Surface.convert_alpha(self.image)

Car l’ordre self.image.set_alpha(valeur_transparence) fera créer un masque au complet, et ce n’est qu’après qu’il vous faudra convertir la totale via pygame.Surface.convert_alpha(self.image).

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, pygame, sys, time, random, copy, pprint
from pygame.locals import *

class MySprite(pygame.sprite.Sprite):
    def __init__(self,width,height):
        # (!) Avant toute chose appeler le constructeur parent :
        pygame.sprite.Sprite.__init__(self)
        self.width = width
        self.height = height
        self.rect  = pygame.Rect(0, 0, width, height)
        self.image = pygame.Surface( (self.rect.width, self.rect.height) )
        self.image.set_colorkey((0,0,0))
        self.image.fill((0, 0, 0))

class SMouse(MySprite):
    def __init__(self,width,height):
        MySprite.__init__(self,width,height)
        pygame.draw.rect(self.image, (205,250,130), self.rect, 5)
        self.image = self.image.convert()

    def update(self):
        self.rect.topleft = pygame.mouse.get_pos()

class Contour(MySprite):
    def __init__(self,width,height,speed):
        MySprite.__init__(self,width,height)
        pygame.draw.rect(self.image, (105,250,230), self.rect, 5)
        self.fadeout = False
        self.speed = speed
        self.alpha = 250
        self.done = False
        self.image.set_alpha(self.alpha)
        # Convertir en transparent :
        pygame.Surface.convert_alpha(self.image)

    def update(self):
        if not self.fadeout:
            if not self.rect.collidepoint( pygame.mouse.get_pos() ):
                self.fadeout = True
        else:
            self.alpha -= self.speed
            if self.alpha<0:
                self.alpha = 0
                self.done = True
            self.image.set_alpha(self.alpha)

def main():
    pygame.init()
    pygame.mouse.set_visible(0)
    screen = pygame.display.set_mode( (0,0),
        pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE )
    if pygame.display.Info().bitsize < 24:
        print "This game needs a 24 bits display"
        pygame.quit()

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    pygame.display.flip()
    clock = pygame.time.Clock()
    c = Contour(500, 500, 5)
    c.rect.center = pygame.mouse.get_pos()
    group_sprites = pygame.sprite.RenderPlain( [ SMouse(50, 50), c ] )

Mysql : extraction avec séparateur de champs

Si jamais un jour vous voulez, comme moi, sortir une requête MySQL mais avec des séparateurs différents, voici comment faire :

<select statement>::=
SELECT ....
INTO OUTFILE '<filename>'
{FIELDS
 [TERMINATED BY '<value>']
 [[OPTIONALLY] ENCLOSED BY '<value>']
 [ESCAPED BY '<value>']}
| {LINES
[STARTING BY '<value>']
[TERMINATED BY '<value>']}
| INTO DUMPFILE '<filename>'
FROM <tables>... rest of SELECT statement

Les choses qui nous intéressent sont le « terminated by » :

{FIELDS
 [TERMINATED BY '<value>']}

Il suffit donc de remplacer par un ‘;’. Voici un exemple d’une requête, qui a enfin généré un fichier qu’Excel a accepté :

select ID,RAISONSOCIALE,EMAIL
FROM SOURCE
INTO OUTFILE '/mon_fichier_pour_excel.txt'
FIELDS TERMINATED BY ',';

J’ai trouvé l’astuce sur ce site, mais comme souvent, je la traduis en Français, en espérant que ça aide quelqu’un un jour !

vi et vim : chercher / remplacer (aide – explication rapide)

Comme je me sers souvent du rechercher / remplacer et que sous vim ce n’est pas évident au premier abord, j’en fais un résumé ici :

  • Rechercher « olivier » et remplacer par « famille » sans demander à chaque occurence trouvée :
    :%s/olivier/famille/g
  • Rechercher « olivier » et remplacer par « famille » et demander à chaque occurence trouvée :
    :%s/olivier/famille/gc
  • Rechercher « moi » et remplacer par « olivier » mais le mot en entier (exemple : le mot « moi » sera trouvé dans « je suis moi », mais pas « le mois de janvier ») :
    :%s/\\moi\\/olivier/gc
  • Rechercher « olivier » ou « inès » et remplacer par « famille » :
    :%s/olivier\\|inès/famille/g

NB : il faut taper le texte exactement comme il est écrit, par exemple si vous voyez :

:%s/olivier/moi/g

il faudra taper « deux points pourcent s slash (olivier) slash (moi) slash g » (entrée).

Je me suis inspiré de ce site en Anglais ici. J’en ai fait un court résumé / traduction.

Shell et tilde avec 'home' ou 'end' : la solution

Le solution a été trouvée ici.
Je vous la traduis en Français :
Il vous faut créer un fichier nommé .inputrc dans votre répertoire personnel, puis y ajouter les lignes suivantes :
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on


"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word

Linux mount : erreur 12. Solution à appliquer.

C’est la traduction d’un article trouvé ici.

Ci-suit comment appliquer un patch sur l’erreur assez commune « mount error 12 = Cannot allocate memory ».

[snip]
La bonne chose c’est que je l’ai corrigé, d’un point de vue Linux.
Et on est dans un groupe de discussion Linux.
Je vais donc être un bon citoyen (euh… « Internetoyen ») et expliquer comment j’ai fait afin d’aider éventuellement d’autres personnes qui se retrouveraient face à ce problème.
Il y a vraiment très peu de chose sur Internet, concernant ce sujet.

[snip]

Je fais mon article ici pour tous les autres qui pourraient être déstabilisés par cette erreur mount  :

mount error 12 = Cannot allocate memory

Ok, c’est qu’il devait sûrement y avoir quelque chose de mauvais dans la ligne de commande ou avec le système mount.cifs. C’est une erreur classique qui s’affiche sous Linux, lorsque vous tentez de monter un partage Windows XP, 2000, ou NT share et que ça ne fonctionne pas :

mount error 12 = Cannot allocate memory

Ce n’est pas un problème Linux… on s’en doute (sourire). Le problème vient de la machine Windows : c’est elle qui cause ce problème et qui refuse d’autoriser le « mount ». J’ai trouvé ce problème en faisant sous un terminal, tourner tail sur la liste des messages système d’un côté, et sous un autre terminal, tenter le mount pour voir quelles étaient les erreurs générées par la ligne de commande.

La commande qui génère l’erreur est :

[root@ohmster ~]# mount -t cifs //missy/ohmster_music /mnt/test -o username=my_user,password=my_password,rw
mount error 12 = Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
[root@ohmster ~]#

Les résultats du tail qui m’ont montré l’erreur :

[root@ohmster samba]# tail -f /var/log/messages
Oct 23 21:15:40 ohmster kernel: CIFS VFS: cifs_mount failed w/returncode = -12
Oct 23 21:19:43 ohmster kernel: Status code returned 0xc0000205 NT_STATUS_INSUFF_SERVER_RESOURCES
Oct 23 21:19:43 ohmster kernel: CIFS VFS: cifs_mount failed w/return code = -12
[root@ohmster samba]#

Le message NT_STATUS est suffisamment explicite, c’est bel et bien la machine Windows qui est la cause du problème, pas la machine Linux.

Ci-suit comment appliquer un patch. Le patch Windows, bien sûr.

The Solution !

Regardez le log des Events sur la machine Windows machine qui pose problème. Cherchez une croix rouge, et le mot « Error » ou « Erreur ». La source est « Srv ». L’erreur ressemblera à :

The server's configuration parameter "irpstacksize" is too small for the server to use a local device. Please increase the value of this parameter.

Si vous avez cette erreur système sur la machine Windows, alors faites ce qui suit.

Modifiez (ou créez si nécessaire) la clé de registre :

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters\IRPStackSize

Si la clé n’est pas présente, créez une clé de type DWORD, appelez la IRPStackSize. Validez.

Ensuite, qu’elle soit présente, ou que vous l’ayez crée, la procédure est la même :

  • Double-cliquez dessus pour l’éditer ;
  • Mettez le bouton radio sur Décimal afin d’être sur que c’est une valeur décimale (et non pas hexadécimale) ;
  • Entrez la valeur 15 ;
  • Redémarrez la machine.
  • Si cela ne fonctionne toujours pas :
    • Montez la valeur à 18 ;
    • Redémarrez la machine une nouvelle fois.

Le problème est résolu. Allez faire vos montages partagés Samba l’esprit tranquille.


~Ohmster

Si vous avez des commentaires / suggestions, n’hésitez pas à laisser un message !

Librairie gd et gdImageStringFT() : la libération à faire

Il n’est précisé nulle part, que lorsque vous utilisez des fonctions d’écriture telle que gdImageStringFT(), il faut toujours appeler gdFontCacheShutdown() à la fin du programme pour libérer les allocations faites. C’est valgrind qui m’a montré que ce n’était pas correctement libéré. Vive valgrind !

Linux : astuces bashrc

Lorsqu’on lance un nouveau shell sous Linux, il exécute un fichier ~/.bashrc.
Dans ce fichier, on peut y mettre des choses intéressantes, notamment :

export HISTCONTROL=erasedups
export HISTSIZE=10000
shopt -s histappend

Cela signifie :

  • effacer les lignes de commande en double ;
  • se souvenir au plus de 10000 lignes de commande (on n’en a jamais assez en fait) ;
  • dire au shell d’ajouter tout cela au fichier historique existant (et non pas ré-écrire par dessus (ce qui est fait par défaut)).