<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>In search for questions.

Content by Tyches.
Licensed under CC by.</description><title>(f)utility</title><generator>Tumblr (3.0; @f-utility)</generator><link>http://f-utility.tumblr.com/</link><item><title>Migrated to Posterous</title><description>&lt;p&gt;This site has migrated to &lt;a href="http://lloeki.posterous.com/"&gt;Posterous&lt;/a&gt;.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/2998905067</link><guid>http://f-utility.tumblr.com/post/2998905067</guid><pubDate>Sat, 29 Jan 2011 22:13:54 +0100</pubDate></item><item><title>Compiling SYSV_IPC python module with GCC on AIX 5.2</title><description>&lt;p&gt;I had a need to use good old SYSV message queues to interoperate with a bunch of old C programs, straight from python. Come in &lt;a href="http://semanchuk.com/philip/sysv_ipc/"&gt;sysv_ipc module&lt;/a&gt; to the rescue, which works great on a variety of systems, but I need it on AIX.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="http://www.perzl.org/aix/"&gt;Perzl&lt;/a&gt; wonderful rpm packages for AIX, I was able to compile it with GCC 4.2 and setup it into Python 2.6.&lt;/p&gt;

&lt;p&gt;Modify common.h to unset SHM_SIZE (Obsolete step as of sysv_ipc 0.6):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#undef SHM_SIZE

enum GET_SET_IDENTIFIERS {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Export those two vars:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LDSHARED="/opt/freeware/lib/python2.6/config/ld_so_aix gcc -bI:/opt/freeware/lib/python2.6/config/python.exp"
CC="gcc"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can then go on and:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;python setup.py install [--user]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Update: common.h should not be modified anymore.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/525726296</link><guid>http://f-utility.tumblr.com/post/525726296</guid><pubDate>Fri, 16 Apr 2010 14:57:00 +0200</pubDate></item><item><title>Play a MP3 file with pymad and pyaudio</title><description>&lt;p&gt;Based on the wave example from pyaudio:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import pyaudio
import mad
import sys

if len(sys.argv) &amp;lt; 2:
    print "Plays a wave file.\n\n" +\
          "Usage: %s filename.wav" % sys.argv[0]
    sys.exit(-1)

mf = mad.MadFile(sys.argv[1])

p = pyaudio.PyAudio()

# open stream
stream = p.open(format =
                p.get_format_from_width(pyaudio.paInt32),
                channels = 2,
                rate = mf.samplerate(),
                output = True)

# read data
data = mf.read()

# play stream
while data != None:
    stream.write(data)
    data = mf.read()

stream.close()
p.terminate()
&lt;/code&gt;&lt;/pre&gt;</description><link>http://f-utility.tumblr.com/post/503602749</link><guid>http://f-utility.tumblr.com/post/503602749</guid><pubDate>Wed, 07 Apr 2010 19:33:00 +0200</pubDate></item><item><title>Play an MP3 file with pymad and pyao</title><description>&lt;p&gt;This is for Mac OS X, adapt to your needs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import mad, ao, sys

mf = mad.MadFile(sys.argv[1])
dev = ao.AudioDevice('macosx', bits=32, rate=mf.samplerate(), channels=2)
buf = mf.read()
while buf != None:
    dev.play(buf, len(buf))
    buf = mf.read()
&lt;/code&gt;&lt;/pre&gt;</description><link>http://f-utility.tumblr.com/post/503600551</link><guid>http://f-utility.tumblr.com/post/503600551</guid><pubDate>Wed, 07 Apr 2010 19:32:00 +0200</pubDate></item><item><title>Crash on object deletion in pyao and pyogg</title><description>&lt;p&gt;The author of pyogg goofed up on python object deletion in the wrapper. This was &lt;a href="http://pyogg.python-hosting.com/ticket/2"&gt;reported&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately libao (0.82) is also affected, and there&amp;#8217;s no action even on the previous pyogg bug. It causes a &amp;#8220;glibc double-free&amp;#8221; on Linux and a &amp;#8220;pointer being freed was not allocated&amp;#8221; on Mac OS X.&lt;/p&gt;

&lt;p&gt;The project seems quite dead, but is merely a wrapper to the C libs where the real action takes place, so there&amp;#8217;s not much of a fuss to have it unmaintained.&lt;/p&gt;

&lt;p&gt;Here is the patch against pyao:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--- src/aomodule.c.orig 2010-04-07 19:06:45.000000000 +0200
+++ src/aomodule.c  2010-04-07 19:06:56.000000000 +0200
@@ -150,7 +150,7 @@
 py_ao_dealloc(ao_Object *self)
 {
   ao_close(self-&amp;gt;dev);
-  PyMem_DEL(self);
+  PyObject_DEL(self);
 }

 static PyObject *
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And for reference, the patch against pyogg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Index: legacy/pyvorbis/pyvorbisfile.c
===================================================================
--- legacy/pyvorbis/pyvorbisfile.c  (revision 20)
+++ legacy/pyvorbis/pyvorbisfile.c  (working copy)
@@ -173,8 +173,7 @@
   if (ret == NULL) {
     PyMem_DEL(newobj);
     return NULL;
-  } else
-    Py_DECREF(ret);
+  }

   return (PyObject *) newobj;
 }
@@ -191,11 +190,13 @@
        close */
     Py_DECREF(py_self-&amp;gt;py_file);
   } else {
-    /* Otherwise, we opened the file and should close it. */
-    fclose(py_self-&amp;gt;c_file);
+    /* Do NOT close the file -- ov_open() takes ownership of the FILE*,
+       and ov_close() is responsible for closing it. */
   }

-  PyMem_DEL(self);
+  free(py_self-&amp;gt;ovf);
+
+  PyObject_DEL(self);
 }

 static PyObject *
&lt;/code&gt;&lt;/pre&gt;</description><link>http://f-utility.tumblr.com/post/503577816</link><guid>http://f-utility.tumblr.com/post/503577816</guid><pubDate>Wed, 07 Apr 2010 19:18:41 +0200</pubDate></item><item><title>Uninstalling ActivePython and ActiveTCL</title><description>&lt;p&gt;Little script to easily uninstall either. Take care to adapt to your needs.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#activepython
sudo rm -R /Library/Frameworks/Python.framework /Applications/Python\ 3.1 /usr/local/bin/{2to3*,py*,idle*}

#activetcl
sudo rm -R /Library/Frameworks/{Tcl,Tk}.framework /Applications/Utilities/Wish\ 8.5.app /usr/local/bin/{tclsh8.5,wish8.5} /Library/Documentation/Help/ActiveTcl-8.5
&lt;/code&gt;&lt;/pre&gt;</description><link>http://f-utility.tumblr.com/post/489872930</link><guid>http://f-utility.tumblr.com/post/489872930</guid><pubDate>Fri, 02 Apr 2010 00:34:20 +0200</pubDate></item><item><title>XKCD easter egg commands</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_l07ykfsas81qzvclyo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;XKCD easter egg commands&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/489868367</link><guid>http://f-utility.tumblr.com/post/489868367</guid><pubDate>Fri, 02 Apr 2010 00:31:27 +0200</pubDate></item><item><title>Lovely command to obtain the processes (or rather, PID) using a socket port (here 23) on AIX:

$...</title><description>&lt;p&gt;Lovely command to obtain the processes (or rather, PID) using a socket port (here 23) on AIX:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ netstat -Aan  | egrep '\.23 ' | awk '{print $1}' | \
    sed -e 's/^\(.*\)$/sockinfo \1 tcpcb/' | kdb | egrep '^pvproc' | awk '{print $4}'  | sort | uniq | \
    sed 's/^\(.*\)$/hcal \1/' | kdb | grep Value | awk '{print $6}'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Useful when you don&amp;#8217;t have lsof at hand.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/481309326</link><guid>http://f-utility.tumblr.com/post/481309326</guid><pubDate>Mon, 29 Mar 2010 10:55:09 +0200</pubDate></item><item><title>A little bit of humor.</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_kx147kwWJr1qzvclyo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;A little bit of humor.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/360205712</link><guid>http://f-utility.tumblr.com/post/360205712</guid><pubDate>Fri, 29 Jan 2010 23:09:20 +0100</pubDate></item><item><title>(via peterpanandwendyturnedoutfine)</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_kvw2vtrE2Q1qzkgzeo1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;(via &lt;a href="http://peterpanandwendyturnedoutfine.tumblr.com/" class="tumblr_blog"&gt;peterpanandwendyturnedoutfine&lt;/a&gt;)&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/321870752</link><guid>http://f-utility.tumblr.com/post/321870752</guid><pubDate>Thu, 07 Jan 2010 19:24:03 +0100</pubDate></item><item><title>"Scar tissue is stronger than regular tissue. Realize the strength, move on."</title><description>“Scar tissue is stronger than regular tissue. Realize the strength, move on.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Henry Rollins (via &lt;a href="http://malty.tumblr.com/" class="tumblr_blog"&gt;malty&lt;/a&gt;)&lt;/em&gt;</description><link>http://f-utility.tumblr.com/post/321870008</link><guid>http://f-utility.tumblr.com/post/321870008</guid><pubDate>Thu, 07 Jan 2010 19:23:27 +0100</pubDate></item><item><title>Apple should lower their prices. Not.</title><description>&lt;p&gt;I am sick of hearing all around things like:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hey, Apple hardware/software is awesome, but is too pricey! They should lower their prices and then sell millions and crush everyone! And then masses could bathe everyday in Apple goodness!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Apple cares less about market share. Apple cares about profit by relying on excellence.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s just like exotic cars. Of course Porsche, or Ferrari, or Aston Martin, or Bugatti, whatever would sell more of their cars if they divided their price by two or three. But nobody wants that, not (e.g.) Porsche nor their customers. Porsche wants to make the very best cars and make profit selling them, customers want the very best cars and pay the matching price. Excellence is much more than the simple sum of its parts, and is therefore paid (exponentially) more, but without that hefty price tag, there would be no will of attaining excellence from Porsche, nor exigence of excellence from their customers.&lt;/p&gt;

&lt;p&gt;Apple works just the same, only it&amp;#8217;s just not the same playground.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/261896939</link><guid>http://f-utility.tumblr.com/post/261896939</guid><pubDate>Sun, 29 Nov 2009 10:34:39 +0100</pubDate></item><item><title>MonoRail custom scaffolded views</title><description>&lt;p&gt;A long time ago, I needed (and still need) Castle MonoRail to use custom NVelocity scaffolded views instead of the embedded ones. This feature is supposed to be present, unfortunately a bug prevents it from picking filenames correctly.&lt;/p&gt;

&lt;p&gt;I reported MR-ISSUE-537 with the text above and a patch against svn revision 5884. We&amp;#8217;re at r6332, the patch still applies cleanly (read: it has not been checked in). I sure can be comprehensive, but reviewing and applying a patch that trivial is quite a no-brainer.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Scaffolding uses embedded views, unless some are provided locally. Unfortunately, this feature is broken for all scaffolded views except list.vm. It boils down to the various ComputeTemplateName method being vastly incoherent and returning broken paths.&lt;/p&gt;
  
  &lt;p&gt;I successfully patched the affected files and rebuild MonoRail. The feature then works as expected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the patch, if you ever need scaffolding to behave:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/RemoveAction.cs   (working copy)
@@ -35,7 +35,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return String.Format(@"{0}\{1}removed", controller.Name, Model.Type.Name);
+           return controller.Name + "/remove";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/UpdateAction.cs   (working copy)
@@ -36,7 +36,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\update{1}";
+           return controller.Name + "/update";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs   (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/CreateAction.cs   (working copy)
@@ -33,9 +33,9 @@
        {
        }

-       protected override string ComputeTemplateName(IControllerContext controllerContext)
+       protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controllerContext.Name + "\\create";
+           return controller.Name + "/create";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/EditAction.cs (working copy)
@@ -34,7 +34,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\edit";
+           return controller.Name + "/edit";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs  (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/NewAction.cs  (working copy)
@@ -49,7 +49,7 @@
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return String.Format(@"{0}\new{1}", controller.Name, Model.Type.Name);
+           return controller.Name + "/new";
        }

        /// &amp;lt;summary&amp;gt;
Index: MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs
===================================================================
--- MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs    (revision 5738)
+++ MonoRail/Castle.MonoRail.ActiveRecordSupport/Scaffold/ConfirmRemoveAction.cs    (working copy)
@@ -37,7 +37,7 @@

        protected override string ComputeTemplateName(IControllerContext controller)
        {
-           return controller.Name + "\\confirm";
+           return controller.Name + "/confirm";
        }

        protected override void PerformActionProcess(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/244931961</link><guid>http://f-utility.tumblr.com/post/244931961</guid><pubDate>Sun, 15 Nov 2009 18:07:00 +0100</pubDate></item><item><title>Underrated technology</title><description>&lt;p&gt;Since the advent of graphical environments, the desktop metaphor has become the core of the modern computer experience. It is the very first thing a user will experience of his computer. It is also the least spoken about, and quite underrated.&lt;/p&gt;

&lt;p&gt;The desktop metaphor presents a number of interesting side-effects inferred from its very design, or rather non-design. Being a bunch of icons of any kind that can be placed in any way on any background it is essentially a sandbox, precisely like a physical desk. As such, a desktop eventually ends up being very personal.&lt;/p&gt;

&lt;p&gt;Everything starts with the background. I swear the first thing - or close enough - anyone has been taught on a modern computer is how to change the desktop background. For newcomers to the digital world, this feat alone provides both a sense of achievement and make that bland, beige or grey thing a familiar place to come back to. &amp;#8220;I can master this thing, I can make it mine&amp;#8221;. Instant - although partial - relief.&lt;/p&gt;

&lt;p&gt;Somehow though, the sense of privacy is being skewed when people use computers. As a consequence, I have been shocked numerous times at how intensely I have been assaulted by a sudden jump into someone&amp;#8217;s privacy, projected on a wall in all its 3x2 meters glory.&lt;/p&gt;

&lt;p&gt;At a glance, a desktop can give a lot of insight about that person. Are the icons lined up? are they snapped to a grid? are they sorted by kind, name, date? are default or unusual settings in use? are they grouped manually? are they covering the background? From the position, grouping, ordering, or absence of icons down to the kind and name of what they represent is a showcase not of someone computer&amp;#8217;s mastery but of his thought process. And for decades since the desktop era, I couldn&amp;#8217;t help but notice that the vast majority of users digital desktops are a mess.&lt;/p&gt;

&lt;p&gt;Now, computers being made to help you achieve tasks, and the desktop being so emphasized, you have to ask yourself: how is your desktop integrated into your workflow? This is an important question, because this is all about reducing friction. Just as the digital desktop took inspiration in the physical world, take a look at your real desk.&lt;/p&gt;

&lt;p&gt;My physical desk is minimalist, up to the point that I do not need a dedicated desk at all. It serves as a temporary workspace, a short-lived sandbox. It fulfills my spatial requirement for the task at hand. My digital desktop is no exception and shares the same workflow. If I ever begin to steer away from that workflow and use my desktop as an inbox, or a permanent storage space, a huge mess ensues in a very short time span.&lt;/p&gt;

&lt;p&gt;So, whatever your workflow is, keep your desktop true to it: it&amp;#8217;s very little overhead to reap huge benefits in the end.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/237062124</link><guid>http://f-utility.tumblr.com/post/237062124</guid><pubDate>Sun, 08 Nov 2009 16:29:00 +0100</pubDate></item><item><title>Syncing Notes via IMAP</title><description>&lt;p&gt;In his latest essay about note solutions, &lt;a href="http://daringfireball.net/"&gt;John Gruber mentioned two ways to sync&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;locally, via USB (Notes) or WiFi (Things)&lt;/li&gt;
&lt;li&gt;remotely, via HTTP (SimpleNotes)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There is a third one. I&amp;#8217;ve seen only a single instance of it implemented, and it is implemented in Mac OS X, but not on the iPhone.&lt;/p&gt;

&lt;p&gt;It is IMAP.&lt;/p&gt;

&lt;p&gt;This is precisely how Notes are synced across various Macs in Apple Mail. All it takes is some IMAP folder, and a few X-* headers. This solution:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;leverages the IMAP protocol, which already solves a good deal of sync issues for the developper.&lt;/li&gt;
&lt;li&gt;does not require a web service, just an implementation in the client to manage the headers correctly.&lt;/li&gt;
&lt;li&gt;makes the content readable by any IMAP mail client, or even editable.&lt;/li&gt;
&lt;li&gt;anyone can have its own IMAP server, or use one of its choosing. This mitigates or eliminates privacy issues, depending on trust.&lt;/li&gt;
&lt;li&gt;could leverage PGP or S/MIME for more privacy, content control is in the hands of the user, not the server.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;What&amp;#8217;s more, those headers are fully readable by anyone and should be fairly easy to reverse engineer. One can see them straight in Mac OS X Mail.app by showing Raw Source (option-cmd-U) on the note.&lt;/p&gt;

&lt;p&gt;Technically, the specific headers are very simple:&lt;/p&gt;

&lt;p&gt;This one should identify the message as a note:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X-Uniform-Type-Identifier: com.apple.mail-note
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This one should give the message creation date, probably for sorting or syncing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X-Mail-Created-Date: 2009-04-11 12:57:37 +0200
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This one should tell the client that subject is generated from the first line of the content:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X-Mail-Generated-Subject: YES
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This one should be used to track notes during various syncs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X-Universally-Unique-Identifier: 5ba16de5-6c6d-4e9e-a24e-09aaa2b9cfd8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I just wonder why Apple&amp;#8217;s iPhone Notes.app doesn&amp;#8217;t use this mechanism. It could leverage iPhone Mail.app settings for that, especially together with MobileMe. It just feels weird for them to fall back on USB sync for that. Well, maybe they&amp;#8217;re working on it. I also wonder why no notes app developer ever thought of using this, providing him with instant sync with Mail, and graceful fallback on many desktop and web apps without the hassle of having to provide a web service. Well, barring having to implement IMAP that is. The only downside is that it does not go through HTTP and thus could be blocked by some firewall/proxy.&lt;/p&gt;

&lt;p&gt;When you come to think of it, this could be used by many apps, just not Notes.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/144078463</link><guid>http://f-utility.tumblr.com/post/144078463</guid><pubDate>Sat, 18 Jul 2009 12:29:00 +0200</pubDate></item><item><title>Tabs in TextMate</title><description>&lt;p&gt;TextMate tabs:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;are ugly&lt;/li&gt;
&lt;li&gt;look out of place&lt;/li&gt;
&lt;li&gt;don&amp;#8217;t scroll&lt;/li&gt;
&lt;li&gt;don&amp;#8217;t allow you to close files&lt;/li&gt;
&lt;li&gt;are insanely less efficent than Command+T&lt;/li&gt;
&lt;li&gt;at least five more quibbles&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Therefore, them being essentially useless and annoying, I just turn them off:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;defaults write com.macromates.textmate OakProjectWindowShowTabBarEnabled false
&lt;/code&gt;&lt;/pre&gt;</description><link>http://f-utility.tumblr.com/post/128649797</link><guid>http://f-utility.tumblr.com/post/128649797</guid><pubDate>Tue, 23 Jun 2009 11:45:00 +0200</pubDate></item><item><title>AppleScript with shebang</title><description>&lt;p&gt;&lt;a href="http://www.macosxhints.com/article.php?story=20040617170055379"&gt;This kind of workaround&lt;/a&gt; is useless nowadays, as in Leopard AppleScript takes # as a comment marker. So we can write this just fine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/osascript

do shell script "echo Hello World"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nice.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/124460759</link><guid>http://f-utility.tumblr.com/post/124460759</guid><pubDate>Tue, 16 Jun 2009 09:45:28 +0200</pubDate></item><item><title>Cartographer</title><description>&lt;p&gt;Ever since the web has been browsable, web browsing has been very linear. As a consequence, there are two historical ways one can look back at its navigation path:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;the time-based way, via one&amp;#8217;s history, unrelated to windows or tabs. It is mostly used in long journeys backwards in time.&lt;/li&gt;
&lt;li&gt;the sequence-based way, via the toolbar: next, previous and their associated list, linked to the current window or tab. It is mostly used for immediate history.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These are two points of view of the same database which is the navigation history. To achieve this, this history database retains mostly the page URL, the page title and the URL access time. I say mostly because it certainly has more data, and probably only in process memory, not on disk, but what matters is that this is the only user-queryable data.&lt;/p&gt;

&lt;p&gt;Since users have been able to open multiple windows, and even more since the advent of tabs, this browsing linearity has been destroyed, making the above history model very hard to use. Open in new window/new tab rules our world and makes history a mess.&lt;/p&gt;

&lt;p&gt;There is a third way to get back in time. Bookmarks.&lt;/p&gt;

&lt;p&gt;As web usage patterns emerged, bookmarks, or favorites, are of two kind:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;frequently visited&lt;/li&gt;
&lt;li&gt;stored as reference&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The first is merely a counter (maybe a bit smarter and statistical, but a counter nonetheless), and Safari&amp;#8217;s &amp;#8220;Top Sites&amp;#8221; covers it, as many other implementations.&lt;/p&gt;

&lt;p&gt;Taking the navigator/explorer metaphor, it&amp;#8217;s like going to an unknown place without drawing a map, merely noting the location of the place if you ever bookmark it. This teleportation feature is cool, but everyone has felt its most glaring shortcoming: it requires the user to voluntarily mark the target place.&lt;/p&gt;

&lt;p&gt;This is why history is so useful. Finding something again you remember having seen, maybe checked as being remotely useful someday but not worthy enough of your bookmarks. Or you bookmarked it, but you do bookmark so much stuff that it gets lost into a mess.&lt;/p&gt;

&lt;p&gt;Safari&amp;#8217;s use of Cover Flow is smart at using visual memory to find it again, but it&amp;#8217;s still lost in a maze of tab forking flattened in a linear world.&lt;/p&gt;

&lt;p&gt;How long does it take to find something again in your history? Well you&amp;#8217;d rather answer to this one: how often do you end up googling it again instead of looking in your history?&lt;/p&gt;

&lt;p&gt;Still, a search engine like google is good at finding new locations based on keywords, but it cannot know where you browsed (barring the seldom known and used search history which is useless anyway if you found the information deeper than first level browsing depth, and maybe you found it via Twitter anyway). This is the role of the browser.&lt;/p&gt;

&lt;p&gt;Therefore, here comes the aaaalmighty proposal:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;History navigation should be better stored as a tree: along with title, url and date, history database should contain parent and/or children nodes, so that a user can maintain a real map of not only when but how he got there. The next step is to build a good GUI for that. Maybe a nav&amp;#8217; bar along with the address bar? Maybe merging both? Who knows?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, navigation should store content. Not only as visual snapshots, but as real, textual content (upon which the web is based, even if there&amp;#8217;s media in the mix) to be searchable locally.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This way history retains location, content, and context.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s call that, not the Explorer, not the Navigator, but the Cartographer. Let web users build their own map of the web.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/120564834</link><guid>http://f-utility.tumblr.com/post/120564834</guid><pubDate>Tue, 09 Jun 2009 16:21:00 +0200</pubDate></item><item><title>Bing logo</title><description>&lt;a href="http://www.underconsideration.com/brandnew/archives/bing_sets_new_record_in_horizo.php"&gt;Bing logo&lt;/a&gt;: &lt;p&gt;Not only it is stretched, but this G just looks horribly out of place.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/117458286</link><guid>http://f-utility.tumblr.com/post/117458286</guid><pubDate>Wed, 03 Jun 2009 20:23:34 +0200</pubDate></item><item><title>Compromised Design</title><description>&lt;a href="http://www.andyrutledge.com/compromised-design.php"&gt;Compromised Design&lt;/a&gt;: &lt;p&gt;Interesting take on some situation I encounter A LOT. Some people just don’t seem to ever get a clue, and you just have to talk them out of crap.&lt;/p&gt;</description><link>http://f-utility.tumblr.com/post/117457196</link><guid>http://f-utility.tumblr.com/post/117457196</guid><pubDate>Wed, 03 Jun 2009 20:20:55 +0200</pubDate></item></channel></rss>
