<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Insanity in a box</title>
  <link>http://jmibanez.livejournal.com/</link>
  <description>Insanity in a box - LiveJournal.com</description>
  <lastBuildDate>Sun, 29 Mar 2009 10:30:10 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>jmibanez</lj:journal>
  <lj:journalid>1880859</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/50941418/1880859</url>
    <title>Insanity in a box</title>
    <link>http://jmibanez.livejournal.com/</link>
    <width>80</width>
    <height>80</height>
  </image>

<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/35762.html</guid>
  <pubDate>Sun, 29 Mar 2009 10:30:10 GMT</pubDate>
  <title>Still Alive</title>
  <link>http://jmibanez.livejournal.com/35762.html</link>
  <description>Yes, this blog is still alive, although a little... quiet.&lt;br /&gt;&lt;br /&gt;While I&apos;m figuring out a good topic to write (and while I flesh out a workable blogging schedule), here are a few pics from the various trips I&apos;ve taken recently. I&apos;ve been getting more and more into photography, having bought a DSLR, a Nikon D80.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/sets/72157615844025938/&quot;&gt;Palawan&lt;/a&gt;:&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3381499411/in/set-72157615844025938/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3596/3381499411_dedff2113d_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3382337728/in/set-72157615844025938/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3592/3382337728_6aa66948e1_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3382341376/in/set-72157615844025938/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3656/3382341376_7bfc840dd5_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3382335532/in/set-72157615844025938/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3603/3382335532_2ef064e31d_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/sets/72157613560803915/&quot;&gt;Laoag, Ilocos Norte&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3269237280/in/set-72157613560803915/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3440/3269237280_574f3f2faa_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3268412723/in/set-72157613560803915/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3526/3268412723_5c14f7c08e_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3269186162/in/set-72157613560803915/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3319/3269186162_da37580ddf_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3272151964/in/set-72157613560803915/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3524/3272151964_27b4362d2e_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/sets/72157615762419107/&quot;&gt;Cebu&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3311350674/in/set-72157615762419107/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3321/3311350674_98ee986e40_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3310515315/in/set-72157615762419107/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3381/3310515315_7bbf5dfbea_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3311346374/in/set-72157615762419107/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3624/3311346374_5910384082_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/jmibanez/3311341726/in/set-72157615762419107/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3432/3311341726_cd077911e3_s.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</description>
  <comments>http://jmibanez.livejournal.com/35762.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/35384.html</guid>
  <pubDate>Sun, 16 Nov 2008 16:10:49 GMT</pubDate>
  <title>Quick Updates</title>
  <link>http://jmibanez.livejournal.com/35384.html</link>
  <description>&lt;p&gt;Two things:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Work on tool that will be released as open source&lt;/b&gt;. I&apos;m currently finishing up a component that we&apos;ll be releasing as open source in the coming week or so, once I get the bits cleaned up and checked in. It&apos;s a case of an &quot;itch to scratch&quot;, and I&apos;ll be using it for a possible work project.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Another haircut&lt;/b&gt;. I got rid of my long hair today. That is all.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;Discuss.&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/35384.html</comments>
  <lj:mood>accomplished</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/35264.html</guid>
  <pubDate>Sun, 07 Sep 2008 15:03:56 GMT</pubDate>
  <title>My git-svn workflow</title>
  <link>http://jmibanez.livejournal.com/35264.html</link>
  <description>&lt;p&gt;I recently gave a lightning talk on git-svn at Barcamp Manila, and I thought some people might be interested in my day-to-day workflow when I work on projects.&lt;/p&gt;

&lt;p&gt;When I get started on a project here at work, I usually first do a clone of the upstream tree, whatever that might be. I run:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git-svn clone --stdlayout https://svn.orangeandbronze.com/&lt;i&gt;project&lt;/i&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;which checks out a copy of the SVN repository of &lt;i&gt;project&lt;/i&gt;; this might take a while, so I usually go out for coffee or move on to other tasks while it completes. Sometimes, however, I don&apos;t want the whole history, so I do a partial clone:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git-svn clone --stdlayout -r HEAD https://svn.orangeandbronze.com/&lt;i&gt;project&lt;/i&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;This then does only a checkout of HEAD, without history.&lt;/p&gt;

&lt;p&gt;When I begin work for the day, I &lt;code&gt;cd&lt;/code&gt; to the project&apos;s directory in a terminal, and do a status check to see what I&apos;ve been up to recently, just to refresh my memory:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git status&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git diff HEAD | less&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git log | less&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;This gives me a) the status of my current work tree and the branch I&apos;m working on, b) the changes since the last git commit I made, and c) notes from the log history. Sometimes, I&apos;ll be lazy and just pull up gitk for the tree, since it gives me pretty much everything above:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;gitk --all&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;gitk(1)&lt;/code&gt; command above allows me to visualize the commit history of the project, which is a boon when trying to nail down when something changed.&lt;/p&gt;

&lt;p&gt;Once I know where I am on the tree, so to speak, I do a checkout of master, and I pull any changes from upstream SVN:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git checkout master&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git-svn rebase&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;I usually checkout a branch when working on a particular feature or item. If I&apos;m starting work on that feature, I do:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git checkout -b &lt;i&gt;feature-name&lt;/i&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;However, usually I have already started on something, and I want to go back to that branch:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git checkout &lt;i&gt;feature-name&lt;/i&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;This allows me to sandbox different work (bugfixes vs. features). I avoid touching the &lt;code&gt;master&lt;/code&gt; branch, and instead work in other branches. Note that these branches are not visible on the SVN side; they&apos;re local to my git tree.&lt;/p&gt;

&lt;p&gt;If master has changed (i.e. I&apos;ve pulled in new changes from upstream SVN), I usually want to &lt;i&gt;rebase&lt;/i&gt; my work on top of that:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;git rebase master&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;I then bang on the code, making frequent commits for every small atomic unit of work completed. Once done, I review the code (in &lt;code&gt;gitk(1)&lt;/code&gt; or by checking the git logs), and see what needs to be pushed. I also take this time to edit the commit history (which I&apos;ll explain in another post). When I&apos;m ready to push upstream, I do another pull from upstream SVN (just so I&apos;m sure my code is built on top of HEAD), and rebase. I also run unit tests to make sure I didn&apos;t break anything. When I now know everything&apos;s peachy and ready to be published, I do a push to upstream SVN via dcommit:&lt;/p&gt;

&lt;blockquote&gt;&lt;i&gt;run tests...&lt;/i&gt;&lt;br /&gt;
&lt;code&gt;git-svn dcommit&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git checkout master&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git rebase remotes/trunk&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;The last two lines simply fast-forward master to whatever the current SVN HEAD is. At this point in time, I&apos;m ready to work on another task/feature/bugfix.&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/35264.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/34850.html</guid>
  <pubDate>Thu, 28 Aug 2008 05:19:12 GMT</pubDate>
  <title>Source Available: My hacks to fsp-h</title>
  <link>http://jmibanez.livejournal.com/34850.html</link>
  <description>For those interested in my hacks on top of other hacks to fspanel (i.e. my hacks on top of fsp-h), see &lt;a href=&quot;http://sites.google.com/site/jmibanez/Home/linux-miscellanea/my-fspanel-hacks&quot;&gt;here&lt;/a&gt;. Source code available via git &lt;a href=&quot;http://github.com/jmibanez/fsp-h-jmi/tree/master&quot;&gt;here&lt;/a&gt;, git URL: &lt;code&gt;git://github.com/jmibanez/fsp-h-jmi.git&lt;/code&gt;.</description>
  <comments>http://jmibanez.livejournal.com/34850.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/34686.html</guid>
  <pubDate>Mon, 25 Aug 2008 12:08:31 GMT</pubDate>
  <title>Xlib, XWMHints, XGetWindowProperty and 64-bit</title>
  <link>http://jmibanez.livejournal.com/34686.html</link>
  <description>I&apos;ve been hacking on a small panel for my current desktop environment&amp;mdash; I&apos;ve switched to using a really minimal no-frills environment consisting of openbox-3 and a small dock/notification area, since I was getting antsy about the GNOME 2 panel. I only wanted a simple list of open windows on a particular desktop and a clock, and I didn&apos;t need too much chrome on that. I couldn&apos;t quite set up the GNOME 2 panel to not use buttons or alternatively maximize the space for window title text, so I decided to simply ditch the panel altogether.&lt;br /&gt;&lt;br /&gt;So, enter &lt;a href=&quot;http://arsdnet.net/code/fsp-h.html&quot;&gt;fsp-h&lt;/a&gt;. The hacked version of F&apos;ng Small Panel is what I needed. Plus, to get the minimal window footprint needed, I added in a &lt;a href=&quot;http://www.box-look.org/content/show.php/Lessr+Theme+Pack?content=87524&quot;&gt;Openbox theme designed for people who don&apos;t need the titlebar text&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://people.orangeandbronze.com/~jmibanez/openbox-fsp-h2.png&quot;&gt;&lt;img src=&quot;http://people.orangeandbronze.com/~jmibanez/openbox-fsp-h2-crop.png&quot; alt=&quot;Openbox 3 + fsp-h (my hacks) + custom theme&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, I&apos;ve been trying to get as close to my old Ion3 environment as possible, and I think I&apos;ve gotten close enough. I hacked in support for quick window switching, ala ion3, where hitting &apos;W-1&apos; will switch to the first window on the desktop, hitting &apos;W-2&apos; will switch to the second, etc. I also got some 64-bit issues cleared up (the original code was built on 32-bit, and icons were broken on 64-bit).&lt;br /&gt;&lt;br /&gt;All in all, I think I&apos;m getting to like this. Plus, I&apos;m using GNOME Do for quick opens etc., as well as for doing Ion3&apos;s quick SSH (which I use to open a terminal to SSH to hosts).</description>
  <comments>http://jmibanez.livejournal.com/34686.html</comments>
  <lj:mood>accomplished</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/34431.html</guid>
  <pubDate>Mon, 21 Jul 2008 14:28:36 GMT</pubDate>
  <title>Emacs as a Java IDE</title>
  <link>http://jmibanez.livejournal.com/34431.html</link>
  <description>&lt;p&gt;(Note: Geek post ahead. You have been warned.)&lt;/p&gt;

&lt;p&gt;Admittedly, I&apos;m an Emacs power user (and no, I am not as hardcore as &lt;a href=&quot;http://www.sachachua.com&quot;&gt;some people&lt;/a&gt;). Emacs has been my primary text editor for the longest time&amp;mdash; the first time I picked up Emacs was way back in 2004, a little over four years ago, when I decided to just sit down and learn the little bugger. Now, I do a lot in the editor: my mail is handled and served by &lt;a href=&quot;http://gnus.org/&quot;&gt;Gnus&lt;/a&gt;, I handle my TODO lists and outlines through &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org Mode&lt;/a&gt;, and I do the majority of my text editing and coding in it.&lt;/p&gt;

&lt;p&gt;The last item bears a little explanation. My work entails a lot of heavy text editing in the form of code. I am a programmer by profession, and that means that I spend a majority of time looking at code if not writing it. We do a lot of Java where I work, and most of the &lt;a href=&quot;http://www.orangeandbronze.com/&quot;&gt;company&lt;/a&gt; uses Eclipse as the IDE of choice. I use Emacs.&lt;/p&gt;

&lt;p&gt;Now, Emacs has some decent support for editing Java files in the form of &lt;code&gt;java-mode&lt;/code&gt;, which features basic syntax coloring. That&apos;s a good bit, but it isn&apos;t exactly what I need&amp;mdash; if syntax coloring was all I needed, I could just edit files in &lt;code&gt;gedit&lt;/code&gt;. And, admittedly, there are a lot of goodies that a full blown IDE such as Eclipse can bring to the table&amp;mdash; code completion comes to mind, especially since Java can get somewhat verbose.&lt;/p&gt;

&lt;p&gt;So, my Emacs config also includes &lt;a href=&quot;&quot;&gt;JDEE&lt;/a&gt;, the Java Development Environment for Emacs. Unfortunately, JDEE development has been relatively stagnant of late, what with it only supporting ant and not Maven&amp;mdash; and the latter is a big deal in our shop, as we use AppFuse 2 in a lot of our projects.&lt;/p&gt;

&lt;p&gt;Fortunately, someone wrote a decent &lt;a href=&quot;http://www.emacswiki.org/cgi-bin/wiki/pom-parser.el&quot;&gt;parser for Maven 2 POMs&lt;/a&gt; (which isn&apos;t really a parser as it simply asks Maven for the classpath, but what the hey, it works). &lt;i&gt;Unfortunately&lt;/i&gt;, it doesn&apos;t work for multi-module projects, for one reason or another (and I&apos;m bad at debugging elisp. So, I decided to write a custom macro to handle it. I simple place the following in a JDEE prj.el file (in the root directory of my project):&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre&gt;
(jmi/load-multi-module-pom
 &quot;/path/to/project/root/here&quot;
 &apos;(&quot;pom.xml&quot; &quot;core/pom.xml&quot; &quot;web/pom.xml&quot;) ;; Path to module POMs
 (&apos;(jde-project-name &quot;My JDEE Maven Project&quot;) ;; Other JDEE variables set here
  &apos;(jde-expand-classpath-p t)
  &apos;(jde-lib-directory-names &apos;(&quot;^lib&quot; &quot;^jar&quot; &quot;^java&quot; &quot;^plugins&quot;))
  &apos;(jde-expand-classpath-p t)
  &apos;(jde-ant-enable-find t)
  &apos;(jde-gen-k&amp;r t)
  &apos;(tab-width 4)
  &apos;(jde-compile-option-command-line-args
    (quote (&quot;-Xlint:all&quot; &quot;-Xlint:-serial&quot;)))))
&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;i&gt;Et, voila&lt;/i&gt;. I get multi-module support. The macro is pretty simple, but it&apos;s the first I&apos;ve ever written (and I&apos;m thinking I could have written it as a function, if not for the expansion of the JDEE variable list at the end):&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
;; Project file helper for multi-module Maven projects
(defmacro jmi/load-multi-module-pom (base-path pom-path-list other-variable-setters)
  &quot;Macro to load multi-module projects into JDEE. BASE-PATH is
the path to the root of the multi-module project, POM-PATH-LIST
is a list of paths to the submodule pom.xml (relative to
BASE-PATH). Pass in a list of JDEE variables to set in OTHER-VARIABLE-SETTERS.&quot;
  (let ((my-classpath (make-symbol &quot;my-full-classpath&quot;))
        (my-sourcepath (make-symbol &quot;my-sourcepath&quot;)))
    `(progn
       (require &apos;pom-parser)
       (setq ,my-classpath  &apos;(&quot;/usr/share/java&quot;))
       (setq ,my-sourcepath  &apos;())
       (mapcar
        (lambda (pom-name)
          (progn
            (message &quot;Reading %s&quot; pom-name)
            (with-pom (concat ,base-path pom-name)
              (pom-set-jde-variables *pom-node*))
            (setq ,my-classpath (append ,my-classpath jde-global-classpath))
            (if (stringp jde-sourcepath)
                (setq ,my-sourcepath (append ,my-sourcepath (list jde-sourcepath)))
              (setq ,my-sourcepath (append ,my-sourcepath jde-sourcepath)))))
        ,pom-path-list)
       (jde-set-variables
        ,@other-variable-setters
        &apos;(jde-global-classpath ,my-classpath)
        &apos;(jde-sourcepath ,my-sourcepath)))))
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&apos;ll probably elaborate on more of my Java development environment under Emacs in future posts...&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/34431.html</comments>
  <category>emacs</category>
  <category>tech</category>
  <category>geek</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/34279.html</guid>
  <pubDate>Wed, 06 Feb 2008 10:23:37 GMT</pubDate>
  <title>Goodbye, pogi man. We&apos;ll miss you.</title>
  <link>http://jmibanez.livejournal.com/34279.html</link>
  <description>&lt;p&gt;Brother Felix Mason, FSC&lt;br /&gt;
&lt;b&gt;1919 - 2008&lt;/b&gt;&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/34279.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/33572.html</guid>
  <pubDate>Tue, 15 Jan 2008 10:01:51 GMT</pubDate>
  <title>On social relationships and metaphors</title>
  <link>http://jmibanez.livejournal.com/33572.html</link>
  <description>I&apos;ve been trying to find a copy online (or at least a summary of) &lt;i&gt;Gilingang Bato&lt;/i&gt; by Edgardo Reyes. The short story was published in the 1960s. It depicts a poor family who own a small millstone for griding rice; they sell rice cakes and other sweets to subsist.&lt;br /&gt;&lt;br /&gt;What prompted my sudden urge to find the story? I&apos;m kind of hazy on the plot of &lt;i&gt;Gilingang Bato&lt;/i&gt; and I wanted to clear up some bits of what I remember from it. It came to mind, in particular, during a conversation with Clair about social relationships, particularly with families and what-not. Food can sometimes be used as a metaphor for these relationships&amp;mdash; take a look at the difference between kalamay (ground glutinous rice cooked with sugar, coconut, peanut butter, etc.) and biko (a rice cake with caramel, etc.): the grains in kalamay are tightly bound together, while in biko you can distinguish these grains. Some relationships are tightly knit, some families are tightly bound in the same way as kalamay; while others are more loosely bound together, where each member has more individuality.&lt;br /&gt;&lt;br /&gt;Just send a note my way if you find a copy.</description>
  <comments>http://jmibanez.livejournal.com/33572.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/33442.html</guid>
  <pubDate>Wed, 09 Jan 2008 12:58:03 GMT</pubDate>
  <title>I am not the man(1) system</title>
  <link>http://jmibanez.livejournal.com/33442.html</link>
  <description>&lt;p&gt;Actual occurrence, just five minutes ago:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;i&gt;&lt;a href=&quot;http://blogs.orangeandbronze.com/butch&quot;&gt;Butch&lt;/a&gt;&lt;/i&gt;: JM, what&apos;s the purpose of &lt;code&gt;-a&lt;/code&gt; in git-commit?&lt;br /&gt;
  &lt;i&gt;Me&lt;/i&gt;: Uh, it&apos;s like this. &lt;i&gt;(Then I begin to explain in terms of &lt;code&gt;svn commit&lt;/code&gt; and the git index)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;
  Pause.&lt;br /&gt;&lt;br /&gt;
  &lt;i&gt;Me&lt;/i&gt;: You did &lt;i&gt;not&lt;/i&gt; just use me as a man page.
&lt;/blockquote&gt;</description>
  <comments>http://jmibanez.livejournal.com/33442.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/33219.html</guid>
  <pubDate>Thu, 22 Nov 2007 18:10:26 GMT</pubDate>
  <title>Desktop Environments, continued; and a bit of House</title>
  <link>http://jmibanez.livejournal.com/33219.html</link>
  <description>&lt;p&gt;Since I&apos;m a bastard to please, I&apos;ve &lt;i&gt;again&lt;/i&gt; switched away from ion3. I&apos;m now back to using Openbox 3 as my work environment, though I believe it to be suboptimal for my workflow. Call me fickle. Details under the cut.&lt;/p&gt;

&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;
&lt;p&gt;One of the reasons why I find most of the present-day environments suboptimal is probably because I have been so spoiled by ion3 (and have used ion3 for so long) that I have formed some opinions and assumptions about my work environment. Here&apos;s a rundown of my habits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I agree with Tuomo Valkonnen: the window manager should manage windows, not me. I don&apos;t like having to move through a stack of windows just to pull up a single window; I don&apos;t want to have to move my hand to the mouse to resize a window; I dislike the clutter of overlapping (floating) windows.&lt;/p&gt;
&lt;p&gt;When working on something, I usually have two Emacs frames up and running, one with my mail and the other with a buffer with a file I&apos;m currently working on, whether source or other. I also have several browser windows open, and hidden in another desktop, as well as several terminals. With this setup, I don&apos;t want to be bothered with the terminal windows while editing source code, and I don&apos;t want to have to move the Emacs window when it obscures a terminal window, for example. However, I want to be able to quickly switch to the terminal window with a keystroke.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;Although I like having my windows maximized by my window manager automatically, I also need to see &lt;i&gt;at a glance&lt;/i&gt; what windows are open in a particular desktop. Before using ion3, I was a ratpoison user&amp;mdash; I switched to ion3 primarily so that I could have a listing of windows on a desktop without having to hit a keystroke. Under ratpoison, I had to hit &lt;code&gt;C-t w&lt;/code&gt; to get a list of windows. With ion3, I know at a glance which windows are on a desktop, and...&lt;/li&gt;

&lt;li&gt;&lt;p&gt;...have one keystroke access to all my windows in a particular desktop. Currently, with Openbox and other window managers with an overlapping window policy, I have to circulate through the list of open windows just to get to a single window.&lt;/p&gt;

&lt;p&gt;With the above example, I know which Emacs frame I want to go to from the terminal. I don&apos;t want to have to move my hand to the mouse just to point to the Emacs frame. Under ion3 and my custom setup, I could hit &lt;code&gt;Mod4-1&lt;/code&gt; to select it (if it&apos;s the first window in the frame), and hit &lt;code&gt;Mod4-Backspace&lt;/code&gt; to go back to my previous window. In fact, I could hit &lt;code&gt;Mod4-Backspace&lt;/code&gt; to alternate between the two windows, across desktops in fact. I have yet to find an equivalent in Openbox or other environments&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;I need a system tray/notification tray. Although ion3 does not have a EWMH-compliant system tray (it follows a simpler protocol), I use &lt;code&gt;mod_dock&lt;/code&gt; and an app called docker (as well as window hints to move the docker window to the dock). Why do I need this? I have several apps running &amp;mdash; GNOME&apos;s NetworkManager applet, power manager, and bluetooth applets in particular. Without the dock, I would have to go through a barage of steps just to switch WiFi networks, for instance; this is one case where I don&apos;t mind using the mouse.&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;The reason for the switch back to Openbox is so I can wean myself slowly away from ion3. The mod_xinerama module that I mentioned in my last post is sort of broken, and I don&apos;t have the time to figure out how to get it running. Openbox Just Works when I resize my desktop across monitors, and although I find the whole setup still suboptimal, I might as well live with it.&lt;/p&gt;

&lt;p&gt;Tune in; I might suddenly decide to move back to ion3.&lt;/p&gt;

&lt;p&gt;Fickle.&lt;/p&gt;
&lt;hr /&gt;


&lt;p&gt;Just watched the latest episode of House, and wow. The killer scene, I have to admit is between House and Cuddy. House has just ordered the candidates to steal Cuddy&apos;s thong, and someone has purportedly done it. House wants to check:&lt;/p&gt;

&lt;blockquote&gt;&lt;i&gt;(House intentionally drops his bottle of Vicodin, Cuddy bends over to pick it up)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;House&lt;/i&gt;: &lt;i&gt;(wide-eyed)&lt;/i&gt; OH. MY. GOD! You&apos;re not wearing underwear!&lt;br /&gt;
&lt;i&gt;Cuddy&lt;/i&gt;: Of course I am, I&amp;mdash;&lt;br /&gt;
&lt;i&gt;House&lt;/i&gt;: Skirt that tight, you got no secrets. Skirt that tight, I can tell if you&apos;ve got an IUD. Seen Dr. &lt;span style=&quot;color: black; background-color: black&quot;&gt;Cole&lt;/span&gt;?&lt;br /&gt;
&lt;i&gt;Cuddy&lt;/i&gt;: No...&lt;br /&gt;
&lt;i&gt;House&lt;/i&gt;: You&apos;re blushing.&lt;br /&gt;
&lt;i&gt;Cuddy&lt;/i&gt;: I am not.&lt;br /&gt;
&lt;i&gt;House&lt;/i&gt;: Look at me.&lt;br /&gt;
&lt;i&gt;(Cuddy turns to House)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;House&lt;/i&gt;:OH. MY. GOD.&lt;br /&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, it&apos;s way funnier when you watch it.&lt;/p&gt;

&lt;p&gt;That and the ending, which I&apos;m not spoiling.&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/33219.html</comments>
  <category>tech</category>
  <category>humor</category>
  <category>about me</category>
  <category>geek</category>
  <category>house</category>
  <lj:music>Deftones - Passenger</lj:music>
  <media:title type="plain">Deftones - Passenger</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/32829.html</guid>
  <pubDate>Tue, 06 Nov 2007 03:23:46 GMT</pubDate>
  <title>Desktop Environments, Or How To Piss Off Your Users</title>
  <link>http://jmibanez.livejournal.com/32829.html</link>
  <description>If you&apos;ve ever seen me work, you probably know that I am quite comfortable with the command line. In fact, I prefer opening a terminal or writing a shell script rather than booting up a file manager; I can do a lot more on the command line, without taking my hands off the keyboard.&lt;br /&gt;&lt;br /&gt;So, my desktop environment of choice is &lt;a href=&quot;http://www.modeemi.fi/~tuomov/ion/&quot;&gt;Ion3&lt;/a&gt;, a keyboard-driven tiling window manager for X11. Recently, however, Ion3&apos;s author has made it &lt;a href=&quot;http://www.mail-archive.com/ion-general@lists.berlios.de/msg01758.html&quot;&gt;non-free&lt;/a&gt; and has &lt;a href=&quot;http://lists.berlios.de/pipermail/ion-general/2007-January/000821.html&quot;&gt;removed Xinerama support&lt;/a&gt;; this does not bode well for my particular use-case. I often have my work laptop plugged into another monitor (a &quot;head&quot;, in X11 parlance), and with XRandR 1.2 I can do this without having to restart the X server. With the two monitors, I have a lot more screen estate to work with, and I usually have one monitor with my code while the other shows documentation, or a terminal, or &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/docs/gitk.html&quot;&gt;&lt;b&gt;gitk(1)&lt;/b&gt;&lt;/a&gt; visualizing the project I&apos;m working on.&lt;br /&gt;&lt;br /&gt;Apparently, Tuomo Valkonen has this bull-headed idea that Xinerama is simply &lt;a href=&quot;http://www.modeemi.fi/~tuomov/ion/faq/entries/Xinerama.html&quot;&gt;unecological penis enlargement&lt;/a&gt;, and that he seems to think that all current-day GUIs (WIMPs: Windows, Icons, Menu, Pointing device) and their proponents are &lt;a href=&quot;http://modeemi.fi/~tuomov/b//archives/2007/04/01/T19_09_22/&quot;&gt;complete idiots&lt;/a&gt;, and I doubt his ideas of the &lt;a href=&quot;http://modeemi.fi/~tuomov/b/archives/2007/06/01/T19_09_43/&quot;&gt;free software community and its behavior&lt;/a&gt; are all that accurate&amp;mdash; he draws comparisons between the wiki communities and the FLOSS groups in one breath; those two communities may share the same ethos, but have vastly different mindsets and operational mechanics. Anyway. With the loss of Xinerama support, I had to drop Ion3 from my toolset and switch to another window manager/desktop environment.&lt;br /&gt;&lt;br /&gt;My first option was &lt;a href=&quot;http://www.suckless.org/wiki/wmii&quot;&gt;WMII&lt;/a&gt;, another keyboard-driven tiling window manager. Although I like its management policy, I felt that it was still lacking as it too did not have Xinerama support (yet). I needed an environment with Xinerama support, so I shopped around some more. I opted to use Openbox 3, which I&apos;ve used before.&lt;br /&gt;&lt;br /&gt;Openbox 3 has the advantage of Xinerama support, a lightweight core, and keyboard shortcuts (which makes it 2 for 3 on my scale). I could have learned to live with it, and I could have been quite productive.  However, the whole stacking and overlapping window policy was slowly getting to my nerves, and it was starting to annoy me that I had to move my hands off the keyboard to manage my windows. I have been too used to Ion3&apos;s management policy, that I felt that overlapping windows was just not my bit.&lt;br /&gt;&lt;br /&gt;So, after just a week on Openbox, I switched &lt;i&gt;back&lt;/i&gt; to Ion3. I found that someone had &lt;a href=&quot;http://www.mail-archive.com/ion-general@lists.berlios.de/msg01900.html&quot;&gt;hacked up a Xinerama support module&lt;/a&gt;, which was what I needed.&lt;br /&gt;&lt;br /&gt;I&apos;ll be sticking around with Ion3 for now, until WMII grows Xinerama support. Tuomo has been bull-headed from day one, and although I admire his hubris (I have to agree on the broad swath of his thesis on window management and user interfaces; it&apos;s on certain details I don&apos;t agree with), I dislike that he seems to think that his policy is the best, and that WIMP interfaces are wrong (although I don&apos;t use a WIMP interface, I have to agree that the research behind them is pretty solid, and that they are usable; in other words, I disagree with Tuomo on that point). I disagree that the FLOSS community is completely wrong; in fact, I think that Tuomo Valkonen is an idiot for abandoning his users in this way.&lt;br /&gt;&lt;br /&gt;I would have stuck with Ion3 for a long time, had it not been for this particular detail. Too bad. I happen to like Ion3, and I have been using it for more than three years now, a long time compared to the other environments I&apos;ve used. With Tuomo Valkonen abandoning Ion3&apos;s users in this manner, by pissing them off with intolerance and implying that they are ignorant, I am forced to move on to something better.&lt;br /&gt;&lt;br /&gt;I doubt that Tuomo realizes this: the silent users are more than the more vocal ones, and that he is probably slowly losing that silent majority.</description>
  <comments>http://jmibanez.livejournal.com/32829.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/32729.html</guid>
  <pubDate>Thu, 04 Oct 2007 21:35:55 GMT</pubDate>
  <title>Hiatus.</title>
  <link>http://jmibanez.livejournal.com/32729.html</link>
  <description>On Indefinite Hiatus. Will probably post some &lt;a href=&quot;http://twitter.com/jmibanez&quot;&gt;twitts&lt;/a&gt;.</description>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/32506.html</guid>
  <pubDate>Thu, 09 Aug 2007 17:21:17 GMT</pubDate>
  <title>Murphy&apos;s Law, and How Not To Call a Web Service</title>
  <link>http://jmibanez.livejournal.com/32506.html</link>
  <description>Recently, we&apos;ve been assigned to assist another company in a development/maintenance role. They had an existing web application, written in Java and used by a large number of users&amp;mdash; the web application was up and running and they needed to modify the application to interface with an external system, but they did not have the people who knew Java well enough onboard and the previous developers were no longer available to help them in this. That&apos;s where we came in: we provided the needed skills to add the feature in.&lt;br /&gt;&lt;br /&gt;To interface with them, the external system provided a web service interface (written on the .NET platform) which we had to call in a remote method fashion. That is, certain transactions on the web site had to call a web service method and await its reply before saving the transaction data into the database. We couldn&apos;t perform these web service requests asynchronously, a point I&apos;ll come back to later.&lt;br /&gt;&lt;br /&gt;To add to the pressure, we had four days to complete the code to interface with the web service (as well as an additional, but minor, feature), and two weeks of &quot;transition time&quot;, where the new web application would go live straight into production, with live data, but users would not be charged for transactions they&apos;ve made during the time.&lt;br /&gt;&lt;br /&gt;There was three of us on the team: me, Butch, and Miguel. We decided right off the bat to use Spring&apos;s remoting services for calling the external web service. We got everything up and running quickly on our development server, and we were waiting for the client&apos;s team to ready the production system for the turnover. However, Murphy decided to pay us a visit: there was a planned database switchover where the live production site would be made to point to a standby database instance while the live database would be upgraded, but things went south quite quickly.&lt;br /&gt;&lt;br /&gt;Anyway, we eventually got the whole shebang up and running the next day, with Murphy still breathing down our necks. This time, we found the application dying: within an hour or two of use by users, access to the application would slowly grind to a halt until nobody could access the application at all, and the application server (OC4J in this instance) had to be restarted.&lt;br /&gt;&lt;br /&gt;We set out to figure out this particulary nasty bit of news, and why it was happening. After about halfway into the transition time (and about two to three app server restarts &lt;u&gt;a day&lt;/u&gt;, disastrous) we found out why things were happening, as it was.&lt;br /&gt;&lt;br /&gt;It turns out that Axis 1.x, which we were using under the hood of the Spring JAX-RPC proxy bean creator as the JAX-RPC provider, uses a fire-and-forget HTTP transport. This means that under high concurrent load, the default axis HTTP transport would eventually exhaust all connections, as a lot of the finished HTTP transactions will be idling in the CLOSE_WAIT or TIME_WAIT, and the time for these to transition to fully closed isn&apos;t short enough for sockets to be reused.&lt;br /&gt;&lt;br /&gt;To give an idea of the connection loads we were seeing, the web application was handling about 20,000 to 30,000 transactions a day, from 9am to 6pm, with traffic peaking from 10am to 12pm; almost little to no traffic occurs outside of these times. Although this isn&apos;t spectacular (web sites that have been Slashdotted could get traffic a magnitude or two greater), the situation was exacerbated by latency: it took from one to two seconds for the external web service to finish, per method, and for each web transaction we were performing two web service method calls.&lt;br /&gt;&lt;br /&gt;(Aside: Since me and Butch were more conversant with monitoring and adminstering Linux servers than the Windows server that the web application was installed on, and since the only interaction we had with the server was a VNC connection to the machine (where it was coloc&apos;d), we had a tough time trying to piece together enough data to actually get to that conclusion. Really. And now my favorite tool on Windows is PERFMON&amp;mdash; even if I don&apos;t run Windows, at all. But I digress.)&lt;br /&gt;&lt;br /&gt;Apparently, Axis 1.x also supports another HTTP transport that uses the Commons HTTPClient library, which in turn does HTTP connection pooling. Telling Axis to use the Commons HTTPClient instead is well documented &lt;a href=&quot;http://wiki.apache.org/ws/FrontPage/Axis/AxisCommonsHTTP&quot;&gt;here&lt;/a&gt;, so I won&apos;t go into it. However, for reasons beyond me at the moment, the remote web service (being served by IIS, and possibly behind an ISA server) refused the Commons HTTPClient connections because of chunked encoding (i.e. the Commons HTTPClient wanted to send HTTP transactions in chunks and told the server by issuing &quot;Transfer-encoding: chunked&quot; in the initial headers). As I found out from &lt;a href=&quot;http://tjordahl.blogspot.com/2007/03/apache-axis-and-commons-httpclient.html&quot;&gt;here&lt;/a&gt;, there is a workaround, which I had to implement via subclassing of Spring&apos;s JaxRpcPortProxyFactoryBean, where I overrode &lt;code&gt;postProcessJaxRpcCall&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
    public void postProcessJaxRpcCall(Call call, MethodInvocation method) {
        super.postProcessJaxRpcCall(call, method);
        Hashtable ht = new Hashtable();
        ht.put(&quot;chunked&quot;, &quot;false&quot;);
        call.setProperty(&quot;HTTP-Request-Headers&quot;, ht);
    }
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I also used the subclass to fix a &lt;a href=&quot;http://forum.springframework.org/archive/index.php/t-33017.html&quot;&gt;particular concurrency bug in the JAX-RPC proxy bean that Spring has which we were hitting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So that basically saved the day. We did some stress testing before we put it into production, we observed the number of TCP connections established. Without the use of the Commons HTTPClient sender, the graph of network activity was rising linearly, with occasional dips as the load testing machine&apos;s activity dropped off (where the load tester&apos;s own threads were hogging each other for CPU time). With the Commons HTTPClient in place, the graph was quite flat, reaching a natural peak level without moving above that (of course, our concurrent load was constant, hence the ceiling).&lt;br /&gt;&lt;br /&gt;The moral of the story? When you&apos;re about to put a site live, Murphy will be knocking.</description>
  <comments>http://jmibanez.livejournal.com/32506.html</comments>
  <category>tech</category>
  <category>geek</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/32115.html</guid>
  <pubDate>Thu, 02 Aug 2007 06:21:18 GMT</pubDate>
  <title>Ping</title>
  <link>http://jmibanez.livejournal.com/32115.html</link>
  <description>This is a test of the emergency broadcast system</description>
  <comments>http://jmibanez.livejournal.com/32115.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/31773.html</guid>
  <pubDate>Mon, 25 Jun 2007 15:31:35 GMT</pubDate>
  <title>Expertise is more than meets the eye: One String IT Pieces</title>
  <link>http://jmibanez.livejournal.com/31773.html</link>
  <description>&lt;p&gt;&lt;i&gt;In a post, &lt;a href=&quot;http://sachachua.com/notebook/wiki/2007.06.23.php#anchor-1&quot;&gt;Sacha Chua asked: what are the &quot;one-string pieces&quot; of the IT world&lt;/a&gt;?&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The &quot;one-string piece&quot; of IT (systems administration maybe) could be the
various command line or Perl one-liners and what-not that does the job
and astounds our bosses; where, as deadlines loom or we&apos;re in the middle
of downtime costing the company, we pull out a one-liner that saves the
day. Or it might even be the little things: the libraries or tools
you&apos;ve researched or played with in your spare time, and apply in a
Eureka moment. You get that rush, knowing you&apos;ve gotten the most bang
for the buck, and your colleagues or bosses have no idea how you&apos;ve
accomplished so much with so little. Little do they know that you&apos;ve
been doing this kind of stuff for so long it comes naturally to you.&lt;/p&gt;

&lt;p&gt;It can be the knowledge of various sed/awk/perl combinations that you&apos;ve
played with, then applied with awe-inspiring precision to the problem at
hand. It can be the knowledge of the esoteric bits of the Java Language
Specification or the Java memory model or even the class library,
allowing you to figure out what exactly is going on underneath the hood,
causing that heisenbug that your coworker has been debugging for days --
which you&apos;ve solved in five minutes with a one line fix.&lt;/p&gt;

&lt;p&gt;It could be that.&lt;/p&gt;

&lt;p&gt;It&apos;s the stuff that others think they&apos;d never really need, but you know
will come in handy. It&apos;s the stuff that allows you to spend more time at
the higher levels of abstraction, but with the knowledge that you&apos;re
going to be comfortable going down to the bits and bytes if and when
(most likely when) the time comes.&lt;/p&gt;

&lt;p&gt;It&apos;s knowing that although GUI tools and wizards and nifty IDEs and
autocompletion will probably cut down the time it&apos;d take you to shape
your code, you have to know &lt;i&gt;how&lt;/i&gt; those tools work so that when it
breaks you can fix it.&lt;/p&gt;

&lt;p&gt;It&apos;s experience.&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/31773.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/31558.html</guid>
  <pubDate>Wed, 20 Jun 2007 20:38:02 GMT</pubDate>
  <title>VisualDNA.</title>
  <link>http://jmibanez.livejournal.com/31558.html</link>
  <description>&lt;lj-embed id=&quot;1&quot; /&gt;	&lt;div style=&quot;text-align:center; width:340px;height:25px;margin-top:0px; border-top:1px solid rgb(150,150,150);background-color:rgb(0,0,0);padding:5px 0 0 0; font-family:Arial, Helvetica, sans-serif; font-size:11px;&quot;&gt;&lt;a href=&quot;http://networking.imagini.blueorange.co.uk/vdna.php?uid=19362-0e52&amp;amp;srv=rb5&quot; style=&quot;color:rgb(255,255,255)&quot;&gt;Read my VisualDNA&lt;/a&gt;&lt;span style=&quot;font-size:10px;color:#cccccc&quot;&gt;&amp;trade;&lt;/span&gt;     &lt;a href=&quot;http://dna.imagini.net/friends/&quot; style=&quot;color:rgb(255,255,255) &quot;&gt;Get your own VisualDNA&amp;trade;&lt;/a&gt;&lt;/div&gt;</description>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/31270.html</guid>
  <pubDate>Tue, 19 Jun 2007 16:35:03 GMT</pubDate>
  <title>On Programming and The Programmer&apos;s Toolbox</title>
  <link>http://jmibanez.livejournal.com/31270.html</link>
  <description>&lt;p&gt;I am quite interested in a wide swath of technologies, some
esoteric, some popular. Particularly, I follow the news on
various libraries and tools. I like to keep my toolbox full.&lt;/p&gt;

&lt;p&gt;Although I&apos;m usually quite busy and I currently work in Java, I
keep my finger on the pulse of other systems. I play around with
Ruby, with PLT Scheme, with Perl. I look around for Emacs
hacks. I read &lt;a href=&quot;http://planet.gnome.org/&quot;&gt;various&lt;/a&gt; &lt;a href=&quot;http://planet.ubuntu.com/&quot;&gt;planets&lt;/a&gt; and &lt;a href=&quot;http://techscene.free.net.ph/&quot;&gt;aggregators&lt;/a&gt;. I check out
what people are working on. Mostly, I look at what I can put in
my toolbox.&lt;/p&gt;

&lt;p&gt;I try to learn what other people are using, what libraries they&apos;re
using, what tools and IDEs they&apos;re working with. I don&apos;t do this out
of envy&amp;mdash; I know my tools are still inadequate, and my toolbox is
still bare.&lt;/p&gt;

&lt;p&gt;Take, for instance, Microsoft&apos;s LINQ. LINQ is essentially a
language-level query system in the .NET universe, particularly in the
Orcas release of Visual Studio.NET and the .NET runtime. It allows you
to write queries as part of your source code, complete with syntax
checking and with the support of your language&apos;s data structures,
etc. Of course, I&apos;m glossing over some of it&apos;s really nifty bits, but
you get the point.&lt;/p&gt;

&lt;p&gt;Someone asked the &lt;a href=&quot;http://groups.yahoo.com/group/pinoyjug/&quot;&gt;PinoyJUG mailing
list&lt;/a&gt; about LINQ and Silverlight and what Java has to offer. It got
me thinking about the tools of my trade, and the tools in my
toolbox.&lt;/p&gt;

&lt;p&gt;Are my tools sufficient for the job at hand? Are the stuff we have in
the Java space sufficient for what I do?&lt;/p&gt;

&lt;p&gt;I disagree.&lt;/p&gt;

&lt;p&gt;The tools are never &quot;sufficient&quot;; they&apos;re usable for the job at hand,
they do the job, but they have their quirks and issues. For example,
if Spring or any dependency-injection framework wasn&apos;t in your
repertoire, you&apos;d think that the Factory and Service Locator patterns
were sufficient, were enough, to do the job -- and you&apos;d be blinded by
the problems of those patterns, that those patterns are not the
end-all-be-all. &lt;i&gt;However&lt;/i&gt;, Spring isn&apos;t a silver bullet&amp;mdash;
dependency-injection has it&apos;s own quirks, it&apos;s own series of
questions. How do you refer to &quot;soft&quot; dependencies? Why do I have to
write tons of XML? Setter or Constructor injection? What about bean
lifecycles? Cyclic dependencies? Hooking it up to legacy systems?&lt;/p&gt;

&lt;p&gt;If you ask me, it&apos;s not about looking for the tool when you need it,
but rather what tools you already know will help you deal with the
problem, or will help make the problem amenable to your other tools.
So goes the aphorism &quot;If the only thing you have is a hammer,
everything looks like nails&quot;: by expanding our knowledge of what tools
are available, creating new tools, and fixing existing ones we get to
write better code.&lt;/p&gt;

&lt;p&gt;Tools transcend code and libraries. When I refer to tools I also refer
to how to think of the problem. One can borrow the paradigms of
functional programming to write Java inner classes and nested classes
to parameterize or box behavior, for example. One can grok C++
templates and their patterns of use, and use it to metaprogram in
Java.&lt;/p&gt;

&lt;p&gt;My point here is that as someone in the business of writing software
systems, I do not sit still and just passively look up resources as I
need them. I become a better coder by reaching out and enriching my
toolset, and by that I can write better software.&lt;/p&gt;

&lt;p&gt;But in the end, only one truth can be said about tools:&lt;/p&gt;

&lt;p&gt;There is no silver bullet.&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/31270.html</comments>
  <category>semi-techy</category>
  <category>geek</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/31037.html</guid>
  <pubDate>Thu, 14 Jun 2007 07:26:04 GMT</pubDate>
  <title>Work, Browsers, and Context-Switching</title>
  <link>http://jmibanez.livejournal.com/31037.html</link>
  <description>&lt;p&gt;Someone on the PLUG mailing list said to an email I sent out:&lt;/p&gt;

&lt;blockquote&gt;
Now, why on earth does someone have multiple tabs? Too many tabs mean
you ain&apos;t working! That was mentioned by one of my friends.
&lt;/blockquote&gt;

&lt;p&gt;In my case, I really work with a lot of tabs and windows open. (It helps
if you&apos;re using something like ion3, or if you&apos;re perfectly comfortable
using a desktop environment and can rapidly switch between windows and
apps). Primarily, I usually have the following in a browser session:&lt;/p&gt;

&lt;ul&gt;
   &lt;li&gt;One window for mail (gmail)&lt;/li&gt;
   &lt;li&gt;One window for blogs and feeds&lt;/li&gt;
   &lt;li&gt;One or two windows for app development&lt;/li&gt;
   &lt;li&gt;Several windows for reference lookups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under my windows for reference lookups, I usually have several tabs open,
usually with a Google search being the first tab. I&apos;d open each
potentially useful link open in a tab. Plus, I group tabs with windows,
with each window dealing with research on a particular scope (API docs,
libraries, administration references, etc.)&lt;/p&gt;

&lt;p&gt;This allows me to move to cross-check references from each source. Say,
I have a tab open for the Javadocs to the Spring API for Hibernate
integration. I&apos;d want another tab showing the page from the online
Spring reference showing how a particular task is done in
Spring+Hibernate, with another tab showing possible code samples, with
yet another tab showing source code for related classes in Google Code
search (because I might be working on something that might need me
understanding how the implementation works, possibly because I might
need a hack or two to get what I need working).&lt;/p&gt;

&lt;p&gt;I might also be reading news posts and blog posts related to that
feature, so I&apos;d have another window open. Or I might go off to a tangent
and check whether or not there&apos;s an existing solution or library out
there for what I need (which means I don&apos;t write code, yay!).&lt;/p&gt;

&lt;p&gt;Multiply that by the fact that I don&apos;t necessarily close my windows or
tabs -- what I keep open represents my &quot;persistent state&quot; (of mind), and
when I context-switch to another aspect of what I&apos;m doing -- say I take
a breather, because I&apos;m stuck -- I can get back to what I&apos;m doing, and
just glance at the open pages and what tabs are open and what-not and
see from there how to proceed.&lt;/p&gt;

&lt;p&gt;That&apos;s also the reason why I have several buffers open in Emacs -- I use
Emacs as my primary work mail interface too (outside of GMail that is),
and I also use it for planning. I also use it as my IDE; flymake + the
Eclipse compiler + BeanShell means I get syntax highlighting *and* I get
background compilation inside of my Emacs session. But if I simply
closed off all my files, I couldn&apos;t easily switch easily between those
buffers, see files side-by-side, etc.&lt;/p&gt;

&lt;p&gt;Then again, I work this way because I can easily juggle state between
those related tasks, and I don&apos;t necessarily have to pay a penalty for
context-switching between them. It works for me, but I don&apos;t mean that
it&apos;ll work for you.&lt;/p&gt;

&lt;p&gt;Sure, if you have multiple browser windows and tabs open you might not
be focusing on what you&apos;re doing (hence, you&apos;re not working). But for
me, having those windows and tabs open means I don&apos;t have to really
remember a lot of information -- I use my computer to maintain that
state for me, allowing me to easily switch between tasks.&lt;/p&gt;

&lt;p&gt;YMMV. :)&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/31037.html</comments>
  <category>semi-techy</category>
  <category>geek</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/30903.html</guid>
  <pubDate>Mon, 21 May 2007 18:44:52 GMT</pubDate>
  <title>Shanghai, May 2007</title>
  <link>http://jmibanez.livejournal.com/30903.html</link>
  <description>&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/jmibanez/508061763/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/199/508061763_19ebcb59d0_m.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://flickr.com/photos/jmibanez/508054559/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/205/508054559_f7189e46cf_m.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://flickr.com/photos/jmibanez/508008032/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/199/508008032_b8a6e11d9c_m.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://flickr.com/photos/jmibanez/508008006/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/215/508008006_df3b5a83a3_m.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <comments>http://jmibanez.livejournal.com/30903.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/30472.html</guid>
  <pubDate>Mon, 16 Apr 2007 11:56:00 GMT</pubDate>
  <title>Some Popular Myths About JM Ibanez</title>
  <link>http://jmibanez.livejournal.com/30472.html</link>
  <description>&lt;ul&gt;
&lt;li&gt;JM Ibanez is Sanjaya Malakar in disguise.&lt;/li&gt;
&lt;li&gt;JM Ibanez does not sleep. He just goes into suspend mode.&lt;/li&gt;
&lt;li&gt;JM is a programming god.&lt;/li&gt;
&lt;li&gt;JM doesn&apos;t troubleshoot computer problems or software bugs; computers are just scared of him.&lt;/li&gt;
&lt;li&gt;JM Ibanez is actually a bunch of Linux daemons that have become sentient, written and maintained at a secret laboratory somewhere in southern Metro Manila.&lt;/li&gt;
&lt;/ul&gt;</description>
  <comments>http://jmibanez.livejournal.com/30472.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/30269.html</guid>
  <pubDate>Mon, 12 Feb 2007 22:05:58 GMT</pubDate>
  <title>You know you&apos;ve had too much caffeine...</title>
  <link>http://jmibanez.livejournal.com/30269.html</link>
  <description>... when you&apos;re suddenly tempted to do an impression of a dog humping a pole. Or an impression of a monkey in a cage. Or you suddenly have these other crazy impressions fill your head.&lt;br /&gt;&lt;br /&gt;Crap.</description>
  <comments>http://jmibanez.livejournal.com/30269.html</comments>
  <lj:music>Radioactive Sago Project - Alaala ni Batman</lj:music>
  <media:title type="plain">Radioactive Sago Project - Alaala ni Batman</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/30078.html</guid>
  <pubDate>Mon, 12 Feb 2007 15:31:37 GMT</pubDate>
  <title>My Sister Is Really My Sister</title>
  <link>http://jmibanez.livejournal.com/30078.html</link>
  <description>&lt;p&gt;On our way to dinner last Sunday, my mom inquired as to what restaurant nearby accepted credit cards.&lt;/p&gt;

&lt;blockquote&gt;Me: I&apos;m pretty sure that Yellow Cab will&lt;br /&gt;
Steph: I&apos;m not sure, but I am pretty.&lt;/blockquote&gt;</description>
  <comments>http://jmibanez.livejournal.com/30078.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/29724.html</guid>
  <pubDate>Wed, 31 Jan 2007 16:50:02 GMT</pubDate>
  <title>My Journey Into Computing (Part 3)</title>
  <link>http://jmibanez.livejournal.com/29724.html</link>
  <description>&lt;i&gt;I decided to actually &lt;/i&gt;write&lt;i&gt; about my experiences and my introduction to computing. I wanted it down for some semblance of posterity. This is part 3; you can read part 1 &lt;a href=&quot;http://www.livejournal.com/users/jmibanez/25609.html&quot;&gt;here&lt;/a&gt;, and part 2 &lt;a href=&quot;http://jmibanez.livejournal.com/26016.html&quot;&gt;here&lt;/a&gt;. I don&apos;t intend there to be a part 4, but feedback is much appreciated. Yes, yes&amp;mdash; this part is long-delayed.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Oh, and for those in the crowd: this is my space. You might find the hubris a tad bit too much though.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Growing up&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, in all honesty, I was a BASIC coder for the longest time, even longer than my current-day affair with Java. (Don&apos;t get me started on that topic though). BASIC had annoyed me, what with things I felt I couldn&apos;t do in it. Looking back with some hindsight, some things were indeed possible, although klunky&amp;mdash; one could simulate linked lists, for example, using arrays, and one could do graphics blitting via &lt;code&gt;PEEK&lt;/code&gt;s and &lt;code&gt;POKE&lt;/code&gt;s. But then, I didn&apos;t have much knowledge in such matters, and I couldn&apos;t really do the more ambitious things I had in mind. I wanted a more powerful language. At first, Pascal sounded nice, but I decided to go to C since I knew it had a reputation for being quite powerful. (Which, mind, is quite an understatement)&lt;br /&gt;&lt;br /&gt;But in order for me to play around with C, I needed a compiler. Initially, Turbo C fit the bill. The computer lab did have a copy, and I did use it for some time, but I felt that it was too old, too &lt;i&gt;small&lt;/i&gt;. I wanted a 32-bit compiler. The exact reasons for wanting a 32-bit compiler, of course, is lost on me right now, but I did find one.&lt;br /&gt;&lt;br /&gt;By my second and third years in high school, I was interested in writing a computer game from scratch, and I demanded from myself that I do it in C. If there&apos;s anything I learned from all my years coding in BASIC, it&apos;s all the bad mental habits. Unstructured code. Huge functions. Global variables. Variables appearing out of thin air. All very, very painful to wrench away from, especially when you start coding in C. And, considering that I wanted to do a game from scratch &lt;i&gt;in C&lt;/i&gt;, very painful indeed. (I never did get to finish that game too&amp;mdash; I don&apos;t know if that&apos;s a commentary on my abilities though. You be the judge)&lt;br /&gt;&lt;br /&gt;Mostly though, I dived into learning about AI and graphics&amp;mdash; 3D graphics was all the rage then, so I also dived into that. And I began to plunge into the Internet, but not really at home (we didn&apos;t have a modem yet). I began surfing at net cafes and shops, and at the library. The vastness of what was available online was stunning. This was still at the beginning of the explosion of the Internet in the popular consciousness of the world. I can say I was a witness to the explosion, albeit a bit late though.&lt;br /&gt;&lt;br /&gt;In any case, I picked up a lot of stuff from the Net. I was already aware of the existence of Usenet, of IRC, of the myriad forums that dotted the virtual landscape. However, there was one thing I wasn&apos;t yet aware of: free software and the open source movement.&lt;br /&gt;&lt;br /&gt;In the middle of the 90s, the free software movement led by the &lt;a href=&quot;http://www.fsf.org/&quot;&gt;Free Software Foundation&lt;/a&gt; and the &lt;a href=&quot;http://www.gnu.org/&quot;&gt;GNU project&lt;/a&gt; was just nascent. The free software movement&apos;s battle cry was about, well, free software&amp;mdash; free, as in freedom, not necessarily free as in beer. Open source wasn&apos;t yet what it is today. Linux was still in its early days.  But it was there: the GPL was already out, there was a substantial amount of code already written for the GNU project. One particular component became critical however: the GNU C Compiler, now known as the GNU Compiler Collection, or GCC.&lt;br /&gt;&lt;br /&gt;There already existed several ports of GCC to various platforms. In fact, it was slowly becoming the &lt;i&gt;de facto&lt;/i&gt; C compiler for a lot Unixen and Unix-like systems. Two ports were what caught my eye at the time: a port to the Win32 API and platform by Cygnus Solutions as part of their Cygwin system, and a DOS port by DJ Delorie named &lt;a href=&quot;http://www.delorie.com/djgpp/&quot;&gt;DJGPP&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Now, I did look into Cygwin. After all, I was running a Win9x box at the time, and Cygwin was (and still is) a complete set of Unix tools for Windows. What turned me off was the &lt;i&gt;size&lt;/i&gt; of it all. I couldn&apos;t download it and save it to a floppy&amp;mdash; CD burning was at its infancy, and USB and USB flash drives weren&apos;t even in existence. DJGPP, on the other hand, was &lt;i&gt;tiny&lt;/i&gt;. The components I needed I could save onto floppy. And that I did. &lt;br /&gt;&lt;br /&gt;It took several trips to a Net cafe near our house as well as several false starts, but it was worth the time. I finally had a 32-bit compiler (albeit for DOS).&lt;br /&gt;&lt;br /&gt;Of course, while I downloaded the ZIP files I needed, I explored DJ Delorie&apos;s site. On one particular corner was a collection of essays, one of which would slowly sink into my consciousness. It was a text file, and the author of the essay was Richard M. Stallman.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linux: Enter, Stage Left (well, almost)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Like I mentioned earlier, Linux was still in its early days&amp;mdash; but this is not to say that it wasn&apos;t quickly growing in the technical community. In my freshman year in high school, I decided to join the school orchestra (due, in part, to some prodding by my friend Leandro). Among the people I met in the orchestra was a junior by the name of Denny Antonino. Denny, who played the flute, introduced me to several other people, among them Carlo Sogono and Paolo Dolina.&lt;br /&gt;&lt;br /&gt;Paolo helped set up the #zobel IRC channel back in its heyday, and I would often visit #zobel while I surfed at Net cafes everywhere. Carlo, on the other hand, was a true geek&amp;mdash; he knew and ran Linux, and in fact helped set up the school&apos;s mail system. One of the memories I have of Carlo Sogono was when I was in sophomore year. I had joined the high school paper that year, after vowing not to the previous year&amp;mdash; I was part of the grade school paper in my seventh grade, and that  wasn&apos;t an experience I relished. In any case, we all hung out at the PPRO, the Publications and Public Relations Office. Our adiviser, Mr. Arianwen Dagmar Androu Tapang Lopez (who will kill me once he sees this entry) was friends with us all, including Carlo. One lunch hour, while helping with some articles, Carlo walked in rapidly to Sir Arwee&apos;s PC and fired up the telnet client of Windows 98. Now, I was well aware of the venerable telnet, but what I wasn&apos;t aware of was Linux. Anyway, he connected to a server (which one, I don&apos;t know until now), logged in, then fired off several commands. I was, obviously, looking over his shoulder. He was talking about an exploit named Teardrop, and how he had downloaded it and how it was affecting the server.&lt;br /&gt;&lt;br /&gt;I freely admit that at the time what he was talking about flew past me. I was a PC geek, and Windows-oriented at that. TCP/IP and networking was as foreign to me as Latin and Greek. So what I saw really flew past me, and I was utterly amazed. I wanted to know what the heck he was doing. And I wanted to check out Linux. But, unfortunately, I had a few hardware issues.&lt;br /&gt;&lt;br /&gt;First, we only had one PC which the whole family shared (or rather me, my sister, and my dad shared). The PC was running Windows 98 at the time, and it only had around 100MB of disk space left on the hard disk&amp;mdash; a hundred megs that I was constantly juggling with, removing and adding applications as necessary. Paolo (who also was a Linux geek then) was telling me that I could install it there, but I was a little wary considering the space I had left.&lt;br /&gt;&lt;br /&gt;If there was any moment in my journey which I regret, it was then. I could have started on Linux and joined the community early on, but because of disk space I couldn&apos;t. As they say though: better late than never.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Free and Open Source Software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;My almost foray into Linux did, however, get me interested in the workings of the Internet. It got me started on networking and other topics. And, quite fortuitously, it got me interested in open source.&lt;br /&gt;&lt;br /&gt;Remember that essay I was talking about earlier, the one by a guy named Richard M. Stallman? Richard M. Stallman (or RMS as he is better known) is the founder of the Free Software Foundation and leader of the free software movement and the GNU project. The essay was essentially about the philosophy behind Free Software (free as in freedom, not necessarily as in beer). At the time, I found it heady and hard to absorb. However, bits and pieces of it began to filter into my consciousness&amp;mdash; in particular, the need to have source code.&lt;br /&gt;&lt;br /&gt;DJGPP was my first taste of free software. With DJGPP came a license named the GNU General Public License, or GPL. I read through it and what it told me I could do kind of blew me away. &lt;i&gt;You mean you&apos;re giving the source code away?&lt;/i&gt; At the time, I was of the opinion that source was equivalent to the crown jewels of software: something that you jealously guarded from your competitors. I was of the proprietary, closed-source mindset. I had always believed that the money was in the source: you had to protect the source code to get paid. To sell software, I believed you had to protect the source code to it, to prevent anyone from gaining on you. The free software movement, on the other hand, seemed antithetical to business, to money making.&lt;br /&gt;&lt;br /&gt;However, I soon was able to digest what was not just possible, but what had already been done. The more I read about Linux, the more I read about the early success stories of the free software and open source movements, the more I got to understand: &lt;i&gt;hey, this whole shebang about free software works&lt;/i&gt;. And when I hit college, I was already quite well-versed with the whole deal, and was amazed by the news that Netscape was opening the source to their browser. &lt;i&gt;Woah&lt;/i&gt;, I told myself.&lt;br /&gt;&lt;br /&gt;I soon found myself using more and more of the FOSS stack. First, it was just the browsers. I opted to run Mozilla instead of Internet Explorer. Then, since I was already DJGPP, and since I wanted to write Windows apps, I switched to using MinGW, another GCC port, this time to Windows, just like Cygwin but more &lt;i&gt;minimalist&lt;/i&gt;. MinGW was a perfect fit for me, as I only needed to compile apps. During this time, I also discovered Allegro, a game programming library. Although technically not distributed under any one of the various licenses accepted as open source (it was and still is &quot;giftware&quot;), it was and still is developed under much the same ethos as other open source projects. (I remember one weekend hacking on a toy app that I wrote for a class; it was small tic-tac-toe app to help demonstrate the concept of AI). I started reading up on MySQL, and before long I actually started using Linux.&lt;br /&gt;&lt;br /&gt;My then-college professor, Mr. Joel Pira, was an avid Linux enthusiast, and we had a lab class on Java servlets. He decided to set up one of our labs as a dual-boot environment, where we would work in Linux for the lab class (Windows was left in for the other classes using the lab). That&apos;s where I first got a real taste of a Linux environment. I already read up on some Unix shell commands, having bought a beginner&apos;s introduction on Unix, and I was quite comfortable with a command line, having used one even on our family Windows machine. So I dove in. I knew how to request the manual pages for commands, I knew how to change directories, I knew how to list files. Before long, I started simply messing around, ssh-ing from one lab PC to another. Mr. Pira had entrusted me with the root password to all the machines there, and so I started &lt;i&gt;really&lt;/i&gt; messing around&amp;mdash; I once wall&apos;d a message to a friend&apos;s PC, and played around with his GNOME session by killing processes and restarting them while he was logged in. (Yes, I&apos;m evil.)&lt;br /&gt;&lt;br /&gt;Mr. Pira also lent me a copy of what would be the first distro I would ever have: Mandrake 8.1. As soon as I got the money saved up, I bought a el-cheapo 8-GiB hard disk from a PC shop in Makati, plugged it into our home PC, and installed Mandrake 8.1, keeping up the whole night as the machine copied and installed files. I was excited; I was thrilled; I was pumped up. &lt;i&gt;Finally&lt;/i&gt;, I told myself, &lt;i&gt;I&apos;ll be able to play around with Linux&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;I have not looked back ever since. I have run Linux as my desktop system from then, from basic stuff at first, to full-bore Internet browsing when &lt;a href=&quot;http://cyberlizard.livejournal.com/87222.html&quot;&gt;I got my winmodem working through a, well, clever hack&lt;/a&gt;. I run Emacs as my text editor of choice, and Gnus as my mail client of choice.&lt;br /&gt;&lt;br /&gt;And that, my dear friends, is my journey into computing. What&apos;s yours like?&lt;br /&gt;</description>
  <comments>http://jmibanez.livejournal.com/29724.html</comments>
  <category>semi-techy</category>
  <category>life</category>
  <category>ruminations</category>
  <category>about me</category>
  <category>personal</category>
  <category>events</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/29637.html</guid>
  <pubDate>Tue, 30 Jan 2007 02:53:23 GMT</pubDate>
  <title>More Git</title>
  <link>http://jmibanez.livejournal.com/29637.html</link>
  <description>&lt;p&gt;So, because I&apos;m such a geek, I&apos;ll post more about my Git experience.&lt;/p&gt;

&lt;ul&gt;

  &lt;li&gt;&lt;p&gt;&lt;em&gt;Juggling multiple states&lt;/em&gt;. I&apos;ve been handling several aspects of the project at my current assignment. Particularly, I&apos;m more or less in charge of the Ant build files, a JMS consumer for asynchronous task execution, and various other code-fu. Recently, Butch put the task of writing and wiring code to inject domain objects with a crypto service class&amp;mdash; an instance of which is only available in the HTTP session. Which means that, ordinarily, one couldn&apos;t do it via Spring: we&apos;re talking about domain objects (which aren&apos;t ordinarily managed by Spring) &lt;i&gt;and&lt;/i&gt; session scope (which isn&apos;t available until the HttpSession is created).&lt;/p&gt;

    &lt;p&gt;Enter Spring 2.0. We moved to Spring 2.0 recently, primarily for better JMS support. As a side-effect, we get shiny new stuff in the form of Spring 2.0&apos;s new bean scopes and better AOP support, which are godsends.&lt;/p&gt;

    &lt;p&gt;So, I set up my Git working tree to handle experimental work (which won&apos;t hit the central SVN repo until I&apos;m actually sure that I&apos;ve gotten my tests to run green) by creating a branch for it. With the branch set up, I can switch between my main (master) branch, where I work with the stuff that should hit everyone, and more experimental tree-breaking stuff. Switching between the two is as simple as doing &lt;code&gt;git checkout master&lt;/code&gt; and &lt;code&gt;git checkout my-experimental-tree&lt;/code&gt;. And, I have a third tree where my tree-specific config changes are applied and versioned, where I actually run tests and build test WARs and what-not.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;&lt;em&gt;Maintaining tree config files for testing&lt;/em&gt;. The codebase for the project I&apos;m working on uses several configuration files in the form of Java .properties files. To separate test configurations, I have separate trees. The advantage of this setup is I can use my work branches for real work, and switch over to the test configuration branches to test various configurations. Also, I keep debugging code in these branches&amp;mdash; I usually write some tracing logic in the form of simple &lt;code&gt;System.out.println&lt;/code&gt; statements, which I don&apos;t want to check in.&lt;/p&gt;&lt;/li&gt;

  &lt;li&gt;&lt;p&gt;&lt;em&gt;Experimenting safely, while offline&lt;/em&gt;. Since Git affords me offline commits, I can create a branch with &lt;code&gt;git checkout -b experimental-codebase&lt;/code&gt;, experiment, and later on apply certain patches from that tree into my mainline branch with &lt;code&gt;git cherry-pick &amp;lt;commit-id&amp;gt;&lt;/code&gt;. This preserves my commit log message, and applies the necessary patch. I haven&apos;t yet tried out patch managers (such as quilt), but I would be willing to bet that they&apos;d be of much help&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;</description>
  <comments>http://jmibanez.livejournal.com/29637.html</comments>
  <category>tech</category>
  <category>git</category>
  <category>geek</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://jmibanez.livejournal.com/29433.html</guid>
  <pubDate>Mon, 22 Jan 2007 10:43:02 GMT</pubDate>
  <title>Is The Long Hiatus Over Yet?</title>
  <link>http://jmibanez.livejournal.com/29433.html</link>
  <description>&lt;p&gt;&lt;em&gt;(...or, JM updates. Finally.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, I&apos;ve been terribly busy with Real Life that I haven&apos;t had the time to update this little corner of the web. (For the insatiably curious, I&apos;ve had countless opportunities to update&amp;mdash; just not the time to sit down and do so.) For those who don&apos;t interact with me in any form or manner (i.e. those who probably wouldn&apos;t give a damn anyway), here&apos;s a list of what I&apos;ve been up to lately, in the usual bulletpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I&apos;m busy working for &lt;a href=&quot;http://software.orangeandbronze.com/&quot;&gt;this wonderful company&lt;/a&gt;&amp;mdash; this blog is in fact aggregated in the company &lt;a href=&quot;http://planet.orangeandbronze.com/&quot;&gt;Planet, along with my wonderful cow-orkers&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;... Which also means that I&apos;ve stopped school for the meantime&amp;mdash; juggling the two is &lt;em&gt;insane&lt;/em&gt; (I&apos;ve tried it before, and it is not very conducive to either work or studies, at least in my case);&lt;/li&gt;
&lt;li&gt;I&apos;m definitely a year older, and will be another year older still this coming June;&lt;/li&gt;
&lt;li&gt;We bought a new desktop PC for the house, my specs, my choices&amp;mdash; a 2.6 GHz Pentium D, 512MB RAM, nVidia GeForce 4400, 160GiB SATA, and a 19&quot; widescreen LCD monitor. With &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Linux&lt;/a&gt; installed, of course;&lt;/li&gt;
&lt;li&gt;On a related note, we moved houses. I no longer live in Las Pi&amp;ntilde;as. I now live &lt;em&gt;on the border of&lt;/em&gt; Las Pi&amp;ntilde;as and Paranaque. Hah. Seriously, we moved houses, but we didn&apos;t move very far;&lt;/li&gt;
&lt;li&gt;I have a pet, a &lt;a href=&quot;http://www.flickr.com/photos/jmibanez/366169727/&quot;&gt;mongrel&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/jmibanez/366169726/&quot;&gt;pup&lt;/a&gt; I&apos;ve deigned to name Ronin. (My sister wanted to name him Bernie, and there was one cousin who wanted him named Pringles, for what it&apos;s worth);&lt;/li&gt;
&lt;li&gt;For the uninitiated, I have a &lt;a href=&quot;http://eclair.livejournal.com/&quot;&gt;girlfriend&lt;/a&gt;, and we&apos;ve been together for more than a year and a half! :);&lt;/li&gt;
&lt;li&gt;I&apos;ve been to Baguio for the Christmas break, just like (almost) every year;&lt;/li&gt;
&lt;li&gt;I&apos;ve discovered the utility of sleeping under cubicle desks;&lt;/li&gt;
&lt;li&gt;...Primarily because I&apos;ve been assigned to a project where that utility is one of the few things keeping me sane. That, and playing with Butch&apos;s, Glenn&apos;s and Clair&apos;s balls&amp;mdash; stress balls, that is. (Shame on you for having a dirty mind.);&lt;/li&gt;
&lt;li&gt;On a more geeky note (elaborated below), I heart &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/&quot;&gt;Git&lt;/a&gt; and now use it over &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; for my personal projects and what-not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, I was saying something about &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/&quot;&gt;Git&lt;/a&gt;. Details under the LJ cut, for those inclined.&lt;/p&gt;

&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;
&lt;p&gt;Basically, Git is one of those things that just makes sense for me. &lt;em&gt;Why didn&apos;t I use this before?&lt;/em&gt;, I kept asking myself. I never quite grokked distributed SCM before, but after actually trying Git out, I was blown away. I first tried it out on a personal project (which I may speak of in the future, if I can get an actual running prototype done), and was simply &lt;em&gt;blown away&lt;/em&gt; primarily by the size of working tree&amp;mdash; it was &lt;em&gt;way smaller&lt;/em&gt; than an equivalent Subversion working copy or repository &lt;em&gt;&lt;u&gt;and it had the whole history of the project right there with the working tree&lt;/u&gt;&lt;/em&gt;. The whole history. Damn.&lt;/p&gt;

&lt;p&gt;What got me started on the road to Git was &lt;a href=&quot;http://keithp.com/blog/Repository_Formats_Matter.html&quot;&gt;a blog entry by X.org hacker Keith Packard on repository formats/layouts&lt;/a&gt;. He basically made a case for Git vis-a-vis SVN, and what he asserted made sense; I disagree with some points of his, but the gist I agree with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Git provides better conflict resolution and merge tools.&lt;/em&gt; Definitely. Merging branches under SVN is a pain, and merge point tracking is still a TODO feature in SVN.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;User interfaces are fixable; repository formats are not.&lt;/em&gt; Fixing the UI is easy&amp;mdash; but starting from a &quot;broken&quot; repository format means that the breakage of that format cascades downwards, and one cannot move away from the format easily.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;SVN&apos;s repository format is essentially broken.&lt;/em&gt; Having each revision diff as a file (under the FSFS backend) means that damage is propagated downwards across files. It also means that corruption is not easily detected. Git mitigates this by using SHA-1 hashes as object identity, meaning that corrupted objects are easily detected when read.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Git wins in terms of size.&lt;/em&gt; When Keith Packard compared an import of the Mozilla CVS repository into SVN and Git, Git outshined SVN in terms of repository size. The base CVS repository was 2.7GB; the SVN tree bloomed to 8.2GB, while Git tree shrank it down to just 450MB. To quote Keith Packard: &quot;Given that a Mozilla checkout is around 350MB, it&apos;s fairly nice to have the whole project history (from 1998) in only slightly more space.&quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What got me &lt;em&gt;really&lt;/em&gt; hooked was a recent release of Git, which contained &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/docs/git-svn.html&quot;&gt;git-svn(1)&lt;/a&gt;, allowing &lt;em&gt;bi-directional operation between a Git working tree and an SVN repository&lt;/em&gt;. Which meant that I could turn myself into the company guinea pig and test Git out, while still being able to work on our projects (where we use SVN as our SCM of choice). I&apos;ve tried it out on my current assignment, and I was simply amazed by the fact that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I could now (almost) work while at home&amp;mdash; the project&apos;s SVN server is located at the client&apos;s premises, walled-off from the Internet at large, which means that we had to be at the client site to check in code. With Git and git-svn(1), I could work on some code, check it into my Git tree (preserving history), and sync with the SVN server once I get to the client site. Almost, because I can&apos;t run tests or even run the app&amp;mdash; the webapp has a dependency on a large Oracle database we have installed at the client&apos;s premises;&lt;/li&gt;
&lt;li&gt;I can make commits of finer grain. With SVN, I&apos;m forced to make commits that are coarser-grained. For example, I&apos;d want to check in a test even though I know that it&apos;ll break the build or will run red (because I haven&apos;t written the class or classes the test depends on, or haven&apos;t added in wiring in the Spring context files), primarily to preserve history&amp;mdash; I can go back to the log and see when I wrote the test, and so I know I can back out just that change when I need to, say when I find out that I don&apos;t need the test for some reason, even after writing the class the test was supposed to run against;&lt;/li&gt;
&lt;li&gt;I can work on multiple lines of development (i.e. multiple branches) without worry. With SVN, one would normally create a branch in the conventional branches directory in the repository. Merging under SVN, however, is a bit of a pain&amp;mdash; SVN doesn&apos;t yet keep track of merge points or branch points, so when doing an &apos;svn merge A B&apos; one has to specify the revision range manually. So, keeping track of trunk in your SVN branch is also a (relative) pain. Also, I&apos;d often want to work on several things at a given time: I&apos;d probably be refactoring the build files at the same time as working on a bug fix, and I don&apos;t like to check in the build file refactorings until I&apos;ve tested them properly, so a branch would make sense here. Git makes it simple for me to do that.&lt;/li&gt;
&lt;li&gt;Related to branching, Git comes with &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/docs/gitk.html&quot;&gt;gitk(1)&lt;/a&gt;, a graphical browser for browsing the history of a Git tree. With gitk(1), I can see where a tree has broken off the trunk, so to speak, and where branches merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had been previously of the &quot;distributed is not for us&quot; mindset, but am starting to think in terms of more hybrid, middle-ground solutions. Git + git-svn(1) is one of those solutions, and I believe that even if your team uses an SVN repository, team members will benefit from using Git for their own trees.&lt;/p&gt;
</description>
  <comments>http://jmibanez.livejournal.com/29433.html</comments>
  <category>tech</category>
  <category>summary</category>
  <category>geek</category>
  <category>misc</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
</channel>
</rss>
