<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:georss="http://www.georss.org/georss"
    xmlns:atom="http://www.w3.org/2005/Atom">

    <channel>
        <title>Gavin Carr's Hackery</title>
        <link>http://www.openfusion.net/</link>
        <description>World disintermediation, one hack at a time</description>
        <managingEditor>gavin@openfusion.com.au (Gavin Carr)</managingEditor>
        <webMaster>gavin@openfusion.com.au (Gavin Carr)</webMaster>
        <copyright>Copyright 2007-2008 Gavin Carr</copyright>
        <pubDate>Thu, 29 May 2008 13:41:32 +1000</pubDate>
        <language>en-au</language>
        <generator>blosxom 2.0.2</generator>
        <atom:link href="http://www.openfusion.net/rss" rel="self" type="application/rss+xml" />
        <sy:updatePeriod>hourly</sy:updatePeriod>
        <sy:updateFrequency>1</sy:updateFrequency>
        <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>

        <item>
            <title>Banking for Geeks</title>
            <link>http://www.openfusion.net/web/banking_for_geeks</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/banking_for_geeks</guid>
            <pubDate>Thu, 29 May 2008 13:41:32 +1000</pubDate>
            <comments>http://www.openfusion.net/web/banking_for_geeks/trackback</comments>
            <category>banking</category>
            <category>web</category>
            <description>&lt;p&gt;Heard via &lt;a href="http://www.twitter.com/chieftech"&gt;@chieftech&lt;/a&gt; on twitter that the 
&lt;a href="http://www.onlinebankingreview.com.au/BankTechnology.php"&gt;Banking Technology 2008&lt;/a&gt; 
conference is on today. It's great to see the financial world engaging with
developments online and thinking about new technologies and the Web 2.0 space, but 
the agenda strikes me as somewhat weird, perhaps driven mainly by the vendors they 
could get willing to spruik their wares?&lt;/p&gt;

&lt;p&gt;How, for instance, can you have a "Banking Technology" conference and not have
at least one session on 'online banking'? Isn't this the place where your 
technology interfaces with your customers? Weird.&lt;/p&gt;

&lt;p&gt;My impression of the state of online banking in Australia is pretty 
underwhelming. As a geek who'd love to see some real technology innovation 
impact our online banking experiences, here are some wishlist items dedicated
to the participants of Banking Technology 2008. I'd love to see the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Multiple logins to an account e.g. a readonly account for downloading 
things, a bill-paying account that can make payments to existing vendors,
but not configure new ones, etc. This kind of differentiation would allow
automation (scripts/services) using 'safe' accounts, without having to 
put your master online banking details at risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API access to certain functions e.g. balance checking, transaction 
downloads, bill payment to existing vendors, internal transfers, etc.
Presumably dependent upon having multiple logins (previous), to help 
mitigate security issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tagging functionality - the ability to interactively tag transactions (e.g.
'utilities', 'groceries', 'leisure', etc.), and to get those tags included
in transaction reporting and/or downloading. Further, allow autotagging of
transactions via descriptions/type/other party details etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alert conditions - the ability to setup various kinds of alerts on 
various conditions, like low or negative balances, large withdrawals,
payroll deposit, etc. I'm not so much thinking of plugging into particular 
alert channels here (email, SMS, IM, etc), just the ability to set 'flags'
on conditions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RSS support - the ability to configure various kinds of RSS feeds of 
'interesting' data. Authenticated, of course. Examples: per-account
transaction feeds, an alert condition feed (low balance, transaction 
bouncing/reversal, etc.), bill payment feed, etc. Supplying RSS feeds
also means that such things can be plugged into other channels like email,
IM, twitter, SMS, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web-friendly interfaces - as Eric Schmidt of Google says, "Don't fight the
internet". In the online banking context, this means DON'T use technologies
that work against the goodness of the web (e.g. frames, graphic-heavy design, 
Flash, RIA silos, etc.), and DO focus on simplicity, functionality, mobile
clients, and web standards (HTML, CSS, REST, etc.). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web 2.0 goodness - on the nice-to-have front (and with the proviso that it
degrades nicely for non-javascript clients) it would be nice to see some
ajax goodness allowing more friendly and usable interfaces and faster 
response times.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other things I've missed? Are there banks out there already offering any of 
these?&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Simple dual upstream gateways in CentOS</title>
            <link>http://www.openfusion.net/linux/dual_upstream_gateways_in_centos</link>
            <guid isPermaLink="true">http://www.openfusion.net/linux/dual_upstream_gateways_in_centos</guid>
            <pubDate>Fri, 23 May 2008 10:34:50 +1000</pubDate>
            <comments>http://www.openfusion.net/linux/dual_upstream_gateways_in_centos/trackback</comments>
            <category>centos</category>
            <category>linux</category>
            <category>networking</category>
            <description>&lt;p&gt;Had to setup some simple policy-based routing on CentOS again recently, and had
forgotten the exact steps. So here's the simplest recipe for CentOS that seems 
to work. This assumes you have two upstream gateways (gw1 and gw2), and that 
your default route is gw1, so all you're trying to do is have packets that come 
in on gw2 go back out gw2.&lt;/p&gt;

&lt;p&gt;1) Define an extra routing table e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; cat /etc/sysconfig/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local tables
#
102     gw2
#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2) Add a default route via gw2 (here 172.16.2.254) to table gw2 on the 
appropriate interface (here &lt;code&gt;eth1&lt;/code&gt;) e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; cat /etc/sysconfig/network-scripts/route-eth1
default table gw2 via 172.16.2.254
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;3) Add an &lt;code&gt;ifup-local&lt;/code&gt; script to add a rule to use table gw2 for &lt;code&gt;eth1&lt;/code&gt; packets e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; cat /etc/sysconfig/network-scripts/ifup-local
#!/bin/bash
#
# Script to add/delete routing rules for gw2 devices
#

GW2_DEVICE=eth1
GW2_LOCAL_ADDR=172.16.2.1

if [ &amp;#036;(basename &amp;#036;0) = ifdown-local ]; then
  OP=del
else
  OP=add
fi

if [ "&amp;#036;1" = "&amp;#036;GW2_DEVICE" ]; then
  ip rule &amp;#036;OP from &amp;#036;GW2_LOCAL_ADDR table gw2
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;4) Use the &lt;code&gt;ifup-local&lt;/code&gt; script also as &lt;code&gt;ifdown-local&lt;/code&gt;, to remove that rule&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; cd /etc/sysconfig/network-scripts
&amp;#036; ln -s ifup-local ifdown-local
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;5) Restart networking, and you're done!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# service network restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For more, see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lartc.org/lartc.html"&gt;Linux Advanced Routing and Traffic Control HOWTO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.policyrouting.org/PolicyRoutingBook/ONLINE/TOC.html"&gt;Policy Routing With Linux Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #6</title>
            <link>http://www.openfusion.net/twitter/tweet00006</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00006</guid>
            <pubDate>Thu, 24 Apr 2008 21:15:01 +1000</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00006/trackback</comments>
            <category>html-email</category>
            <category>tweet</category>
            <description>&lt;p&gt;Today's second html-email-hall-of-shame entrant: NSW RTA - please people, how hard is multipart/alternative?.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #5</title>
            <link>http://www.openfusion.net/twitter/tweet00005</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00005</guid>
            <pubDate>Thu, 24 Apr 2008 14:50:02 +1000</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00005/trackback</comments>
            <category>tweet</category>
            <description>&lt;p&gt;I need an html-email-hall-of-shame for companies that send out html-only emails - today's prize goes to Vanguard Australia :-/.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Super Simple Public Location Broadcasting</title>
            <link>http://www.openfusion.net/web/super_simple_public_location_broadcasting</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/super_simple_public_location_broadcasting</guid>
            <pubDate>Mon, 21 Apr 2008 20:39:45 +1000</pubDate>
            <comments>http://www.openfusion.net/web/super_simple_public_location_broadcasting/trackback</comments>
            <category>fire eagle</category>
            <category>location</category>
            <category>microformats</category>
            <category>web</category>
            <description>&lt;p&gt;I've been thinking about Yahoo's new &lt;a href="http://www.fireeagle.com/"&gt;fire eagle&lt;/a&gt;
location-broking service over the last few days. I think it is a really 
exciting service - potentially a game changer - and has the potential to 
move publishing and using location data from a niche product to something 
really mainstream. Really good stuff.&lt;/p&gt;

&lt;p&gt;But as &lt;a href="http://www.openfusion.net/web/the_long_tail_of_location"&gt;I posted here&lt;/a&gt;, I also think fire 
eagle (at least as it's currently formulated) is probably only usable by
a relatively small section of the web - roughly the relatively 
sophisticated "web 2.0" sites who are comfortable with web services and api 
keys and protocols like OAuth.&lt;/p&gt;

&lt;p&gt;For the rest of the web - the long web 1.0 tail - the technical bar is
simply too high for fire eagle as it stands to be useful and usable.&lt;/p&gt;

&lt;p&gt;In addition, fire eagle as it currently stands is unicast, acting as a 
mediator between you some particular app acting as a producer or a consumer 
of your location data. But, at least on the consumer side, I want some kind 
of broadcast service, not just a per-app unicast one. I want to be able to 
say "here's my current location for consumption by anyone", and allow that 
to be effectively broadcast to anyone I'm interacting with. &lt;/p&gt;

&lt;p&gt;Clearly my granularity/privacy settings might be different for my public 
location, and I might want to be able to blacklist certain sites or parties 
if they prove to be abusers of my data, but for lots of uses a broadcast 
public location is exactly what I want.&lt;/p&gt;

&lt;p&gt;How might this work in the web context? Say I'm interacting with an 
e-commerce site, and if they some broad idea of my location (say, 
postcode, state, country) they could default shipping addresses for me, 
and show me shipping costs earlier in the transaction (subject to change,
of course, if I want to ship somewhere else). How can I communicate my 
public location data to this site?&lt;/p&gt;

&lt;p&gt;So here's a crazy super-simple proposal: use &lt;strong&gt;Microformat HTTP Request 
Headers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;HTTP Request Headers are the only way the browser can pass information 
to a website (unless you consider cookies a separate mechanism, and they
aren't really useful here because they're domain specific). The 
&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html"&gt;HTTP spec&lt;/a&gt;
even carries over the 
&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.22"&gt;&amp;quot;From&amp;quot;&lt;/a&gt; 
header from email, to allow browsers to communicate who the user is to 
the website, so there's some kind of precedent for using HTTP headers for 
user info.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://microformats.org/"&gt;Microformats&lt;/a&gt; are useful here because they're 
really simple, and they provide useful standardised vocabularies around 
addresses (&lt;a href="http://microformats.org/wiki/adr"&gt;adr&lt;/a&gt;) and geocoding 
(&lt;a href="http://microformats.org/wiki/geo"&gt;geo&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;So how about (for example) we define a couple of custom HTTP request 
headers for public location data, and use some kind of microformat-inspired 
serialisation (like e.g. key-value pairs) for the location data? For
instance:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;X-Adr-Current: locality=Sydney; region=NSW; postal-code=2000; country-name=Australia
X-Geo-Current: latitude=33.717718; longitude=151.117158
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For websites, the usage is then about as trivial as possible: check for 
the existence of the HTTP header, do some very simple parsing, and use 
the data to personalise the user experience in whatever ways are 
appropriate for the site.&lt;/p&gt;

&lt;p&gt;On the browser side we'd need some kind of simple fire eagle client that 
would pull location updates from fire eagle and then publish them via 
these HTTP headers. A firefox plugin would probably be a good proof of
concept.&lt;/p&gt;

&lt;p&gt;I think this is simple, interesting and useful, though it obviously 
requires websites to make use of it before it's of much value in the real
world. &lt;/p&gt;

&lt;p&gt;So is this crazy, or interesting?&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>The Long Tail of Location</title>
            <link>http://www.openfusion.net/web/the_long_tail_of_location</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/the_long_tail_of_location</guid>
            <pubDate>Tue, 15 Apr 2008 20:27:17 +1000</pubDate>
            <comments>http://www.openfusion.net/web/the_long_tail_of_location/trackback</comments>
            <category>fire eagle</category>
            <category>location</category>
            <category>web</category>
            <category>web2.0</category>
            <description>&lt;p&gt;Brady Forrest asked in a recent 
&lt;a href="http://radar.oreilly.com/archives/2008/04/get-early-access-to-fire-eagle.html"&gt;post&lt;/a&gt;
what kinds of applications people would most like to see working with Yahoo's 
new location-broking service &lt;a href="http://www.fireeagle.com/"&gt;Fire Eagle&lt;/a&gt; (currently
in private beta).&lt;/p&gt;

&lt;p&gt;It's clear that most of the shiny new web 2.0 sites and apps might be able to 
benefit from such personal location info:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;photo sites that can do automagic geotagging&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calendar apps that adapt to our current timezone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;search engines that can take proximity into account when weighting results&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;social networks that can show us people in town when we're somewhere new&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maps and mashups that start where you are, rather than with some static default&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;etc.&lt;/p&gt;

&lt;p&gt;And such sites and apps will no doubt be early adopters of fire eagle and
whatever other location brokers might bubble up in the next little while.&lt;/p&gt;

&lt;p&gt;Two things struck me with this list though. First, that's a lot of sites and
apps right there, and unless the friction of authorising new apps to have 
access to my location data is very low, the pain of micromanaging access is 
going to get old fast. Is there some kind of 'public' client level access in 
fire eagle that isn't going to require individual app approval?&lt;/p&gt;

&lt;p&gt;Second, I can't help thinking that this still leaves most of the web out in 
the cold. Think about all the non-ajax sites that you interact with doing 
relatively simple stuff that could still benefit from access to your public
location data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the shipping address forms you fill out at every e-commerce site you buy from&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;store locators and hours pages that ask for a postcode to help you (every time!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timetables that could start with nearby stations or routes or lines if they
knew where you were&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;intelligent defaults or entry points for sites doing everything from movie 
listings to real estate to classifieds&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the long tail of location: the 80% of the web that won't be using ajax
or comet or OAuth or web service APIs anytime soon. I'd really like my location 
data to be useful on this end of the web as well, and it's just not going to 
happen if it requires sites to register api keys and use OAuth and make web 
service api calls. The bar is just too high for lots of casual web developers, 
and an awful lot of the web is still custom php or asp scripts written by 
relative newbies (or maybe that's just here in Australia!). If it's not almost
trivially easy, it won't be used.&lt;/p&gt;

&lt;p&gt;So I'm interested in how we do location at this end of the web. What do we 
need on top of fire eagle or similar services to make our location data 
ubiquitous and immediately useful to relatively non-sophisticated websites?
How do we deal with the long tail?&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Notes on TheSchwartz</title>
            <link>http://www.openfusion.net/web/theschwartz</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/theschwartz</guid>
            <pubDate>Wed, 09 Apr 2008 20:39:34 +1000</pubDate>
            <comments>http://www.openfusion.net/web/theschwartz/trackback</comments>
            <category>perl</category>
            <category>web</category>
            <description>&lt;p&gt;I've been playing around with &lt;a href="http://www.sixapart.com/"&gt;SixApart's&lt;/a&gt; 
&lt;a href="http://code.sixapart.com/"&gt;TheSchwartz&lt;/a&gt; for the last few days. 
TheSchwartz is a lightweight reliable job queue, typically used for 
handling relatively high latency jobs that you don't want to try and 
handle from a web process e.g. for sending out emails, placing orders 
into some external system, etc. Basically interacting with anything 
which might be down or slow or which you don't really need right away.&lt;/p&gt;

&lt;p&gt;Actually, TheSchwartz is a job queue &lt;em&gt;library&lt;/em&gt; rather than a job queue 
system, so some assembly is required. Like most Danga/SixApart 
software, it's lightweight, performant, and well-designed, but also 
pretty light on documentation. If you're not comfortable reading the 
(perl) source, it might be a challenging environment to setup.&lt;/p&gt;

&lt;p&gt;Notes from the last few days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Don't use the version on CPAN, get the latest code from
&lt;a href="http://code.sixapart.com/svn/TheSchwartz/trunk"&gt;subversion&lt;/a&gt;
instead. At the moment the CPAN version is 1.04, but current
svn is at 1.07, and has some significant additional 
functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conceptually TheSchwartz is very simple - jobs with opaque
function names and arguments are inserted into a database
for workers with a particular 'ability'; workers periodically 
check the database for jobs matching the abilities they have, 
and grab and execute them. Jobs that succeed are marked 
completed and removed from the queue; jobs that fail are 
logged and left on the queue to be retried after some time 
period up to a configurable number of retries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TheSchwartz has two kinds of clients - those that submit
jobs, and workers that perform jobs. Both are considered
clients, which is confusing if you're thinking in terms of
client-server interaction. TheSchwartz considers both 
sides to be clients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are three main classes to deal with: &lt;code&gt;TheSchwartz&lt;/code&gt;,
which is the main client functionality class; 
&lt;code&gt;TheSchwartz::Job&lt;/code&gt;, which models the jobs that are submitted
to the job queue; and &lt;code&gt;TheSchwartz::Worker&lt;/code&gt;, which is a 
role-type class modelling a particular ability that a worker
is able to perform. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New worker abilities are defined by subclassing 
&lt;code&gt;TheSchwartz::Worker&lt;/code&gt; and defining your new functionality in 
a &lt;code&gt;work()&lt;/code&gt; method. &lt;code&gt;work()&lt;/code&gt; receives the job object from the
queue as its only argument and does its stuff, marking the
job as completed or failed after processing. A useful real
example worker is &lt;code&gt;TheSchwartz::Worker::SendEmail&lt;/code&gt; (also by 
Brad Fitzpatrick, and available on CPAN) for sending emails from 
TheSchwartz.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depending on your application, it may make sense for workers
to just have a single ability, or for them to have multiple 
abilities and service more than one type of job. In the latter
case, TheSchwartz tries to use unused abilities whenever it
can to avoid certain kinds of jobs getting starved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can also subclass &lt;code&gt;TheSchwartz&lt;/code&gt; itself to modify the standard
functionality, and I've found that useful where I've wanted more
visibility of what workers are doing that you get out of the box.
You don't appear at this point to be able to subclass 
&lt;code&gt;TheSchwartz::Job&lt;/code&gt; however - TheSchwartz always uses this as the
class when autovivifying jobs for workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are a bunch of other features I haven't played with yet, 
including job priorities, the ability to &lt;em&gt;coalesce&lt;/em&gt; jobs into 
groups to be processed together, and the ability to delay jobs 
until a certain time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've actually been using it to setup a job queue system for a cluster,
which is a slightly different application that it was intended for,
but so far it's been working really well. &lt;/p&gt;

&lt;p&gt;I'm still feeling like I'm still getting to grips with the breadth 
of things it could be used for though - more experimentation required.
I'd be interested in hearing of examples of what people are using it 
for as well.&lt;/p&gt;

&lt;p&gt;Recommended.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Finding Core Perl Modules</title>
            <link>http://www.openfusion.net/perl/core_modules</link>
            <guid isPermaLink="true">http://www.openfusion.net/perl/core_modules</guid>
            <pubDate>Thu, 27 Mar 2008 05:45:02 +1100</pubDate>
            <comments>http://www.openfusion.net/perl/core_modules/trackback</comments>
            <category>perl</category>
            <category>tips</category>
            <description>&lt;p&gt;I wasted 15 minutes the other day trying to remember how to do this,
so here it is for the future: to find out if and when a perl module
got added to the core, you want Richard Clamp's excellent 
&lt;a href="http://search.cpan.org/dist/Module-CoreList/"&gt;Module::CoreList&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recent versions have a 'corelist' frontend command, so I typically 
use that e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; corelist File::Basename
File::Basename  was first released with perl 5

&amp;#036; corelist warnings
warnings  was first released with perl 5.006

&amp;#036; corelist /^File::Spec/
File::Spec  was first released with perl 5.00405
File::Spec::Cygwin  was first released with perl 5.006002
File::Spec::Epoc  was first released with perl 5.006001
File::Spec::Functions  was first released with perl 5.00504
File::Spec::Mac  was first released with perl 5.00405
File::Spec::OS2  was first released with perl 5.00405
File::Spec::Unix  was first released with perl 5.00405
File::Spec::VMS  was first released with perl 5.00405
File::Spec::Win32  was first released with perl 5.00405

&amp;#036; corelist URI::Escape
URI::Escape  was not in CORE (or so I think)
&lt;/code&gt;&lt;/pre&gt;





            </description>
        </item>
        <item>
            <title>Blosxom4Nagios</title>
            <link>http://www.openfusion.net/blosxom/blosxom4nagios</link>
            <guid isPermaLink="true">http://www.openfusion.net/blosxom/blosxom4nagios</guid>
            <pubDate>Wed, 19 Mar 2008 11:20:25 +1100</pubDate>
            <comments>http://www.openfusion.net/blosxom/blosxom4nagios/trackback</comments>
            <category>blosxom</category>
            <category>nagios</category>
            <description>&lt;p&gt;A little whole ago at one of my client sites we decided that we wanted to
monitor the bulk of our &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt; notifications via RSS
rather than via email or jabber. The centralised river-of-news architecture 
of RSS is just a much better fit for high-volume notification flow than the 
individual silos and persistent messaging nature of email.&lt;/p&gt;

&lt;p&gt;There are a few nice RSS solutions out there for Nagios, including the 
following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S Sugar's &lt;a href="http://www.nagiosexchange.org/Notifications.35.0.html?&amp;amp;tx_netnagext_pi1%5Bp_view%5D=314"&gt;RSS Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steve Shipway's &lt;a href="http://www.nagiosexchange.org/Frontends.37.0.html?&amp;amp;tx_netnagext_pi1%5Bp_view%5D=564"&gt;Nagios RSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Altinity's &lt;a href="http://altinity.blogs.com/dotorg/2006/07/lessons_in_rss.html"&gt;RSS4NAGIOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We quite liked Altinity's RSS4NAGIOS because it was notifications (rather than
alerts) based, and because it was pretty easy to just drop in and use. The
only thing we didn't really like was that it was still relatively static - it
provides nice per-user feeds, but you can't carve those feeds up or drill down
to subsets of the data very easily. We wanted to be able to slice-and-dice 
things a bit more dynamically - be able to look at feeds for per-host, 
per-hostgroup, per-status, or date-filtered notifications, for example.&lt;/p&gt;

&lt;p&gt;I'm also a &lt;a href="http://blosxom.sourceforge.net/"&gt;blosxom&lt;/a&gt; developer, so I quickly 
realised that I could do everything I wanted pretty trivially using blosxom. 
All I needed was a script to capture and tag notifications as blosxom posts, 
and then I could have dynamic filtering, multi-dimensional tag-based feeds, 
etc., all pretty much for free.&lt;/p&gt;

&lt;p&gt;So a couple of afternoons later, Blosxom4Nagios was up and running. It's
basically a single-purpose blosxom install that you drop into a directory
somewhere (/var/log/nagios/blosxom, by default), hook into apache for 
display, hook into nagios to accept notifications, and away you go. &lt;/p&gt;

&lt;p&gt;Notifications are tagged by type (host/service), state (OK, WARNING, CRITICAL 
etc.), hostname, hostgroup, service name, service group, contact, and date, 
so you can filter notifications based on any of these, and produce feeds (both 
RSS2 and atom) on any of them as well e.g.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/nagiosadmin&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/hostgroup1/rss&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/myhost/atom&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/servicegroup2&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/randomservice&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/tags/CRITICAL/atom&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/2008/03/tags/nagiosadmin&lt;/li&gt;
&lt;li&gt;http://www.example.com/nagios/blosxom/2008/03/19/tags/myhost/rss&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;etc.&lt;/p&gt;

&lt;p&gt;Screenshots:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.openfusion.com.au/images/blosxom4nagios1.png"&gt;&lt;img src="http://www.openfusion.com.au/images/thumb/blosxom4nagios1.png"&gt;&lt;/a&gt; &lt;b&gt;Default View&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.openfusion.com.au/images/blosxom4nagios2.png"&gt;&lt;img src="http://www.openfusion.com.au/images/thumb/blosxom4nagios2.png"&gt;&lt;/a&gt; &lt;b&gt;Filtering by date&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.openfusion.com.au/images/blosxom4nagios3.png"&gt;&lt;img src="http://www.openfusion.com.au/images/thumb/blosxom4nagios3.png"&gt;&lt;/a&gt; &lt;b&gt;Filtering by host&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Blosxom4Nagios is available here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.openfusion.com.au/labs/dist/blosxom4nagios-0.2.3.tar.gz"&gt;http://www.openfusion.com.au/labs/dist/blosxom4nagios-0.2.3.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and is licensed under the same MIT Licence as blosxom itself.&lt;/p&gt;

&lt;p&gt;Comments and feedback welcome.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Comparing Directories</title>
            <link>http://www.openfusion.net/perl/comparing_directories</link>
            <guid isPermaLink="true">http://www.openfusion.net/perl/comparing_directories</guid>
            <pubDate>Mon, 17 Mar 2008 18:35:29 +1100</pubDate>
            <comments>http://www.openfusion.net/perl/comparing_directories/trackback</comments>
            <category>perl</category>
            <description>&lt;p&gt;Saw this post fly past in the twitter stream today: 
&lt;a href="http://linuxshellaccount.blogspot.com/2008/03/perl-directory-permissions-difference.html"&gt;http://linuxshellaccount.blogspot.com/2008/03/perl-directory-permissions-difference.html&lt;/a&gt;.
It's a script by Mike Golvach to do something like a &lt;code&gt;diff -r&lt;/code&gt;, but also 
showing differences in permissions and ownership, rather than just content.&lt;/p&gt;

&lt;p&gt;I've written a CPAN module to do stuff like this - 
&lt;a href="http://search.cpan.org/search?query=DirCompare"&gt;File::DirCompare&lt;/a&gt; - so 
thought I'd check how straightforward this would be using File::DirCompare: &lt;/p&gt;

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

use strict;
use File::Basename;
use File::DirCompare;
use File::Compare qw(compare);
use File::stat;

die "Usage: " . basename(&amp;#036;0) . " dir1 dir2\n" unless @ARGV == 2;

my (&amp;#036;dir1, &amp;#036;dir2) = @ARGV;

File::DirCompare-&amp;gt;compare(&amp;#036;dir1, &amp;#036;dir2, sub {
  my (&amp;#036;a, &amp;#036;b) = @_;
  if (! &amp;#036;b) {
    printf "Only in %s: %s\n", dirname(&amp;#036;a), basename(&amp;#036;a);
  } elsif (! &amp;#036;a) {
    printf "Only in %s: %s\n", dirname(&amp;#036;b), basename(&amp;#036;b);
  } else {
    my &amp;#036;stata = stat &amp;#036;a;
    my &amp;#036;statb = stat &amp;#036;b;

    # Return unless different
    return unless compare(&amp;#036;a, &amp;#036;b) != 0 || 
      &amp;#036;stata-&amp;gt;mode != &amp;#036;statb-&amp;gt;mode ||
      &amp;#036;stata-&amp;gt;uid  != &amp;#036;statb-&amp;gt;uid  ||   
      &amp;#036;stata-&amp;gt;gid  != &amp;#036;statb-&amp;gt;gid;

    # Report
    printf "%04o %s %s %s\t\t%04o %s %s %s\n", 
      &amp;#036;stata-&amp;gt;mode &amp;amp; 07777, basename(&amp;#036;a), 
        (getpwuid(&amp;#036;stata-&amp;gt;uid))[0], (getgrgid(&amp;#036;stata-&amp;gt;gid))[0],
      &amp;#036;statb-&amp;gt;mode &amp;amp; 07777, basename(&amp;#036;b), 
        (getpwuid(&amp;#036;statb-&amp;gt;uid))[0], (getgrgid(&amp;#036;statb-&amp;gt;gid))[0];
  }
}, { ignore_cmp =&amp;gt; 1 });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So this reports all entries that are different in content or permissions or 
ownership e.g. given a tree like this (slightly modified from Mike's 
example):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; ls -lR scripts1 scripts2
scripts1:
total 28
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script1
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script1.bak
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script2
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script2.bak
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script3
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script3.bak
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:49 script4
scripts2:
total 28
-rw-r--r-- 1 gavin users 0 Mar 17 16:41 script1
-rw-r--r-- 1 gavin users 0 Mar 17 16:41 script1.bak
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script2
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:41 script2.bak
-rwxr-xr-x 1 gavin gavin 0 Mar 17 16:41 script3*
-rwxr-xr-x 1 gavin gavin 0 Mar 17 16:41 script3.bak*
-rw-r--r-- 1 gavin gavin 0 Mar 17 16:49 script5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;it will give output like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#036; ./pdiff2 scripts1 scripts2
0644 script1 gavin gavin                0644 script1 gavin users
0644 script1.bak gavin gavin            0644 script1.bak gavin users
0644 script3 gavin gavin                0755 script3 gavin gavin
0644 script3.bak gavin gavin            0755 script3.bak gavin gavin
Only in scripts1: script4
Only in scripts2: script5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This obviously has dependencies that Mike's version doesn't have, but it 
comes out much shorter and clearer, I think. It also doesn't fork and parse 
an external &lt;code&gt;ls&lt;/code&gt;, so it should be more portable and less fragile. I should 
probably be caching the &lt;code&gt;getpwuid&lt;/code&gt; lookups too, but that would have made it 
5 lines longer. ;-)&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #4</title>
            <link>http://www.openfusion.net/twitter/tweet00004</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00004</guid>
            <pubDate>Tue, 11 Mar 2008 21:20:02 +1100</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00004/trackback</comments>
            <category>tweet</category>
            <category>web</category>
            <description>&lt;p&gt;Nice w3schools page on html latin-1 entities: &lt;a href="http://www.w3schools.com/tags/ref_entities.asp"&gt;http://www.w3schools.com/tags/ref_entities.asp&lt;/a&gt;.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Paying Bills</title>
            <link>http://www.openfusion.net/web/paying_bills</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/paying_bills</guid>
            <pubDate>Wed, 05 Mar 2008 08:45:10 +1100</pubDate>
            <comments>http://www.openfusion.net/web/paying_bills/trackback</comments>
            <category>billing</category>
            <category>web</category>
            <description>&lt;p&gt;Was thinking in the weekend about places where I waste time, areas of
inefficiency in my extremely well-ordered life (&lt;em&gt;cough splutter&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;One of the more obvious was bill handling. I receive paper bills during
the month from the likes of Energy Australia, Sydney Water, David Jones, 
our local council for rates, etc. These all go into a pending file in the
filing cabinet, in date order, and I then periodically check that file 
during the month and pay any bills that are coming due. If I get busy or
forgetful I may miss a due date and pay a bill late. If a bill gets lost
in the post I may not pay it at all. And the process is all dependent on 
me polling my billing file at some reasonable frequency.&lt;/p&gt;

&lt;p&gt;There are variants to this process too. Some of my friends do all their
bills once a month, and just queue the payments in their bank accounts
for future payment on or near the due date. That's a lower workload 
system than mine, but for some (mostly illogical) reason I find myself
not really trusting future-dated bill payments in the same way as 
immediate ones.&lt;/p&gt;

&lt;p&gt;There's also a free (for users) service available in Australia called 
&lt;a href="http://www.bpay.com.au/consumers/bpay_view/receivebills.aspx"&gt;BPay View&lt;/a&gt;
which allows you to receive your bills electronically directly into your 
internet banking account, and pay them from there. This is nice in that 
it removes the paper and data entry pieces of the problem, but it's 
still a pull model - I still have to remember to check the BPay View 
page periodically - and it's limited to vendors that have signed up for 
the program.&lt;/p&gt;

&lt;p&gt;As I see it, there are two main areas of friction in this process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;using a pull model i.e. the process all being dependent on me 
remembering to check my bill status periodically and pay those that 
are coming due. My mental world is quite cluttered enough without 
having to remember administrivia like bills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the automation friction around paper-based or PDF-based bills, 
and the consequent data entry requirements, the scope for user
errors, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BPay View mostly solves the second of these, but it's a solution that's
closely coupled with your Internet Banking provider. This has security
benefits, but it also limits you to your Internet Banking platform. For 
me, the first of these is a bigger issue, so I'd probably prefer a 
solution that was decoupled from my internet banking, and accept a few 
more issues with #2.&lt;/p&gt;

&lt;p&gt;So here's what I want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a billing service that receives bills from vendors on my behalf 
and enters them into its system. Ideally this is via email (or even
a web service) and an XML bill attachment; in the real world it
probably still involves paper bills and data entry for the short to
medium term.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a flexible notification system that pushes alerts to me when bills
are due based on per-vendor criteria I configure. This should 
include at least options like email, IM, SMS, twitter, etc. 
Notifications could be fire-once or fire-until-acknowledged, as the
user chooses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for bonus points, an easy method of transferring bills into my 
internet banking. The dumb solution is probably just a per-bill
view from which I can cut and paste fields; smarter solutions 
would be great, but are probably dependent on the internet 
banking side. Or maybe we do some kind of per-vendor pay online
magic, if it's possible to figure out the security side of not
storing credit card info. Hmmm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds pretty tractable. Anyone know anything like this?&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #3</title>
            <link>http://www.openfusion.net/twitter/tweet00003</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00003</guid>
            <pubDate>Tue, 04 Mar 2008 17:15:50 +1100</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00003/trackback</comments>
            <category>tweet</category>
            <description>&lt;p&gt;Nice recent blog summary of free chart/graph solutions: &lt;a href="http://tutorialblog.org/free-chart-and-graph-solutions/"&gt;http://tutorialblog.org/free-chart-and-graph-solutions/&lt;/a&gt;.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #2</title>
            <link>http://www.openfusion.net/twitter/tweet00002</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00002</guid>
            <pubDate>Mon, 03 Mar 2008 16:30:19 +1100</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00002/trackback</comments>
            <category>tweet</category>
            <description>&lt;p&gt;Twitter2blosxom script seems to be working nicely - one more test before bed.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Random Tweet #1</title>
            <link>http://www.openfusion.net/twitter/tweet00001</link>
            <guid isPermaLink="true">http://www.openfusion.net/twitter/tweet00001</guid>
            <pubDate>Mon, 03 Mar 2008 15:30:19 +1100</pubDate>
            <comments>http://www.openfusion.net/twitter/tweet00001/trackback</comments>
            <category>blosxom</category>
            <category>tweet</category>
            <category>twitter</category>
            <description>&lt;p&gt;Testing twitter to blosxom script.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Finding/Delete Broken Symlinks</title>
            <link>http://www.openfusion.net/tips/broken_links</link>
            <guid isPermaLink="true">http://www.openfusion.net/tips/broken_links</guid>
            <pubDate>Mon, 03 Mar 2008 10:05:08 +1100</pubDate>
            <comments>http://www.openfusion.net/tips/broken_links/trackback</comments>
            <category>linux</category>
            <category>tips</category>
            <description>&lt;p&gt;Find goodness (with a recent-ish find for the '-delete'):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;find -L . -type l
find -L . -type l -delete
&lt;/code&gt;&lt;/pre&gt;





            </description>
        </item>
        <item>
            <title>The New Car Stereo</title>
            <link>http://www.openfusion.net/general/car_stereo</link>
            <guid isPermaLink="true">http://www.openfusion.net/general/car_stereo</guid>
            <pubDate>Sun, 10 Feb 2008 21:39:43 +1100</pubDate>
            <comments>http://www.openfusion.net/general/car_stereo/trackback</comments>
            <category>hardware</category>
            <category>mp3</category>
            <category>ogg vorbis</category>
            <description>&lt;p&gt;Bought a new car stereo a few weeks ago to replace the broken 
CD-stacker that came with our Ford Fairmont. &lt;/p&gt;

&lt;p&gt;In researching the options it seemed that the mainstream 
choices these days were for stereos with auxiliary-in jacks
at the front, so you could plug your music player in, and/or
units that would play mp3s. Turns out that latter option
means they will play mp3s that you've burned onto CDs, not
off something super-high-tech like a memory stick. Hmmm.&lt;/p&gt;

&lt;p&gt;Well, that's not quite true. Newer units are starting to 
appear with USB slots that will play music off a USB memory
stick, so there are actually starting to be some useful
options available. I didn't see any that took anything like
compact flash or SD cards however.&lt;/p&gt;

&lt;p&gt;They also don't seem to know anything much about codecs 
except MP3, WMA, WAV, and some AAC. Being the open source 
geek that I am, I was keen to get something that supported 
&lt;a href="http://en.wikipedia.org/wiki/Ogg_vorbis"&gt;ogg vorbis&lt;/a&gt;, but I 
could not find &lt;em&gt;any&lt;/em&gt; information (including with my google-fu) 
on models that might support this. I did find one guy, however, 
who'd burnt a bunch of tracks in different formats to a CD 
and then just gone down and tried out all the units at his 
local hi-fi store. That sounded like a plan!&lt;/p&gt;

&lt;p&gt;So I ended up testing a bunch of units at my local JB Hi-Fi
and Strathfield stores, and the good news is that about half 
of them actually played ogg vorbis just fine. I guess they're
just using stock sound decoder chips, which these support a
whole bunch of codecs out of the box. Sure would be nice if
they could manage to advertise the codecs they actually 
support though.&lt;/p&gt;

&lt;p&gt;We ended up going with a 
&lt;a href="http://www.kenwoodaudio.com/Australia/prodDetails.asp?Cat=Car%20Entertainment&amp;amp;SubCat=Head%20Unit&amp;amp;Model=KDC-MP4036U"&gt;Kenwood KDC-MP4036U&lt;/a&gt;, 
which advertises support for "MP3/WMA/AAC Files", but 
plays at least ogg vorbis just fine as well. It's supposedly
AU$429 RRP, but we picked it up for $180 at the big 
post-Christmas sale at 
&lt;a href="http://www.strathfield.com.au/Products.asp?CatID=183"&gt;Strathfield&lt;/a&gt;, 
so clearly it pays to shop around.&lt;/p&gt;

&lt;p&gt;So far it's working really nicely - I've got most of the
girls' music and stories on a 4GB USB stick and get them to
drive the music selection from the back using the remote
control. Way more music than 6-CDs ever gave us, and 
without the hassle of a separate music player or ipod. &lt;/p&gt;

&lt;p&gt;All is good in the car again!&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>JAWS Music Service</title>
            <link>http://www.openfusion.net/general/jaws_music</link>
            <guid isPermaLink="true">http://www.openfusion.net/general/jaws_music</guid>
            <pubDate>Wed, 23 Jan 2008 14:56:21 +1100</pubDate>
            <comments>http://www.openfusion.net/general/jaws_music/trackback</comments>
            <category>amazon</category>
            <category>bookmarks</category>
            <category>cover art</category>
            <category>music</category>
            <category>web service</category>
            <description>&lt;p&gt;Very cool. Was just looking for a way of finding cover art for my 
ripped music collection, and came across this site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jaws.jiboneus.com/music/"&gt;http://jaws.jiboneus.com/music/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is part of the Jiboneus Amazon Web Services project, and lets
you search for cover art and album details on Amazon via their web
services interface. More kudos to Amazon for providing an open
ecosystem for this kind of stuff to grow.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Site-Specific User Stylesheets</title>
            <link>http://www.openfusion.net/web/site_specific_user_stylesheets</link>
            <guid isPermaLink="true">http://www.openfusion.net/web/site_specific_user_stylesheets</guid>
            <pubDate>Wed, 16 Jan 2008 14:38:32 +1100</pubDate>
            <comments>http://www.openfusion.net/web/site_specific_user_stylesheets/trackback</comments>
            <category>css</category>
            <category>user css</category>
            <category>user styles</category>
            <description>&lt;p&gt;I've been messing with user stylesheets the last couple of days, almost
getting what I want, but not quite.&lt;/p&gt;

&lt;p&gt;I'm a happy little firefox user, but the stock firefox functionality in 
this area really isn't that useful. My gripes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;first, firefox/mozilla seems to only support a single global user 
stylesheet, which gets huge and unwieldy awfully fast. Opera does 
this much better than firefox, I hear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;because of this, to apply styles to a particular site you have to use 
a magic &lt;code&gt;@-moz-document domain&lt;/code&gt; style modifier, and this doesn't 
seem to play nicely with &lt;code&gt;@media&lt;/code&gt; modifiers, so afaict there doesn't seem
to be a way of specifying print styles for a particular site, say.
If I'm wrong about this, I'd be happy to hear about it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user stylesheets are local files, which means they don't follow me around 
across the different machines I use, and I don't get any 
network effects from the work of others, as is available using a 
'cloud' solution like &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;greasemonkey&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(more minor) I know it's to spec, but having to specify &lt;code&gt;!important&lt;/code&gt;
everywhere to force user styles to stick gets old fast&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As usual with firefox, there's an extension/add-on that does the job
better though. The &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2108"&gt;Stylish&lt;/a&gt;
extension - "Stylish is to CSS what Greasemonkey is to JavaScript" - does
a pretty nice job of addressing (1) and some of (3) above (the network
effects part), allowing you to import and manage multiple per-site
stylesheets pretty nicely. &lt;/p&gt;

&lt;p&gt;My other quibbles remain, though. In particular, there doesn't seem to be
a nice way of setting up media-specific per-site styles, which is a must-have,
I think. I'd also really love a solution that would follow me across browsers, 
especially given the number of sites you might want to tweak is typically much 
larger than the number of extensions you typically have installed.&lt;/p&gt;

&lt;p&gt;Hmmmm.&lt;/p&gt;





            </description>
        </item>
        <item>
            <title>Command-line XMPP Client</title>
            <link>http://www.openfusion.net/net/clix</link>
            <guid isPermaLink="true">http://www.openfusion.net/net/clix</guid>
            <pubDate>Thu, 10 Jan 2008 12:57:35 +1100</pubDate>
            <comments>http://www.openfusion.net/net/clix/trackback</comments>
            <category>jabber</category>
            <category>twitter</category>
            <category>xmpp</category>
            <description>&lt;p&gt;From the quick-hack-department: I'm online for most of the day, 
and almost always have one or two instant messaging (IM) clients
open - most often &lt;a href="http://www.pidgin.im/"&gt;pidgin/gaim&lt;/a&gt; and 
&lt;a href="http://www.gajim.org/"&gt;gajim&lt;/a&gt; lately. I also use IM to &lt;a href="http://twitter.com/gavincarr"&gt;follow 
twitter and to tweet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now graphical clients are very nice for lots of uses, but one thing 
they're often not good at is packing info into less space. 
Depending on how many people you're following, twitter in particular
can get noisy fast, and I found myself really wanting a command-line
xmpp client that I could just leave open in a term out of the way
and use as a river-of-news style xmpp stream. Even read-only would 
be fine, since I could always pull up my graphical client to tweet
(and I'm a 
&lt;a href="http://blog.whatfettle.com/2008/01/05/are-you-a-twitter-twit-or-a-twerp/"&gt;twit, not a twerp&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Google turned up a few candidates, but nothing really had my use
case in mind. So a couple of hours later, the first version of 
&lt;code&gt;clix&lt;/code&gt; was born. It's a quick perl script using 
&lt;a href="http://search.cpan.org/~elmex/Net-XMPP2-0.10/lib/Net/XMPP2.pm"&gt;Net::XMPP2&lt;/a&gt;,
and is available here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.openfusion.com.au/labs/dist/clix"&gt;http://www.openfusion.com.au/labs/dist/clix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.openfusion.com.au/labs/dist/clix-0.001004.tar.gz"&gt;http://www.openfusion.com.au/labs/dist/clix-0.001004.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.openfusion.com.au/mrepo/centos5-i386/RPMS.of/clix-0.001004-1.of.noarch.rpm"&gt;http://www.openfusion.com.au/mrepo/centos5-i386/RPMS.of/clix-0.001004-1.of.noarch.rpm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It aggregates XMPP posts from any number of accounts into a single 
river-of-news style view, and is (currently at least) read-only 
i.e. there's no post capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; updated to version 0.001004 with Yoshizumi's fix from
comments.&lt;/p&gt;





            </description>
        </item>
    </channel>
</rss>