mercredi 23 septembre 2009

Class information et héritage en Pyhton

Définir une class en Python est relativement simple.
Créer un objet a partir d'une classe est tout aussi simple.

>>> class myClass:
    def printHello(self):
        print('Hello world')
>>> myObj = myClass()
>>> myObj.printHello()
Hello world

Par contre, lorsque l'on dispose d'une référence sur un objet, l'utilisation de la fonction type(monObjet) indique que l'objet est une instance d'une classe... mais n'indique pas laquelle!
La fonction dir(monObjet) énumère les attribus de l'élément passé en paramètre. Encore une fois, cela n'indique pas quelle est la classe.
La fonction help(monObjet) fournit la liste des méthodes et bien entendu la classe mais son utilisation est principalement cantonné au mode interactif.

Pour extraire le nom de la classe (et d'autres informations) avec du code, l'on utilise alors les class-types.
Ainsi, l'utilisation de monObjet.__class__.__name__ fournira le résultat attendu.

>>> class Car:
    def WhoAmI( self ):
        print( 'my information are %s ' % (dir(self)) )
        print( 'my Type is %s ' % (type(self)) )
        print( 'my Class is %s ' % (self.__class__) )
        print( 'my Module is %s ' % (self.__class__.__module__) )
        print( 'my ClassName is %s ' % (self.__class__.__name__ ) )
>>> myCar = Car()
>>> myCar.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__'] 
my Type is <type instance>
my Class is __main__.Car 
my Module is __main__ 
my ClassName is Car 

Juste pour le plaisir de l'excercice académique, Python permet de recrée très facilement une autre instance d'une classe à partir d'une référence vers objet de cette dite classe.
>>> class Car:
    carInfo = 'This is a car'
    def printCarInfo( self ):
        print( 'carInfo = %s' % (self.carInfo))
    def WhoAmI( self ):
        print( 'my information are %s ' % (dir(self)) )
        print( 'my Type is %s ' % (type(self)) )
        print( 'my Class is %s ' % (self.__class__) )
        print( 'my Module is %s ' % (self.__class__.__module__) )
        print( 'my ClassName is %s ' % (self.__class__.__name__ ) )
>>> myCar = Car()
>>> # Utiliser une reference d objet pour recréer un autre objet de la même classe
>>> # ... juste pour le plaisir de le faire
>>> myCar2 = myCar.__class__()
>>> myCar2.carInfo = 'Anohter instance of Car object'
>>> myCar2.printCarInfo()
carInfo = Anohter instance of Car object
>>> myCar.printCarInfo()
carInfo = This is a car
>>> myCar2.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__', 'carInfo', 'printCarInfo'] 
my Type is <type instance> 
my Class is __main__.Car 
my Module is __main__ 
my ClassName is Car 

Voici quelques lignes de codes permettant de jouer un peu avec l'héritage en Python.
Pour rappel, Pyhton supporte l'héritage multiple (même si son utilisation n'est pas recommandée).
>>> class TurboCar(Car):
    carInfo = 'This is a *** TURBO *** car'
    def WhoAmI( self ):
        Car.WhoAmI(self) # call ancestor
        print( 'my bases classes are %s' % (self.__class__.__bases__) )     
>>> myTurbo = TurboCar()
>>> myTurbo.printCarInfo()
carInfo = This is a *** TURBO *** car
>>> myTurbo.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__', 'carInfo', 'printCarInfo'] 
my Type is <type instance> 
my Class is __main__.TurboCar 
my Module is __main__ 
my ClassName is TurboCar 
my bases classes are __main__.Car 


Source: Class-type article on (An Unofficial) Python Reference Wiki

mardi 22 septembre 2009

Programmation et éléctronique - MikroElectronika

Programmation et électronique
Voici une liste des publications de Patrick Gueulle, ce dernier écrivant des ouvrages orientés programmation et électronique programmable.
Parmi les titres, l'on retrouve:
  • Composants électroniques programmables sur PC  (Dunod, 05/2005)
  • Logiciels PC pour l'électronique (Dunod, 04/2001)
  • Montages à composants programmables (Dunod, 04/2000)
  • Instrumentation virtuelle pour PC (Dunod, 05/1998)
  • Plus loin avec les cartes à puces (Dunod, 03/2004)
  • Cartes à puces - Initialisation et applications (Dunod, 08/2001)
MikroEletronika et son BIGPIC5
Je viens également de découvrir le "BIGPIC5 Development Board" de MikroElektronika.
Le genre de matériel éducatif a faire pâlir! (port RS232, USB, Display
affichage graphique + écran tactile, Display LCD, Slot pour carte mémoire SD, thermomètre digital, convertisseurs divers, horloge, pont de communication pour autre micro-controleur, affichage des états via LED, control via bouton, connecteurs IDC , etc)
MikroElektronika propose belle gamme de "Development Board", de publications et même un magazine.
Le plus surprenant a été d'apprendre que le compilateur mikroC PRO 8051 soit compilé avec Delphi!(source: The Public Delphi Wiki)
A noter qu'il existe également un microBasic et mikroPascal.

 EasyPIC5 development system - product of MikroElektronika

lundi 21 septembre 2009

Git# - Git pour .Net et Mono

Qu'est ce que GIT
GIT est libre et open source. C'est un CSV (version control system) distribué conçu pour manipuler rapidement et efficacement tous les éléments des petits et gros projets.
Git était initialement conçu et développé par Linus Torvalds pour gérer les développement du kernel Linux.
Tous les clones de GIT sont des dépôts de sources disposant d'un tracking complet des révision et de l'historique. GIT est indépendant du type de réseau ou même d'un serveur central.
Sous GIT, les opérations de branching et merging sont rapide et facile.
Git est utilisé pour controler la version des fichiers, un peu comme les font des outils comme Mercurial, Bazaar, Subversion, CVS, Perforce, and Visual SourceSafe.

Les caractéristiques clés qui distingue GIT de ses concurrents sont:
  • Support efficace des développements non-linéaire.
  • Développements distribués
  • Multi-protocole tel que HTTP, FTP, ssh, rsync, etc.
  • Gestion efficace de larges projets.
  • Pluggable merge strategy
Qu'est ce que GitSharp - Git#
GitSharp est un implémentation de Git pour la plateforme .NET et Mono. Git# a été conçu pour être entièrement compatible avec la version originale de Git.
Git# se présente donc comme une librairie légère permettant de créer des applications leurs stockage d'objets/entités dans un repository Git.
Git# peut également être utilisé pour lire et manipuler les objets/sources stockés dans un repository Git.
Git# peut être utilisé pour développer:
  • Un object database.
  • Système de fichier (distribué).
  • Système de distribution de contenu peer-to-peer.

Plus d'info sur le site de GitSharp.

jeudi 10 septembre 2009

GeoCaching - La chasse au trésor

Le but est de retrouver, à l'aide d'un récepteur GPS, des cachettes.
Pour les adultes, cela permet de visiter des endroits charmants et pour les enfants, c'est l'occasion de faire une chasse au trésor.
Les principes sont simples et l'engouement international.
La Belgique ne manque d'ailleurs pas de caches.

Allez donc faire un petit tour sur le site belge de geocaching ou admirer la carte de Belgique (cliquer sur une région pour avoir plus de détails).

Tout un chacun peut y participer à sa façon.
De la découverte de caches (lieux remarquables), de chasse au trésor pour les enfants, de création de cache et de parcours puzzle, ... tout le monde peut y trouver son plaisir.

Bonne lecture.

vendredi 4 septembre 2009

SqlServeur training - Maintaining Sql2008 database - Jour 3

Troisième jour de formation, cette journée sera orienté vers l'audit et les opérations ETL (Export-Transformation-Load).

 
Audit des modifications
Chapitre intéressant mais beaucoup trop long pour être entièrement détaillé ici.

 
Sql serveur 2005 - DDL triggers & profiler
Juste sql serveur 2005, la seule façon d'auditer les modifications est d'utiliser des triggers.
Cependant, cela ne permet pas d'auditer les lectures (par exemple qui à fait une selection sur la table des salaires)... cela imposant l'utilisation d'un modèle sécuritaire très contraignant.
Depuis SQL 2005, il existe aussi les DDL triggers qui permettent d'auditer, voir d'avorter (via un rollback) les modifications sur les schémas de DB.
Finallement, il reste encore que Profiler Sql qui permet de prendre une copie des opérations sql. Cependant Sql Profiler n'est pas un outil d'audit a proprement parlé (il peut rater des évènements) et consume des ressources de façon non négligeable.

 
Depuis Sql 2008 - Outil d'audit intégré
Il existe un outil d'audit a par entière intégré au coeur de sql 2008. Cet outil est conçu pour consommer peu de ressources et préserver les performances de sql.
Avec cet outil, il est possible de surveiller les modification de schéma, de données et même les tentatives de lecture des informations sensible. Il sera par exemple possible de savoir si des tentatives de login sql ont échoués.
Le contrôle des modifications de schéma pouvent également faire l'objet d'opérations d'audit. Toutes les opérations d'audit pouvant être stockées dans une table, un fichier ou l'event log.
En Sql 2005, ces modifications étaient auditées à l'aide Trigger DDL, un rollback permettant d'avorter la modification le cas échéant si une exigeance sécuritaire l'imposait.
En SQL Serveur 2008, la configuration et la mise en place de l'audit est beaucoup plus facile et conviviale.
Et concernant l'avortement d'opérations non autorisées, Sql serveur 2008 dispose du "policies managements", également configurable beaucoup plus facilement, imposant des contraintes strictes (avortement de l'opération) ou non (simple log de l'opération) lors de la manipulation DDL d'objets sql.

 
Pour les politiques de sécurité exigeante, il est possible de configurer le système d'audit de Sql 2008 afin qu'il empêche le démarrage du serveur SQL si l'audit ne peut accéder librement à ses ressources (par exemple: le fichier de log de l'audit).

 
Utiliser un DDL Trigger pour la DB de développement
Les développeurs modifient souvent leurs DB de développement manuellement.
S'ils ne prennent pas note de leurs modifications ou s'ils ne suivent pas à la lettre une procédure de développement; dans ce cas, retrouver toutes les modifications depuis une version donnée peut devenir un véritable casse tête.
La mises-à-jour de DB de production peut s'avérer difficile, c'est d'ailleurs un problème assez commun.
C'est là que les DDL triggers sont utiles!
En effet, si les DB de développements sont équipées de DDL triggers, il est alors possible de logger et retracer toutes les modifications faites sur le schéma de DB.

 
Importation et exportation de données
Sql serveur propose toute une série d'outils pour exporter et importer facilement des données.
Parmis ces éléments l'on retrouve:
  • bcp.exe: Bulk Copy Program est un utilitaire en ligne de commande permettant d'exporter et d'importer des données dans des fichiers textes (ou format natif) à une vitesse tout bonnement incroyable.
  • Bulk Insert T-Sql statement: une commande en TSql permettant d'importer le contenu de fichier textes directement dans une table. Très utile pour charger des données sur demande.
  • SSIS: Sql Serveur Integration Service est un service et un environnement de développement (basé sur visual studio) permettant de définir des tâches et flux de données. Cet outil est plus particulièrement destiné à l'automatisation des importation/exportation et transfertde données. SSIS fait l'objet d'une section un peu plus détaillée.
  • Sql Management Studio: Peut le savent mais lorsque l'on selectionne une DB dans management studio, il est possible de démarrer une tâche d'import/export via le popup menu. Cette action demarre un wizard permettant de sélectionner les tables à exporter et la destination (comme une feuille Excel par exemple). Ce wizard permet même de générer un package SSIS directement à partir des sélections faites dans le wizard.
SSIS - Sql Server Integration Service
Cet outil permet de concevoir des packages (à l'aide de visual studio ou le business inteligence studio de sql serveur) effectuant des tâches ETL (Extract Transform Load).
Cet outil est basé sur un gestionnaire de flux enchaînent les tâches les plus diverses (envois d'émail, manupulation de fichiers, Ftp, execution de code VB.Net, etc).
Certaines tâches pouvant être du type "Data Flow", ces dernières prenant en charge les activités ETL dans un designer spécifique.
Les opérations tâches et data flow interagissant avec le monde extérieur, SSIS utilise un module appelé "connections manager". C'est dans ce module que l'on définit toutes les connections avec le monde extérieur (mail, fichiers, connectique DB, etc).
Les différentes tâches et opérations passe systématiquement par les connections définies dans le "connections manager".
L'avantage de cette centralisation des connections est que par la suite, il sera possible d'utiliser le "configuration manager" (voir menu SSIS dans Visual Studio) pour stocker et initialiser les paramètres de ces connections depuis un fichier/table de configuration... cela facilitant grandement le déploiement des packages sur des serveurs de production.
Il est par ailleurs également possible de définir des variables au sein de SSIS.
SSIS pourrait faire l'objet d'une semaine entière de formation tellement cet outil est vaste.

 
Design of the tasks workflow.
Notice that the tasks workflow include a "Data Flow" meaning that data must be extracted from one point, transformed and stored into another location.
Data flow design of a specific "Data Flow" task
Lecture autour de SSIS
Voici une petite lecture recommendée par le formateur pour approfondir ses connaissances sur SSIS.
"Professional Microsoft Sql Serveur 2008 Integration Service" aux éditions Wrox.

Database Mail
Juste une petite note pour parler de "database mail", le remplacant de "Sql Mail".
Database mail permet de configurer des profiles e-mail sans avoir besoin du client outlook (ce qui était obligatoire pour SqlMail et étant par ailleurs la cause de brèches de sécurité).
Database Mail permet entre autre:
  • D'envoyer des e-mail de façon asynchrone depuis la stored proc sp_send_mail (via une queue).
  • De permettre au Job Agent d'envoyer des e-mails aux opérateurs (très utile d'une façon générale).
Le la configuration de profile "database mail" se fait via le management studio.
(server) | management | database mail | popup menu | configure database mail.
Un profile database mail contient toute l'information nécessaire permettant Sql Serveur de contacter un serveur SMTP.
La définition de profile de type "public" permet à tous les utilisateurs de Sql d'utiliser database mail.
La definition de profile de type "privé" permet de restraindre l'utilisation du profile database mail (ps: utiliser de préférence le user NT/SYSTEM).

Database mail et Job agent
L'utilisation de database mail par le Job Agent require une configuration un peu plus pointilleuse (sécurité oblige).
  • Activer database mail pour le Job Agent.
    (server)/Sql agent | popup menu | properties
    Select page "Alert System"
    Mail system= Database Mail (ne pas sélectionner SqlMail)
    Selectionner le mail profile (déjà défini dans "database mail configuration"
    Restart the Job Agent!!

mardi 1 septembre 2009

SqlServeur training - Maintaining Sql2008 database - Jour 2

Le thème du jour est cette fois orienté vers le "Disaster Recovery".
En gros, cela concerne les stratégies de backup/restore de DB ainsi que quelques outils.

Integrity Check
Avant de parler des nouveautés concernant les backups/restores, il faut ici signaler l'importance des checks d'intégrité.
Ceux-ci doivent être exécutés à interval régulier sur la DB afin de détecter au plus tôt les problèmes d'intégrités physiques (liés au stockage sur les disques).
DBCC CheckDB
Cette commande exécute les phases suivantes:
  • dbcc checkalloc: le stockage physique des pages de données et des indexes.
  • dbcc checktable: vérification des tables (et des contraintes comme les foreign keys).
  • dbcc checkcatalog: vérification des méta-data.
Réparation d'une table:
alter database [dbx] set SINGLE_USER with rollback immediate
go
DBCC checkDB( 'DBX', REPAIR_REBUILD )
-- l'option REPAIR_ALLOW_DATA_LOSS peut également être utilisé.
go
alter database [dbx] set MULTI_USER
go

Backups
Sujet déjà bien connu, je ne vais seulement prendre note de quelques spécificités.

Stratégie de backup minimale pour un environnement de production
D'une façon générale, en production, il est préférable d'utiliser le recovery model FULL et d'effectuer un full backup la nuit et des transaction log backup à interval régulier (interval de 3 à 1 heure).
Pour information, il semblerait qu'un backup du log toutes les 5 minutes semble être excessif et pourrait même affecter les performances. Il faut déjà avoir un système sacrément charger pour en arriver là (en effet, la taille du transaction log dépend de l'activité).

Ce qu'il faut aussi backuper
Il semble évident de backuper les bases de données utilisateurs.
Cependant il est également primordial de backuper certaines DB systèmes de façon régulière.
Par exemple:
  1. MASTER: (impératif) cette dernière contient toutes les informations relative à la sécurité/logins, la configuration du serveur sql, les linked server, backup devices, triggers serveur, end-points. Cet également cette db qui maintien un enregistrement par base de donnée disponible sur le système.


    Pour restaurer une master db, il faut démarrer l'instance du service sql serveur en 'single user mode'.
  2. MSDB: (impératif) contient le detail et historique des backups, les backups set, les jobs automatisés, etc. Cette DB est donc importante si l'on désire restorer rapidement une DB (surtout si la stratégie de backup est plus complexe... incluant des backups de filegroup ou transaction log ou encore differential). Donc, a ne pas négliger.
  3. MODEL: (optionnel) seulement si l'on définit des modèles.
  4. DISTRIBUTION: (optionnel) contient la configuration et l'état des différents processus de réplication. Le backup de cette DB n'est nécessaire que si l'on utilise la réplication.
Nouveauté du full backup
Depuis SQL 2005, le Full backup inclus un backup du transaction log (en fin de processus de backup).
Cela permet d'avoir un backup englobant les transactions éffectuées durant l'exécution du backup lui-même.

Backup with COPY_ONLY
Lorsque l'on restore une DB, sql serveur lit l'historique des backups. A partir de cet historique, sql serveur décidera quel média sera nécessaire pour restauré la DB. C'est pratique mais require d'avoir ces médias sous la main.
Cette situation est par contre génante si un full backup doit être fournir à une tierce parti... car en effet, ce backup est également repris dans la liste des backups mais plus à disposition physique.
Les transactions log backups se référent au dernier full backup, le full backup en question sera réclamé lors d'une restoration de DB. Mais quid si ce full backup est chez une tierce partie!!!
La solution est de faire un full backup with COPY_ONLY. Dans ce cas, le full backup n'apparaît pas dans la liste/historique des backups.

Differential backup
Enregistre dans le backup devise les data pages (de 8 kb) qui ont changées depuis le dernier full backup.
Un différential backup ne se réfère jamais à un autre différential backup mais toujours à un full backup.

Pour information, un transaction log backup se réfère toujours au dernier full ou différential backup connu.

Vérification des backups
  • Mirrored Device: il est maintenant possible de dupliquer directement (en cours de backup) un backup sur deux médias distincts. Les médias doivent être identiques d'un point de vue matériel et performance. Cela assure une redondance des backups.
  • Compressed backup: sql serveur 2008 permet de compresser les backups au vol.
  • Checksum: une option permet d'écrire un checksum sur les pages écrites dans le backup. Cela permet de vérifier l'intégrité du backup.
  • Backup verification:  un option permet de vérifier si un backup donné peut être restoré sur le serveur sql (place disponible sur le disque, disponibilité des répertoires de destination, disponibilité des backups sur les devices, vérification de sécurité).
  • Integrity of backup: la commande RESTORE VERIFY_ONLY permet de vérifier l'intégrité physique d'un backup (et donc de s'assurer qu'il puisse être restauré).
Restore
Aussi un sujet connu, il y a cependant du nouveau pour moi.

Online Restore
par défaut les opérations de restoration sont ONLINE (autant que cela est possible).
La DB reste donc disponible aux utilisateurs. Lors d'opérations de restoration se faisant en plusieurs opérations (Full+TrnLogs restore), il faut indiquer l'option WITH NORECOVERY aux étapes intermédiaires.

Restore d'une data page (**)
La partie la plus intéressante de cette section fut certainement la restoration d'une seule data page corrompue dans une table (sans la restoration complète de la DB).
Une data page relative a une table était corrompue empêchant l'accès à cette seule table (le restant de la DB étant opérationnelle).
Dans ce cas, la restoration de cette seule data page (ou quelques autres en plus) permet de garder la db de production en ligne sans devoir la mettre offline pour entamer une longue phase de restoration complète (pouvant prendre plusieurs heures).
Par ailleurs, la restoration de la page corrompue durant le training n'a pris que quelques minutes.

La restoration d'une data page se fait avec les étapes suivantes:
  1. Identifier les pages suspectes à l'aide DBCC checktable ou encore
    Select * from MSDB.dbo.suspect_pages
  2. Restorer les pages suspected
    restore database AdventureWorks
    Page = '1:610' -- can be a comma separated list
    from disk = 'c:\...\myBackup.bak'

    with NORECOVERY
  3. Backup des dernières opérations du transaction log (Tail-Log)
    backup log AdventureWorks
    to disk = 'c:\..myLog.bak'
  4. Restorer le log applicable à la page restaurée (sql serveur filtre automatiquement les operations dans le transaction log pour ne retenir que les opérations relatives à la data page restorée).
    restore log AdventureWorks
    from disk = 'c:\...\awlog.bak'
    with recovery -- put back the DB online
  5. Update the suspect_pages table to remove the entries (this is not automatically done by Sql Serveur)
    delete from MSDB.dbo.suspect_pages
    where .... -- identification of the pages
Quelques requêtes utiles

-- Faire un mirrored backup sur deux devices.
-- Stats 10: permet de recevoir une info tous les 10%
-- checksum: Inclus un checksum dans les data pages du backup
backup database
to BackupDev
Mirror to MirrorDev
with format, checksum, stats 10


-- Afficher le contenu d'un backup
restore filelistonly from BackupDev

-- Vérifie si la db peut être restorée
-- Vérifie le checksum, la présence des fichiers de backup,
-- target directories, l'espace disponible pour la restoration
restore verifyonly from BackupDev with checksum 

Des informations complémentaires concernant les backups peuvent être lus directement depuis des table de la MSDB.
select * from MSDB.dbo.backupset
-- endroit ou les fichiers de backups ont étés stockés
select * from MSDB.dbo.backupfile
    security
    Pas grand chose a noter concernant la création des login et users et privilèges sur les DB.
    Si le management console de sql permet d'assigner facilement des privilèges à un utilisateur, cette même console ne permet pas d'en obtenir une liste via la "table valuated function" fn_my_permissions.
    Voici donc une méthode TSql permettant d'en tirer la liste.
    -- obtenir mes privilèges au niveau sql serveur
    select * from fn_my_permissions( NULL, 'SERVER' )
    -- mes privilèges sur l'objet LOGIN pour le login SA
    select * from fn_my_permissions( 'SA', 'LOGIN' )
    
    -- pour connaitre les privilèges d'autres utilisateurs
    -- modifier le contexte d'impersonification pour
    -- executer fn_my_permissions sous le "login" de cet
    -- utilisateur (réservé a SA).
    execute as login = 'miami\testuser'
    -- voir les privilèges pour un object particulier
    select * from fn_my_permissions( 'HumanResources.Employee', 'OBJECT' )
    order by subentity_name, permission_name 
    -- annuler l'impersonnification
    revert
    

    Encryption DB
    Sql serveur 2008 dispose d'une fonctionnalité permettant d'encrypter une base de donnée de façon transparente.

    Authentification avec certificat
    Il est également possible de faire générer des certificat par un serveur sql S1.
    Ce certificat servant a signer, par exemple, une stored procedure usp1 lisant le contenu d'une table Tl2 sur le serveur sql S2.
    Ce certificat peut est exporté de S1 et importé dans S2. Cela permet de définir dans S2 un login UsrS2 basé sur ce certficat. Cela permettra a S1 d'authentifier des appels/connections en direction du serveur S2 (même via internet).
    Lorsque UsrS2 disposera du privilège d'authentification (att: c'est important) et de l'accès sur la table Tbl2. La stored procedure usp1 de Sql1 pourra accéder librement aux données de la table T2 sur le serveur S2 (en étant authentifié sur S2 comme UsrS2).