mercredi 15 octobre 2008

SQL Server Training (Jour 1)

Petite semaine de cours intensif en SQL Server 2005 chez U2U.
Au programme, le cours "Implementing a Microsoft SQL Server 2005 Database".
Le cours est très interessant, même pour un développeur expérimenté.
Il y a déjà a tellement raconter que je ne prendrais pas le temps de me relire avant la publication (soyez donc indulgents).
Que retenir de cette première journée:

OLAP et OLTP
Les bases de données peuvent être exploitées pour des applications OLTP (Online Transaction Processing) ou OLAP (Online Analytic Processing).
En fonctionnement OLTP les operations sont optimisées pour le traitement sécurisé d'un grand nombre de transactions.
OLTP met en place les systèmes de locking utilisés de façon intensives afin d'assurer l'intégrité des transactions.
C'est typiquement le cas des systèmes marchands ou des données sont fréquements ajoutées et/ou modifiées.
Les opérations sur une base de données OLTP sont généralement très courtes mais nécessite une grande réactivité.

Par contre, il est également possible d'exploiter une base de donnée en OLAP (Online Analytic Processing).
Le but de ce mode d'exploitation des informations est de fournir des réponses rapidement.
OLAP est indiqué pour la génération de rapports ou de longues requêtes brassent beaucoup d'informations.

Une erreur commune est de faire du reporting sur des bases de données OLTP.
En effet, les rapports executent des query qui prennent beaucoup de temps tout en maintenant des locks en lectures très étendus.
Le reporting n'est donc pas une opération à prévoir sur des bases de données de production au risque de bloquer (ou ralentir significativement) le traitement des transactions.
Pour éviter ce problème, il faut considérer:
  1. Le miroring / DBRestore sur serveur de reporting.
  2. La réplication
  3. Le database snapshot.
Database Snapshot
Le database snapshot est une operation (disponible uniquement sur l'édition enterprise) permettant de faire une copie quasi instantanée d'une DB (même pour une DB de 8 Go).
Ce processus est relativement léger car il ne copie pas "vraiment" la DB de production. Au contraire, lorsque la DB de production est mise-à-jour, seule les  pages modifiées sont copiées (avant modification) dans la DB Snapshot (Copy-On-Write).
Une base de donnée Snapshot est read-only et n'a donc pas besoin de gérer des locks. Les DB Snapshots sont donc des victimes idéales pour des processus de reporting.

Modèle de gestion du Log file
Le modèle "Simple" fait une troncation du Log File dès que possible (idéal pour les environnement de développements).
Le modèle "Full" enregistre de nombreuses informations de transactions dans le transaction Log. Cela permet en autre de garantir un rollback ou restauration de DB a presque n'importe quel point dans le temps.
Ce modèle représente un grand désavantage losrque de larges opérations bulk-insert (insertion de records en lot) ou d'effacement de records prennent places.
En effet, dans ce cas, le log file est littéralement congestionné et grandit rapidement.
Le nouveau model "Bulk-Logged" est un équivalent du mode "full" ou l'enregistrement des opérations dans le log sont sommaire lors d'operations bulk. Dans ce cas, il ne sera possible de restorer l'état de la DB que juste avant (ou juste après) de telles opérations.

Checksum et Torn Page Detection
SQL serveur ne fait pas confiance au disque dur lorsque les informations sont écrites. Les erreurs d'écritures ne sont généralement pas détectée durant cette opération. Le disque dur, peut même ne pas savoir que l'information écrite n'est pas correcte si l'information est corrompue en amont par le matériel.
Pour s'assurer de la fiabilité des informations, SQL server stocke un checksum pour chaque data page. Lors de la lecture le checksum est comparé à celui recalculé sur la page chargée, les données sont corrompues s'ils ne correspondent pas.

Lors d'une migration depuis SQL 7, il est important de savoir que la vérification par checksum n'est pas activée. L'ancienne méthode de vérification (TORN_PAGE_DETECTION) est toujours active même si elle est moins fiable.

Type de donnée
Voici quelques précision relatif au nouveaux types de données (et certains types déjà connus).
Table: Les tables (ou RowSet) sont aussi des types de données. Il est possible de faire des query sur le résultat d'un ou plusieurs autres query.
GUID: Le type GUID permet d'assigner une valeur GUID réputée unique (worldwide unique value).
La fonction sql newGuid() permet d'obtenir un nouvel GUID.
Ce qu'il y a de nouveau, c'est la fonction newSequentialGuid() qui permet de générer des GUID sequentielles... franchement utile lorsque des records doivent être ordonnés.
NVarchar: Utilise 2 bytes pour stocker la longueur de la chaine de caractère.
C'est donc une erreur d'écrire Varchar(1) pour espérer gagner de la place.
TimeStamp: Assigne une valeur unique (dans la DB) au champs lorsqu'un record est ajouté ou modifier. Ce type de donnée est utilisé pour s'assurer que le record n'a pas été modifié depuis la dernière lecture (Ado en fait un usage intensif).
Xml: Permet de stocker nativement du contenu XML. Ce type de donnée permet en autre d'exécuter des methods manipulant l'information. Il est également possible de transformer des données XML en rowset (et inversement).

Schema
Une modification très importante depuis SQL2000 sont les schémas. et représente un virement à 180 degré d'une fonctionalité/syntaxe déja existante (dbo.tablename).
Contrairement à ma première idée, les schémas en SQL2005 n'ont rien à avoir avec les schéma graphique de DB.
Les schemas permettent de regrouper les objects SQL (table, stored proc, etc) de façon logique. C'est un peu comme des groupes ou des domaines.
Les schemas sont définis à l'aide d'instruction appropriée et doivent être référencés dans les divers objects aussi bien lors d'operations de création que d'écritures.
Par exemple, dans le schéma "Person", il serait opportun de créer les tables contactInfo, Address, PersonInfo, Affiliation, etc.
L'identification correct de la table se fait en la préfixant avec le schema adéquat.
Par exemple:
  select * from Person.PersonInfo
Ce qu'il est important de savoir, c'est que l'utilisation les schémas sont obligatoires!!!

L'utilisation des schemas permet en autre de grandement faciliter la gestion de la sécurité... puisque les droits d'accès peuvent être liés au schémas.
Il est aussi utile de noter que chaque utilisateur SQL dispose d'une configuration "default schéma" qui sera automatiquement utilisé pour les requêtes SQL ne précisant pas de schéma.

Attention à la migration des bases de données:
Pour des raisons de compatibilités ascendante, le schéma "dbo" (db owner) existe en SQL 2005 et est maintenu.
Ce dernier, totalement obsolète, ne devrait pas être utilisé pour la création de nouvelles bases de données.
Cependant, le schéma "dbo" existe pour faciliter la migration de DB plus anciennes.
Ainsi, lors d'une migration, les tables sont migrées en utilisant le schéma "dbo".
Lors des requêtes SQL d'anciennes applications (select * from PersonInfo), SQL server essaye d'abord de résoudre le nom de la table dans le "default schema" configuré  pour l'utilisateur. Si ce dernier n'existe pas, alors une tentative est faite sur le schéma "dbo".
Pour les anciennes application n'utilisant pas les schémas dans la notation SQL, il est facile de constater qu'une surcharge de traitement est nécessaire pour obtenir les même données.
Note: En raison de l'utilisation de "dbo", Une assignation arbitraire du "default schema" de l'utilisateur SQL peut avoir des conséquences catastrophiques pour des applications migrées.

Partitioning large table
Lorsqu'une large table content des données devenues "read-only" par l'usage ou tellement vieilles, il convient de partitionner la table (et les indexs liés).
Cela permet à SQL server de focaliser l'activité et usage du cache sur la partition active de la table (nb: les indexes sont partitionnés avec la table).
Le but de la partition est de garder une partie active de taille raisonnable... et donc performante.
Les partitions plus anciennes totalement inactive en écriture peuvent être stockées sur des file group read-only (et peuvent par conséquent être stockés sur des disques compressés) limitant l'implication de locks.
Finalement, la partition à l'avantage de stopper le "lock escalation". Ainsi, la lecture de vieille données n'engendrera pas de read-lock sur la partition active.
Il va de soit que l'accès aux différentes partitions est totalement transparente.

File-Groups et Log File
Il est possible de créer differents File-Group pour y stocker une partie des tables (ou des indexes).
Les file-groups permettent de répartir les tables dans différents fichiers et sur différents disques. Cela permet d'optimiser les performances des tables les plus sollicitées en les placants sur des disques rapides (évitant ainsi de pénaliser les applications transactionelles).
Les file-groups peuvent également êtres marqués comme Read-Only. C'est d'ailleurs conseillé pour les tables (ou partitions de tables) n'étant plus modifiées. Cela permet à Sql Server de ne plus avoir à gérer les locks et permet à l'administrateur de placer le file-group sur un lecteur compressé (seul cas d'utilisation toléré).
Note 2: Le stockage de File-Group read-only sur des lecteurs compressés peut devenir interessant lorsque les parties "inactives" contiennent des millions de records.


Par ailleurs, il est conseilé de stocker le Log file sur un disque séparé (et rapide).
Cela limite la surcharge IO qui devrait être partagé entre le stockage des données et celui du Log File lorsqu'un seul disque est utilisé (Disk Head Overheat situation).

Performances
Pour préserver les performances:
  1. Eviter l'usage de curseur si le code peut être écrit en SQL relationnel. L'exécution des curseurs est jusque 30 fois plus lent.
  2. Eviter l'utilisation des tables temporaires là ou cela est possible. Les tables temporaires ne sont pas optimisée pour la performance et consomment de la mémoire.
  3. Garder le "Page Hit Ratio" a l'oeil. Il indique le nombre de fois que SQL server va directement retrouver l'information nécessaire depuis sa mémoire cache. Si le hit ratio tombe en dessous de 95%, il faut agir.

samedi 11 octobre 2008

Sync Framework

Sync Framework de Microsoft permet de développer plus facilement des fonctionnalités de synchronisation au sein d'applications.
Ce framework permet en autre de faire du caching pour les applications destinées à fonctionner tout aussi bien online qu'offline.
Sync Framework permet de transformer une application locale en application distribuée.
Pour plus d'information, voir les liens ci-dessous.

Liens utiles:
  • Syn Framework sur le site de Microsoft.
    Cette page contient quelques vidéos intéressantes.
  • SyncToy V2.0 est un outil Microsoft utilisant la technologie du Sync Framework.

vendredi 10 octobre 2008

XML Notepad

XML Notepad 2007
XML Notepad est un outil d'édition XML distribué gratuitement par Microsoft.
XML notepad est décrit sur cet article de MSDN.
Simple éditeur XML disponible ici.

Outils XML
Le site MSDN de Microsoft propose aussi d'autres outils ici.
On y trouvera par exemple:
  • XML Diff
  • XML Schema Definition Tool
  • XSD Sample Code Generator (XSDObjectgen)

mercredi 8 octobre 2008

Mono 2.0

Voila que j'apprends que Mono 2.0 vient d'être délivré.
Parmis les plus grandes avancées de cette version, il y a:
  • L'arrivée tant attendue d'un débugger.
  • Le support de C#3.0 avec LINQ to Objects LINQ to XML.
  • Un compilateur Visual Basic 8
L'éco-système Mono s'agrandit de plus en plus.
En plus d'être un moteur de script dans Second Life, Mono est également inclus dans des produits tel que des lecteurs MP3 (voir ici l'initiative de SanDisk), sur la console de jeu Nintendo Wii ou encore sur iPhone d'Apple.
Pour encore plus d'application, allez donc visiter cette page reprenant des capture d'écrans d'applications GTK#, WinForm, Asp.Net (et autre) fonctionnant sous Mono.

Moins tape à l'oeil que l'intégration d'un débuggeur, l'environnement Mono 2 débarque avec une série de caractéristique non négligeable. A savoir:
  • Le support d'autres compilateurs:

    • IronPython de Microsoft.
    • Phalanger (PHP fonctionnant sous CLI)
    • IronRuby de Microsoft.
    • Eiffel ISE
    • Microsoft C#, F# et VB.NET
    • RemObject d'Oxygene (Pascal Objet pour .Net qui supporte les Generics, Class Contrcts, Queries, etc)
  • Les API.Net

    • Support du Core 2.0, System.Core (v3.5)
    • System & System.Xml
    • System.Drawing
    • System.Web.Services & System.DirectoryServuces
    • Windows.Forms 2.0 (en utilisant des drivers W32, OSX, X11 unix).
    • ASP.NET 2.0 (Core, Ajax)
    • Intégration Apache et Fast CGI
    • Ado.Net 2.0 pour SQL server mais également pour d'autres base de données.
Enfin, pour les vraiment curieux, il y a des APIs et greffons spécifiques à Mono:
  • Mono.Cairo une interface de programmation pour rendu graphique en 2D
  • Mono.Cecil une interface de programmation permettant de charger et manipuler des assemblies binaires.
    Avec Mono.Cecil, il est possible de naviguer dans tous les types d'un assembly, de les modifiers instantanément et sauver l'assembly modifiée sur le disque.
    Mono.Cecil va beaucoup plus loin que  Reflection & Reflection.Emit, c'est grâce à Mono.Cecil que le débugger de MonoDevelop pu être développé.
  • Xml.Relaxng
  • Bit# une librairie client.server Bittorent.
  • Mono.Fuse pour manipuler des systèmes de fichiers dans l'espace utilisateur.
  • Tao Framework - OpenGL, OpenAL, SDL and Cg
Pour finir, voici quelques liens:


Note 1: Concernant l'intégration de Mono dans l'iPhone et la Wii, cette intégration se fait via le moteur de jeu Unity 3D lui même basé sur Mono. Un petit coup d'oeil sur Unity 3D ne vous laissera pas de glace.
Note 2:  Cette nouvelle release de mono est également l'occasion de prendre connaissance de deux nouveaux environnements de développement .Net sous Unix. Même s'ils sont payant, c'est néanmoins intéressant. Mon article à ce sujet sera donc mis-à-jour.

Liens utiles pour Ubuntu

Voici quelques logiciels plus ou moins utiles pour Ubuntu.
Traitement audio
  • xcfa: X Convert File Audio est un outil d'extraction audio (permet même d'extraire des pistes audio de DVD).
    Lien vers un article décrivant comment installer XCFA sur Ubuntu et un autre vers le site officiel.
  • Shorten: Format de compression sans perte.
  • Musepack: encodeur, ne peut différencier la copie du fichier original (échantillonnage entre 160 et 180 kb/s).
Plus d'info ici sur Linux on the root

Gestion système
  • PartImage: Sauvegarde système avec PartImage (article).
  • lfpt: Synchroniser facilement un répertoire local et un site ftp (ici)

mardi 7 octobre 2008

Machines virtuelles

Une machine virtuelle est une machine abstraite simulée au sein d'une autre machine (l'hôte) bien réelle celle-là.
La machine virtuelle est utilisée comme environnement d'exécution pour un système d'exploitation quelconque (Windows XP, Vista, Linux, etc) ou pour un langage de haut niveau (Java).
Les machines virtuelles sont isolées les unes des autres mais également isolés de l'hôte.
Les systèmes d'exploitation fonctionnant sur des machines virtuelles croient se trouver sur des machines réelles avec un vrai disque dur, une vraie carte graphique, des vrais périphériques, etc.
C'est l'hôte qui émule tous ces périphériques à l'aide d'un logiciel adéquat (appelé logiciel de virtualisation).
Il faut savoir que rien ne distincte une machine virtuelle d'une machine réelle.
La machine virtuelle:
  • Démarre comme une machine réelle avec les beeps, le boot, etc (sauf qu'elle démarre pour l'utilisateur depuis l'hôte).
  • Doit avoir un système d'exploitation qu'il faut installer comme sur une machine normale (et pour lequel il faut évidemment posséder la licence pour l'installer).
  • Peut accéder aux réseaux... et naviguer sur internet.
  • Peut être infectée par des virus... comme n'importe quelle machine.
  • Peut également crasher.
  • Sont forcement plus lente que des machines réelle (même si les performances restent bonnes). 
Le tutoriel de 01Net explique quelques avantages et cas d'utilisations de machines virtuelles.

Virtual PC 2007
Pour des raisons de formations chez U2U, je dois installer Microsoft Virtual PC  2007 sur mon PC.
Virtual PC 2007 est l'alternative gratuite  de Microsoft permettant de faire fonctionner des machines virtuelles.

Voici quelques liens utiles concernant Virtual PC 2007:
  • Téléchargement de Virtual PC 2007 via 01Net (+/- 30Mb).
  • Tutoriel d'installation sur 01Net.
    Ce article contient également quelques conseils pour améliorer les performances de la machine viruelle.
Wmware
Quelques autres liens concernant Wmware, un autre outil de virtualisation gratuit avec lequel je suis beaucoup plus famillier.
A noter que Wmware fonctionne également sous Ubuntu.
  • Wmware sur wikipedia (en français).
    Cet article énumère les differentes solutions Wmware.
  • Le site officiel

lundi 6 octobre 2008

Regular expression

Les expressions régulières sont des expressions avec une syntaxe particulière.
Cette dernière syntaxe permet de décrire des masques/modèles de correspondance.

Dans l'exemple suivant, je dois supprimer les caractères [ et ] pour obtenir un colonne de chiffre.
Ce qui n'est pas visible dans l'exemple, c'est que chaque ligne se termine avec un caractère d'espacement inhabituel (un non-breakable space ou encore nbsp).
Il est difficile de remplacer ce caractère dans un éditeur de texte standard avec un outil de remplacement.
En effet, ce caractère nbsp ne correspond pas à la barre d'espacement du clavier.

Planned
[27]
[460]
[27]
[2]
[9]
[13]
[22]
[4] 
....

C'est ici qu'intervient la regular expressions.
Avec l'expression \D, il est possible de matcher tous les caractères non numérique.
PSPad est un super éditeur de texte qui permet, en autre, le remplacement de texte sur base d'une regular expression.
Un simple remplacement de \D par rien à résolu mon problème.