<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://prendreuncafe.com/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Prendre un Café</title>
  <link>http://prendreuncafe.com/blog/</link>
  <atom:link href="http://prendreuncafe.com/blog/feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 01 Feb 2011 14:49:24 +0100</pubDate>
  <copyright>Contenus sous licence Creative Commons BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Juste pour rappel</title>
    <link>http://prendreuncafe.com/blog/post/2010/05/05/Juste-pour-rappel</link>
    <guid isPermaLink="false">urn:md5:b1cf20d0db4d94e7b9b38311b0e25f1d</guid>
    <pubDate>Wed, 05 May 2010 18:08:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>akei</category><category>dev</category><category>django</category><category>pip</category><category>python</category><category>virtualenv</category><category>virtualenvwrapper</category>    
    <description>    &lt;p&gt;Ahem, pour ceux qui ne l&amp;#8217;auraient pas compris, les billets techniques seront désormais publiés &lt;a href=&quot;http://blog.akei.com&quot; hreflang=&quot;fr&quot;&gt;sur le blog de ma société, Akei&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Tenez c&amp;#8217;est drôle, je viens justement d&amp;#8217;en publier un sur &lt;a href=&quot;http://blog.akei.com/post/573774396/installer-django-dans-un-environnement-python-virtuel&quot; hreflang=&quot;fr&quot;&gt;l&amp;#8217;installation de Django dans un environnement virtuel Python avec pip, virtualenv et virtualenvwrapper&lt;/a&gt;, c&amp;#8217;est fou ça.&lt;/p&gt;


&lt;p&gt;Pour faire valoir ce que de droit, veuillez madame, monsieur&amp;#8230;&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/05/05/Juste-pour-rappel&quot;&gt;Juste pour rappel&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Faire part de naissance</title>
    <link>http://prendreuncafe.com/blog/post/2010/04/20/Faire-part-de-naissance</link>
    <guid isPermaLink="false">urn:md5:c99f7a9d25815299d85aabf98db08e02</guid>
    <pubDate>Tue, 20 Apr 2010 21:12:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>akei</category><category>conseil</category><category>dev</category><category>django</category><category>formation</category><category>php</category><category>python</category><category>symfony</category>    
    <description>    &lt;p&gt;Ceux qui me suivent &lt;a href=&quot;http://twitter.com/n1k0&quot;&gt;sur twitter&lt;/a&gt; en ont eu la primeur, mais j&amp;#8217;officialise sur ce blog&amp;#160;: &lt;a href=&quot;http://www.akei.com&quot;&gt;Akei&lt;/a&gt;, ma société, est née.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.akei.com/&quot;&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Thematiques/Akei_Logo250.png&quot; alt=&quot;Akei&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Akei, avr. 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Akei met en avant une offre de services axée sur le &lt;a href=&quot;http://www.akei.com/fr/services/consulting&quot;&gt;conseil&lt;/a&gt;, la &lt;a href=&quot;http://www.akei.com/fr/services/training&quot;&gt;formation&lt;/a&gt; et le &lt;a href=&quot;http://www.akei.com/fr/services/development&quot;&gt;développement Web&lt;/a&gt;, autour de technologies variées comme &lt;a href=&quot;http://www.akei.com/fr/services/symfony&quot;&gt;PHP, Symfony&lt;/a&gt;, &lt;a href=&quot;http://www.akei.com/fr/services/django&quot;&gt;Python, Django&lt;/a&gt;&amp;#160;; mais plus que tout sur la &lt;a href=&quot;http://www.akei.com/fr/philosophy&quot;&gt;qualité&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Je ne m&amp;#8217;étalerai pas sur les longueurs et turpitudes administratives proprement &lt;a href=&quot;http://www.pole-emploi.fr/&quot;&gt;kafkaïennes&lt;/a&gt; qu&amp;#8217;il m&amp;#8217;a fallu affronter pour accoucher du bébé (et qui durent encore, soit dit en passant), mais je veux juste profiter de l&amp;#8217;instant pour vous inciter à &lt;a href=&quot;http://www.akei.com&quot;&gt;regarder ce site&lt;/a&gt;, à en lire les contenus, et à &lt;a href=&quot;http://www.akei.com/fr/contact&quot;&gt;prendre contact&lt;/a&gt; si vous vous reconnaissez dans la vision présentée, pour éventuellement - pourquoi pas&amp;#160;? - travailler ensemble sur vos projets Web.&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/04/20/Faire-part-de-naissance&quot;&gt;Faire part de naissance&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>RMLL 2010 : appel à conférences</title>
    <link>http://prendreuncafe.com/blog/post/2010/02/18/RMLL-2010-appel-a-conferences</link>
    <guid isPermaLink="false">urn:md5:d26349f0fd230564e805e09753d852e6</guid>
    <pubDate>Thu, 18 Feb 2010 08:52:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Libritudes</category>
        <category>communauté</category><category>conférence</category><category>internet</category><category>libre</category><category>rmll</category><category>web</category>    
    <description>    &lt;p&gt;D&amp;#8217;aucuns ne le sachant peut-être pas, je suis cette année co-responsable - avec &lt;a href=&quot;http://case.oncle-tom.net/&quot;&gt;Thomas Parisot&lt;/a&gt; - de l&amp;#8217;organisation des sessions Internet aux &lt;a href=&quot;http://2010.rmll.info/&quot;&gt;Rencontres Mondiales du Logiciel Libre&lt;/a&gt; qui se tiendront à Bordeaux du 6 au 11 juillet 2010.&lt;/p&gt;


&lt;p&gt;Si vous travaillez sur (ou avec) un projet libre ayant un rapport avec Internet (Web, XMPP, IRC, email, etc.), n&amp;#8217;hésitez pas à nous proposer un sujet de conférence technique en rapport. Trois formats d&amp;#8217;intervention sont disponibles&amp;#160;: 20, 40 ou 60 minutes (incluant la séance aux questions). Les conférences peuvent se tenir en français, en espagnol ou en anglais.&lt;/p&gt;


&lt;p&gt;Si vous souhaitez proposer un sujet de conférence, il vous suffit d&amp;#8217;envoyer un simple email d&amp;#8217;une dizaine de ligne présentant dans les grandes lignes votre thématique, à l&amp;#8217;adresse suivante&amp;#160;: &lt;a href=&quot;mailto:%69%6e%74%65%72%6e%65%74%40%6c%69%73%74%65%73%32%30%31%30%2e%72%6d%6c%6c%2e%69%6e%66%6f&quot;&gt;internet@listes2010.rmll.info&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Par contre, la date limite de dépôt des candidatures est fixée au 1er mars, autant vous dire qu&amp;#8217;il vous faut vous dépêcher si vous souhaitez postuler &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;

&lt;a href=&quot;http://2010.rmll.info/&quot;&gt;
  &lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Thematiques/rmll2010_big.jpg&quot; style=&quot;width:100%;margin:0 auto&quot; /&gt;
&lt;/a&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/02/18/RMLL-2010-appel-a-conferences&quot;&gt;RMLL 2010 : appel à conférences&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>User Dependent Forms with Symfony</title>
    <link>http://prendreuncafe.com/blog/post/2010/02/17/User-Dependant-Forms-with-Symfony</link>
    <guid isPermaLink="false">urn:md5:afa96fedd9e7bc61404cdf6e257005b0</guid>
    <pubDate>Wed, 17 Feb 2010 09:04:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>best practices</category><category>credentials</category><category>forms</category><category>php</category><category>security</category><category>session</category><category>symfony</category>    
    <description>    &lt;p&gt;While sadly not being at &lt;a href=&quot;http://www.symfony-live.com/&quot;&gt;Symfony Live 2010&lt;/a&gt; with pals, I&amp;#8217;m drowning my sorrow into tech tutorials writing.&lt;/p&gt;


&lt;p&gt;Sometimes you want to design forms and contextualize them regarding the current user session. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage the display of some fields regarding the user authentication status and credentials;&lt;/li&gt;
&lt;li&gt;Filter some queries used to get the values available in a &lt;code&gt;&amp;lt;select/&amp;gt;&lt;/code&gt; tag;&lt;/li&gt;
&lt;li&gt;Allow multiple steps form validation with step state persistence (wizzard);&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So how can we achieve this without using an evilish &lt;code&gt;sfContext::getInstance()-&amp;gt;getUser()&lt;/code&gt; call in the &lt;code&gt;configure()&lt;/code&gt; method of the form?&lt;/p&gt;


&lt;p&gt;Symfony &lt;del&gt;1.2&lt;/del&gt; &lt;strong&gt;1.3 and 1.4&lt;/strong&gt; introduced the generation of a project-wide &lt;code&gt;BaseForm&lt;/code&gt; class we can use here to setup some convenient methods to allow user setters and getters:&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php
class BaseForm extends sfFormSymfony
{
  static protected $user = null;

  static public function getUser()
  { 
    return self::$user;
  }

  static public function getValidUser()
  {
    if (!self::$user instanceof sfBasicSecurityUser)
    {
      throw new RuntimeException('No valid user instance available');
    }
    
    return self::$user;
  }

  static public function setUser(sfBasicSecurityUser $user)
  {
    self::$user = $user;
  }
}
&lt;/pre&gt;


&lt;p&gt;Okay, we now can set a user instance as a static property of all available forms within the project, nice. Wait, how the hell will we set the instance, and when?&lt;/p&gt;


&lt;p&gt;Symfony dispatch a very useful &lt;code&gt;context.load_factories&lt;/code&gt; event when all the factories - including the &lt;code&gt;user&lt;/code&gt; one - are instanciated and available in the context. So we can listen to this event and set the user instance to the forms when it&amp;#8217;s ready. We&amp;#8217;ll do this in the &lt;code&gt;ProjectConfiguration.class.php&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    // ...
    
    $this-&amp;gt;dispatcher-&amp;gt;connect('context.load_factories', array($this, 'listenToLoadFactoriesEvent'));
  }

  public function listenToLoadFactoriesEvent(sfEvent $event)
  {
    BaseForm::setUser($event-&amp;gt;getSubject()-&amp;gt;getUser());
  }
}
&lt;/pre&gt;


&lt;p&gt;So now we&amp;#8217;ve set a static user instance in every form at project configuration time, we can use it in any form.&lt;/p&gt;


&lt;p&gt;For example, imagine a form where only authenticated users having an &lt;code&gt;admin&lt;/code&gt; credential can see, fill and submit an hypothetic &lt;code&gt;is_published&lt;/code&gt; field:&lt;/p&gt;

&lt;pre&gt; php
class myForm extends BaseForm
{
  public function configure()
  {
    // will throw an exception if no user is available
    $user = self::getValidUser();
    
    $this-&amp;gt;setWidgets(array(
      'title' =&amp;gt; new sfWidgetFormInputText(),
      'body' =&amp;gt; new sfWidgetFormTextarea(),
    ));
    
    $this-&amp;gt;setValidators(array(
      'title' =&amp;gt; new sfValidatorString(array('min_length' =&amp;gt; 5)),
      'body' =&amp;gt; new sfValidatorString(array('min_length' =&amp;gt; 20)),
    ));
    
    if ($user-&amp;gt;isAuthenticated() &amp;amp;&amp;amp; $user-&amp;gt;hasCredential('admin'))
    {
      $this-&amp;gt;widgetSchema['is_published'] = new sfWidgetFormInputCheckbox();
      $this-&amp;gt;validatorSchema['is_published'] = new sfValidatorBoolean(array(
        'required' =&amp;gt; false,
      ));
    }
    
    // ...
  }
}
&lt;/pre&gt;


&lt;p&gt;Here a basic user won&amp;#8217;t see and won&amp;#8217;t be able to submit any value for the &lt;code&gt;is_published&lt;/code&gt; field. Note that all those changes won&amp;#8217;t ever affect the controllers or the model, and the forms will still be easily testable because the forms and the user instance are not tightly coupled.&lt;/p&gt;


&lt;p&gt;As a side note, you can also use the form options to eventually pass a user instance and fallback on the static instance in case it&amp;#8217;s not available:&lt;/p&gt;

&lt;pre&gt; php
class myForm extends BaseForm
{
  public function configure()
  {
    // will throw an exception if no user is available
    $user = $this-&amp;gt;getOption('user', self::getValidUser());
    
    // ...
  }
}
&lt;/pre&gt;


&lt;p&gt;In a controller, you would use it this way:&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php 
class fooActions extends sfActions
{
  public function executeBar(sfWebRequest $request)
  {
    $this-&amp;gt;form = new myForm(array('user' =&amp;gt; $this-&amp;gt;getUser()));
    
    // ...
  }
}
&lt;/pre&gt;


&lt;p&gt;A typical unit test suite of the form would be:&lt;/p&gt;

&lt;pre&gt; php
$t = new lime_test(2, new lime_output_color());

$user = new sfBasicSecurityUser(new sfEventDispatcher(), new sfSessionTestStorage(array(
  'session_path' =&amp;gt; sys_get_temp_dir(),
)));

$form = new myForm(array('user' =&amp;gt; $user));
$t-&amp;gt;is(count($form-&amp;gt;getWidgetSchema(), 2, '-&amp;gt;configure() displays 2 fields when user is not authenticated'));
$user-&amp;gt;setAuthenticated(true);
$user-&amp;gt;addCredential('admin');
$t-&amp;gt;is(count($form-&amp;gt;getWidgetSchema(), 3, '-&amp;gt;configure() displays 3 fields when user is authenticated and is an admin'));
// ... I'll let you complete the suite by yourself
&lt;/pre&gt;


&lt;p&gt;Now imagine we want to filter the choices offered by a one to many relationship field of a Doctrine form regarding user credentials:&lt;/p&gt;

&lt;pre&gt; php
class ArticleForm extends BaseArticleForm
{
  public function configure()
  {
    // will throw an exception if no user is available
    $user = $this-&amp;gt;getOption('user', self::getValidUser());
    
    // ...
    
    // Category choices
    $categoryQuery = $this-&amp;gt;getUserCategoryQuery($user);
    $this-&amp;gt;widgetSchema['category_id'] = new sfWidgetFormDoctrineChoice(array(
      'model' =&amp;gt; 'Category',
      'query' =&amp;gt; $categoryQuery,
    ));
    $this-&amp;gt;validatorSchema['community_id'] = new sfValidatorDoctrineChoice(array(
      'model' =&amp;gt; 'Category',
      'query' =&amp;gt; $categoryQuery,
    ));
  }
  
  /**
   * Please note that this method would naturally better fit in the model, in the 
   * ArticleTable class; We put this here for conciseness
   */
  protected function getUserCategoryQuery(sfBasicSecurityUser $user)
  {
    $query = Doctrine:getTable('Category')-&amp;gt;createQuery('c');
    
    // If user is not an admin, only allow choice of published categories
    if (!$user-&amp;gt;hasCredential('admin'))
    {
      $query-&amp;gt;where('c.is_published = 1');
    }
    
    return $query;
  }
}
&lt;/pre&gt;


&lt;p&gt;There are many more cool things you can achieve by offering user session access to a form, while keeping all the stuff easy to test.&lt;/p&gt;


&lt;p&gt;As usual, if you have a better way, feel free to tell us about it in the comments.&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/02/17/User-Dependant-Forms-with-Symfony&quot;&gt;User Dependent Forms with Symfony&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Bye, Flickr</title>
    <link>http://prendreuncafe.com/blog/post/2010/01/25/Bye%2C-Flickr</link>
    <guid isPermaLink="false">urn:md5:54bc6289f04d62729fc69ad4913841b5</guid>
    <pubDate>Mon, 25 Jan 2010 09:39:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
            
    <description>    &lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Divers/stop.jpg&quot; alt=&quot;Stop&quot; style=&quot;margin: 0 auto; display: block;&quot; title=&quot;Stop, janv. 2010&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In some hours, maybe days, my &lt;a href=&quot;http://flickr.com/photos/n1k0/&quot;&gt;flickr account&lt;/a&gt; will be destroyed, and its content will be gone, definitely.&lt;/p&gt;

&lt;p&gt;Looks like Flickr doesn&amp;#8217;t allow &amp;quot;sales links&amp;quot; within photo description:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/Divers/flickr-nosales.png&quot; alt=&quot;Flickr: no sales links allowed&quot; style=&quot;margin: 0 auto; display: block;&quot; title=&quot;Flickr: no sales links allowed, janv. 2010&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That doesn&amp;#8217;t fit my way of thinking my expensive hobby. I know, by putting links to &lt;a href=&quot;http://redbubble.com/&quot; rel=&quot;nofollow&quot;&gt;redbubble&lt;/a&gt; I&amp;#8217;m breaking the terms of service agreement, so I&amp;#8217;m the culprit, and Flickr is safe.&lt;/p&gt;

&lt;p&gt;Bye Flickr, after 5 years of paying my &amp;quot;pro&amp;quot; account fees, I&amp;#8217;m a bit sad to leave the community, but I can&amp;#8217;t stand paying for a service which doesn&amp;#8217;t allow me to manage my stuff the way I want. Especially when some &lt;em&gt;&lt;a href=&quot;http://www.flickr.com/photos/tjintjelaar/4199555847/&quot;&gt;Interesting&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/victoroliveira/3539908392/&quot;&gt;photos&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/88646149@N00/2000000000/&quot;&gt;of the day&lt;/a&gt;&lt;/em&gt;, highlighted by Flickr itself in its explore RSS feed, are using the same kind of links, but are still there, safe.&lt;/p&gt;

&lt;p&gt;Double standards? Not for me, thanks. Bye.&lt;/p&gt;

&lt;p&gt;PS: When I&amp;#8217;ll have a new dedicated self-hosted website, I&amp;#8217;ll keep you informed here. In the meanwhile, feel free to &lt;a href=&quot;http://www.redbubble.com/people/n1k0/&quot; rel=&quot;nofollow&quot;&gt;reach me at redbubble&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit: Done, flickr account is gone.&lt;/strong&gt; All the data it contained have been retrieved using the awesome &lt;a href=&quot;http://hsivonen.iki.fi/photobackup/&quot;&gt;photobackup&lt;/a&gt; utility, give it a go, even for backuping your flickr stream: it just works.&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/01/25/Bye%2C-Flickr&quot;&gt;Bye, Flickr&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Polar Beer</title>
    <link>http://prendreuncafe.com/blog/post/2010/01/07/Polar-Beer</link>
    <guid isPermaLink="false">urn:md5:60976b74416bd8b8dc6b1628743ed60a</guid>
    <pubDate>Thu, 07 Jan 2010 14:29:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>polar-geek</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://jehaisleprintemps.net/&quot; hreflang=&quot;fr&quot;&gt;Bruno Bord&lt;/a&gt; a eu l&amp;#8217;excellente idée de proposer une &lt;a href=&quot;http://polar-geek.org/&quot; hreflang=&quot;fr&quot;&gt;chaîne littéraire autour du concept de &amp;#8221;polar geek&amp;#8221;&lt;/a&gt;. J&amp;#8217;avais une heure à tuer, en voici donc le modeste résultat.&lt;/p&gt;    &lt;p&gt;La main qui secoua énergiquement mon bras me fit sursauter&amp;#160;; plus exactement, le mouvement me tira de la sieste que je tentai de mener à terme tant bien que mal. La silhouette qui me faisait face se dessinait progressivement peu à peu, passant du flou au moins flou, un peu à la manière d&amp;#8217;un Canikax d1000sx à lentille digiphotosensible intégrée. Je réactivai donc ma correction bio-optométrique en effectuant deux soulèvements de sourcils consécutifs. J&amp;#8217;avais pris l&amp;#8217;habitude de la désactiver avant de dormir, car cela pouvait parfois engendrer un conflit avec le pilote de mon régulateur de sommeil paradoxal dont le cerebrofirmware n&amp;#8217;avait pas été mis à jour par Applesoft suite à une upgrade malheureuse, partiellement liée au bug de l&amp;#8217;an 2048. Par Saint-Jobs, qu&amp;#8217;il ne fait pas bon vieillir&amp;#8230;&lt;/p&gt;


&lt;p&gt;Je distinguais maintenant clairement une jeune femme relativement agitée, qui semblait mouvoir ses lèvres, sans pourtant qu&amp;#8217;aucun son n&amp;#8217;en sorte. Je mis encore quelques secondes avant de réaliser que je n&amp;#8217;étais pas sorti du mode sourdine que j&amp;#8217;avais cru bon d&amp;#8217;enclencher pour tenter de m&amp;#8217;assoupir plus efficacement. Satané matos intégré, qu&amp;#8217;il était doux le temps où l&amp;#8217;on pouvait s&amp;#8217;en passer&amp;#160;! J&amp;#8217;en venais presque à regretter ma vieille paire de lunettes et mon casque intra-auriculaire du siècle dernier, finalement&amp;#8230; Bref, deux pressions sur mon lobe gauche et j&amp;#8217;accédais enfin au discours de mon interlocutrice.&lt;/p&gt;


&lt;p&gt;— Inspecteur Knox&amp;#8230; INSPECTEUR KNOX&amp;#160;! m&amp;#8217;entendez-vous&amp;#160;?&lt;br /&gt;
— Je vous entends mademoiselle, je vous entends&amp;#8230; Veuillez m&amp;#8217;excuser mais j&amp;#8217;ai vraiment du mal à me faire à ma nouvelle cyberassistance&amp;#8230;&lt;br /&gt;
— Inspecteur, désolé de vous importuner de la sorte, mais vous ne répondiez pas à mes holomails, aussi j&amp;#8217;ai cru bon de passer directement à votre bureau&amp;#8230;&lt;br /&gt;
— Je ne relève plus mes holomails. Je ne reçois que de la pub. C&amp;#8217;est toujours un peu déroutant de voir, à l&amp;#8217;ouverture, débarquer dans la pièce des sexes en érection sautillants, une togolaise fraîchement endeuillée qui tombe en larme, des grassouillets qui fondent en quelques secondes&amp;#8230; Même holographiques, ces images me perturbent et m&amp;#8217;empêchent de me concentrer. Je crois que je m&amp;#8217;y ferai jamais. Tenez l&amp;#8217;autre jour, ma femme en a reçu un qui&amp;#8230;&lt;/p&gt;


&lt;p&gt;Elle ne me laissa pas finir ma phrase.&lt;/p&gt;


&lt;p&gt;— Je comprends. Mais le sujet pour lequel je viens vous consulter aujourd&amp;#8217;hui est sérieux, et nécessite les compétences d&amp;#8217;un fin limier expérimenté tel que vous&amp;#160;; la société pour laquelle je travaille vient de fusionner avec une SSII du Poitou, et nous récupérons leurs anciens applicatifs métiers.&lt;br /&gt;
— Jusque là, rien que de très banal.&lt;br /&gt;
— Les fichiers récupérés sont dans un langage étrange, qu&amp;#8217;aucun de nos ingénieurs ne parvient à déchiffrer.&lt;br /&gt;
— Les concepteurs originels devraient pouvoir intervenir et vous éclairer&amp;#8230;&lt;br /&gt;
— C&amp;#8217;est compliqué. Ils ont pour la plupart démissionné, sont tombés en arrêt maladie longue durée ou partis à la retraite. Certains seraient actuellement en poste chez France Telecom, y trouvant les conditions de travail plus sereines. Mais aucun ne répond à nos appels.&lt;br /&gt;
— Bon. Mais l&amp;#8217;applicatif tourne&amp;#160;?&lt;br /&gt;
— Oui. Enfin, non. C&amp;#8217;est étrange, ça semble fonctionner, mais parfois les pages sont blanches sans qu&amp;#8217;on ait la moindre explication. Forcément, personne n&amp;#8217;arrive à en reprendre la source pour en assurer la maintenance et l&amp;#8217;évolution. Des fois, seul un message texte abscons est affiché. Dernièrement nous avons eu droit à ce message pour le moins cryptique à la soumission d&amp;#8217;un formulaire de contact&amp;#160;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in Command line code on line 1&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;A peine ces mots furent prononcés que de lointaines bribes de souvenirs resurgirent des limbes de mon esprit, en un éclair. J&amp;#8217;avais déjà été confronté à ce type de messages, j&amp;#8217;en étais certain. Cette sensation douloureuse, ce sentiment d&amp;#8217;impuissance, cette rage pour en comprendre la cause, qui souvent restait vaine&amp;#8230; Mais impossible de remettre un nom sur ce langage diabolique, qui avait pourtant causé de nombreuses dépressions et départs à la retraite anticipés dans le métier.&lt;/p&gt;


&lt;p&gt;— Fournissez-moi un accès submercuritaar que j&amp;#8217;examine le code en question.&lt;br /&gt;
— C&amp;#8217;est que&amp;#8230;&lt;br /&gt;
— Quoi&amp;#160;?&lt;br /&gt;
— Le code en question réside sur une machine virtuelle configurée d&amp;#8217;époque, et tourne sur ce qui reste du cloud, en Moldavie. Le code n&amp;#8217;est pas versionné, aucun gestionnaire de code source n&amp;#8217;y avait été installé à l&amp;#8217;époque. Ou du moins, il semble qu&amp;#8217;ils utilisaient alors un outil du nom de «&amp;#160;FTP&amp;#160;» pour gérer les déploiements. Un de nos directeurs projet, qui avait commencé comme intégrateur ColdFusion au siècle dernier, a pu récupérer les sources sous forme d&amp;#8217;archive compressée en reverse-engineerant le protocole en question. Mais il est malheurseusement mort quelques heures plus tard, en délirant. Son dernier mot a été &amp;quot;CyberDuck&amp;quot;, mais nous n&amp;#8217;avons pas compris ce qu&amp;#8217;il voulait nous transmettre&amp;#8230; Un mot de passe, peut-être&amp;#160;?&lt;/p&gt;


&lt;p&gt;D&amp;#8217;un coup, ma migraine, cette vieille garce, se réinvitait dans ma boîte crânienne. Ce satané mal de tête qui survenait à coup sûr quand j&amp;#8217;étais confronté à mes vieux démons, ceux qui avaient causé mon retrait de la production pour me consacrer à l&amp;#8217;investigation technologique dans les années dix. J&amp;#8217;activai d&amp;#8217;une pression sur mon téton droit la console HUD de mes lentilles de contact, et lançai une instance du programme de régulation de pression intracrânienne que m&amp;#8217;avait fourni mon biosysadmin-traitant.&lt;/p&gt;


&lt;p&gt;— Je vais voir ce que je peux faire. Transférez-moi l&amp;#8217;archive par pneuoveripv6, je tâcherai d&amp;#8217;y voir un peu plus clair. Je vous tiens au courant.&lt;/p&gt;


&lt;p&gt;- &lt;em&gt;Fin de la première partie&lt;/em&gt; -&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/01/07/Polar-Beer&quot;&gt;Polar Beer&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Je vends mon Canon 450D + 18-55mm f/3.5-5.6 + 55/250mm f/3.5-5.6 + Sigma 30mm f/1.4</title>
    <link>http://prendreuncafe.com/blog/post/2010/01/01/Je-vends-mon-Canon-450D-18-55mm-f%3A3.5-5.6-55%3A250mm-f%3A3.5-5.6-Sigma-30mm-f%3A1.4</link>
    <guid isPermaLink="false">urn:md5:db61790d4aff2d1aacb31aafbfa03b10</guid>
    <pubDate>Fri, 01 Jan 2010 16:18:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>canon</category><category>matériel</category><category>objectifs</category><category>occasion</category><category>photo</category><category>vente</category>    
    <description>    &lt;p&gt;&lt;strong&gt;Edit&amp;#160;:&lt;/strong&gt; C&amp;#8217;est tout vendu, désolé pour ceux qui tomberaient sur ce post après la bataille. J&amp;#8217;ai finalement acheté un Canon 5D d&amp;#8217;occasion nanti d&amp;#8217;un zoom grand angle 20-35mmL de la marque, pour moins de la moitié du prix d&amp;#8217;un 5D mark II neuf. Je ne suis qu&amp;#8217;un amateur, et je me voyais pas finir à faire mariages ou photos de bébé pour payer le matos. Je reste donc libre de shooter ce que je veux, quand je veux, mais en full-frame &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align:center&quot;&gt;***&lt;/p&gt;



&lt;p&gt;Une fois n&amp;#8217;est pas coutume, je vais profiter de ce blog pour &lt;del&gt;vous souhaiter une bonne année&lt;/del&gt; passer une petite annonce&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/01/01/Je-vends-mon-Canon-450D-18-55mm-f%3A3.5-5.6-55%3A250mm-f%3A3.5-5.6-Sigma-30mm-f%3A1.4#pnote-1132-1&quot; id=&quot;rev-pnote-1132-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. Suite à une &lt;del&gt;trop&lt;/del&gt; &lt;a href=&quot;http://www.canon.fr/For_Home/Product_Finder/Cameras/Digital_SLR/EOS_5D_Mark_II/index.asp&quot; hreflang=&quot;fr&quot;&gt;grosse acquisition&lt;/a&gt;, je vends une grosse partie de mon matériel photo actuel&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kit &lt;strong&gt;&lt;a href=&quot;http://www.canon.fr/For_Home/Product_Finder/Cameras/Digital_SLR/EOS_450D/index.asp&quot; hreflang=&quot;fr&quot;&gt;Canon EOS 450D&lt;/a&gt; + objectif 18-55mm f/3.5-5.6 IS (stabilisé)&lt;/strong&gt; + boîte + batterie d&amp;#8217;origine + chargeur
&lt;ul&gt;
&lt;li&gt;L&amp;#8217;objectif est celui  du kit de base proposé par Canon. J&amp;#8217;en ai toujours été très satisfait, même s&amp;#8217;il mériterait d&amp;#8217;être un peu plus lumineux (c&amp;#8217;est là où le Sigma prend avantageusement la main, d&amp;#8217;ailleurs).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.focus-numerique.com/test-55/reflex-canon-450D-presentation-caracteristiques-1.html&quot; hreflang=&quot;fr&quot;&gt;Lire un test du boîtier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/n1k0/tags/lens:type%3Defs1855mmf3556is/&quot;&gt;Voir les photos réalisées avec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif &lt;a href=&quot;http://www.canon.fr/For_Home/Product_Finder/Cameras/EF_Lenses/Image_Stabilization_Lenses/EF-S_55-250mm_f_4-5_6_IS/index.asp&quot; hreflang=&quot;fr&quot;&gt;55-250mm f/3.5-5.6 IS&lt;/a&gt; (stabilisé)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;C&amp;#8217;est un télé-objectif phénoménal en regard de son prix d&amp;#8217;achat, qui a d&amp;#8217;ailleurs reçu le &lt;a href=&quot;http://www.tipa.com/french/awards-search.php?searchType=byYear&amp;amp;searchValue=2008&quot; hreflang=&quot;en&quot;&gt;prix TIPA 2008 du meilleur objectif&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.objectifs-canon.com/canon/objectif_stabilise/cat_304/EF-S_55-250mm_f__4-5.6_IS/id_126&quot; hreflang=&quot;fr&quot;&gt;Lire un test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/n1k0/tags/lens:type%3Defs55250mmf456is/&quot;&gt;Voir les photos réalisées avec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif &lt;a href=&quot;http://www.sigmaphoto.com/lenses/lenses_all_details.asp?id=3300&amp;amp;navigator=6&quot; hreflang=&quot;en&quot;&gt;Sigma 30mm f/1.4 HSM&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Mon objectif préféré: ultra lumineux, robuste et offrant un superbe piqué dès f/5.6. Son petit nom, c&amp;#8217;est Night Hawk, la photo en basse lumière c&amp;#8217;est sa spécialité &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.reflex-numerique.fr/Test-Objectif-pour-reflex,560.html&quot; hreflang=&quot;fr&quot;&gt;Lire un test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/n1k0/tags/camera:lens%3D30mm/&quot;&gt;Voir les photos réalisées avec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le matériel est en excellent état. Maintenant, voila le prix que j&amp;#8217;en demande&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour &lt;strong&gt;690€&lt;/strong&gt;, je vous cède &lt;strong&gt;le 450D, le 18-55mm, le 55-250mm et le Sigma 30mm&lt;/strong&gt;&amp;#160;;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;490€&lt;/strong&gt;, je vous cède &lt;strong&gt;le 450D + 18-55mm + 55-250mm&lt;/strong&gt;&amp;#160;;&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;Sigma 30mm seul&lt;/strong&gt; est proposé à &lt;strong&gt;290€&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je n&amp;#8217;ai pas très envie de vendre le 55-250mm hors pack, désolé&amp;#8230; mais le pack complet est - je pense - proposé ici à un tarif très intéressant, même pour de l&amp;#8217;occasion.&lt;/p&gt;


&lt;p&gt;Habitant sur Montpellier, je préfèrerai bien évidemment une remise en main propre&amp;#160;; si je dois expédier le barda, les frais d&amp;#8217;expédition seront en sus.&lt;/p&gt;


&lt;p&gt;Si vous êtes intéressé, &lt;a href=&quot;http://prendreuncafe.com/blog/contact&quot;&gt;contactez-moi&lt;/a&gt; &lt;img src=&quot;/blog/themes/battlestar/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/01/01/Je-vends-mon-Canon-450D-18-55mm-f%3A3.5-5.6-55%3A250mm-f%3A3.5-5.6-Sigma-30mm-f%3A1.4#rev-pnote-1132-1&quot; id=&quot;pnote-1132-1&quot;&gt;1&lt;/a&gt;] Bon allez, c&amp;#8217;est bien parce que c&amp;#8217;est vous&amp;#160;: bonne année.&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2010/01/01/Je-vends-mon-Canon-450D-18-55mm-f%3A3.5-5.6-55%3A250mm-f%3A3.5-5.6-Sigma-30mm-f%3A1.4&quot;&gt;Je vends mon Canon 450D + 18-55mm f/3.5-5.6 + 55/250mm f/3.5-5.6 + Sigma 30mm f/1.4&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Symfony Development using Textmate</title>
    <link>http://prendreuncafe.com/blog/post/2009/12/16/Symfony-Development-using-Textmate</link>
    <guid isPermaLink="false">urn:md5:bd4ca88c19a951de03a540798feb7467</guid>
    <pubDate>Wed, 16 Dec 2009 08:45:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>osx</category><category>symfony</category><category>textmate</category>    
    <description>    &lt;p&gt;When I do consulting, a lot of people are really surprised that I use &lt;a href=&quot;http://macromates.com/&quot; hreflang=&quot;en&quot;&gt;Texmate&lt;/a&gt;, a popular text editor for OS X, to develop on &lt;a href=&quot;http://www.symfony-project.org/&quot; hreflang=&quot;en&quot;&gt;Symfony&lt;/a&gt; projects. Indeed, Textmate is a bit rough around the edge compared to &lt;del&gt;bloated&lt;/del&gt; full featured &lt;acronym title=&quot;Integrated Development Environment&quot;&gt;IDE&lt;/acronym&gt; like &lt;a href=&quot;http://www.eclipse.org/pdt/&quot; hreflang=&quot;en&quot;&gt;Eclipse PDT&lt;/a&gt; or &lt;a href=&quot;http://netbeans.org/&quot; hreflang=&quot;en&quot;&gt;Netbeans&lt;/a&gt;, which are both Java based by the way.&lt;/p&gt;


&lt;p&gt;So why using Textmate? No intelligent autocompletion, very basic project management, poor &lt;acronym title=&quot;Version Control System&quot;&gt;VCS&lt;/acronym&gt; native support, limited index search capabilities&amp;#8230; First and while it&amp;#8217;s mainly a matter of taste, I mainly use Texmate because it&amp;#8217;s &lt;em&gt;fast&lt;/em&gt;. Compared to PDT with which you often have to wait a bunch of seconds for the UI to respond on some action you make, &lt;em&gt;mate&lt;/em&gt; will react quite instantaneously, and &lt;strong&gt;that&lt;/strong&gt; is making big difference to me. Because when I&amp;#8217;m concentrated, focused on some complex problem to solve, I demand my text editor to &lt;strong&gt;not make me wait&lt;/strong&gt; &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2009/12/16/Symfony-Development-using-Textmate#pnote-1131-1&quot; id=&quot;rev-pnote-1131-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Oppositely, not having full code introspection and autocompletion makes mate &lt;strong&gt;making me think&lt;/strong&gt; about the code I write, instead of just consuming some API passively. I&amp;#8217;ve been using &lt;a href=&quot;http://www.phpeclipse.com/&quot; hreflang=&quot;en&quot;&gt;phpeclipse&lt;/a&gt; and PDT for some years with Symfony, but I think I really began to understand the framework architecture when I switched to mate as my primary editor. Because every time you need to do something with the Symfony API, you &lt;em&gt;have&lt;/em&gt; to open the file and read the code: then you learn a lot. And by the time, you end by knowing the core very well, and it&amp;#8217;s incredibly efficient. One more time, this is just matter of taste.&lt;/p&gt;


&lt;h3&gt;Textmate quick tips&lt;/h3&gt;


&lt;p&gt;So whereas mate can be somewhat limited at first glance, a second look shows it provides some really effective commands to enhance your productivity. Let&amp;#8217;s examine some of them.&lt;/p&gt;


&lt;h4&gt;Searching for a file within the project codebase&lt;/h4&gt;


&lt;p&gt;Just by pressing &lt;code&gt;⌘ + t&lt;/code&gt;, a snappy filename search window will pop up and allow you to search a file interactively by its name pattern. If you&amp;#8217;re using the incredible &lt;a href=&quot;http://docs.blacktree.com/quicksilver/what_is_quicksilver&quot; hreflang=&quot;en&quot;&gt;Quicksilver app&lt;/a&gt; for osx, you got the picture.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/interactive-filename-search.png&quot; alt=&quot;interactive-filename-search.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;interactive-filename-search.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;As Symfony names php files against the class name they contain, finding a class file is just easy as typing the class name in the search field!&lt;/p&gt;


&lt;h4&gt;Browsing the available functions, classes and methods within a php file&lt;/h4&gt;


&lt;p&gt;When a php file is opened, the &lt;code&gt;⌘ + shift + t&lt;/code&gt; command will show up the available sections of the document, with a search box you can use to filter their names, still interactively.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/interactive-method-name-search.png&quot; alt=&quot;interactive-method-name-search.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;interactive-method-name-search.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Note that this will also work for other file types (like CSS for instance).&lt;/p&gt;


&lt;h4&gt;Obtening help on native php functions&lt;/h4&gt;


&lt;p&gt;Move the carret onto some php native function and press &lt;code&gt;ctrl + h&lt;/code&gt; and you&amp;#8217;ll get the &lt;a href=&quot;http://php.net/&quot; hreflang=&quot;en&quot;&gt;php.net&lt;/a&gt; related page in a pop up.&lt;/p&gt;


&lt;p&gt;Want the function signature definition in a tooltip, like in PDT or Netbeans? Hit &lt;code&gt;⌥ + F1&lt;/code&gt; and you&amp;#8217;re done.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/signature-tooltip.png&quot; alt=&quot;signature-tooltip.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;signature-tooltip.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;Using the &lt;code&gt;mate&lt;/code&gt; command line utility&lt;/h4&gt;


&lt;p&gt;Textmate ships with a native command line interface executable called &lt;code&gt;mate&lt;/code&gt; you can use from your term:&lt;/p&gt;

&lt;pre&gt;
$ cd /path/to/project
$ mate .
&lt;/pre&gt;


&lt;p&gt;You can also &lt;em&gt;pipe&lt;/em&gt; some command to &lt;code&gt;mate&lt;/code&gt; to open the output in it:&lt;/p&gt;

&lt;pre&gt;
$ svn diff|mate
&lt;/pre&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/diff-mate.png&quot; alt=&quot;diff-mate.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;diff-mate.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;Taking part of Mate&amp;#8217;s url-scheme capabilities with Symfony&lt;/h4&gt;


&lt;p&gt;I already blogged about this &lt;a href=&quot;http://prendreuncafe.com/blog/post/2009/10/12/A-Symfony-1.3-Gem:-Open-Files-Listed-in-Exceptions-with-the-Editor-of-your-Choice&quot; hreflang=&quot;en&quot;&gt;awesome feature&lt;/a&gt; available since Symfony 1.3, one more I won&amp;#8217;t ever be able to live without.&lt;/p&gt;


&lt;h3&gt;Improve your productivity using bundles&lt;/h3&gt;


&lt;h4&gt;The &lt;a href=&quot;http://github.com/protocool/ack-tmbundle&quot; hreflang=&quot;en&quot;&gt;Ack in project&lt;/a&gt; bundle&lt;/h4&gt;


&lt;p&gt;One of the most annoying lack of mate is its internal search engine. It&amp;#8217;s really damn slow. The best way to get something decent is to install the &lt;a href=&quot;http://github.com/protocool/ack-tmbundle&quot; hreflang=&quot;en&quot;&gt;Ack in project&lt;/a&gt; bundle. You&amp;#8217;ll then be able to access a fast and convenient fulltext search engine by pressing the &lt;code&gt;⌘ + shift + a&lt;/code&gt; command.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/ack-in-project.png&quot; alt=&quot;ack-in-project.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;ack-in-project.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;The &lt;a href=&quot;http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus&quot; hreflang=&quot;en&quot;&gt;ProjectPlus&lt;/a&gt; bundle&lt;/h4&gt;


&lt;p&gt;If you&amp;#8217;re looking after a better project browser and some VCS support in mate, you&amp;#8217;ll love the &lt;a href=&quot;http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus&quot; hreflang=&quot;en&quot;&gt;ProjectPlus bundle&lt;/a&gt;. It will replace the default project drawer by a new one with finder label colors support, file sorting options and VCS icons integration. Give it a try, you won&amp;#8217;t be able to live without it.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/project-plus-drawer.png&quot; alt=&quot;project-plus-drawer.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;project-plus-drawer.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;The &lt;a href=&quot;http://github.com/denderello/symfony-tmbundle&quot; hreflang=&quot;en&quot;&gt;Symfony&lt;/a&gt; bundle&lt;/h4&gt;


&lt;p&gt;How could I write a blog post on Textmate and Symfony without mentioning the &lt;a href=&quot;http://github.com/denderello/symfony-tmbundle&quot; hreflang=&quot;en&quot;&gt;Symfony bundle&lt;/a&gt;? &lt;a href=&quot;http://www.denderello.com/&quot; hreflang=&quot;en&quot;&gt;Denderello&lt;/a&gt; and contributors did a really good job taking over the original tool, which provides very convenient and effective shortcuts to write Symfony snippets of code quickly.&lt;/p&gt;


&lt;h4&gt;The &lt;a href=&quot;http://github.com/textmate/getbundle.tmbundle&quot; hreflang=&quot;en&quot;&gt;GetBundle&lt;/a&gt; bundle&lt;/h4&gt;


&lt;p&gt;Last, if you didn&amp;#8217;t find anything new or useful reading this blog entry, you might then be interested by installing the &lt;a href=&quot;http://github.com/textmate/getbundle.tmbundle&quot; hreflang=&quot;en&quot;&gt;GetBundle&lt;/a&gt; bundle which will allow you to browse all available bundles and install any of them in one click!&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Textmate/GetBundle.png&quot; alt=&quot;GetBundle.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;GetBundle.png, déc. 2009&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;So these are some of the reasons why I&amp;#8217;m using Textmate when developing with Symfony (and other languages too). &lt;strong&gt;What are yours?&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2009/12/16/Symfony-Development-using-Textmate#rev-pnote-1131-1&quot; id=&quot;pnote-1131-1&quot;&gt;1&lt;/a&gt;] You know the &lt;q&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Don't_Make_Me_Think&quot; hreflang=&quot;en&quot;&gt;don&amp;#8217;t make me think&lt;/a&gt;&lt;/q&gt; mantra? Well, now you got another one &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2009/12/16/Symfony-Development-using-Textmate&quot;&gt;Symfony Development using Textmate&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>

