jeudi 30 avril 2009

Samsung I7500 utilisera Android comme système d'exploitation

Pour rappel, Android le système d'exploitation libre de Google destiné aux appareils mobiles (avec un prédilection pour les GSM).
Bien entendu, Android inclus tous les services Googles (Search, Maps, GMail, YouTube, Agenda; ...).
Plus d'informations sur Android sont disponibles à partir de cet article.

Samsung se lance donc dans la grande aventure avec mobile aux caratéristiques suivantes:
  • 8 Go de mémoire interne (extensible à 32 Go)
  • Support des réseaux mobiles HSDPA, GPRS/EDGE.
  • Un écran de 320x480 ( 3.2" AMOLED screen)
  • Un capteur CCD 5-megapixel pour les photographies.
  • Support WiFi 802.11b/g
  • Un GPS interne (dont les applications google profitent pleinements)
  • Une prise jack pour headphone.
 
Sources:

mercredi 29 avril 2009

Le petit traité de manipulation à l'usage des honnêtes gens

Voila une grande surprise sur le site Amazon.
Dans les livres les plus demandés du mois d'avril 2009, il y a "le petit traité de manipulation à l'usage des honnêtes gens".
Après la lecture du livre d'Isabelle Nazare-Aga (les manipulateurs sont parmi nous), cet autre lecture relative à la manipulation mais dans le monde marketing pourrait être intéressant.

mardi 28 avril 2009

Google Ajax Api

Juste au détour d'une recherche, je suis tombé sur le site Google Ajax Libraries API.
Par curiosité, j'ai essayé l'exemple fournit sur la page d'accueil.
Ce dernier étant simple et court, il ne m'aura pas fallut plus d'une minute pour me rendre compte à quel point cette API peut se révéler efficace.

Voici d'ailleurs une vidéo reprise du site:

O3D Api

Google met a disposition une API Javascript permettant de programmer une application en 3D depuis un Navigateur internet.
A ne pas s'y tromper, cette API est suffisamment puissante pour donner un rendu de très grande qualité. Vérifiez donc la vidéo ci-dessous... en qualité HD si vous pouvez (c'est encore plus impressionnant).



Cette API abondamment documentée s'accompagne d'un plug-in disponible pour de très nombreux navigateurs Internet (et nombreux OS, y compris Linux).

Voici quelques informations complémentaires:
Avec un peu d'anticipation...
La plateforme GSM Android de Google (youtube) disposant d'une API graphique OpenGL. Avec cette puissance graphique j'ose a peine imaginer ce que le plug-in O3D pourrait permettre de concevoir sur ces plateformes GSM.
Imaginez un peu un Google Maps affichant une carte dans le Navigateur avec en "surimpression" les batiments  de Sketchup (youtube) dessinés en 3D à l'aide de O3D! Dans le délire total, il serait même possible de mettre au point un site de rencontre/d'interaction/visite "virtuel" dans un copie du monde réel... comme par exemple, à la grand place de Bruxelles.  Et tout cela a patir d'un Navigateur internet et de code JavaScript!

SQL Server et iSCSI

Introduction
Je suis face à une solution SQL serveur originale.
Le serveur Sql est installé sur une machine virtuelle (WMWare) et son espace de stockage est accessible via un lecteur iSCSI.
En gros, un périphérique iSCSI est un disque dur SCSI connecté au système d'exploitation via un réseau Ethernet (IP). Il permet le transfert d'information par block.
Pour plus d'information sur le iSCSI, voir cet article sur Wikipédia.

Dans le cas qui nous concerne, les disques iSCSI sont stockés dans un Vault iSCSI, matériel physique dédié à cet usage (je n'en connais malheureusement pas plus).

Les questions en suspend
Dans cette situation, je me pose un certain nombre de questions.
En effet, accéder à un disque via un "réseau" ne parait un peu périlleux... surtout s'il s'agit d'une DB de production (OLTP) de 13 Go.
Est-ce vraiment un choix approprié? Quid des temps de latence réseau? Du débit en lecture / écriture?
Que se passera t'il a la suite d'un évènement réseau (déconnexion, ralentissement du traffic, coupure), lorsque Sql Serveur ne pourra pas accéder à ses fichiers de donnée?

Que pense Microsoft de l'utilisation de iSCSI avec Sql Server?

Support iSCSI par Windows
Le support iSCSI est assuré par une couche logiciel "iSCSI initiator" (driver) disponible entre autre sur le site de Microsoft (Téléchargement ici).
 

Ce qu'en pense Microsoft
Et bien, selon l'article KB833770, Microsoft n'en pense pas du mal a condition que la solution apporte la garantie "guaranteed delivery to stable media" (voir KB967576) et "Alway On storage solution" (ici) pour SQL serveut.

Cependant, pour reprendre les termes de l'article, il convient d'être prudent.
Le temps de latence pour accéder au périphérique iSCSI doit être minimisé. Pour maximisé le débit du serveur SQL, il convient également qu'il soit (le serveur SQL) configuré pour maximisé l'utilisation du cache SQL.
Il est entre autre possible dans l'article "support for network database files in SQL Server" (KB304261) que Microsoft attend un périphérique certifié WHQL (Windows Hardware Quality Lab) pour stoquer les fichiers DB sur un NAS (donc égalment les périphériques iSCSI).

La liste des périphériques iSCSI certifié par microsoft est disponible sur le site Windows Server Catalog.


Le débit des disk iSCSI

En temps que néophyte, il est assez difficile d'imaginer qu'un disque iSCSI puisse être plus rapide qu'un disque SCSI attaché directement à la machine.
Selon notre administrateur, le débit iSCSI est beaucoup plus important principalement à cause de la carte Ethernet Gigabyte. Cela ne tient cependant pas compte des temps de latence réseau qui s'additionnent encore au temps d'acces disques.

Je reste néanmoins dubitatif devant une telle affirmation...


A la lecture de l'article "Fibre Channel and iSCSI Performance Comparison for DSS Workloads Using SQL Server 2005" de Microsoft (pdf), il apparait inutile de tester les performances d'un system iSCSI par rapport à des disques locaux. Cet article n'envisage aucune comparaison avec des disques locaux (comme s'ils ne pouvaient se révéler d'une quelconque importance dans cette architecture).

Un autre article parle également des performances de mySql sur différents type disques et entre autre un array iSCSI. Bien que le graphique soit relativement imprécis sur les échelles, les perfomances iSCSI valent au moins les performances SCSI d'un disque local. Tout comme l'article de Microsoft, l'utilisation d'un array iSCSI avec beaucoup de disques peut même présenter un avantage (question d'architecture).



Optimisation des DB sur disk iSCSI

L'article "Fibre Channel and iSCSI Performance Comparison for DSS Workloads Using SQL Server 2005" publié par Microsoft (pdf), fournit des informations utiles concernant l'architecture.
Entre autre, la TempDB est partagée sur plusieurs disques physiques afin de maximiser les performances.

Lectures annexes

Voici quelques reférences vers des articles intéressants. Certains d'entre eux ont déjà été mentionnés plutot dans cet article.
  • Fibre Channel and iSCSI Performance Comparison for DSS Workloads Using SQL Server 2005 from Microsoft (pdf, deja mentionné).
  • Using SQL Server 2005 in a Virtual Environment from Microsoft (doc)
  • Solutions for Highly Scalable Database Applications: An analysis of architectures and technologies (pdf)
  • SAN, NAS, and iSCSI (& SQL Server) article de vulgarisation de Yalfa

dimanche 26 avril 2009

Google Map Pedometer

Super petit site permettant de calculer les distances parcourues (miles et kilomètres) lors d'une promenade.
La prise des points se fait par double-click sur une carte Google Map.

Une idée vraiment super!

voir gmap-pedometer.com

jeudi 23 avril 2009

Un data center de Google en Belgique

Google dispose d'un Data Center en Belgique... près de canal Nimy-Blaton.

La vidéo suivante présente quelques informations concernant l'usine de traitement des eaux utilisée par Google pour son centre de donnée.



J'en tombe littéralement sur mon derrière!

En avril 2007 Google avait annoncé un investissement de 250 millions d'Euro pour la création d'un centre de données à Glin-Baudour... près du lieu dit "le grand large"


Afficher Google Belgium Data Centers sur une carte plus grande

Il y a également cet  article d'une personne ayant visité le site au tout début de sa construction.
J'irais bien y faire un tour pour voir à quoi cela ressemble maintenant.


L'adresse de Google Belgique:
Rue des Colonies 11, B-1000 Bruxelles
02 517 61 16

Mise à jour - le 7 aout 2009:
Je me suis rendu a proximité du site. Il est toujours très bien gardé... comme depuis ses débuts.
Avec des terres de remblais et une zone "No man's land" tout autour du site, le site est plus sécurisé que nos propres prisons. Dans quelques années, les abres aurront poussés et il ne sera même plus possible d'entre apercevoir les strucutre du site.
Aujourd'hui, je sais que le site s'appelle "Crystal Computing" (Ract Sheet ici) GBL (Google Belgique Luxembourg)
Trouver un job a Google (ici), les bureaux (ici).

Imprimante Laser Brother DCP-8080DN



Les avantages:
  • Laser
  • Rapide
  • Tout en un: Impression, photocopie, Scan
  • Recto/verso
  • imprimante réseau, port parellele et USB 2.0.
  • Compatible Windows, Linux, MacOS.
  • Port USB pour imprimer un fichier depuis un "memory stick".
    Ou scanner un document directement stocké sur le memory stick.
  • Prix appriximatif 380$ US.
Le site du fabricant.

mardi 21 avril 2009

Inclure une date dans un nom de fichier

Voici le contenu (rudimentaire) d'un fichier batch permettant d'inclure une date (et temps) dans un nom de fichier.
Fichier: MonitorDB.zip.
@Echo Off

rem extract the date and time to variable
rem    http://www.computing.net/answers/dos/rename-file-with-date-and-increment/15614.html
For /F "tokens=*" %%A in ('Date /T') Do Set DT=%%A

rem extract time for NT 
rem    http://www.batchfiles.co.nr/
for /F "tokens=1-4 delims=:., " %%a in ("%TIME%") do set TM=%%a%%b%%c

rem compute filename by removing unwanted characters
rem   http://www.ss64.com/nt/syntax-replace.html
rem
rem replace space (and everything before) with Empty String
set DT=%DT:* =%
rem replace all time back slashs
set DT=%DT:/=%
set DT=%DT:/=%
set DT=%DT:/=%
set DT=%DT: =%

rem Debug by outputing the value. 
rem Echo DateAndTime=%DT%_%TM% > File.txt

rem --- Analyse DB1 ---
SET TargetDB=TxsDev003V403
SET OutFilename="LockInfo_%TargetDB%_%DT%_%TM%.dat"
SQLCMD -v TargetDB=%TargetDB% -S . -E -H MonitorCmd -o %OutFilename% -i monitorDB.sql

rem --- Analyse DB2 ---
SET TargetDB=PlayGround
SET OutFilename="LockInfo_%TargetDB%_%DT%_%TM%.dat"
SQLCMD -v TargetDB=%TargetDB% -S . -E -H MonitorCmd -o %OutFilename% -i monitorDB.sql


rem SQLCMD -v TargetDB="PlayGround" -S . -E -H MonitorCmd -o %OutFilename% -i monitorDB.sql

En guise de résultat, mes noms de fichiers sont:
LockInfo_PlayGround_21042009_110528.dat
LockInfo_TxsDev003V403_21042009_110528.dat

Pour plus d'informations, voir les liens suivants:

lundi 20 avril 2009

Utiliser le SQL Profiler pour optimiser une base de donnée

Voici une collection d'articles intéressants concernant l'utilisation du profiler SQL.

How to identify SQL Server performance issues, by analyzing Profiler output?
Fichier: AnalyseProfilerOutput.zip (incluant l'article)


Cet article (a l'origine pour SQL2000) indique quel est la configuration de SQL Profiler à utiliser pour faire une monitoring des requêtes demandant un long temps d'exécution ou consommant beaucoup de ressources processeur.
Cet article s'accompagne de stored procedures (cpu_intensive.sql, long_running_queries.sql, procedure_cache_usage.sql, show_errors.sql) analysant le résultat collecté par le Profiler pour identifier les requêtes les plus gourmandes.

Using the SQL Server Profiler
Fichier: ProfilerTips.zip (articles)
Article concernant "les trucs et astuces" pratiques pour l'utilisation du profiler SQL.
Parmi les conseils rencontrés à plusieurs reprise, il a la préservation des ressources SQL sur le serveur de production durant l'opération de profiling.
Pour se faire, il est conseiller:
  1. D'utiliser un autre serveur SQL pour récupérer les informations du profiler.
  2. Utiliser un autre serveur SQL (ou Workstation) pour collecter les traces.
    La collecte des traces est gourmande en ressource et peu affecter les performance d'un serveur de production.
De la lecture de l'article, il ressort visiblement qu'il est utile de monitorer les classes d'évènements suivantes. Ces classes indiquant généralement des "pertes de performances" du moteur SQL:
  • Execution Warnings: Pour les serveurs chargés, il est possible qu'un query ait à attendre la libération de ressources pour être exécuté (même une courte période). Avec cette classe d'événement il est possible de savoir si (et combien de temps) des requêtes doivent attendre après les ressources nécessaires. Les valeurs possibles sont "Query Wait" pour indiquer si un query doit souvent attendre. "Query Time-Out" pour indiquer si un query à recu un time-out en attendant les ressources nécessaires. Si ces évènements arrivent de façon régulière, il est alors nécessaire de réduire ma charge sur le serveur (augmenter le Hardware, ré-écrire les requêtes, choisir de meilleurs indexes pour résource le problème, ou une combinaisons de ces actions).
  • Hash Warning: cet événement est utilisé pour mesurer les "hash recursions" ou les "hash bails". Un "hash recursion" (event 0) arrive quand le résultat d'un query ne tiens pas entièrement en mémoire, forcant ainsi SQL Serveur a diviser la source/input en plusieurs parties (alors traitées individuellement). Un "hash bail" (event 1) est même encore pire pour les performances. Il arrive lorsque l'opération de hashing atteind le niveau maximum de récurssion (recursion depth), forcant la requête à fonctionner avec un plan d'exécution alternatif... forcement, l'un bien moins optimal. Le "hash bail" est un cauchemar! Ces deux événements peuvent vraiment dégrader les performances. Les options pour corriger ces problèmes sont: avoir des Index Statistics up-to-date, ré-écrire la requête, tester les optimizer hints, ou ajouter de la RAM au serveur.
    Note: Le but du Hash Warning est de prévenir que quelque chose va de travers... mais il peut également fournit un précieux service. Pour avoir des performances optimums, il fait éviter tout type d'opérations de hashage... même celles fonctionnant correctement. Si un "Hash Warning" est identifié, il peut être utile de voir pourquoi une opération de hash a été effectuée par Sql Serveur. Il peut être bien plus utile de fixer ce problème à la source.
  • Missing Column Statistics: Indique quel sont les colonnes du query pour lesquelles il manque des statistiques, tel que les "Index Statistics" utilisés par le Query Optimizer pour évaluer le plan d'execution le plus éfficace. Si une ou plusieurs colonnes de statistiques sont manquantes, Le Query Optimizer pourrait ne pas sélectionner le plan d'exécution le plus efficace... causant ainsi une perte de performance. Pour réssoudre ce type de problème, considérez les approches suivantes: Avoir activé l'option "auto create statistics", utiliser l'instruction CREATE STATISTICS pour créer manuellement les statistiques sur les colonnes manquantes, utiliser les outils "Index Tuning Wizard" ou "Database Engine Tuning Advisor" (pour identifier et créer automatiquement les statistiques nécessaires).
  • Missing Join Predicate: Indique si le query dispose ou non d'un "join predicate". Si ce n'est pas ne cas, le query optimiser produira un plan d'exécution peu optimisé. Ajouter des "join predicates" au query pour réssoudre ce problème.
  • Sort Warnings: Indique qu'une operation de tri ne peu pas prendre entièrement place en mémoire. L'opération de tri doit être divisé en plusieurs étapes pour être exécutée complètement. Les solutions potentielles pour réssoudre ce problème sont: réduire le nombre de records retournés et triés, réduire le nombre de colonnes à trier, éliminer l'opération de tri, ou ajouter de la RAM. 
Cet article contient également quelques options d'affinement pour éviter les pertes d'informations de profiling lorsque le serveur de production est vraiment chargé (voir ici).

Quand l'Auto Update Statistic dégrade les performances!
D'une façon générale, il est approprié d'avoir cette option activée... pour ne pas avoir à ce soucier de cela.
Cependant, l'update statistic peut arriver n'importe quand durant la journée... et par forcement au moment le plus opportun (par exemple, sur une table d'audit de plusieurs Go en pleine heure de pointe!).
Dans ce cas, l'update statistic peut devenir un problème... qu'il est possible de détecter avec le profiler. En monitorant l'événement "Auto Stats" il est possible de connaitre la fréquence et la durée des updates statistics.
Solution: désactivé l'option Auto Update Statistic et programmer un update durant les heures creuses.

Modèles de profiling préféfinis
Voici la définition de quelques modèles qui pourraient s'avérer bien utile suivant les circonstances.

  • TSQL: Ce  modèle collecte les requêtes Transact-SQL executés sur le serveur SQL dans l'ordre d'exécution. Cel fournit une vue de type "historique" de l'activité du serveur... très utile pour se faire une large idée de ce qui se passe sur le serveur.
    Tip: Ce modèle fonctionne parfaitement avec les applications développés en ADO. Ne pas oublier de filtrer les entrées sur la DB.
  • TSQL by Duration: Trace les requêtes Transact-SQL exécutées, ainsi que le temps d'exécution. Ce modèle est utile pour identifier les requêtes qui prennent le plus de temps à s'exécuter.
    Tip: Ce modèle fonctionne parfaitement avec les applications développés en ADO. Ne pas oublier de filtrer les entrées sur la DB. Filtrer les évènements sur la durée minimal (duration) permet de mettre en évidence les requêtes les plus lentes.
  • TSQL For Replay: Capture tous les détails nécessaires pour re-jouer la trace sur le même serveur SQL (ou un autre serveur). Peut être très utile pour disgnostiquer ou débugger les problèmes.
  • Tuning: Capture les informations détaillées sur les Stored Procedures SP et requêtes Transact-SQL incluant les informations relatives aux performances tel que les temps d'exéctions.
  • Standard: Ce modèle capture une large quantité d'information (incluant les logins et bien d'autres informations).
Monitorer les Table Scan
En soi, un table scan n'est pas une opération critique... cependant, trop de TableScan peuvent causer des problèmes de performances.
Utiliser la configuration suivante pour monitorer les tables scans:
Profiler Events:
  • Scan: Started
Profiler Data Columns:
  • IndexID (Grouped)
  • Event Class
  • ApplicationName
  • SPID
  • Plus any others you find useful
Profiler Filters:
  • DatabaseName Like: [Database name being profiled]
  • Exclude any applications you don't need to track, such as SQL Agent, etc. 
Bien que pas trop élégante (mais efficace), cette trace regroupe les information par IndexID.
IndexID reference un IndId de la table SysIndexes, le nom de l'objet peut être extrait de la colonne "Name". Il faut cependant savoir que beaucoup de TableScan concernent les tables systèmes (qui peuvent être ignorées pour focaliser l'attention sur les User Objects). Bien que le nom de la colonne ne soit pas disponible immédiatement, le nom de l'index (ou de la statistique) est visible. NB: Une colonne peut avoir une statistique... même sans index, c'est la raison pour laquelle SysIndex peut référer un index ou une statistique.

Monitorer les Locks Escalation
Fichier: LockEscalation.zip (article)
Il est également possible de monitorer l'escalade de locking sur SQL server.
Lors de la release de SqlServer 2000, Howard Long a remarqué une escalade du système de lock dans des conditions particulières (grande et large table, requête retournant peut un échantillion de quelque milliers de records sur plusieurs millions, pas de clustered index). Les détails sont disponibles dans son article.
Cette escalade pratique pour minimiser les ressources SQL est cependant préjudiciable dans un système OLTP. En effet, si le front-end est assez lent, l'escalade vers un shared lock (pour un query en read-only) empêchera d'autre processus de faire des updates ou d'insérer de nouveaux enregistrement. "Not a good situation!" selon l'auteur.

vendredi 17 avril 2009

Modification de la loi relative au congé parental

A partir du 1ier Avril 2009, la loi relative à la prise de congé parental est sensiblement modifié.
Il est maintenant possible d'introduire une demande jusqu'aux 12 ans de son enfant.Ce n'est pas rien comme changement :-)

Voici un extrait du texte publié sur le site "Service Public Fédéral Emploi".


Chaque travailleur a le droit de prendre un congé parental dans la période qui commence à courir à partir de la naissance de l'enfant. Le congé doit débuter avant que celui-ci ait atteint l'âge de 12 ans (entrée en vigueur au 1er avril 2009).
Le droit au congé parental existe également en cas d'adoption.


Plus d'information dans cet article sur le site Service Public Fédéral Emploi.

mercredi 15 avril 2009

Petit tutorial d'accès aux DB en .Net

Petite référence vers l'article ".NET Basics for the Database Developer" de DevX.
Ce dernier explique pas à pas comment accéder aux données d'un server SQL depuis l'envrionment .Net.
Il met également en avant la création d'une connexion sur la DB et la création de l'interface utilisateur permettant de modifier les données.
Bon Amusement.

vendredi 10 avril 2009

Le mot clé "yield"

Une chouette référence pour comprendre l'usage des instructions "yield return" et "yield break" dans l'environnement .Net.

mercredi 8 avril 2009

Visite d'un centre de donnée Google

Petite visite d'un centre de Stockage de Données chez Google.

A l'image de la société, tout ici est gigantesque.

Les serveurs (45.000) sont stockés dans des containers.
Les containers sont remplaçable au pied levé avec un pont roulant.
Ce centre de données est tellement énorme qu'il dispose de ses propres transformateurs et systèmes auxiliaires.
Le refroidissement d'air (à l'eau) n'est pas en reste lui non plus.

Et finalement, le centre de donnée est suffisamment grand pour que les techniciens se déplacent en trottinette.    


Petite revue d'un des nombreux serveur Web de Google.
A l'évidence, c'est du fait sur mesure.

Utiliser la Google API depuis un serveur PHP

Bien que cette vidéo ne s'adresse principalement qu'aux développeurs PHP, il est intéressant d'y noter la "structure" des API Google.
Cette façon de découpler les blocs données (GData) des classes de services et de transport est vraiment très intéressante.
Les classes de services permettent d'exploiter les fonctionnalités des services Googles sans que le développeur ait à s'occuper de la structure des blocs de données (GData).
Par ailleurs, L'API est relativement indépendante de la couche de communication (Http).
Dans la vidéo ci-dessoise, le développeur utilise directement des requêtes "http" pour remplir les blocs de données GData. Ces blocs de données GData étant ensuite utilisés par des classes de services permettant d'exploiter l'information qui si trouve.


En fin de compte, c'est une vidéo vraiment très instructive.

mardi 7 avril 2009

Les manipulateurs et la communication - Savoir bien communiquer

En pleine lecture d'un livre sur les manipulateurs relationnels, un chapitre entier est consacré à la communication avec le manipulateur.
Il ressort de ce chapitre que les manipulateurs utilise systématiquement des procédés de communication floue, évasif et peu clair! (propos que je confirme).

La communication efficace

Avant d'entamer un petit exposé sur la communication avec un manipulateur, il convient considérer les propriétés d'une communication efficace et optimale.
Voici, ci-dessous, un extrait pertinent du livre "les manipulateurs sont parmis nous".
 

<<
La seule manière de bien communiquer pour chacun d'entre nous est de clarifier notre message pour que l'effet ressenti chez notre interlocuteur soit égal à l'intention émise. Etre clair, c'est être clair d'emblée. Une personne s'exprimant de manière claire n'appelle pas de questions complémentaire. Etre clair, c'est dire où, qui, quoi, quand, combien, comment; et éventuellement  le pourquoi de la demande, de l'explication ou de la consigne. Toutes les informations nécessaires doivent être soumises d'emblée pour qu'il n'existe aucun quiproquo, aucune mauvaise interprétation possible.
>>
Citation: Les manipulateurs sont parmi nous, Isabelle Nazare-Aga, pg 99, Etd de l'homme.ISBN: 978-2-7619-1971-5

La communication avec le manipulateur
Les propriétés d'une communication efficace font généralement défauts aux échanges avec un manipulateur.

En conséquence, lors d'échanges avec un manipulateur, il est généralement difficile de savoir ce qu'il veut.
Si ce dernier vous en laisse le temps, vous êtes généralement amené à demander des clarifications (dont les réponses seront tout aussi confuses).
Il n'est pas rare qu'une demande volontairement imprécise se dissimule dans un long discours dont il est difficile de percevoir les tenants et les aboutissants.
En exposant habilement ses tracas et ses difficultés (souvent exagérés), le manipulateur arrive même a suggérer des intentions d'actions (ou de prises de position) chez son interlocuteur.
Ainsi, l'interlocuteur peut être amené à faire des suggestions précises (suggestions attendues par le manipulateur), qui seront par la suite utilisées par le manipulateur auprès d'un tiers.
Dans tous les cas de figures possibles, le manipulateur ne sera "jamais" responsable.
Il n'est d'ailleurs pas rare que le l'interlocuteur se fasse, de lui même, le porte parole du manipulaeur (chose également attendue par la manipulation).
Croyez-moi, ce sont des pièges difficile à déceller tellement ils sont habiles.

Ce côté évasif employé par le manipulateur dans ses communications lui permet:
  1. D'obtenir votre accord avant que vous ne connaissiez les détails embarrassants (une fois le "oui" obtenu, il est généralement difficile de se rétracter)
  2. De se défiler/protéger dans le cas où un problème surviendrait (avec la phrase type "je n'ai jamais voulu dire cela"... laissant croire à une mauvaise interprétation de votre part).
  3. De tirer la couverture à lui lorsque les résultats sont excellents (parce que bien entendu, dans ce cas, il l'aura au minimum suggéré... c'est SON idée)
  4. D'attendre de vous de vous jeter dans ses pièges en faisant des suppositions erronées sur ses propos ambigus.
    Ces prétendues suppositions erronées de votre part restent cependant avantageuses pour lui.
    Et lorsque
    les choses tournerons mal, Cela ne sera pas sa faute puique ce n'est pas ce qu'il "vous" aura dit!.
  5. Attendre de vous que vous fassiez une démarche vous impliquant personnellement dans une de ses actions. Il cherche à induire chez vous une proposition, une suggestion, une idée, etc.
    Il pourra par la suite l'utiliser contre vous (si vous êtes dans la ligne de mire) ou bien vous utiliser pour atteindre son but auprès d'un tiers.
    Dans le pire des cas, vous proposerez vous même de l'aider pour "en toucher vous même un mot" directement à la personne concernée par ses inquiétudes (alors que le manipulateur pourrait très bien le faire lui-même).
    Dans ce cas, vous risquer même de devenir son porte parole/intermédiaire.
    Les manipulateurs adorent faire porter leurs messages par autrui. Gare à vous si vous tombez dans le panneau... la faute vous incombera s'il est mis à découvert ou si cela génère un trouble (souvent voulu par ailleur)... car bien entendu, ce n'était pas ce qu'il voulait dire!

  6. Intrigué par le mystère.
    Rester évasif permet de taquiner la curiosité ou la suspicion de son interlocuteur.
    Cela a généralement beaucoup d'effet par la nature même de l'espèce humaine.
    Les résultats sont généralement concluant lorsqu'il cherche à semer la zizanie (diviser pour assoir son pouvoir, rester le personnage centrale).
    Cela permet également au manipulateur d'être une personne "incontournable" (les manipulateurs sont égocentrique).
    Il prétend "savoir", dit "qu'il sait" mais ne "révèle pas" (excepté juste assez pour mettre l'eau à la bouche).
    Par exemple, un manipulateur ne dira pas "Ton mari te trompe!" (que cela soit vrai ou pas) mais "C'est bizarre, ton mari est devenu bien coquet ces derniers temps!"
Il est assez commun que ces méthodes de communication débouchent sur une dépréciation de la "confiance en soi" chez l'interlocuteur.
En effet, après de nombreuses erreurs (insinuée comme étant "de votre faute") et face à l'assurance surprenante du manipulateur, on en vient tout naturellement à se remettre en question... à se poser des questions fondamentales sur soi-même.
C'est qu'a force de passer pour un "mauvais", on fini vraiment par croire que l'on est "mauvais".
Le manipulateur apparaissant inévitablement comme la victime (il excelle à ce jeu), l'interlocuteur en vient inévitablement à douter de lui.

N'en toucher surtout pas un mot à votre manipulateur... sinon il foncera dans la brèche ouverte et vous écrasera.
C'est que pour vous être "supérieur", le manipulteur à besoin de vous "écraser/diminuer".

lundi 6 avril 2009

Firebug - Debugger pour Firefox

FireBug est un debuggeur JavaScript excessivement riche.
Par ailleurs, ce n'est pas la première fois que j'en entends parler.
Cette fois ci, je peux même relayer un slide provenant d'OpenJS.


Son seul désavantage est d'être un peu lourd et donc de ralentir FireFox.
Pour plus d'information, voir la page d'accueil de FireBug, les nombreuses fonctionnalités y sont décrites.
Pour installer FireBug sur FireFox 3.0.

Source:  cet article sur OpenJS.

samedi 4 avril 2009

Mono 2.4 et Mono Develop 2.0

La nouvelle mouture du compilateur Mono 2.4 est finalement disponible.
L'une des principales avancées de Mono 2.0 est le support de C# 3.

La sortie de Mono 2.4 s'accompagne également de la sortie de MonoDevelop 2.0.
Comme déjà précisé dans d'autres articles, MonoDevelop a été profondément modifié.
Parmis ses avancées, il faudra retenir:
  • Le support de C# 3
  • L'intelliSense et code completion.
  • Un nouvel éditeur XML.
  • un débuggeur (enfin).
Plus d'informations:

vendredi 3 avril 2009

Fluent Interface - Xml Builder

Juste queqlue petits mots pour relater une méthode de programmation à mon sens bien utile.
Cette méthode s'appelle Fluent Interface programming.

En gros, le but est de créer une interface de manipulation IConfigurationFluent dont chacune des fonctions retourne une référence vers cette interface.
Il est ainsi possible d'appliquer, à la chaine, des appels aux méthodes. Cela s'avère bien pratique lorsque l'on manipule des informations.

Voici, ci-dessous, deux exemples en C# (un avec une interface Fluent, l'autre sans). Il n'est pas bien difficile d'évaluer l'élégance de programmation de l'interface Fluent.
public static void Main(string[] args)
        {
            //Exemple standard - Sans interface Fluent 
            IConfiguration config = new Configuration();
            config.SetColor("blue");
            config.SetHeight(1);
            config.SetLength(2);
            config.SetDepth(3);

            //Exemple Utilisant l'interface Fluent
            IConfigurationFluent config = 
                  new ConfigurationFluent().SetColor("blue")
                                           .SetHeight(1)
                                           .SetLength(2)
                                           .SetDepth(3);
        }

En autre, l'auteur de ce billet (qui n'est autre que Primoz Gabrijelcic, le  créateur de GpSynch) a utilisé cette méthode de programmation pour créer un objet Xml Builder.
Ainsi construite sur l'interface IGpFluentXmlBuilder, la classe de Primoz permet de créer un document XML aussi facilement que ça:
xmlWsdl := CreateFluentXml
    .AddProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"')
    .AddChild('definitions')
      ['xmlns',           'http://schemas.xmlsoap.org/wsdl/']
      ['xmlns:xs',        'http://www.w3.org/2001/XMLSchema']
      ['xmlns:soap',      'http://schemas.xmlsoap.org/wsdl/soap/']
      ['xmlns:soapenc',   'http://schemas.xmlsoap.org/soap/encoding/']
      ['xmlns:mime',      'http://schemas.xmlsoap.org/wsdl/mime/']
      ['name',            serviceName]
      ['xmlns:ns1',       'urn:' + intfName]
      ['xmlns:fs',        'http://fab-online.com/soap/']
      ['targetNamespace', 'http://fab-online.com/soap/']
      .AddChild('message')['name', 'fs:' + baseName + 'Request'].Anchor(nodeRequest)
      .AddSibling('message')['name', 'fs:' + baseName + 'Response'].Anchor(nodeResponse)
      .AddSibling('portType')['name', baseName]
      .Here
        .AddChild('operation')['name', baseName]
          .AddChild('input')['message', 'fs:' + baseName + 'Request']
          .AddSibling('output')['message', 'fs:' + baseName + 'Response']
      .Back
      .AddSibling('binding')
      .Here
        ['name', bindingName]
        ['type', 'fs:' + intfName]
        .AddChild('soap:binding')
          ['style', 'rpc']
          ['transport', 'http://schemas.xmlsoap.og/soap/http']
          .AddChild('operation')['name', baseName]
            .AddChild('soap:operation')
              ['soapAction', 'urn:' + baseName]
              ['style', 'rpc']
            .AddSibling('input')
              .AddChild('soap:body')
                ['use', 'encoded']
                ['encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/']
                ['namespace', 'urn:' + intfName + '-' + baseName]
              .Parent
            .AddSibling('output')
            .AddChild('soap:body')
              ['use', 'encoded']
              ['encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/']
              ['namespace', 'urn:' + intfName + '-' + baseName]
      .Back
      .AddSibling('service')['name', serviceName]
        .AddChild('port')
          ['name', portName]
          ['binding', 'fs:' + bindingName]
          .AddChild('soap:address')['location', serviceLocation];

Pour avoir moi-même écrit des routines de manipulation XML, je trouve cette approche très séduisante.
J'encourage vivement la lecture de son article.

mercredi 1 avril 2009

Afficher du code dans Blogger

Voici une classe CSS permettant d'ajouter assez aisément du code-source dans un article blogger.
Pour cela, il suffit de modifier votre modèle Blogger pour ajouter le style suivant.

pre.escaped {
background-color: #fff5bf; 
display: block;
font-family: Courier New, monospace;
font-size: 100%;
hasLayout: -1;
overflow: auto;
overflow-x: auto;
overflow-y: auto;
padding: 0px 0px 1.33em;
padding-bottom: 1.33em;
white-space: pre;
}

Pour utiliser ce modèle, il suffit de passer en "modifier code Html" et d'insérer le dit code dans un tag "pre" utilisant la classe "escaped".
N'oubliez pas de modifier tous les > et < par &gt; et &lt;.
<pre class="escaped"> ... un peu de code ... </pre>

Les data-types TimeStamp et RowVersion pour Sql Serveur

Définition de TimeStamp
Le type de donnée TimeStamp n'a absolument rien avoir avec le temps (pour stocker des informations relatives à la date et l'heure, utilisez plutôt le type DateTime).
Il s'agit d'un compteur a valeur unique géré par SQL Serveur lui-même.
TimeStamp est un compteur HexaDécimal de 8 bytes et il existe un compteur par DB.

Les champs TimeStamp ne doivent pas être formellement assignés, SQL Serveur s'occupe seul de mettre à jour ce champs lorsqu'un enregistrement est inséré (insert) ou mis-à-jour (update).
Puisque les champs TimeStamp sont automatiquement modifiés lors des updates, ces champs TimeStamp permettent facilement:
  • De suivre les modifications d'un enregistrement.
    Ex: Une signature électronique correspondant à un TimeStamp particulier d'un enregistrement.
  • De distinguer les différentes versions d'un même enregistrement.
    Ex: référencement d'une version particulière de d'un enregistrement dans une table d'audit (stockant toutes les versions du dit enregistrement).
Si SQL server génère la valeur du TimeStamp, cette valeur est assurée d'être unique dans la DB.
Il n'est pas possible d'assigner soi même une valeur arbitraire à ce champ.

Utiliser RowVersion au lieu de TimeStamp
Pour éviter toute ambiguité, il est préférable d'utiliser le type RowVersion.
Ce dernier fonctionne exactement comme TimeStamp (et utilise par ailleurs le même compteur).

Exemple pratique
CREATE TABLE sales2(
  RowID int not null,      
  SALESDATE     DATETIME      NOT NULL,
        RVersion    RowVersion 
);
GO

INSERT INTO SALES2 (RowID,SALESDATE) VALUES (1,'October 10, 2005');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (2,'November 10, 2005 10:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (3,'December 6, 2005 11:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (4,'January 5, 2006');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (5,'02/07/2006');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (6,'03/08/2006 14:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (7,'04/06/2006 15:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (8,'20060504');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (9,'20060606 17:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (10,'20060706 19:01:01');
GO

select * from sales2

update sales2
set SALESDATE = '20090104 01:01:01'
where rowID=5

select * from sales2


Petites informations utiles

1) Il est possible d'obtenir la valeur courante de TimeStamp (et forcément de RowVersion) en utilisant la requête SQL suivante:
select @@dbts as 'TimeStamp current value';

2) Il est possible de stocker une copie d'un TimeStamp/RowVersion (ex: pour les tables d'audit). Dans ce cas, veillez à utiliser le data type BigInt (utilisant également 8 bytes pour stocker ses valueurs).


Référence: The "TimeStamps and MS SQL Server" article

Papier Musique à imprimé

Je viens de trouver deux sites permettant d'imprimer directement du papier musique.