<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>http://noswap.com/</id>
	<link rel="self" href="http://noswap.com/feed.xml"/>
	<title>NoSwap.com</title>
	<subtitle>open source software engineering</subtitle>
	<author>
		<name>John Reese</name>
	</author>
	<updated>2013-02-06T12:57:35Z</updated>
	<generator uri="http://github.com/jreese/nib">Nib</generator>
	<entry>
		<id>http://noswap.com/articles/android-apps-2012</id>
		<link href="http://noswap.com/articles/android-apps-2012"/>
		<title>Favorite Android Apps of 2012</title>
		<updated>2013-02-05T12:00:00Z</updated>
		<published>2013-02-05T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I post more of my favorite Android apps, and updates to my previous favorites.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Eighteen months ago, I wrote an article about my <a href="/articles/android-apps">Favorite Android Apps</a>,
but a lot has changed with Android and its app ecosystem since then.  Developers
have started putting more focus on design and usability when creating apps, and
of course newer apps have come along that I have come to rely upon.  I myself
have upgraded to newer devices, with a Nexus 7 replacing my Galaxy Tab 10.1,
and a Galaxy Nexus from work has sadly replaced my beloved but aging Nexus S.
So what follows are some of my favorite new apps from 2012, and some follow-up
on what my previous favorite apps look like in modern attire.  All screenshots
are taken from devices running Android 4.2.1 (CM 10.1 nightlies).</p>
<p><a href="http://noswap.com/articles/android-apps-2012">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/why-ralf-prefers-android</id>
		<link href="http://www.24100.net/2013/01/an-iphone-lovers-confession-i-switched-to-the-nexus-4-completely/"/>
		<title>Why Ralf Prefers Android</title>
		<updated>2013-01-10T12:00:00Z</updated>
		<published>2013-01-10T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>My thoughts on Ralf Rottmann's new preference for Android over iOS.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Along a similar vein as my previous post on <a href="/blog/why-i-prefer-android">Why I Prefer Android</a>,
Ralf Rottmann, a self-described &#8220;Apple fanboy&#8221;, has described why I prefer
Android better than I could in my own words:</p>
<blockquote>
<p>The latest version of Android outshines the latest version of iOS in almost
every single aspect. <strong>I find it to be better in terms of the performance,
smoothness of the rendering engine, cross-app and OS level integration,
innovation across the board, look &amp; feel customizability and variety of the
available apps.</strong></p>
</blockquote>
<p>On the topic of app and system integration:</p>
<blockquote>
<p>Another great example: Sharing stuff on social networks. On iOS, I have to
rely on the developers again. Flipboard, as one of the better examples,
gives me the ability to directly share with Google+, Twitter and Facebook.
On my Nexus 4, I have 20+ options. That is, because <em>every</em> app I install can
register as a sharing provider. It’s a core feature of the Android operating
system.</p>
<p>&#8230;</p>
<p>All of this is entirely impossible on iOS today. I’ve stopped counting how
often I felt annoyed because I clicked a link to a location in Mobile Safari
and would have loved the Google Maps app to launch. Instead, Apple’s own Maps
app is hardcoded into the system. And there’s no way for me to change it.</p>
</blockquote>
<p>Regarding possibilities for app developers:</p>
<blockquote>
<p>On iOS, many things I always wished to see being developed, simply cannot be
done because of the strict sandbox Apple enforces around apps.</p>
<p>&#8230;</p>
<p>I also have apps [on Android] that give me great insight into the use of
mobile data across the device and all apps. Or the battery consumption.
Or which apps talk home and how frequently.</p>
<p>None of it is available for iOS. And possibly won’t be at any time in the
near future.</p>
</blockquote>
<p>And summing up the way I&#8217;ve felt for a long time when using iOS devices:</p>
<blockquote>
<p>&#8230; whenever I grab my iPhone for testing purposes, iOS feels pretty old,
outdated and less user friendly. <em>For me, there currently is no way of going
back. Once you get used to all of these capabilities, it’s hard to live
without them.</em></p>
</blockquote>
<p>There are many things Apple got right with iOS, like making a consistent user
experience, and encouraging users to spend money in the market for quality apps.
But when they place so many restrictions and limitations on how you can use your
phone, and what your software is allowed to do on your own device, I gladly
give up those things that make iOS so great for the freedom to run apps that
can do what I want &#8212; and expect &#8212; from a modern computing device.</p>
<p><a href="http://noswap.com/blog/why-ralf-prefers-android">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/powered-by-nib</id>
		<link href="http://noswap.com/blog/powered-by-nib"/>
		<title>Powered by Nib</title>
		<updated>2012-12-15T12:00:00Z</updated>
		<published>2012-12-15T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>In which I describe my latest project and how this site now uses it.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>For the last couple years, this site has been managed and updated using the open
source static site generator called <a href="http://bitbucket.org/obensonne/poole/src">Poole</a>.  It is an excellent and simple
system, comprised of two Python files &#8212; the Poole source code and a
site-specific <a href="https://github.com/jreese/noswap/blob/poole/macros.py">macros.py</a> &#8212; a simple page template, input documents and
static content.  This is more than enough for a small static website, but
more complicated sites, like blogs, require quite a few macros in order to
generate things like archives, tag pages, or even RSS feeds.  Over the 18
months that I worked with Poole, my macro file had gotten a bit disorganization,
and the limitation of working from only a single template file was starting to
strain on what I could do with it.</p>
<p>Now keep in mind, I still like many of the features that drew me to Poole in the
first place, such as the use of a document-centric build process, with YAML
headers for defining page metadata rather than an inline, proprietary format
used by projects like Jekyll.  I also enjoy the simplicity of the content
representations, but the lack of an extensible content pipeline is my biggest
complaint.  Supporting formats other than Markdown requires adding yet another
hook to the macro file; generating archives and tag pages required hacking in a
multi-phase build using <code>os.exec()</code>; and inlining another page&#8217;s content
post-render was just not possible, resulting in Markdown named-link collisions
when rendering multiple posts to a single page.</p>
<p>I wanted something new.  So, for the past few months, I&#8217;ve been working on
<a href="https://github.com/jreese/nib">Nib</a>.</p>
<p>The resulting design is based heavily on the concepts of Poole, but built
around a primary goal of producing a proper content pipeline that is
simultaneously aware of the differentiation between resources and documents, and
defines multiple stages where plugins can hook into the process and alter or
generate page contents at build time.  Indeed, most of the actual functionality
of Nib is contained within a handful of plugins, while the main module merely
defines a framework for the content pipeline.</p>
<p>In effect, adding support for more content or resource formats should be as
simple as adding a new plugin attached to the appropriate file extensions.
Advanced content manipulation, generating &#8220;virtual pages&#8221;, and aggregating
pages or documents into multiple locations are all possible as well.</p>
<p>The Markdown plugin is 14 lines of code; the LessCSS plugin is 13; even the
blog plugin &#8212; which generates the archive pages, tag listings, and Atom feed &#8212;
takes only 86 lines to do a better job than the old Poole macros that required
double the effort.</p>
<p>Today, I&#8217;ve thrown the switch.  While it looks nearly identical to the old
site generated by Poole, the page you are now reading has officially been generated
by Nib.  The news feed sees the biggest makeover, having changed formats from
RSS to Atom, and now offers full content posts.  Link-style posts, a format that
I&#8217;ve been wanting to experiment with, are also a new option.  Both features
would have required more effort on Poole than I was interested in expending,
but the new architecture has allowed me to indulge myself.</p>
<p>Nib is still in an extremely early, and unstable, phase though.  It works for
the needs of my site, and does come with some basic documentation and a
<a href="http://nib.noswap.com">sample site</a> to start from, but it&#8217;s far from complete.  Near term goals
include adding support for an intelligent menu, as well as support for more
content and resource formats, like reStructuredText or SASS.  Contributions are
always welcome though, even at this early stage.  Nib is liberally licensed,
and I would love to hear feedback from anyone trying to use it.  Hopefully it
will be useful for someone other than myself.</p>
<p><a href="http://noswap.com/blog/powered-by-nib">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/why-i-prefer-android</id>
		<link href="http://noswap.com/blog/why-i-prefer-android"/>
		<title>Why I Prefer Android</title>
		<updated>2012-09-26T12:00:00Z</updated>
		<published>2012-09-26T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Just some of the reasons I like Android better than iOS.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="https://news.ycombinator.com/item?id=4517933">Asked of me on Hacker News</a>:</p>
<blockquote>
<p>What do you prefer about Android?</p>
</blockquote>
<p>I prefer Android because it allows apps to do more things for the user, and
allows them to better integrate with the system as a whole.</p>
<p>I can replace the on screen keyboard with one that has a full five-row keyboard
for times when I SSH into a machine. On a similar vein, when I SSH into a
machine, I can actually leave the SSH session running in the background while
I switch to another app, without fearing that the OS is about to kill my SSH
app while I&#8217;m looking something up or responding to a text message. I can also
leave my IRC client running in the background without it constantly needing to
reconnect when I switch back to it.</p>
<p>Intents in Android, especially in combination with the global Share mechanism,
allow any app to receive arbitrary data from any other app, meaning apps don&#8217;t
need to know about specific apps or services in order to integrate with them.
Clicking on a URL allows you to choose which browser (or set a default) to open
the link in, allowing you to use alternate browsers (or alternate email clients,
SMS apps, dialers, etc); tapping Share in the browser allows you to send the
current URL to any application that can receive a URL, making apps like
Instapaper, Pinboard, and 3rd party Twitter clients have the same capabilities
as first party applications.</p>
<p>Sideloading apps means I&#8217;m not limited to installing programs from the Android
Market/Play Store, and can do things like buy apps directly from the Humble
Indie Bundle and install them on my own.</p>
<p>Proper background service support, and allowing apps to affect things outside
their sandbox, lets me run programs like <a href="http://www.twofortyfouram.com/">Locale</a> that can monitor the phone&#8217;s
status, location, etc, and modify the phone&#8217;s settings automatically based on a
set of conditions that I&#8217;ve pre-arranged. My phone automatically silences itself
at night time and while I&#8217;m physically at work, turns on my Wifi when I&#8217;m at
home or work while defaulting it off when I&#8217;m out and about, and more.</p>
<p>That&#8217;s just some of the reasons I like Android better than iOS.</p>
<p><a href="http://noswap.com/blog/why-i-prefer-android">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/hack</id>
		<link href="http://noswap.com/blog/hack"/>
		<title>Hack</title>
		<updated>2012-06-22T12:00:00Z</updated>
		<published>2012-06-22T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I have a new employer (again), and a new website design.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>The past two months have been intense.  At the beginning of May, I was let go
from BioWare and Electronic Arts in a round of budget cuts for my studio.
Since then, I&#8217;ve played far too many video games (and beaten multiple titles),
slogged through innumerable interviews, redesigned my website from the ground
up, and celebrated my seventh wedding anniversary in some of the best summer
weather I&#8217;ve ever experienced.</p>
<p><strong>Oh, and I got a job at Facebook.</strong></p>
<p>On May 3rd, BioWare informed me that my position in the studio was being
eliminated.  My terrible luck had struck again.  But this time was different;
within a few days, a recruiter from Facebook found this website and my open
source work, reached out to me, and encouraged me to apply for an engineering
role.  Four weeks later, after phone screens and an on-site interview, I was
offered a position as a Production Engineer.  My luck had not only reversed,
it had gone off the scale in the opposite direction.</p>
<p>Alongside Facebook, all my other leads paled in comparison.  I wanted to stay
in gaming, but here was the opportunity of a lifetime, to join one of the
biggest and best engineering companies in the world, and the chance to learn
from some of the brightest minds in the industry.  The position is similar to
the role I had at BioWare: writing and maintaining software to manage and
automate the vast array of infrastructure that supports the front-end
applications and engineers.  It was an offer I couldn&#8217;t refuse.</p>
<p>Monday was my orientation, and I was immediately impressed by the level of
passion, vision and dedication from the entire team.  <a href="https://www.facebook.com/boz">Boz</a> discussed the
culture of &#8220;hack&#8221;, and told a story about building a loft in a war room when it
couldn&#8217;t fit everyone in just two dimensions.  <a href="http://en.wikipedia.org/wiki/Chris_Cox_(Facebook)">Chris Cox</a> gave an inspiring
talk about where Facebook is heading, and I got a surreal sense of wonder when
he mentioned our long term goals or the level of impact we have on global
society and the way people communicate.  It feels amazing to be part of a
company that truly wants to change the world and improve the lives of hundreds
of millions of people.</p>
<p>Even the training process embodies those same ideals.  The first few weeks,
every engineer goes through &#8220;bootcamp&#8221;, attending learning and development
sessions, sitting among other bootcamp engineers, and working with veteran
teammates on real tasks to get familiar with the infrastructure, tools and
codebase.  Everyone is given the chance to progress at their own pace, with as
much or as little help as needed.  I&#8217;ve already learned so much in a few days,
and I&#8217;ve also had the chance to share my own knowledge and experience with my
fellow newcomers.  And yet there&#8217;s still so much left to cover.</p>
<p>Wednesday was my first day at a desk.  Taped to the monitor was a sheet of
paper printed with bold, red lettering.</p>
<blockquote>
<p>What would you do if you weren&#8217;t afraid?</p>
</blockquote>
<p>I don&#8217;t have an answer for that yet, but I will soon.</p>
<p><a href="http://noswap.com/blog/hack">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/me-php-and-mantisbt</id>
		<link href="http://noswap.com/blog/me-php-and-mantisbt"/>
		<title>Me, PHP and MantisBT</title>
		<updated>2012-06-06T12:00:00Z</updated>
		<published>2012-06-06T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I stop using PHP, and step down as developer for MantisBT</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I&#8217;ve been spending time migrating my server from Ubuntu 10.04 to Arch Linux,
and in the process I thought very deeply about every PHP application installed
on the old server.  Five out of the six PHP apps were only there to support the
one that really stood on its own: <a href="http://www.mantisbt.org">MantisBT</a>, my long-standing bug tracker of
choice.</p>
<p>Now, I&#8217;ve been a core developer, and de facto release manager, for the project
for many years &#8212; since I was still in university and getting paid by my
then-employer to contribute features and plugins that they wanted to use for
their engineering team.  Those plugins, like <a href="http://github.com/mantisbt-plugins/source-integration">Source Integration</a>, wouldn&#8217;t be
free without me fighting to license and release them for the community.  And
I wouldn&#8217;t be where I am today without the experience and help I received in
turn from the very same community.</p>
<p>I know I haven&#8217;t been as involved in the project these days as I would like to
be; there is an endless list of features and improvements to make to both the
core system and the array of plugins I&#8217;ve created for it.  Some great community
members have stepped up and filled my place at times, while I have at least
tried to stay active on the mailing lists and in the IRC channels.  I&#8217;ve still
guided and cut the last couple releases, but I haven&#8217;t played a part in shaping
the future of the project.</p>
<p>There are multiple competing visions charting new paths for the aging project,
with conflicting goals and revision histories, and it really needs a stronger
leader to take the reins and guide the project to its next milestones.  I&#8217;m
unfortunately not the person to fill this role, for many reasons.  Maybe a few
years ago it would have been better timing.</p>
<p>Lately, I&#8217;ve come to the realization that I can no longer bring myself to work
with PHP for personal projects.  I don&#8217;t like the syntax, I don&#8217;t like where
the language is heading, I don&#8217;t like how much memory and CPU it requires to
run on a web server, and I just spend the whole time wishing I was writing
Python code instead.</p>
<p>This blog hasn&#8217;t run on PHP or a database for just over a year now, and with my
MantisBT install being used mainly for projects I don&#8217;t have the time or will
to work on, it just seems to be dead weight.  Github can serve my needs well
enough for the few remaining projects I work on, and without needing a
complicated setup on my end.  Turning off MantisBT means I no longer need
MySQL, PHPMyAdmin, APC, or even mod_php at all.  The remaining apps can easily
be replaced with external services.</p>
<p>So basically, this is me announcing what I&#8217;ve already been practicing for many
months now: I will no longer be a developer for Mantis Bug Tracker, but I will
remain involved as a mentor for other core developers, or for those seeking
some advice on my plugins or creating their own.  I won&#8217;t be maintaining any
of my plugins, but I will look at and accept pull requests until someone else
wants to step up as maintainer.  I will be removing MantisBT from my site, but
will keep a database dump in case I ever need to reference it in the future.</p>
<p>This is not me withdrawing from open source; I have many other projects that
I&#8217;ve been working on, most of which are written in Python or C++.  I find them
more enjoyable to deal with, and most importantly, they allow me to break out
of the realm of writing web applications.  IRC, as old as it is, has been my
point of intrigue lately, and is at the core of my current
<a href="http://github.com/jreese/pyranha">&#8220;pet&#8221; project</a>.</p>
<p>Regardless of language, you can still find me on <a href="https://github.com/jreese">Github</a>,
where all my toys are available for the public to point and laugh at.  And as
always, I will answer questions on Freenode as &#8220;jreese&#8221;, or via email, although
there may sometimes be a long delay before I can reply.</p>
<p>Thank you to everyone who&#8217;s contributed to MantisBT or its plugins, and thank
you to everyone who helped me on the way to where I&#8217;m going.</p>
<p><a href="http://noswap.com/blog/me-php-and-mantisbt">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/this-is-why</id>
		<link href="http://noswap.com/blog/this-is-why"/>
		<title>This is Why I Write Open Source Software</title>
		<updated>2012-02-14T12:00:00Z</updated>
		<published>2012-02-14T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Thank you to everyone who has taken the time to thank me for my work.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<blockquote>
<p>Hey man,</p>
<p>Just wanted to say thanks for the ZNC Push Module you made.  I&#8217;m using it
with Notify My Android and it works great! This should be a standard module
in ZNC imo. Stellar work my friend.</p>
<p>Best,<br>
~Lucien</p>
</blockquote>
<p>It makes me smile every time I hear from someone using my software, knowing that
I can make an impact on peoples daily lives, no matter how small it may be.
Thank you to everyone who has taken the time to thank me for my work.</p>
<p><a href="http://noswap.com/blog/this-is-why">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/ea-bioware-job</id>
		<link href="http://noswap.com/blog/ea-bioware-job"/>
		<title>EA BioWare</title>
		<updated>2011-10-18T12:00:00Z</updated>
		<published>2011-10-18T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I got a job offer from EA BioWare, as a Platform Systems Engineer, and will be moving to San Francisco!</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Last week, I received an offer from EA BioWare:  they want me to join their San Francisco
operations team as a Platform Systems Engineer!  I still can&#8217;t believe that this is happening,
but I&#8217;m going to be moving to California to work for a game studio.  This is practically my
dreams come true, and I&#8217;m excited and overwhelmed beyond my imagination.</p>
<p>I won&#8217;t be working on games directly, but I&#8217;ll be working in a devops role to automate and
manage servers for games and internal projects.  It&#8217;s a good fit with my experience in web
applications, system administration, and tool development.  It also can be a potential
stepping stone to a game development position later on.</p>
<p>The next two months are likely to be hectic, as I move to temporary housing in California,
and then find an apartment and move into it.  Ongoing projects may have to take a back seat
until I can get the free time again.  But the weather and job will be worth it!</p>
<p><a href="http://noswap.com/blog/ea-bioware-job">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/projects/znc-push</id>
		<link href="http://noswap.com/projects/znc-push"/>
		<title>ZNC Push</title>
		<updated>2011-10-06T12:00:00Z</updated>
		<published>2011-10-06T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Push notification module for ZNC</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Based around the core conditions and functionality from my <a href="/projects/znc-notifo/" title="ZNC to Notifo">original project</a>,
ZNC Push is a module for <a href="http://en.znc.in" title="ZNC, an advanced IRC bouncer">ZNC</a> that will send push notifications to multiple
services for any private message or channel highlight that matches a
configurable set of conditions, including the user&#8217;s <code>/away</code> status, time since
the last notification, number of clients connected to ZNC, and more.  Currently
supported push services include <a href="http://boxcar.io">Boxcar</a>, <a href="http://notifymyandroid.com">NMA</a>, <a href="http://notifo.com">Notifo</a>, <a href="http://pushover.net">Pushover</a>,
<a href="http://www.prowlapp.com">Prowl</a>, and <a href="http://supertoasty.com">Supertoasty</a>.</p>
<p>The module is released under the MIT license, and the source code and
full documentation can be found on the project&#8217;s <a href="http://github.com/jreese/znc-push" title="ZNC Push on Github">Github repository</a> page.</p>
<p><a href="http://noswap.com/projects/znc-push">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/articles/irc</id>
		<link href="http://noswap.com/articles/irc"/>
		<title>IRC, My Way</title>
		<updated>2011-09-13T12:00:00Z</updated>
		<published>2011-09-13T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I describe my IRC setup, how I chat on the go, and how I use my IRC client to chat on AIM and Google Talk.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>This is a post I&#8217;ve been meaning to write for a long time.  I have a rather
complicated setup involving multiple layers, but the end result is amazing.
I maintain a 24/7 presence on the internet &#8212; on multiple IRC servers and
instant messaging services &#8212; and I can send and receive messages from any
computer or device I happen to be using at the time.</p>
<p>From any SSH client, I can seamlessly pick up my IRC session where I last left
it, regardless of where I started that session.  Similarly, I can connect with
my phone&#8217;s IRC client, get a short backlog of recent conversations, or answer
pending private messages.  When I&#8217;m not already engaged in a conversation, I
get near-instant notification on my phone and desktop, allowing me to respond
at my leisure and from any location.  I never miss a private message because
I was connected from the wrong place, other users always see a single nick,
and I get a central, searchable history of every channel and private message.</p>
<p>With this sort of setup, I gain a lot of freedom &#8212; to deal with conversations
on my terms &#8212; and convenience.  It&#8217;s served me well for a couple years, and
I&#8217;ve enjoyed IRC much more since putting it all together.  For each layer, I&#8217;ll
detail the tasks it covers, the software I&#8217;ve chosen, and give a copy of any
configuration files or options needed to replicate my environment.</p>
<p><a href="http://noswap.com/articles/irc">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/air-force-museum</id>
		<link href="http://noswap.com/blog/air-force-museum"/>
		<title>Air Force Museum Photos</title>
		<updated>2011-08-01T12:00:00Z</updated>
		<published>2011-08-01T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I share photos from the Air Force Museum at Wright-Patterson AFB in Dayton, Ohio.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Yesterday, my wife and I visited the <a href="http://www.nationalmuseum.af.mil/">National Museum of the United States Air Force</a>
at Wright-Patterson AFB in Dayton, Ohio.  We walked through the three main hangars, mostly in chronological order.
I snapped a lot of pictures along the way with my Nexus S; I picked out the blurry duplicates where possible, and
captioned the photos as best I could.  They actually turned out better than expected, considering the low light
levels and how unsteady my arms got.</p>
<p>I didn&#8217;t get to take pictures of the <a href="http://en.wikipedia.org/wiki/North_American_XB-70_Valkyrie">XB-70</a> like I
wanted to though; it was in their Research and Development hangar, which requires an ID check and bus ride to visit.
Hopefully we&#8217;ll get to return soon and rectify that.</p>
<p>The full gallery is <a href="https://picasaweb.google.com/nucleareclipse/AirForceMuseum2011?authuser=0&amp;feat=directlink">on Picasa</a>,
and contains 130 photos.</p>
<p><img alt="B-29 &quot;Bockscar&quot;" src="https://lh3.googleusercontent.com/-mPxzzBLomTo/TjV-1UxQh0I/AAAAAAAAAjk/NYLMIq76PU4/s640/IMG_20110731_115650.jpg"><br>
B-29 &#8220;Bockscar&#8221;</p>
<p><img alt="F-86 Saber" src="https://lh4.googleusercontent.com/-1W2EJ7_jXfw/TjcQAD8EWgI/AAAAAAAAAp0/QBsr4d4iT6Y/s640/IMG_20110731_133028.jpg"><br>
F-86 Saber</p>
<p><img alt="F-117 Nighthawk" src="https://lh6.googleusercontent.com/-B0YkmUn3O0c/TjbLDp75PLI/AAAAAAAAAnU/K58ThZk4Gvc/s640/IMG_20110731_140904.jpg"><br>
F-117 Nighthawk</p>
<p><img alt="F-22 Raptor" src="https://lh5.googleusercontent.com/-yNIk88YjyCA/TjcV6aXw5nI/AAAAAAAAArs/y70EMEfiA2Y/s640/IMG_20110731_130122.jpg"><br>
F-22 Raptor</p>
<p><a href="http://noswap.com/blog/air-force-museum">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/projects/spotify-gnome</id>
		<link href="http://noswap.com/projects/spotify-gnome"/>
		<title>Spotify Gnome Integration</title>
		<updated>2011-07-15T12:00:00Z</updated>
		<published>2011-07-15T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>With Spotify now available for those of us in the USA, I set about wiring up the Spotify client on Linux to handle Gnome's media keys.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Spotify-Gnome is a program that provides Gnome media key support for the
<a href="http://www.spotify.com/us/download/previews/">Spotify Linux client</a>.
It supports the play/pause, stop, next, and previous signals, and is compatible with
both Gnome 2 and Gnome 3.</p>
<p>The Spotify client supports DBus for controlling the player, using the
<a href="http://www.mpris.org/2.1/spec/">MPRIS Specification</a>, but does not listen for basic
media key signals provided by Gnome.  This program acts as a &#8220;wrapper&#8221; around Spotify
to translate media key signals from Gnome and send them to the Spotify client.</p>
<p>The program is released under the MIT license, and the source code and documentation can be
found on the project&#8217;s <a href="https://github.com/jreese/spotify-gnome">Github repository</a> page.</p>
<p>Many thanks to <a href="http://kothar.net/index.php/blog/30-spotifydbus">Mike Houston at kothar.net</a>
and <a href="http://www.mabishu.com/blog/2010/11/15/playing-with-d-bus-interface-of-spotify-for-linux/">Fran Dieguez at Mabishu</a>
for their blog postings that pointed me in the right directions to get this implemented.</p>
<p><a href="http://noswap.com/projects/spotify-gnome">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/source-integration-triage</id>
		<link href="http://noswap.com/blog/source-integration-triage"/>
		<title>Source Integration Triage</title>
		<updated>2011-06-30T12:00:00Z</updated>
		<published>2011-06-30T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I list common problems and solutions for source integration users.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>When users are having troubles with setting up the source integration plugin with their repositories, I&#8217;ve
found that there is a common set of pain points.  I&#8217;m going to list them here, along with their respective
solutions, in hopes that users can more easily find the fixes in the future.  This post will be updated as
new tips or advice arrive.</p>
<h4>General</h4>
<ul>
<li>
<p>Linking changesets to issues requires commit messages to match the regular expressions specified in the
    source integration configuration page.  By default, phrases like &#8220;fixes #123&#8221; or &#8220;resolved #123, #123&#8221;
    are supported, in present, past, singular, and plural forms.</p>
</li>
<li>
<p>Remote checkin must be enabled for use by post-commit hooks that don&#8217;t use an API key to authenticate,
    and must list the IP addresses or blocks for any repository server that will push commit data to Mantis.</p>
</li>
<li>
<p>Remote imports must be enabled for use by cronjob-based scripts that will trigger Mantis to pull in new
    changeset data for a given repository.</p>
</li>
</ul>
<h4>Subversion</h4>
<ul>
<li>
<p>Your web server needs to have the SVN client binaries installed, and they must be accessible by the
    account that your web server uses.  Similarly, if the binaries are in a directory that&#8217;s not included in
    your web server&#8217;s default path, you will need to specify the directory path in your source integration
    configuration.  On Linux, this is usually <code>/usr/bin</code> or <code>/usr/local/bin</code> &#8212; on Windows, something like
    <code>c:/path/to/subversion/bin</code> is likely required.</p>
</li>
<li>
<p>For Windows servers, you may also need to enable the &#8220;Windows start&#8221; source integration option.</p>
</li>
<li>
<p>Make sure that the individual repository URL that you use for Mantis is the same URL you would use to
    checkout the repository when using an SVN client.</p>
</li>
<li>
<p>When using repositories that require authentication, make sure the username and password you enter in
    Mantis has read access to the entire repository.</p>
</li>
<li>
<p>If your repositories are hosted using HTTPS/SSL, and your server is using self-signed certificates, you
    will need to have SVN version 1.6 or newer installed, and you will need to enable the &#8220;Trust all SSL
    certs&#8221; option from source integration.</p>
</li>
<li>
<p>If your commit messages contain UTF-8 or other non-ASCII characters, or your system&#8217;s locale is not set
    to &#8220;en_US&#8221;, then you may need to look at issue <a href="http://leetcode.net/mantis/view.php?id=93">#93</a> and <a href="http://leetcode.net/mantis/view.php?id=130">#130</a> on my bug tracker
    for help modifying your server or SourceSVN plugin to use an appropriate encoding or locale.</p>
</li>
</ul>
<h4>Git</h4>
<ul>
<li>
<p>If using Gitweb, versions newer than 1.6 may not work correctly, as the Gitweb plugin is scraping HTML
    from the viewer, and changes to the HTML structure will break the Gitweb plugin.  The version of Gitweb
    in use on <a href="http://git.mantisforge.org">MantisForge</a> is known to work with the plugin.</p>
</li>
<li>
<p>Using Github with private organization repositories is not yet supported.  Private repositories for
    normal user accounts, however, <em>is</em> supported.  Enter the username and API key from any Github account
    with access to the repository, and it should import correctly.</p>
</li>
<li>
<p>Using branches other than &#8220;master&#8221; will require you to modify the individual repository configuration in
    Mantis to list any branches that you want to be imported.</p>
</li>
</ul>
<p><a href="http://noswap.com/blog/source-integration-triage">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/articles/android-apps</id>
		<link href="http://noswap.com/articles/android-apps"/>
		<title>Favorite Android Apps</title>
		<updated>2011-06-23T12:00:00Z</updated>
		<published>2011-06-23T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>A very long article in which I discuss some of my favorite and most-used apps for my Android phone and tablet.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>This past Friday, I bought the new <a href="http://www.amazon.com/gp/product/B00519RW1U?ie=UTF8&amp;tag=recomprogrboo-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=B00519RW1U">Samsung Galaxy Tab 10.1</a>, and I absolutely love it.
The new Honeycomb interface looks amazing, and is quite an improvement over what&#8217;s available on my
Nexus S with Gingerbread.  I love that the back, home, and task switching buttons are now rendered
on the screen instead of having hardware buttons, and combining those buttons into the notification
and status bar means you don&#8217;t even lose screen space compared to previous versions.  The new
application switcher looks really nice, but does seem to have some odd behaviors, like not showing
the browser that I just switched away from, or seemingly choosing at random whether to display the
list from the top instead of from the bottom where you would expect.</p>
<p>There are a lot of applications that don&#8217;t yet take advantage of what&#8217;s offered by the Honeycomb
APIs, but still tend to work really well.  It mainly depends on how well the author designed the
application to scale with the user&#8217;s screen size and density.  An example of doing it wrong is the
official Facebook app; it&#8217;s still usable mind you, but it certainly looks dumb in process,
showing the main menu as a large grid of tiny icons with massive amounts of whitespace between
them.  It would have gone a long way if they had simply scaled the images to fill the screen.</p>
<p>I&#8217;ve been meaning to write about some of my most cherished apps, and seeing them in new form has
given me an even better reason to get to it.  Some of them really only work well on a phone, and
others have only gotten better than ever when given a tablet form factor to call their own.  So
in no particular order, here are my favorite apps for Android.  All prices are rounded up from
Market estimates at time of writing, and all screenshots are taken from my devices:</p>
<p><a href="http://noswap.com/articles/android-apps">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/source-integration-api-key</id>
		<link href="http://noswap.com/blog/source-integration-api-key"/>
		<title>Source Integration API Keys</title>
		<updated>2011-06-06T12:00:00Z</updated>
		<published>2011-06-06T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>The Source Integration framework now supports use of API keys to authorize incoming changeset data.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Today marks an incremental release to the Source Integration plugin framework for MantisBT, now at version
0.16.3.  This marks the introduction of support for using an API key to authorize inbound changeset data
from repository data sources.  It is initially supported for integration with Github, where large array of
servers made it all but impossible to whitelist allowed IPs for remote commit data.</p>
<p>Future plans for the feature include support for configuring multiple API keys simultaneously, as well as
adding support for using the API keys from other data sources, such as SVN or Gitweb repositories.
Additionally, the old options for listing allowed IP addresses is now considered deprecated, and will likely
be removed entirely at the next major release.</p>
<p>To set up an API key in your MantisBT instance, visit the Repository Configuration page, where you will find
a new option labelled, strangely enough, &#8220;API Key&#8221;.  You will need to generate your own key; the best way to
do this is on a machine with OpenSSL by running the following command to create a secure, random string of
hexadecimal digits, and then copying the resulting string to MantisBT:</p>
<pre><code>$ openssl rand -hex 12
</code></pre>
<p>Once this is done, you can enable this on your Github projects by visiting the Service Hooks admin page for
your repositories, activating the MantisBT hook, and copying the same key string into the &#8220;Api Key&#8221; field
there.  Any future pushes to your Github repo should send data to your MantisBT install using the API key to
authorize the data submission.</p>
<p><a href="http://noswap.com/blog/source-integration-api-key">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/python-multiprocessing-keyboardinterrupt</id>
		<link href="http://noswap.com/blog/python-multiprocessing-keyboardinterrupt"/>
		<title>Python: Using KeyboardInterrupt with a Multiprocessing Pool</title>
		<updated>2011-05-31T12:00:00Z</updated>
		<published>2011-05-31T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>There is a better way to do it, and noone has posted it yet.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I&#8217;ve recently been working on a parallel processing task in Python, using the multiprocessing module&#8217;s Pool
class to manage multiple worker processes.  Work comes in large batches, so there are frequent periods
(especially right after startup) where all of the workers are idle.  Unfortunately, when workers are idle,
Python&#8217;s KeyboardInterrupt is not handled correctly by the multiprocessing module, which results in not only
a lot of stacktraces spewed to the console, but also means the parent process will hang indefinitely.</p>
<p>There is quite a lot of suggestions for mitigating this issue, such as given in <a href="http://stackoverflow.com/questions/1408356/keyboard-interrupts-with-pythons-multiprocessing-pool" title="Keyboard Interrupts with python's multiprocessing Pool on Stack Overflow">this question on Stack
Overflow</a>.  Many places point to <a href="http://www.bryceboe.com/2010/08/26/python-multiprocessing-and-keyboardinterrupt/" title="Python Multiprocessing and KeyboardInterrupt by Bryce Boe">Bryce Boe&#8217;s article</a>,
where he advocates rolling your own replacement for the multiprocessing module&#8217;s Pool class, but that seems
to not only invite bugs and added maintenance overhead, but also doesn&#8217;t address the root cause.</p>
<p>I have figured out (what I think is) a better solution to the problem, and have not found anyone else
mentioning it online, so I have decided to share that here.  It not only solves the problem of handling the
interrupt for both idle and busy worker processes, but also precludes the need for worker processes to even
care about KeyboardInterrupt in the first place.</p>
<p>The solution is to prevent the child processes from ever receiving KeyboardInterrupt in the first place, and
leaving it completely up to the parent process to catch the interrupt and clean up the process pool as it
sees fit.  In my opinion this is the most optimal solution, because it reduces the amount of error handling
code in the child process, and prevents needless error spew from idle workers.</p>
<p>The following example shows how to do this, and how it works with both idle and busy workers: </p>
<pre><code>#!/usr/bin/env python

# Copyright (c) 2011 John Reese
# Licensed under the MIT License

import multiprocessing
import os
import signal
import time

def init_worker():
    signal.signal(signal.SIGINT, signal.SIG_IGN)

def run_worker():
    time.sleep(15)

def main():
    print "Initializng 5 workers"
    pool = multiprocessing.Pool(5, init_worker)

    print "Starting 3 jobs of 15 seconds each"
    for i in range(3):
        pool.apply_async(run_worker)

    try:
        print "Waiting 10 seconds"
        time.sleep(10)

    except KeyboardInterrupt:
        print "Caught KeyboardInterrupt, terminating workers"
        pool.terminate()
        pool.join()

    else:
        print "Quitting normally"
        pool.close()
        pool.join()

if __name__ == "__main__":
    main()
</code></pre>
<p>This code is also available on Github as <a href="http://github.com/jreese/multiprocessing-keyboardinterrupt" title="jreese/multiprocessing-keyboardinterrupt on Github">jreese/multiprocessing-keyboardinterrupt</a>.
If you think there&#8217;s a better way to accomplish this, please feel free to fork it and submit a pull request.
Otherwise, hopefully this helps settle this issue for good.</p>
<p><a href="http://noswap.com/blog/python-multiprocessing-keyboardinterrupt">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/job-spam</id>
		<link href="http://noswap.com/blog/job-spam"/>
		<title>Job Spam</title>
		<updated>2011-05-22T12:00:00Z</updated>
		<published>2011-05-22T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Things that make it obvious that your &#8220;job offer&#8221; is just a piece of spam you&#8217;re throwing at the
wall to see what sticks:</p>
<ul>
<li>
<p>Saying you found my resume on Monster.com or some other job site when I have never ever
  registered or even visited the site in question.</p>
</li>
<li>
<p>Saying you found my resume on a site I <em>did</em> sign up for, and then blatently ignoring that my
  account is marked as &#8220;not willing to relocate&#8221; and offering me a job in backwater Arkansas,
  Montana, Tennessee, or South Dakota.  There is exactly one place I want to relocate to, and that
  is the west coast.</p>
</li>
<li>
<p>Requiring knowledge in technologies that aren&#8217;t even mentioned in passing on my resume.</p>
</li>
<li>
<p>Looking for &#8220;Rock Start&#8221; software engineers to join a start-up.</p>
</li>
<li>
<p>Advertising your start-up with a bullet point of &#8220;e-commerce&#8230; e-commerce&#8230; e-commerce&#8221;.</p>
</li>
<li>
<p>Having your offer email include a footnote saying &#8220;Message sent with an unregistered version
  of MailList King!&#8221;.  Nothing says legitimate like a recruiter who uses an unregistered piece of
  spam software.</p>
</li>
</ul>
<p>Sigh&#8230;</p>
<p><a href="http://noswap.com/blog/job-spam">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/locale</id>
		<link href="http://noswap.com/blog/locale"/>
		<title>Locale</title>
		<updated>2011-04-25T12:00:00Z</updated>
		<published>2011-04-25T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Locale for Android is an excellent application for automating settings changes based on configurable conditions.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Fred Wilson&#8217;s <a href="http://www.avc.com/a_vc/2011/04/locale.html" title="Fred Wilson on Locale">recent post</a> on Locale for Android was on Hacker News today, and
although I <a href="http://news.ycombinator.com/item?id=2484844" title="Why I like Locale">commented there</a> on why I like Locale, I want to expound on that a bit
further.</p>
<p>I bought the very first Android phone, the T-Mobile G1, when it was first released over two years
ago.  Even then, <a href="http://www.twofortyfouram.com/" title="Locale">Locale</a> was big news for the platform, having won the very first <a href="http://code.google.com/android/adc/adc_gallery/#1" title="Android Developer Challenge 1">Android
Developer Challenge</a>.  I have been using it on all my Android phones since then, and I
continue to be impressed by it.</p>
<p>Locale is <em>the</em> killer app for Android.  It embodies everything that Android is capable of, and
everything that Apple refuses to allow in iOS.  My phone can now be smart enough that I don&#8217;t have
to babysit its settings everywhere I go; it knows when to be discreet and when to be secure.  No
other mobile OS can do that.</p>
<p>For a quick background, Locale is an application for automating changes to your phone&#8217;s settings
based on a configurable set of &#8220;situations&#8221;.  You define a set of &#8220;defaults&#8221;, and then each
situation is comprised of a set of &#8220;conditions&#8221; and &#8220;settings&#8221;.  When a situation&#8217;s conditions are
met, the associated settings override the defaults; when the conditions are no longer met, Locale
returns to the default settings.  By combining multiple situations together in a priority list,
your phone can make intelligent decisions, and seamlessly switch between multiple situations as
they become active or inactive.</p>
<p>But what makes Locale even better is that it was designed from the beginning to be extensible.
You can find plugins on the Market that add new conditions and settings.  Because of Android&#8217;s
ability to share data between applications, these plugins can even go so far as to use context
from, or modify behavior of, other applications installed on your phone.  As an example, the
<a href="http://www.weloveastrid.com/" title="Astrid">Astrid task manager</a> allows you to attach a location to your tasks, and integrates with
Locale as a condition when you reach those locations.</p>
<p>But for a more concrete example of just what&#8217;s possible, I&#8217;d like to show you what my current
Locale conditions and settings are.</p>
<ul>
<li><strong>Defaults</strong>: Wifi off, Ringer volume 85%, Vibrate on, Media volume 70%, Password lockscreen on</li>
<li><strong>Night</strong> (Time 10pm-7am): Ringer off, Vibrate off</li>
<li><strong>Work</strong> (Location): Wifi on, Ringer off, Vibrate on,</li>
<li><strong>Headphones</strong> (Headphones connected): Media volume 20%</li>
<li><strong>Home</strong> (Location): Wifi on, Ringer volume 100%, Password lockscreen off</li>
</ul>
<p>The Locale plugins that I use to accomplish this:</p>
<ul>
<li><a href="https://market.android.com/details?id=com.willemstoker.PasswordPlugin">Locale Password Lock Plug-in</a> by Willem Stoker</li>
<li><a href="https://market.android.com/details?id=com.twofortyfouram.locale.setting.media_volume">Locale Media Volume Plug-in</a> by two forty four am</li>
<li><a href="https://market.android.com/details?id=com.twofortyfouram.locale.condition.headphones">Headphones Plug-in</a> by two forty four am</li>
</ul>
<p>Color me happy.</p>
<p><a href="http://noswap.com/blog/locale">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/kittycat1</id>
		<link href="http://noswap.com/blog/kittycat1"/>
		<title>Kitty Cat One</title>
		<updated>2011-03-28T12:00:00Z</updated>
		<published>2011-03-28T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I have a new toy to play with at work</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I just got three new toys to play with at work, sitting in a server room, just waiting for me to
have fun with them.  Here&#8217;s a screenshot of me running <code>htop</code> on the first one; it&#8217;s current
hostname is &#8220;kittycat1&#8221;&#8230;</p>
<p><a href="http://dl.dropbox.com/u/7859496/Screenshots/2011-03-28-kittycat1.png"><img alt="screenshot of htop on kittycat1" src="http://dl.dropbox.com/u/7859496/Screenshots/2011-03-28-kittycat1-small.png"></a></p>
<p>Not exactly the shabbiest set of servers to work on&#8230;</p>
<p><a href="http://noswap.com/blog/kittycat1">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/podcast17-foss-talk</id>
		<link href="http://noswap.com/blog/podcast17-foss-talk"/>
		<title>Open Source talk on Podcast 17</title>
		<updated>2011-03-28T12:00:00Z</updated>
		<published>2011-03-28T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I take part as a guest host on Podcast 17 to talk about the benefits and challenges of open source modifications for the Source engine.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>On Saturday, I appeared as a guest host on <a href="http://www.podcast17.com" title="Podcast 17">Podcast 17</a>, for the interview portion of
<a href="http://www.podcast17.com/episodes/asides/developing-mods-as-floss/" title="Podcast 17 episode #128: Developing Mods as F/OSS">episode #128</a>, to talk about the benefits and challenges of creating open source
modifications for Valve&#8217;s Source engine, the power behind their classic Half Life 2 series. It got
rather sidetracked from the original plan of discussion, and ran longer than expected, but there
was some interesting discussion, and great insight from former Valve contractor <a href="http://www.linkedin.com/in/tsergi" title="Tony Sergi on LinkedIn">Tony Sergi</a>.</p>
<p>If you work on the Source engine, or are looking to run or join open source mod projects, I highly
recommend you take the time to listen in.</p>
<p><a href="http://noswap.com/blog/podcast17-foss-talk">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/new-domain</id>
		<link href="http://noswap.com/blog/new-domain"/>
		<title>New Domain</title>
		<updated>2011-03-24T12:00:00Z</updated>
		<published>2011-03-24T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>LeetCode.net will now be redirecting to me new domain, NoSwap.com</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>For multiple reasons, I&#8217;ve decided to move away from using my LeetCode.net domain for my online
identity and begin using NoSwap.com instead.  I will be slowing moving over my sites and
applications, and will make sure to set up 301 permanent redirects or other forwarding methods as
necessary to make sure nothing gets orphaned for the forseeable future.</p>
<p>As for the actual reasoning behind the move, it stems from multiple issues I had with the old
domain, such as:</p>
<ul>
<li>
<p>Being able to pronounce my email address and domain to the general public without having to
    always spell it out and make sure they catch that there are two e&#8217;s in the domain.</p>
</li>
<li>
<p>Switching at the same time from jreese@ to john@ for my address also means I don&#8217;t have to
    worry about people misspelling my last name, which happens so much even my own family still
    gets it wrong on a regular basis.</p>
</li>
<li>
<p>Not having to explain what &#8220;leet&#8221; is, or getting remarks about it being a juvenile choice
    due to the stigma of &#8220;leetspeak&#8221;.</p>
</li>
<li>
<p>It&#8217;s a short .com domain, so that people will get it right every time; I&#8217;ve had people assume
    I actually meant leetcode.com, without confirming it before sending a doomed message&#8230;</p>
</li>
</ul>
<p>Anyways, in the off chance that you&#8217;re a sentient being, and actually reading this, if you happen
to catch an error or gap in my redirection efforts, please drop a line to john@ this domain.</p>
<p><a href="http://noswap.com/blog/new-domain">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/projects/znc-notifo</id>
		<link href="http://noswap.com/projects/znc-notifo"/>
		<title>ZNC to Notifo</title>
		<updated>2011-01-03T12:00:00Z</updated>
		<published>2011-01-03T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Notification module for ZNC and Notifo.com</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><strong>Update:</strong>
ZNC to Notifo has been renamed to <a href="/projects/znc-push/">ZNC Push</a>, and given support for multiple push
notifications services, including <a href="http://boxcar.io">Boxcar</a> and <a href="http://www.prowlapp.com">Prowl</a>.  Please update your links
to the new <a href="/projects/znc-push/">ZNC Push</a> page.</p>
<p>ZNC to Notifo is a module for <a href="http://en.znc.in" title="ZNC, an advanced IRC bouncer">ZNC</a> that will send notifications to a <a href="http://notifo.com">Notifo</a> account
for any private message or channel highlight that matches a configurable set of conditions,
including the user&#8217;s <code>/away</code> status, time since the last notification, number of clients
connected to ZNC, and more.</p>
<p>The module is released under the MIT license, and the source code and documentation can be
found on the project&#8217;s <a href="http://github.com/jreese/znc-notifo" title="ZNC to Notifo on Github">Github repository</a> page.</p>
<p><a href="http://noswap.com/projects/znc-notifo">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/neighbor</id>
		<link href="http://noswap.com/blog/neighbor"/>
		<title>Neighbor</title>
		<updated>2010-11-01T12:00:00Z</updated>
		<published>2010-11-01T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Yesterday evening, I received sorrowful news.  My neighbor had passed away in her sleep, to the surprise
of everyone who knew her.  An active grandmother, her personality exuded a quiet energy, a presence that
brightened your day and made you smile.  The loss is palpable.</p>
<p>Rest in peace, Joyce.  You will be missed.</p>
<p><a href="http://noswap.com/blog/neighbor">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/android-is-open</id>
		<link href="http://noswap.com/blog/android-is-open"/>
		<title>Android is Open</title>
		<updated>2010-10-19T12:00:00Z</updated>
		<published>2010-10-19T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I rant about people who say Android isn't open because of Google and carriers</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I am biased.  But hopefully I can still be insightful and argue this point.  This was
sparked by a <a href="http://news.ycombinator.com/item?id=1806441">thread on Hacker News</a>, in which someone commented:</p>
<blockquote>
<p>Android is all but open.</p>
</blockquote>
<p>I&#8217;m calling this out.  Android, as a software project, is completely, 100%, open.  It&#8217;s
released by Google with the Apache license, which is recognized by OSI and the FSF as a
Free/Libre, Open Source license.  The Android code itself is freely available, freely
redistributable, and can be compiled and flashed onto any compatible device.</p>
<p><em>However</em>, there is a significant portion of the Android ecosystem that <em>is not</em>
&#8220;open&#8221; by the same definitions above:</p>
<ul>
<li>
<p>Device drivers for individual phones are open or closed depending on the device
  and the individual chipsets in question, but that is a moot point in my opinion as
  there are plenty of people who use Free desktop operating systems with closed &#8220;binary&#8221;
  drivers. Therefore I will leave this topic for another discussion.</p>
</li>
<li>
<p>All of the Google-branded applications &#8212; including the
  Market, Gmail, and Maps &#8212; are closed-source and must be licensed with Google to be
  included on a phone.  This means that Cyanogen is not allowed to include these apps when
  he releases his amazing CyanogenMod firmware.  Other services that Google then builds on
  top of these closed applications are also closed by nature, including their proprietary
  &#8220;push&#8221; communication model.</p>
</li>
</ul>
<p>For some purists, this is a major problem, and I would generally agree.  But unlike Apple
and iOS devices, none of these Google-branded apps are &#8220;privileged&#8221; applications; they
don&#8217;t get special treatment from Android, and they don&#8217;t have access to anything that
&#8220;normal&#8221; applications can&#8217;t access through the SDK.</p>
<p>But more importantly, these apps are <em>not</em> Android, and they are not necessary to
delivering an Android phone or firmware.  Developers can write and release competing or
nearly indentical applications that replace these closed system apps, and indeed, there
are multiple competing &#8220;app stores&#8221; for Android, with Amazon rumored to be creating yet
another.  There are even better alternatives for Chrome to Phone already available.  And
if you insist on not using &#8212; or have a phone without &#8212; the Android Market, Android is
perfectly capable of &#8220;side-loading&#8221; software packages, and nobody needs to pay Google
for the rights to do so.</p>
<blockquote>
<p>What is all this proclaimed openness worth if it still boils down to exploiting
security systems if you want to run that system you just modified?</p>
</blockquote>
<p><em>That</em> is the real problem, and in my opinion the blame is firmly with the carriers; not
Google, and certainly not Android.  I specifically purchased a Nexus One because it supports
the ability to flash the phone with unsigned firmware.  I can download the Android source
code, compile it, and flash that resulting firmware to my phone, without needing to root,
exploit, or jailbreak my phone.  I could do that with my Openmoko Freerunner, and I can do
that with my Nexus One.</p>
<p>If enough people insisted on purchasing phones with this capability, then the carriers and
manufacturers would pay attention and deliver. Or perhaps Google should be standing up to
carriers and demanding that all Google-branded and licensed Android phones have this
capability.  But even if they could get away with that demand, they can&#8217;t enforce it on
all Android devices; the very definition of Free Software allows carriers and manufacturers
to take Android and do what they want with it if they don&#8217;t like Google&#8217;s terms.</p>
<p>Maybe the real lesson is that Free Software is a double-edged sword, and if you want
corporations to join in, you have to be willing to play their game too.</p>
<p><a href="http://noswap.com/blog/android-is-open">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/dvorak</id>
		<link href="http://noswap.com/blog/dvorak"/>
		<title>Dvorak</title>
		<updated>2010-07-31T12:00:00Z</updated>
		<published>2010-07-31T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>An overview of my long-term history with the Dvorak keyboard layout.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><em>(Originally posted by myself on <a href="http://news.ycombinator.com/item?id=1560933" title="Touch Typing on Dvorak?">Hacker News</a>)</em></p>
<p>I&#8217;ve been typing with the <a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard" title="Dvorak Simplified Keyboard">Dvorak layout</a> for about three years now. I personally can&#8217;t
fully touch type, and never have been able to, although these days I&#8217;m getting pretty close if
I stop thinking about it and just start typing.  My typing speed has slightly increased, but is
more or less limited by the speed at which I can think about what I&#8217;m trying to type.  The real
benefits are in the related experience.</p>
<p>I&#8217;ve noticed a dramatic reduction in wrist strain at the end of the day, mainly due to the
shorter movements for the majority of keystrokes, as well as the proper alternation between
hands. Both are hallmarks of the Dvorak layout&#8217;s primary design requirements.</p>
<p>Regarding impact on programming efforts, My biggest complaint is that the brackets are on the
number row instead of just above the home row, but when I&#8217;m writing Python code, I use them far
less, so it&#8217;s not much of an issue; when I&#8217;m writing PHP, C, or Java code though, it can get a
bit annoying, but it&#8217;s a good trade-off since the +/= and -/_ keys are now closer at hand.</p>
<p>For my editor, I&#8217;ve been using Vim for longer than I&#8217;ve been using Dvorak, but I&#8217;ve never used
the hjkl keys for normal movements; I bought keyboards that specifically have the arrow keys
right under the Enter key, so moving to use those is very simple, and allows me to use Vim
without having to remap any of the normal movement keys.</p>
<p>In all, I highly recommend the switch, especially for anyone who plans to do a lot of typing
in their daily routine. The benefits have far outweighed any of the drawbacks. And purchasing
a purpose-built Dvorak keyboard will be one of the best investments you can make. I personally
love and highly recommend the <a href="http://www.typematrix.com" title="TypeMatrix Keyboards">TypeMatrix keyboards</a>, not only for their great
layout, but because it has a physical toggle switch for moving between Qwerty and Dvorak layouts,
which is priceless when you want to be able to play games that aren&#8217;t friendly to non-Qwerty
layouts.</p>
<p>If you&#8217;d like an entertaining way to learn more about the Dvorak layout, <a href="http://www.dvzine.org/" title="The Dvorak Zine">DVZine</a> has
a very informative <a href="http://www.dvzine.org/zine/index.html">comic book</a> about the history and
benefits.</p>
<p><a href="http://noswap.com/blog/dvorak">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/php-bugs-me-or-where-type-coercion-causes-bugs</id>
		<link href="http://noswap.com/blog/php-bugs-me-or-where-type-coercion-causes-bugs"/>
		<title>PHP Bugs Me, or Where Type Coercion Causes Bugs</title>
		<updated>2010-03-02T12:00:00Z</updated>
		<published>2010-03-02T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>News flash: type coercion in PHP can cause unexpected and buggy behavior.  Gasp!</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I really like PHP as a technology, both for its extensibility and its deployment
style. I think it is the quickest and most straightforward platform to create
web applications with, and frameworks like <a href="http://codeigniter.com/">CodeIgniter</a>
make it even better.</p>
<p>I&#8217;ve long been on the fence regarding PHP&#8217;s type coercion and comparison issues,
but a <a href="http://www.mantisbt.org/bugs/view.php?id=11571">recent bug</a> in <a href="http://www.mantisbt.org">Mantis Bug Tracker</a> has made me
/facepalm for the first time in my long history of working with PHP:</p>
<blockquote>
<p>When I click on &#8220;Edit&#8221; next to 1.2, mantis shows me the 1.20 properties.
When I click 1.1 it shows me 1.10!</p>
</blockquote>
<p>The offending snippet of code:</p>
<pre><code>foreach( $g_cache_versions as $t_version ) {
   if ( ( $t_version['version'] == $p_version )
      &amp;&amp; ( $t_version['project_id'] == $c_project_id ) ) {
      return $t_version['id'];
   }
}
</code></pre>
<p>At first glance, it seems perfectly normal&#8230; and then you read the commit log,
emphasis mine:</p>
<blockquote>
<p>This is due to an incorrect version name comparison in version_get_id whereby
the following check between strings was occurring:</p>
<p><code>if( "1.1" == "1.10" ) { ... }</code></p>
<p>PHP evaluates this expression to true <em>because 1.1 and 1.10 are treated as
floats</em>. We however need to preserve the string type during this comparison,
thus we need to use the === comparison operator instead.</p>
</blockquote>
<p>I thought I&#8217;d seen it all&#8230;</p>
<p><a href="http://noswap.com/blog/php-bugs-me-or-where-type-coercion-causes-bugs">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/1000-commits</id>
		<link href="http://noswap.com/blog/1000-commits"/>
		<title>1000 Commits!</title>
		<updated>2009-12-03T12:00:00Z</updated>
		<published>2009-12-03T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>I've just reached the 1000 commit milestone as recorded by my Ohloh profile.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>I&#8217;ve just reached the 1000 commit milestone as recorded by <a href="http://www.ohloh.net/accounts/nuclear_eclipse">my Ohloh profile</a>.
By far, most of them are related to my work on the MantisBT project and
associated plugins.</p>
<p>Now if only I could find a job local to Cincinnati&#8230;  If you are interested
in hiring me, or know someone who&#8217;s looking for an open source developer, take
a look at <a href="http://johnmreese.com/resume">my resume</a>.</p>
<p><a href="http://noswap.com/blog/1000-commits">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/detailed-integration-of-subversion-in-mantisbt</id>
		<link href="http://noswap.com/blog/detailed-integration-of-subversion-in-mantisbt"/>
		<title>Detailed Integration of Subversion in MantisBT</title>
		<updated>2009-10-14T12:00:00Z</updated>
		<published>2009-10-14T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<summary>Chris Dornfeld at Unitz has an excellent, detailed overview of the options available when importing Subversion repositories into MantisBT using my Source Integration framework.</summary>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Chris Dornfeld at <a href="http://www.unitz.com/">Unitz</a> has an excellent, <a href="http://www.unitz.com/u-notez/2009/10/subversion-svn-integration-mantisbt/">detailed overview</a> of the
options available when importing Subversion repositories into MantisBT using
my Source Integration framework.  My <a href="http://leetcode.net/blog/2009/01/integrating-git-svn-with-mantisbt/">previous article</a> on the topic fails
to go into particulars with SVN repositories, mainly because many of the
options weren&#8217;t even dreamed of at the time, let alone implemented.</p>
<p>Anyways, the information and explanations presented in his article are pretty
accurate.  Until I can get the time to fully document the SVN and Git plugins,
or the framework as a whole, consider Chris&#8217;s post to be canonical information.</p>
<p>Cheers</p>
<p><a href="http://noswap.com/blog/detailed-integration-of-subversion-in-mantisbt">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/the-good-king-lisp</id>
		<link href="http://noswap.com/blog/the-good-king-lisp"/>
		<title>The Good King Lisp</title>
		<updated>2009-08-05T12:00:00Z</updated>
		<published>2009-08-05T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>From <a href="http://news.ycombinator.com/item?id=743144">HN</a>:</p>
<blockquote>
<p>The Good King Lisp raised his glass and toasted with the Knights of Lambda,
&#8220;To much recursion!&#8221;</p>
</blockquote>
<p><a href="http://noswap.com/blog/the-good-king-lisp">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/twenty-four</id>
		<link href="http://noswap.com/blog/twenty-four"/>
		<title>Twenty Four</title>
		<updated>2009-04-27T12:00:00Z</updated>
		<published>2009-04-27T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://www.explosm.net/comics/54/"><img alt="Happy birthday to me." src="//files.leetcode.net/comics/explosm/happybirthday.jpg" width="432" height="388" /></a></p>
<p>What&#8217;s twenty-four?</p>
<ul>
<li>Six by four</li>
<li>Eight by three</li>
<li>Twelve by two</li>
<li>Six past legal</li>
<li>Three past drinking</li>
<li>One before cheap insurance</li>
<li>Space Shuttle Discovery</li>
<li>SLR cameras</li>
</ul>

<p>Nifty.</p>
<p><a href="http://noswap.com/blog/twenty-four">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/mantisbt-source-integration-barcamp-presentation-slides</id>
		<link href="http://noswap.com/blog/mantisbt-source-integration-barcamp-presentation-slides"/>
		<title>MantisBT Source Integration - BarCamp Presentation Slides</title>
		<updated>2009-04-18T12:00:00Z</updated>
		<published>2009-04-18T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Since I&#8217;m about to present the topic, I&#8217;m making the presentation slides available for all.  There will indeed be video of the talk, which I will post as soon I can afterwards.</p>
<p>The slides are hosted directly on Google Docs: <a href="http://docs.google.com/Presentation?id=dffhxmhs_1273ct3kc8">http://docs.google.com/Presentation?id=dffhxmhs_1273ct3kc8</a></p>
<p><a href="http://noswap.com/blog/mantisbt-source-integration-barcamp-presentation-slides">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/barcamp-rochester</id>
		<link href="http://noswap.com/blog/barcamp-rochester"/>
		<title>BarCamp Rochester</title>
		<updated>2009-04-15T12:00:00Z</updated>
		<published>2009-04-15T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Context: <a href="http://www.barcamproc.org">BarCamp Rochester</a> &#8212; Anyone and everyone is invited to attend, and everyone is highly encouraged to present something of their own, no matter what it is.  It&#8217;s happening this weekend at RIT, where I&#8217;m studying (and graduating in about a month!) for Software Engineering.</p>
<p>I&#8217;ll be attending it to give a presentation on MantisBT and the Source Integration framework.  Specifically, I&#8217;ll be covering the myriad of new features that have made it into the project over the past week and a half.  I plan to walk through setting up a project in Mantis, creating a new repository on <a href="http://github.com">GitHub</a>, linking the Source Integration framework to that, and showing how the branch mapping and auto-resolving features work.  Should be interesting.</p>
<p>After the presentation, I plan to post the slides, along with my presentation notes, up here.  If anyone decides to video the talk, I&#8217;ll also make sure I can get a copy of that as well, but no promises.</p>
<p>Cheers!</p>
<p><a href="http://noswap.com/blog/barcamp-rochester">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/integrating-source-control-with-mantisbt</id>
		<link href="http://noswap.com/blog/integrating-source-control-with-mantisbt"/>
		<title>Integrating Source Control Tools with Mantis Bug Tracker</title>
		<updated>2009-03-22T12:00:00Z</updated>
		<published>2009-03-22T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><em>Update: The information in this post is unfortunately out of date.  While much of the code samples are similar, the new method of creating new plugins has changed in subtle, but very significant ways.  Until a new guide can be written, please refer to the existing plugins for code examples.</em></p>
<p>Considering that my last post on <a href="//leetcode.net/blog/2009/01/integrating-git-svn-with-mantisbt/">Integrating Git and SVN</a> has garnered a fair amount of attention, I thought that it would be useful to discuss my Source Integration framework in more detail.  Specifically, I&#8217;ll be covering topics such as the design and implementation of the framework and, more importantly, how developers can go about implementing support for other version control tools.</p>
<p>The point of this is to show that it&#8217;s quite possible to integrate just about any type of version control tool with the Source Integration system; indeed I planned from the beginning to create a generalized framework that would support many different types and paradigms for version control.  This should at least be evident in that I have already created extension plugins for Git and Subversion - it should be quite possible to extend the concepts further to Mercurial, Bazaar, CVS, or any other tool.</p>
<p>For the point of brevity, I&#8217;ll make the assumption that the developer at least has a fair understanding of PHP, their version control tool, and how events and plugins work in <a href="http://www.mantisbt.org">MantisBT</a>.  If you are not yet familiar with the plugin system, there is currently a basic introduction in the <a href="http://docs.mantisbt.org/master/en/developers/">MantisBT Developer&#8217;s Guide</a>, which I&#8217;ll hopefully be adding more information to in the near future.</p>
<p><a href="http://noswap.com/blog/integrating-source-control-with-mantisbt">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/classic-wit</id>
		<link href="http://noswap.com/blog/classic-wit"/>
		<title>Classic Wit</title>
		<updated>2009-02-27T12:00:00Z</updated>
		<published>2009-02-27T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="//leetcode.net/blog/files/2009/02/comicbatteriescamera.png"><img src="//leetcode.net/blog/files/2009/02/comicbatteriescamera-300x91.png" alt="This is how I like to answer these types of questions." width="300" height="91" class="size-medium wp-image-127" /></a></p>
<p>Thank you <a href="http://www.explosm.net">Explosm</a>, you&#8217;ve just made my day! :)</p>
<p><a href="http://noswap.com/blog/classic-wit">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/integrating-git-svn-with-mantisbt</id>
		<link href="http://noswap.com/blog/integrating-git-svn-with-mantisbt"/>
		<title>Integrating Git and SVN with the Mantis Bug Tracker</title>
		<updated>2009-01-07T12:00:00Z</updated>
		<published>2009-01-07T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>With the ongoing work towards a 1.2 release, the <a href="http://www.mantisbt.org">Mantis Bug Tracker</a> features a brand new plugin and event system, which will allow users to implement entirely new features for MantisBT without ever needing to touch any of the core codebase.  It&#8217;s a very extensible system, and allows plugin authors to implement only what they need, while still allowing advanced plugins as much flexibility as possible.  Plugins can be as small as a single file with 20 lines of code, or as large as entire hierarchies of files, pages, with their own API&#8217;s.</p>
<p>As the core developer of the new plugin system, I have been working on a variety of plugins. In particular, I have created a vastly improved method of integrating source control repositories within MantisBT.  The plugin package is named, aptly enough, Source Integration, and implements a generic framework that will allow integration with multiple repositories, each potentially using any source control systems available, simply by creating an extension plugin for each new tool.  Currently, I have implemented integration packages for both Git and Subversion, my two source control tools of choice.</p>
<p>The Source Integration package tracks repository information based on a series of changesets, each of which may have a list of affected files.  The data representation is generic enough to cover version control concepts used by all types of tools, from the ubiquitous CVS and Subversion, to modern distributed tools like Git and Hg.  However, the system takes the stance of implementing as few details as possible, so it relies on existing repository-viewing tools for tasks such as viewing commit diffs, file contents, tree browsing, etc.  Extension plugins handle translating tool-specific information, like history logs or checkin data, into the generalized data objects used by the framework.  Extensions also generate URL&#8217;s for viewing files and diffs, but everything else is handled automatically by the core framework.</p>
<p>The true benefit of the Source Integration package lies in the amount of repository integration that it implements within MantisBT.  When importing changesets from your repository, Source looks at the commit message of each changeset for references to bug numbers in your tracker, and sets up links in the database for any bugs mentioned.  When viewing bugs mentioned in commit messages, a new section is displayed after the bugnotes called &#8220;Related Changesets&#8221;, giving a list of linked changes, including information about the changeset, such as the branch, author, timestamp, and a list of changed files.</p>
<p><a href="http://noswap.com/blog/integrating-git-svn-with-mantisbt">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/merry-christmas</id>
		<link href="http://noswap.com/blog/merry-christmas"/>
		<title>Merry Christmas</title>
		<updated>2008-12-25T12:00:00Z</updated>
		<published>2008-12-25T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Merry Christmas everyone, happy holidays, and a happy New Year.  Cheers!</p>
<p><a href="http://noswap.com/blog/merry-christmas">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/on-the-inelegance-of-php</id>
		<link href="http://noswap.com/blog/on-the-inelegance-of-php"/>
		<title>On the Inelegance of PHP</title>
		<updated>2008-12-15T12:00:00Z</updated>
		<published>2008-12-15T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>As a well-seasoned PHP developer for <a href="http://www.mantisbt.org">MantisBT</a>
and other projects, but at the same time a seasoned developer in Python, C++, Lua,
etc, I found this interesting article on Hacker News,
<a href="http://phpadvent.org/2008/yet-by-marco-tabini"><em>Yet</em></a>, a short
piece on the &#8220;history&#8221; and development of PHP as a language.</p>
<p>A few choice quotes that I most enjoyed:</p>
<blockquote>
<p>I don&#8217;t know anyone who programs in PHP and hasn&#8217;t &#8230; become much more
acquainted with the concept of &#8220;haystack&#8221; and &#8220;needle&#8221; than any one person should have
to in a lifetime.</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>With time, an experienced developer learns that the only reason why any
particular functionality is not in PHP is that it&#8217;s not there &mdash; <em>yet</em>.</p>
</blockquote>
<p>&nbsp;</p>
<blockquote>
<p>Invariably, PHP developers who try to settle into a framework have the
(often irresistible) urge to simply drop it and write their own, because, you see,
there is no framework that does things the way he or she wants &mdash; <em>yet</em>.</p>
</blockquote>
<div class="center">&#8212;</div>

<p>I really like working on the PHP projects that I&#8217;m a part of, but every time I write a
Python script to do something, it just reminds me of how <em>unsophisticated</em> PHP
really is as a language.  Perhaps that&#8217;s OK;  it certainly hasn&#8217;t stopped me&#8230; <em>yet</em>.</p>
<p><a href="http://noswap.com/blog/on-the-inelegance-of-php">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/when-apple-stifles-innovation</id>
		<link href="http://noswap.com/blog/when-apple-stifles-innovation"/>
		<title>When Apple Stifles Innovation</title>
		<updated>2008-11-14T12:00:00Z</updated>
		<published>2008-11-14T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>John Gruber recently talked about
<a href="http://daringfireball.net/2008/11/flagging_messages_from_iphone_mail">how he deals with email on the iPhone</a>,
where Apple&#8217;s Mail tool lacks the ability to do something even as simple as
flag a message in the inbox.  He has go through a convoluted process of moving
email to a specially-named folder, and then running a bit of AppleScript on his
desktop that will take all the mail from the special folder, flag them, and move
them back to the desktop.  Good grief.</p>
<p>Why again does John need to go through this long, redirection process?  Why not
just use a different email client on the iPhone?  Because
<a href="http://daringfireball.net/2008/09/app_store_exclusion">Apple is anti-competitive</a>,
and <a href="http://daringfireball.net/2008/10/in_the_background">third party apps
can&#8217;t run in the background</a>, straight from John Gruber himself.</p>
<p>Isn&#8217;t this a bit absurd?  Why do people let Apple stifle competition like this?
Am I the only one that thinks this situation is far worse than anything presented
in the huge anti-trust cases against Microsoft in the past decade?  Apple is
<em>specifically denying</em> competition on the iPhone, and all the groupies
think that it&#8217;s perfectly acceptable, even good for the consumer!  But shame on
Microsoft for bundling Internet Exploder and a Media Player; how dare they allow
anyone to choose a different browser even!</p>
<p>People ask me why I purchased my Neo Freerunner instead of an iPhone.  Even
disregarding that I&#8217;d lose my choice of carrier, I don&#8217;t see why people are rushing
to a company that depends on anti-competitive practices to maintain the &#8216;best&#8217;
apps on the phone.  If Apple&#8217;s browser, mail reader, etc, don&#8217;t suit the customers&#8217;
needs (as is apparent from Gruber&#8217;s post), why are they trying to stop them choosing
a better option?  It&#8217;s not like Apple&#8217;s revenues depend on users choosing Safari
or Mail.app;  hell, wouldn&#8217;t they get even more revenues from the App Store if
people could buy a superior browser for even $1 a pop?</p>
<p>Sounds to me like Apple cares more about maintaining control than providing their
users with the best experience&#8230;.</p>
<p><a href="http://noswap.com/blog/when-apple-stifles-innovation">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/break-sites-now-to-make-sites-later</id>
		<link href="http://noswap.com/blog/break-sites-now-to-make-sites-later"/>
		<title>Break Sites Now to Make Sites Later</title>
		<updated>2008-10-09T12:00:00Z</updated>
		<published>2008-10-09T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://news.ycombinator.com/item?id=289438">On the topic of IE8</a>:
<blockquote cite="http://news.ycombinator.com/item?id=289438">How about rather than asking web designers, server owners and IT staff everywhere to add some hack tag to their code, you force IE8 into compatibility mode unless a designer specifically enables IE8 rendering on their page by adding said tag? That mediates the issue pretty easily.</blockquote></p>
<p>They [Microsoft] were originally planning to require a special tag to enable standards compliance in IE8, but there was a <a href="http://en.wikipedia.org/wiki/Internet_Explorer_8#The_2008_Doctype_Trigger_Controversy">gigantic backlash</a> from the web development and standards community.</p>
<p>Why? Because then we get nowhere; all the clueless web designers never find out about the special tag to make IE8 comply with internet standards, and continue making web pages for the broken IE rendering model for the next 10 years.</p>
<p>We need to make all those old websites break, because otherwise they&#8217;ll never comply with modern standards. We need to have standards based rendering be the default because then the designers that test against IE8 will be making sites that work better with other browsers.</p>
<p>By forcing developers to realize that their websites are non-compliant (either from angry users or specifically forcing quirks mode) and by defaulting to standards-based rendering, we make the web design future a much nicer place to be.</p>
<p><a href="http://noswap.com/blog/break-sites-now-to-make-sites-later">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/you-cant-judge-your-own-project</id>
		<link href="http://noswap.com/blog/you-cant-judge-your-own-project"/>
		<title>You Can't Judge Your Own Project</title>
		<updated>2008-10-07T12:00:00Z</updated>
		<published>2008-10-07T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://news.ycombinator.com/item?id=268447">On the launch</a> of the <a href="http://ticketstumbler.com">excellent Ticketstumbler site</a>:</p>
<p>I don&#8217;t think the creator of an interface can ever objectively measure the usability of the interface, no matter how much they use it; they don&#8217;t ever have to learn it, because they created it in the first place.</p>
<p>&#8230;</p>
<p>I&#8217;m not saying usability is not the core.  I&#8217;m saying that the creator of the interface is in no position to objective judge the usability because they have an innate knowledge of the system because they designed it and they know exactly how it functions and how it&#8217;s supposed to be used. If you want a real measure of usability, you have to get someone who understands the problem domain, but has never before seen your interface, and then objectively determine how easily they can figure out how to perform tasks and get things done. The fact that you, as the designer, already know exactly how the interface is built and operates precludes you from having an objective opinion of how easy the interface is to understand.</p>
<p>Similarly, a painting&#8217;s artist cannot objectively determine how beautiful/emotional/successful the work of art is, because he has an innate sense of what it is trying to convey to the viewers. Just because the artist sees the subtle details, nuances, allusions, etc, does not mean that other viewers will be able to glean the same information.</p>
<p>And to drive the nail home a third time, an engineer could not possibly be an objective judge of how easy a car is to operate (usability), because they already know where everything is and how it works. They need to have someone, without previous experience, sit in the seat to realize that putting the cigarette lighter and cup holders inside the center console is a bad idea and not at all intuitive&#8230;</p>
<p><a href="http://noswap.com/blog/you-cant-judge-your-own-project">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/why-do-we-like-indirect-governance</id>
		<link href="http://noswap.com/blog/why-do-we-like-indirect-governance"/>
		<title>Why Do We Like Indirect Governance?</title>
		<updated>2008-09-26T12:00:00Z</updated>
		<published>2008-09-26T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://news.ycombinator.com/item?id=279535">On local government corruption in New York</a>:
<blockquote cite="http://news.ycombinator.com/item?id=279535">Where there is money and people with power corruption is very likely.</p>
<p>What fascinates me, about America specifically, is how ingrained the representative democracy concept is. Direct democracy is this wild and crazy thing that absolutely and directly = Hitler.</p>
<p>There could be an interesting argument why Swiss style direct democracy would not work for a huge country like the US. But what about local government? What about little towns?</p>
<p>It&#8217;s fascinating that Americans from a very young age learn that the head of local government is the mayor. What would happen if a little town in nowhere decided to mimic Switzerland in governance and eliminates the middle men? Doom?</blockquote></p>
<p>As an American, I think the biggest reason that the majority of Americans embrace (worship?) representative democracy is because it frees them from feelings of responsibility in the outcome of the government, and means that much less effort they must contribute back to society. Why learn about all the issues and directly vote for what I want, when I could more easily just elect someone else to do all that hard stuff for me so I can spend more time on the sofa watching the drama of Hollywood retards unfold on high definition TV?</p>
<p>As an added benefit, when my elected representatives then vote the &#8220;wrong&#8221; way, I certainly can&#8217;t blame myself, because A) I&#8217;m only one of thousands, or millions, of votes, B) I voted for the other guy, or C) I didn&#8217;t vote at all / that&#8217;s why I don&#8217;t ever vote. It&#8217;s the exact same reason that companies pay barrels of money for IT support contracts; it&#8217;s less work, and when something goes wrong, the blame always shifts to someone else.</p>
<p>Solution: Nuke it from orbit; it&#8217;s the only way to be sure&#8230;</p>
<p><a href="http://noswap.com/blog/why-do-we-like-indirect-governance">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/your-freedom-is-a-choice</id>
		<link href="http://noswap.com/blog/your-freedom-is-a-choice"/>
		<title>Your Freedom is a Choice</title>
		<updated>2008-09-23T12:00:00Z</updated>
		<published>2008-09-23T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://news.ycombinator.com/item?id=312658">On the new G1 phone using Android</a>:
<blockquote>i need a google account to use gphone; i need itunes to use iphone; i have to buy apps from approved channels.</p>
<p>it favors the vendors apps; no thanks</p>
<p>wake me when i can buy a device that runs apps i choose, connects to the network i want. i realize this is a pipe dream. the wireless world is a world of shit</p>
<p>i might as well look for the smallest flash-based linux notebook possible that runs skype and just hold it up to my ear old-skule style like gordon gecko and that giant cell phone from wall street</blockquote>
I have an Openmoko Neo FreeRunner: it has GPS, accelerometers, WiFi G, high resolution 640x480px touch screen, Micro SD card slot, good quality speakers/headphone jack, and good battery life; it works with any GSM carrier; it can run just about any operating system compiled for its ARM CPU; you can run and compile programs on it in any language supported by GCC or an ARM-compiled interpreter; it can connect to the internet via GPRS, WiFi, or USB with a PC, to update it&#8217;s software, install software packages, accept/initiate SSH sessions; it allows software to run that uses any windowing toolkit, including Gtk, Qt, and E.</p>
<p><a href="http://files.leetcode.net/uploads/2008/09/cimg2923-modified.jpg"><img class="size-medium wp-image-64" src="http://files.leetcode.net/uploads/2008/09/cimg2923-modified-221x300.jpg" alt="Neo installed with ASU 2008.9 and custom theme." width="221" height="300" /></a></p>
<p>It costs $399 <a href="http://us.direct.openmoko.com">direct from Openmoko</a> and is available through <a href="http://openmoko.com/distributors.html">multiple worldwide resellers</a>.
<blockquote>I&#8217;m not a fan of Openmoko, but you make a good point. There ARE options for people who want them. The cell phone market is more open now than it ever has been in the past.</blockquote></p>
<p><a href="http://noswap.com/blog/your-freedom-is-a-choice">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/your-freedom-is-your-choice</id>
		<link href="http://noswap.com/blog/your-freedom-is-your-choice"/>
		<title>Your Freedom is Your Choice</title>
		<updated>2008-09-23T12:00:00Z</updated>
		<published>2008-09-23T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p><a href="http://news.ycombinator.com/item?id=312983">On the Openmoko</a>:
&#8230; by the fact that Openmoko is a tiny company, they don&#8217;t have the purchasing power that Apple has to get newer hardware components at an inexpensive price point, hence the older ARM CPU and TI Calypso GSM chipsets. It&#8217;s still plenty peppy enough and has enough RAM that I can run numerous applications at the same time without degrading performance of the entire system.</p>
<p>Certainly it&#8217;s not as polished as the iPhone, but for people who actually care about their freedoms, it&#8217;s fantastic. Even if for the simple reasons that I can flash my Neo at will, and that I have no limitations from the manufacturer as to what I can do with my phone, or how it can be used, it&#8217;s the best smartphone/PDA I have ever purchased or used.</p>
<blockquote>I find it interesting that you&#8217;re the most vocal supporter of the Openmoko on this site, and you still don&#8217;t use it as your only phone. Hopefully they will work out the kinks eventually, but it is not an option for most of us yet, not even those of us who care about software freedom.

If you NEED to have a backup phone, then it is still just an expensive toy.</blockquote>

<p>Correct. But that doesn&#8217;t mean that it&#8217;s any less important in the mobile ecosystem. It&#8217;s the only truly free phone in every sense of the word. You&#8217;re free to do anything with the phone, at any time, without the permission of phone manufacturers, or app store reviewers, or <a href="http://www.fuckingnda.com">fucking NDAs</a>.</p>
<p>The biggest problem with Openmoko is that nobody knows about them, and nobody realizes <em>why they matter</em>. Everybody sees the horrors going on between Apple, the App Store, and developers&#8217; applications being rejected for competing with Apple, and then they complain about it, but that&#8217;s just the way it is.</p>
<p>Yet that&#8217;s not how it should be, and if everyone could find out about Openmoko, and actually realize and know why their freedoms truly matter, and that Openmoko makes the most freedoms-loving phone on the planet, then I wouldn&#8217;t have anything more to talk about.</p>
<p>But we all know that even Openmoko&#8217;s unexpectedly high sales amounts for the FreeRunner is still only a drop in the ocean compared to even only the iPhone, and even less compared to the entire smartphone industry. And that&#8217;s why it matters to me and others to get the word out, to let people know that there really is another option, one that doesn&#8217;t squelch your freedoms, and that if freedom truly matters to you, then you do have a choice.</p>
<p><strong>Freedom is <em>Your</em> Choice.  I choose Freedom.</strong></p>
<p><a href="http://noswap.com/blog/your-freedom-is-your-choice">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/what-i-want-from-a-browser</id>
		<link href="http://noswap.com/blog/what-i-want-from-a-browser"/>
		<title>What I Want From a Browser</title>
		<updated>2008-09-23T12:00:00Z</updated>
		<published>2008-09-23T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>With all the recent talk of Google Chrome and all the other browser options, I find more and more that the love-to-hate Firefox 3.0 is still my best friend, and will not be replaced anytime soon.  However, the major annoyance I&#8217;ve noticed through all the options is that there is always some feature or set of features lacking from every single option, including Firefox, that can be found in the competition.</p>
<p>So for the public record, I&#8217;d like to list the set of features that I feel are most important to have in a browser, and how the array of competitors each handle themselves.  Just want to see <a href="#browser-summary">the results</a>?</p>
<ul>
    <li><strong>Bookmark Tagging</strong>: Saving bookmarks into endless hierarchies of folders is extremely tedious and inefficient; the ability to instead tag bookmarks with multiple words allows users much better context for later search and retrieval.  Using a third-party bookmark tagging site shouldn&#8217;t be necessary anymore;  tagging bookmarks gives such a high return on investment of time and effort that it should be a no-brainer to implement this in any and all browsers.

Mozilla was the first out of the gate with Firefox 3.0&#8217;s introduction of bookmark tagging, and as an avid user of the feature, coupled with the &#8220;Unsorted Bookmarks&#8221; option, it is extremely well implemented and dead simple to use.  Click the star in the location bar to mark the page, and click again to add tags, rename the bookmark, or file it into a real location; type the tag name into the location bar (Awesome Bar!), and look through the results for what you want.  As far as I know, none of the other major browsers have added, or plan to add, this functionality; ouch!  Google Chrome gets negative points for not even letting you browse or use your bookmarks: you can only search them.</li>

    <li><strong>Content Synchronization</strong>:  With more and more users connecting to the internet from multiple locations on a regular basis, the task of synchronizing user content is becoming ever more important.  Most importantly, bookmarks must be kept in sync, but things such as saved passwords, cookies, browsing history, and form fields are also up for grabs, and it all must be done securely.  Bookmarking websites have it so easy, but some browsers are really stepping it up lately.

Initially, Firefox was the only one with such a feature, in the form of much-loved Foxmarks plugin, which automatically syncs bookmarks to a remote server, and offers a page to use the bookmarks even from a browser without the plugin.  These days, Foxmarks has been much improved, and works with the bookmark tagging from Firefox 3.0, and now Mozilla has thrown their hat in the ring with the rather ambitious plugin project titled <a href="http://services.mozilla.org">Mozilla Weave</a>, which promises to sync just about everything you can imagine, but is still in beta development.  Opera also rounds out the list with their <a href="http://www.myopera.com">My Opera</a> service, which is rather similar to Foxmarks, except that it&#8217;s built directly into the core browsing experience; very nice touch.</li>

    <li><strong>Platform Integration</strong>: When I open my browser, it should look like it belongs on my desktop; it should share the same widgets, icons, color schemes, and fonts that I have configured for my environment.

Firefox is really good at this on Mac and Windows, but while the Linux integration still looks really good, it&#8217;s not perfect, and can stutter on some fancy Gtk+ themes.  Safari, Konqueror, and Epiphany fit perfectly, but only in their target desktops; Konqueror looks out of place on a Gnome desktop, and Opera looks horrid on Linux and doesn&#8217;t really look right on with Windows either.  Chrome doesn&#8217;t even try to fit in anywhere (why?).</li>

    <li><strong>Process Separation</strong>: When I have multiple windows or tabs open at the same time, JavaScript executing on one page should have no effect on operation of the browser interface, let alone on other web pages open in the browser.  It shouldn&#8217;t take one poorly-written AJAX site to prevent the user from using the browser, or from working in another tab.

So far, Chrome is the first and only browser, as far as I know, to implement this correctly.  The way that Google has managed to use a separate process for every single tab, complete with a &#8220;task manager&#8221; to control errant pages, is phenomenally well put together.  Opera comes in a distant second place, with better performance overall when compared to Firefox and friends, which will often block the user from interacting with any portion of the interface while executing JavaScript.</li>

    <li><strong>Standards Compliance</strong>: When I visit a page that complies with the various HTML, XML, and CSS specifications, it should be rendered the same as on any other browser.  As much as we all know that this will never be true, the harder we try for it, the better we make life for web developers, including me.

This is basically a problem for all browsers, but more of a problem for some than others.  We know all this already&#8230;</li>

    <li><strong>Advertisement Blocking</strong>: At a time when online advertising is the lifeblood of the internet (and spam e-mails), the ability to have your browser automagically hide ads from web pages is extremely user-friendly.  It doesn&#8217;t even need to be installed or turned on by default, but there must be <em>some way</em> to accomplish this task.

Firefox takes the cake here, with an absurdly wonderful and easy to use plugin, <a href="http://adblockplus.org">Adblock Plus</a>, which will automatically update itself with the latest list of ad sites on the internet, and allows the user to customize the list or add their own rules for blocking content.  Sadly, this is only available for Mozilla products.

However, ever time I mention this topic as a benefit for Firefox, I always get adamant Opera users claiming the wonders of Opera&#8217;s built-in content blocking options, but I just don&#8217;t see it as coming anywhere close to Adblock Plus;  it requires the user to manually download and edit a file in their Opera profile containing the list of blocked content, and there&#8217;s no method for automatically updating the list, and if the user wants to block something else, they have to edit that file by hand with no guidance.  This strikes me as an extremely unfriendly process, and is only a partial replacement for Adblock Plus.  Do note however, that a similar system of ad blocking is also available for Konqueror, but no such option is given to Chrome or Safari.</li>

</ul>

<p><a name="browser-summary"></a>
<h3>Summary to Make That List A Waste of Time</h3>
So here&#8217;s how I see today&#8217;s options of browsers, with their best and worst parts:
<ul>
    <li><strong>Mozilla Firefox</strong>: Extremely flexible and powerful with plugins, but a poor performer with many tabs.</li>
    <li><strong>Opera</strong>: Fast and nifty, includes the kitchen sink, poor platform integration, no bookmark tagging.</li>
    <li><strong>Konqueror</strong>: Platform integration done right, extensive protocol support, lacks content-oriented features.</li>
    <li><strong>Google Chrome</strong>: Extremely fast and robust with true process separation, lacks almost every standard browser feature.</li>
    <li><strong>Safari and Epiphany</strong>: Lightweight platform integration, lacking any advanced features.</li>
</ul></p>
<p>I&#8217;m actually not very happy with any of the browser options available; they all have disadvantages when compared to other browsers, and there is no clear leader, especially when you consider that every user has a different set of requirements.</p>
<p>However, Firefox still makes me cry the least while I&#8217;m using it, and, with its myriad of plugins, makes my time surfing the web so much more enjoyable, except for when JavaScript makes it sop responding of course.  Probably the best thing Mozilla could do to improve Firefox would be to implement process separation akin to Google Chrome, or at least prevent the UI from becoming unresponsive during heavy JavaScript execution.  If that would happen, I would be absolutely elated.</p>
<p>So the real questions now are:  Where does this leave us?  How far are we towards a better web?  Which browser will get us there the fastest?  What will eventually make all this goofy garbage obsolete?  When will I shut up and let you leave this page?</p>
<p><a href="http://noswap.com/blog/what-i-want-from-a-browser">&lambda;</a></p>
		]]></content>
	</entry>
	<entry>
		<id>http://noswap.com/blog/start-with-a-bang</id>
		<link href="http://noswap.com/blog/start-with-a-bang"/>
		<title>Start With a Bang</title>
		<updated>2008-09-08T12:00:00Z</updated>
		<published>2008-09-08T12:00:00Z</published>
		<author>
			<name>John Reese</name>
		</author>
		<content type="html" xml:base="http://noswap.com" xml:lang="en"><![CDATA[
<p>Now that I&#8217;m restarting my &#8220;blag&#8221;, I <em>gotta</em> have a bit of ripe content.  Ever-so-relevant: <a href="http://www.explosm.net">Explosm&#8217;s</a> cartoon, <a href="http://www.explosm.net/comics/new/">Cyanide and Happiness</a>, has pretty much summed up my frustrations with the <a href="http://pidgin.im">Pidgin IM client</a>:</p>
<p><a href="http://files.leetcode.net/uploads/2008/09/messengerpigeonnew.png"><img src="http://files.leetcode.net/uploads/2008/09/messengerpigeonnew-300x274.png" alt="A summation of my feelings for Pidgin and the Pidgin developers, the developers being the ones shooting crap in my eyes of course." width="300" height="274" class="size-medium wp-image-10" /></a></p>
<p>I wish the <a href="http://live.gnome.org/Empathy">Empathy project</a> would hurry up and mop the floor after the mess Pidgin made of its end-users&#8230;</p>
<p><a href="http://noswap.com/blog/start-with-a-bang">&lambda;</a></p>
		]]></content>
	</entry>
</feed>
