Jay a écrit 21 commentaires

  • # C'est aussi une question de compétences ...

    Posté par  . En réponse au journal PostgreSQL: mais que reste-t'il aux grandes ?. Évalué à 2.

    Au taff, on a eu un dilemme sur le choix de la base de donnée libre à utiliser pour un projet de régionalisation des donnés du centre d'appel (un gros truc quoi). Et là deux choix sérieux: Postgres ou Mysql. Postgres est effectivement beaucoup + mammouth que Mysql (quoique l'écart se ressert) mais peut-être trop mammouth en fait:

    - pour faire tourner un Mysql, on l'installe, on le démarre, on utilise un des nombreux gui (PhpMyAdmin, Mysql Browser, Sql Yog, MysqlFront, ...) on se connecte avec root sans mdp et on commence

    - pour PG, on installe d'abord un linux (plus maintenant heureusement), on installe l'appli, on configure les droits d'accès dans les fichiers de config (pg_hba.conf) , on cherche un gui sur le net, on en trouve que très peu (PhpMyAdmin, PGAdmin, ...), on tente de se connecter, on essaie de comprendre la notion de schéma, ... bref pour quelqu'un qui s'y connait peu, on galère.

    Postgres mérite effectivement d'être connu mais souffre d'être trop bien (c'est tout de même incroyable, pour une fois qu'un soft libre est aussi abouti !!!) et dans une équipe de développement où tout le monde n'a pas la compétence dba, il faut essayer de faire simple et efficace. Et là, on tombe totalement dans le crénau de Mysql.

    Mais c'est promis, on va faire des essais sur ce sgbd pour notre prochaine maquette ;-)
  • # not in real life

    Posté par  . En réponse au journal Topcoder. Évalué à 1.

    Il est clair qu'un certain nombre de trucs du codeurs sont des mauvais trucs à utiliser dans la programmation courante (nommage succints des variables, variables globales à tout va, ...)


    Effectivement, sur un vrai gros projet au sein d'une équipe, c'est pas jouable de programmer avec des variables de 2 caractères ;-) mais je suppose que c'est en participant à des concours comme ca qu'on arrive à écrire le code DeCSS le plus court du monde ;-)

    http://www.cs.cmu.edu/~dst/DeCSS/Gallery/hannum-efdtt-source(...)

    J'vais aller tenter un ou deux challenges moi ... et peut-être qu'un jour on m'appelera « DVD Jay » ;-)
  • # Si il n'y avait qu'arte ...

    Posté par  . En réponse au journal Arte et DRM : pareil que les autres. Évalué à 1.

    Si on commence a faire la liste des sites non conformes ... moi je suis resté bloqué sur www.seatfrance.com. Page d'accueil OK mais dès qu'on consulte les détails d'une voiture, on n'a qu'une vague moitié de l'écran et une mise en page tout boulversifiée ;-(

    Belle initiative de leur écrire, peut-être que si on est beaucoup à le faire, ca fera bouger les choses + vite :-)
  • [^] # Re: Mon avis de moi

    Posté par  . En réponse au journal Repenser les langages et le développement logiciel. Évalué à 2.

    Autant pour moi les gars, et merci de me remettre sur le droit chemin ;-)
  • # Mon avis de moi

    Posté par  . En réponse au journal Repenser les langages et le développement logiciel. Évalué à 10.

    Il y a beaucoup de propos intéressants sur cette page ... et beaucoup de langages aussi (Caml, B, ... ca me rappelle l'école). Mais je suis de l'avis de woopla (eux aussi d'ailleurs ;-p http://www.thinkgeek.com/tshirts/sysadmin/6692/):(...)
    Le problème se situe entre la chaise et le clavier.

    au moins pour 80% des cas! Le langage n'est que secondaire.

    ** Constatations **

    Les langages actuels sont certes insuffisants pour exprimer la richesse du monde mais la source primaire des bugs (AMHA) ce sont les personnes travaillant sur le projet. N'est pas développeur de logiciels qui veut. Si, me direz-vous, avec des outils style VB (malheureusement :-(). Je n'ai rien contre ceux qui travaillent avec VB, j'en fait d'ailleurs occasionnellement partie de par mon travail, mais VB vulgarise un peu trop à mon goût le développement d'applications. Pour qu'un programme soit fiable (sans bug ou presque), il faut de bon concepteurs (c'est-à-dire des gens qui réfléchissent à ce qu'il faut réellement faire et comment le faire), des analystes expérimentés qui proposent des solutions techniques (environnement, langages, ...), de bon pisseurs de lignes (qui codent rigoureusement en commentant leurs sources) et enfin de bons testeurs (en unitaire et en intégration). Ca ne résoud pas 100% des bugs mais devrait déjà faire avancer pas mal le schimilibilibilick.

    Allons plus loin, la source de la source, c'est l'argent. Pour être compétent, un développeur/analyste/testeur/pisseur doit avoir étudié la théorie (les maths, le paradigme objet, ...) et doit avoir de l'expérience ... donc va coûter cher à l'entreprise. Et généralement, un DSI préfère prendre un BAC+2 sorti de la fac, le former sur le tas et le payer à coups de bambous, quitte à ce que son boulot ne soit pas « top moumoute » mais qu'il arrive rapidement sur le marché (tant pis, on sortira un service pack ;-)) que de prendre des gens compétents (mais qui vont prendre plus de temps à produire et vont coûter + cher).

    [digression philosphique]
    Pour aller encore plus loin, la source de la source de la source, c'est l'homme: avide d'argent et de technologie pour le conforter dans sa paresse intellectuelle, il en veut toujours plus et contraint le système à aller vite, trop vite pour bien faire.
    [/digression philosphique]

    ** Conclusion **

    A « comment réduire le nombre de bug ? », je répondrais donc « en ayant la volonté de le faire ! ».

    ** Conclusion : la vraie **

    Non je déconne, le problème n'est pas aussi simple. Il est vrai qu'il y a encore beaucoup de travail pour améliorer les langages actuels : l'absence de typage strict des variables en PHP ou Javascript, la possibilité d'omettre la déclaration des variables en VB, le non typage des Objects d'un tableau en Java pre-1.5, l'absence d'assertions natives dans de nombreux langages.

    A ce titre, je proposerai un nouveau langage à la liste déjà longue évoquée ici: Eiffel (et son compilo GNU http://smalleiffel.loria.fr/).(...) On y trouve une implémentation du paradigme objet + poussée qu'en Java, un système de pré et post conditions sur les fonctions, ... des concepts très intéressant permettant une vérification accrue du code à la compil et à son exécution. Pas encore suffisant objecterez-vous, certes mais c'est un petit pas pour l'homme :-)

    Pour conclure, tout est affaire de perte acceptable: puis-je me permettre d'aller vite au détriment de la stabilité (pour des raisons commerciales le + souvent) (Mysql 5.0, Tomb Raider 1 à 6) ou est-ce que je dois prendre mon temps et limiter les bugs au maximum (A380)?

    Sur ce ...

    à non j'oubliais!

    la gestion des exceptions (ndr :les contrats)
    Les contrats n'ont, sauf erreur de ma part due au temps écoulé depuis mes cours de théorie OO, rien à voir avec les exceptions. Un contrat défini un ensemble de règles qu'un client doit respecter. En Java comme en IDL, c'est décrit par des interfaces qui énumèrent les méthodes que doit implémenter une classe cliente (le contrat qu'elle doit respecter).
  • [^] # Re: Surement

    Posté par  . En réponse au message Localisation Géographique d'un serveur. Évalué à 1.

    Ouais, plus ou moins. Un outil genre Visual traceroute devrait pouvoir le faire partiellement (http://visualroute.visualware.com/).(...) Par contre, j'en connais pas d'open source. Le problème vient du fait que ces programmes fonctionnent avec une base de donnée "remplie à la main" pour faire correspondre ip <--> emplacement physique et de telles bases sont très longue à constituer et peuvent changer souvent.

    Bon courage quand même
  • [^] # Re: float: left

    Posté par  . En réponse au message des DIV dans un DIV. Évalué à 1.

    Essai l'attribut "display" qui permet de spécifier comment un élement s'insère dans le flux du document (en gros, si l'élement provoque ou non un saut de page avant ou après lui).

    Voir http://openweb.eu.org/articles/initiation_display/(...) pour plus d'infos.

    .item {
    /*float:left;*/
    position:relative;
    width:100px;
    display: inline; }

    Testé dans IE6 et dans FF :-)

    A+,
    Jay
  • [^] # Re: C

    Posté par  . En réponse au message traitement selon le nom du fichier. Évalué à 1.

    Autant pour moi (et merci pour ces présicions). Je n'ai d'ailleurs pas vu le problème puisque j'affiche le nom de fichier avant le test. L'expression atoi(&file[4]), quand elle est vraie, empêche le remplacement de '\0' par '_' ;-( car jamais évalué! Avec une variable de plus, on devrait pouvoir faire (non testé!):
    int isnum;
    
    if(length==12 && !strncmp(file,"FFF_",4) && 
    	 !strncmp(&file[length-4],"_tmp", 4) &&
    	 !( *(file+length-4)=0 ) &&
    	 (isnum=atoi(&file[4]) || 1) &&
    	 ( *(file+length-4)='_' ) && isnum) {
    
    	// traitement sur le fichier ici ...
    
    (isnum=atoi(&file[4]) || 1) est toujours vraie et remplit isnum avec 1 si la séquence est un nombre, ( *(file+length-4)='_' ) remplace le '\0' par le '_' et renvoie toujours vrai et le teste se termine avec isnum. Voilà :-) /!\ si la séquence peut valoir 0000, le test échoue alors que le nom de fichier est valide, il faut rajouter un bout de test du genre ($file[length-5] == '0' || ...)
  • # C

    Posté par  . En réponse au message traitement selon le nom du fichier. Évalué à 1.

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <dirent.h>
    
    int main(int argc, char **argv) {
    
      struct dirent* entry;
      DIR* directory;
      char* file;
      int length;
    
      if(directory = opendir(".")) {
        while(entry = readdir(directory)) {
          printf("%s\t\t", (file=entry->d_name));
          length = strlen(file);
    
          if(length==12 && !strncmp(file,"FFF_",4) && 
    	 !strncmp(&file[length-4],"_tmp", 4) &&
    	 !( *(file+length-4)=0 ) &&
    	 (atoi(&file[4]) || !( *(file+length-4)='_' ))) {
    
    
    	// traitement sur le fichier ici ...
    	printf("OK\n");
    
          } else {
    
    	printf("BAD\n");
    
          }
    
        }
        closedir(directory);
      }
      
      return 0;
    }
    
    Quelques explications (si nécessaires):
    • en C y'a pas vraiment de booléens, juste 0 pour false et tout le reste pour true
    • toute affectation "retourne" une valeur, celle qui a été affectée à la variable à gauche de l'expression, ainsi (i=6) vaut 6, ce qui autorise a=(b=6) pour donner a=6 et b=6
    • l'expression suivant un && n'est évaluée que si l'expression située avant est true (!= 0)
    • l'expression suivant un || est évaluée quelque soit la valeur de l'expression située avant
    Ainsi: !( *(file+length-4)=0 ) remplace le dernier '_' par '\0' et renvoie !0 donc true, atoi(&file[4]) renvoie true uniquement si la séquence est un chiffre non nul, et !( *(file+length-4)='_' ) remet en place le '_' en renvoyant false pour ne pas interférer dans le résultat de atoi(). A+, Jay
  • # Insert, Update, Delete

    Posté par  . En réponse au message MySQL : échanger deux valeurs (clé primaire). Évalué à 1.

    Salut, si j'ai bien compris ...
    CREATE TABLE `produit` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `nom` varchar(80) default NULL,
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM;
    
    mysql> select * from produit;
    +----+------+
    | id | nom  |
    +----+------+
    |  1 | p1   |
    |  2 | p2   |
    |  3 | p3   |
    +----+------+
    
    Et pour deux produit d'id n et m, tu veux échanger n et m, ce qui revient à laisser n et m à leur place et à échanger toutes les autres valeurs des deux lignes de données. Moi je ferai un truc du genre:
    • - duplication du premier produit
    • - mettre à jour le premier produit avec les valeurs du second
    • - mettre à jour le second avec les données de la copie
    • - suppression de la copie
    en pseudo-sql, ca donnerai ca:
    • - insert into produit(nom) select nom from produit where id=n;
    • - p = select last_insert_id()
    • - update produit p1, produit p2 set p1.nom=p2.nom where p2.id=m and p1.id=n;
    • - update produit p1, produit p2 set p1.nom=p2.nom where p2.id=p and p1.id=m;
    • - delete from produit where id=p;
    Je pense pas qu'on puisse le faire en moins d'opérations ?!? Mais pourquoi vouloir échanger deux id de produits ? En as-tu vraaaaiiiiiiment besoin ? A+, Jay
  • # /proc

    Posté par  . En réponse au message Ressource ordinateur. Évalué à 1.

    Salut,

    Une première piste pour la mémoire ...

    % cat /proc/meminfo
    MemTotal: 516596 kB
    MemFree: 5704 kB
    Buffers: 104808 kB
    Cached: 174800 kB
    SwapCached: 0 kB
    Active: 203908 kB
    ...

    JAY
  • # Blob

    Posté par  . En réponse au message Inserer et recuperer une image à partir d'une base mysql dans une jsp. Évalué à 1.

    Salut,

    Pour insérer une image (ou plus généralement des données binaires) dans une table, il te faut une colonne de type blob (Binary Large OBject), plus précisemment une colonne de type mediumblob ou largeblob en fonction de la taille de tes images (http://dev.mysql.com/doc/mysql/en/blob.html).(...)

    Ensuite, tu récupère les données depuis une JSP avec la méthode getBlob() d'un objet Resultset, comme n'importe quel autre champ (http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html#get(...) Le « problème », c'est que tu va obtenir un objet Java de type Blob (un tableau de byte). Tu veux en faire quoi après de ton image ?

    Petit conseil, une base de données n'est « pas faite » pour stocker de grosses quantités de données binaires. Si tu as beaucoup d'images, le mieux est de les stocker sur un simple système de fichier, quitte à les référencer dans une table de la base (pour ce qui concerne les méta-données de l'image: format, taille, description, ...).

    Sur ce ... bonne continuation
    JAY
  • # Pourquoi faire compliqué quand ....

    Posté par  . En réponse au message Des Chiffres et des Lettres. Évalué à 1.

    Premiere Methode que je connais , sprintf a la C
    sprintf(chaine,"x vaut %d et y vaut %d",x,y)

    En quoi cette méthode ne te satisfait pas ?
  • # Pas possible ?

    Posté par  . En réponse au message Mot de passes md5 MySQL vs /etc/shadow. Évalué à 4.

    Salut,

    Comme le hash des mdp est dans les deux cas md5


    Non! Mysql conserve dans ses tables système (mysql.user) le md5 du mot de passe, en revanche, linux conserve dans /etc/shadow un md5 du crypt du mot de passe (cf le man de crypt :[...] crypt is the password encryption function. It is based on the Data Encryption Standard algorithm with variations intended[...]). Il me parait donc difficile de synchroniser les deux. Pour info, Mysql dispose de la fonction ENCRYPT(str[,salt]) qui devrait t'être plus utile ;-P.

    En revanche, tu peux éviter la synchro en utilisant un module pam (genre http://sourceforge.net/projects/pam-mysql/(...) ;-)) pour réaliser l'authentification linux directement sur le serveur mysql :-) Moi je le fait avec le module pam-lda, ca marche bien et ca soulage beaucoup la gestion des utilisateurs (va voir sur mon blog pour un tuto, à adapter pour mysql).

    Jay
  • [^] # Re: Chargement de la JVM en mémoire

    Posté par  . En réponse au message [applet] temps de chargement. Évalué à 1.

    suis pas convaincu --> moi non plus, j'ai jamais vu ca sur un site !?!

    Pour ce qui est de zindoze, moi j'ai un temps de latence au chargement d'une applet (avec ff ou ie!). Je ne pourrai donc pas te répondre, désolé ;-(

    Mais t'as vraiment besoin d'autant de sécurité sur ton site ? si oui, passes en SSL!

    Jay
  • [^] # Re: Chargement de la JVM en mémoire

    Posté par  . En réponse au message [applet] temps de chargement. Évalué à 1.

    Cette valeur, je la récupère à chaque chargement d'une page du site..


    Si tu ne la calcules que sur une page du site, je pense que tu peux te permettre de bloquer la sortie de la page tant que tu n'as pas de valeur. Fais une petite anim javascript pour faire patienter les gens qui viennent te voir :-p. Ensuite, la valeur obtenue, tu la mets dans la session pour éviter de la recalculer deux fois pour un même client!

    Au fait, si c'est pas "indiscret", t'en as besoin pour quoi de ton identifiant unique? un identifiant de session ne suffit te pas?

    A+
  • # Chargement de la JVM en mémoire

    Posté par  . En réponse au message [applet] temps de chargement. Évalué à 1.

    Salut,

    je n'ai accès à cette méthode que deux secondes après le chargement de la page


    Pour s'exécuter, l'applet (si rikiki soit-elle) a besoin d'un environnement Java complet: le navigateur recevant l'applet appelle donc le plugin qui lui même instancie une JVM, ce qui est relativement long (que ce soit pour une applet ou un programme « byte-compilé»). Je pense que c'est cette étape qui est la plus pénalisante dans le chargement et tu ne pourra pas y faire grand chose. Les même symptômes se retrouvent sous Wind*ws/IE (je sais, c'est pas une référence mais quand même).

    Si tu fais un refresh de la page, ca prend autant de temps ? (la jvm devrait déjà être en mémoire et ça devrait donc aller plus vite!).

    J'essaye d'accéder à une méthode d'une applet


    Depuis du javascript ? C'est vraiement génânt que ca prenne deux secondes ?

    A+,
    Jay
  • # goooooogle.com

    Posté par  . En réponse au message Server SSH ou FTP ?. Évalué à 1.

    Et en français s'il vous plait ;-)

    Cet article traite de la sécurisation des transferts FTP au moyen de
    SSL (FTPS), et des conséquences sur la traversée des firewalls.
    http://www.hsc.fr/ressources/breves/ftp-ssl.html.fr(...)


    Pour info, SSH (Secure SHell) permet principalement d'obtenir un shell sur une machine distante. Par extension, on peut aussi faire du transfert de fichier par SSH (FileZilla le fait, Putty aussi avec pscp) mais uniquement de serveur SSH à client SSH.

    Bonne chance,
    Jay
  • # Exemple

    Posté par  . En réponse au message Config apache2 identique avec ou sans SSL. Évalué à 1.

    Voila un exemple de configuration qui devrait te convenir (à adapter à ta config). J'ai pris un serveur sur un réseau privé (192.168.xxx.xxx) sans nom DNS, je suppose que tu as tout ce qu'il faut au niveau certificat (Note que c'est les fichiers de conf win32 que j'ai adapté (pas de deb sous la main), sous debian la conf se trouve dans /etc/apache2 dans plusieurs fichiers) :
    [httpd.conf]
    ServerRoot /etc/apache2
    Listen 192.168.0.1:80
    ServerName 192.168.0.1:80
    DocumentRoot /var/www
    
    <Directory /var/www/>
        Options FollowSymLinks
        AllowOverride None
    < /Directory>
    
    <IfModule mod_ssl.c>
        Include conf/ssl.conf
    < /IfModule>
    . . .
    . . .
    # EOF
    
    [ssl.conf]
    # configuration du générateur aléatoire
    # sous win32, seul builtin est dispo
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    
    # l'endroit (fichier) ou stocker le cache ssl, cf
    # http://httpd.apache.org/docs-2.0/mod/mod_ssl.html(...)
    # pour les autres options disponibles
    SSLSessionCache dbm:/chemin/vers/ssl_cache
    
    <IfDefine SSL>
    
    # où apache doit ecouter? par défaut toutes les
    # interfaces sur le port 443 (https)
    # /!\ complémentaire de ServerName qui donne
    # seulement le nom du serveur !
    # Listen 443
    Listen 192.168.0.1:443
    
    # définit les types mimes nécessaires
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl    .crl
    
    # cf doc ...
    SSLPassPhraseDialog  builtin
    SSLSessionCacheTimeout  300
    SSLMutex default
    
    # création d'un hôte virtuel par IP
    # /!\ rechercher sur google.com pour
    # la différence entre hôte par ip et
    # par nom et l'impact au niveau certificat
    <VirtualHost 165.5.12.241:443>
    
      ServerName 192.168.0.1:443
      ServerAdmin admin@localhost.localdomain
    
      # la racine des documents
      DocumentRoot /var/www
    
      #configuration du log
      CustomLog /var/log/Apache2/access.log common
      ErrorLog /var/log/apache2/error.log
      LogLevel warn
    
      #configuration SSL
      SSLEngine on
      SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    
      # où trouver les certificats ?
      SSLCertificateFile "conf/ssl/192.168.0.1.crt"
      SSLCertificateKeyFile "conf/ssl/192.168.0.1.key"
      SSLCertificateChainFile "conf/ssl/ca.crt"
    
      # workaround pour les browser mal foutus ;-)
      SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    
    < /VirtualHost>
    < /IfDefine>
    # EOF
    
    Quelques précisions: - consulte la doc sur le site apache pour toutes les options dispo (je sais c'est en anglais mais au moins y'a tout sans erreur de traduction!) - ta clé privée ne doit pas être cryptée ou tu dois ajouter une option (SSLPassPhraseDialog) pour indiquer à apache la clé de déchiffrage au démarrage d'apache - le DocumentRoot du serveur principal et de l'hôte virtuel doivent pointer sur le même répertoire (pour avoir le même contenu :-P) Voilà, ca devrait marcher comme çà! Bonne chance, Jay
  • [^] # Re: Avec des NameVirtualHost

    Posté par  . En réponse au message Config apache2 identique avec ou sans SSL. Évalué à 1.

    Bon après ca dépent pas mal si tu utilises des VirtualHost ...

    Ben en fait t'as pas trop le choix: pour faire du SSL, y'a que deux possibilités: soit activer le module dans la section principale de la configuration (et dans ce cas c'est tout le serveur qui tournera en ssl!), soit créer un virtual host sur le port 443 (cf doc d'apache pour la directive SSLEngine http://httpd.apache.org/docs-2.0/mod/mod_ssl.html#sslengine(...) : context: server config, virtual host

    que chaque page soit accessible ou non avec SSL, au choix...

    Un peu comme cet excellent site --> https://linuxfr.org(...) ;-P
  • # http://dev.mysql.com

    Posté par  . En réponse au message Petite question MySQL. Évalué à 1.

    Consultes la doc mysql en ligne : http://dev.mysql.com/doc/mysql/fr/string-functions.html.(...) Tu devrais y trouver ton bonheur pour pouvoir faire un truc du genre:

    INSERT INTO table_dest (jour, mois, annee)
    SELECT substring(mon_champs_date, 4, 4), substring(mon_champs_date, 2, 2), substring(mon_champs_date, 0, 2)
    FROM table_source


    Tu peux aussi utiliser CONCAT() pour reconstituer une date au format ISO avant d'insérer ça dans un champs de type DATE.

    Bonne continuation :-)