20-100.ch // Prog, news et autres trucs de geek...

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 14 mars 2010

Désactiver le layout et/ou la vue pour une action donnée dans le Framework Zend

Le Framework Zend est un framework MVC en PHP que j'affectionne particulièrement. Dans certains cas, il arrive que l'on veuille avec une action dans un contrôleur donné qui n'affiche rien, ou alors simplement du texte brut (des données JSON par exemple). Dans ce cas, plutôt que de créer un fichier vide pour la vue, il est plus simple de désactiver la vue (et le layout le cas échéant) pour cette action donnée, à l'aide du code suivante :

$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);

mardi 29 décembre 2009

Activer Intellisense pour CUDA dans Visual Studio

Petite parenthèse dans mes articles sur la configuration d'un serveur pour vous parler de CUDA. Je suis actuellement en train de développer avec cette API de nVidia pour faire tourner du code sur les processeurs graphiques, et j'utilise pour ça Visual Studio 2008. La première étape fût d'activer la coloration syntaxique pour le code CUDA (qui est une extension du C, et dont les fichiers finissent en .cu/.cuh).

Pour cela, il suffit d'aller dans Tools / Options / Text Editor / File Extension, et d'ajouter une règle pour les fichiers cu et cuh, afin qu'ils soient édités avec Microsoft Visual C++.

Mais cela ne va pas activer Intellisense, l'auto-complétion, et surtout les aides à la navigation dans le code (les petits menus déroulants en haut de l'éditeur qui permettent d'aller directement à une fonction). Pour activer tout ça, il faut aller dans l'éditeur de registre, dans le dossier:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++

Là, modifiez la clé NCB Default C/C++ Extensions et ajoutez-y les extensions .cu et .cuh, et le tour est joué !

Trouvé sur Home of easter wizards via les forums nVidia.

jeudi 10 décembre 2009

Installer Subversion et websvn avec Apache 2 sur Debian

Après un long moment d'inactivité sur ce blog, je profite de la récente acquisition d'un serveur VPS pour poster quelques articles sur la mise en place d'un tel serveur, déjà pour que je me souvienne de ce que j'avais fait, mais aussi en espérant que ce soit utile à d'autres !

Donc pour ce premier article, je vais détailler la mise en place d'un serveur subversion (SVN), avec accès via Apache. Je partirai du principe que vous avez déjà un serveur Apache 2 fonctionnel.

Alors, pour commencer, il faut installer subversion lui-même, ainsi que le module pour apache :

sudo aptitude install subversion libapache2-svn

Ca va installer les différents programmes nécessaires à l'utilisation de subversion, ainsi que le module pour apache. Vous avez ensuite plusieurs choix : vous pouvez configurer une authentification uniquement via apache, ou permettre aussi de de connecter via SSH. Dans mon cas, je ne veux pas devoir créer un utilisateur sur mon serveur pour chaque accès SVN que je veux donner, je vais donc me limiter à l'authentification via apache.

Il va falloir ensuite créer un répertoire pour stocker les différents repositories subversion. J'ai choisi de le faire dans /home, car je crée en même temps un utilisateur pour subversion (et ainsi les repositories seront sauvegardés en même temps que tous les répertoires home) :

sudo useradd subversion
sudo mkdir /home/subversion

Profitons-en pour vite créer un repository de test :

sudo svnadmin create /home/subversion/test

Vu que le répertoire sera servi par apache, il faut que celui-ci puisse écrire dans le répertoire que nous venons de créer. Dans mon cas, j'utilise mpm-itk, un module d'apache qui permet d'exécuter les différents virtual hosts avec leur propre utilisateur. Ainsi, le répertoire doit simplement appartenir à l'utilisateur subversion :

sudo chown subversion:subversion /home/subversion

Cependant, pour la plupart des gens, il faudra nommer l'utilisateur d'apache comme propriétaire :

sudo chown www-data:www-data /home/subversion

Pour authentifier nos utilisateurs, apache va utiliser un fichier htpasswd, qu'il nous faut créer. La commande suivante crée ce fichier et y ajoute l'utilisateur test :

sudo htpasswd -c /etc/apache2/svn.passwd test

Le mot de passe pour cet utilisateur nous est alors demandé. Pour ajouter d'autres utilisateurs, répétez la commande, mais sans l'option -c (qui sert à créer le fichier) :

sudo htpasswd /etc/apache2/svn.passwd foo
sudo htpasswd /etc/apache2/svn.passwd bar

Nous allons maintenant configurer apache 2. Vérifions tout d'abord que le module dav_svn installé précédemment est bien activé :

sudo a2enmod dav_svn

Ensuite, créons le fichier pour le virtual host (/etc/apache2/sites-available/svn.domain.com) :

<VirtualHost *:80>
        ServerAdmin admin@localhost
        ServerName svn.domain.com

        <Location />
                DAV svn
                SVNParentPath /home/subversion
                AuthType Basic
                AuthName "Private Subversion Repository"
                AuthUserFile /etc/apache2/svn.passwd
                Require valid-user
        </Location>

        ErrorLog /home/subversion/logs/error.log
        CustomLog /home/subversion/logs/access.log combined

        <IfModule mpm_itk_module>
                AssignUserId subversion subversion
        </IfModule>
</VirtualHost>

Les directives intéressantes se trouvent dans la balise Location.

DAV svn

demande d'utiliser le module dav_svn installé à la place du module normal.

SVNParentPath /home/subversion

définit le répertoire dans lequel sont stockés les repositories. Finalement,

AuthUserFile /etc/apache2/svn.passwd

indique quel fichier utiliser pour l'authentification des utilisateurs. Voilà, c'est tout ! Il vous reste à activer ce virtual host :

sudo a2ensite svn.domain.com

et à redémarrer apache :

sudo apache2ctl graceful

Normalement, tout devrait fonctionner ! Pour vérifier, rendez-vous sur l'adresse de votre repository : http://svn.domain.com/test

Vous devriez avoir une invite vous demandant un nom d'utilisateur et un mot de passe, et une fois ceux-ci entrés, vous devriez voir l'index de votre repository !

Dans les prochains articles, je tenterai de vous expliquer comment définir des droits plus fins sur vos différents repositories, comment utiliser SSL pour accéder à vos repositories de manière sécurisée, et comment mettre en place websvn pour pouvoir parcourir votre code plus facilement et plus joliment qu'avec l'interface web rudimentaire que nous avons pour l'instant !

Sources :

mercredi 23 juillet 2008

Attribut DataFormatString pas pris en compte dans un BoundField

Dans un GridView, on a la possibilité de formater le contenu d'un BoundField avec un pattern équivalent à ceux utilisés par String.Format(). C'est donc ce que j'ai voulu faire, en formatant une de mes colonnes contenant un prix pour qu'elle s'affiche joliment, avec un séparateur des milliers et la monnaie :

<asp:BoundField DataField="Price" DataFormatString="CHF {0:0,0}" SortExpression="Price" />


Mais le problème, c'est que ça ne fonctionne pas : le "CHF" est bien affiché, mais aucun séparateur des milliers ! Cela vient du fait que pour éviter l'injection de code, ASP.Net encode en HTML tous les champs avant de les afficher, et avant de les formatter ! Je ne sais pas pourquoi, mais cela semble le rendre incapable de séparer les milliers. Pour résoudre le problème, il suffit donc de désactiver l'encodage HTML de ce champ, si vous êtes sûr de ne rien risquer (dans mon cas, c'est un int qui vient directement de ma base de données, peu de risques d'injection donc ;-)...), en ajoutant l'attribut HtmlEncode="false" :

<asp:BoundField DataField="Price" DataFormatString="CHF {0:0,0}" HtmlEncode="false" SortExpression="Price" />

mardi 22 juillet 2008

Method error 12030 avec une CascadingDropDown

Le composant CascadingDropDown de l'AjaxToolkit ASP.Net permet de créer des liste déroulantes inter-dépendantes, c'est-à-dire que ce n'est que lorsqu'on a sélectionné une valeur de la première que le contenu de la seconde est chargé. Ce genre de comportement est par exemple utile pour les voitures : on sélectionne la marque, et ensuite seulement la liste des modèles correspondants est chargée.

Ce composant fonctionne avec des services web, qu'il appelle lorsqu'une valeur est sélectionnée pour charger les données de la liste suivante. J'ai voulu l'implémenter, et ai obtenu l'erreur suivante lors du chargement des données de la première liste : "Method error 12030".

Comme son nom l'indique ;-), cette erreur veut dire qu'il y a un problème avec le service web appelé. Dans mon cas, il manquait la mention

[ScriptService()]

en dessus de la classe définissant mon service web, et

[ScriptMethod]

en dessus de la méthode correspondante. Il suffit d'ajouter ça, et ça fonctionne !

mercredi 25 juin 2008

Outil pour calculer des dérivées en ligne

Si vous avez besoin de rapidement calculer une dérivée, soit parce que vous ne savez pas la résoudre, soit pour vérifier votre calcul, et que vous n'avez pas Mahtematica sous la main, allez faire un tour sur http://www.numberempire.com/derivatives.php !

Ce site vous permet de dériver toutes sortes de fonctions, de manière simple et efficace ! Vous trouverez de nombreux autres outils similaires sur ce site : éditeur d'équations latex, calculateur de limites, etc...

mercredi 4 juin 2008

Débugger du JavaScript sous Internet Explorer

Tout développeur web qui un jour a dû écrire du JavaScript un peu compliqué s'est heurté au problème du débuggage du code JS, et s'est tourné vers l'outil ultime pour Firefox : Firebug. Celui-ci permet de mettre des breakpoints dans le code JS, de l'exécuter ligne par ligne, de voir le contenu des variables à tout moment, mais a aussi de nombreuses autres fonctionnalités très utiles, comme l'inspection et la manipulation DOM, et la modification en direct du CSS. Il prend aussi en charge les diverses fonctions de débuggage de Firefox : console.log(), console.error(), etc..., et les affiche de manière lisible.

Mais le problème, c'est qu'il faut des fois débugger sous Internet Explorer ! Et le pâle équivalent de Firebug sous ce dernier, la Developer Toolbar, ne le permet pas. Pire encore, les appels à console.log() si utiles sous Firefox provoquent des erreurs dans IE ! Qu'à cela ne tienne, vous avez maintenant la possiblité d'utiliser Firebug Lite.

Il existe en deux versions, qu'il faut inclure dans vos pages. La première permet, en appuyant sur F12, d'afficher un semblant de console JavaScript , dans laquelle le résultat des console.log(), etc... aparaît. La seconde, quant à elle, permet juste d'empêcher les appels à ces fonctions de causer des erreurs dans Internet Explorer.

Si vous ne voulez pas l'installer sur toutes vos pages web, mais que vous voulez juste l'utiliser comme outil pour débugger, il existe aussi en bookmarklet : Firebug Lite Bookmarklet

mercredi 12 mars 2008

Centrer uniquement une cellule dans un tableau en LaTeX

Lorsqu'on travaille avec les tableau en LaTeX, il est facile de spécifier l'alignement de chaque colonne : c'est l'argument de la commande \begin{tabular}. Par exemple, pour avoir 3 colonnes, séparées par une bordure et respectivement alignée à droite, centrée et alignée à gauche, il suffit de faire :

\begin{tabular}{r|c|l}
cellule alignée à droite & cellule centrée & cellule alignée à gauche \\
\end{tabular}


Cependant, comment faire si l'on veut modifier uniquement l'alignement d'une cellule ? L'astuce est d'utiliser la commande \multicolumn, qui permet de fusionner plusieurs cellules et de définir l'alignement du texte dans les cellules fusionnées, et lui demander de fusionner... une seule cellule ! Ainsi, on pourra choisir l'alignement à sa guise. Cependant, cette technique a un désavantage, c'est qu'il faut redéfinir à nouveau les bordure de la nouvelle cellule :

\begin{tabular}{|l|l|l}
\multicolumn{1}{|c}{Titre 1} & \multicolumn{1}{|c}{Titre 2} & \multicolumn{1}{|c}{Titre 3} \\
cellule 1 & cellule 2& cellule 3 \\
\end{tabular}

vendredi 7 mars 2008

Définir quel bouton sera activé lors de l'appui sur la Enter en ASP.Net

Si, dans une page ASP.NET, vous avez plusieurs formulaire qui cohabitent, vous avez peut-être remarqué que le fait d'appuyer sur Enter envoie toujours le même, à savoir le premier présent dans la page. Ca peut être assez dérangeant, si par exemple vous avez un formulaire de connexion à votre site situé en-dessous d'un champ de recherche : dans ce cas, lorsque l'utilisateur aura saison son mot de passe et appuyé sur Enter (sur son clavier, donc), ce sera le formulaire de recherche qui sera transmis !

Pour contrôler ce genre de scénarii, ASP.NET met à disposition l'attribut DefaultButton sur les balises <asp:Form> et <asp:Panel>. Elle permet d'indiquer, pour respectivement le formulaire ou le panel concerné, quelle bouton sera activé lors de l'appui sur la touche Enter. Par exemple :

<html>
   <body>
      <form id="Form2" runat="server">
         <asp:Panel ID="Panel1" DefaultButton="Button1" RunAt="server">
            <asp:Button ID="Button1" RunAt="server"/>
         </asp:Panel>
         <asp:Panel ID="Panel2" DefaultButton="Button2" RunAt="server">
           <asp:Button ID="Button2" RunAt="server"/>
         </asp:Panel>
      </form>
   </body>
</html>


Et si vous n'avez pas de bouton, mais une balise <asp:Login> que vous voulez activer lors de l'appui sur la touche Enter ? Rien de plus simple, il suffit de donner IdDuForm$LoginButton comme DefaultButton :

<html>
   <body>
      <form id="Form2" runat="server">
         <asp:Panel ID="Panel1" DefaultButton="Login$LoginButton" RunAt="server">
            <asp:Login ID="Login1" RunAt="server"/>
         </asp:Panel>
      </form>
   </body>
</html>

dimanche 2 mars 2008

Encoder les headers personnalisé en JavaScript et les décoder en PHP

Dans la suite de mon post précédent, expliquant comment accéder à des headers HTTP personnalisés en PHP, j'ai rencontré le problème suivant : les headers sont bien transmis pour des données "simples", mais cela ne fonctionnait pas pour des caractères spéciaux ou accentués !

Vu que mes headers sont créés lors d'une requête AJAX, via le framework Opensocial, il faut d'abord pourvoir les "encoder", ou du moins "escaper" les caractères spéciaux, en JavaScript, et pouvoir les "décoder" du côté serveur, dans mon cas en PHP.

Pour ce faire, j'utilise la fonction JavaScript encodeURIComponent() du côté client :

var customHeaders = { "x-question-name" : nameValue, "x-question-text" : textValue };

var params = {};
params[opensocial.ContentRequestParameters.HEADERS] = customHeaders;

opensocial.makeRequest(url, createQuestionCB, params);


et la fonction PHP rawurldecode() du côté serveur !

$name = rawurldecode($_SERVER["HTTP_X_QUESTION_NAME"]);
$text = rawurldecode($_SERVER["HTTP_X_QUESTION_TEXT"]);

Comment récupérer des headers HTTP personnalisés en PHP

Lorsqu'on travaille avec des requêtes AJAX, une manière de passer des paramètres au serveur est via des headers HTTP personnalisés. De cette manière, on n'est pas limités par la taille maximale de 255 caractères pour une URL. Cependant, comment récupérer ces headers personnalisés du côté du serveur en PHP ?

Comme on s'y attend, ils sont bien dans l'objet $_SERVER, mais pas sous le nom escompté : il faut ajouter HTTP_ au nom de son header personnalisé, passer tous les caractères en majuscule et remplacer les - par des _ pour obtenir le nom sous lequel on trouvera ce header dans le tableau $_SERVER.

Ainsi, le header My-Header sera répertorié sous la clé HTTP_MY_HEADER dans le tableau $_SERVER !

mercredi 13 février 2008

Commenter du code ASP.NET pour éviter qu'il ne soit interprété

L'ASP.NET étant un language de balise similaire au (X)HTML, mon premier réflexe lorsque j'ai voulu commenter mon code (soit pour expliquer une partie peu claire, soit pour "désactiver" temporairement une partie de la page pour débugger) a été d'utiliser les commentaires HTML :

<!-- Commentaire explicatif -->
<img src="test.gif" alt="test" />
<!--
<asp:HyperLink ID="lien" runat="server" NavigateUrl="http://20-100.ch/blog/" Text="Lien désactivé" />
-->


Cependant, cela n'empêche pas le serveur d'interpréter les balises ASP.NET ! Ainsi, le lien ci-dessus sera bien visible dans la source de la page, même si rien ne sera affiché dans le navigateur.

Il existe en fait des balises de commentaires spécifiques à l'ASP.NET qui font ce que l'on veut :

<%-- Commentaire explicatif --%>
<img src="test.gif" alt="test" />
<%--
<asp:HyperLink ID="lien" runat="server" NavigateUrl="http://20-100.ch/blog/" Text="Lien désactivé" />
--%>


Pratique !

dimanche 10 février 2008

Comment déclarer une chaîne de caractères sur plusieurs lignes en JavaScript

Deux techniques à choix pour déclarer une chaîne sur plusieurs lignes en JavaScript :

var s = (<r><![CDATA[

ligne 3
ligne 4

]]></r>).toString();


ou alors :

var s = "\
ligne 1\n\
ligne 2\n\
"
;


A vous de choisir celle que vous voulez utiliser (ma préférence va à la seconde, la première faisant un peu trop "hack" à mon goût, en plus d'être sensiblement plus longue à écrire et moins claire à relire). En connaissez-vous d'autres ?

jeudi 7 février 2008

Impossible de charger le type 'Microsoft.Web.Services.ScriptHandlerFactory'

En voulant utiliser des services web en ASP.Net en même temps que la librairie ASP.Net AJAX (anciennement Atlas Library), je suis tombé sur l'erreur suivante :

Impossible de charger le type 'Microsoft.Web.Services.ScriptHandlerFactory'.

Cette erreur fait référence à la ligne suivante du fichier web.config :

<httpHandlers>
    <add verb="*" path="*.asmx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/>
</httpHandlers>

Pourtant, dans mon cas, cette ligne a été générée automatiquement, et ne devrait donc pas être fausse. J'ai essayé d'inclure moult références à mon projet web, pensant qu'il m'en manquait une mais en vain. Il suffit en fait de changer le type, qui doit être System.Web.Script.Services.ScriptHandlerFactory.

Le fichier web.config dont donc contenir la ligne suivante :

<add verb="*" path="*.asmx" type=System.Web.Script.Services.ScriptHandlerFactory" validate="false"/>

jeudi 8 novembre 2007

Permettre l'upload de fichier dans un UpdatePanel

Il arrive souvent en ASP.Net d'inclure toute sa page dans un UpdatePanel, ce qui a pour effet de rendre asynchrone le fonctionnement de celle-ci. Cependant, si vous mettez un champ FileUpload (l'équivalent en ASP.Net du <input type="file">) dans un UpdatePanel, vous vous retrouverez avec une taille de 0 byte lors du traitement du postback.

La raison est que l'UpdatePanel fait les requêtes directement en asynchrone et de manière transparent, sans passer par un POST normal, et n'upload pas les fichiers. Pour que votre FileUpload fonctionne dans un UpdatePanel, il suffit d'ajouter un trigger à ce dernier, lui indiquant d'effectuer un POST normal lorsque le formulaire contenant votre fichier est soumis.

Par exemple, si votre UpdatePanel est dans la Master Page et que votre FileUpload se trouve dans un FormView, voici comment ajouter le trigger en C# :

UpdatePanel panel = (UpdatePanel)Page.Master.FindControl("__myUpdatePanel");

PostBackTrigger trigger = new PostBackTrigger();
trigger.ControlID = this.__myFormView.UniqueID;

panel.Triggers.Add(trigger);

jeudi 6 septembre 2007

Jeu de société pour Geeks !

Le mauvais temps arrive, bientôt l'hiver sera là, et votre UPS ne tient que 12 minutes en cas de coupure de courant ? Que pourrez-vous bien faire lorsque la neige aura abattu les lignes électriques et que vous ne pourrez plus utiliser votre cher ordinateur ?

J'ai la solution : C-jump ! Un jeu de société permettant de s'amuser en famille tout en répétant vos bases de la programmation et en les inculquant à votre petit dernier ;) ! Parfait pour en faire un vrai geek...

vendredi 31 août 2007

Une ligne de code CSS/HTML pour faire planter IE6

Un blogeur japonais a découvert un bug d'Internet Explorer 6 qui permet de faire planter l'explorateur, voire la machine complète, à l'aide d'une seule ligne de code HTML/CSS :

<style>*{position:relative}</style></code><table><input></table>


A vous de jouer ;)...

mardi 21 août 2007

Ne plus afficher l'écran de bienvenue quand il n'y a qu'un seul utilisateur

Vu que je suis le seul utilisateur de mon PC, je n'ai qu'un compte utilisateur. Après avoir installé Windows XP SP2, il se connecte automatiquement à mon compte au démarrage, sans afficher l'écran de bienvenue avec la liste des comptes. C'est somme tout logique, vu que s'il s'affiche, je n'ai qu'un seul choix ;) !

Cependant, après avoir fait les mises à jour de Windows, j'ai remarqué que ce n'était plus le cas : l'écran de bienvenue s'affiche à chaque démarrage ! C'est un détail, mais moi, ce genre de détails, ça me dérange ! J'ai donc cherché, et il s'avère que c'est un bug du Framework .Net 1.1. Quel rapport, me direz-vous ? Hé bien, je n'en sais pas plus que vous. Toujours est-il qu'il y a un article de la Knowledge Base rapportant ce fait, et expliquant que ce bug est résolu par le SP1 du Framework .Net 1.1. C'est bien joli, mais ce service pack, je l'ai déjà installé, moi ! Et ça ne fonctionne toujours pas !

Heureusement, il y a un moyen ;) ! Il suffit de taper la ligne suivante, dans l'invite de commande (accessible via Démarrer -> Exécuter -> cmd -> Ok) :

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v ASPNET /t REG_DWORD /d 0 /f


Et voilà ! Merci à Aaron Stebnet pour cette astuce !

mardi 14 août 2007

Comment débugger plus facilement ses scripts JavaScript

Lorsqu'on développe, on a souvent besoin de consulter des valeurs lors de l'exécution, pour débugger son code et vérifier que tout se déroule comme prévu. Alors que la plupart des "vrais" langages de programmation (Java, .Net, etc...) bénéficient d'un débugger pour faciliter cette tâche, JavaScript est un peu le parent pauvre. Les développeurs sont souvent réduits à devoir afficher les valeurs dans des alert(), ou en plein milieu de leur belle page web !

Hé bien, ce temps est fini ! Il est en effet possible, en JavaScript, d'afficher des valeurs dans la console à l'aide de l'instruction suivante :

console.debug("Hello World !");


Le texte sera affiché directement dans la console JavaScript, disponible via Outils -> Console d'erreurs sour Firefox. A noter que deux autres méthodes sont disponibles, respectivement pour tracer le déroulement du script et pour rapporter des erreurs :

console.log("Opération effectuée.");
console.error("Problème !");


Merci à Trefex pour cette astuce ;) !

mardi 31 juillet 2007

Comment configurer Subversion et ToirtoiseSVN en SVN+SSH (partie 2)

Pour les développeurs, subversion est un outil vraiment pratique. Il permet non seulement de garder un historique de toutes les modifications sur un projet, mais facilite aussi le travail à plusieurs. Sous Windows, il existe un soft parfait pour intégrer Subversion à l'explorateur de fichiers : TortoiseSVN. Ce petit programme ramène à un clic droit toutes les opérations courantes lorsqu'on travaille avec Subversion : commit, update, mais aussi résolution de conflits et comparaison de versions.

Cet article est la seconde partie d'un guide détaillant la configuration de TortoiseSVN sur un poste Windows pour utiliser subversion en mode SVN+SH, à savoir une connexion à un serveur subversion via SSH. Il détaille l'installation de la clé privée sur le poste client, dans TortoiseSVN.

Comment configurer Subversion et ToirtoiseSVN en SVN+SSH (partie 1)


Lire la suite...

- page 1 de 2