-
XSL/FO et .NET : Toutes les explications nécessaire pour générer un PDF en XSL-FO depuis ASP.NET en utilisant fop.jar et en passant par IKVM.
vendredi 3 juillet 2009
Blogmarks du 02/07/2009
Par Michel le vendredi 3 juillet 2009, 07:51
jeudi 2 juillet 2009
Blogmarks du 01/07/2009
Par Michel le jeudi 2 juillet 2009, 08:30
-
What is Unit Testing? : Un article qui explique ce que sont les tests unitaires et pourquoi il faut les utiliser.
-
OpenForum - A Free Forum for MVC Applications : OpenForum is a forum that can easily be plugged into any MVC application with very little effort.
jeudi 25 juin 2009
Les propriétés automatiques du c#
Par Michel le jeudi 25 juin 2009, 13:34
Avec le compilateur de C# 3.0, il est possible d'avoir des propriétés automatiques. En fait, c'est tout simplement une nouvelle façon de déclarer les propriétés qui permet d'avoir un code source beaucoup plus concis.
Jusqu'à maintenant, quand j'ai besoin de gérer des propriétés dans une classe en C# 1.1, j'écris plus ou moins le code suivant :
private int _Id;
private string _Nom;
private string _Prenom;
public property int Id {
get { return _Id; }
set { _Id = value; }
}
public property string Nom {
get { return _Nom; }
set { _Nom = value; }
}
public property string Prenom {
get { return _Prenom; }
set { _Prenom = value; }
}
Avec Visual Studio 2008 et C# 3.0, tout ça c'est du passé et grâce aux propriétés automatiques je pourrai à l'avenir ramener ça à 3 lignes de codes :
public property int Id { get; set; }
public property string Nom { get; set; }
public property string Prenom { get; set; }
Dans ce cas, c'est le compilateur qui va faire le boulot à ma place (y'a rien à faire !) et générer peu ou prou tout le code que je tapais auparavant moi-même.
Par conséquent, si on regarde ça du point de vue du code compilé, ce n'est pas du tout la même chose que de se contenter de déclarer de simples variables publiques :
public int Id; public string Nom; public string Prenom;
Ma conversion à l'utilisation de propriétés plutôt que des variables publiques remonte à tellement longtemps que j'ai un peu oublié pourquoi j'avais trouvé les propriétés plus mieux que les variables. Ce qui fait qu'aujourd'hui j'ai un peu de mal à voir ce que ces nouvelles propriétés automatiques m'apportent réellement de plus que de bêtes variables publiques... (et apparemment je ne suis pas le seul)
Ou alors, à la rigueur, ce qui est plus intéressant c'est qu'avec cette méthode il est possible définir des propriétés en lecture seule (voire en écriture seule ?), ce que je ne peux pas absolument pas faire avec des variables. Pour cela, il ne suffit pas d'omettre le "set;" (ça aurait été trop simple), mais il faut le rendre "private" afin qu'il ne soit pas visible et donc utilisable en dehors de la classe :
public property int Id { get; private set; } // lecture seule
public property string Nom { get; set; }
public property string Prenom { get; set; }seule
Dans ce cas, je peux définir la propriété "Id" dans tout le code source à l'intérieur de ma classe, et par contre elle n'est pas modifiable par tout le code en dehors de cette classe.
mercredi 24 juin 2009
Une nouvelle boite de recherche
Par Michel le mercredi 24 juin 2009, 08:49
Jusqu'à présent, pour gérer la recherche sur un site Altrr-Press, il était possible de créer une boite de type Google Search. Ce type de boite employait l'interface SOAP de Google Search pour obtenir le résultat d'une recherche effectuée par Google. Dans la pratique, il y a tellement peu de sites Altrr-Press qui utilise ce type de boite qu'il aurait aussi bien pu passer à la trappe comme cela avait été le cas pour les boites Msn Search et Yahoo Search.
Ca faisait quelque temps que je savais que Google allait mettre définitivement fin au support de son interface SOAP à partir du 31 août, mais étant donné le peu d'utilité que j'en avais, j'avais un peu de mal à me plonger dans leur API de recherche en AJAX. Heureusement pour moi, ce que Google prend d'une main, il le redonne de l'autre et grâce aux tous nouveaux Google Web Elements, je vais pouvoir faire évoluer mon CMS sans trop me casser la tête.
Pour commencer, rendez-vous sur la page des Google Web Elements ou il suffit de cliquer sur le lien "Custom Search" pour obtenir immédiatement le code javascript à utiliser pour insérer une boite de recherche sur son site. Etant donné que que je cherche à disposer d'un système de recherche à l'intérieur de mon site exclusivement, cela me convient et je peux donc utiliser ce code tel quel :
<!-- Google Custom Search Element -->
<div id="cse" style="width:100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1');
google.setOnLoadCallback(function(){
new google.search.CustomSearchControl().draw('cse');
}, true);
</script>
Si je le souhaite, Google me propose aussi d'utiliser ma clé Google AdSense pour valoriser les recherches effectuées sur mon site. Pour cela, il suffit de remplacer le choix "Automatically search my site" par "Search my site and use AdSense for Search". Le code javascript proposé est alors légèrement modifié pour faire apparaitre ma clé Google AdSense. avec la ligne suivante :
<!-- Google Custom Search Element -->
<div id="cse" style="width:100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1');
google.setOnLoadCallback(function(){
var cse = new google.search.CustomSearchControl();
cse.enableAds('pub-5475403929650645');
cse.draw('cse');
}, true);
</script>
Dans la pratique, avec Altrr-Press il est tout de même préférable de modifier la ligne de code avec la clé en dur de façon à utiliser la macro qui renvoie la clé enregistrée globalement au niveau du site internet :
cse.enableAds('[%AP.AdSenseKey%]');
C'est vraiment pas compliqué à faire et ça marche. Le seul petit problème, c'est que ça ouvre les liens dans une nouvelle fenêtre !!!
Finalement je vais quand même devoir faire un détour par les APIS AJAX de Google et plus particulièrement l'API AJAX consacrée à la recherche qui va me permettre de résoudre ce léger problème. Et après quelques petites recherches, je tombe enfin sur ce qu'il me faut, à savoir la méthode setLinkTarget(linkTarget).
This method is called to set the link target used for links embedded in search results. The default value is google.search.Search.LINK_TARGET_BLANK which specifies that links will open in a new browser window. When this method is called, a search control wide link target setting is established. This effects all searchers that are currently attached to the search control as well as all searchers that are subsequently added to the control.
Et selon la documentation de référence de Google, linkTarget peut prendre une des valeurs suivantes :
- google.search.Search.LINK_TARGET_BLANK - links will open in a new window, e.g., <A href=... target=_blank ...>
- google.search.Search.LINK_TARGET_SELF - links will open in the same window and frame, e.g., <A href=... target=_self ...>
- google.search.Search.LINK_TARGET_TOP - links will open in the topmost frame, e.g., <A href=... target=_top ...>
- google.search.Search.LINK_TARGET_PARENT - links will open in either the topmost frame, or replace the current frame, e.g., <A href=... target=_parent ...>
- anything-else - links will open in the specified frame or window, e.g., <A href=... target=anything-else ...>
Après quelques essais, notamment à l'aide de l'excellent Code Playground et je finis par obtenir le code javascript suivant :
<!-- Google Custom Search Element -->
<div id="cse" style="width:100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1');
google.setOnLoadCallback(function(){
var cse = new google.search.CustomSearchControl();
cse.enableAds('[%AP.AdSenseKey%]');
cse.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
cse.draw('cse');
}, true);
</script>
Comme je suis un peu pointilleux, il me restait encore un détail mineur à régler : Google insère un lien libellé "Autres résultats »" juste après la pagination des résultats. Et quand on clique dessus (en pensant dans mon cas aller sur la page suivante des résultats), cela quitte le site et redirige sur une page chez Google qui reprend la même recherche. Ce n'est pas bien génant, mais j'ai quand même préféré cacher ce lien une ligne de CSS :
<style>.gsc-trailing-more-results {display:none !important;}</style>
Et donc, au jour d'aujourd'hui, pour placer une boite de recherche Google dans un site construit avec Altrr-Press, il suffit de copier / coller le code suivant dans une boite RawContent :
<!-- Google Custom Search Element -->
<div id="cse" style="width:100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1');
google.setOnLoadCallback(function(){
var cse = new google.search.CustomSearchControl();
cse.enableAds('[%AP.AdSenseKey%]');
cse.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
cse.draw('cse');
}, true);
</script>
<style>.gsc-trailing-more-results {display:none !important;}</style>
Avec en prime une démonstration en direct-live sur la nouvelle page de recherche pour le site de Saint-Privat.
lundi 22 juin 2009
Blogmarks du 19/06/2009
Par Michel le lundi 22 juin 2009, 10:34
-
Free online OCR : Un utilitaire de Reconnaissance Optique de Caractères en-ligne avec d'assez bons résultats (limité à 10 uploads par heure).
vendredi 19 juin 2009
Une fonction XSLT avec des paramètres
Par Michel le vendredi 19 juin 2009, 09:27
Jusque là, je connaissais déjà les "templates" qui me permettaient grosso-modo de structurer mes traitements XSLT en séparant en quelque sorte le "layout" de la page des traitements pour afficher les différents contenus :
<!-- Disposition générale du document -->
...
<fo:table-row height="27mm" margin-top="15mm">
<fo:table-cell>
<!-- Logo client -->
<xsl:call-template name="client-logo" />
</fo:table-cell>
<fo:table-cell>
<!-- Adresse client -->
<xsl:call-template name="client-adresse" />
</fo:table-cell>
</fo:table-row>
...
<!-- Affichage du logo du client -->
<xsl:template name="client-logo">
<fo:block>
<fo:external-graphic src="url('logo_client.jpg')" />
</fo:block>
</xsl:template>
<!-- Affichage de l'adresse du client -->
<xsl:template name="client-adresse">
<fo:block>
<xsl:value-of select="a:OrganizationName" />
</fo:block>
<xsl:for-each select="a:PostalAddress/a:DeliveryAddress/a:AddressLine">
<fo:block>
<xsl:value-of select="." />
</fo:block>
</xsl:for-each>
<fo:block>
<xsl:value-of select="a:PostalAddress/a:PostalCode" />
 <xsl:value-of select="a:PostalAddress/a:Municipality" />
</fo:block>
</xsl:template>
Et hier soir, j'ai appris un nouveau truc. Comme j'avais besoin d'afficher plusieurs fois des dates, je me suis retrouvé à faire du copier / coller du morceau de code suivant :
<fo:block>
<xsl:value-of select="concat(substring(a:DocumentInfo/a:DateRange/a:StartDate, 9, 2),
'/', substring(a:DocumentInfo/a:DateRange/a:StartDate, 6, 2),
'/', substring(a:DocumentInfo/a:DateRange/a:StartDate, 1, 4))" />
</fo:block>
Puis à chaque fois je devais remplacer "a:DocumentInfo/a:DateRange/a:StartDate" par "a:DocumentInfo/a:DateRange/a:EndDate" ou "a:DocumentInfo/a:PartialRange/a:ActualDate" ... Non seulement ce n'était pas très intéressant à faire, mais c'était surtout la porte ouverte à toutes les erreurs de frappe ou de copier / coller.
Heureusement pour moi, comme XSLT est quand même bien conçu, il est aussi possible de définir des templates avec des variables paramètres :
<xsl:template name="format-date">
<xsl:param name="d" select="0" />
<xsl:value-of select="concat(substring($d, 9, 2), '/', substring($d, 6, 2), '/', substring($d, 1, 4))" />
</xsl:template>
Ensuite, on peut appeler cette "fonction" XSLT en lui passant le paramètre de notre choix :
<xsl:call-template name="format-date">
<xsl:with-param name="d" select="a:DocumentInfo/a:DateRange/a:StartDate" />
</xsl:call-template>
C'est vrai que ça ne fait pas économiser beaucoup de saisie, mais c'est quand même un peu plus clair et beaucoup moins risqué.
D'autres exemples sur l'article Programmer avec XSLT de Victor Stinner.
jeudi 18 juin 2009
Blogmarks du 17/06/2009
Par Michel le jeudi 18 juin 2009, 09:43
-
System.Data.OracleClient Update : Oh mon dieu! Ils vont tuer System.Data.OracleClient.
mercredi 17 juin 2009
Blogmarks du 16/06/2009
Par Michel le mercredi 17 juin 2009, 09:42
-
Transforming Word Documents into the XSL-FO Format : Un article qui montre comment utiliser Word 2003 pour transformer un fichier Word au format XSLT-FO.
vendredi 12 juin 2009
Blogmarks du 11/06/2009
Par Michel le vendredi 12 juin 2009, 08:39
-
Free Web Performance Tools : This post is a quick overview of free performance tools available from Microsoft, Yahoo, Google, and IBM. It also contains a pointers to related articles that go deeper regarding the best practices and how the tools can help in identifying compliance to the best practices.
mercredi 10 juin 2009
Blogmarks du 09/06/2009
Par Michel le mercredi 10 juin 2009, 09:40
-
Git For Windows Developers : Une série d'articles qui expliquent comment utiliser Git quand on développe sous Windows
-
ASP.NET 4.0 and Visual Studio 2010 Web Development Beta 1 Overview : Présentation des nouvelles fonctionnalités du .NET Framework version 4.0 et de Visual Studio 10 (par rapport au .NET 3.5 et Visual Studio 2008)
vendredi 5 juin 2009
Ouvrir un document en dehors du navigateur
Par Michel le vendredi 5 juin 2009, 16:50
Quand on vient comme moi de changer de PC et que son nouveau Microsoft Internet Explorer a la facheuse habitude d'ouvrir les fichiers Word dans le navigateur plutôt que de lancer le Microsoft Word qui va bien, il ne faut pas hésiter à aller trifouiller dans le paramètres de l'explorateur de fichiers :
- cliquer sur le menu "Outils"
- choisr le sous-menu "Option des dossiers..."
- aller sur l'onglet "Types de fichiers"
- rechercher la ligne "DOC - Document Microsoft Word" (c'est dans l'ordre alphabétique)
- cliquer sur le bouton "Avancé"
- décocher "Parcourir dans une même fenêtre"
- valider en cliquent sur le bouton "OK"
- fermer la fenêtre "Option des dossiers" en cliquant sur le bouton "Fermer"
Pour faire bonne mesure et parce qu'on a rien à perdre, le mieux c'est ensuite de fermer les fenêtres de toutes les applications en cours, d'arrêter l'ordinateur puis de le redémarrer après avoir compté jusqu'à 5 (un, deux, trois, quatre et cinq).
Ou bien alors, avant d'en arriver à cette extrémité, on peut aussi en profiter pour répéter l'opération pour les fichiers Microsoft Excel, Adobe PDF, etcétéra...
Blogmarks du 05/06/2009
Par Michel le vendredi 5 juin 2009, 16:26
-
From Webforms to MVC : Le premier chapitre d'un livre qui explore le framework ASP.NET MVC du point de vue d'un développeur WebForm.
-
Page Speed : Page Speed is an open-source Firefox/Firebug Add-on. Webmasters and web developers can use Page Speed to evaluate the performance of their web pages and to get suggestions on how to improve them.
Blogmarks du 04/06/2009
Par Michel le vendredi 5 juin 2009, 08:02
-
MonoDevelop installer for Windows : Ce n'est pour l'instant qu'une pré-version, mais elle semble déjà suffisamment stable pour mériter un petit essai.
-
Search Engine Optimization Toolkit : Pour analyser le SEO d'un site selon une cinquantaine de règles (y compris un contrôle des balises incorrectes)
mardi 2 juin 2009
Blogmarks du 29/05/2009
Par Michel le mardi 2 juin 2009, 10:42
-
The overall goal is to allow developers to worry less about application "plumbing" and to spend most of their time on adding value for the client by focusing on the business logic and developing a rich user experience.
mercredi 27 mai 2009
Blogmarks du 26/05/2009
Par Michel le mercredi 27 mai 2009, 07:55
-
Supprimer Windows Search : Pour réussir à désinstaller Windows Search à coup sûr.
lundi 25 mai 2009
Blogmarks du 20/05/2009
Par Michel le lundi 25 mai 2009, 10:38
-
Tree Trim : This is a command line tool that trims your source code tree. It removes debug files, source control bindings, and temporary files.
vendredi 15 mai 2009
Blogmarks du 14/05/2009
Par Michel le vendredi 15 mai 2009, 08:13
-
Pex - Automated White box Testing for .NET : Pex finds interesting input-output values of your methods, which you can save as a small test suite with high code coverage. Pex performs a systematic analysis, hunting for boundary conditions, exceptions and assertion failures, which you can debug right away.
jeudi 14 mai 2009
Blogmarks du 13/05/2009
Par Michel le jeudi 14 mai 2009, 10:07
-
Shades of Blue : A free WordPress theme
jeudi 7 mai 2009
Blogmarks du 07/05/2009
Par Michel le jeudi 7 mai 2009, 16:54
-
Tutoriels ASP.NET MVC : La traduction "non officielle" de certain des tutoriels du portail MVC US.
-
Give Your Eyes a Treat : Méthode pour pouvoir utiliser la police Consolas dans les fenêtres DOS (invites de commande)
mardi 5 mai 2009
Blogmarks du 04/05/2009
Par Michel le mardi 5 mai 2009, 09:48
-
AtomSite : Plateforme de publication avec support de AtomPub
-
PicasaUploader : A simple tool for uploading photos to Google’s PicasaWeb online gallery
« billets précédents - page 1 de 21