<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>matizha.com &#187; Développement</title>
	<atom:link href="http://www.matizha.com/categories/developpement/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.matizha.com</link>
	<description>nothing in this world that's worth having comes easy.</description>
	<pubDate>Thu, 16 Apr 2009 14:46:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Gestion des sessions NHibernate</title>
		<link>http://www.matizha.com/2008/11/23/gestion-des-sessions-nhibernate/</link>
		<comments>http://www.matizha.com/2008/11/23/gestion-des-sessions-nhibernate/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 20:14:19 +0000</pubDate>
		<dc:creator>matizha</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[nhibernate]]></category>

		<guid isPermaLink="false">http://www.matizha.com/?p=441</guid>
		<description><![CDATA[La gestion des sessions est un aspect crucial pour tirer avantage de l&#8217;utilisation de NHibernate. Le problème vient du fait que la construction du SessionFactory qui gère les transactions et sessions de NHibernate est assez coûteuse. Il existe plusieurs stratégies pour gérer ce problème avec ASP.Net. Dave Byron propose une solution assez simple via un [...]]]></description>
			<content:encoded><![CDATA[<p>La gestion des sessions est un aspect crucial pour tirer avantage de l&#8217;utilisation de NHibernate. Le problème vient du fait que la construction du SessionFactory qui gère les transactions et sessions de NHibernate est assez coûteuse. Il existe plusieurs stratégies pour gérer ce problème avec ASP.Net. Dave Byron propose une <a title="Managing your NHibernate Sessions" href="http://davybrion.com/blog/2008/06/managing-your-nhibernate-sessions/">solution assez simple</a> via un pattern de Unit of Work. Toutefois, cette méthode nécessite également des connaissances des patterns de Depency Injection et de Inversion of Control.</p>
<p>C&#8217;est pourquoi celle que je présente ici est exactement celle proposée par Billy McCafferty dans son article <a title="NHibernate Best Practices" href="http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx">NHibernate Best Practices with ASP.Net</a>. La méthode utilise un pattern de Singleton dont l&#8217;implantation en C# est présentée sur <a title="Implementing the Singleton Pattern in C#" href="http://www.yoda.arachsys.com/csharp/singleton.html">cette page</a>. Un avantage de cette méthode est qu&#8217;elle fonctionnera que vous utilisiez ASP.Net ou bien les WinForms.</p>
<pre>
<pre class="syntax-highlight:c#:nogutter:nocontrols">using System.Runtime.Remoting.Messaging;
using System.Web;
using NHibernate;
using NHibernate.Cache;
using NHibernate.Cfg;

namespace NHibernateHelper
{
    /// &lt;summary&gt;
    /// Handles creation and management of sessions and transactions.  It is a singleton because
    /// building the initial session factory is very expensive. Inspiration for this class came
    /// from Chapter 8 of Hibernate in Action by Bauer and King.  Although it is a sealed singleton
    /// you can use TypeMock (http://www.typemock.com) for more flexible testing.
    /// &lt;/summary&gt;
    public sealed class NHibernateSessionManager
    {
        #region Thread-safe, lazy Singleton

        /// &lt;summary&gt;
        /// This is a thread-safe, lazy singleton.  See http://www.yoda.arachsys.com/csharp/singleton.html
        /// for more details about its implementation.
        /// &lt;/summary&gt;
        public static NHibernateSessionManager Instance {
            get {
                return Nested.NHibernateSessionManager;
            }
        }

        /// &lt;summary&gt;
        /// Initializes the NHibernate session factory upon instantiation.
        /// &lt;/summary&gt;
        private NHibernateSessionManager() {
            InitSessionFactory();
        }

        /// &lt;summary&gt;
        /// Assists with ensuring thread-safe, lazy singleton
        /// &lt;/summary&gt;
        private class Nested
        {
            static Nested() { }
            internal static readonly NHibernateSessionManager NHibernateSessionManager =
                new NHibernateSessionManager();
        }

        #endregion

        private void InitSessionFactory() {
            sessionFactory = new Configuration().Configure().BuildSessionFactory();
        }

        /// &lt;summary&gt;
        /// Allows you to register an interceptor on a new session.  This may not be called if there is already
        /// an open session attached to the HttpContext.  If you have an interceptor to be used, modify
        /// the HttpModule to call this before calling BeginTransaction().
        /// &lt;/summary&gt;
        public void RegisterInterceptor(IInterceptor interceptor) {
            ISession session = ContextSession;

                if (session != null &amp;&amp; session.IsOpen) {
                throw new CacheException(&quot;You cannot register an interceptor once a session has already been opened&quot;);
            }

            GetSession(interceptor);
        }

        public ISession GetSession() {
            return GetSession(null);
        }

        /// &lt;summary&gt;
        /// Gets a session with or without an interceptor.  This method is not called directly; instead,
        /// it gets invoked from other public methods.
        /// &lt;/summary&gt;
        private ISession GetSession(IInterceptor interceptor) {
            ISession session = ContextSession;

            if (session == null) {
                if (interceptor != null) {
                    session = sessionFactory.OpenSession(interceptor);
                }
                else {
                    session = sessionFactory.OpenSession();
                }

                ContextSession = session;
            }

            return session;
        }

        /// &lt;summary&gt;
        /// Flushes anything left in the session and closes the connection.
        /// &lt;/summary&gt;
        public void CloseSession() {
            ISession session = ContextSession;

            if (session != null &amp;&amp; session.IsOpen) {
                session.Flush();
                session.Close();
            }

            ContextSession = null;
        }

        public void BeginTransaction() {
            ITransaction transaction = ContextTransaction;

            if (transaction == null) {
                transaction = GetSession().BeginTransaction();
                ContextTransaction = transaction;
            }
        }

        public void CommitTransaction() {
            ITransaction transaction = ContextTransaction;

            try {
                if (HasOpenTransaction()) {
                    transaction.Commit();
                    ContextTransaction = null;
                }
            }
            catch (HibernateException) {
                RollbackTransaction();
                throw;
            }
        }

        public bool HasOpenTransaction() {
            ITransaction transaction = ContextTransaction;

            return transaction != null &amp;&amp; !transaction.WasCommitted &amp;&amp; !transaction.WasRolledBack;
        }

        public void RollbackTransaction() {
            ITransaction transaction = ContextTransaction;

            try {
                if (HasOpenTransaction()) {
                    transaction.Rollback();
                }

                ContextTransaction = null;
            }
            finally {
                CloseSession();
            }
        }

        /// &lt;summary&gt;
        /// If within a web context, this uses &lt;see cref=&quot;HttpContext&quot; /&gt; instead of the WinForms
        /// specific &lt;see cref=&quot;CallContext&quot; /&gt;.  Discussion concerning this found at
        /// http://forum.springframework.net/showthread.php?t=572.
        /// &lt;/summary&gt;
        private ITransaction ContextTransaction {
            get {
                if (IsInWebContext()) {
                    return (ITransaction)HttpContext.Current.Items[TRANSACTION_KEY];
                }
                else {
                    return (ITransaction)CallContext.GetData(TRANSACTION_KEY);
                }
            }
            set {
                if (IsInWebContext()) {
                    HttpContext.Current.Items[TRANSACTION_KEY] = value;
                }
                else {
                    CallContext.SetData(TRANSACTION_KEY, value);
                }
            }
        }

        /// &lt;summary&gt;
        /// If within a web context, this uses &lt;see cref=&quot;HttpContext&quot; /&gt; instead of the WinForms
        /// specific &lt;see cref=&quot;CallContext&quot; /&gt;.  Discussion concerning this found at
        /// http://forum.springframework.net/showthread.php?t=572.
        /// &lt;/summary&gt;
        private ISession ContextSession {
            get {
                if (IsInWebContext()) {
                    return (ISession)HttpContext.Current.Items[SESSION_KEY];
                }
                else {
                    return (ISession)CallContext.GetData(SESSION_KEY);
                }
            }
            set {
                if (IsInWebContext()) {
                    HttpContext.Current.Items[SESSION_KEY] = value;
                }
                else {
                    CallContext.SetData(SESSION_KEY, value);
                }
            }
        }

        private bool IsInWebContext() {
            return HttpContext.Current != null;
        }

        private const string TRANSACTION_KEY = &quot;nhibernate.context.transaction.key&quot;;
        private const string SESSION_KEY = &quot;nhibernate.context.session.key&quot;;
        private ISessionFactory sessionFactory;
    }
}</pre>
</pre>
<p>Un petite note: peu importe la méthode utilisée, si vous êtes dans un contexte Web, il faut généralement s&#8217;assurer que la méthode est <em>Thread-Safe</em>.</p>
<p>Une question demeure toutefois, quand doit-on créer les sessions et transactions et quand doit-on les fermer? La documentation suggère de mettre en oeuvre le pattern <a href="http://www.hibernate.org/43.html"><em>Open-In-Session-View</em></a> afin de mettre à profit les possiblités de <em>lazy-loading</em> de NHibernate. Billy McCafferty mentionnait dans son article:</p>
<blockquote><p>If you want to leverage NHibernate&#8217;s lazy-loading (which you most certainly will), then the Open-Session-in-View pattern is the way to go. (&#8221;Session&#8221; in this context is the NHibernate ISession&#8230;not the ASP.NET Session object.) Essentially, this pattern suggests that one NHibernate session be opened per HTTP request.</p></blockquote>
<p>Encore une fois, l&#8217;approche proposée est celle que je présente. Le pattern signifie qu&#8217;une session NHibernate doit être ouverte par requête HTTP. En asp.net, le plus simple pour accomplir cette tâche à mon avis est en effet de créer un IHttpModule. On crée la session au début de la requête et on la ferme à la fin. S&#8217;il y a des changements à effectués, ils seront engagés avant la fermeture de la session. S&#8217;il y a des erreurs, la transaction sera annulée et la session sera quand même fermée. Voici le code du module qui se veut assez simple.</p>
<pre>
<pre class="syntax-highlight:csharp:nogutter:nocontrols">using System;
using System.Web;

namespace NHibernateHelper.Modules
{
    /// &lt;summary&gt;
    /// Implements the Open-Session-In-View pattern using &lt;see cref=&quot;NHibernateSessionManager&quot; /&gt;.
    /// Assumes that each HTTP request is given a single transaction for the entire page-lifecycle.
    /// Inspiration for this class came from Ed Courtenay at
    /// http://sourceforge.net/forum/message.php?msg_id=2847509.
    /// &lt;/summary&gt;
    public class NHibernateSessionModule : IHttpModule
    {
        public void Init(HttpApplication context) {
            context.BeginRequest += new EventHandler(BeginTransaction);
            context.EndRequest += new EventHandler(CommitAndCloseSession);
        }

        /// &lt;summary&gt;
        /// Opens a session within a transaction at the beginning of the HTTP request.
        /// This doesn&#039;t actually open a connection to the database until needed.
        /// &lt;/summary&gt;
        private void BeginTransaction(object sender, EventArgs e) {
            NHibernateSessionManager.Instance.BeginTransaction();
        }

        /// &lt;summary&gt;
        /// Commits and closes the NHibernate session provided by the supplied &lt;see cref=&quot;NHibernateSessionManager&quot;/&gt;.
        /// Assumes a transaction was begun at the beginning of the request; but a transaction or session does
        /// not *have* to be opened for this to operate successfully.
        /// &lt;/summary&gt;
        private void CommitAndCloseSession(object sender, EventArgs e) {
            try {
                NHibernateSessionManager.Instance.CommitTransaction();
            }
            finally {
                NHibernateSessionManager.Instance.CloseSession();
            }
        }

        public void Dispose() { }
    }
}
</pre>
</pre>
<p>Voilà, il ne vous reste plus qu&#8217;à configurer le module http dans votre web.config et vous serez en mesure de gérer vos sessions NHibernate sans trop de problèmes.</p>
<p>Finalement, un simple exemple pour exécuter une requête via notre gestionnaire de session:</p>
<pre>
<pre class="syntax-highlight:csharp:nogutter:nocontrols">...
ISession session = NHibernateSessionManager.Instance.GetSession();
return session.Get&lt;T&gt;(id);</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.matizha.com/2008/11/23/gestion-des-sessions-nhibernate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les meilleures pratiques pour NHibernate</title>
		<link>http://www.matizha.com/2008/11/15/les-meilleures-pratiques-pour-nhibernate/</link>
		<comments>http://www.matizha.com/2008/11/15/les-meilleures-pratiques-pour-nhibernate/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 19:42:24 +0000</pubDate>
		<dc:creator>matizha</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[nhibernate]]></category>

		<guid isPermaLink="false">http://www.matizha.com/?p=417</guid>
		<description><![CDATA[J&#8217;utilise NHibernate depuis quelques années déjà. La grande majorité des projets en .net que je développe tirent profit de ce fantastique ORM. NHibernate est probablement le plus complexe des ORM, mais aussi le plus complet. Et avec l&#8217;abandon de LINQ 2 SQL par Microsoft, NHibernate est à mon avis le meilleur choix. D&#8217;autant plus que [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-437" title="nhlogosmall" src="http://www.matizha.com/wp-content/uploads/2008/11/nhlogosmall.jpg" alt="" width="300" height="68" />J&#8217;utilise <a title="NHibernate" href="http://nhforge.org/">NHibernate</a> depuis quelques années déjà. La grande majorité des projets en .net que je développe tirent profit de ce fantastique ORM. NHibernate est probablement le plus complexe des ORM, mais aussi le plus complet. Et avec l&#8217;abandon de <em>LINQ 2 SQL</em> par Microsoft, NHibernate est à mon avis le meilleur choix. D&#8217;autant plus que la version 2.1 devrait offrir un support complet pour LINQ (via un wrapper <em>LINQ 2 NHibernate</em>).</p>
<p>Si je vous parle NHibernate aujourd&#8217;hui, c&#8217;est surtout parce que je suis conscient que pour les non-initiés, NHibernate peut paraître complexe. Quoiqu&#8217;il existe beaucoup de tutoriels sur le Web, la plupart d&#8217;entre eux sont assez simples et ne font que survoler l&#8217;architecture requise pour bien tirer avantage de NHibernate. Notamment vis à vis la <a title="Gestion des sessions NHibernate" href="http://www.matizha.com/2008/11/23/gestion-des-sessions-nhibernate/">gestion des sessions et des transactions</a>.</p>
<p>Ainsi, il existe une référence qui porte sur ces aspects et je ne saurais suffisamment vous en recommander la lecture. Il s&#8217;agit de l&#8217;article <a title="NHibernate Best Practices" href="http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx">NHibernate Best Practices with ASP.Net</a><em> </em>de Billy McCafferty. L&#8217;article présente d&#8217;abord les avantages à utiliser un ORM et les bases de l&#8217;intégration de NHibernate. Ensuite, il offre plusieurs notions avancées, qui pourront peut-être sembler un peu lourdes pour certains, mais qui sont très intéressantes et surtout essentielles à une bonne utilisation de NHibernate.</p>
<p>Par ailleurs, chacun des thèmes abordés propose des liens et références pour vous permettre de mieux comprendre les différentes notions. Donc, même si vous n&#8217;êtes pas à l&#8217;aise avec les patterns de <em>Repository </em>et le <em>DDD </em>(Domain-Driven Design), vous serez sûrement en mesure de comprendre l&#8217;essentiel.</p>
<p>Je compte éventuellement proposer un petit guide pour l&#8217;implantation de NHibernate qui met à profit le pattern <em>Open-Session- In-View</em> pour permettre l&#8217;utilisation du <em>lazy-loading</em> de NHibernate. <a title="Gestion des sessions NHibernate avec asp.net" href="http://www.matizha.com/2008/11/23/gestion-des-sessions-nhibernate/">À suivre&#8230;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.matizha.com/2008/11/15/les-meilleures-pratiques-pour-nhibernate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tester Internet Explorer 7 sans installation</title>
		<link>http://www.matizha.com/2007/06/26/tester-internet-explorer-7-sans-installation/</link>
		<comments>http://www.matizha.com/2007/06/26/tester-internet-explorer-7-sans-installation/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 21:13:53 +0000</pubDate>
		<dc:creator>matizha</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.matizha.com/2007/06/26/tester-internet-explorer-7-sans-installation/</guid>
		<description><![CDATA[Que ce soit pour tester votre tout nouveau design css ou pour voir si votre site préféré est plus convivial, il existe plusieurs raisons pour lesquelles vous voudriez tester IE7. Toutefois, la plupart d&#8217;entre nous ne veulent pas se séparer de ie6 pour plusieurs autres raisons. J&#8217;ai donc trouvé un moyen simple d&#8217;avoir ie6 et [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-280" title="ie7-logo1" src="http://www.matizha.com/wp-content/uploads/2008/10/ie7-logo1.jpg" alt="" width="175" height="130" />Que ce soit pour tester votre tout nouveau design css ou pour voir si votre site préféré est plus convivial, il existe plusieurs raisons pour lesquelles vous voudriez tester IE7. Toutefois, la plupart d&#8217;entre nous ne veulent pas se séparer de ie6 pour plusieurs autres raisons. J&#8217;ai donc trouvé un moyen simple d&#8217;avoir ie6 et ie7 sans avoir à utiliser une autre machine.</p>
<p>Il s&#8217;agit d&#8217;un <a title="IE7 Standalone" href="http://tredosoft.com/IE7_standalone">petit programme</a> qui permet de lancer IE7 sans l&#8217;installer (vous avez besoin de l&#8217;archive d&#8217;installation de ie7 toutefois). En effet, ce petit bijou vous permet de tester la plupart des fonctionnalités de ie7 incluant les appels css conditionnels si connu du monde des designers Web.</p>
<p>Il est possible de configurer manuellement le petit programme, mais il est également disponible sous forme de <a href="http://tredosoft.com/files/IE7s/IE7S-setup.exe">programme d&#8217;installation</a> (c&#8217;est l&#8217;option que je recommande) qui s&#8217;occupe de télécharger pour vous l&#8217;archive d&#8217;installation de ie7 ainsi que de configurer les clés de la base registre nécessaires au fonctionnement.</p>
<p>Voilà, vous êtes maintenant en mesure de tester Internet Explorer 7 sans avoir à dire adieu à ie6!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.matizha.com/2007/06/26/tester-internet-explorer-7-sans-installation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CSS max-width et IE</title>
		<link>http://www.matizha.com/2007/03/12/css-max-width-et-ie/</link>
		<comments>http://www.matizha.com/2007/03/12/css-max-width-et-ie/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 19:55:20 +0000</pubDate>
		<dc:creator>matizha</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.matizha.com/2007/03/12/css-max-width-et-ie/</guid>
		<description><![CDATA[Comme vous le savez probablement, Internet Explorer 6 ne supporte pas plusieurs des propriétés du CSS 2. C&#8217;est le cas notamment de la propriété max-width (et min-width). Heureusement, IE permet de spécifier des propriétés à l&#8217;aide de JavaScript directement dans le CSS en utilisant la fonction expression().
Ainsi, supposons qu&#8217;on veut une largeur maximale, on peut [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-280" title="ie7-logo1" src="http://www.matizha.com/wp-content/uploads/2008/10/ie7-logo1.jpg" alt="" width="175" height="130" />Comme vous le savez probablement, Internet Explorer 6 ne supporte pas plusieurs des propriétés du CSS 2. C&#8217;est le cas notamment de la propriété max-width (et min-width). Heureusement, IE permet de spécifier des propriétés à l&#8217;aide de JavaScript directement dans le CSS en utilisant la fonction expression().</p>
<p>Ainsi, supposons qu&#8217;on veut une largeur maximale, on peut utiliser le code suivant. La propriété max-width sera utilisée par les navigateurs compatibles css2 et ignoreront la propriété contenant la fonction expression(). L&#8217;inverse se produira avec ie. Le code javascript pour la propriété width se traduit: <em>si la largeur du body est plus grande que 900, mettre la largeur du selecteur à 900px, sinon laisser le sélecteur se dimensionner automatiquement</em>.</p>
<pre>
<pre class="syntax-highlight:css:nogutter:nocontrols">
#selecteurCss {
    max-width:900px;
    width:expression(document.body.clientWidth &gt; 900 ? &quot;900px&quot;: &quot;auto&quot; );
}
</pre>
</pre>
<p>Par ailleurs, cette fonctionnalité devient également utile si on l&#8217;utilise en combinaison avec une largeur en pourcentage. Par exemple, le code suivant permet de spécifier <em>une largeur de 75% jusqu&#8217;à un maximum de 500px</em>.</p>
<pre>
<pre class="syntax-highlight:css:nogutter:nocontrols">
#selecteurCss {
    /* Les 2 lignes suivante seront utilisées par les navigateurs compatibles css2 */
    max-width: 500px;
    width: 75%;
    /* celle-ci sera utilisée par ie6 et moins, et remplacera la ligne précédente */
    width:expression(document.body.clientWidth &gt; 500 ? &quot;500px&quot; : &quot;75%&quot; );
}
</pre>
</pre>
<p>C&#8217;est bien beau tout ça, mais cette méthode n&#8217;est évidemment pas valide selon les normes. La validation devient toutefois possible en plaçant le code spécifique à ie dans une feuille css à part et uniquement accessible à ie. Ainsi dans la page, on insère le code suivant qui ne sera lu que par ie6 et moins (car max-width est supposé être fonctionnel dans ie7).</p>
<pre>
<pre class="syntax-highlight:xhtml:nogutter:nocontrols">
&lt;!--[if lt IE 7]&gt;
    &lt;style type=&quot;text/css&quot; media=&quot;all&quot;&gt;@import &quot;ie.css&quot;;&lt;/style&gt;
&lt;![endif]--&gt;
</pre>
</pre>
<p>En reprenant l&#8217;exemple précédent, dans votre feuille de style de base, vous auriez:</p>
<pre>
<pre class="syntax-highlight:css:nogutter:nocontrols">
#selecteurCss {
    /* Les 2 lignes suivante seront utilisées par les navigateurs compatibles css2 */
    max-width: 500px;
    width: 75%;
}
</pre>
</pre>
<p>Et dans ie.css:</p>
<pre>
<pre class="syntax-highlight:css:nogutter:nocontrols">
* html #selecteurCss {
    width:expression(document.body.clientWidth &gt; 500 ? &quot;500px&quot; : &quot;75%&quot; );
}
</pre>
</pre>
<p>Voilà, même si ce n&#8217;est pas la plus jolie des méthodes, elle fonctionne et n&#8217;empêche pas votre code css de valider. Si vous avez une meilleure façon d&#8217;émuler le max-width dans ie6, laissez-le nous savoir dans les commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.matizha.com/2007/03/12/css-max-width-et-ie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Refonte Sherpas.ca</title>
		<link>http://www.matizha.com/2007/03/12/refonte-sherpas-ca/</link>
		<comments>http://www.matizha.com/2007/03/12/refonte-sherpas-ca/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 18:05:21 +0000</pubDate>
		<dc:creator>matizha</dc:creator>
		
		<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.matizha.com/2007/03/12/realisations-recentes/</guid>
		<description><![CDATA[Notre entreprise vient tout juste de lancer la nouvelle version de son site Web: sherpas.ca. Je suis vraiment satisfait du résultat.
Comme je l&#8217;ai mentionné sur le nouveau blog de la firme, les activités de Sherpas ont considérablement évolué au cours de dernières années et la refonte entière du site nous a permis de mieux mettre [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-151" title="Sherpas Solutions" src="http://www.matizha.com/wp-content/uploads/2007/03/sherpas.jpg" alt="" width="240" height="163" />Notre entreprise vient tout juste de lancer la nouvelle version de son site Web: <a title="Sherpas Solutions, experts en nouvelles technologies" href="http://www.sherpas.ca">sherpas.ca</a>. Je suis vraiment satisfait du résultat.</p>
<p>Comme je l&#8217;ai mentionné sur le <a title="Blog | Sherpas Solutions" href="http://www.sherpas.ca/blog">nouveau blog</a> de la firme, les activités de Sherpas ont considérablement évolué au cours de dernières années et la refonte entière du site nous a permis de mieux mettre en valeur ces nouvelles orientations.</p>
<p>Quelques détails sur sherpas.ca:</p>
<ul>
<li>Réalisé du tout au tout par moi-même ;-)<br />
Mis à part le contenu qui est principalement tiré de notre plan d&#8217;affaires</li>
<li>Basé sur <a href="http://www.drupal.org">Drupal</a> 5, une plateforme open-source puissante que nous utilisons pour plusieurs projets</li>
<li>CSS valide</li>
<li>XHTML valide</li>
</ul>
<p>Certains questionneront peut-être la nécessité d&#8217;utiliser un CMS open-source pour un simple site corporatif. En fait, pour nous la question ne s&#8217;est même pas posée. Certes, ce n&#8217;était pas une nécessité, mais Drupal est tellement versatile et personnalisable que la question était davantage: pourquoi ne pas l&#8217;utiliser? En basant notre nouveau site sur Drupal, cela nous a permis de nous concentrer sur le design et l&#8217;architecture. ce qui a eu pour effet d&#8217;accélérer considérablement la production et la mise en ligne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.matizha.com/2007/03/12/refonte-sherpas-ca/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

