<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[./victor.sh]]></title>
  <link href="http://victor.sh/atom.xml" rel="self"/>
  <link href="http://victor.sh/"/>
  <updated>2014-09-05T17:32:13+02:00</updated>
  <id>http://victor.sh/</id>
  <author>
    <name><![CDATA[Victor Jalencas]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Another RubyMotion book]]></title>
    <link href="http://victor.sh/blog/2013/08/08/another-rubymotion-book/"/>
    <updated>2013-08-08T11:58:00+02:00</updated>
    <id>http://victor.sh/blog/2013/08/08/another-rubymotion-book</id>
    <content type="html"><![CDATA[<p>This week, <a href="http://shop.oreilly.com">O&#8217;Reilly ebook storefront</a> welcomed <a href="http://www.packtpub.com">Packt Publishing</a>, the british publisher of technical books to their virtual aisles. Coincidentally, they asked me to review their latest <a href="http://rubymotion.com">RubyMotion</a> book, <a href="http://www.packtpub.com/rubymotion-ios-development-essentials/book">RubyMotion iOS Development Essentials</a>, which I will gladly do. They generously provided me with a review copy and I will be reading it during my vacation, and post the review when I come back, but you can follow my progress, as always, on <a href="https://readmill.com/victor">Readmill</a>. Be sure to follow me there to get valuable insights on this and many other books, both technical and fiction.</p>

<p><img src="images/RubyMotion-book.jpg" width="250" height="308" title="'RubyMotion book cover'" ></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Customizing UITextFields to look like table cells]]></title>
    <link href="http://victor.sh/blog/2013/03/31/customizing-uitextfields-to-look-like-table-cells/"/>
    <updated>2013-03-31T23:04:00+02:00</updated>
    <id>http://victor.sh/blog/2013/03/31/customizing-uitextfields-to-look-like-table-cells</id>
    <content type="html"><![CDATA[<p>Many times, when showing configuration interfaces or login forms on iOS apps, we want to show a form that looks like a grouped table view, with rounded corners and so on.</p>

<p>Until recently, one way to do it was to add a table view and implement the datasource and delegate methods. More recently, thanks to the static table views, we can do it a tad more easily.</p>

<p>Still, that&rsquo;s still too complex. I’m going to show a way to do it using only <code>UITextField</code>s, and using its layer properties and a bit of Quartz magic to make the text fields look nice.</p>

<p>This is what we are after:</p>

<p>Let’s begin by adding our own <code>UITextField</code> subclass. We could use categories for this, or <code>UIAppearance</code> proxies, but I think it is cleaner to just extend the standard class, specially if we want to keep using normal text fields on other parts of the app.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ssHFARoundedTextField</span><span class="p">.</span><span class="n">h</span>
</span><span class='line'><span class="cp">#import &lt;UIKit/UIKit.h&gt;</span>
</span><span class='line'><span class="k">@interface</span> <span class="nc">HFARoundedTextField</span> : <span class="nc">UITextField</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">HFARoundedTextField</span><span class="p">.</span><span class="n">m</span>
</span><span class='line'><span class="cp">#import &quot;HFARoundedTextField.h&quot;</span>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">HFARoundedTextField</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithFrame:</span><span class="p">(</span><span class="n">CGRect</span><span class="p">)</span><span class="nv">frame</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithFrame:</span><span class="n">frame</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Initialization code</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithCoder:</span><span class="p">(</span><span class="n">NSCoder</span> <span class="o">*</span><span class="p">)</span><span class="nv">aDecoder</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithCoder:</span><span class="n">aDecoder</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is important to add the <code>initWithCoder:</code> method so that the class will work when used from Interface Builder.</p>

<p>Let&rsquo;s also add a few of them to a XIB file so that we can see the results. Start by dragging a <code>UITextField</code> from the object library to main view of a view controller. Make it 44 pixels high, which is the normal row height of a table view. In the identity inspector (⌥⌘3), change its class to <code>HFARoundedTextField</code>. Now add some placeholder string to it. And then, duplicate it a few times and place the resulting controls so that their borders overlap (it’s easier if you change their border styles first to Line):</p>

<p><img src="http://victor.sh/images/InterfaceBuilder.png" width="372" height="622" title="'Figure 2'" ></p>

<!-- more -->


<p>Let’s start by forcing the border style to none, to avoid the default rendering of the other border styles from interfering. To do that, we’ll modify the initializers to force this border style:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">HFARoundedTextField</span><span class="p">.</span><span class="n">m</span> <span class="p">(</span><span class="n">fragment</span><span class="p">)</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nl">initWithFrame:</span><span class="p">(</span><span class="n">CGRect</span><span class="p">)</span><span class="n">frame</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithFrame:</span><span class="n">frame</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Initialization code</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">borderStyle</span> <span class="o">=</span> <span class="n">UITextBorderStyleNone</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nl">initWithCoder:</span><span class="p">(</span><span class="n">NSCoder</span> <span class="o">*</span><span class="p">)</span><span class="n">aDecoder</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithCoder:</span><span class="n">aDecoder</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">borderStyle</span> <span class="o">=</span> <span class="n">UITextBorderStyleNone</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The next step is changing the clip path. To do that, we need to add a new layer as a mask. This clip mask needs to cut the rounded corners. Since depending on the position of the control, we need to cut different corners, we need a way to specify which of the corners need to be rounded.</p>

<p>So, we first add a new property to specify which of the four corners are rounded. There’s a type in Cocoa Touch just for that: <code>UIRectCorner</code>. While we declare it as a property, we’ll override the setter to do the actual work. While we are at it, we’ll also define a couple of auxiliary properties that will help us draw the borders.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">HFARoundedTextField</span><span class="p">.</span><span class="n">h</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  HFARoundedTextField.h</span>
</span><span class='line'><span class="c1">//  Rounded Text Fields Demo</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Victor Jalencas on 31/03/13.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Hand Forged Apps. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;UIKit/UIKit.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">HFARoundedTextField</span> : <span class="nc">UITextField</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">UIRectCorner</span> <span class="n">roundedCorners</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">CGFloat</span> <span class="n">cornerRadius</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">HFARoundedTextField</span><span class="p">.</span><span class="n">m</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  HFARoundedTextField.m</span>
</span><span class='line'><span class="c1">//  Rounded Text Fields Demo</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Victor Jalencas on 31/03/13.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Hand Forged Apps. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;HFARoundedTextField.h&quot;</span>
</span><span class='line'><span class="cp">#import &lt;QuartzCore/QuartzCore.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">HFARoundedTextField</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithFrame:</span><span class="p">(</span><span class="n">CGRect</span><span class="p">)</span><span class="nv">frame</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithFrame:</span><span class="n">frame</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Initialization code</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">borderStyle</span> <span class="o">=</span> <span class="n">UITextBorderStyleNone</span><span class="p">;</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">cornerRadius</span> <span class="o">=</span> <span class="mf">9.0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithCoder:</span><span class="p">(</span><span class="n">NSCoder</span> <span class="o">*</span><span class="p">)</span><span class="nv">aDecoder</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="nl">initWithCoder:</span><span class="n">aDecoder</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">borderStyle</span> <span class="o">=</span> <span class="n">UITextBorderStyleNone</span><span class="p">;</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">cornerRadius</span> <span class="o">=</span> <span class="mf">9.0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setRoundedCorners:</span><span class="p">(</span><span class="n">UIRectCorner</span><span class="p">)</span><span class="nv">roundedCorners</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">CGRect</span> <span class="n">bounds</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">layer</span><span class="p">.</span><span class="n">bounds</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">UIBezierPath</span> <span class="o">*</span><span class="n">roundedRectPath</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIBezierPath</span> <span class="nl">bezierPathWithRoundedRect:</span><span class="n">bounds</span> <span class="nl">byRoundingCorners:</span><span class="n">roundedCorners</span> <span class="nl">cornerRadii:</span><span class="n">CGSizeMake</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">cornerRadius</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">cornerRadius</span><span class="p">)];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">CAShapeLayer</span> <span class="o">*</span><span class="n">maskLayer</span> <span class="o">=</span> <span class="p">[</span><span class="n">CAShapeLayer</span> <span class="n">layer</span><span class="p">];</span>
</span><span class='line'>    <span class="n">maskLayer</span><span class="p">.</span><span class="n">frame</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">;</span>
</span><span class='line'>    <span class="n">maskLayer</span><span class="p">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">roundedRectPath</span><span class="p">.</span><span class="n">CGPath</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">self</span><span class="p">.</span><span class="n">layer</span><span class="p">.</span><span class="n">mask</span> <span class="o">=</span> <span class="n">maskLayer</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">CAShapeLayer</span> <span class="o">*</span><span class="n">borderLayer</span> <span class="o">=</span> <span class="p">[</span><span class="n">CAShapeLayer</span> <span class="n">layer</span><span class="p">];</span>
</span><span class='line'>    <span class="n">borderLayer</span><span class="p">.</span><span class="n">fillColor</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>    <span class="n">borderLayer</span><span class="p">.</span><span class="n">strokeColor</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">strokeColor</span><span class="p">.</span><span class="n">CGColor</span><span class="p">;</span>
</span><span class='line'>    <span class="n">borderLayer</span><span class="p">.</span><span class="n">lineWidth</span> <span class="o">=</span> <span class="mf">2.0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">borderLayer</span><span class="p">.</span><span class="n">frame</span> <span class="o">=</span> <span class="n">bounds</span><span class="p">;</span>
</span><span class='line'>    <span class="n">borderLayer</span><span class="p">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">roundedRectPath</span><span class="p">.</span><span class="n">CGPath</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">layer</span> <span class="nl">addSublayer:</span><span class="n">borderLayer</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we do is define a <code>CGPath</code> with the rounded rect shape (rounding whatever corners are specified). This path is used for two things: one, to define a layer mask (which will make the view’s corners show whatever is behind), and the other, to render the border. For both purposes, we create a new <code>CAShapeLayer</code> whose path is the path we created.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[And another new job]]></title>
    <link href="http://victor.sh/blog/2013/02/19/and-another-new-job/"/>
    <updated>2013-02-19T14:30:00+01:00</updated>
    <id>http://victor.sh/blog/2013/02/19/and-another-new-job</id>
    <content type="html"><![CDATA[<p>It is again that time in which I announce here on my blog that I am changing job. I think I came to a point in which I wasn’t learning much new things, and I was starting to not see the point in staying at ISIS.</p>

<p>So, I looked around a bit. And, possibly in part because I was working until now for a foreign company and became spoiled, and possibly because of the Spanish crisis, I couldn’t find a decent iOS development job in Barcelona that had a decent salary. So I started to look for foreign companies that would allow me to work from Barcelona.</p>

<p>To tell the truth, for all the talk that you hear about how easy it is in XXI<sup>st</sup> Century to work remotely –perhaps I listen too much to the <a href="http://www.wideteams.com">Wide Teams Podcast</a>– I couldn’t find many companies interested in hiring a remote iOS developer. Perhaps I wasn’t searching in the proper way, I don’t know.</p>

<p>Finally, just a few days ago, I learned about a position doing iOS development for <a href="http://stelladot.com/">Stella &amp; Dot</a>. They are setting up a remote team in Barcelona, just a mere 10 minutes from my current workplace. I applied and before I knew it, I landed the job and I am starting next month. I get the benefits of working for a remote company, but I don’t do it alone, there is an office where all the team works from.</p>

<p>The position is in fact, as an independent contractor, since they have no fiscal presence in Spain yet, so I will become a freelancer and invoice the US company directly. This is all new ground to me, but I’m excited about the prospect.</p>

<p>If you don’t know what is it that <a href="http://stelladot.com/">Stella &amp; Dot</a> does, check this couple of articles:</p>

<ul>
<li><a href="http://www.sfgate.com/style/article/Stella-amp-Dot-redefines-women-s-workplace-4166055.php">Stella &amp; Dot redefines women’s workplace</a></li>
<li><a href="http://www.nytimes.com/2012/02/09/fashion/at-stella-dot-hostesses-with-a-percentage.html?_r=4&amp;">At Stella &amp; Dot, Hostesses With a Percentage</a></li>
</ul>


<p>My team will be developing the mobile app that will allow stylists to sell and share in social networks with even less friction.</p>

<p>I am very excited about this job and can’t wait to get started! It is true that I will miss the best team that I’ve ever worked with, but I’m sure we’ll keep collaborating either in open source projects, beta-testing each other’s apps or in any other ways.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Easy and trouble-free copying your SSH public key to a server]]></title>
    <link href="http://victor.sh/blog/2013/02/11/easy-and-trouble-free-copying-your-ssh-public-key-to-a-server/"/>
    <updated>2013-02-11T22:41:00+01:00</updated>
    <id>http://victor.sh/blog/2013/02/11/easy-and-trouble-free-copying-your-ssh-public-key-to-a-server</id>
    <content type="html"><![CDATA[<p>I already published this on <a href="https://coderwall.com/p/uq0p7g">coderwall</a> so might as well publish it here:</p>

<p>In order to be able to log in to a remote server over SSH without needing to provide the password everytime, you need to generate a couple of keys, and then copy the public one to the server.</p>

<p>Since this is a process that you only do once (per server, that is) and is prone to errors (because you need to remember the right key file, set the permissions right and so on), it is better to use the <code>ssh-copy-id</code> command.</p>

<p>The simplest way to use it is as follows:</p>

<pre><code>$ ssh-copy-id remoteuser@remoteserver
</code></pre>

<p>This will copy your public key file (by default, <code>~/.ssh/id_rsa.pub</code>) to the remote server <code>~/.ssh/authorized_keys</code> file, creating it if it doesn&rsquo;t exist, or appending to it if there are already existing keys.</p>

<p>If you need for some reason to provide a different key, just pass it on with the <code>-i</code> argument.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[pttrns: iOS UI Patterns]]></title>
    <link href="http://victor.sh/blog/2012/09/27/pttrns/"/>
    <updated>2012-09-27T00:45:00+02:00</updated>
    <id>http://victor.sh/blog/2012/09/27/pttrns</id>
    <content type="html"><![CDATA[<p>There is a site which I discovered recently, which lists common UI patterns for iOS apps, as implemented by several popular apps. It is a great resource for inspiration and for reference. It is made of screenshots (so, no animations) but for most patterns this will suffice. Go see it at <a href="http://pttrns.com">pttrns.com</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Red Hat buys Polymita]]></title>
    <link href="http://victor.sh/blog/2012/09/23/redhat-buys-polymita/"/>
    <updated>2012-09-23T23:22:00+02:00</updated>
    <id>http://victor.sh/blog/2012/09/23/redhat-buys-polymita</id>
    <content type="html"><![CDATA[<p>I learned recently that <a href="http://es.redhat.com/about/news/press-archive/2012/8/red-hat-acquires-bpm-technology-from-polymita">Red Hat Inc. acquired one of my former employers, Polymita Technologies</a>, as a form of acquiring the BPM technology that they developed.</p>

<p>Congrats to Erik and the rest of the team, for what this means as validation of the good work done.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First impressions of RubyMotion]]></title>
    <link href="http://victor.sh/blog/2012/05/16/first-impressions-of-rubymotion/"/>
    <updated>2012-05-16T17:50:00+02:00</updated>
    <id>http://victor.sh/blog/2012/05/16/first-impressions-of-rubymotion</id>
    <content type="html"><![CDATA[<p>A few days ago, former Apple engineer <a href="http://chopine.be/">Laurent Sansonetti</a> released <a href="http://rubymotion/">RubyMotion</a> to the world. RubyMotion is a <a href="http://www.macruby.org/">MacRuby</a> implementation and toolchain for iOS, with a few key differences that allow for apps developed with it, first, to work; and second, to be allowed on the App Store.</p>

<p>The technical differences between RubyMotion for iOS and MacRuby for the desktop lie principally in the memory management (while MacRuby uses <a href="http://www.memorymanagement.org/glossary/g.html#garbage.collection">Garbage Collection</a>, RubyMotion uses something similar to <a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html">ARC</a>) and the compilation model (MacRuby is interpreted, though it can be compiled, while RubyMotion is all statically compiled, that is, it generates a monolithic binary that can run on iOS). Apart from that, the syntactical rules are mostly the same, so any knowledge you have about MacRuby will certainly be useful when is time to work with RubyMotion.</p>

<p>I purchased RubyMotion a couple of days after its release, when I had had opportunity to read about it and considered that it might be useful to me. I haven’t had the opportunity to play too much with it yet, but I already have formed a preliminary opinion and I’d thought I’d share my thoughts here, and perhaps see how they change after I play with it a bit more. Specially since RubyMotion is evolving very rapidly, so some considerations need to take into account the moment they occurred: for example, when initially released, the interfaces for iOS apps were expected to be coded purely programmatically, there was no support (other than using <code>ibtool</code> for compiling them manually) at all for using Interface Builder to design them. Nowadays, the <code>Rakefile</code> already takes care of compiling them for you.</p>

<p>I have a background in Ruby, even though I haven’t used it professionally as much as Objective-C. I was also eager to learn how to use Cocoa from Ruby, first with <a href="http://rubycocoa.sourceforge.net/">RubyCocoa</a>, and later with MacRuby. Part of my motivation for doing so was partly to avoid the steep learning curve of Objective-C and Cocoa, and partly to be able to use Ruby&rsquo;s natural expressiveness and terseness.</p>

<p>Nowadays I know better. No matter whether you develop in Ruby or in Objective-C, the hardest part is getting intimate with the Cocoa frameworks. There’s no way around it. The way the Cocoa framework is architected, you have two ways to work with it: swim upstream, or go with the current. If you go with the current, easy things are easy and hard things are still hard, but doable. If you pretend to go against the current, you’ll have a hard time just to make the simplest of things.</p>

<p>And so, working effectively with either MacRuby or RubyMotion requires knowing the Cocoa frameworks. Now, this means you either leverage your existing knowledge of them with Objective-C, or you learn on the fly how to use them with Ruby. And my opinion is that the later will be harder, since most of the documentation and examples are created for Objective-C, and the syntax changes Ruby has made to accommodate Objective-C’s method signatures makes it difficult even for (or specially for) experienced rubyists.</p>

<p>So, my guess is that RubyMotion will be more useful to accomplished Cocoa practitioners, which may find Ruby syntax and terseness very accommodating, than to expert rubyists which will find themselves a little disoriented, moreover when the gems they are familiar with are not available in RubyMotion, and they have to learn the new Cocoa ways of getting things done.</p>

<p>I am sure a lot of rails developers will flock to this new platform, since no doubt their customers are demanding mobile clients for their existing apps, and they find themselves at ease within the confines of the higher design standards of Apple. But I’m afraid that, finding themselves in unfamiliar territory, they’ll have to fall back to snippets, recipes and library wrappers (training wheels, if you like) created by the minority among them that already do develop for Objective-C, just as it happened when Ruby on Rails exploded in popularity. And some of them won’t find the effort worth doing in learning the Cocoa frameworks, and thus deeming RubyMotion inadequate for their development needs, when it is more than adequate for most kinds of applications.</p>

<p>My advice? If you have a Mac and are already familiar with both Ruby and the Cocoa Touch framework, and are willing to pony up $150, give it a try. If not, try first with MacRuby before paying for a tool that you won’t use.</p>

<p>Personally, I already have an app in mind which could leverage the expresiveness of Ruby code and simplify what could potentially be lengthy and cumbersome (and error-prone) Objetive-C code. But that is the matter of another post.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A due update]]></title>
    <link href="http://victor.sh/blog/2012/01/05/a-due-update/"/>
    <updated>2012-01-05T00:11:00+01:00</updated>
    <id>http://victor.sh/blog/2012/01/05/a-due-update</id>
    <content type="html"><![CDATA[<p>Last time I talked about my day job, it was in 2009, and a few things have happened since, so I think an update is in order.</p>

<p>Back then, I was explaining about my hiring by an startup. That startup was <a href="http://reviewpro.com/">ReviewPro</a>, a company whose service is oriented towards hoteliers. They allow them to manage their reputation online, and hotels are certainly interested in their reviews, as most of their reservations are done online nowadays, and a bad review might mean a lot of lost reservations. I did a ton of javascript work there, specially with the Canvas API, and cross-browser CSS and layout. However, I dreamed about the possibility of doing iPhone apps instead.</p>

<p>So, I taught myself how to do it (actually, I had started learning Cocoa when I got my Mac, but wasn’t really serious about it until Apple released the iPhone SDK), and on the summer of 2010 I saw an ad about a company looking for iOS developers. I interviewed there and finally was hired, without actual working experience – though I passed a coding test. I started on <a href="http://puck.cc/">Puck Solutions</a> on November 2010.</p>

<p>Being able to spend my full work day working on nothing but CocoaTouch really did wonders for my skills. The very first few days I was still using cheat sheets, but I was soon on top of the learning curve and speeding ahead. At Puck Solutions I did mostly client apps for their cloud software offerings. I learned the ins and outs of the Core Plot framework, among other things, and of the (crappy, in my opinion) Force.com API client library. Thankfully, I was able to use the <a href="http://restkit.org/">RestKit</a> library instead. Still, Salesforce OAuth implementation is as backasswards an implementation as they come :(</p>

<p>Anyhow, client work for the iPad apps I was doing dried up, so I was made redundant on October of last year. After a few weeks interviewing mostly with 4 companies, I joined <a href="http://isis-papyrus.com">ISIS Papyrus</a> on December of last year. The company is headquartered in Vienna, but they have a R&amp;D lab for mobile development in Barcelona. Two of my pals from the Barcelona NSCoder Nights already worked there, so this was an incentive for me in deciding to join the company, since the kind of development work they talked about in the interviews didn’t seem too enticing at first: it’s mostly implementing the iOS version of a cross-platform widget platform.</p>

<p>However, I’m happy I joined for a few reasons. One of them is the working times, which allow me to spend more time now with my family. The other is being able to work with the aforementioned Cocoa devs, <a href="http://twitter.com/josealobato">Jose Antonio</a>, of <a href="http://ochentaycincoporcientococoa.tumblr.com/">85% Cocoa</a> fame (incidentally, one of the best Cocoa podcasts in Spanish language); and <a href="http://twitter.com/gfernandezg">Guillem</a>, one of the drivers behind the <a href="http://nscoders.org/">NSCoders España</a> association, and our resident C++ guru.</p>

<p>In the month I’ve been working there, I’ve already stepped out of my comfort zone in a few ways. I’ve started diving into Objective-C++ and C++; and I’m working on a huge cross platform code base. I think I will be getting a ton from this gig, specially surrounded with such a team.</p>

<p>Anyway, that’s it for the update. Let’s see how it goes.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[NSCoders Conference 2011]]></title>
    <link href="http://victor.sh/blog/2011/11/15/nscoders-conference-2011/"/>
    <updated>2011-11-15T00:59:00+01:00</updated>
    <id>http://victor.sh/blog/2011/11/15/nscoders-conference-2011</id>
    <content type="html"><![CDATA[
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Space Reserved For A Post About Steve Jobs]]></title>
    <link href="http://victor.sh/blog/2011/11/15/space-reserved-for-a-post-about-steve-jobs/"/>
    <updated>2011-11-15T00:54:00+01:00</updated>
    <id>http://victor.sh/blog/2011/11/15/space-reserved-for-a-post-about-steve-jobs</id>
    <content type="html"><![CDATA[<p>This post has been a long way coming. At first, becasue every time I set to write it, during the very first days after his untimely death, I could not bring myself to do it. I was surprised by how deeply it affected me. Afterwards, when I could clarify my feelings about it all, I just happened to be my hands already full preparing my presentations at the NSCoders Conference. My inner Steve Jobs was telling me that the conference was more important tant my blog, and I had to do a good job.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iPhone 4S]]></title>
    <link href="http://victor.sh/blog/2011/10/05/iphone-4s/"/>
    <updated>2011-10-05T11:08:00+02:00</updated>
    <id>http://victor.sh/blog/2011/10/05/iphone-4s</id>
    <content type="html"><![CDATA[<p>Yesterday, Tim Cook, Apple’s new CEO, announced the last device in the iPhone family, the <a href="http://www.apple.com/iphone">iPhone 4S</a>. It features a new dual core processor, a new GPU, a new camera, and a new antenna design. It will debut with iOS 5, which will be available for existing hardware starting October 12. And it will have an exclusive assistant app, <a href="http://www.apple.com/iphone/features/siri.html">Siri</a>, featuring voice recognition, that is supposedly capable of understanding natural speech and carry on instructions.</p>

<p>The naysayers have been talking about disappointment. But, tell me about other phones that can do this:</p>

<p><video width='848' height='480' preload='none' controls poster='http://www.apple.com/iphone/features/images/siri_video.jpg'><source src='http://victor.sh/video/apple-iphone4s-tour-siri-us-20111004_848x480.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'></video>
<small>Copyright © 2011 Apple Inc. All rights reserved. I just transcoded it to make it play in more browsers.</small></p>

<p>Of course, we’ll have to see if the voice recognition is as good as portrayed. And, non being a native English speaker, I’ll sure have problems using it (or, wait until Spanish is supported). But it is a technical feat nonetheless.</p>

<p>Siri <a href="http://techcrunch.com/2011/10/04/the-original-siri-app-gets-pulled-from-the-app-store-servers-killed/">used to be a normal app available in the App Store</a>, which worked on all iPhone devices, not just the 4S. But it relied on external servers to do the processing of the natural language, as opposed to the new Siri feature, which while using Apple’s massive datacenter in North Carolina, needs a lot of RAM on the device itself to work. Apple bought the company and made the technology a feature of the operating system itself.</p>

<p>While I’m very happy with my iPhone 4, I’ll probably upgrade to the 4S, as my wife’s 3G is showing its age, and that way she’ll inherit my current one. And then she’ll be able to enjoy the features of iOS 4 (and 5) on adequate hardware. Also, being a professional iOS developer, it just makes sense to get test hardware, doesn’t it?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Spotify: You can have my money or Facebook’s. But not both]]></title>
    <link href="http://victor.sh/blog/2011/09/27/spotify-you-can-have-my-money-or-facebooks-but-not-both/"/>
    <updated>2011-09-27T10:31:00+02:00</updated>
    <id>http://victor.sh/blog/2011/09/27/spotify-you-can-have-my-money-or-facebooks-but-not-both</id>
    <content type="html"><![CDATA[<p>There’s a turmoil on the internet regarding Facebook’s lubed (frictionless) sharing and how it means that Facebook will go all Big Brother on you and be aware of each and every movement you make online. And no service exemplifies it better than Spotify, which recently started requiring that you connect your Spotify account with your Facebook one. So, everything that you listen to, everything that you search for (possibly), and every user library that you browse, will be sent to Facebook for later analysis and correlation.</p>

<p>I was already concerned about the attitude of Facebook regarding privacy. But this is taking it too far. This is downright intrusive. And Spotify’s actions are a big bet on their part. I was the one who always played devil’s advocate, advising people to get a paid membership in order to ensure Spotify’s viability in the future. So, it doesn’t surprise me that much that they’re now in bed with Facebook. They need to keep the money flowing from somewhere, and if conversion rates are not that great, well, they’re more or less justified on having done that. Spotify’s free and open users shouldn’t be complaining now, as they’re not paying users, so they get what they pay for.</p>

<p>But, as a premium user, this is really annoying. If Spotify had a bit of sense, (and Facebook policies had allowed for that, I’m sure they do not), they would not have this requirement in place for paid users. That could even improve their conversion rates. But they did not, and now the common sentiment among paid users is that of being betrayed. And that’s never a good feeling to foster in your client base: their support forums are raging with righteous users announcing the cancellation of their subscriptions. When I went to open the Spotify client yesterday, I encountered a popup that could not be dismissed, and that required me to connect to Facebook in order to use Spotify. Fortunately, the Spotify application uses the same permission system as the other apps in Facebook, so I could log in and deny permission to the Spotify app (which had it previously, so now they’re the worse for that). But I suspect frictionless sharing is still enabled, even if the explicit sharing is not.</p>

<p>As it is right now, I am considering accelerating the cancellation of my Facebook account –I barely use it nowadays, but would hate to lose contact with some school friends and relatives, after all it took to bring it back–. If that would mean the disruption of my Spotify service, so be it. That’s 10€ more I will have for iTunes, DVDs or books each month. I want to be the customer, not the product, and will gladly pay for that. But if you want me to pay for the privilege of being the product, you’re dead wrong.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New VMWare Fusion 4]]></title>
    <link href="http://victor.sh/blog/2011/09/16/new-vmware-fusion-4/"/>
    <updated>2011-09-16T10:15:00+02:00</updated>
    <id>http://victor.sh/blog/2011/09/16/new-vmware-fusion-4</id>
    <content type="html"><![CDATA[<p>A couple of days ago VMWare <a href="http://blogs.vmware.com/teamfusion/2011/09/vmware-fusion-4-is-now-available-worldwide.html">released VMWare Fusion 4</a>. What is new: optimized for OS X Lion, enhanced 3d graphics performance, Time Machine-friendly snapshots, an oh yeah! being able to host virtual OS X Lion instances – which was not something they could do something about, rather it was an OS X license limitation.</p>

<p>As opposed to previous releases, there’s no competitive upgrade from previous versions or from Parallels. The price for everyone is going to be $50 (for a limited time, then it’ll go up)</p>

<p>I have used both Fusion and Parallels and, from my POV, Parallels slows down more the performance of the rest of the Mac. If you’re only going to be on the virtual machine it‘s not so important but, if you try for example to develop a web app on the Mac and test it on a virtualized Windows, the development task will be easier if you’re hosting the VM with Fusion rather than on Parallels.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reboot]]></title>
    <link href="http://victor.sh/blog/2011/09/15/reboot/"/>
    <updated>2011-09-15T07:06:00+02:00</updated>
    <id>http://victor.sh/blog/2011/09/15/reboot</id>
    <content type="html"><![CDATA[<p>This blog is being rebooted today. To begin with, after mulling over it for several days, I’ve migrated the setup to an static <a href="http://octopress.org/">Octopress</a> site. Mephisto, while nice, was going nowhere for lack of maintenance. And after discovering that one can easily migrate from Mephisto to a Jekyll-based system like Octopress, it was a done deal.</p>

<p>Octopress also has niceties for hackers, like powerful code embedding options. It’s still a bit difficult to blog from a smartphone, but that is just a matter of time, in my opinion.</p>

<p>So, over the following days, the archives will be markdown-ified and the comments will be enabled. But let’s mark today –a day almost, but not quite, entirely unlike any other in the year- as the day of the reboot.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A fresh start]]></title>
    <link href="http://victor.sh/blog/2010/08/06/a-fresh-start/"/>
    <updated>2010-08-06T00:00:00+02:00</updated>
    <id>http://victor.sh/blog/2010/08/06/a-fresh-start</id>
    <content type="html"><![CDATA[<p>Effective immediately, this blog is changing name and domain. From now on, the blog formerly known as Syntactic Saccharose will be known as <strong>./victor.sh</strong> and the domain will cease to be carotena.net, being available at <a href="http://victor.sh/">http://victor.sh/</a> instead.</p>

<p>I will let the old domain expire, as I&rsquo;m not interested in it anymore, and will set up redirections so that people looking for the old web pages, or sending mail to my old addresses can find me meanwhile. This will cost me in google rank, but I don&rsquo;t care particularly since the low posting frequency had made it already low anyway. At least I won&rsquo;t be getting spam for a while&hellip; I hope.</p>

<p>I think this new name more accurately reflects my identity and personality, and while it clearly marks me as a geek (as I can&rsquo;t pass for a Saint Helena citizen), it also brings the opportunity of starting a fresh stage.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leaving Polymita]]></title>
    <link href="http://victor.sh/blog/2009/05/25/leaving-polymita/"/>
    <updated>2009-05-25T00:00:00+02:00</updated>
    <id>http://victor.sh/blog/2009/05/25/leaving-polymita</id>
    <content type="html"><![CDATA[<p>In a week, I&rsquo;ll be changing jobs yet again. Except for the first gig, I&rsquo;ve been working on progressively earlier stages during the live of a company: I worked for the publishing powerhouse <a href="http://www.planeta.es/">Planeta Group</a>, a big corporation with slow reflexes. Then, in the Barcelona office of <a href="http://www.pivetal.com">Pivetal</a>, a UK company with advanced automation and quality management products (don&rsquo;t let their website fool you) for the telco industry. After that, came <a href="http://www.polymita.com">Polymita Technologies</a>, a growth stage startup that sells a unique BPM platform that integrates all the infrastructure for today&rsquo;s business applications. And next month, I&rsquo;ll be joining an early stage startup. A web startup, in a way of speaking</p>

<p>I&rsquo;ve enjoyed my stay at Polymita. I was currently in a support analyst position and, while not having the glamour of R&amp;D or the hectic pace of the operations department (which I&rsquo;m not sure I like anyway), it was rewarding all the same because everyday was different, I didn&rsquo;t know beforehand what would the cases be like. But lately, with the product being so stable, my mad skillz were going unused (and please excuse my hubris, that&rsquo;s how we geeks are). I hadn&rsquo;t planned to leave or anything, but I was offered this new position last year and my inner engineer started to see lots of potential directions this tech could go to. Even so, at first I didn&rsquo;t clearly see the way the technology could be monetized (that&rsquo;s what reading <a href="http://techcrunch.com">TechCrunch</a> will do to you). I didn&rsquo;t hear back from this people until some weeks ago, where they presented me some changes that could make the product a hit. While I had figured out that my next job would involve Rails or Cocoa, looks like I&rsquo;ll be sticking with Java (for the time being at least) on this new company. Still, the development platform of choice in the new company are MacBook Pro&rsquo;s, so there&rsquo;s still hope. I could do some internal tool with Cocoa or an iPhone client, who knows?</p>

<p>So, I decided to switch jobs in this crazy economic climate. I&rsquo;m abandoning the stability and job security that Polymita provides me and diving head first into the dangerous waters and stressing climate of a true web startup. While some people have commented that I must be mad, some others have complimented me, and I think this is a golden opportunity to learn first-hand all an entrepreneur has to know. If the progression holds, my next job could be on my own company and I would need this knowledge. And anyway, I&rsquo;ll get to work on lots of interesting stuff, there might even be some parsing involved (making this site&rsquo;s motto relevant once more).</p>

<p>It could also be that this idea flops, but then again, I&rsquo;m not overly stressed by this possibility. After a handful of interviews looking for new staff, I realized how difficult it is for companies to find competent engineers. I know that I wouldn&rsquo;t be on the dole for too long.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Resolutions for 2009]]></title>
    <link href="http://victor.sh/blog/2009/01/01/resolutions-for-2009/"/>
    <updated>2009-01-01T00:00:00+01:00</updated>
    <id>http://victor.sh/blog/2009/01/01/resolutions-for-2009</id>
    <content type="html"><![CDATA[<p>I don&rsquo;t usually write a list of resolutions, mostly because I don&rsquo;t use to formalize this kind of list as such. But I though this year I could give it a try, at least one that can be bloggable. Without further a do, let&rsquo;s go for it:</p>

<ul>
<li>Write more on this blog. Currently I&rsquo;m posting more to my Spanish blog, <a href="http://principia.info">Principia Programmatica</a></li>
<li>Put an XML-RPC plugin into mephisto to be able to blog on the move from my iPhone. I also want to use my own themes.</li>
<li>Learn a new programming language. I&rsquo;m almost decided for Smalltalk, but it could also be Processing or Nu</li>
<li>Practice Objective-C and Cocoa. Perhaps on the iPhone, even.</li>
<li>Also, I want to learn RubyCocoa or MacRuby. Whichever. As for Python, I don&rsquo;t think I would be able to fit Python 3.0 in the schedule, I don&rsquo;t currently have a use for it.</li>
<li>Finish reading at least 70% of all the books I currently have started but haven&rsquo;t finished yet.</li>
<li>Write a Facebook application.</li>
<li>Get a media center for the living room. I&rsquo;m saving for an AppleTV, but withouth HDMI on the TV set it&rsquo;s a bit silly yet. I haven&rsquo;t found a reasonably priced adapter kit yet. Perhaps the Mac Mini slated for Macworld expo next week will do, who knows?</li>
<li>Contribute to some open source project. I have already sent patches here and there, but since I&rsquo;m using Mephisto intensively, I&rsquo;ll scratch my own itch and write a couple of plugins at least.</li>
<li>Master git, and perhaps buy a subscription to github. I don&rsquo;t really need a paid account yet, though</li>
<li>Modernize my home network. I have some scattered old PCs that aren&rsquo;t currently being used, and their old hard disks are beginning to catch bit rot. I&rsquo;d like to get a new home server, to store all my pictures/movies/mail, and perhaps to develop some of my projects on it.</li>
<li>I want to use all of my skills at work, at least the most enjoyable ones. If that means switching jobs (in this dire economic situation) so be it. I&rsquo;m tired of reading people like Paul Graham or Jason Calacanis, but being afraid of leaving my comfortable and safe work place.</li>
</ul>


<p>Ok. That&rsquo;s about it, I think. Let&rsquo;s review this list in a year or so&hellip;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SWLOTD]]></title>
    <link href="http://victor.sh/blog/2008/04/09/swlotd/"/>
    <updated>2008-04-09T00:00:00+02:00</updated>
    <id>http://victor.sh/blog/2008/04/09/swlotd</id>
    <content type="html"><![CDATA[<p>Cut&#8217;n&#8217;fold <a href="http://home.comcast.net/~kymcat3/character001.html">Stormtroopers</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Star Wars link of the day]]></title>
    <link href="http://victor.sh/blog/2008/04/08/star-wars-link-of-the-day/"/>
    <updated>2008-04-08T00:00:00+02:00</updated>
    <id>http://victor.sh/blog/2008/04/08/star-wars-link-of-the-day</id>
    <content type="html"><![CDATA[<p>A coworker, Juanma, and I use to send over IM more or less daily an star wars related link. In order to avoid all this effort to be lost, I&rsquo;ll post them here as time permits.</p>

<p>Here is the first one:
<a href="http://www.superdeluxe.com/sd/contentDetail.do?id=D81F2344BF5AC7BBDF72CDEA065DF6EC96C87E8B3E62B9C7">Dave Hill: Jedi Master</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[About this site]]></title>
    <link href="http://victor.sh/blog/2007/10/19/about-this-site/"/>
    <updated>2007-10-19T00:00:00+02:00</updated>
    <id>http://victor.sh/blog/2007/10/19/about-this-site</id>
    <content type="html"><![CDATA[<h3>Colophon</h3>

<p>This site is powered by <a href="http://mephistoblog.com">Mephisto</a>. The servers are hosted at <a href="http://joyent.com">Joyent</a> (née <a href="http://textdrive.com">TextDrive</a>) and powered by Solaris.</p>
]]></content>
  </entry>
  
</feed>
