mercredi 21 mars 2012

Gestionnaire de Version sous Windows

Aujourd'hui, je cherchais un gestionnaire de version sous Windows, libre de préférence.
Je n'ai pas de grands besoins, juste celui de pouvoir revenir en arrière sur un développement en Clipper sous Win7 64 bit.

Je n'ai donc pas besoin d'un canon pour tuer une mouche.


Bien malheureusement, il m'a fallut presque une demi-journée pour trouver un produit approprié à mes besoins tout en restant simple d'emploi (et mise en œuvre facile).

C'est qu'en fin de compte, entre produit inutilisable, usine à gaz et soft devenu payant, il ne reste plus grand chose de praticable (facile à prendre en mains et prêt à l'emploi en quelques minutes).

J'ai fini par trouver mon bonheur dans le couple Tortoise + SubVersion (pour Windows).
Avec un excellent manuel de mise en place disponible sur Developpez.Com (merci Eric Reboisson!)

Besoin d'une solution de gestion de version pour vos codes sources, commencez par cette option.

mardi 20 mars 2012

Retourner plusieurs valeurs depuis une fonction - retourner un @HashTable

Introduction
Ce n'est pas la première fois que j'essaye de retourner un HashTable ou un Array dans une fonction.
Et à chaque fois, je n'arrive pas à retrouver le contenu et les méthodes de l'objet.

Je dois avouer être resté circonspect face à ce problème en me demandant pourquoi PowerShell modifiait mon typage au point de ne pas pouvoir récupérer un HashTable via une fonction.

La réponse réside dans le fait qu'une fonction sait retourner plusieurs résultats!
Et que ces résultats peuvent être compilés dans un Array!

Retourner plusieurs résultats dans une fonction
Voici un petit bout de code issu du blog de Matrin Zugec.
La fonction retourne simplement plusieurs valeurs.
Function Get-MultiValue () {
  [hashtable]$Return = @{}
  $Return.Success = $True
  $Return.PercentComplete = 100
  $Return.ReturnTime = $(Get-Date)
  $Return.Username = "Martin Zugec"
  Return $Return
}

L'appel et la réutilisation des valeurs se font comme suit:
$Var = Get-MultiValue
If ($Var.Success) {
  $Var.UserName
  $Var.ReturnTime
}

Super comme truc!

Retourner plusieurs résultats, un comportement par défaut des fonctions
C'est en parcourant ce code et en essayant de le comprendre (en relation avec cet article de Stack-Overflow) que je comprends que le comportement par défaut d'une fonction est de retourner plusieurs valeurs.
Ainsi donc, lorsque qu'une commande affiche quelque-chose à l'écran (par exemple Write-Output) ou que la fonction évalue un objet (par son appel direct, ce qui provoque généralement son affichage), ces derniers éléments sont considérés comme des résultats de la fonction. Ces résultats accompagnerons aussi la valeur retournée avec la commande return.

Ca a l'air compliqué comme ça mais si vous rencontrez des problèmes, pensez simplement à tester la longueur de la variable et a éventuellement itérer le table qu'elle pourrait contenir contient.

En exemple pratique, voici la fonction loadShrWsArticles qui charge le contenu d'un fichier de donnée dans un HashTable.
Cette fonction est censée retourner le HashTable. La HashTable stocke une liste d'objets créés à l'aide de la  fonction CreateShrWsArticleDic (cette dernière crée des dictionnaire d'objet).

L'intérêt réside surtout dans l'utilisation de la fonction (décrite plus bas)

function CreateShrWsArticleDic{
 return @{ "artCode" = ""; "artEan" = ""; "artLabel" = ""; "CBStatus"="" } 
    # Source = File WSys/OutData/WSys-Articles-shrink.dat 
    #    26070-10      -> artCode
    #    8712734085995 -> artEan
    #    4 POLES MALES -> artLabel
    #    0             -> CB Status code
    #    OK            -> CB Status (as text)
    
}

# ------------------------------
#   Load the WSys-Articles-shrink.dat
# ------------------------------
# Returns a dictionnary of ShrWsArticles objects
#
function loadShrWsArticles {
    $sFilename = "C:\Dev\GGTools\WSys\OutData\WSys-Articles-shrink.dat"
    write-progress -activity $("Loading " + (split-path $sfilename -Leaf) ) -status "Openning file" -percentcomplete 0
    Write-Output $("Loading "+$sfilename)
    $hashArticles = @{} # HashTable to store the objects
    $f = Get-Content -Encoding String $sFilename
    # $f[0] -> SourceFile : xxx
    # $f[1] -> CreationDate : yyyyMMdd hh-mm-ss
    $iMax = $f.Length
    $iPos = 2
    while( $iPos -lt $iMax ) {
        # Write Status
     if ( ($iPos % 25) -eq 0 ) {
            write-progress -activity $("Loading " + (split-path $sfilename -Leaf) ) -status ("Progression :"+$iPos+"/"+$iMax ) -percentcomplete $([Math]::Round($iPos/$iMax*100))
     }        
     $a = CreateShrWsArticleDic
     $a.artCode = $f[$iPos]
     $a.artEan = $f[$iPos+1] 
     $a.artLabel = $f[$iPos+2]
        $a.CBStatus = $f[$iPos+3]
        # $a.CBStatusText = $f[$iPos+4]
        
     # Next record 
     $iPos = $iPos + 5
     
     # Add to Hash Table (used simplified key)
        [string]$key = $a.artCode 
        $key = $key.Replace( " ", "" ).Replace( ",", "." ).ToUpper() 
        
     if( $hashArticles.ContainsKey( $key ) ){
      Write-Host "  loadShrWsArticles - hashArticles " $a.artCode " already registered"      
     }
     else {
      $hashArticles.Add( $key, $a )
     }
    }
    write-progress -activity $("Loading " + (split-path $sfilename -Leaf) ) -status "Loaded!" -completed
    Write-Output $("   " +$hashArticles.Count +" items loaded")
    
    return $hashArticles
}

En faisant l'appel
$test = loadShrWsArticles
Je m'attendais à pouvoir retrouver un des éléments de mon dictionnaire.
La ligne $test.Item("B1061403-50").artCode devait logiquement fournir un résultat.
Et pourtant, je reçois obstinément l'erreur:
L'appel de la méthode a échoué parce que [System.Object[]] ne contient pas de méthode nommée « Item ».
Au niveau de ligne : 1 Caractère : 11
+ $test.Item <<<< ("B1061403-50").artCode
    + CategoryInfo          : InvalidOperation: (Item:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Les choses deviennent claires lorsque l'on comprends que la fonction a retourné un tableau!
Mon HashTable est un des éléments de ce tableau.
> $test.Length
retourne 3, il y a 3 éléments dans mon résultat (en vérifiant chacun d'eux, je retrouve mon HashTable)

> $test[0]
Loading C:\Dev\GGTools\WSys\OutData\WSys-Articles-shrink.dat

> $test[1]
   1916 items loaded

> $test[2]
 Name                           Value                                                                                                                                                                                   
----                           -----                                                                                                                                                                                   
BF632/10A-100                  {artCode, artLabel, artEan, CBStatus}                                                                                                                                                   
MWP6-10                        {artCode, artLabel, artEan, CBStatus}                                                                                                                                                   
1000AROUGE                     {artCode, artLabel, artEan, CBStatus}   
...
...


J'ai retrouvé mon HashTable à la deuxième position du tableau!
Notez que les instructions Write-Output exécutés dans la fonction  font également partie du résultat de la fonction.Je vais enfin pouvoir retrouver mes objets :-) YES!!!

> $monHash = $test[2]
> $monHash.Item("B1061403-50").artCode

 B1061403-50

Cette fois-ci, plus d'erreur :-)

jeudi 8 mars 2012

Imprimante HP cm1415fn et Ubuntu

Parce qu'une telle information est toujours utile à partager avec des Linuxiens.

J'ai fais l'acquisition d'une imprimante Laser Couleur HP cm1415fn pour l'utiliser sur le réseau domestique (uniquement des machines Ubuntu 10.10).
Là encore, HP fait la différence avec ses concurrent.
En 10 minutes, elle fonctionnait sur notre petit réseau maison.

Ce qui a de génial, c'est que cette imprimante dispose d'une interface réseau... (donc pas besoin de l'attacher à une machine et d'avoir impérativement ce PC en route pour faire des impressions :-)
J'ai configurer l'imprimante en IP Fixe (par exemple 192.168.1.205) avec une adresse n'interférant pas avec le DHCP du routeur Belgacom (il dépasse rarement 192.168.1.15).

L'utilisation en IP fixe est bien pratique pour l'installation de l'imprimante sur les autres PC Ubuntu.
Il suffit de connaître l'IP de l'imprimante et cela devient un vrai jeu d'enfant :-)
Utiliser une IP Fixe pour l'imprimante
simplifie son installation sous Ubuntu
 

Il faut juste savoir qu'il faut sélectionner le modèle "Color LasetJet cp1514n" (oui, 1514!) pour l'installation du pilote.

Une particularité intéressante de cette imprimante est qu'elle dispose d'une cartouche noir. Il est donc possible de faire des impressions noir et blanc sans consommer les toners couleurs. Pratique pour faire des économies :-)
Il faut juste penser à demander une impression en dégradé de gris (volet "avancé" dans la boîte de dialogue des impressions).
Pouvoir imprimer en dégrader de gris permet
d'économiser les toners couleurs
Je ne me suis pas attardé sur les fonctionnalités de scanning, certains articles laisseraient à penser que cela ne fonctionne pas (à vous de voir si ce modèle vous intéresse). 

mercredi 29 février 2012

Un wizard en ligne pour définir les bordures de tables HTML

C'est toujours lorsque l'on s'y attend le moins que l'on trouve les meilleurs outils.
Voici "HTML and CSS Table Border Style Wizard", un petit outil Javascript qui vous permet de manipuler facilement le style CSS des tables HTML. Avec une pré-visualisation & un
Encore un outil en or.

mardi 28 février 2012

Alignement des DIV dans une page HTML

Qui à déjà fait un peu de développement HTML sait qu'aligner des DIV dans un container se transforme souvent en foire d'empoigne.
Je vous propose la lecture de l'article "Creating a CSS Based Fixed Page Layout - Part1" qui propose une approche vraiment pragmatique à l'aide d'un exemple.
Source: l'article mentionné

C'est tellement mieux qu'une longue dissertation sur les attributs et propriétés de DIV.

Déterminer le type d'encodage d'un fichier en PowerShell

Si vous avez besoin de déterminer le type d'encodage d'un fichier mais que vous ne savez pas comment faire, je vous recommande la lecture de l'article "Powershell get encoding file type" de Franck RICHARD (anglais).

Son script "Get-FileEncoding.ps1" est vraiment très complet et peu s'avérer vraiment pratique.
Encore une petite merveille :-)

samedi 25 février 2012

Lancement de MCHobby - vente de kit et matériel Arduino en Belgique

Il y a un an, j'ai découvert la plateforme de prototypage électronique Arduino.
Avec du recul, Arduino est une plateforme idéale pour hobbyiste, elle ne réclame pas de connaissances poussées en électronique et en programmation.

J'ai commencé par le kit d'exploration ARDX et je dois bien le reconnaître, j'y ai pris un plaisir monstre (et c'est peu dire). C'est un kit de prise en main parfait (un article paraîtra bientôt à ce sujet sur une version française du kit).

Un an plus tard, je décide d'ouvrir un WebShop Francophone pour distribuer du Matériel Arduino en Belgique (et pays voisins).
C'est ainsi qu'est né Microcontrôleur Hobby (alias MC Hobby).
MC Hobby, vente de kit et matériel pour Arduino



Dans toutes mes tribulations Arduino, j'ai rencontré d'excellents produits et une communauté francophone très actives. Malheureusement, cet univers pêche par un gros défaut, ses fournisseurs sont principalement anglophones.
En conséquence, les produits sont peu traduits (voire pas du tout) et les achats intéressants doivent se faire à l'étranger (Pays-Bas, Etats-Unis, Grande-Bretagne, Chine, voire Japon) dans la langue de Shakespeare. 

Pour palier à cette situation, j'ai décidé de lancer un WebShop francophone distribuant des produits traduits et des documentations traduites (dans les limites de mes capacités humaines).

Mon premier objectif fut la traduction de l'ARDX d'AdaFruit (kit vendu sur MC Hobby). Accompagné de quelques autres produits, j'ai donc ouvert MC Hobby, un WebShop Francophone principalement destiné à la Belgique mais aussi aux pays environnants comme la France, le Luxembourg, la Suisse, etc.

Mon deuxième objectif est de mettre en place un Wiki pour supporter la traduction des tutoriels et instructions de montages des autres produits mis en ventes sur MC Hobby. J'ai d'ores et déjà décidé de consacrer 3 heures de traductions tous les mercredi car je reste convaincu que c'est essentiel pour promouvoir la plateforme Arduino.

La politique de MC Hobby c'est la transparence

MC Hobby ne se cache pas derrière un nom de domaine et une adresse e-mail.
Des conditions de ventes, de livraisons sont mises à votre disposition mais c'est  surtout les mentions légales qui sont importantes pour établir une relation de transparence entre le client et le vendeur.
Ces mentions légales sont obligatoires et reprennent toutes les informations d'identification de MC Hobby.
Bref, tout ce qu'il faut pour commencer une vraie relation de confiance. 

Votre avis compte, il est primordial!
MC Hobby démarre et dispose de quelques produits. J'ai pourtant l'intention d'en faire un WebShop où le hobbyiste pourra trouver tout ce dont il a besoin pour effectuer ses montages (y compris le matériel électronique de base) au prix le plus juste (car je suis aussi un hobbyiste :-) ).
J'ai donc du pain sur la planche et les meilleurs produits seront ceux dont vous aurez besoin. N'hésitez donc pas à m'envoyer vos suggestions sur info@mchobby.be
Vos avis et suggestions sont primordiaux, cela me permet de concentrer mon énergie sur vos besoins et d'en préserver un maximum pour investir dans les traductions. Qu'en pensez-vous?

Par où poursuivre l'effort traduction?

En sus d'ajouter de nouveaux produits au WebShop, un long travail m'attends encore sur les produits existants.
Il me faut encore traduire les tutoriels et notes de montages des autres produits proposés.
La question que je me pose, c'est "par quel produit et quel tutoriel commencer"?
Auriez-vous un avis en tant que client potentiel ?
Cet avis là compte aussi pour moi.

MC Hobby est une Entreprise Open-Source
Un des points vraiment important de la réalisation du projet MC Hobby était sa concrétisation résolument orientée Open-Source. Tout le processus de création de MC Hobby (inclus Web, WebShop, produits, traductions, documentation, système d'exploitation, traitement de texte, traitement d'image, etc) ne repose que sur des éléments Open-Source.
Il est donc possible, aujourd'hui, de concevoir une entreprise sans faire appel à des logiciels propriétaires.

L'hébergement de MC Hobby
MC Hobby est actuellement hébergé sur un Web Farm chez OVH.
Si le démarrage est trop populaire, il est possible que vous rencontriez des problèmes pour y accéder. Merci de m'en tenir informé (info @ mchobby.be)... dans l'attente de vos réactions, je planifie déjà l'utilisation d'un serveur dédicacé. Merci pour votre patiente.