Archive

Archive for juin 2012

[MMIT] L’entretien

Aujourd’hui, je vais un peu parler des entretiens.
Dans la vie d’un prestataire, c’est un peu la pierre angulaire de tout le reste.
On passe des entretiens pour intégrer une SSII et ensuite on passe des entretiens pour aller chez les clients.
Si l’entretien est réussit, on peut parfois décrocher des missions vraiment bien.
Par contre, si on rate, les missions peuvent s’envoler. Et, en SSII, trop d’entretiens ratés peuvent nuire à la carrière…
Donc, ici, je vais donner quelques conseils utiles (ce n’est pas exhaustif, à adapter suivant les situations/personnes) qui m’ont été donnés (tradition orale oblige) au fil du temps et que j’essaie de mettre en pratique.

Lire la suite…

Catégories :Divers, MMIT

[C# WinForm] BackgroundWorker, ProgressBar

Depuis hier, j’avais besoin de prendre un peu de recul avec le code.
De faire autre chose.
Donc, j’ai fais du WinForm. Normal, ça faisait longtemps 😀

Au programme : traitements longs, BackgroundWorker, ProgressBar et parallélisme. Ah non, ça, je n’ai pas le droit (Framework 3.5 oblige…).
(Et oui, je sais, ce n’est pas neuf, mais ça fait pas de mal d’en reparler ^^)

Ce (long) billet sera organisé par étape pour « formaliser » le sujet, avec un peu plus de rigueur que d’habitude (ça ne peut pas faire de mal).
Donc, on retrouvera l’expression de besoin, la réflexion et la réalisation.
Je ne le faisais pas pour le moment, mais je pense que ça pourrait (m’)être utile.

Donc, action 😉

Lire la suite…

Catégories :.Net, C#, WinForm

[MMIT] Vocabulaire

BSODDans ce premier billet (introduction ici) , on va voir un peu de vocabulaire pour comprendre ce qui sera dit dans les suivants.

Il faut savoir qu’en France (je ne sais pas pour les autres pays), mais le modèle qui a été choisie (à tort ou à raison) pour l’organisation dans un Système d’Information est un modèle calqué sur le bâtiment et les travaux publics.
Pourquoi ? Bonne question (j’y reviendrais une autre fois)…

Lire la suite…

Catégories :Divers, Humeur, Humour, MMIT

[MMIT] Le Monde Merveilleux de l’IT – Introduction

« Le Monde Merveilleux de l’IT », ce sera une série de billets d’humeur, d’humour (à une lettre près), de choses qui m’agacent et d’autres que j’aime.

Tous les billets titrés MMIT seront donc uniquement dus à ma perception, mon expérience et aux discussions que j’aurais eu avec des collègues, amis etc. travaillant dans le domaine de l’IT (et donc non imputable à la SSII ou au client pour lesquels je travaillerais).

Ce sont des critiques (en bien ou en mal) du monde de l’IT, des méthodes de travail etc.
Certaines choses seront caricaturales, limite absurdes. C’est un fait.
Au lecteur de se faire un avis de ce qu’il en est réellement.

Le but de ces billets n’est pas la critique gratuite, mais, j’espère, un biais pour formaliser un problème et, peut-être, engager une discussion (si le cœur vous en dit; et accessoirement faire un peu rire ou sourire ^^).

Je vais prendre mon temps pour écrire ces billets (en fait, j’en planifie au moins six et comme ça fait longtemps que j’y pense, j’ai déjà eu le temps de formaliser un peu), justement pour ne pas tomber dans la critique gratuite et le « tu dis ça parce que t’es en colère » (ce qui n’est pas toujours faux).

Je mettrais à jour ce billet au fil du temps pour avoir un sommaire des MMIT.

D’ailleurs, pile poils aujourd’hui, alors que je voulais publier ce présent billet : La France dévalorise à tort le métier de développeur informatique ! (comme quoi…).

 

Sommaire

 

Catégories :Divers, Humeur, Humour, MMIT

SharpDevelop 3.2 et Projet Web

J’ai changé de boîte dernièrement (fin le 31 mai, début le 18 juin) et je commence donc avec un poste de travail sans aucun droit administrateur (mais bon, j’ai un poste de travail ^^).
Du coup, pas possible d’installer Visual Studio ou même les versions Express. De même, pas moyen d’installer le Framework .Net 4.0.
Alors, que faire ? (bon, j’avoue, j’ai l’option « téléphoner au support »…mais c’est trop simple ! :))
Et bien, j’ai décidé de faire joujou avec d’autres outils que d’habitude (et puis c’est bien de voir d’autres choses).

Mon choix s’est porté sur SharpDevelop. Pour la raison exposée plus haut (Framework 3.5 max sur mon poste), j’ai pris la version 3.2.
Une fois installée, je créé un nouveau projet Web.

SharpDevelop – Création d’un projet Web

 
Par défaut, SharpDevelop met un tas de bordel.
Ça commence par une entête de fichier (avant le using), puis des régions et des commentaires pour séparer les blocs (dans quel but ? aucune idée).
Pour les entêtes, c’est simple de les virer : dans le menu Tools -> Options, puis Coding -> Edit Strandard Headers.

Après…et bien, le premier réflexe (pour moi, puisqu’il y a du contenu et une CSS par défaut), c’est de lancer le debug.
Et là, c’est le drame.
SharpDevelop n’embarque pas de Webserver comme le fait Visual Studio.
Du coup…et bien, on peut pleurer un bon coup ou chercher à pallier le problème.

Et notre application héroïque est : CassiniDev.
Ca fait plein de choses, avec, surtout ce qui m’intéresse là maintenant tout de suite : le Webserver.
Donc, on télécharge et on décompresse l’archive (C:\Programs\CassiniDev pour ma part).

On revient dans SharpDevelop, sur le projet Web et on va dans ses propriétés, onglet Debug :

SharpDevelop - Propriétés du projet Web

SharpDevelop – Propriétés du projet Web

J’ai mis ici uniquement la partie pertinente :

  • Start Action positionné sur Start External, avec le chemin vers le Webserver de CassiniDev.
  • Start Options, avec une command line du type : /port:[le port que je veux] /path: »[chemin vers mon projet web] »

On fait la même chose pour la configuration Release.
Et pis c’est tout.

En parcourant les autres onglets, on voit une étrangeté : sur l’onglet Application, l’Output type est positionné à Class Library.
Ça fait bien bizarre, mais c’est normal.

Voilà, on peut commencer à jouer 🙂

Catégories :.Net, ASP.Net, C#, IDE

[C#] Reflexion et méthode générique

Récemment, j’ai eu un besoin assez con : appeler une méthode générique sur un type que je ne connais qu’au runtime.
Et là, c’est un peu le drame.

En effet, il n’est pas possible de faire un truc du genre DoSomething().
J’aurais bien sûr pu changer l’architecture et la relation entre les différentes classes, sortir un design pattern…mais le fait est que ça aurait été sortir l’artillerie lourde pour pas grand chose.
D’autant plus qu’avec l’architecture en place, j’aurais pu tomber sur des références circulaires…

Du coup, je me suis fait deux petites méthodes :

private static MethodInfo GetMethod<T>(String name)
{
     return typeof(T).GetMethod(name);
}

Cette méthode prend en type générique « T » la classe dans laquelle se trouve la méthode et en paramètre « name » le nom de la méthode.
Et là, attention, la casse est importante.

Du coup, j’ai récupéré le MethodInfo contenant ma méthode.
Mais dans le cas où elle est générique, il faut appeler une autre méthode :

private static MethodInfo GetGenericMethod(MethodInfo method, params Type[] types)
{
      return method.MakeGenericMethod(types);
}

Là, on obtient la méthode générique à proprement parlé et on peut faire son Invoke() dessus.
Au final, on pourrait également raccourcir comme il suit :

private static MethodInfo GetGenericMethod<T>(String name, params Type[] types)
{
     MethodInfo method = GetMethod<T>(name);
     return method.MakeGenericMethod(types);
}

L’utilisation serait donc : GetGenericMethod(« GetAll », myObj.GetType());
Simple, rapide, efficace.
Ceci dit, la réflexion, c’est un peu comme l’alcool : à utiliser avec modération ! 😉

Catégories :.Net, C#

[Sybase] Quelques tables systèmes

Dans Sybase, comme dans Oracle ou SQLServer, il y a des tables systèmes.
Autant ce n’est pas une bonne idée de les modifier, autant il peut être utile de les connaître et de les interroger.
Du coup, dans ce billet, on va voir quelques tables systèmes, comment les lier et les utiliser (toujours en lecture).

La table centrale, pour une utilisation autre que DBA, est la table sysobjects.
Elle peut être utile à connaître dans le cadre de développements et encore plus dans le cadre d’une maintenance (du genre quand on connait pas toute l’application…).

La colonne « type » est la plus importante, à mon sens, les valeurs sont :

  • D : Default
  • P : Procédures
  • RI : Contraintes de référentiel
  • S : Tables système
  • SF : Fonctions
  • TR : Triggers
  • U : Tables (créées par l’utilisateur)
  • V : Vues
  • Dans le tas, j’avoue que je ne vois pas trop l’intérêt des types D et RI…(actuellement, c’est les tables qui ont été créées à l’occasion d’une modification structurelle, avec un nom du style ).

    Quoiqu’il en soit, si on fait un bête et méchant :

    SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name
    

    On obtient toutes les tables utilisateur.

    Peut-on aller plus loin ? Bien sûr ! (et encore heureux !)

     
    Comment voir la source d’une procédure, par exemple ?

    SELECT com.text AS TEXT 
    FROM dbo.sysobjects obj 
    INNER JOIN dbo.syscomments com 
        ON com.id = obj.id 
    INNER JOIN dbo.sysusers users ON users.uid = users.uid
    WHERE obj.name LIKE '<mon élément>' 
    AND obj.type = 'P'  -- facultatif
    AND users.name = 'dbo' 
    ORDER BY obj.name, com.colid
    

    Mais cela fonctionne également avec les triggers, par exemple.
    Il suffit de changer type = ‘P’ en type = ‘TR’ (‘V’ pour les vues…) et indiquer le nom du trigger à la place de .

    Pourquoi filtrer sur l’utilisateur ‘dbo’ ?
    Parce que l’élément va potentiellement exister pour chacun des utilisateurs qui peuvent le voir/exécuter.
    Dans mon cas, il y a une trentaine utilisateurs…

    Et ‘colid’ ? C’est simplement l’index du bloc, avec pour base 1.
    Pour une procédure, par exemple, le premier bloc contiendra à minima ‘CREATE PROC […]’.

    Pas toujours utile.
    Je préfère la recherche d’un texte :

    SELECT 
        obj.name AS 'PROC',
        com.text AS TEXT 
    FROM dbo.sysobjects obj 
    INNER JOIN dbo.syscomments com 
        ON com.id = obj.id 
    INNER JOIN dbo.sysusers users ON users.uid = users.uid
    WHERE obj.type = 'P' 
    AND lower(com.text) LIKE lower('%TODO%')
    AND users.name = 'dbo' 
    ORDER BY obj.name, com.colid
    

    (bon, le pire, c’est que cette requête me retourne des résultats XD )
    Avec une requête de ce type, on va, par exemple, pouvoir chercher sur le nom d’une procédure, pour voir où elle est utilisée (certains logiciels le font, comme DBArtisan, mais…c’est pas toujours rapide).

    Allez, on attaque de suite une requête un peu plus complexe.

    SELECT 
        cols.name   as Column_name,
        types.name  as Type,
        cols.length as Length,
        cols.prec   as Prec,
        cols.scale  as Scale,
        CASE WHEN cols.status = 8 THEN 1
        ELSE 0 END  as Nulls,
        CASE WHEN cols.status = 128 THEN 1
        ELSE 0 END  as 'Identity'
    FROM sysobjects obj
    INNER JOIN syscolumns cols
        ON cols.id = obj.id
    INNER JOIN systypes types
        ON types.usertype = cols.usertype
    WHERE obj.type = 'S'
    AND obj.name = 'sysobjects'
    ORDER BY cols.colid
    

    Ça ressemble à un sp_help, non ? C’est le but.
    Le champ status est un peu particulier, il fait penser au enum flag

    • Bits 0–2 (valeur 1, 2, et 4) – indique si la colonne utilise un type binaire. Si la colonne utilise le type text/image, les bits 0 et 1 indique le statut de réplication :
      • 01 = toujours
      • 10 = si changement
      • 00 = jamais
    • Bit 3 ( valeur 8) – indique que la valeur peut être NULL.
    • Bit 4 ( valeur 16) – indique s’il existe plus de une contrainte pour cette colonne.
    • Bits 5 and 6 – utilisées en interne.
    • Bit 7 ( valeur 128) – indicates an identity column.

    D’autres petites choses utiles ?

    • sp_help : affiche un descriptif complet de l’élément passé en paramètre (table, procédure…).
    • sp_pkeys : affiche des informations sur les clefs d’une table.
    • sp_helpindex : affiche des informations sur les index d’une table.
    • sp_spaceused : affiche des informations concernant l’espace utilisé par une table.
    • sp_spaceused : utilisé sans paramètre, donne les informations concernant l’espace utilisé par la base de données courante (peut être un peu long).
    • sp_who [user] : permet d’avoir les utilisateurs connectés et ce qu’ils font, passer l’utilisateur en paramètre permet de filtrer dessus.
    • sp_displaylogin : permet d’obtenir des informations complètes sur l’utilisateur courante.
    • SELECT suser_name() : retourne l’utilisateur courant.
    • SELECT db_name() : retourne le nom de la base courante.

     
    Voilà, ce sont de petites choses, un début. Mais ça peut fournir des pistes utiles pour des requêtes plus complexes et plus utiles 🙂

Catégories :ASE, SGBDR