mercredi 28 janvier 2009

Internet Explorer 8 est disponible

Ca y est, la Release Candidate de IE8 est disponible!
J'ai beau avoir une nette préférence pour FireFox, il est hors de question de faire l'impasse sur cette information.

Télécharger la version pour Windows XP ou pour Vista depuis le site de Microsoft

Pour en savoir un peu plus sur les nouvelles fonctionalités de IE8:
  • Meilleur support des standards, 
  • Nouveau moteur de rendu, 
  • Nouveau mode de compatibilité
Allez jeter un petit coup d'oeil sur cet article de PCInpact.

Mise à jour du 12/02/2009: 
Clubic vient de  publier un article assez complet sur les nouvelles fonctionalités d'IE8.

Source: Ici sur PCInpact

Publication pour Delphi - Blaise Pascal

Voila bien longtemps que je n'avais plus eu vent de publications dans le domaine.
Après la disparition de "Delphi Informant" et "Delphi Magazine" il ne restait plus trop grand chose d'intéressant à lire.

Ce matin, je suis tombé par hasard sur "Blaise Pascal" une publication intéressante autour de Delphi et pascal.
A l'occasion, je pousserai les investigations un peu plus loin.

mardi 27 janvier 2009

SqlServer single-user mode

Parmi les opérations peu fréquentes sous SQL server, il y a l'isolation d'une base de donnée pour raison administrative.
Par exemple, lors remplacement d'une clé primaire "Clustered Primary Key" par une "unique constraint, il est nécessaire de retirer la clé primaire pour la remplacer ensuite par la contrainte (évident n'est-ce pas). Durant le laps de temps entre ces deux opérations, la table reste en libre accès. Il y a donc un risque non négligeable de voir s'insérer des enregistrements indésirables (ne répondant plus au contrainte).
Il convient donc de se protéger contre ce risque!
L'une des options disponibles est de placer la DB en single-user mode.

Note:
Dans notre environnement, nous n'utilisons que des scripts sql.

Et dans ce cadre, il est bien plus facile de placer la DB en single-mode que d'en sortir (arf!!).
Il faut avouer qu'Internet manque cruellement de documentation en la matière. Etant pris au piège pour la Nième fois, je me décide donc documenter cette fonctionalité.

Mettre une DB en Single-user mode
A mon avis, passer en single-user mode est beaucoup trop simple.
A noter que toutes les autres connections SQL sont interrompues.

ALTER DATABASE [TheDatabaseName]
SET SINGLE_USER WITH NO_WAIT

Par contre, pour en sortir, le plus efficace est encore d'utiliser:
C'est ici qu'il est moins facile de trouver la documentation adéquate.

ALTER DATABASE [TheDatabaseName]
SET MULTI_USER

ou encore

EXEC SP_DBOption 'TheDatabaseName', 'single user','false'

Démarrer SqlServer en Single-user mode
Démarrer le moteur SQL en Single-User mode peut s'avérer nécessaire lorsqu'il faut réparer la "master" db.
Voici quelques notes/références annexes:

Meilleurs Voeux 2009

 Parce qu'il n'est jamais trop tard...


Nous vous souhaitons...
De la sérénité à chaque levé de soleil,
la réussite dans chaque facette de votre vie.
La santé en votre for intérieur,
et la famille à vos côtés.
D'heureux souvenirs des jours passés,
et des chemins menant à de meilleurs lendemains.
Des rêves qui font de leur mieux pour se réaliser.
Et finalement, nous vous souhaitons de vous enrichir de toutes ces merveilles que la vie puisse vous offrir.

Dominique & Françoise.

samedi 24 janvier 2009

Les manipulateurs

Voir l'article "La manipulation ... au fond c'est quoi ?" très intéressant sur ce blog "Le petit coin de Steph".


Cet article fait d'ailleurs référence au livre "Les manipulateurs sont parmi nous" d' Isabelle Nazare-Aga que je suis déjà bien décidé à lire.
Si ce sujet vous intéresse, n'hésitez pas à consulter le billet de Steph.

J'en profite d'ailleur pour dupliquer une partie de l'information (histoire de ne pas la perdre si le blog de Steph devait disparaître).

Voici donc une liste de 30 critères permettent de déceler un manipulateur (extrait du livre "Les manipulateurs sont parmi nous" d' Isabelle Nazare-Aga, éditions de l'Homme).
Si quelqu'un répond à 14 de ces critères, il est manipulateur.

01. Il culpabilise les autres au nom du lien familial, de l'amitié, de l'amour, de la conscience professionnelle
02. Il reporte sa responsabilité sur les autres, ou se démet des siennes
03. Il ne communique pas clairement ses demandes, ses besoins, ses sentiments et opinions
04. Il répond très souvent de façon floue
05. Il change ses opinions, ses comportements, ses sentiments selon les personnes ou les situations
06. Il invoque des raisons logiques pour déguiser ses demandes
07. Il fait croire aux autres qu'ils doivent être parfaits, qu'ils ne doivent jamais changer d'avis, qu'ils doivent tout savoir et répondre immédiatement aux demandes et questions
08.Il met en doute les qualités, la compétence, la personnalité des autres : il critique sans en avoir l'air, dévalorise et juge
09. Il fait faire ses messages par autrui
10. Il sème la zizanie et crée la suspicion, divise pour mieux régner
11. Il sait se placer en victime pour qu'on le plaigne
12. Il ignore les demandes même s'il dit s'en occuper
13. Il utilise les principes moraux des autres pour assouvir ses besoins
14. Il menace de façon déguisée, ou pratique un chantage ouvert
15. Il change carrément de sujet au cours d'une conversation
16. Il évite ou s'échappe de l'entretien, de la réunion
17. Il mise sur l'ignorance des autres et fait croire en sa supériorité
18. Il ment
19. Il prêche le faux pour savoir le vrai
20. Il est égocentrique
21. Il peut être jaloux
22. Il ne supporte pas la critique et nie les évidences
23. Il ne tient pas compte des droits, des besoins et des désirs des autres
24. Il utilise souvent le dernier moment pour ordonner ou faire agir autrui
25. Son discours paraît logique ou cohérent alors que ses attitudes répondent au schéma opposé
26. Il flatte pour vous plaire, fait des cadeaux, se met soudain aux petits soins pour vous
27. Il produit un sentiment de malaise ou de non-liberté
28. Il est parfaitement efficace pour atteindre ses propres buts mais aux dépens d'autrui
29. Il nous fait faire des choses que nous n'aurions probablement pas fait de notre propre gré
30. Il fait constamment l'objet des conversations, même lorsqu'il n'est pas là.

vendredi 23 janvier 2009

SQL Server - Les indexes et le préfixe _WA_sys_

Voici quelques informations collectées sur le Net concernant la définition des indexes dans SQL Serveur (version 7).
Récemment, lors d'une révision des tables de notre base de données en SQL 7 (et oui, il en existe toujours), en utilisant la commande sql  "sp_help TableName" j'ai découvert une grande quantité d'indexes préfixés avec "_WA_sys_".
Nous n'avions manifestement pas crées ces indexes... et la question s'est alors posée de savoir pourquoi il étaient là.

Je sais aujourd'hui que l'existence de ces indexes "_WA_sys_" indique une mauvaise optimisation de la base de donnée. Une mauvaise indexation que SQL server a tenté de palier au mieux.
La suite de cet article rassemble le matériel glâné ci et là sur Internet.

Note:
Cet article de fond concerne principalement SQL Serveur 7. Depuis SQL Serveur 2005 bénéficie d'outils avancés facilitant l'optimisation des indexes. Il n'en reste pas moins que les informations contenues dans cet article restent pertinentes à plus d'un title (en autre l'existence des indexes _wa_sys_).
Interroger la table SysIndexes

Pour commencer, une requête sql permettant d'obtenir une  liste des indexes présent sur une table.
Cette section est accompagné d'une description en anglais provenant d'une page anonyme sur le net.
L'information n'en est pas moins intéressante.


;  In the following SQL Statement, indID = 0 is excluded because it correspond to the heap.
;               indID=255 is excluded because it exists if table contains a Text or similar column

  SELECT name as IndexName
  FROM SysIndexes idx
  WHERE idx.id in (
    SELECT id from SysObjects tbl
    WHERE  tbl.type='U' and tbl.Name = 'tblTMcVarInstance' )
    and indID not in ( 255, 0 )

Each table and index has a row in sysindexes uniquely identified by the combination of the object identifier (id) column and the index identifier (indid) column. The allocation of pages to table and index is managed by a chain of IAM pages. The column sysindexes.FirstIAM points to first IAM page in the chain of IAM pages managing the space allocated to the table or index.
Each table has a set of rows in sysindexes:
  • A heap has a row in sysindexes with indid = 0.
  • The FirstIAM column points to the IAM chain for the collection of data pages for the table. The server uses the IAM pages to find the pages in the data page collection because they are not linked together.
  • A clustered index has a row in sysindexes with indid = 1.
    The root column points to the top of the clustered index b-tree. The server uses the index B-tree to find the data pages.
  • Each nonclustered index created for the table has a row in sysindexes.
    The values for indid in the rows for each nonclustered index range from 2 to 251. The root column points to the top of the nonclustered index B-tree.
  • Each table that has at least one text, ntext, or image column also has a row in sysindexes with indid = 255.
    The column FirstIAM points to the chain of IAM pages that manage the text, ntext, and image pages.

Qu'est-ce qu'un index _WA_sys_?
Lorsqu'un index est créé à l'aide d'une requête SQL, l'utilisateur est prié de mentionner un nom pour celui-ci.
Dans notre cas, l'exploration de SysIndexes peut révéler des indexes complémentaires préfixés avec" _WA_sys_". D'ou viennent-ils?

Réponse:
SQL Server creates statistics when it can not find an adequate index to perform a particular query. It makes this determination based on an algorithm that takes into account frequently used queries. This prevents the engine from creating statistics every time it doesn't find an index, but still allows it to self-optimize when it determines a need. Remember, the presence of statistics that SQL Server builds is an indication of inadequate indexing. Instead of trying to copy stats around, you should be asking yourself why does SQL Server even have to create those stats in the first place? It is creating those stats because you have not created sufficient indexes for the query patterns your users are placing against the server? Stats are not transferred and are transitory things. Your performance problems are solved by creating the indexes you need, instead of relying on SQL Server to finally determine that you need them, and then creating stats to fill the void your lack of indexes have left.

Les entrées _WA_sys_ apparaissant pour les tables indiquent une mauvaise indexation de ces dernières.

Détecter les tables mal indexées
Suite de la précédente section... puisque dans ce cas  le préfix "_WA_sys_" est automatiquement ajouté, une simple requête SQL sur la table sysIndexes révèlera tous les indexes créés par le processus de mise à jour statistic.

select tbl.Name as TableName, idx.indID, idx.name as IndexName, tbl.id as ObjectID
from sysindexes idx
left join sysobjects tbl on idx.id = tbl.id
where idx.name like '_WA_%' and tbl.type='U'
Les indexes "_WA_sys_", copie de base de donnée et PERFORMANCES!Lors du backup d'une DB, les indexes _WA_sys_ n'y sont pas inclus.
Par conséquent, à la restauration, il ne seront pas restaurés (ou recrée).
La présence d'indexes "_WA_sys_" indique une indexation inadéquat dans la base de donnée... résultant forcement en une faible performance... qui est cependant corrigé par le processus d' "update statistic" et "query optimizer" (d'ou la création "sauvage" d'index _WA_sys_).

Mais attention! Puisque les indexes _WA_sys_ ne font pas parties du procéssus backup/restore, les performances des bases de données mal optimisée seront forcement mauvaises (voir catastrophique) après restoration.
Tant que le processus d'optimisation ne re-créera pas les indexes _WA_sys_ , la base de donnée "fonctionnera sur une seule jambe".

mercredi 21 janvier 2009

Symfony - un framework pour PHP5

Symfony est une framework complet composé d'une librairie de classes pour PHP5.
Il fournit une architecture, des composants et des outils audant les développeurs à concevoir plus rapidement des sites Web complexes.
Choisir Symphonie, c'est assurer un développement rapide mais d'également permettre un hosting et une scalabilité simplifié tout en privilégiant une maintenance "sans surprise".
Le framework Symfony est basé sur l'expérience... il ne réinvente donc pas la roue.
Symfony est basé sur les meilleures pratiques de développement WEB et inclus, par ailleurs, quelques librairies largement réputées.

Pour plus d'info, voir le site officiel qui contient quelques screencasts.

Voici quelques-uns des composants WEB open-source inclus dans le framework Symfony:

  • Prototype, for JavaScript framework (symfony 1.0 and 1.1)
  • script.aculo.us, for Ajax and visual effects (symfony 1.0 and 1.1)
  • Dynarch.com, for the DHTML Calendar (symfony 1.0 and 1.1)
  • TinyMCE, for Rich Text Editing (symfony 1.0)
Symfony utilise également du code PHP provenant d'autres projets open-source:
  • Creole, for database abstraction layer
  • Prado, for i18n support
  • Spyc, for YAML parsing (symfony 1.0)
  • Pake, for command-line tool (symfony 1.0)
Avis personnel:
Au premier coup d'oeil, Symfony semble être un framework complet et bien documenté.
Le fait de retrouver un site officiel bien détaillé est un avantage indéniable.
Qui plus est, l'utilisation de Prototype, Script.aculo.us et TinyMCE (déjà bien connus) renforcent encore l'image de sérieux de cette distribution.
Si je devais un jour entamer un développement d'envergure en PHP, il est certains que j'approfondirai les possibilités de Symfony.