<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7317892351838188771</id><updated>2011-04-21T11:46:10.913-07:00</updated><title type='text'>cratuki.blogspot.com</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-9017741909718804975</id><published>2008-10-14T12:01:00.000-07:00</published><updated>2008-10-14T12:05:12.445-07:00</updated><title type='text'>Response to Kelly, "Recession we don't have to have"</title><content type='html'>"Recession we don't have to have"&lt;br /&gt;http://www.theaustralian.news.com.au/story/0,25197,24497984-12250,00.html&lt;br /&gt;&lt;br /&gt;It is comic that the Australian government has our bubble housing sector [1] as a place in which to focus yet more capital. This was a sector that the US propped up in 2001, with the subprime disaster being the result. The US should instead have allowed a natural correction, as should we now.&lt;br /&gt;&lt;br /&gt;People need a natural balance of risk and reward to act rationally. As a result, economies have natural cycles where people who have overextended themselves are brought back to reality. The notion that the government can change this is delusional. All governments can do is to delay the pain. In the meantime, interventionist governments reduce the incentive to genuinely create wealth and savings with taxes and inflation. This hurts us right now.&lt;br /&gt;&lt;br /&gt;From the way you write, anyone would think the government itself created value and was doing us a favour for finding new excuses to redistribute our money. They are merely defering the pain to future taxpayers. That situation is particularly tragic in the case of the United States. The astronomical debts that the current generation of Americans have taken on makes their children slaves to the nation that their ancestors founded in the name of freedom.&lt;br /&gt;&lt;br /&gt;[1] http://news.google.com/news/url?sa=t&amp;ct=us/0-0&amp;fp=48f4042833fecfcd&amp;ei=7uz0SLD0C5mWQ46a5JMN&amp;url=http%3A//www.abc.net.au/news/stories/2008/10/14/2390735.htm&amp;cid=1257693335&amp;usg=AFQjCNHp78sI4lpUT2TWtzGlWR1YtktvJw&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-9017741909718804975?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/9017741909718804975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/9017741909718804975'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/10/response-to-kelly-recession-we-dont.html' title='Response to Kelly, &quot;Recession we don&apos;t have to have&quot;'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-3116594040360878882</id><published>2008-08-13T00:23:00.000-07:00</published><updated>2008-08-13T01:12:09.255-07:00</updated><title type='text'>Error - printing</title><content type='html'>When printers break you get a throwback to the dark ages of computing where nothing gave useful error reports and apparently simple things sit there and hang for minutes at a time. I'm waiting on a printer to delete at the moment. "Deleting", it says.&lt;br /&gt;&lt;br /&gt;Has anyone ever seen a printer with a command prompt that you can be accessed via telnet?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-3116594040360878882?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/3116594040360878882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/3116594040360878882'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/08/error-printing.html' title='Error - printing'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-4296386728030094921</id><published>2008-07-10T11:14:00.000-07:00</published><updated>2008-07-10T11:15:59.305-07:00</updated><title type='text'>Steamdoc</title><content type='html'>Still pining for my long-lost &lt;a href="http://www.synect.com"&gt;Synect&lt;/a&gt; publishing system, I've recently knocked together a quick engine I can use in its place. It's called steamdoc, it's nowhere near finished, but it is usable. See the notes at &lt;a href="http://www.songseed.org"&gt;songseed.org&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-4296386728030094921?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/4296386728030094921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/4296386728030094921'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/07/steamdoc.html' title='Steamdoc'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-7007370338957168092</id><published>2008-06-05T10:37:00.000-07:00</published><updated>2008-08-22T15:49:12.042-07:00</updated><title type='text'>Python scoping</title><content type='html'>I love python, but am annoyed by some of the quirks of its scoping. These are the sorts of situation that set me back to work on my project to implement a scheme notation for the python vm. That seems a bit extreme though because with these issues aside I'm quite happy with python as it is and figure that there's not a whole lot of distinction between using parens to structure a tree and whitespace. I even saw a proposal from someone to implement support for whitespace structuring to arclanguage.&lt;br /&gt;&lt;br /&gt;Suggestions for my problems are most welcome.&lt;br /&gt;&lt;br /&gt;1. Can't directly bind functions to anything but the current scope.&lt;br /&gt;&lt;br /&gt;In python there are three ways to declare a function that I know of and one of them (eval) is sufficiently disgusting to be off the table. The two sane mechanisms are (1) the 'def' syntax which causes a function to be injected into the current scope and (2) the 'lambda' syntax which can't exist over multiple lines, which must return, and where the only way to get side-effects (like output) is via impractical hacks.&lt;br /&gt;&lt;br /&gt;Here's something I do quite often:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def process_user_input(cmd):&lt;br /&gt;    d_cmd = {}&lt;br /&gt;&lt;br /&gt;    def cmd_load():&lt;br /&gt;        print 'stub for load functionality'&lt;br /&gt;    d_cmd['load'] =  cmd_load&lt;br /&gt;&lt;br /&gt;    def cmd_save():&lt;br /&gt;        print 'stub for save functionality'&lt;br /&gt;    d_cmd['save'] =  cmd_save&lt;br /&gt;&lt;br /&gt;    def cmd_quit():&lt;br /&gt;        sys.exit(0)&lt;br /&gt;    d_cmd['quit'] =  cmd_quit&lt;br /&gt;&lt;br /&gt;    if cmd not in d_cmd.keys():&lt;br /&gt;        print "Command '%s' is unknown."%cmd&lt;br /&gt;    else:&lt;br /&gt;        d_cmd[cmd]()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That is much nicer than having to declare each function and then have a laborious 'if' statement for each case as well. But this could be much better. Imagine this instead:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def process_user_input(cmd):&lt;br /&gt;    d_cmd = {}&lt;br /&gt;&lt;br /&gt;    d_cmd['load'] = fn(): # 'fn' is a fictional keyword for demonstration&lt;br /&gt;        print 'stub for load functionality'&lt;br /&gt;    d_cmd['save'] = fn():&lt;br /&gt;        print 'stub for save functionality'&lt;br /&gt;    d_cmd['quit'] = fn():&lt;br /&gt;        print ".. guys ... home .."&lt;br /&gt;        sys.exit(0)&lt;br /&gt;&lt;br /&gt;    if cmd not in d_cmd.keys():&lt;br /&gt;        print "Command '%s' is unknown."%cmd&lt;br /&gt;    else:&lt;br /&gt;        d_cmd[cmd]()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's far less room for copy and paste errors in this. But it's not supported. It's possible you could inspect the scope of process_user_input to find out if the function is available there. But that's a lot less pleasant than what I'm writing above. I frequently wonder why it is that the python team prefer to have programmers do either laborious 'if/else' clauses or else&lt;br /&gt;duplicate strings as I've done above (think a copy / paste error in the first example where you were duplicating a function).&lt;br /&gt;&lt;br /&gt;Perhaps an decorator mechanism could allow the functionality to be improved. But that would still be inferior to the 'fn' keyword I mention above. Adds an extra line and requires the annotation to be declared somewhere. Further, I for one find annotations much more complicated to understand than the idea of a function being directly inserted into a dictionary.&lt;br /&gt;&lt;br /&gt;Ooh :) Decorators are definitely not bad. Thanks to #python and quotemstr in particular for this snippet:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def dict_add(d, key):&lt;br /&gt;    def _deco(func):&lt;br /&gt;        d[key] = func&lt;br /&gt;    return _deco&lt;br /&gt;&lt;br /&gt;test_dict = {}&lt;br /&gt;&lt;br /&gt;@dict_add(test_dict, 'a')&lt;br /&gt;def _():&lt;br /&gt;    return 'sup'&lt;br /&gt;&lt;br /&gt;print test_dict['a']()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Rebinding variables&lt;br /&gt;&lt;br /&gt;While I was writing about a different scope problem I thought I'd write this.&lt;br /&gt;&lt;br /&gt;It's not possible to rebind a variable that's held in an enclosing scope, with the exception of its treatment of the global scope. This is stupid, because it just acknowledges that what I'm trying to do is legitimate but provides a disgusting mechanism for achieving it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def reformatter(debug=False):&lt;br /&gt;    x = 0&lt;br /&gt;    def inc():&lt;br /&gt;        if (debug):&lt;br /&gt;            print "x is being incremented"&lt;br /&gt;        x = x+1&lt;br /&gt;    def dec():&lt;br /&gt;        if (debug):&lt;br /&gt;            print "x is being decremented"&lt;br /&gt;        x = x+1&lt;br /&gt;    # ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This would work:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def reformatter(debug=False):&lt;br /&gt;    x = [0]&lt;br /&gt;    def inc():&lt;br /&gt;        if (debug):&lt;br /&gt;            print "x is being incremented"&lt;br /&gt;        x[0] = x[0]+1&lt;br /&gt;    def dec():&lt;br /&gt;        if (debug):&lt;br /&gt;            print "x is being decremented"&lt;br /&gt;        x[0] = x[0]+1&lt;br /&gt;    # ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So that's naturally what I end up doing when in this situation. Devteam are doing something about this in python 3k. But not in way that gets rid of global variables as I'd choose.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Classes - something python gets right&lt;br /&gt;&lt;br /&gt;The annoyances I've listed also get to me in java. But python's handling of&lt;br /&gt;classes pleases me.&lt;br /&gt;&lt;br /&gt;I've found this very useful in writing ORM tools.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def entity_person():&lt;br /&gt;    class Cl(entity):&lt;br /&gt;        def __init__(self):&lt;br /&gt;            pass&lt;br /&gt;    return Cl()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Still, I think there's a lot to be said for the approach used by languages like io and javascript where there's no distinction between objects and classes, and where you can thus easily modify the functionality of a class at a later date. Io is particularly sexy in that it has methods to allow you to dynamically retrieve the syntax trees of its functions, and redesign them on the fly if you like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-7007370338957168092?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/7007370338957168092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=7007370338957168092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/7007370338957168092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/7007370338957168092'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/06/namespaces-in-python.html' title='Python scoping'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-4618487380508435100</id><published>2008-05-05T11:27:00.000-07:00</published><updated>2008-05-05T12:22:03.226-07:00</updated><title type='text'>Process for programming</title><content type='html'>&lt;a href="http://paulspontifications.blogspot.com/2008/05/under-appreciated-fact-we-dont-know-how.html"&gt;"An Under-Appreciated Fact: We Don't Know How We Program" (link)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is very interesting. I'm going to comment on some of his points, and then discuss my process.&lt;br /&gt;&lt;br /&gt;    "Like many developers I took a 3 year degree course in this&lt;br /&gt;    stuff. But at no point during those three years did any&lt;br /&gt;    lecturer actually tell me how to program."&lt;br /&gt;&lt;br /&gt;This was my experience as well. There is a particular skill to finding libraries that cover functionality that you need without undesirable side-effects and finding ways to immerse them elegantly into your product. This is the major technical skill required in the sort of work I do these days and this is far from unusual. I say "technical skill", but there is a degree of mysticism about it because you are constantly on the lookout for warning signs that point to something that may trip you up in the future. As far as I remember we also got zero guidance on this at university. Fair enough - it's not necessarily a "computer science" issue. But the author's original point is quite valid - lots of people get into work without vocational training and the industry doesn't supply it.&lt;br /&gt;&lt;br /&gt;    "The problem for software is that non-software-developers&lt;br /&gt;    don't see anything creative about it."&lt;br /&gt;&lt;br /&gt;There are sectors of software development that are not remotely creative. I remember working on a contract for some software used by a government department. It was written using a long-obsolete visual basic platform. My task was to churn along using the same approaches that had always been used on the project. We had complete confidence that the client would pay for this. There was no business case to justify extra money to improve it in the short or medium terms. If it ever became necessary it could have been funded in the future.&lt;br /&gt;&lt;br /&gt;Of course, I agree with the direction of quote. This sort of work exists, but only because there are programmers apathetic or naive enough to continue working on such stuff. There's no way I would do it - it's boring to the point of suffocation and a career death-sentence. I'd rather work the front of a pizza shop and this nearly eventuated.&lt;br /&gt;&lt;br /&gt;Now for the general comment.&lt;br /&gt;&lt;br /&gt;In my natural state I'm not at all methodical even when I want to be. I need a single point of entry. As a result, I have processes to manage working on all things that are important to me at work and in my private life. For example - I have a paper diary; a small black notebook that I write a short list of coming goals in before I allow myself to unlock my workstation; I have a document on the computer listing current projects and milestones. And then whenever I get uncomfortable I can force myself back through the system from a single point of entry. I expect that I spend a lot of time managing finicky documents that other people are able to instead direct to actual productive things. But that doesn't matter, because I need this in order to function.&lt;br /&gt;&lt;br /&gt;Thus, I'm probably unusual in that I do actually have a conscious process for programming projects.&lt;br /&gt;&lt;br /&gt;This is it (elaboration added for purpose of blog post):&lt;br /&gt;- Establish the business requirements as best as possible.&lt;br /&gt;- Get an authority to agree that it's a good direction even if not final.&lt;br /&gt;- Breadth-based brainstorm of technical approaches to properly meet business requirements. (Don't stop at the first one that looks like a good idea - keep searching. Discard "that almost works" type solutions - if it doesn't work it's broken. Doing this stuff on paper now saves lots of time later.)&lt;br /&gt;- Put the options in a conscious hierarchy of how you find them flexible. (I don't really have a strict rule for doing this yet, but more a list of things like "future flexibility", "maintainability", "technical risk")&lt;br /&gt;- Use "bottom-up" approaches to create demonstrations of each point along the path of an approach. Work towards building a prototype from the various components.&lt;br /&gt;- Seek review on prototype. Expect the requirements to change. This is fine - people often need a prototype in order to move their understanding of the problem along. Also, better now than later, and there's a good change you'll have use for the scratch prototypes later.&lt;br /&gt;- Go back to breadth-based brainstorm until the prototype works and the target audience are satisfied that things are headed in the right direction.&lt;br /&gt;- Agree with authority that prototyping will now be over. Write a design document. Get signoff. There's still lots of work to be done - build systems, developer documentation, and you want to be secure in this before you jump in. (Sometimes you just can't get your audience to accept the shift from prototype mode to endgame. Such is life.)&lt;br /&gt;- Implement.&lt;br /&gt;&lt;br /&gt;Throughout you insist that people respect the &lt;a href="http://www.codinghorror.com/blog/archives/000704.html"&gt;pigs and chickens&lt;/a&gt; dynamic and give those who are actually and in fact committed to the project the ability to call it. This is an interesting one. Sometimes someone who is managing seven projects can say "well I'm responsible because I'm your manager". It's a lie. In three years time, everyone who matters will have forgotten how the power structures were arranged at the time and all that will be remembered is "This was Craig's project and it's rubbish". I've even been in situations where the absent minded manager who insisted on an approach forgot about his insistence and blamed me for the bad technology decision. Nightmare.&lt;br /&gt;&lt;br /&gt;Random: I feel constantly hampered by not having a document production system at my disposal that gives me the power I need in many of these steps, and others besides. I sit down every now and then and have another shot at working out exactly what I need and implementing it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-4618487380508435100?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/4618487380508435100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/4618487380508435100'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/05/process-for-programming.html' title='Process for programming'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-5249973099575475151</id><published>2008-04-13T08:19:00.001-07:00</published><updated>2008-04-13T08:23:22.598-07:00</updated><title type='text'>Blogs as an email replacement mechanism</title><content type='html'>This is written under tight time constraints and I realise I still haven't dealt with feedback from the previous post yet.&lt;br /&gt;&lt;br /&gt;I've been thinking recently how neat the twitter model is whereby it avoids spam, and I've also been installing a new mailserver today. Hence the following notion.&lt;br /&gt;&lt;br /&gt;I wonder if it would be practical for people to replace a large amount of their email activity with weblogs. For example - I could keep in touch with my family via a private-access "Turner family blog" that people in the extended family posted to when they wanted to communicate to anyone. There's nothing revolutionary in this idea, but the idea of actively trying to push my activities to private network blogs in order to cut out email is something I hadn't considered before. Thoughts?&lt;br /&gt;&lt;br /&gt;Blogging has become more a log more significant to me since the beginning of this year. I'm increasingly using weblogs as a documentation and live communication system. For example - I've just set up &lt;a href="http://voxgraduale.blogspot.com"&gt;a new blog&lt;/a&gt; for the church group I sing with on Sundays with an intention that we'll use it for program and event announcements. I'm in the process of setting up another for tracking my internal documentation for songseed.&lt;br /&gt;&lt;br /&gt;I like being able to use a single tool (in my case, &lt;a href="http://en.wikipedia.org/wiki/MarsEdit"&gt;MarsEdit&lt;/a&gt;) to edit personal documentation, edit work documentation, dispatch python geek blog posts to one blog, dispatch choir geek posts to two other blogs. A generic "network editor". A browser isn't such a good interface for that work because there's always the risk that something will crash and you'll lose all your data. I suppose there's the same sort of risk with MarsEdit, but so far it has been completely stable for me, and it's more feasibly to put redundancy measures in a single purpose tool like a "network-based text editor" than to expect both a remote webserver and local browser to co-ordinate data safety.&lt;br /&gt;&lt;br /&gt;Continuing the thought: if we used blogs extensively in this way (when you get a new member to a community you just invite their email to the community blog) then we could go further in securing private email agaginst junk. For example - it would be more reasonable to filter people through capcha in a world where the only time you were getting personal email was from someone you hadn't met.&lt;br /&gt;&lt;br /&gt;Another thought: maybe we could use a blog approach where we currently use technical forums. So people interested in a topic pass through capcha to join the posting group, and anyone can post. Threads develop as comments to blog posts rather rather than having the back and forth you see on an email list.&lt;br /&gt;&lt;br /&gt;C&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-5249973099575475151?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/5249973099575475151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=5249973099575475151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5249973099575475151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5249973099575475151'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/04/blogs-as-email-replacement-mechanism.html' title='Blogs as an email replacement mechanism'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-2978066122679838864</id><published>2008-04-11T14:57:00.001-07:00</published><updated>2008-04-11T14:57:55.356-07:00</updated><title type='text'>"Push" technology is so 1998</title><content type='html'>Back in the late nineties there was a fad called "push". Pre-Internet media is threatened by the pattern of consumers being in charge. "Push" was an attempt to redefine the emerging online space to something they were comfortable with. The vision was that people would connect to the net each morning, have their computer download the sort of content they were usually interested in and then they'd consume it.&lt;br /&gt;&lt;br /&gt;I was an administrator at &lt;a href="http://www.ninemsn.com.au"&gt;ninemsn&lt;/a&gt; at the time so had extra awareness of all this. They tried all pushing all sorts of things. They were quite innovative but nothing crossed my path that ever won me over to the idea. Time has shown that people seem to prefer news aggregators.&lt;br /&gt;&lt;br /&gt;More recently, "podcasting" emerged as a fashionable word. This struck me as strange because to me it essentially the same dynamic as push content, except it's audio files instead of &lt;a href="http://dolly.ninemsn.com.au"&gt;Dolly&lt;/a&gt; horoscopes. But the twitter about podcasting didn't die down, so then I started to get insecure and think that I had missed something. I've just read an article showing that experience has matched my expectations: &lt;a href="http://www.thestandard.com/news/2008/04/11/why-podcasting-failing"&gt;see here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There's definitely a place for podcast-style content, just as there is a place for mailing lists that you subscribe to. I like to listen to Graham Abbott's &lt;a href="http://www.abc.net.au/classic/keys/"&gt;Keys to Music&lt;/a&gt; show (and wish I could get it in a more convenient format than is currently available to allow me to cart it around - I expect the current format is a result of copyright limitations on the content). This is the sort of thing I'd get to listen to in my car, and is superior to something like radio, because I get to pick out content I want and listen to that rather than listening to what's being broadcast on a small number of channels that are aimed at a general audience.&lt;br /&gt;&lt;br /&gt;Still, the sweet spot for content is where it is driven by people's immediate active interest. As an example - imagine a world where &lt;a href="http://www.songseed.com"&gt;songseed&lt;/a&gt; actually had a whole stack of content in it, and a consumer could view a composition and then see a "Keys to music" episode that related to that content. This would be a superior delivery of that content to a system where a loyal audience keeps the faith by listening out each week with a sense of confidence that the thing to be broadcast will match their interest.&lt;br /&gt;&lt;br /&gt;Another thing - the fact that the twitter took ages to die down reminds me of another thing I've been thinking recently: popular wisdom about the rate of change is garbage. There's a common opinion that computers are obsolete before they're released, that this morning's newspaper is old news and that progress in technology is generally extremely rapid. My experience suggests that this is complete and utter rubbish. I sat around a geek computer meeting in 1995 discussing mp3s. Everyone there knew that the techonology was revolutionary and would change the world. Thirteen years later we're still waiting on a massive transformation, and the delays to it are not remotely technical - people are just taking ages to adjust to a new understanding of their own interests.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-2978066122679838864?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/2978066122679838864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=2978066122679838864' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/2978066122679838864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/2978066122679838864'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/04/technology-is-so-1998.html' title='&amp;quot;Push&amp;quot; technology is so 1998'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-5559513469833744087</id><published>2008-04-07T07:53:00.000-07:00</published><updated>2008-04-07T07:55:07.518-07:00</updated><title type='text'>Which implementation in python</title><content type='html'>I was going crazy earlier not having which on Windows. Simple enough, but by posting it here I can copy and paste it when I next want it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import os&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;    print "Usage:"&lt;br /&gt;    print "  %s SEARCH_STRING"%sys.argv[0]&lt;br /&gt;    sys.exit(0)&lt;br /&gt;&lt;br /&gt;if len(sys.argv) != 2:&lt;br /&gt;    usage()&lt;br /&gt;&lt;br /&gt;search_string = sys.argv[1].lower()&lt;br /&gt;&lt;br /&gt;for path in os.environ["PATH"].split(';'):&lt;br /&gt;    try:&lt;br /&gt;        dir_contents = [fn for fn in os.listdir(path)]&lt;br /&gt;        dir_contents = [fn.lower() for fn in dir_contents if os.path.isfile('%s%s%s'%(path, os.sep, fn))]&lt;br /&gt;&lt;br /&gt;        matches = [fname for fname in dir_contents if fname.startswith(search_string)]&lt;br /&gt;        for m in matches:&lt;br /&gt;            print "%s%s%s"%(path, os.sep, m)&lt;br /&gt;    except KeyboardInterrupt, e:&lt;br /&gt;        raise e&lt;br /&gt;    except:&lt;br /&gt;        pass&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-5559513469833744087?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5559513469833744087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5559513469833744087'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/04/which-implementation-in-python.html' title='Which implementation in python'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-8475219171323697790</id><published>2008-03-30T15:43:00.001-07:00</published><updated>2008-03-30T15:43:17.224-07:00</updated><title type='text'>Things to think about on those bad days</title><content type='html'>http://www.daniel-lemire.com/blog/archives/2007/11/22/how-to-become-smarter/&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-8475219171323697790?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/8475219171323697790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=8475219171323697790' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/8475219171323697790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/8475219171323697790'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/03/things-to-think-about-on-those-bad-days.html' title='Things to think about on those bad days'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-2352541478122682398</id><published>2008-03-25T09:18:00.001-07:00</published><updated>2008-03-28T14:29:27.145-07:00</updated><title type='text'>Synergy tool</title><content type='html'>There's a neat tool called &lt;a href="http://synergy2.sourceforge.net/"&gt;synergy&lt;/a&gt; (&lt;a href="http://sourceforge.net/projects/synergykm"&gt;handy osx client&lt;/a&gt;) that allows you to have a keyboard and mouse shared between computers. Once it is all set up, you can move the mouse off the side of the screen on one host onto another, and then keyboard and mouse actions take effect on that other host instead. Very useful! Another nice thing is that for the most part it Just Works. Even the clipboard data seems to carry reliably.&lt;br /&gt;&lt;br /&gt;Note that it doesn't work properly if you try to use it from within vmware. I also had some niggles with the mapping of the windows/apple and alt keys between hosts being swapped. However, I've found a fix to this. In this example I'm using the 'meta' key mapping as a holding position while I swap alt and super about.&lt;br /&gt;&lt;br /&gt;My keyboard and mouse are connected to a laptop running ubuntu linux. In the Gnome Keyboard Preferences pane within the "Layouts" tab, I have selected "Super is mapped to the Win-keys (default)". Then in the configuration file on the server side I have this arrangement:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;section: screens&lt;br /&gt;       ubuntu:&lt;br /&gt;       osx:&lt;br /&gt;        alt = meta&lt;br /&gt;        super = alt&lt;br /&gt;        alt = meta&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;section: links&lt;br /&gt;       ubuntu:&lt;br /&gt;        right = osx&lt;br /&gt;       osx:&lt;br /&gt;        left = ubuntu&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;From ubuntu I run this&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ synergys --config synergy.conf -f&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I point the OSX client at the ip address.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-2352541478122682398?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/2352541478122682398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=2352541478122682398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/2352541478122682398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/2352541478122682398'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/03/synergy-tool.html' title='Synergy tool'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-9026740250533680247</id><published>2008-03-24T06:24:00.001-07:00</published><updated>2008-03-24T06:24:16.117-07:00</updated><title type='text'>reStructuredText and rst2a</title><content type='html'>I've been wanting a quick document production system for a long time. Systems that combine format and data annoy me. Systems that are too complicated (e.g. LaTeX) aren't a lot of good to me either because if I try to use them it's only a matter of time before I can't use them at work. A contact pointed me to reStructuredText this morning. The combination of this and &lt;a href="http://rst2a.com/"&gt;rst2a&lt;/a&gt; seem to be exactly what I need.&lt;br /&gt;&lt;br /&gt;Curl usage isn't the most obvious thing in the world. Try this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;curl -F "rst=@text.rst" "http://api.rst2a.com/1.0/rst2/pdf?class=report&amp;style=zope" &gt; result.pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-9026740250533680247?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/9026740250533680247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=9026740250533680247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/9026740250533680247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/9026740250533680247'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/03/restructuredtext-and-rst2a.html' title='reStructuredText and rst2a'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-1064922105854793529</id><published>2008-03-22T10:33:00.001-07:00</published><updated>2008-03-22T11:17:45.109-07:00</updated><title type='text'>Storm ORM - problems from early steps</title><content type='html'>I'm using the Easter weekend to write a network database for a &lt;a href="http://www.songseed.com"&gt;Songseed&lt;/a&gt; subproject. I'm at the stage now where I need to bind between my layer and a relational database underneath. I thought I'd try out &lt;a href="https://storm.canonical.com/"&gt;storm&lt;/a&gt; because although it looks underpowered compared to my current ORM of choice, &lt;a href="http://www.sqlalchemy.org"&gt;sqlalchemy&lt;/a&gt; I've read only good things about it.&lt;br /&gt;&lt;br /&gt;Unfortunately I've had several problems even very early on. My first attempt to install via ez_setup.py didn't work due to SSL complaints of some sort. I downloaded the egg directly for version 0.12. This did work.&lt;br /&gt;&lt;br /&gt;Then when I try to declare a database as described by the tutorial I get this error:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; database = create_database("sqlite:")&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in &lt;module&gt;&lt;br /&gt;  File "/opt/local/lib/python2.5/site-packages/storm-0.12-py2.5.egg/storm/database.py", line 408, in create_database&lt;br /&gt;    return factory(uri)&lt;br /&gt;  File "/opt/local/lib/python2.5/site-packages/storm-0.12-py2.5.egg/storm/databases/sqlite.py", line 176, in __init__&lt;br /&gt;    raise DatabaseModuleError("'pysqlite2' module not found")&lt;br /&gt;storm.exceptions.DatabaseModuleError: 'pysqlite2' module not found&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I could install pysqlite2 - but I'm not sure why I should need to. sqlite3 is now bundled with &lt;br /&gt;&lt;br /&gt;I've tried linking to postgresql and that is behaving bizarrely as well - not all committed data makes it to the database.&lt;br /&gt;&lt;br /&gt;So it's back to the cryptic world of sqlalchemy for the moment. this is an unfortunate result. I tend to get burnt with sqlalchemy because I find that it takes a lot of effort to get its workings loaded into my head (and doing this is crucial for avoiding bugs). Also, the storm documentation appears to be very good. Fortunately this is a modest project at the moment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;Thanks to radix - as I finished this he responded to a message I'd left on irc. It turns out sqlite3 *wasn't* installed on my version of python 2.5 and I'd overlooked this. I have it all working in sqlite now and plan to continue working with it.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-1064922105854793529?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cratuki.blogspot.com/feeds/1064922105854793529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7317892351838188771&amp;postID=1064922105854793529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/1064922105854793529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/1064922105854793529'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/03/storm-orm-problems-from-early-steps.html' title='Storm ORM - problems from early steps'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7317892351838188771.post-5063941941918147331</id><published>2008-01-31T07:36:00.000-08:00</published><updated>2008-01-31T07:37:37.476-08:00</updated><title type='text'>Intro and random thought about keyboard layout</title><content type='html'>I used to have a blog at stable.cowoh.org but the server died as I was on a plane back to London after a holiday at my parents' place (where it lived under a desk). Terrible timing and I've been busy since and not had time to worry about it.&lt;br /&gt;&lt;br /&gt;But today is my last day at &lt;a href="http://www.db.com"&gt;DB&lt;/a&gt; and I'm anticipating that I'll have the next week to myself to work on &lt;a href="http://www.songseed.com"&gt;songseed&lt;/a&gt;; play with some documentation ideas I have for the new &lt;a href="http://www.arclanguage.org"&gt;arc language&lt;/a&gt;; do some server configuration work I've been putting off for ages; go to the gym and ... get back into geeky blogging. :)&lt;br /&gt;&lt;br /&gt;Thought of the moment - one of the things that's annoying about lisp is that you have to press shift every time you want a parens. Since the numbers appear on the keyboard twice and I always use the keypad for accuracy, it would be nice to know if there was a way of customising my keyboard (will be a US English USB Apple keyboard after today) so that the default and shift cases for the numbers in the main section of they keyboard triggered symbol characters. Target OSs: Linux or OSX.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7317892351838188771-5063941941918147331?l=cratuki.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5063941941918147331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7317892351838188771/posts/default/5063941941918147331'/><link rel='alternate' type='text/html' href='http://cratuki.blogspot.com/2008/01/intro-and-random-thought-about-keyboard.html' title='Intro and random thought about keyboard layout'/><author><name>cratuki</name><uri>http://www.blogger.com/profile/14434316053236466855</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
