Technique

Ce que j'apprends au jour le jour...

Fil des billets - Fil des commentaires

mardi 10 juin 2008

avisynth et ffmpeg

FFmpeg par l'exemple et utilisation d'avisynth sont deux articles de référence pour utiliser ces 2 outils.

mercredi 17 octobre 2007

diagrammes de bases de données

Il y a un outil open source encore mieux que visio et powerdesigner réunis car il est gratuit!
Ca s'appelle fabforce designer et ça marche sur mysql, mssql oracle et autres db2.
Telecharger ici

mardi 8 mai 2007

SQL Server 2005 - au coeur de la bête

Comme dirait Patrick G., "c'est pas gagné!"...
Bon alors quand on renomme une procédure dans SQL Management Studio, le nom est modifié dans sys.objects, mais la définition n'est pas modifiée dans sys.sql_modules. Ca fait que lorsqu'on fait un transfert par SSIS, si par malheur on transfère cette procédure renommée, on va avoir des problèmes, voire une procédure dupliquée, d'où crash de SSIS...

lundi 30 avril 2007

reindexer toutes les tables SQL server

exec sp_msforeachtable @command1="print'réindexation de ?' dbcc dbreindex ('?')"

dimanche 15 avril 2007

SQL Server 2005 - trucs en vrac

On n'utilise pas assez le motclé case en TSql. En particulier pour les tris...

Pour voir si un utilisateur est sysadmin: SELECT is_srvrolemember('sysadmin')

Le XML:
SELECT table.col1 'noeud@id', table.col2 'noeud/ssnoeud' FOR XML Path('   ')
A l'inverse, il y a une méthode nodes pour requêter un doc xml:
DECLARE MYDATA XML
SET MYDATA = 'bla bla xml'
SELECT XMLColumn.value('noeud' ou 'noeud/@' ou 'noeud/noeud', datatype) 'col1', ... FROM @MYDATA.nodes('requête Xpath de sélection') resultTable (XMLColumn)

XQuery: select @MYDATA.query('//dornano[@valeur > 10])

Les fonctions
Elles doivent être déterministes. Elles ne peuvent rien modifier dans la base de données. Elles peuvent retourner une table.

Les procédures stockées peuvent être écrite en CLR (sp_configure 'clr enabled', '1' ). Mais je ne recommande de l'utiliser qu'en cas de calculs sévères, sinon cela va être très lent...

On n'emploie pas souvent non plus la syntaxe: INSERT INTO <nom table> default values

Il y a maintenant en TSQL le try catch avec BEGIN TRY et END TRY

Modification avec offset sur un champ varchar(max)
UPDATE matable SET macol.WRITE (valeur, offset,longueur)

Les champs UPDATETEXT et WRITETEXT deviennent déconseillés.

dimanche 8 avril 2007

Les schémas XSD

Ils sont plus puissants qu'une DTD pour décrire des documents.
Les catégories sont
  • Un élément racine, xs:schema
  • 3 éléments de déclaration: xs:element, xs:attribute, xs:notation
  • 8 éléments de type: xs:complexContent, xs:complexType, xs:extension, xs:list, xs:restriction, xs:simpleContent, xs:simpleType, xs:union
  • 7 éléments de modèles de contenu: xs:all, xs:any, xs:anyAttribute, xs:attributeGroup, xs:choice, xs:group, xs:sequence
  • 3 éléments de composition externe: xs:import, xs:include, xs:redefine
  • 12 facettes pour types simples: xs:enumeration, xs:fractionDigits, xs:length, xs:max|minExclusive, xs:max|minInclusive, xs:minLength, xs:pattern, xs:totalDigits, xs:whiteSpace
  • 3 éléments de doc: xs:appinfo, xs:annotation, xs:documentation
Un bon exemple de Schéma est celui auquel je contribue actuellement avec le groupe AFNOR pour le LOMFR. La dernière version est mise en ligne sur http://www.cndp.fr/standards/metadonnees/outils/lomfr/lomfr.xsd

Il existe quelques types prédéfinis: anyURI, boolean, dateTime, byte, duration, ID, IDREF, integer, language, name, string...
complextype indique que l'élément a des attributs et/ou des sous-éléments.
simpleContent indique que le contenu de l'élément est un type simple
On peut regroper des attributs similaires avec attributeGroup. attribute group ref="..." pour l'appel et attributeGroup name="..." pour la déclaration.
Les schémas et espaces de nom
  • Dans le doc:
    Faire pointer xmlns: sur le W3c, xsiSchemaLocation="mon_uri URI_du_xsd" xmlns:"mon_uri"
  • Dans le schéma:
    <xs:schema xmlns:xs="le W3c" targetNameSpace="mon_uri" xmlns:local="monURI" (pour les ref locales)>
    elementFormDefault="qualified" AttributeFromDefault"qualified" (vérifient que élément et attrbiuts déclarés localement sont vérifiés par un espace de nom).
mixed: il existe des données textuelles dans le corps de l'élément
sequence: impose un ordre aux éléments
choice: permet d'énumérer des éléments
all: vérifie que les éléments existent sans contrôles leur ordre
group: déclare des séquences d'éléments pouvant se répeter dans le document xml.

Schémas externes
include inclut le schéma comme si totu était dans le même fichier
import: permet d'importer des schémas extérieurs (ex: w3c)

extension et restriction: permet d'étendre des types existants selon un mode ressemblant à la programmation objet. On utilise pour cela xsi:type"le_type_restreint_ou_etendu"
L'attribut final= #all|extension|restriction est l'équivalent de sealed en C#.

Unicité
on utilise unique et key (idem que unique sauf que les valeurs sont obligatoires)

mardi 3 avril 2007

Quelques subtilités de XML

xi:include permet de combiner différents docs xml bien formés. L'élément xinclude possède un attribut href qui pointe sur le fichier xml. Les entêtes xml du fichier ne sont pas inclues. Si on rajoute l'attribut parse="text", le document inclu n'est pas analysé. On peut avoir un attribut Xpointer pour charger une partie du fichier xml uniquement.
xi:fallback est un sous élément de xi:include. Il indique ce qu'il faut faire si le xi:include ne marche pas.

Le formatage:
  • XSL-FO: document xml à la syntaxe un peu barbare. Permet de générer un pdf. xsl-fo permet un formatage très précis, des notes de fin de pages, etc.
  • CSS: s'adapte parfaitement pour le web. Il faut rajouter la ligne <xml-stylesheet type="text/css" href="dornano.css" ?>
RDDL (Ressource Directory Description Language:
C'est une application xml utilisée pour décrire des applications xml identifiées par les url d'un espace de nom.
RDDL se présentera sous la forme d'un fichier XHTML qui inclut des tags rddl:ressource qui sont des xlink pointant sur une ressource relative à ce que le docuiment rddl décrit.

XML-RPC:
La requête se présente sous la forme methodCall / methodName / params / values
La réponse sous la forme methodResponse / params / values

SOAP
C'est un webservice décrit par un doc WSDL (Web Service Ressource Langiage) qui est localisé dans un annuaire UDDI (Universal Description Discovery and Integration)

Astuce: si les balises d'une application xml ont vocation à être inclues dans d'autres applicatiojns (ex: LOMFR dans OAI), il faut spécifier elementFormDefault="qualified" (et éventuellement attributFormDefault="qualified")

lundi 2 avril 2007

nouveautés de VS 2005

On peut créer un diagramme entité relation du projet avec les différentes classes. Cela permet de créer automatiquement les classes et les propriétés.

Côté design, les master pages permettent de mettre en commun:
  • la structure
  • le design
  • l'ergonomie
  • les traitements
  • les éléments graphiques non modifiés
  • les contrôles spécifiques
Une masterpage contient au moins un contrôle ContentPlaceHolder contenant des thèmes (css et skin: ImageButton).
On met dans la directive de la page:
<% MasterEnableTheming = "true" blablabla... %>
Pour l'appeler:
  • <%@ MasterPageFile="~/dornanomasterpage.master" blablabla...%>
  • rajouter un contrôle <%asp:content> pour chaque ContentPlaceHolder et l'attribut ContentPlaceHolderID correspondant de la page master
On peut aussi créer directement une page dérivant de masterpage avec l'interface de création
Ces masterpages sont intéressantes pour gérer des pages popup

La gestion du mail
nouvelle classe System.Net.Mail d'où on dérive Smtpclient, MailMessage et MailAccess

dimanche 25 mars 2007

Xlink et Xpointer

Les Xlink définissent des liens.
L'attribut type le plus utilisé est simple.
On y rajoute l'attribut href, qui est l'URI de la ressource liée.
Puis l'attribut optionnel linkshow
  • new : nouvelle fenêtre
  • replace : remplace le doc actuel
  • embed : inclut une image dans la ressource courante
  • other : quelque chose de différent...
  • none : rien (pourquoi le spécifier alors?)

Puis l'attribut optionnel activate
  • onload : lien suivi immédiatement
  • onrequest : lien suivi sur demande
  • other | none : idem que ci-dessus
En plus de la valeur simple de l'attribut type, on trouve les valeurs:
  • locator
  • extended
  • arc
  • title
  • ressource
Si le type = locator (ressource multiples) on spécifie l'attribut xlink:label pour chaque lien.
Si le type = arc on spécifie xlink:from et xlink:true ainsi que l'attribut optionnel title.
Si le type = ressource, on spécifie xlink:label


Les Xpointer sont basés sur Xpath en y rajoutant les points et les régions.
Par exemple on pointera sur le premier élément nom d'un document. Cela donne xlink:href="http://d-ornano.com/toto.xml#xpointer(//nom[position()=1])"

Pour définir des points on utilise start-point(noeud) et end-point(noeud)
Pour définir des régions (étendues de données textuelles entre 2 points), on définit range().

samedi 24 mars 2007

Xpath

C'est un langage non xml pour identifier des parties de documents xml. Il indique les noeuds par position, position relative, type ou contenu
XSLT et Xpointer utilisent Xpath pour sélectionner respectivement un élément ou un point.

Il y a 7 types de noeuds:
  1. racine
  2. élément
  3. texte
  4. attribut
  5. commentaire
  6. instruction de traitement
  7. espace de nom
match= "/" : noeud racine
comment() : commentaire
text() : noeud de texte enfant direct

Les jokers:
  • * : tout noeud d'élément. Ex svg:* : tous les éléments de l'espace de nom svg
  • node() : tous les noeuds
  • @* : noeuds d'attribut
  • | : ou
Localisation:
  • / : chemin absolu
  • // : chemin relatif
  • . : noeud contextuel
  • .. : noeud parent
Un prédicat sélectionne un sous-ensemble.
Ex: <xsl:apply-templates select="//element[.='value']"/>
<xsl:apply-templates select="//element[@id=8]"/>
and et or sont les opérateurs logiques des prédicats.

La notation abrégée ci-dessus permet de parcourir child|parent|self|attribute|descendant-or-self.
On peut aussi utiliser une localisation non-abrégée
  • ancestor : tous les ancètres
  • following-sibbling : frères cadets
  • preceding-sibling : frères ainés
  • following : noeuds suivants
  • preceding : noeuds précédents
  • namespace : tous les espaces de nom dans la portée du noeud contextuel
  • descendant : tous les descendants
  • ancestor-or-self : ancètre ou soi-même
Ex: <xsl:apply-templates select="descendant::noeud"/>

Les fonctions Xpath
Sur un ensemble de noeuds:
count(//nom) :nombre d'éléments nom
position() : cardinalité de l'élément
id('mca1') pointe sur l'id unique mca1
string() = xsl :value-of()
start-with('ornano','or')=true
contains('mca','ca')=true
substring-before('dd/mm/yy','/')='dd'
substring-after('dd/mm/yy','/')='yy'
substring('dd/mm/yy',4,2)='mm'
substring('dd/mm/yy',7)='yy'
string-length('ornano')=6

fonction booléennnes
not() : inverse
boolean() : convertit en booléen


fonction nombres<br/> number() : conversion
round(3,1)=floor(3,1)=3
ceiling(3,1)=4

vendredi 23 mars 2007

SQL server 2005 la suite. Des conséquences sur .net

Text et ntext deviennent obsolètes au profit de (n)varchar(max)
De même image est remplacé par varbinary(max)

Le driver SqlNativeClient permet une connexion optimisée à sqlserver 2005

Enfin il est possible d'avoir de multiples recordsets pour une même connexion en .net
Pour ce faire, il faut mettre l'option MultipleActiveResultSets = true dans la chaîne de connexion

Si l'on veut être alerté lorsqu'un dataset est modifié sur la base d'origine, il faut activer l'événement depend_OnChange.

jeudi 22 mars 2007

SQL server 2005 premières nouveautés

Il existe maintenant un outil de configuration de la surface d'exposition qui détermine "quoi" est accédé par "qui".
L'utilitaire sac.exe en ligne de commande permet d'importer exporter cette configuration.

Top fonctionnalité: après avoir modifié la structure en mode graphique, on peut générer le script TSQL.

Des projets type Visual Studio permettent de grouper les requêtes (efficacement?).

Les modèles permettent de faire plein d'opérations élémentaires "for dummies". Possibilité d'instancier les variables par défaut facilement.

Profiler: on peut maintenant l'exécuter en parallèle avec l'analyseur de performances.
Le fichier de trace est récupéré par l'assistant paramétrage.


Sqlcmd remplace le vieux osql.

mardi 20 mars 2007

Comment le parseur détermine le code de caractères XML

  • Le parseur regarde les 2 premiers octets #xFEFF ou #xFFFE pour déterminer si c'est de l'UTF16
  • Si le fichier commence par #x3C3F7860 (<?xm) alors c'est de l'UTF8 (ou de l'ascii)

namespaces en XML

un namespace sert à 2 choses:
  1. Distinguer les éléments et les attributs ayant le même nom mais issus de vocabulaires différents
  2. Grouper les éléments et les attributs relatifs à une même application xml

Tout ce qui commence par xml est implicitement rattaché à xml. Donc xml* sont des préfixes réservés.
Les espaces de nom sont indépendants des DTD et peuvent être utilisés dans des documents valides ou pas.
Une fois déclaré dans un élément, l'espace de nom est automatiquement affecté à ses sous-éléments. Il faut préfixer les sous éléments par un autre espace de nom pour qu'ils en fassent partie.

Il faut utiliser l'attribut xmlns="http://www.monespacedenom.com/monespace" pour le namespace par défaut.
On utilisera xmlns:html="http://namespacepourhtml.org/blabla" puis l'élément <html:table/> par exemple.

vendredi 16 mars 2007

Ado.net

les objets ado.net
  • Connection: Ouvre une connexion vers une source de données spécifique
  • Command: Exécute une commande sur une source de données
  • DataReader: Lit un flux de données à partir d'une source de données en mode connecté. Le mode d'accès est en lecture seule avec un curseur en avant seulement.
  • DataSet: Représente un ensemble de données en mode déconnecté. Il peut être constitué de plusieurs tables ainsi que des relations et contraintes existant entre elles.
  • DataAdapter: Remplit un DataSet et répercute les mises à jour dans la source de données.
Exemple avec sqlserver (using System.Data.SqlClient;):

string conn = "User ID=monuser;password=monpass;Initial Catalog=mabase;
Data Source=monserveur.com;Packet Size=4096";


string strSQL = "select * from mavue"; 
SqlCommand DBCmd = new SqlCommand(strSQL, this.Conn); 
SqlDataReader rs; 
rs = DBCmd.ExecuteReader(); 
while (rs.Read()) 
	{ 
	this.urlid=(int)rs["urlid"];
        ....
        }

samedi 10 mars 2007

Aide mémoire sur les DTD

Histoire de se rafraichir la mémoire après quelques années, un petit memento sur les DTD.
Mettre standalone="yes" dans l'entête xml permet déjà de ne pas utiliser de dtd (pas recommandé).

Déclaration d'élément:
<!ELEMENT nom_élément (contenu)>
contenu peut être:
  • #PCDATA : n'importe quoi sauf un sous élément
  • elt1, elt2, ... : une suite de sous éléments ordonnée
  • un mix des deux précédents séparés par des |
  • EMPTY : pas de contenu ni de sous-éléments (ex: balise img en HTML)
  • ANY : n'importe quoi
A noter que les sous-éléments ont les suffixes suivants:
  • +: 1..n occurences
  • ?: 0..1 occurence
  • *: 0..n occurences
  • aucun: 1 et 1 seule occurence

Déclaration d'attribut:
<!ATTLIST nom_élément nom_attribut type_attribut valeur>
valeur:
  • #IMPLIED : optionnel
  • #REQUIRED : obligatoire
  • #FIXED : valeur fixe et non modifiable
  • littéral : la valeur par défaut entre guillemets
type_attribut:
  • CDATA : chaîne de caractères
  • NMTOKEN : alphanumérique + ", : . - _ "
  • NMTOKENS : NMTOKEN séparés par des espaces
  • Enumération: liste des valeurs possibles
  • ID: alphanumérique unique. Commence par un caractère ou _
  • IDREF: chaîne de caractères référençant un ID
  • IDREFS: liste d'IDREF
  • ENTITY: entité non analysée
  • ENTITIES : liste d'ENTITY
  • NOTATION: référence une notation système

Déclaration d'entité:
<!ENTITY nom_entite chaine>
On affiche ensuite la chaîne en appelant &nom_entite;

mardi 6 mars 2007

Le contrôle gridview en ASP 2.0

Il remplace avantageusement le datagrid qui devient "deprecated".
La source de données est liée au gridview via la propriété datasourceID.
Beaucoup moins de code à taper: quelques exemples de syntaxe:
  • PageSize
  • AutoGenerateColumns
  • AutoGenerateEduitButton

upgrade de SQL SERVER 2000 vers SQL SERVER 2005

Après l'upgrade faire un dbcc updateusage et sp_updatestats car les index ne sont pas géré de la même façon.
POur la réplication, à noter que SSMS ne peut pas initialiser une réplication de type snapshot à partir d'un backup. Il faut se taper le script à la main.

vendredi 2 mars 2007

.Net framework 2.0 et 1.1

On peut faire cohabiter les 2 sur un même serveur web. Il suffit de faire tourner les répertoires virtuels ou sites dans des pools d'applications différents.
Testé sur 2003 server...