pico journal

café, clavier, clope

Appli console : parser les options en ligne de commande

clock April 4, 2012 03:50 by author pierre

On m'en avait parlé plusieurs fois mais j'avais jamais essayé Mono.Options, pour faire des applis console paramétrables sans être un devin. Mono.Options est disponible dans NuGet  (un petit clic droit dans les références de votre projet console, ou bien directement par un Install-Package Mono.Options).

Comment ça marche ? Voilà par exemple mon outil d'extraction du pfx à partir du fichier de publish settings Azure :

 

using System;
using System.Xml.Linq;
using Mono.Options;

namespace GetPfx
{
    class Program
    {
        static void Main(string[] args)
        {
            bool help=false;
            string publishFile="";
            string outPfxFile = "";

            OptionSet o = new OptionSet()
            .Add("?|h", "help file", v => help = v != null)
            .Add("in=|pub=", "{file} saved from https://windows.azure.com/download/publishprofile.aspx", 
v => publishFile = v) .Add("out=|outpfx=", "{file}name for the resulting pfx", v => outPfxFile = v); o.Parse(args); if (help || publishFile=="" || outPfxFile=="") { Console.WriteLine("Extracts a pfx file from the Azure publish profile"); Console.WriteLine("Options:"); o.WriteOptionDescriptions(Console.Out); Environment.Exit(-1); } var x = XDocument.Load(publishFile); string pfx = x.Element("PublishData") .Element("PublishProfile") .Attribute("ManagementCertificate").Value; System.IO.File.WriteAllBytes(outPfxFile,Convert.FromBase64String(pfx)); } } }


Déployer rapidement une application PHP sur Azure

clock April 3, 2012 16:56 by author pierre

 

Voilà la mise à jour du packager PHP pour le SDK 1.6.

 

Les petites nouveautés :

  • Suppression de la mise à jour par FTP
  • Passage par défaut sur des instances extra small
  • Activation de la fonctionnalité d'upgrade

 

Ce package n'autorise pas la prise de contrôle à distance de l'instance, mais le prochain comblera ce petit manque.

 

Mode d'emploi :

  1. dézippez le squelette,
  2. déposez votre application PHP dans le répertoitre yourPHPApp
  3. lancez package.bat
  4. déployez sur Azure le contenu de DeployWhatsInThere


Powerpack Azure pour les abonnés MSDN

clock March 23, 2012 02:23 by author pierre

 

Petit cadeau pour les abonnés MSDN : une machine sur Azure, avec un disque en WebDAV (taille limitée à 10Go pour les abonnés Pro, et 200 pour les abonnés premium si vous cherchez un peu dans les fichiers de configuration...)

Les infos détaillées : http://www.microsoft.com/france/visual-studio/msdn/azurepowerpack.aspx

La doc d'install : http://azdocs.cloudapp.net/modules/blogengine/post/2012/03/02/Installation-du-paquet-Azure4Msdn.aspx

La petite vidéo d'utilisation du partage réseau :

Et l'utilisation de l'accès RDP à la machine Azure :



Mise à jour des drivers PHP PDO pour Sql Server

clock March 23, 2012 02:00 by author pierre

PHPMicrosoft colle à l'actualité PHP, avec la sortie le 29 février de PHP 5.4 pour Windows, l'équipe Sql Server vient de publier une version 3.0.1 des drivers PHP pour Sql Server et Sql Azure. Les versions 2 et 3 sont disponibles sur http://www.microsoft.com/download/en/details.aspx?id=20098

Attention, les dépendances changent entre les versions 2.0 et 3.0. Voici les liens d'installation des runtimes requis pour utiliser le driver en version 3.0.1 :

32 bits : X86 Package

64 bits : X64 Package



Generic PHP on Azure sample

clock May 30, 2011 02:08 by author pierre

Due to many requests, here is a very crude PHP deployment sample for your apps in Azure. Here is how it works : I created a dummy Web role application that does nothing but execute a startup task. That project is then used as a skeleton for your PHP application. What you have to do to use it is :

0/ Install the latest Azure SDK (I tested this against the 1.4 refresh)

1/ Unzip skeleton.zip somewhere

2/ in the YourPHPApp folder, put your php application

3/ Launch Package.bat and you"ll get back the package in DeployWhatsInThere

Things you can tweak :

If you need a different PHP Runtime, go to the PHPRuntime\PHP folder and do what you want (the version is 5.3.6 NTS VC9, match the extensions if you add some)

If you need to tweak permissions and the like, change PHPRuntime\InstallPHP.cmd

If you want to add remote desktop capabilities, open the solution skeleton.sln and you'll have access to the dummy web role. If you recompile the new version will be picked up by package.bat (Note : you can also manually edit the csdef and cspkg file)

If you need ftp access to the box : drop some ftp binaries somewhere alongside the php runtime and launch them from installphp.cmd (oh, don't forget to add a port in the firewall by adding an endpoint in ServiceDefinition.csdef, something like :

      <InputEndpoint localPort="21" port="21" name="ftp" protocol="tcp"/>

Here is the thing :

(Comments should go to my inbox rather than here, just send them to pierre.couzy at microsoft.com)



Faire tourner son appli PHP sur le cloud (azure)

clock May 4, 2011 20:22 by author pierre

J'ai réalisé il y a quelques jours une série de petites vidéos sur Azure, et l'une d'entre elles est spécifquement dédiée à PHP et Azure. Comment installer son application, comment utiliser les composants de Windows Azure, et quels sont les frameworks dèjà capables de faire tout ça :

Get Microsoft Silverlight

 

Je ferai un billet plus spécifique à Zend Framework prochainement. Si vous avez besoin de billes rapidement, un petit mail à pierre point couzy at microsoft point com et on en discute.



Azure et PHP : comment installer le runtime

clock March 30, 2011 16:57 by author pierre couzy

Depuis novembre 2010, les évolutions de Windows Azure ont ouvert les fonctionnalités de Windows Azure, mais ces évolutions ont également apporté quelques différences de fonctionnement, notamment pour l'installation de PHP sur Azure. Voici donc les méthodes que j'ai pu trouver, et une opinion sur leur intérêt.

Installation de PHP dans Hosted Web Core

Cette technique est celle qui était préconisée avant la disponibilité de Full IIS dans Azure, et elle repose sur l'installation de PHP depuis un Web Role. Cette technique est toujours utilisable, mais il faut retoucher légèrement les projets fournis en standard par Visual Studio. En effet, le mode de paramétrage change entre IIS et Hosted Web Core. Dans Hosted Web Core, les paramètres de votre site Web sont logiquement dans Web.Config, mais vous pouvez également prendre la main sur le paramétrage d'IIS en vous appuyant sur le fichier web.roleconfig. Voici par exemple la déclaration de PHP au module fastCGI et son utilisation sur le site web :

web.roleconfig :

<configuration>
  <system.webServer>
    <fastCgi>
      <application fullPath="e:\approot\php\php-cgi.exe"/>
    </fastCgi>
  </system.webServer>
</configuration> 

 

Web.config :

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <add name="PHPFastcgi" verb="*" 
           path="*.php" scriptProcessor="e:\approot\php\php-cgi.exe" 
           modules="FastCgiModule" resourceType="Either" />
    </handlers>
     ...

Malheureusement, cette belle mécanique ne fonctionne pas dans le mode Full IIS (le fichier web.roleconfig est ignoré), et la solution pour la rétablir consiste simplement à forcer votre Web Role à revenir en mode Hosted Web Core, en modifiant le fichier csdef qui définit vos rôles, et en supprimant la sections sites :

 

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="JoomlaDansAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="JoomlaWeb" vmsize="ExtraSmall">
<!--
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
-->    
    <Endpoints>
      
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
  </WebRole>
  
</ServiceDefinition>

 

Un grand merci au passage au blog d'Avkash Chauhan qui contient un paquet de choses intéressantes sur les évolutions d'Azure.

Installation de PHP par le biais de WebPI

C'est la technique actuellement présentée dans la majorité des posts, et elle repose sur un principe assez simple : au lieu de procéder soi-même à l'installation de PHP, on délègue cette tâche à quelque chose qui le fait déjà, et qui est en plus capable de gérer les dépendances.

Cette délégation d'installation se fait dans une startup task : juste avant d'insérer votre nouvelle instance dans le load balancer, on exécute un certain nombre de tâches sous la forme suivante :

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="InstallPHP" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="PHPWebRole">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
        </Bindings>
      </Site>
    </Sites>
    <ConfigurationSettings>
    </ConfigurationSettings>
    <Startup>
      <Task commandLine="InstallPHP.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
  </WebRole>
</ServiceDefinition>

Le fichier InstallPHP.cmd fait ensuite appel à webPI pour sélectionner la version de PHP à installer (regarder dans le Windows Azure Training Kit pour en savoir plus). Le souci, c'est que si vous voulez avoir plus de contrôle sur l'installation, il faut soit créer ses propres feeds (compliqué et fragile), soit enchaîner les installations avec WebPI en priant pour ne pas avoir de dépendance incompatible avec Azure (et il y a un hotfix de Windows 2008 qui ne s'applique pas à Azure, entre autre choses qui peuvent bloquer l'installation).

De plus, impossible de définir avec précision son php.ini ou d'ajouter une extension.

Installation manuelle de PHP dans Azure en mode Full IIS

C'est la technique que je suis en train d'explorer et pour le moment j'en suis content (mais je n'ai pas encore couvert tous les cas possibles). L'idée est de revenir au modèle proposé par Hosted Web Core. Le problème de Full IIS est qu'il est impossible de paramétrer correctement les composants d'IIS qui ne sont pas sous le contrôle de Web.Config. Après avoir un peu tourné autour du problème et lu la documentation d'installation manuelle de PHP sous IIS faite par Ruslan Yakushev, j'ai utilisé le Web.Config et une startup task.

Le début du packaging est strictement identique à celui de PHP en mode HWC : on pose son runtime dans un répertoire PHP à la racine du site Web (on peut également le déporter ailleurs sur le disque si on le souhaite en utilisant d'autres startup tasks, mais je n'ai pas encore peaufiné assez pour m'occuper de ce genre de configuration).

On insère ensuite une startup task de la forme suivante dans le csdef :

    <Startup>
      <Task commandLine="PHP\InstallPHP.cmd" executionContext="elevated" taskType="simple"></Task>
    </Startup>

Et le fichier InstallPHP.cmd fait simplement ce que faisait web.roleconfig en mode Hosted Web Core :

rem Creating IIS FastCGI process pool
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='e:\approot\php\php-cgi.exe'] > PHPInstallLog.txt

rem Creating handler mapping for PHP requests
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='e:\approot\php\php-cgi.exe',resourceType='Either'] >> PHPInstallLog.txt

rem Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /[fullPath='E:\AppRoot\PHP\php-cgi.exe'].instanceMaxRequests:10000 >> PHPInstallLog.txt
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='E:\AppRoot\PHP\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']" >> PHPInstallLog.txt

rem Configuring FastCGI timeout settings
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /[fullPath='E:\AppRoot\PHP\php-cgi.exe',arguments=''].activityTimeout:"90"  /commit:apphost >> PHPInstallLog.txt
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /[fullPath='E:\AppRoot\PHP\php-cgi.exe',arguments=''].requestTimeout:"90"  /commit:apphost >> PHPInstallLog.txt

rem Changing the location of php.ini file
appcmd.exe set config  -section:system.webServer/fastCgi /+"[fullPath='e:\approt\php\php.exe',arguments=''].environmentVariables.[name='PHPRC',value='e:\approt\php\']" /commit:apphost >> PHPInstallLog.txt

A noter : en mode Full IIS, le package est déployé deux fois, une à la racine de approot et une dans un sous-répertoire qui est physiquement utilisé par IIS. La technique de déploiement ci-dessus utilise la version déployée dans AppRoot, ce qui permet de supprimer le répertoire PHP du répertoire utilisé par IIS afin de ne pas déployer le runtime PHP dans une zone du filesystem accessible en http.

Attention à un dernier détail : si vous préférez faire l'association entre votre site et FastCGI en utilisant web.config, l'exemple fourni dans les web roles CGI est incorrect : en effet, il utilise %RoleRoot% pour désigner le lecteur où est installé votre package dans la VM Azure, mais cette variable d'environnement n'est pas disponible au moment où le Web.Config est parsé, et il faut donc coder en dur E: de cette façon :

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>

      <add name="PHPHandler"
           verb="*"
           path="*.php"
           scriptProcessor="E:\approot\php\php-cgi.exe"
           modules="FastCgiModule"
           resourceType="Either" />

    </handlers>
  </system.webServer>
</configuration>


DrupalCon Chicago : Drupal on Azure

clock March 14, 2011 14:22 by author pierre couzy

Last week, Microsoft and Commerce Guys showed the first results of the ongoing work to use Azure as a cloud platform for Drupal.

How it works.

The project is today the combination of two modules for Drupal 7 :

  • A database module for Sql Azure to get a highly available database when running in Azure
    • Note that as of today, a lot of Drupal data are stored in this database, notably user sessions. One of the goals of the project is to minimize the database load by using local and distributed caches
  • A storage module relying on Azure Blob Storage
    • Azure blob storage is a highly scalable system for static content
    • It can be optimized further by using Azure CDN
  • The CDN can also cache dynamic content, leveraging standard http headers
    • Which are defined by default in Drupal for cacheable content

Anyway, here are the slides :



Drupal 7 sous Windows

clock January 24, 2011 17:48 by author pierre couzy

Drupal 7 Developer releaseLe 5 janvier dernier, Drupal 7 a officiellement vu le jour sur drupal.org. En préparation de cette sortie, Microsoft et la communauté Drupal ont œuvré de concert pour faire de Drupal 7 une application compatible, testée et utilisable en production sur la plateforme Windows.

Pour les plus pressés, vous pouvez déclencher l'installation de Drupal 7 et de ses pré-requis en vous rendant sur la Galerie Web (lien sur l'illustration en marge), et de lire les annonces de Commerce Guys (en français et en anglais). Pour les autres, voici les grandes lignes du travail accompli en un an :

 

 

 

Extensions PHP optimisées pour Windows

Le support de PHP sous Windows s'améliore d'année en année, et Drupal 7 a été testé sous Windows avec PHP 5.3.3  et PHP 5.2.14. Drupal peut également exploiter l'extension WinCache (équivalente à APC mais optimisée pour Windows).

 

 

Packaging des modules sur drupal.org

Drupal.org est le référentiel de Drupal et de ses modules. Les modules Drupal étaient initialement disponibles au format TGZ uniquement. Ils sont désormais systématiquement fournis également au format ZIP, nativement supporté sur la plateforme Windows

 

 

imageSupport de Sql Server

La brique la plus fondamentale est l’arrivée de Sql Server dans les bases de données utilisables par Drupal. Cette intégration est due à un effort concerté :

  • Microsoft a développé un driver PDO pour Sql Server. Ce projet a été dévoilé lors de la DrupalCon de San Francisco en avril 2010, la version finale est arrivée en Août.
  • Commerce Guys a développé un module Sql Server pour Drupal 7 en s’appuyant sur cette extension, avec une première démonstration à la DrupalCon de San Francisco et une sorte coordonnée avec la version finale de Drupal 7.

 

imageSupport de IIS

Drupal 7 est fourni en standard avec un fichier .htaccess et un fichier web.config. Ce dernier permet de configurer automatiquement IIS pour servir correctement les requêtes adressées à un site Drupal.

 

imageIntégration à la galerie Web et à WebMatrix

L’installation de Drupal 7 sous Windows est bien évidemment possible à partir des sources sur drupal.org, mais Commerce Guys propose également un package d’installation intégré, relayé par Microsoft sur la Galerie Web et dans WebMatrix.

 

Développement de modules spécifiques pour Drupal 7

Quelques modules intéressants pour Drupal 6 et 7 :

  • Bing Maps
  • Silverlight Pivot
  • Windows Live ID
  • OData


WebCamps Microsoft, 1ère édition

clock November 26, 2010 18:57 by author pierre couzy

La première édition des webcamps a eu lieu hier au centrre Pompidou, pas mal d’échanges autour de PHP sous Windows et des outils de dev, voici les deux présentations :