<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[0x2a]]></title>
  
  <link href="http://0x2a.im/" />
  <updated>2013-03-03T15:04:59+00:00</updated>
  <id>http://0x2a.im/</id>
  <author>
    <name><![CDATA[zimbatm]]></name>
    <email><![CDATA[jonas@pfenniger.name]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/zimbatm" /><feedburner:info uri="zimbatm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
    <title type="html"><![CDATA[.at domains warning]]></title>
    <link href="http://0x2a.im/blog/2012/08/02/at-domains-warning/" />
    <updated>2012-08-02T15:42:00+01:00</updated>
    <id>http://0x2a.im/blog/2012/08/02/at-domains-warning</id>
    <content type="html"><![CDATA[<p><em>Update 1</em>: Some interesting discussion is happening over at
<a href="http://news.ycombinator.com/item?id=4395654">HackerNews</a></p>

<p><em>Update 2</em>: <a href="http://gandi.net">Gandi.net</a> now works around the NIC.at
policy so you&#8217;re safe of buying .at domains again.</p>

<p>Before renting an .at domain, make sure that you still own a FAX.</p>

<p>Let&#8217;s say you register for an .at domain at <a href="http://gandi.net">Gandi.net</a> (greate registrar by the
way). It will cost you 18 EUR for a year. Let&#8217;s say you don&#8217;t renew the
domain. Usually the domain goes trough a grace period and is then freed
to the public.</p>

<p>With .at domains, NIC.at will contact you by post with a 30 days notice. If you
don&#8217;t sent them a FAX (!) as instructed on <a href="http://www.nic.at/en/service/domain_cancellation/">this
page</a>, your domain will
automatically be renewed with them. And now that they don&#8217;t use a
reseller anymore, the price will also have almost doubled at 30 EUR.</p>

<p>Even if I virtually sign a long legalese when renting the domain for the
first time, I should be able to expect that they follow the industry
standards. I just hope that getting the message out there will let other
people know of their mispractice.</p>

<p>Tangentially, I would really like to know what are the costs of storing
1k in a database and answering to a couple of DNS queries. My hunch is
that most of the cost is for paying the <a href="http://www.icann.org/en/resources/registrars/accreditation/financials">ICANN
fees</a>
but this might not apply to ccTLDs.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Google, please don’t close up the web]]></title>
    <link href="http://0x2a.im/blog/2012/03/10/google-please-dont-close-the-web/" />
    <updated>2012-03-10T00:00:00+00:00</updated>
    <id>http://0x2a.im/blog/2012/03/10/google-please-dont-close-the-web</id>
    <content type="html"><![CDATA[<p><em>Update</em>: Yes Google+ is indexable if your bot knows how to interpret JavaScript. I still think it&#8217;s a bad idea ; not only multi-million companies should be able to scrape the web.</p>

<p><em>Update2</em>: Google Groups now accepts views in incognito mode. Are you
listening Google ?</p>

<ul>
<li><code>https://plus.google.com/u/0/113117251731252114390/posts/EJUtbeV1YSS</code></li>
<li><code>https://groups.google.com/forum/?fromgroups#!topic/google-maps-api/Jo79ZPDVZkw</code></li>
</ul>


<p>What have these two urls have in common ?</p>

<p>Both pages are not indexable. Google+ returns a pile of JavaScript in an HTML
page, and Google Groups doesn&#8217;t allow you in unless you&#8217;re authenticated.</p>

<p>However, <a href="https://encrypted.google.com/search?hl=en&amp;q=%22People%20think%20they%20hate%20personalized%20search%2C%20but%20they%20actually%20love%20it.%22">both</a> <a href="https://encrypted.google.com/search?hl=en&amp;q=%22help%20wanted%20-%20google%20map%22">pages</a> ARE indexed in Google. Google+ was supposed to be a reaction to
the closed Facebook world. How is that fair for the competition ?</p>

<p>Google, please don&#8217;t close up the web.</p>

<p><em>Update</em>: still seeing the auth issues from time to time on Google
Groups and other Google services.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mail over IP]]></title>
    <link href="http://0x2a.im/blog/2010/12/11/mail-over-ip/" />
    <updated>2010-12-11T00:00:00+00:00</updated>
    <id>http://0x2a.im/blog/2010/12/11/mail-over-ip</id>
    <content type="html"><![CDATA[<p><em>Idea is a new category where I put good and not so good ideas
that you can use to start a business. If I had the time, I would
try each of these ideas. But since I don&#8217;t, just let me know if
you use one of them, I&#8217;d be curious how it turned out.</em></p>

<p>As a first entry, let me introduce you &#8220;Mail over IP&#8221;. The title
almost resumes the whole idea. Provide a mean to distribute
phyical letters to people, and reversely, numerize letters to emails.</p>

<p>Here is one of the variation on the subject:</p>

<h2>Mailing</h2>

<p>Some companies want to send tons of phyical mail to people. Instead
of printing all those letters out, and sending them from the company&#8217;s
location, provide a shortcut, so that letters can be printed in localities
of the target person. It can thus be delivered faster and cheaper.</p>

<p>You can start with 1 letter format, company logos will have to
be printed, and not wit gold ink. Then expand your offering.
See <a href="http://lulu.com">lulu</a>, they did the same, but for books.</p>

<p>Because the customer doesn&#8217;t have the physical result in hand, there will
be more cases of people sending unwanted/malformed messages to the recipient.
One way of mitigating that risk is to send a sample mail to the customer,
so that he can confirm the design and content.</p>

<p><em>I&#8217;ll update this page if I have more ideas on the subject</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[tmux to manage your server]]></title>
    <link href="http://0x2a.im/blog/2010/12/05/tmux-to-manage-your-server/" />
    <updated>2010-12-05T00:00:00+00:00</updated>
    <id>http://0x2a.im/blog/2010/12/05/tmux-to-manage-your-server</id>
    <content type="html"><![CDATA[<p>Today I discovered tmux, a GNU screen-like application. It allows you to keep your console
sessions alive and manage multiple shells in the same window. Check out the website to
get an idea: <a href="http://tmux.sf.net/">tmux.sf.net</a></p>

<p>What&#8217;s really neat about it, is that even if the SSH connection to your server breaks,
you can just connect back, &#8220;tmux attach&#8221;, and you can continue where you left off.</p>

<p>For me, the next step, was to login by default into tmux when connecting to the server. It
allows me to run long-running processes like workers and keep an eye on them (until
I switch to monit or something else). Here is how I did it.</p>

<h2>Basic configuration</h2>

<p>Edit your <code>~/.tmux.conf</code> to:</p>

<div>
  <pre><code class='sh'># Restore sane default shortcut
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Default session
# make sure to have one, otherwise &quot;tmux attach&quot;
# will fail if there is no session
new</code></pre>
</div>


<p>It&#8217;s just that Ctrl-A is much more accessible than Ctrl-B on my keyboard, and it&#8217;s also the
GNU screen default that I learned.</p>

<p>Next, we want to launch &#8220;tmux attach&#8221; on new connections. For that, edit the <code>~/.bashrc</code>:</p>

<div>
  <pre><code class='sh'># Make sure you have this line somewhere before
# We don't want to attach tmux on non-interactive connections.
if [[ -n &quot;$PS1&quot; ]]; then

# Add the following line as the last commands of the file
# If $TMUX is not set (set by tmux on sub-shells),
# attach or create a session:
if [ -z &quot;$TMUX&quot; ]; then
  exec tmux attach
fi</code></pre>
</div>


<p>That&#8217;s it. Now everytime you ssh to your server, your last session will be re-opened.
Notice that if you have two connections, you can see the typing of one into the other.</p>

<p>IDEA: It would be nice if a process monitor would have such kind of feature. Just to watch
  the stdout and stderr and send some signals to the process.</p>

<h2>Update: 11 déc. 2010</h2>

<p>One of the drawbacks of this approach is that you&#8217;re loosing normal terminal behavior.
For example the line history is not available to scolling. There must be a command to
emulate it, but I don&#8217;t know which-one.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New home]]></title>
    <link href="http://0x2a.im/blog/2010/12/05/new-home/" />
    <updated>2010-12-05T00:00:00+00:00</updated>
    <id>http://0x2a.im/blog/2010/12/05/new-home</id>
    <content type="html"><![CDATA[<p>http://0x2a.im is my new hacker&#8217;s home</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rubygems tips and tricks]]></title>
    <link href="http://0x2a.im/blog/2009/06/08/rubygems-tips-and-tricks/" />
    <updated>2009-06-08T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/06/08/rubygems-tips-and-tricks</id>
    <content type="html"><![CDATA[<p>Follows, some tips I like to use on my boxes (MacOSX and Linux)..</p>
<p><strong>Update: 5 dec. 2010</strong></p>
<h2>User gems</h2>
<p>To avoid typing `sudo` all the time you want to install or upgrade your gems,<br />
run `gem install &#8212;user-install somegem` and add the bin path to you <span class="caps">PATH</span> environment.</p>
<p>Note that you can also put it in your .gemrc to avoid typing it all the time, but don&#8217;t<br />
if you use (<span class="caps">RVM</span>)[http://rvm.beginerescueend.com]. It will give you really strange results.</p>
<h2>Shorten installs with &#8212;no-ri &#8212;no-rdoc</h2>
<p>If you&#8217;re like me, you never use ri or rdoc for the gems. I&#8217;m always looking at the sources or on the excellent yardocs.info for that.<br />
If you&#8217;re like me, add the following line to your `~/.gemrc` file:</p>
<p><code>
gem: --no-ri --no-rdoc
</code></p>
<p><strong>That&#8217;s all folks!</strong></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rubygems dependencies. Please...]]></title>
    <link href="http://0x2a.im/blog/2009/06/06/rubygems-dependencies/" />
    <updated>2009-06-06T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/06/06/rubygems-dependencies</id>
    <content type="html"><![CDATA[<p>minimalize the number of dependencies your gem requires. This is best practice.</p>
<p>Since rubygems does not support notions of &#8220;optional&#8221; or &#8220;build&#8221; dependencies,<br />
do not include them. The best is to add some checks in your code.</p>
<p>For example, if you need rspec to run your tests, just add tree lines in your Rakefile that ask the developer to install rspec on LoadError. Same for hoe, cucumber, rake, etc. These tools are not needed by the library user unless they want to contribute. In that case, they are able to install the dependencies themselves or run a `rake devdeps` task that installs the gems for them.</p>
<p>Same for optional runtime dependencies. If your web framework can use different templating engines, don&#8217;t add them all in your dependencies. Make a check when template/the_engine is required that the_engine dependency is available, or spit a message to the developper : &#8220;please `gem install the_engine` dependency&#8221;.</p>
<p>Thank you, zimbatm</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[ANN] monkeypatch-0.1.2 (alpha)]]></title>
    <link href="http://0x2a.im/blog/2009/05/26/ann-monkeypatch-0.1.2/" />
    <updated>2009-05-26T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/05/26/ann-monkeypatch-0.1.2</id>
    <content type="html"><![CDATA[<p><strong>monkeypatch</strong> is a new ruby projects that tries to protect you from patch <br />
collisions.</p>
<h2>Project info</h2>
<p><strong>monkeypatch</strong> introduces a small <span class="caps">API</span> that you can use when you want to fix<br />
external libraries. The mechanism is meant to be as straightforward as <br />
possible. Also, by adding monkeypatch as a gem dependency, you declare that <br />
your package is fixing other package&#8217;s code.</p>
<p>Version: 0.1.2<br />
Stability: unstable<br />
Source code: <a href="http://github.com/zimbatm/monkeypatch">github.com</a><br />
RDoc: <a href="http://rdoc.info/projects/zimbatm/monkeypatch">rdoc.info</a></p>
<h2>A small example</h2>
<div>
<pre><code class='ruby'>my_patch = MonkeyPatch.add_method(:to_blob) do
def to_blog; &quot;&lt;blob&gt;&quot; end
<p>end</p>
<p>my_patch.patch_class(String)</p>
<p>&quot;hello&quot;.to_blob #=&gt; &quot;&lt;blob&gt;&quot;</code></pre></p>
</div>
<h2>How does it work ?</h2>
<p>When applying a patch, there are two mechanism that enters the game ; <br />
conditions and conflicts.</p>
<ul>
	<li>Conditions are not fatal. If they don&#8217;t match, the patch is simply not <br />
  applied, and a message is passed to the MonkeyPatch.logger.<br />
  Conditions are for library version matching for example. They are <br />
  extensible buy using: #add_condition(msg, &amp;cond)</li>
	<li>Conflicts are fatal, in that they raise a ConflictError if they don&#8217;t<br />
  match. Conflicts are for patch collision. They are not extensible and provided by<br />
  the <span class="caps">API</span>. The idea is that if your code has conflicting patches, you will<br />
  get notified by a crashing application, so that you can fix it as early as<br />
  possible.</li>
</ul>
<p>Another aspect are PatchSet (s). If you have a bundle of patches you want to <br />
apply, you can aggregate them with the &amp; operator. You then get a PatchSet <br />
instance which you can use like a Patch. This is not fully done now, but <br />
theoritically, your bundle does not apply unless all patch conditions are met.</p>
<h2>What&#8217;s next ?</h2>
<p>This project is intentionally unstable for now. What I&#8217;m really looking for <br />
now, is community feedback. I also intend to look at real-world patches to<br />
see how this library can be made more useful.</p>
<p>So if you have some real-world patches or any comments, please give me your<br />
feedback ! Leave your comments on the <a href="http://www.ruby-forum.com/topic/187845">ruby forum</a></p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Implicit versus explicit return]]></title>
    <link href="http://0x2a.im/blog/2009/05/13/implicit-vs-explicit-return/" />
    <updated>2009-05-13T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/05/13/implicit-vs-explicit-return</id>
    <content type="html"><![CDATA[<p>I&#8217;m doing a bit of python right now, trying the <a href="code.google.com/appengine/">Google Appengine</a> .</p>
<p>Going from Ruby to Python is not really hard, they have lots of things in common. One error that got me, is that in Python, all return values are explicit. So instead of writing :</p>
<div>
<pre><code class='ruby'>def render_template(name, vals)
<p>Template.render(File.join(templ_path, name + &#8216;.html&#8217;), vals)<br />
end</code></pre></p>
</div>
<p>you write :</p>
<div>
<pre><code class='python'>def render_template(name, vals):
<p>return template.render(os.path.join(templ_path, name + &#8216;.html&#8217;), vals)</code></pre></p>
</div>
<p>In python, if <strong>return</strong> is not given, a function returns Null by default.</p>
<p>It gets me thinking, what are the decisions behind this choice ?</p>
<h2>Function</h2>
<p>If you need to return a value, implicit return is nicer, because in higher-order functions, your block is often short, and it adds some characters. See:</p>
<div>
<pre><code class='ruby'>arr2 = arr.map{|x| x.to_i}</code></pre>
</div>
<p>versus</p>
<div>
<pre><code class='python'>arr2 = map(lambda x: return int(x), arr)</code></pre>
</div>
<p>Maybe this is why, in practice, python people tend to prefer <strong>for</strong> loops.</p>
<h2>Procedure</h2>
<p>If you don&#8217;t need to return a value, explicit return is nicer, because you&#8217;ll have to add a nil statement to keep the same interface.</p>
<div>
<pre><code class='python'>def get(self):
self.response.out.write(render_template(&#8216;index&#8217;))</code></pre>
</div>
<p>versus</p>
<div>
<pre><code class='ruby'>def get
response.out.write(render_template(&#8216;index&#8217;))
nil
<p>end</code></pre></p>
</div>
<p>In practice, ruby people don&#8217;t bother to add that extra nil statement. In most cases it doesn&#8217;t really hurt, but interfaces more often leak internal structures, which makes them harder to change later on.</p>
<h2>Conclusion</h2>
<p>Done with the unscientific rambling. Both have their uses. While not statically typed, python tends to favor strictness. Ruby tends to favor &#8220;out of your way&#8221; decisions. Both languages are coherent with their goals.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[E-voting is a solution for what ?]]></title>
    <link href="http://0x2a.im/blog/2009/05/13/e-voting-is-a-solution-for-what/" />
    <updated>2009-05-13T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/05/13/e-voting-is-a-solution-for-what</id>
    <content type="html"><![CDATA[<p>In this little rant, I&#8217;m going to argue that e-voting is not a good idea. Feel free to contact me if you have some good arguments.</p>
<p>First, let me put the ground of certain assertions. Voting, with other things, is at the root of our democratic process. And the idea behind <a href="http://definr.com/democracy">democracy</a>, is that it&#8217;s the persons who can vote who governs. Politicians and officials are at the service of the majority. I know it sounds utopic, but this is the definition of democracy. From that statement, follows that:</p>
<p><strong>Voting should reflect the view of the majority</strong></p>
<p>To make that statement clear, the primary goal of voting, is to make sure the majority has it&#8217;s voice reflected.</p>
<h2>How &#8220;old&#8221; voting works</h2>
<p>The paper voting system is a big map-reduce system, where people are involved in all tasks. Each local voting bureau gets the votes, collects and counts them. Then each result is aggregated higher, until we have a big total of all votes. This makes the final score, which should lead the politicians.</p>
<p>In the whole process, people are involved. This is the major factor that limits fraud. (People who study sociology, can you give me some informations here ?). I believe that the more people involved, the less fraud you have. The more eyes can watch the process, the less likely somebody is going to take the risks to get caught.</p>
<h2>Hammer time</h2>
<p>Along, comes the technician. I am a software developer so I know how it works. The &#8217;&#8217;problem&#8217;&#8217; should be resolved by technology ! Add layers of security, quantum cryptography, digitally sign the binaries, open source the code. Anything.</p>
<p>No matter how much technology you throw at the &#8217;&#8217;problem&#8217;&#8217;, you miss the central feature: the system is less understandable. Less people can look at your system and say if it&#8217;s rotten or not. You&#8217;re making the system much more fragile to fraud.</p>
<h2>Conclusion</h2>
<p>Maybe you noticed I didn&#8217;t go into other arguments, like price savings, ecology by saving paper, participation factors, and so on. In my opinion, those don&#8217;t even hold when what you loose is the democratic process. So do yourself a favor : protest and let your voice be heard, before it&#8217;s too late.</p>
<p><strong>PS</strong>: I&#8217;m open to criticism and will update the article if you have something to say</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[SOLVED] Terminal.app Unicode problem v2: Alt+Space]]></title>
    <link href="http://0x2a.im/blog/2009/04/16/terminal-unicode-problem-2/" />
    <updated>2009-04-16T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/04/16/terminal-unicode-problem-2</id>
    <content type="html"><![CDATA[<p>Apparently, Alt+Space is another character than Space in Terminal.app. Both have the exact same representation but don&#8217;t have the same character code. I have no idea what it is useful for but it is annoying because I often hit it inadvertendly when using unix pipes.</p>
<p>The symptom is like that (where   is not shown in the terminal):</p>
<pre><code>$ ls | grep x
-bash:  grep: command not found
</code></pre>
<p>This is because the character after the pipe is Alt+Space and not Space. I believe it is related to my previous entry. I&#8217;ll update the post if I find a solution.</p>
<h2>Update</h2>
<p>For long, I have searched the existing keyboard layout to patch it, but didn&#8217;t find it. It turns out, it was much easier to create a new layout from an existing .keylayout. More infos below.</p>
<p>For the record, the Alt+Space character was the <a href="http://www.fileformat.info/info/unicode/char/00a0/index.htm">unicode no-break space</a></p>
<p>So here is how to fix your layout:</p>
<p>1. Get <a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=ukelele">Ukulele</a> , the graphical keyboard layout editor<br />
2. Get an existing keyboard layout (in the Ukulele bundle or on the net)<br />
3. Put the .keylayout in &#8220;~/Library/Keyboard Layout&#8221; or in /Library and give it a new name.<br />
4. Open the .keylayout with Ukulele<br />
  a. While pressing Alt, double-click the space bar. Replace the no-break-space by the space character.<br />
  b. Set a keyboard name in Keyboard&#8594;Set Keyboard Name<br />
  c. Save<br />
5. Log-off, relog.<br />
6. Go in System Settings&#8594;International&#8594;Layouts and select your new layout</p>
<p>For troubleshooting, see the Apple <a href="http://developer.apple.com/technotes/tn2002/tn2056.html">Installable Keyboard Layouts</a> technical note.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Notes on programming languages and environments]]></title>
    <link href="http://0x2a.im/blog/2009/04/16/programming-languages-and-environments/" />
    <updated>2009-04-16T00:00:00+01:00</updated>
    <id>http://0x2a.im/blog/2009/04/16/programming-languages-and-environments</id>
    <content type="html"><![CDATA[<p>Often, I spend time learning new programming languages and environements. It&#8217;s not that I need to. I&#8217;m curious to learn and I like to see how various orthogonal features fit together. Ideally, one day, I will build my own programming environment (I know it takes at least five years). Note that I prefer to say &#8220;programming environment&#8221;, which I will later explain. This post is an aggregate of the various knowledge I gathered from my studies which come to my mind.</p>
<h2>Programming language versus environment</h2>
<p>Overevaluating something happens a lot in the computer world. Maybe it&#8217;s because things are more abstract, which leaves some room for absurd ideas to overtake the rationals. Suddenly, the market decides that something is the future. This is how the market had major shift, for example balancing between thin clients and workstations. Suddenly, all software has to be &#8220;as service&#8221; and lots of computation that happened on the desktop take place on the server. Often, the right answer is right in the middle.</p>
<p>In the programming world, syntax of languages has often been the main comparison vector between two languages, and numerous useless threads has been started, on which language has the &#8220;nicest&#8221; or shortest implementation of the fibbonacci algorithm. If you thing for two seconds you realize that: fibonacci is mathematically pure and not an indicator of real-world code ; second, this function would be implemented once per language and put in a library. Aren&#8217;t there other things we could argue on ? Do we, software developers, miss some good metrics to compare the languages ?</p>
<p>Let get back to the subject. I believe the language is only a small part of the experience the developper has while developping. There are tons of other things ( from the top of my mind ) : debugging tools, virtual machine (yes/no/characteristics), space constrains, deployment tools, editor support, and a special mention ; a good help system ! How much time I loose reading the source code (hello ruby) or searching google for examples is astouning. All of these things and more is what I call a programming environment. Everything that helps between the first lines of codes and the release, and then between the releases. Heck, even the operating system or a graphical editor.</p>
<h2>Conclusion</h2>
<p>That&#8217;s all for today. <span class="caps">TODO</span>: next time, let&#8217;s talk about orthogonal feature or language metrics. If you have some ideas, send me an email since I don&#8217;t have the time to implement and handle a commenting system.</p>
<p>Cheers,<br />
   zimbatm</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Terminal.app Unicode support problem (or is it bash ?]]></title>
    <link href="http://0x2a.im/blog/2009/01/25/terminal-unicode-support-problem/" />
    <updated>2009-01-25T00:00:00+00:00</updated>
    <id>http://0x2a.im/blog/2009/01/25/terminal-unicode-support-problem</id>
    <content type="html"><![CDATA[<p>&#8230; because I&#8217;ve seen it on Linux too.)</p>
<p>For some reason, backspace (^H) removes only one byte at a time, which is problematic when characters are defined on more than one (like in <span class="caps">UTF</span>-8). Worse, the remaining bytes seem to &#8220;infect&#8221; the previous character and so the only way to escape is to cancel (^C) the line and rewrite it from the beginning. Annoying.</p>]]></content>
  </entry>
  
</feed>
