<?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-14408200</id><updated>2011-07-30T11:52:17.973-07:00</updated><title type='text'>Jason Creighton's Blog</title><subtitle type='html'>Just another blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>97</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14408200.post-2394049512489450792</id><published>2010-08-13T07:36:00.001-07:00</published><updated>2010-08-13T07:36:52.204-07:00</updated><title type='text'>PyPy GSoC: Wrapping up</title><content type='html'>&lt;p&gt;Well, we're reaching the end of the official GSoC period, and asmgcc-64 still has some obscure bugs. I'm going to continue to work on it in the two weeks before my college starts up, but it's hard to make time estimates regarding how long it will take to track down weird failure modes.&lt;/p&gt;

&lt;p&gt;But the bottom line is that the main goal of my GSoC was accomplished: A working 64-bit PyPy JIT. Hopefully I'll be able to complete asmgcc-64, and make the JIT even faster.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-2394049512489450792?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/2394049512489450792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=2394049512489450792' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2394049512489450792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2394049512489450792'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/08/pypy-gsoc-wrapping-up.html' title='PyPy GSoC: Wrapping up'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-8375819799723897581</id><published>2010-08-02T10:59:00.000-07:00</published><updated>2010-08-02T11:00:15.786-07:00</updated><title type='text'>PyPy GSoC: 64-bit JIT merged to trunk</title><content type='html'>&lt;p&gt;Well, that took longer than it should have. In any case, 64-bit JIT support (with Boehm GC only) has been merged to trunk. Please try it out!&lt;/p&gt;

&lt;p&gt;The remainder of my GSoC will be work on the asmgcc-64 branch, to allow the 64-bit JIT to work with non-Boehm collectors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-8375819799723897581?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/8375819799723897581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=8375819799723897581' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8375819799723897581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8375819799723897581'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/08/pypy-gsoc-64-bit-jit-merged-to-trunk.html' title='PyPy GSoC: 64-bit JIT merged to trunk'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-428999926091003187</id><published>2010-07-26T13:13:00.003-07:00</published><updated>2010-07-26T13:31:37.250-07:00</updated><title type='text'>PyPy GSoC: Nearing the merge to trunk</title><content type='html'>&lt;p&gt;After some discussion with the core PyPy developers, it's been decided that the 64-bit backend will be merged as soon as possible, with only Boehm GC support. After the merge, I will continue work on asmgcc-64 to provide further speed improvements.&lt;/p&gt;

&lt;p&gt;The x86-64-jit-backend branch is keep fairly close to trunk, so I thought the merge would be fairly trivial. Unfortunately, I spent the morning tracking down what turned out to be simple bug in the tests themselves, and the afternoon investigating a regression involving the 32-bit hybrid GC support, which I am still working on. However, I am confident that I will be able fix the regression and complete the merge this week. (&lt;em&gt;knocks on wood&lt;/em&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-428999926091003187?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/428999926091003187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=428999926091003187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/428999926091003187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/428999926091003187'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/07/pypy-gsoc-nearing-merge-to-trunk.html' title='PyPy GSoC: Nearing the merge to trunk'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-7875137079550393687</id><published>2010-07-19T07:26:00.000-07:00</published><updated>2010-07-19T07:36:46.423-07:00</updated><title type='text'>PyPy GSoC: asmgcc update</title><content type='html'>&lt;p&gt;Apologizes for my lapse in updates. And thanks the people who bugged me on IRC for a status update. :)&lt;/p&gt;

&lt;p&gt;I spent some time familiarizing myself with the purpose and implementation of trackgcroot.py, then started working on porting it to support the 64-bit instruction set, which has been fairly straightforward.&lt;/p&gt;

&lt;p&gt;Currently I am using the asmgcc test suite to iterate through the "run tests -&gt; investigate failure -&gt; fix bug -&gt; repeat" cycle. Once I have 64-bit asmgcc working, I want to eliminate some code duplication that has crept into my codebase. I expect to be working on asmgcc-64 for the rest of this week at the least.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-7875137079550393687?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/7875137079550393687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=7875137079550393687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7875137079550393687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7875137079550393687'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/07/pypy-gsoc-asmgcc-update.html' title='PyPy GSoC: asmgcc update'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5526890248024139416</id><published>2010-07-02T12:50:00.000-07:00</published><updated>2010-07-02T12:52:03.386-07:00</updated><title type='text'>PyPy GSoC: 64-bit JIT working, but GC is slow</title><content type='html'>&lt;p&gt;Finally, I have a working 64-bit JIT in my branch, although only with the slow Boehm garbage collector.&lt;/p&gt;

&lt;p&gt;Next week, I will start work on adding 64-bit support to the asmgcc root finding strategy in order to make use of one of PyPy's faster, preferred garbage collectors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5526890248024139416?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5526890248024139416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5526890248024139416' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5526890248024139416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5526890248024139416'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/07/pypy-gsoc-64-bit-jit-working-but-gc-is.html' title='PyPy GSoC: 64-bit JIT working, but GC is slow'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-64070917086167221</id><published>2010-06-25T13:44:00.001-07:00</published><updated>2010-06-25T13:44:44.176-07:00</updated><title type='text'>PyPy GSoC status update</title><content type='html'>&lt;p&gt;Well, the backend is RPythonic again. And I managed to remove some of the boilerplate/duplicated code from the rx86 module, although there is still room for improvement. Also, some common cases of loading a large number of variables from memory locations that are "close" to one another became more efficient.&lt;/p&gt;

&lt;p&gt;The main thing this coming week is to address an issue that I only became fully aware of in the middle of this week: Many places in the code use jumps with a 32-bit relative displacement that are sometimes patched later to point to a different destination. The problem is sometimes you need to patch it to point to a location farther away.&lt;/p&gt;

&lt;p&gt;This issue had been masked by the fact that on some operating systems (Linux included), you can give the operating system a hint as to where you'd like the memory to be allocated, and as a result, all of the memory used by the JIT was within 32 bits of each other. But we can't count on that working all the time on all platforms, so we need to handle the edge case.&lt;/p&gt;

&lt;p&gt;We have a plan for how to fix this while not making the common case any less efficient, and while it is not hugely difficult, it also isn't trivial.&lt;/p&gt;

&lt;p&gt;After this issue is taken care of, the next thing will be to port the asmgcc root-finding strategy to 64-bit. (Without this, 64-bit JIT would have to use the very slow boehm garbage collector, which sort of defeats the purpose of a JIT)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-64070917086167221?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/64070917086167221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=64070917086167221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/64070917086167221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/64070917086167221'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/06/pypy-gsoc-status-update.html' title='PyPy GSoC status update'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-7871397682208133173</id><published>2010-06-11T15:12:00.002-07:00</published><updated>2010-06-11T15:13:00.093-07:00</updated><title type='text'>PyPy GSoC update: Most tests pass on 64-bit and 32-bit CPUs</title><content type='html'>&lt;p&gt;Most JIT tests now pass on both 32-bit and 64-bit CPUs. However, there are some caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I made some changes that make the code no longer "RPythonic", which means you can't actually build a working, JIT-enabled, PyPy with this code quite yet.&lt;/li&gt;
&lt;li&gt;The rx86 module has accumulated some code duplication.&lt;/li&gt;
&lt;li&gt;There are a number of miscellaneous hacks I had to add that I'd like to get rid of somehow.&lt;/li&gt;
&lt;li&gt;64-bit memory references aren't as efficient (in terms of code size) as they could be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My plan for next week is to spend some time cleaning up the rx86 module, and then working on making the JIT translatable again. If by some miracle I get both of those things done next week, I'll start on the other two items. :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-7871397682208133173?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/7871397682208133173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=7871397682208133173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7871397682208133173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7871397682208133173'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/06/pypy-gsoc-update-most-tests-pass-on-64.html' title='PyPy GSoC update: Most tests pass on 64-bit and 32-bit CPUs'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-6203087337266790639</id><published>2010-06-07T07:13:00.002-07:00</published><updated>2010-06-07T07:26:58.885-07:00</updated><title type='text'>rx86 conversion complete, 64-bit work started</title><content type='html'>&lt;p&gt;Last week saw the completion of the rx86 conversion: All tests pass, and the JIT works on i386 machines.&lt;/p&gt;

&lt;p&gt;Last week I started on actually implementing 64-bit support. Mostly this will be an exercise in "magic removal": Locating those parts of the code that are only applicable to i386, and either adapting them to work with both i386 and x86_64 or else factoring those differences out into arch-specific classes.&lt;/p&gt;

&lt;p&gt;One issue specific to x86_64 is the fact that most instructions cannot encode a 64-bit immediate value. I've worked around this by setting aside one register as a scratch register, and loading the immediate to that register first when a case like this arises. In the future I may try to optimize this to output a 32-bit relative displacement in the cases where that could work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-6203087337266790639?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/6203087337266790639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=6203087337266790639' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6203087337266790639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6203087337266790639'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/06/rx86-conversion-complete-64-bit-work.html' title='rx86 conversion complete, 64-bit work started'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-668204828705808559</id><published>2010-05-31T12:28:00.002-07:00</published><updated>2010-05-31T12:33:18.157-07:00</updated><title type='text'>PyPy GSoC update: rx86 encoding almost done</title><content type='html'>&lt;p&gt;I've almost reached the first milestone. Almost all tests pass, and I've successfully translated pypy-c-jit and run a few benchmarks. Unless I hit an unforeseen issue, I'll be able to actually start on 64-bit support sometime this week.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-668204828705808559?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/668204828705808559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=668204828705808559' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/668204828705808559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/668204828705808559'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/05/pypy-gsoc-update-rx86-encoding-almost.html' title='PyPy GSoC update: rx86 encoding almost done'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-6021761978909125760</id><published>2010-05-21T15:19:00.001-07:00</published><updated>2010-05-21T15:28:38.258-07:00</updated><title type='text'>GSoC status update: End of week 1</title><content type='html'>&lt;p&gt;GSoC doesn't officially start until May 24th, but my classes were over, so I spend this week getting started on my project. I spent the week trying to port the backend to use the new rx86 encoding scheme, as well as extended rx86 as needed. Progress was slowed quite a bit by my unfamiliarity with PyPy; it seemed every couple minutes I had to stop and spend some time just reading code, trying to figure out what it was even supposed to do. However, I was definitely getting more done by the end of the week.&lt;/p&gt;

&lt;p&gt;By the end of next week, I hope to be finished porting the backend to rx86. After that, I'll begin actually adding 64-bit support.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-6021761978909125760?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/6021761978909125760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=6021761978909125760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6021761978909125760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6021761978909125760'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/05/gsoc-status-update-end-of-week-1.html' title='GSoC status update: End of week 1'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-7003893619094166925</id><published>2010-04-27T13:18:00.002-07:00</published><updated>2010-04-27T13:35:52.085-07:00</updated><title type='text'>Google Summer of Code: PyPy 64-bit JIT</title><content type='html'>&lt;p&gt;My &lt;a href="http://socghop.appspot.com/gsoc/student_project/show/google/gsoc2010/python/t127230763046"&gt;Google Summer of Code proposal&lt;/a&gt; was accepted! This means that starting May 17th, I'll be working on the PyPy JIT. Per Python Software Foundation requirements, I'll be using this blog to post (at least) weekly updates on my status.&lt;/p&gt;

&lt;p&gt;The first milestone that I'll be working on is to take the existing "remove-ri386-multimethod-2" branch and use it as a basis for instruction encoding and then modify the existing 32-bit backend to use the new instruction encoding scheme. Once that's in place, we should be in good shape move on to the other 64-bit specific areas. (register allocation, guard failure handling, calling conventions, etc.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-7003893619094166925?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/7003893619094166925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=7003893619094166925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7003893619094166925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7003893619094166925'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/04/google-summer-of-code-pypy-64-bit-jit.html' title='Google Summer of Code: PyPy 64-bit JIT'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-4335900609519332627</id><published>2010-04-05T14:35:00.002-07:00</published><updated>2010-04-05T14:39:12.194-07:00</updated><title type='text'>How to disable Autocorrect in OpenOffice Writer 3.1</title><content type='html'>&lt;p&gt;Click on the "Format" menu, go the "AutoCorrect" flyout, and uncheck the "While Typing" option.&lt;/p&gt;

&lt;p&gt;That's it. It took me an embarrassingly long time to find something so simple, so hopefully someone else can avoid the same fate.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-4335900609519332627?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/4335900609519332627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=4335900609519332627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4335900609519332627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4335900609519332627'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2010/04/how-to-disable-autocorrect-in.html' title='How to disable Autocorrect in OpenOffice Writer 3.1'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-3294693906033097572</id><published>2009-05-09T13:07:00.003-07:00</published><updated>2009-05-09T13:11:07.478-07:00</updated><title type='text'>Oh, Wikipedia, how I love thee</title><content type='html'>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_fictional_vehicles"&gt;List of fictional vehicles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best part is the "Spacecraft" section with links to &lt;a href="http://en.wikipedia.org/wiki/List_of_fictional_spaceships"&gt;its own article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Face it, people, you'll never find this kind of quality information in &lt;i&gt;Britannica&lt;/i&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-3294693906033097572?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/3294693906033097572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=3294693906033097572' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/3294693906033097572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/3294693906033097572'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2009/05/oh-wikipedia-how-i-love-thee.html' title='Oh, Wikipedia, how I love thee'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-8149822309333190949</id><published>2009-04-23T22:27:00.002-07:00</published><updated>2009-04-23T22:32:54.048-07:00</updated><title type='text'>Ports to forward to host Moonbase Commander behind NAT</title><content type='html'>&lt;p&gt;To host a Moonbase Commander game, you need to forward three ports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2300 (TCP)&lt;/li&gt;
&lt;li&gt;2350 (UDP)&lt;/li&gt;
&lt;li&gt;47624 (TCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that I did not test downloading a custom map, since I almost always play on randomly-generated maps with the excellent &lt;a href="http://mbc.strategyplanet.gamespy.com/files.shtml#utils"&gt;Moonbase Console random map generation utility&lt;/a&gt;, so that capability may not work without opening an additional port.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-8149822309333190949?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/8149822309333190949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=8149822309333190949' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8149822309333190949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8149822309333190949'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2009/04/ports-to-forward-to-host-moonbase.html' title='Ports to forward to host Moonbase Commander behind NAT'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5937385903017360099</id><published>2009-03-22T13:50:00.000-07:00</published><updated>2009-03-22T13:52:00.614-07:00</updated><title type='text'>Hey Paul Krugman</title><content type='html'>&lt;p&gt;I find this funny:&lt;/p&gt;

&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XOYAuk809fY&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XOYAuk809fY&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5937385903017360099?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5937385903017360099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5937385903017360099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5937385903017360099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5937385903017360099'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2009/03/hey-paul-krugman.html' title='Hey Paul Krugman'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-822475846822775408</id><published>2009-03-14T12:29:00.001-07:00</published><updated>2009-09-07T07:57:29.921-07:00</updated><title type='text'>Nobody could have predicted this</title><content type='html'>&lt;p&gt;Well, maybe &lt;a href="http://www.hussmanfunds.com/html/debtswap.htm"&gt;someone could have&lt;/a&gt;:&lt;/p&gt;

 &lt;blockquote&gt;

 &lt;p&gt;The major force shaping economic dynamics over the coming decade is likely to be an unwinding of the extreme leverage that individuals, businesses, and the U.S. itself (via its record current account deficit) have accumulated.&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;p&gt;More from later in the same article:&lt;/p&gt;

 &lt;blockquote&gt;

 &lt;p&gt;According to the Bank for International Settlements, the U.S. interest rate swap market is about $34 trillion in size, having nearly doubled in size in the past two years. The reason this figure is so enormous is that there are usually several links in the chain from borrower to investor. A risky borrower may enter a swap with bank A, which then takes an offsetting swap position with bank B (earning a bit of the credit spread as its compensation), and so on, with a cheerful money market investor at the end of the chain holding a safe, government backed security, oblivious to the chain of counterparty risk in between.&lt;/p&gt;

 &lt;p&gt;Picture a freight train.&lt;/p&gt;

 &lt;p&gt;Aside from the risk that any particular link in this chain might be weak (know thy counterparty), the U.S. financial system has gone one step further. In order to hedge against the risk of defaults, banks frequently lay credit risk off by entering “credit default swaps” with other banks or insurance companies. These swaps essentially act as insurance policies for credit risk.&lt;/p&gt;

 &lt;p&gt;Once again, however, the iron law of equilibrium is that every risk swapped away by someone is held by someone else. According to Bloomberg, over half of the world’s trading in the credit swaps market is concentrated among five banks: J.P. Morgan (26%), Citigroup (10%), UBS Warburg (9%), Bank of America (7%) and Deutsche Bank (7%). As Warren Buffett has noted, “Large amounts of risk, particularly credit risk, have been concentrated in the hands of relatively few derivatives dealers, who in addition trade extensively with one another. The trouble of one could quickly infect the others.”&lt;/p&gt;

 &lt;p&gt;Picture a freight train.&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;p&gt;This diagnosis of the crisis sound familiar? Those bank names ringing any bells? &lt;strong&gt;This was written in mid-2003.&lt;/strong&gt; This wasn’t some weird crisis that nobody could have seen coming. Nobody &lt;strong&gt;wanted&lt;/strong&gt; to see it coming. With every bubble, nobody wants to believe that it will pop, and everybody manages to act surprised when it finally does, just like every bubble before it.&lt;/p&gt;

&lt;p&gt;[&lt;i&gt;Comments disabled due to spambots hitting this post for some reason&lt;/i&gt;]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-822475846822775408?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/822475846822775408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=822475846822775408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/822475846822775408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/822475846822775408'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2009/03/nobody-could-have-predicted-this.html' title='Nobody could have predicted this'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-4812983880748644038</id><published>2009-02-09T23:28:00.000-07:00</published><updated>2009-02-09T23:29:08.596-07:00</updated><title type='text'>National Security</title><content type='html'>&lt;p&gt;&lt;a href="http://www.aclu.org/safefree/torture/29912res20070530.html"&gt;Why torture is a bad idea&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
 &lt;p&gt;Early on the morning of July 22, 2002, a Gulfstream V aircraft, then registered with the FAA as N379P, flew Mohamed to Rabat, Morocco where he was interrogated and tortured for 18 months. In Morocco his interrogators routinely beat him, sometimes to the point of losing consciousness, and he suffered multiple broken bones. During one incident, Mohamed was cut 20 to 30 times on his genitals. On another occasion, a hot stinging liquid was poured into open wounds on his penis as he was being cut. He was frequently threatened with rape, electrocution and death. He was forced to listen to loud music day and night, placed in a room with open sewage for a month at a time and drugged repeatedly.&lt;/p&gt;
&lt;/blockquote&gt;

 &lt;p&gt;Read that a couple times, and really think about it. &lt;strong&gt;Think about it.&lt;/strong&gt; Think about what it would mean for you or someone you love to go through that. What did Mohamed do to deserve this treatment? He &lt;a href="http://www.dailymail.co.uk/news/article-1138845/Food-writers-online-guide-building-H-bomb--evidence-man-Guantanamo.html"&gt;read the wrong website&lt;/a&gt;, apparently:&lt;/p&gt;

&lt;blockquote&gt;
 &lt;p&gt;A British ‘resident’ held at Guantanamo Bay was identified as a terrorist after confessing he had visited a ‘joke’ website on how to build a nuclear weapon, it was revealed last night.&lt;/p&gt;

 &lt;p&gt;Binyam Mohamed, a former UK asylum seeker, admitted to having read the ‘instructions’ after allegedly being beaten, hung up by his wrists for a week and having a gun held to his head in a Pakistani jail.&lt;/p&gt;

 &lt;p&gt;It was this confession that apparently convinced the CIA that they were holding a top&lt;br /&gt;
Al Qaeda terrorist.&lt;/p&gt;
&lt;/blockquote&gt;

 &lt;p&gt;But Obama is closing Gitmo, so this is all behind us, right? Hope and change all the way, right?&lt;/p&gt;

 &lt;p&gt;Not quite. It appears that &lt;a href="http://obsidianwings.blogs.com/obsidian_wings/2009/02/dear-obama-administration.html"&gt;a lawyer for the Obama Administration is arguing to preserve &amp;#8216;state secrets&amp;#8217;&lt;/a&gt;. So more arguments for preserving &amp;#8220;national security&amp;#8221; at the cost of individual freedoms. Hopefully Obama will back off on this, but I&amp;#8217;m not holding my breath.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-4812983880748644038?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/4812983880748644038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=4812983880748644038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4812983880748644038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4812983880748644038'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2009/02/national-security.html' title='National Security'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-4450765771046465172</id><published>2008-12-31T09:49:00.001-07:00</published><updated>2008-12-31T09:50:46.553-07:00</updated><title type='text'>Sir Terry Pratchett</title><content type='html'>&lt;a href="http://www.theregister.co.uk/2008/12/31/pratchett_knighted/"&gt;Terry Pratchett has been knighted&lt;/a&gt;. As it should be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-4450765771046465172?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/4450765771046465172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=4450765771046465172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4450765771046465172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4450765771046465172'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/12/sir-terry-pratchett.html' title='Sir Terry Pratchett'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-6489268741977854230</id><published>2008-12-23T21:16:00.001-07:00</published><updated>2008-12-23T21:18:01.314-07:00</updated><title type='text'>gcc is smarter than you</title><content type='html'>&lt;p&gt;gcc is pretty clever. Consider the following C program:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;  /* printf() */

int factorial(int n) {
   return n == 0 ? 1 : n * factorial(n - 1);
}

int main() {
   int n = 10;

   printf("factorial(%d) = %d\n", n, factorial(n));

   return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On my version of gcc (4.3.2 on debian testing), when compiled with no optimizaitons, or -O1, it generates code for factorial() like you'd expect, using a recursive call to compute the value. But on -O2, it does something interesting: It compiles down to a tight loop:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    factorial:
   .LFB13:
           testl   %edi, %edi
           movl    $1, %eax
           je  .L3
           .p2align 4,,10
           .p2align 3
   .L4:
           imull   %edi, %eax
           subl    $1, %edi
           jne .L4
   .L3:
           rep
           ret
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pretty impressive. The recursive call (not even tail-recursive) has been completely eliminated, so factorial now uses O(1) stack space instead of O(N). And although I have only very superficial knowledge of x86 assembly (actually AMD64 in this case, but I don't think any of the AMD64 extensions are being used above), I doubt that you could write a better version by hand. But what really blew my mind was the code that it generated on -O3. The implementation of factorial stayed the same. But main() changed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    main:
   .LFB14:
           subq    $8, %rsp
   .LCFI0:
           movl    $3628800, %edx
           movl    $10, %esi
           movl    $.LC0, %edi
           xorl    %eax, %eax
           call    printf
           xorl    %eax, %eax
           addq    $8, %rsp
           ret
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See the "movl $3628800, %edx" line? &lt;strong&gt;gcc is pre-computing factorial(10) at compile-time.&lt;/strong&gt; It doesn't even call factorial(). Incredible. My hat is off to the gcc development team.&lt;/p&gt;

&lt;p&gt;Of course, all the usual disclaimers apply, this is just a toy example, premature optimization is the root of all evil, etc, etc, but it illustrates that compilers are often smarter than you think. If you think you can do a better job by hand, you're almost certainly wrong.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-6489268741977854230?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/6489268741977854230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=6489268741977854230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6489268741977854230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/6489268741977854230'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/12/gcc-is-smarter-than-you.html' title='gcc is smarter than you'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-7515861815986574880</id><published>2008-11-09T15:05:00.001-07:00</published><updated>2008-11-09T15:05:24.004-07:00</updated><title type='text'>The gulf between us</title><content type='html'>&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;All proof inevitably leads to propositions which have no proof. All things are known because we want to believe in them.&amp;#8221;&lt;br /&gt;
&amp;#8212;Bene Gesserit Azhar Book (Dune)&lt;/p&gt;
 &lt;/blockquote&gt;

 &lt;p&gt;Last night, I had one of Those Conversations. I had run into the professor for an ethics class that I took a couple years ago, and we talked for a bit and my atheism came up. He&amp;#8217;s a Christian, and he was interested in why I had changed my mind.&lt;/p&gt;

 &lt;p&gt;So we went to a coffee shop, and had the Conversation. It followed the script that it usually does when I talk with a Christian about why I no longer believe: We lay out our respective cases, argue back and forth, make concessions, agree on points, disagree on others. Then we reach a point where, while we agree on almost all the relevant facts, we still come to wildly different conclusions.&lt;/p&gt;

 &lt;p&gt;We had, I thought, a lot in common in our worldviews. He accepted common descent because of the evidence for it, as do I. He doubts dualism (surprising for a Christian, in my opinion), as do I. He finds the idea of someone suffering forever in hell simply for being born in the wrong time or place intolerable, as do I.&lt;/p&gt;

 &lt;p&gt;It came down to this: He had had a religious experience which made him think that God is real, and since then, he had not seen any evidence that would force him off of that position. He is more than willing to use science, reason and tradition to reinterpret the Bible and take the fire-and-brimstone edge off of it. He resolves many of the problems I have with Christianity simply by disagreeing with the doctrine in question.&lt;/p&gt;

 &lt;p&gt;And then there&amp;#8217;s me. I&amp;#8217;m not willing to do any of that. I see no point. Isn&amp;#8217;t it, [I think to myself] obvious that the reason the old testament is filled with atrocities and genocides is because it&amp;#8217;s just another book, written by men? Isn&amp;#8217;t it obvious that the reason the doctrine of hell exists is because fear is powerful motivator, and religions which exploit that will be more successful than those that do not? Isn&amp;#8217;t it obvious that moderate religion is just the projecting of the morals of modernity onto ancient books by picking and choosing which passages should be literal, and which should be metaphor?&lt;/p&gt;

 &lt;p&gt;But it&amp;#8217;s &lt;strong&gt;not&lt;/strong&gt; obvious. Not to him.&lt;/p&gt;

 &lt;p&gt;I am, it seems, essentially a fundamentalist. I see no point in half-measures, no point in trying to dress up a flawed and brutal document as the words of a benevolent god.&lt;/p&gt;

 &lt;p&gt;He is a liberal. He is willing to reinterpret, to use the findings of science and modernity to come to a different understanding of the Bible.&lt;/p&gt;

 &lt;p&gt;How can this gulf between us be bridged? How can our discourse ever rise about the level of each of us saying to the other &amp;#8220;It&amp;#8217;s obvious to me that you are wrong.&amp;#8221;? How can we ever move beyond shouting to each other across a chasm, separated by presuppositions that we are apparently unwilling to reconsider? What evidence or argument, if any, could be brought to bear to make me change my interpretive framework? To make him change his?&lt;/p&gt;

 &lt;p&gt;My own view is not nearly as bleak and postmodern as the opening quote. I think that there are criteria than can be applied to standards of evidence. (For instance, if your standard of evidence leads you to a contradiction, it&amp;#8217;s wrong.) But it&amp;#8217;s very difficult to &amp;#8220;step outside&amp;#8221; your own beliefs to examine them. Think of the conspiracy nut who says that all contradictory evidence is obviously part of the conspiracy.&lt;/p&gt;

 &lt;p&gt;In the end, all I can do is strive to keep an open mind, try to honestly consider arguments and evidence, and seek to understand why someone else holds a different view then I do rather blindly dismissing or demonizing them.&lt;/p&gt;

 &lt;p&gt;I hope it&amp;#8217;s enough.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-7515861815986574880?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/7515861815986574880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=7515861815986574880' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7515861815986574880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7515861815986574880'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/11/gulf-between-us.html' title='The gulf between us'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-3073723246887280718</id><published>2008-10-10T17:44:00.001-07:00</published><updated>2008-10-10T17:56:17.587-07:00</updated><title type='text'>The economic crisis explained. (sort of)</title><content type='html'>&lt;p&gt;I just wanted to share the clearest explanations of the ongoing economic crisis that I&amp;#8217;ve heard so far: Two episodes of &lt;a href="http://www.thisamericanlife.org/"&gt;This American Life&lt;/a&gt;:&lt;/p&gt;

 &lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.thisamericanlife.org/Radio_Episode.aspx?episode=355"&gt;Episode 355: The Giant Pool of Money&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.thisamericanlife.org/Radio_Episode.aspx?episode=365"&gt;Episode 365: Another Frightening Show About the Economy&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;

 &lt;p&gt;If you have the time, give a listen. I haven&amp;#8217;t fact-checked what they&amp;#8217;re saying against other sources, but they present at least potential explanations, in stark contrast to the empty, one-word talking points (&amp;#8220;greed&amp;#8221;! &amp;#8220;deregulation&amp;#8221;!) given by partisans.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-3073723246887280718?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/3073723246887280718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=3073723246887280718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/3073723246887280718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/3073723246887280718'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/10/economic-crisis-explained-sort-of.html' title='The economic crisis explained. (sort of)'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5788404494749904339</id><published>2008-08-28T18:43:00.002-07:00</published><updated>2009-03-16T12:51:03.773-07:00</updated><title type='text'>Poe's Law Strikes Again</title><content type='html'>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;. Turns out &lt;a href="http://www.davidmays.com/blog/?postid=30"&gt;it is photoshopped&lt;/a&gt;, as I had hoped.&lt;/p&gt;

&lt;p&gt;I have a problem.&lt;/p&gt;

 &lt;p&gt;I often can&amp;#8217;t determine whether something is satire. I always want to believe that it is parody, that it&amp;#8217;s all a joke, that nobody is really &lt;em&gt;that&lt;/em&gt; stupid.&lt;/p&gt;

 &lt;p&gt;The technical term for this is &lt;a href="http://rationalwiki.com/wiki/Poe's_Law"&gt;Poe&amp;#8217;s Law&lt;/a&gt;, and I am always falling prey to it.&lt;/p&gt;

 &lt;p&gt;For instance, look at &lt;a href="http://buzzfeed.com/nickdouglas/fox-obama-biden-osama-bin-laden-coincidence-t"&gt;this picture&lt;/a&gt; on the Obama-Osama connection. Did Fox News &lt;em&gt;really&lt;/em&gt; run the byline &amp;#8220;Obama / Biden. Osama Bin Laden. Coincidence?&amp;#8221; It &lt;strong&gt;must&lt;/strong&gt; be photoshopped, right? Surely nobody would be so insane as to imply that a similarity in spelling or phonetics implies similarity in character or policy, right? Right?&lt;/p&gt;

 &lt;p&gt;I just can&amp;#8217;t tell. I tried to find that clip on Youtube, on the grounds that it would be more difficult to forge, with no success. My irrational desire to believe that no-one would stoop to that kind of &lt;em&gt;non sequitur&lt;/em&gt; drives me to hope that it&amp;#8217;s fake.&lt;/p&gt;

 &lt;p&gt;But things like the Jack Chick tract &lt;a href="http://www.chick.com/reading/tracts/1047/1047_01.asp"&gt;First Bite&lt;/a&gt; (via &lt;a href="http://atheistagogo.wordpress.com/2008/08/28/its-pronounced-ay-gor/"&gt;Atheist A Go-Go&lt;/a&gt;), which I&amp;#8217;m certain is not satirical, lead me to believe that my unwillingness to accept something as real simply because it&amp;#8217;s absolutely insane is (sadly) not based in reality.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5788404494749904339?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5788404494749904339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5788404494749904339' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5788404494749904339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5788404494749904339'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/08/poes-law-strikes-again.html' title='Poe&apos;s Law Strikes Again'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-4205803430623713638</id><published>2008-08-12T18:07:00.001-07:00</published><updated>2008-08-12T18:09:46.214-07:00</updated><title type='text'>Vote for me</title><content type='html'>&lt;OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="384" HEIGHT="304"&gt;&lt;PARAM NAME=movie VALUE="http://www.paltalk.com/marketing/media/vanksen/main.swf"&gt;&lt;PARAM NAME=quality VALUE=high&gt;&lt;PARAM NAME=flashvars VALUE="firstname=Jason&amp;lastname=Creighton&amp;urlfin=http%3A%2F%2Fwww.news3online.com%2Fspread.php"&gt;&lt;PARAM NAME="BGCOLOR" VALUE="#000000" /&gt;&lt;PARAM NAME="allowScriptAccess" VALUE="always" /&gt;&lt;EMBED src="http://www.paltalk.com/marketing/media/vanksen/main.swf" quality=high WIDTH="384" HEIGHT="304"  ALIGN="" TYPE="application/x-shockwave-flash" FLASHVARS="firstname=Jason&amp;lastname=Creighton&amp;urlfin=http%3A%2F%2Fwww.news3online.com%2Fspread.php" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" BGCOLOR="#000000" ALLOWSCRIPTACCESS="ALWAYS"&gt;&lt;/EMBED&gt;&lt;/OBJECT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-4205803430623713638?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/4205803430623713638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=4205803430623713638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4205803430623713638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4205803430623713638'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/08/vote-for-me.html' title='Vote for me'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5906885379851829371</id><published>2008-08-03T10:43:00.004-07:00</published><updated>2008-08-03T10:46:31.135-07:00</updated><title type='text'>Screenshot walkthroughs of common applications</title><content type='html'>&lt;p&gt;I just wanted to let everybody know about &lt;a href="http://www.chasms.com/"&gt;a site which features screenshot walk-through of common applications&lt;/a&gt;. If you've ever helped anyone over the phone to configure some piece of software, you'll realize how incredibly useful this is.&lt;/p&gt;

&lt;p&gt;If you've never helped anyone configure software over the phone, I envy you.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5906885379851829371?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5906885379851829371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5906885379851829371' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5906885379851829371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5906885379851829371'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/08/screenshot-walkthroughs-of-common.html' title='Screenshot walkthroughs of common applications'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-964271838423414997</id><published>2008-08-02T18:32:00.003-07:00</published><updated>2008-08-02T18:37:05.656-07:00</updated><title type='text'>Were Jesus's Apostles Martyred?</title><content type='html'>&lt;p&gt;I&amp;#8217;ve often heard the argument used that the apostles of Jesus were killed for their beliefs, so they couldn&amp;#8217;t have been lying about Jesus. (And, by implication, weren&amp;#8217;t mistaken either.) I&amp;#8217;m not going to discuss the validity of the argument, I just want to examine the question of whether or not we have good reason to accept these accounts of martyrdom as being historical rather than apocryphal church tradition.&lt;/p&gt;

 &lt;p&gt;Indeed, two of the sources I found seemed to issue disclaimers to that effect. In an article entitled &lt;a href="http://www.about-jesus.org/martyrs.htm"&gt;What Happened to the Apostles?&lt;/a&gt;, &lt;a href="http://www.about-jesus.org/"&gt;about-jesus.org&lt;/a&gt; says:&lt;/p&gt;

 &lt;blockquote&gt;
  &lt;p&gt;It should be understood that these non-Biblical sources might vary greatly in terms of their accuracy. It should also be understood that it is clear from the Bible and from non-Biblical sources that many early Christians were persecuted and martyred for their beliefs.&lt;/p&gt;
 &lt;/blockquote&gt;

 &lt;p&gt;Another article, &lt;a href="http://www.ianpaisley.org/article.asp?apostles.htm"&gt;The History of the Early Christian Martyrs&lt;/a&gt; warns &amp;#8220;It should be understood that the accounts of the martyrdoms of apostles are mainly traditional.&amp;#8221;. I don&amp;#8217;t know quite what to make of that, other than to understand &amp;#8220;traditional&amp;#8221; to mean &amp;#8220;probably made up&amp;#8221;, although perhaps my interpretation is overly uncharitable.&lt;/p&gt;

 &lt;p&gt;So here&amp;#8217;s my list of early Christian martyrs with how they died and the source I used. I&amp;#8217;ve included Stephen plus the 10 apostles who are believed to have been martyred. Not included are the 2 other apostles: John, who is traditionally held to have had a natural death, and Judas, who either &lt;a href="http://www.biblegateway.com/passage/?search=Matthew 27:1-10;&amp;version=31"&gt;hung himself&lt;/a&gt;  or &lt;a href="http://www.biblegateway.com/passage/?search=Acts 1:18-19;&amp;version=31"&gt;had his guts spill out&lt;/a&gt;, depending on who you ask.&lt;/p&gt;

 &lt;table&gt;
  &lt;tr&gt;
   &lt;th&gt;Name &lt;/th&gt;
   &lt;th&gt;Cause of Death &lt;/th&gt;
   &lt;th&gt;Source&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Stephen&lt;/td&gt;
   &lt;td&gt;Stoned&lt;/td&gt;
   &lt;td&gt;Acts 7:54-60&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;James, son of Zebedee (&amp;#8220;James the Greater&amp;#8221;)&lt;/td&gt;
   &lt;td&gt;Sword&lt;/td&gt;
   &lt;td&gt;Acts 12:1-2&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Bartholomew&lt;/td&gt;
   &lt;td&gt;Beaten, then crucified&lt;/td&gt;
   &lt;td&gt;&lt;a href="http://home.newadvent.org/fathers/0825.htm"&gt;Martyrdom of Bartholomew&lt;/a&gt; (also Foxe)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;James, son of Alphaeus (&amp;#8220;James the Less&amp;#8221;)&lt;/td&gt;
   &lt;td&gt;Beaten, stoned and clubbed&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Andrew&lt;/td&gt;
   &lt;td&gt;Crucified&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Peter&lt;/td&gt;
   &lt;td&gt;Crucified&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Thomas&lt;/td&gt;
   &lt;td&gt;Spear&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Phillip&lt;/td&gt;
   &lt;td&gt;Crucified&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Matthew&lt;/td&gt;
   &lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Halberd"&gt;Halberd&lt;/a&gt; (type of spear)&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Thaddeus (Jude)&lt;/td&gt;
   &lt;td&gt;Crucified&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Simon&lt;/td&gt;
   &lt;td&gt;Crucified&lt;/td&gt;
   &lt;td&gt;Foxe&amp;#8217;s Book of Martyrs&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/table&gt;

 &lt;p&gt;The most interesting source is for the martyrdom of Bartholomew, which, while found in Foxe&amp;#8217;s Book of Martyrs, is also found in a text entitled (appropriately enough) &lt;a href="http://home.newadvent.org/fathers/0825.htm"&gt;The Martyrdom of Bartholomew&lt;/a&gt; It should be noted that is it clearly a religiously motivated work, with appearances of angels, demons, people getting strangled by demons, and so on.  But other than that simple, self-evident fact, I was unable to track down any useful information about this text, such as when it was written and who wrote it.&lt;/p&gt;

 &lt;p&gt;But it seems that the main source for this sort of thing is Foxe&amp;#8217;s Book of Martyrs, which was written by John Foxe and published in 1563.  All the apostles are found in the &lt;a href="http://www.sacred-texts.com/chr/martyrs/fox101.htm"&gt;first chapter&lt;/a&gt; but it doesn&amp;#8217;t say what sources Foxe used (nor did I expect it to), although I suspect that they were probably the same sort of non-canonical texts like the &amp;#8220;The Martyrdom of Bartholomew&amp;#8221;.&lt;/p&gt;

 &lt;p&gt;To conclude, given the (lack of) evidence that I have seen, and the doubts expressed by friendly sources, I think that there is not sufficient evidence to prove the historicity of the apostles being martyred, although I don&amp;#8217;t place a huge amount of confidence in this result because I am not Biblical scholar and am not terribly familiar with these sorts of texts. If anyone knows of any better/earlier sources that the ones listed here, please let me know.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-964271838423414997?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/964271838423414997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=964271838423414997' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/964271838423414997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/964271838423414997'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/08/were-jesuss-apostles-martyred.html' title='Were Jesus&apos;s Apostles Martyred?'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-7807565113103778263</id><published>2008-07-08T16:49:00.003-07:00</published><updated>2008-07-08T17:00:38.937-07:00</updated><title type='text'>Music of the spheres</title><content type='html'>&lt;p&gt;I just have two quick tidbits of astronomy related goodness I wanted to share.&lt;/p&gt;

&lt;p&gt;The first is &lt;a href="http://www.astronomycast.com/"&gt;Astronomy Cast&lt;/a&gt;, a weekly podcast featuring astronomy-related topics. Black holes, missions to mars, tidal forces, the end of the universe, wave/particle duality and other fun stuff. The hosts, Fraser Cain and &lt;a href="http://www.starstryder.com/"&gt;Dr. Pamela Gay&lt;/a&gt; clearly love astronomy and it comes through in the show.&lt;/p&gt;

&lt;p&gt;The other is &lt;a href="http://orbit.medphys.ucl.ac.uk/"&gt;orbiter&lt;/a&gt;, a free space flight simulator. It features real and fictional spacecraft with realistic physics: No warp drives here. If you want to go to the moon, you have to take the time to learn about how orbital dynamics and transfer orbits work, which is half the fun. The learning curve is very steep, so be sure to grab the free &lt;a href="http://www.migman.com/orbiter/orbiter.htm"&gt;Go Play in Space&lt;/a&gt; e-book as well.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-7807565113103778263?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/7807565113103778263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=7807565113103778263' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7807565113103778263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/7807565113103778263'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/07/music-of-spheres.html' title='Music of the spheres'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-8115235452856123657</id><published>2008-05-11T15:12:00.003-07:00</published><updated>2008-05-11T15:43:29.355-07:00</updated><title type='text'>Pseudoscience Kills</title><content type='html'>&lt;p&gt;In the last couple days, I've been reading about the wonderful world of HIV denial, whose proponents state that either HIV doesn't exist or that HIV doesn't cause AIDS. This is, of course, dead wrong. If you're interested in how we know this, &lt;a href="http://avert.org/"&gt;avert.org&lt;/a&gt; has a nice summary of the data, "&lt;a href="http://www.avert.org/evidence.htm"&gt;Evidence that HIV causes AIDS&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;And then I ran across the sad, tragic and depressing story of how &lt;a href="http://aetiology.blogspot.com/2005/09/tragic-story-puts-face-on-hiv-denial.html"&gt;HIV denier Christine Maggiore's 3 year old daughter died of AIDS-related pneumonia&lt;/a&gt;. Mrs. Maggiore is HIV-positive and has written and self-published a book entitled "What if everything you thought you knew about AIDS was wrong?". And as predicted by &lt;a href="http://en.wikipedia.org/wiki/Dissonance_theory"&gt;dissonance theory&lt;/a&gt;, Mrs. Maggiore still holds to the view that HIV doesn't cause AIDS. How could she do otherwise? To change her mind now would be to admit to herself and to the world, not only that she's been wrong about HIV all along but also that she is at least partially responsible for the death of her child. It's a terrible thing to face up to, and I doubt that I would have the strength to do so if I was in her shoes.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-style: italic;"&gt;This&lt;/span&gt; is why science, skepticism and open-minded examination of the evidence is so important: Because beliefs have consequences. When we examine the validity of claims like "HIV causes AIDS", we're playing for all the marbles. Reaching the correct answer really does matter.&lt;/p&gt;

&lt;p&gt;Pseudoscience kills.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-8115235452856123657?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://aetiology.blogspot.com/2005/09/tragic-story-puts-face-on-hiv-denial.html' title='Pseudoscience Kills'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/8115235452856123657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=8115235452856123657' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8115235452856123657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8115235452856123657'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/05/pseudoscience-kills.html' title='Pseudoscience Kills'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-1625257500411370234</id><published>2008-04-15T18:58:00.003-07:00</published><updated>2008-04-15T19:22:57.329-07:00</updated><title type='text'>Scott Adams gets it wrong</title><content type='html'>&lt;p&gt;Scott Adams, creator of Dilbert, makes up funny sounding BS for a living. Not a bad job, if you can get it. But sometimes he get carried away on his blog. He &lt;a href="http://dilbertblog.typepad.com/the_dilbert_blog/2008/04/monte-hall-prob.html"&gt;describes the Monty Hall Problem thusly&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The set up is this. Game show host Monte [sic] Hall offers you three doors. One has a car behind it, which will be your prize if you guess that door. The other two doors have goats. In other words, you have a 1/3 chance of getting the car.&lt;/p&gt;

&lt;p&gt;You pick a door, but before it is opened to reveal what is behind it, Monte opens one of the doors you did NOT choose, which he knows has a goat behind it. And he asks if you want to stick with your first choice or move to the other closed door. One of those two doors has a car behind it. Monte knows which one but you don’t.&lt;/p&gt;

&lt;p&gt;The trick here is that most people assume it makes no difference if they stick with their original choice or move to the other door. They believe the odds are 50% either way, since there are only two choices and you don’t know anything about either choice. But mathematicians say that is wrong. You substantially increase your odds by switching doors.&lt;/p&gt;

&lt;p&gt;That is interesting enough on its own. (I’ll give a link later that explains the math of it.) But here is the freaky part. &lt;strong&gt;You only improve your odds by switching doors if Monte Hall knows what is behind each door. If he simply got lucky and opened a door with a goat behind it, your odds are unchanged. In other words, your odds are changed by Monte’s knowledge, and your knowledge that Monte has that knowledge.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If reality were objective, statistics wouldn’t be influenced by knowledge. That means your world is either partly created by your mind, or you are a hologram created by some other mind, and there are a few bugs in the software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Emphasis mine)&lt;/p&gt;

&lt;p&gt;Nope, sorry, wrong. The odds do &lt;strong&gt;not&lt;/strong&gt; change based on Monty's knowledge. Let's do the math, and for simplicity, let's assume that &lt;strong&gt;you picked door #1 initially&lt;/strong&gt; and that, in each case, Monty "got lucky" and opened a door with a goat behind it without knowing beforehand:&lt;/p&gt;

&lt;table cellpadding="4"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;Door #1&lt;/th&gt;
&lt;th&gt;Door #2&lt;/th&gt;
&lt;th&gt;Door #3&lt;/th&gt;
&lt;th&gt;No Switch Result&lt;/th&gt;
&lt;th&gt;Switch Result&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Goat&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Car&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;If you happened to pick the car initially (1/3 chance), switching to the other (unopened) door causes you to lose. In the other two cases, when you picked a goat initially, switching causes you to win. &lt;strong&gt;There is no difference in the odds between Monty choosing a door with a goat behind because he knew there was a goat there or because he got lucky.&lt;/strong&gt; As long as you know that Monty will always open a door, and that the door that he opens is a goat, (either through luck or foreknowledge) you should switch. The odds would be different, if, for example, Monty only &lt;strong&gt;offered&lt;/strong&gt; a chance to switch if the player initially picked the car, thus rendering the switch-strategy a lose-only proposition.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-1625257500411370234?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/1625257500411370234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=1625257500411370234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/1625257500411370234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/1625257500411370234'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/04/scott-adams-gets-it-wrong.html' title='Scott Adams gets it wrong'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-425861586752946130</id><published>2008-03-22T11:59:00.003-07:00</published><updated>2008-03-22T12:01:12.971-07:00</updated><title type='text'>LabelParrot.com - Print PDF mailing labels</title><content type='html'>Hey, I just launched my "toy" Ruby on Rails app: &lt;a href="http://www.labelparrot.com"&gt;LabelParrot.com&lt;/a&gt;, a site that lets you upload a CSV and generate PDF mailing labels for common Avery mailing label layouts. Please let me know if you find it useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-425861586752946130?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/425861586752946130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=425861586752946130' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/425861586752946130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/425861586752946130'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2008/03/labelparrotcom-print-pdf-mailing-labels.html' title='LabelParrot.com - Print PDF mailing labels'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-2350476754327060116</id><published>2007-04-15T21:56:00.000-07:00</published><updated>2007-04-15T21:58:35.058-07:00</updated><title type='text'>Can justin.tv scale?</title><content type='html'>&lt;p&gt;Can &lt;a href="http://www.justin.tv"&gt;justin.tv&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Justin.tv"&gt;wikipedia
article&lt;/a&gt;) scale?&lt;/p&gt;


 &lt;p&gt;I don't mean "can their website scale?". I mean, "Could everybody do this?" 
Could everybody walk around with live, 24/7 camera feeds of their life? They
call it "lifecasting", as if it's something that's common, something that
people do. But it's not: It's just a publicity stunt.&lt;/p&gt;


 &lt;p&gt;Right?&lt;/p&gt;


 &lt;p&gt;Run with me for a minute: Suppose this was refined to the point where you
didn't have a lug a backpack full of batteries around; Suppose you had a small,
lightweight camera that you wore all (or nearly all) the time that Just Worked.
And suppose that everybody did it. I mean everybody. Think about that for a
second.&lt;/p&gt;


 &lt;p&gt;What would it be like? I have this picture in my head: Some friends hanging out
in a coffee shop, with a laptop watching other group of people across town. Who
are also at a laptop, watching them, watching them. If you follow me.&lt;/p&gt;


 &lt;p&gt;I imagine nobody being able to get away with anything: Somebody, somewhere was
recording the stream. There would probably be a rolling backup of, oh, the last
week or so that you could permanently save snippets from. If every important
event in your life was recorded from multiple points of view, funerals would
probably become tastefully done video presentations. Probably weddings too:
None of this nonsense about &lt;strong&gt;remembering&lt;/strong&gt; the first thing you said when you
first met when we can play the genuine article on the big screen.&lt;/p&gt;


 &lt;p&gt;It's not gonna happen, of course, at least not to that extent. Calling it
"lifecasting" as if it's going to become an established practice is, in my
opinion, mere hyperbole. Not many people are going to willing turn their lives
into &lt;a href="http://en.wikipedia.org/wiki/The_Truman_Show"&gt;The Truman Show&lt;/a&gt; just yet.
But it's kinda fun to think about.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-2350476754327060116?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/2350476754327060116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=2350476754327060116' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2350476754327060116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2350476754327060116'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2007/04/can-justintv-scale.html' title='Can justin.tv scale?'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-4385058346538953540</id><published>2007-02-04T19:00:00.000-07:00</published><updated>2007-02-04T20:00:09.820-07:00</updated><title type='text'>Many color laser printers embed hidden tracking information</title><content type='html'>&lt;p&gt;It turns out that &lt;a href="http://www.eff.org/Privacy/printers/"&gt;many color laser printers embed hidden tracking
codes&lt;/a&gt; that could be used to uniquely
identify the printer that was used to print a given page.&lt;/p&gt;


 &lt;p&gt;I did not know this. And I wonder how many people who live under oppressive
governments are in jail because they didn't know it either.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-4385058346538953540?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/4385058346538953540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=4385058346538953540' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4385058346538953540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/4385058346538953540'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2007/02/many-color-laser-printers-embed-hidden.html' title='Many color laser printers embed hidden tracking information'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-8118995856540105090</id><published>2007-01-29T21:13:00.000-07:00</published><updated>2007-01-29T21:17:29.729-07:00</updated><title type='text'>Firefly Parody: "Mosquito"</title><content type='html'>&lt;p&gt;If you're a fan of Joss Whedon's short-lived, cult classic TV series &lt;a href="http://en.wikipedia.org/wiki/Firefly_%28TV_series%29"&gt;Firefly&lt;/a&gt;, you have to watch this parody video on YouTube: &lt;a href="http://www.youtube.com/watch?v=puUsMYcI74g"&gt;Mosquito&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-8118995856540105090?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=puUsMYcI74g' title='Firefly Parody: &quot;Mosquito&quot;'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/8118995856540105090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=8118995856540105090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8118995856540105090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/8118995856540105090'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2007/01/firefly-parody-mosquito.html' title='Firefly Parody: &quot;Mosquito&quot;'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5157333583670458570</id><published>2007-01-19T17:41:00.000-07:00</published><updated>2007-01-19T17:48:22.707-07:00</updated><title type='text'>Eric on Boundries</title><content type='html'>&lt;p&gt;Eric Sink over at &lt;a href="http://software.ericsink.com/index.html"&gt;Eric.Weblog()&lt;/a&gt; has some &lt;a href="http://software.ericsink.com/articles/Boundaries.html"&gt;interesting thoughts on boundries&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5157333583670458570?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://software.ericsink.com/articles/Boundaries.html' title='Eric on Boundries'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5157333583670458570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5157333583670458570' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5157333583670458570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5157333583670458570'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2007/01/eric-on-boundries.html' title='Eric on Boundries'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-969247616963598941</id><published>2006-12-31T17:20:00.000-07:00</published><updated>2006-12-31T19:33:32.841-07:00</updated><title type='text'>A simple regex engine in Haskell</title><content type='html'>&lt;p&gt;UPDATE: sorear from #haskell pasted a cool version of this &lt;a href="http://paste.lisp.org/display/33797#1"&gt;here&lt;/a&gt;. His version is a Parsec Parser that &lt;em&gt;returns another Parsec Parser!&lt;/em&gt; How cool is that? His version doesn't actually return the matches themselves, just a Bool, but still, it's a clever hack.&lt;/p&gt;

&lt;p&gt;I recently wrote a simple regex engine (and parser) in Haskell. The
implementation is far from optimal, but I'm still pretty excited about how easy
it was, especially the parser. Thanks to psykotic for the inspiration: Without
his &lt;a href="http://paste.lisp.org/display/24849"&gt;regex engine in 14 lines of Python&lt;/a&gt; as
an example, I probably wouldn't have tried something like this.&lt;/p&gt;

 &lt;p&gt;I'm going to walk over the implementation and give examples. The impatient can
skip down to the end to see the full source.&lt;/p&gt;


&lt;pre&gt;
import Text.ParserCombinators.Parsec

data Match = MkMatch String String deriving (Show, Eq)

type Matcher = Match -&amp;gt; [Match]
&lt;/pre&gt;

 &lt;p&gt;We'll need Text.ParserCombinators.Parsec later. The "Match" datatype has a
single constructor, "MkMatch" (The constructor could have simply been called
"Match", but I found that confusing), which takes two strings: The first string
is the part of the text that matched, and the second string is the remainder.
And the "Matcher" type synonym is for pretty type signatures. Armed with these
types, we can write a function that matches (or does not match) a single
character:&lt;/p&gt;


&lt;pre&gt;
matchOne :: (Char -&amp;gt; Bool) -&amp;gt; Matcher
matchOne _ (MkMatch _ "") = []
matchOne f (MkMatch xs (y:ys))
  | f y = [MkMatch (xs ++ [y]) ys]
  | otherwise = []
&lt;/pre&gt;

 &lt;p&gt;matchOne takes a predicate function and returns a Matcher. We can use it like so:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; matchOne (=='x') (MkMatch "" "xyz")
[MkMatch "x" "yz"]
&lt;/pre&gt;

 &lt;p&gt;That works fine to just match one thing, but it's hard to chain things together.
We can take advantage of the fact that Haskell's built-in list datatype is a
monad:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" "xyz"] &amp;gt;&amp;gt;= matchOne (=='x')          
[MkMatch "x" "yz"]
*Main&amp;gt; [MkMatch "" "xyz"] &amp;gt;&amp;gt;= matchOne (=='x') &amp;gt;&amp;gt;= matchOne (=='y') &amp;gt;&amp;gt;= matchOne (=='z')
[MkMatch "xyz" ""]
*Main&amp;gt; [MkMatch "" "xyz"] &amp;gt;&amp;gt;= matchOne (=='x') &amp;gt;&amp;gt;= matchOne (=='y') &amp;gt;&amp;gt;= matchOne (=='z') &amp;gt;&amp;gt;= matchOne (=='a')
[]
&lt;/pre&gt;

 &lt;p&gt;Saying &lt;code&gt;=='x'&lt;/code&gt; all the time is tedious:&lt;/p&gt;


&lt;pre&gt;
rechar :: Char -&amp;gt; Matcher
rechar c = matchOne (==c)
&lt;/pre&gt;

 &lt;p&gt;Example:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" "xyz"] &amp;gt;&amp;gt;= rechar 'x' &amp;gt;&amp;gt;= rechar 'y' &amp;gt;&amp;gt;= rechar 'z'                                       
[MkMatch "xyz" ""]
&lt;/pre&gt;

 &lt;p&gt;Now that we have matchOne, it's trivial to define the . regex metacharacter:&lt;/p&gt;


&lt;pre&gt;
dot :: Matcher
dot = matchOne (const True)
&lt;/pre&gt;

 &lt;p&gt;"dot" is a Matcher that always matches one character. Matching single characters
is all fine and dandy, but it's about time we had some more interesting way of
combinding Matchers. Here is a simple (and wrong) implementation of the *
quantifier:&lt;/p&gt;


&lt;pre&gt;
badstar :: Matcher -&amp;gt; Matcher
badstar f x = (f x &amp;gt;&amp;gt;= badstar f) ++ [x]
&lt;/pre&gt;

 &lt;p&gt;It seems to work fine for simple cases:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" "xxx123"] &amp;gt;&amp;gt;= badstar (rechar 'x')
[MkMatch "xxx" "123",MkMatch "xx" "x123",MkMatch "x" "xx123",MkMatch "" "xxx123"]
&lt;/pre&gt;

 &lt;p&gt;Notice how it returns &lt;strong&gt;all&lt;/strong&gt; the matches, not just the first one. Pretty cool, eh?&lt;/p&gt;


 &lt;p&gt;But consider this (even simpler) case:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" ""] &amp;gt;&amp;gt;= badstar (rechar 'x')
[MkMatch "" ""]
&lt;/pre&gt;

 &lt;p&gt;No real surprise here: * means "zero or more, as many as possible". So we're
just seeing a zero-width match. No problem, right? Wrong. Look at this:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" ""] &amp;gt;&amp;gt;= badstar (badstar (rechar 'x'))
*** Exception: stack overflow
&lt;/pre&gt;

 &lt;p&gt;Non-termination rears its ugly head. The problem with badstar is that whatever
we're trying to match zero or more of &lt;em&gt;might also&lt;/em&gt; have a zero-width match. In
other words, in &lt;code&gt;f x &amp;gt;&amp;gt;= badstar f&lt;/code&gt;, the list returned by &lt;code&gt;f
x&lt;/code&gt; may contain &lt;code&gt;x&lt;/code&gt;! This leads to infinite recursion. My
solution is to simply filter &lt;code&gt;x&lt;/code&gt; out of &lt;code&gt;f x&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;
star :: Matcher -&amp;gt; Matcher
star f x = (filter (/=x) (f x) &amp;gt;&amp;gt;= star f) ++ [x]
&lt;/pre&gt;

 &lt;p&gt;Which works how we want it to:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" ""] &amp;gt;&amp;gt;= star (star (rechar 'x'))
[MkMatch "" ""]
*Main&amp;gt; [MkMatch "" "xx"] &amp;gt;&amp;gt;= star (star (rechar 'x'))
[MkMatch "xx" "",MkMatch "xx" "",MkMatch "x" "x",MkMatch "" "xx"]
&lt;/pre&gt;

 &lt;p&gt;However, I am not 100% sure that this solution covers every case. If anybody has
any insight on this, I'd love to hear it.&lt;/p&gt;


 &lt;p&gt;Moving along, we can write combinators for alteration and sequencing:&lt;/p&gt;


&lt;pre&gt;
alt :: [Matcher] -&amp;gt; Matcher
alt fs x = concatMap ($ x) fs

ordered :: [Matcher] -&amp;gt; Matcher
ordered fs x = foldl (&amp;gt;&amp;gt;=) [x] fs
&lt;/pre&gt;

 &lt;p&gt;alt and ordered both "reduce" a list of Matchers to a single Matcher. Remember
that Matcher is just &lt;code&gt;Match -&amp;gt; [Match]&lt;/code&gt;, so we can do &lt;code&gt;concatMap ($ x)
fs&lt;/code&gt; with no problem.&lt;/p&gt;


 &lt;p&gt;It seems like &lt;code&gt;ordered&lt;/code&gt; is probably a builtin function somewhere, but
I couldn't find a standard equivalent.&lt;/p&gt;


 &lt;p&gt;Now we can write, for example, c(a|d)*r&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; [MkMatch "" "caddr"] &amp;gt;&amp;gt;= ordered [ rechar 'c', star (alt [ rechar 'a', rechar 'd' ]), rechar 'r' ]
[MkMatch "caddr" ""]
&lt;/pre&gt;

 &lt;p&gt;Rounding out our metacharacters are + and ?&lt;/p&gt;


&lt;pre&gt;
plus :: Matcher -&amp;gt; Matcher
plus f = ordered [ f, star f ]

reoptional :: Matcher -&amp;gt; Matcher
reoptional f = alt [ f, return ]
&lt;/pre&gt;

 &lt;p&gt;And that's the basic engine. It's not very good: It use backtracking, but
doesn't support any of the fun features (eg, backreferences) that a backtracking
regex engine is supposed to have. I haven't done any benchmarks or profiling,
but I doubt it's very fast. Also, there's not any sort of anchoring: everything
has to match at the beginning the of string. But none of that matters: It's just
a toy for me to learn about backtracking.&lt;/p&gt;


 &lt;p&gt;Now for the parser:&lt;/p&gt;


&lt;pre&gt;
literalchar :: Parser Char
literalchar = letter &amp;lt;|&amp;gt; digit &amp;lt;|&amp;gt; oneOf " ,-_;:'\"" 

parseregex :: Parser Matcher
parseregex = do
  xs &amp;lt;- sepBy1 (many1 atomWithMod) (char '|')
  return (alt (map ordered xs))

parsechar :: Parser Matcher
parsechar = literalchar &amp;gt;&amp;gt;= (return . rechar)

atomWithMod :: Parser Matcher
atomWithMod = do
  a &amp;lt;- atom
  choice (map (\(c, f) -&amp;gt; char c &amp;gt;&amp;gt; return (f a)) mods) &amp;lt;|&amp;gt; return a
  where
    mods = [('+', plus), ('*', star), ('?', reoptional)]

atom :: Parser Matcher
atom = subexpression &amp;lt;|&amp;gt; charclass &amp;lt;|&amp;gt; wildcard &amp;lt;|&amp;gt; parsechar

subexpression :: Parser Matcher
subexpression = do
  char '('
  expr &amp;lt;- parseregex
  char ')'
  return expr 

charclass :: Parser Matcher
charclass = do
  char '['
  xs &amp;lt;- many1 ((try range) &amp;lt;|&amp;gt; parsechar)
  char ']'
  return (alt xs)

range :: Parser Matcher
range = do
  from &amp;lt;- literalchar
  char '-'
  to &amp;lt;- literalchar
  return (matchOne (`elem` [from..to]))

wildcard :: Parser Matcher
wildcard = char '.' &amp;gt;&amp;gt; return dot

matches :: String -&amp;gt; String -&amp;gt; [Match]
matches re str = [MkMatch "" str] &amp;gt;&amp;gt;= (runparser parseregex re)

runparser :: GenParser tok () a -&amp;gt; [tok] -&amp;gt; a
runparser p input = case (parse p "" input) of
  Right x -&amp;gt; x
  Left err -&amp;gt; error (show err)
&lt;/pre&gt;

 &lt;p&gt;I'm not going to talk about the parser very much because it doesn't seem nearly
as interesting. The parser is fairly simple. It supports subexpressions,
character classes, alternation, *, +, and ?. It doesn't support escaping
characters, (ie, "\." to match a literal dot character.) but that would be
fairly easy to add.&lt;/p&gt;


 &lt;p&gt;Some fun using the &lt;code&gt;matches&lt;/code&gt; helper function:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; matches "[0-9]+(,[0-9]+)*" "1,230,058" 
[MkMatch "1,230,058" "",MkMatch "1,230,05" "8",MkMatch "1,230,0" "58",MkMatch "1,230" ",058",MkMatch "1,23" "0,058",MkMatch "1,2" "30,058",MkMatch "1" ",230,058"]
*Main&amp;gt; matches "((great )*grand )?((fa|mo)ther)" "great great grand mother" 
[MkMatch "great great grand mother" ""]
*Main&amp;gt; matches "c[ad]+r" "caddr" 
[MkMatch "caddr" ""]
*Main&amp;gt; matches "(x*)*" "x" 
[MkMatch "x" "",MkMatch "" "x"]
&lt;/pre&gt;

 &lt;p&gt;And that's it. If anybody has any feedback or ideas on how to simplify it, I'd
love to hear them. Oh, and here's the full source:&lt;/p&gt;


&lt;pre&gt;
import Text.ParserCombinators.Parsec

data Match = MkMatch String String deriving (Show, Eq)

type Matcher = Match -&amp;gt; [Match]

matchOne :: (Char -&amp;gt; Bool) -&amp;gt; Matcher
matchOne _ (MkMatch _ "") = []
matchOne f (MkMatch xs (y:ys))
  | f y = [MkMatch (xs ++ [y]) ys]
  | otherwise = []

rechar :: Char -&amp;gt; Matcher
rechar c = matchOne (==c)

dot :: Matcher
dot = matchOne (const True)

badstar :: Matcher -&amp;gt; Matcher
badstar f x = (f x &amp;gt;&amp;gt;= badstar f) ++ [x]

star :: Matcher -&amp;gt; Matcher
star f x = (filter (/=x) (f x) &amp;gt;&amp;gt;= star f) ++ [x]

alt :: [Matcher] -&amp;gt; Matcher
alt fs x = concatMap ($ x) fs

ordered :: [Matcher] -&amp;gt; Matcher
ordered fs x = foldl (&amp;gt;&amp;gt;=) [x] fs

plus :: Matcher -&amp;gt; Matcher
plus f = ordered [ f, star f ]

reoptional :: Matcher -&amp;gt; Matcher
reoptional f = alt [ f, return ]

literalchar :: Parser Char
literalchar = letter &amp;lt;|&amp;gt; digit &amp;lt;|&amp;gt; oneOf " ,-_;:'\"" 

parseregex :: Parser Matcher
parseregex = do
  xs &amp;lt;- sepBy1 (many1 atomWithMod) (char '|')
  return (alt (map ordered xs))

parsechar :: Parser Matcher
parsechar = literalchar &amp;gt;&amp;gt;= (return . rechar)

atomWithMod :: Parser Matcher
atomWithMod = do
  a &amp;lt;- atom
  choice (map (\(c, f) -&amp;gt; char c &amp;gt;&amp;gt; return (f a)) mods) &amp;lt;|&amp;gt; return a
  where
    mods = [('+', plus), ('*', star), ('?', reoptional)]

atom :: Parser Matcher
atom = subexpression &amp;lt;|&amp;gt; charclass &amp;lt;|&amp;gt; wildcard &amp;lt;|&amp;gt; parsechar

subexpression :: Parser Matcher
subexpression = do
  char '('
  expr &amp;lt;- parseregex
  char ')'
  return expr 

charclass :: Parser Matcher
charclass = do
  char '['
  xs &amp;lt;- many1 ((try range) &amp;lt;|&amp;gt; parsechar)
  char ']'
  return (alt xs)

range :: Parser Matcher
range = do
  from &amp;lt;- literalchar
  char '-'
  to &amp;lt;- literalchar
  return (matchOne (`elem` [from..to]))

wildcard :: Parser Matcher
wildcard = char '.' &amp;gt;&amp;gt; return dot

matches :: String -&amp;gt; String -&amp;gt; [Match]
matches re str = [MkMatch "" str] &amp;gt;&amp;gt;= (runparser parseregex re)

runparser :: GenParser tok () a -&amp;gt; [tok] -&amp;gt; a
runparser p input = case (parse p "" input) of
  Right x -&amp;gt; x
  Left err -&amp;gt; error (show err)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-969247616963598941?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/969247616963598941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=969247616963598941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/969247616963598941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/969247616963598941'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/12/simple-regex-engine-in-haskell.html' title='A simple regex engine in Haskell'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-5835564823009542767</id><published>2006-12-12T21:02:00.000-07:00</published><updated>2006-12-12T21:12:36.586-07:00</updated><title type='text'>Fun with bitmaps</title><content type='html'>&lt;p&gt;Paul Potts over at &lt;a href="http://praisecurseandrecurse.blogspot.com/"&gt;Praise, Curse, and
Recurse&lt;/a&gt; has posted an &lt;a href="http://praisecurseandrecurse.blogspot.com/2006/12/dot-matrix-printhead-haskell-toy.html"&gt;interesting
example&lt;/a&gt;
of some of the fun you can have printing out bitmaps. For example:&lt;/p&gt;


&lt;pre&gt;
*Main&amp;gt; putStr $ bitPicture unsignedInts 6
                                ################################
                ################                ################
        ########        ########        ########        ########
    ####    ####    ####    ####    ####    ####    ####    ####
  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
*Main&amp;gt; putStr $ bitPicture signedInts 6
################################                                
                ################                ################
        ########        ########        ########        ########
    ####    ####    ####    ####    ####    ####    ####    ####
  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##  ##
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
*Main&amp;gt; 
&lt;/pre&gt;

 &lt;p&gt;The first example is with the numbers [0..63] (left to right) with the most
significant bit on the first line. (ie, unsigned ints in 6 bits.) The second
example is the with numbers [-32..31] (ie, signed ints in 6 bits.)&lt;/p&gt;


 &lt;p&gt;Paul asked for readers to play around with the code and try to make it more
concise or "Haskellish". I don't know if my stab at it meets those criteria,
but here it is:&lt;/p&gt;


&lt;pre&gt;
import Data.Bits

unsignedInts :: Int -&amp;gt; [Int]
unsignedInts bits = [0..((2^bits) - 1)]

signedInts :: Int -&amp;gt; [Int]
signedInts bits = [-bounds..(bounds - 1)] where bounds = 2^(bits - 1)

boolToChar :: Bool -&amp;gt; Char
boolToChar True = '#'
boolToChar False = ' '

bitPicture :: (Int -&amp;gt; [Int]) -&amp;gt; Int -&amp;gt; [Char]
bitPicture intGen bits = unlines $ map stringAtIndex (reverse [0..(bits-1)])
 where
   stringAtIndex = map boolToChar . bitsAtIndex
   bitsAtIndex idx = [ testBit n idx | n &amp;lt;- intGen bits ]
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5835564823009542767?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5835564823009542767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5835564823009542767' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5835564823009542767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5835564823009542767'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/12/fun-with-bitmaps.html' title='Fun with bitmaps'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-2204150644894190097</id><published>2006-12-10T15:19:00.000-07:00</published><updated>2006-12-10T15:28:51.211-07:00</updated><title type='text'>Verizon Math: 0.002 dollars = 0.002 cents</title><content type='html'>&lt;p&gt;Listen to &lt;a href="http://www.youtube.com/watch?v=Gp0HyxQv97Q"&gt;this painful example&lt;/a&gt; of
someone trying to explain to Verizon that 0.002 dollars and 0.002 cents are
not, in fact, the same. (Link courtesy of &lt;a href="http://scienceblogs.com/goodmath/2006/12/pathetic_but_funny_bad_billing.php"&gt;Good Math, Bad
Math&lt;/a&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-2204150644894190097?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/2204150644894190097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=2204150644894190097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2204150644894190097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/2204150644894190097'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/12/verizon-math-0002-dollars-0002-cents.html' title='Verizon Math: 0.002 dollars = 0.002 cents'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-1529211647212052834</id><published>2006-12-06T09:31:00.000-07:00</published><updated>2006-12-06T09:35:22.658-07:00</updated><title type='text'>Pass-by-reference vs pass-by-value in Coldfusion</title><content type='html'>&lt;p&gt;I keep getting burned by this at work, so I'm going to blog it so I don't forget:&lt;/p&gt;

&lt;blockquote&gt;
Structures, queries, and complex objects such as COM objects are passed to UDFs by reference, so the function uses the same copy of the data as the caller. Arrays are passed to user-defined functions by value, so the function gets a new copy of the array data and the array in the calling page is unchanged by the function. As a result, you must handle arrays differently from all other complex data types.
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="http://livedocs.macromedia.com/coldfusion/7/htmldocs/00001008.htm#1194454"&gt;Coldfusion MX 7 docs&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-1529211647212052834?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://livedocs.macromedia.com/coldfusion/7/htmldocs/00001008.htm#1194454' title='Pass-by-reference vs pass-by-value in Coldfusion'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/1529211647212052834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=1529211647212052834' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/1529211647212052834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/1529211647212052834'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/12/pass-by-reference-vs-pass-by-value-in.html' title='Pass-by-reference vs pass-by-value in Coldfusion'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-5782059147698061190</id><published>2006-11-24T18:57:00.000-07:00</published><updated>2006-11-24T19:04:46.589-07:00</updated><title type='text'>Avoiding skipping audio in Debian etch with a 2.6 kernel</title><content type='html'>&lt;p&gt;I'd had problems with audio skipping whenever I did something that required a
CPU-intensive repaint in X11. Most often, it was switching to and from Firefox.
&lt;a href="http://jlaurila.blogspot.com/2005/07/avoiding-audio-skipping-in-linux-26.html"&gt;Avoiding audio skipping in Linux
2.6&lt;/a&gt;
was right on the money. However, I'm following Debian testing (etch) and the
xserver-common package no longer exists. After a bit of poking around, it
appears that it's been renamed to x11-common, so the magic incantation on etch
is &lt;code&gt;dpkg-reconfigure x11-common&lt;/code&gt; and setting the nice setting to 0.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-5782059147698061190?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/5782059147698061190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=5782059147698061190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5782059147698061190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/5782059147698061190'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/11/avoiding-skipping-audio-in-debian-etch.html' title='Avoiding skipping audio in Debian etch with a 2.6 kernel'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-116328127211122601</id><published>2006-11-11T13:53:00.000-07:00</published><updated>2006-11-11T14:36:58.302-07:00</updated><title type='text'>A Simple RPN Calculator in Haskell</title><content type='html'>&lt;p&gt;Of late I have been playing around with &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;, a
pure functional programming language. Last night I hacked up a quick
&lt;a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation"&gt;RPN&lt;/a&gt; calculator and was
pleasantly surprised at how easy it was. Example usage: (Note that because the
stack is implemented as a list, the top of the stack is the first element of the
list)&lt;/p&gt;


&lt;pre&gt;
&amp;gt; 5 4 *
[20.0]
&amp;gt; 14
[14.0,20.0]
&amp;gt; *
[280.0]
&amp;gt; 2 * 48 -
[512.0]
&amp;gt; log 2 log /
[9.0]
&amp;gt; 2
[2.0,9.0]
&amp;gt; swap
[9.0,2.0]
&amp;gt; **
[512.0]
&amp;gt; 2 * sqrt
[32.0]
&lt;/pre&gt;

 &lt;p&gt;Here's the code:&lt;/p&gt;


&lt;pre&gt;
import Char
import IO

type RPNNumber = Double
type Stack = [RPNNumber]
type Operator = (Stack -&amp;gt; Stack)

parse :: [Char] -&amp;gt; [Operator]
parse = map parseOp . words

binaryOp :: (RPNNumber -&amp;gt; RPNNumber -&amp;gt; RPNNumber) -&amp;gt; Operator
binaryOp f = (\ (a:b:stack) -&amp;gt; f b a : stack)

unaryOp :: (RPNNumber -&amp;gt; RPNNumber) -&amp;gt; Operator
unaryOp f = (\ (a:stack) -&amp;gt; f a : stack)

parseOp :: [Char] -&amp;gt; Operator
parseOp "+" = binaryOp (+)
parseOp "-" = binaryOp (-)
parseOp "*" = binaryOp (*)
parseOp "/" = binaryOp (/)
parseOp "**" = binaryOp (**)
parseOp "log" = unaryOp log
parseOp "sqrt" = unaryOp sqrt
parseOp "dup" = (\ (x:xs) -&amp;gt; x:x:xs)
parseOp "swap" = (\ (a:b:xs) -&amp;gt; b:a:xs)
parseOp "pop" = tail
parseOp number = (\stack -&amp;gt; (read number) : stack)

eval :: Stack -&amp;gt; [Operator] -&amp;gt; Stack
eval = foldl $ flip ($)

repl :: Stack -&amp;gt; IO ()
repl stack = do
  putStr "&amp;gt; " 
  hFlush stdout
  line &amp;lt;- getLine
  newstack &amp;lt;- return $ eval stack (parse line)
  putStrLn $ show newstack
  repl newstack

main = do repl []
&lt;/pre&gt;

 &lt;p&gt;That's only 42 lines of code, 25 without the optional type declarations and
whitespace. The structure is pretty simple: A stack is a list of numbers, an
operator is function that takes a stack and returns a new stack. The "parser" 
just splits a string into words and the maps each of those words to an operator.&lt;/p&gt;


 &lt;p&gt;binaryOp and unaryOp are helper functions that take functions and make them into
operators. parseOp takes a string an returns the appropriate operator. Or, if
its argument isn't recognized as an operator, parseOp assumes that it's a number
and returns an operator that pushs it onto the stack.&lt;/p&gt;


 &lt;p&gt;The only function I'll admit to golfing is the "eval" function.  Originally, I
had it defined as:&lt;/p&gt;


&lt;pre&gt;
eval stack [] = stack
eval stack (f:fs) = eval (f stack) fs
&lt;/pre&gt;

 &lt;p&gt;I kept thinking, "that really looks like a fold". The next step was:&lt;/p&gt;


&lt;pre&gt;
eval = foldl (\stack f = f stack)
&lt;/pre&gt;

 &lt;p&gt;And from there it was simple to realize that all I had to do was flip the
function application operator:&lt;/p&gt;


&lt;pre&gt;
eval = foldl $ flip ($)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-116328127211122601?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/116328127211122601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=116328127211122601' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116328127211122601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116328127211122601'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/11/simple-rpn-calculator-in-haskell.html' title='A Simple RPN Calculator in Haskell'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-116260183169932327</id><published>2006-11-03T17:44:00.000-07:00</published><updated>2006-11-11T14:36:58.231-07:00</updated><title type='text'>Opening a query window quickly in Enterprise Manager</title><content type='html'>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Enterprise_Manager"&gt;Enterprise Manager&lt;/a&gt; has some
&lt;a href="http://tracylogan.com/index.cfm?event=blog.display.one&amp;#38;blogID=9ED47D3C-B345-83D3-6A1DB69C8B4C8BC0"&gt;handy keyboard
shortcuts&lt;/a&gt;,
but I couldn't find any keybindings to quickly open a query window for the
selected table. Enter &lt;a href="http://www.autohotkey.com/"&gt;AutoHotkey&lt;/a&gt;, a free,
featureful keyboard mapping utility for Windows. Here's the stanza to bind
Win+o to open a query window without the useless Diagram and Gird panes and fill in
"WHERE" for me:&lt;/p&gt;

&lt;pre&gt;
; Open a query in enterprise manager
#o::Send {AppsKey}oq^1^2{PgDn}{End}{Enter}WHERE{Space}
&lt;/pre&gt;

 &lt;p&gt;AutoHotkey can do a lot more than simple rebinding, so be sure to check it out
if you have to use Windows for any significant amount of time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-116260183169932327?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/116260183169932327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=116260183169932327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116260183169932327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116260183169932327'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/11/opening-query-window-quickly-in.html' title='Opening a query window quickly in Enterprise Manager'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-116105206575288355</id><published>2006-10-16T19:27:00.000-07:00</published><updated>2006-11-11T15:49:37.882-07:00</updated><title type='text'>Tip: Scrolling in Firefox with your hands on the home row</title><content type='html'>&lt;p&gt;Short Version: You can scroll down in Firefox with the spacebar, and scroll up with shift+spacebar.&lt;/p&gt;    &lt;p&gt;Long Version: This was surprisingly hard to find. I couldn't seem to find a definitive list of default keybindings in Firefox anywhere. I ended having to dig through /usr/share/firefox hoping to find some file that has the default keybindings. Eventually, I found platformHTMLBindings.xml (located at /usr/share/firefox/chrome/toolkit/content/global/platformHTMLBindings.xml on my Debian etch installation and presumably can be overridden somehow in your profile directory.)&lt;/p&gt;    &lt;p&gt;The lines in question are:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;handler event="keypress" key=" " modifiers="shift" command="cmd_scrollPageUp" /&amp;gt;
&amp;lt;handler event="keypress" key=" " command="cmd_scrollPageDown" /&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-116105206575288355?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/116105206575288355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=116105206575288355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116105206575288355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116105206575288355'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/10/tip-scrolling-in-firefox-with-your.html' title='Tip: Scrolling in Firefox with your hands on the home row'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-116011218591921876</id><published>2006-10-05T22:23:00.000-07:00</published><updated>2006-11-11T14:36:58.064-07:00</updated><title type='text'>Unique Snowflakes And Really Big Numbers</title><content type='html'>&lt;p&gt;I've always suspected that the "no two snowflakes are alike" meme is false because of the &lt;a href="http://en.wikipedia.org/wiki/Birthday_Paradox"&gt;Birthday Paradox&lt;/a&gt;. So I decided to do a little research (read: Google) to find out for sure.&lt;/p&gt;    &lt;p&gt;Of course, it all depends on what you mean by "alike." My personal definition would be something like "if you can't differentiate between them with an optical microscope, they're alike."&lt;/p&gt;    &lt;p&gt;So, with that in mind, &lt;strong&gt;are&lt;/strong&gt; any two snowflakes alike?&lt;/p&gt;    &lt;p&gt;What do you mean, an African or European snowflake?&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.its.caltech.edu/~atomic/snowcrystals/alike/alike.htm"&gt;It turns out&lt;/a&gt; that there are several classes of snowflakes. The linked page explains that really small snowflakes (ie, ten molecules or so) are obviously non-unique. In addition, there are simple, smallish snowflakes that pass the optical microscope test. It goes on to assert vaguely that the possible number of large, complex snowflakes is around 100!. (around 10^158). Which is really huge number.&lt;/p&gt;    &lt;p&gt;On the other hand, &lt;a href="http://www.straightdope.com/classics/a3_392.html"&gt;The Straight Dope&lt;/a&gt; uses basically the same argument I had been using: "Lots and lots of snowflakes, gotta be a collision somewhere, right?"&lt;/p&gt;    &lt;p&gt;I'm leaning towards the combinatorial argument though. Here's why: Combinations of items grow really, really fast. Way faster than most people expect. (Well, faster than &lt;em&gt;I&lt;/em&gt; expect, anyway.)&lt;/p&gt;    &lt;p&gt;For instance, the current word size in most desktop computers these days is 32 bits. That means it can hold 2^32 different possible values. (about 4 billion.) If you started counting from one to 2^32 at one number per second, you'd finish in about 136 years.&lt;/p&gt;    &lt;p&gt;But some newer PCs have a 64 bit word size. 2^64 doesn't &lt;strong&gt;seem&lt;/strong&gt; a lot bigger than 2^32, but it is. 2^64 is 2^32 &lt;strong&gt;times&lt;/strong&gt; larger than 2^32. If you tried to count to 2^64, you wouldn't finish before the Sun burned out. If you had 2^64 dollars, and you spent a billion dollars (10^9) a second, it would take 584 years to run out. If you could travel at the speed of light, it would take 314,000 years to go 2^64 miles.&lt;/p&gt;    &lt;p&gt;So 2^64 is a pretty big number. But 2^65 is &lt;strong&gt;twice as large&lt;/strong&gt;. That's hard to me to remember. At some level, I know how it works. I know that n^(m+1) = n * n^m. But I really have to think about it before it hits home.&lt;/p&gt;    &lt;p&gt;And 2^64 is "only" about 10^19. And 100! (about 10^158, remember) is the alleged number of possible snowflakes. Which is, as I said, a really huge. And even if that's off by, say, 60 orders of magnitude, that would still be 10^98, which is more than the number of particles in the known universe.&lt;/p&gt;    &lt;p&gt;And that's why I'm beginning to think that it's possible that no two snowflakes are alike.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-116011218591921876?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/116011218591921876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=116011218591921876' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116011218591921876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/116011218591921876'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/10/unique-snowflakes-and-really-big.html' title='Unique Snowflakes And Really Big Numbers'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-115992557108829498</id><published>2006-10-03T18:28:00.000-07:00</published><updated>2006-11-11T14:36:57.966-07:00</updated><title type='text'>Ruben's Tube: Awesome Physics Experiement</title><content type='html'>&lt;p&gt;You just have to watch &lt;a href="http://www.youtube.com/watch?v=HpovwbPGEoo"&gt;this amazing video&lt;/a&gt; of a &lt;a href="http://www.physics.isu.edu/physdemos/waves/flamtube.htm"&gt;Ruben's Tube&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-115992557108829498?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=HpovwbPGEoo' title='Ruben&apos;s Tube: Awesome Physics Experiement'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/115992557108829498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=115992557108829498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115992557108829498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115992557108829498'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/10/rubens-tube-awesome-physics.html' title='Ruben&apos;s Tube: Awesome Physics Experiement'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-115950585158978807</id><published>2006-09-28T21:57:00.000-07:00</published><updated>2006-11-11T14:36:57.887-07:00</updated><title type='text'>Microsoft Censors MSN Messenger</title><content type='html'>&lt;p&gt;This week I found out that Microsoft silently drops MSN Messenger messages that contain the string "download.php" (Reportedly other strings as well: see the &lt;a href="http://en.wikipedia.org/wiki/MSN_Messenger#Censorship_controversy"&gt;wikipedia article&lt;/a&gt;)&lt;/p&gt;   	&lt;p&gt;Apparently, this is supposed to protect users from scams. That's okay, but the implementation is brain-damaged. You can't turn it off. It doesn't warn the user. It doesn't give any notification. The server just drops your message on the floor.  And it's not some specific, known-bad URLs.  It's anything with "download.php" in it. &lt;strong&gt;Anything&lt;/strong&gt;. Or "gallery.php", "profile.php?", ".pif" or ".scr" according to the linked Wikipedia article.&lt;/p&gt;   	&lt;p&gt;So not only is it a blanket filter, it's keyed to some fairly common strings. There must be millions of sites out there with a page called "download.php". Alas, they are not MSN Messenger Compatible. Just another day at Redmond.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-115950585158978807?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/115950585158978807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=115950585158978807' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115950585158978807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115950585158978807'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/09/microsoft-censors-msn-messenger.html' title='Microsoft Censors MSN Messenger'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-115914280582096672</id><published>2006-09-24T17:06:00.000-07:00</published><updated>2006-11-11T14:36:57.802-07:00</updated><title type='text'>The Graphing Calculator Story</title><content type='html'>&lt;blockquote&gt; 	&lt;p&gt;I used to be a contractor for Apple, working on a secret project. 	Unfortunately, the computer we were building never saw the light of day. 	The project was so plagued by politics and ego that when the engineers 	requested technical oversight, our manager hired a psychologist instead. 	In August 1993, the project was canceled. A year of my work evaporated, 	my contract ended, and I was unemployed.&lt;/p&gt;   	&lt;p&gt;I was frustrated by all the wasted effort, so I decided to uncancel my 	small part of the project. I had been paid to do a job, and I wanted to 	finish it. My electronic badge still opened Apple's doors, so I just 	kept showing up.&lt;/p&gt;  &lt;/blockquote&gt;     	&lt;p&gt;-- &lt;a href="http://www.nucalc.com/Story/"&gt;The Graphing Calculator Story&lt;/a&gt; (Thanks to &lt;a href="http://sigfpe.blogspot.com/2006/09/you-can-fire-me-but-you-cant-stop-me.html"&gt;A Neighborhood Of Infinity&lt;/a&gt; for the link.)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-115914280582096672?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/115914280582096672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=115914280582096672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115914280582096672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115914280582096672'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/09/graphing-calculator-story.html' title='The Graphing Calculator Story'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-115906211284827560</id><published>2006-09-23T18:41:00.000-07:00</published><updated>2006-11-11T14:36:57.693-07:00</updated><title type='text'>Ruby FUD: Abstraction is bad</title><content type='html'>&lt;p&gt;Before I get started, let's get some things out in the open:&lt;/p&gt;    &lt;ul&gt;  &lt;li&gt;I like Ruby.&lt;/li&gt;   &lt;li&gt;I've never used Java.&lt;/li&gt;  &lt;/ul&gt;    &lt;p&gt;So my perspective on Ruby vs. Java is probably limited, and quite possibly wrong. I probably shouldn't say anything at all.&lt;/p&gt;    &lt;p&gt;But when someone posts &lt;a href="http://www.softwarereality.com/soapbox/ruby.jsp"&gt;something like this&lt;/a&gt;, I have to rant about it. He makes some valid points. Basically, he says:&lt;/p&gt;    &lt;ul&gt;  &lt;li&gt;Ruby is slow&lt;/li&gt;   &lt;li&gt;Ruby doesn't have good unicode support&lt;/li&gt;   &lt;li&gt;It's harder to find Ruby programmers than Java programmers&lt;/li&gt;   &lt;li&gt;Java has more libraries, better IDEs, etc.&lt;/li&gt;  &lt;/ul&gt;    &lt;p&gt;All of these are true. Ruby might be Fast Enough for your application, and it might not be. All of those things will probably change to some extent in the future, but &lt;em&gt;right now&lt;/em&gt; they're true.&lt;/p&gt;    &lt;p&gt;That said, I'll now throw off my guise of even-handedness and rip into everything else he said. Well, not &lt;strong&gt;everything&lt;/strong&gt;. Specifically, two things:&lt;/p&gt;   &lt;blockquote&gt; &lt;p&gt;Ruby proponents seem to measure maintainability in lines of  code: the smaller the program, the “cleaner” and more maintainable it is. Check &lt;a href="http://www.martinfowler.com/bliki/Closure.html"&gt;this example&lt;/a&gt; on Martin Fowler’s “bliki”:&lt;/p&gt; &lt;p&gt;C# example:&lt;/p&gt;
&lt;pre&gt;
public static IList  Managers(IList emps) {
  IList result = new  ArrayList();
  foreach(Employee e  in emps)
    if (e.IsManager)  result.Add(e);
  return result;
}
&lt;/pre&gt; &lt;p&gt;... as compared with the equivalent in Ruby:&lt;/p&gt;
&lt;pre&gt;
def managers(emps)
  return emps.select  {|e| e.isManager}
end&lt;/pre&gt;&lt;p&gt;I actually prefer the C# version, as the processing isn’t  hidden away behind some clever syntax. The Ruby version is creating a list and  populating it; you just have to know in advance that that’s what it’s doing.  It’s neat and clever in an academic kind of way, and also kind of fun, but  multiply this example by several thousand, and you end up with a project full  of cryptic code and “implied” things going on behind the clever parser.&lt;/p&gt; &lt;/blockquote&gt;   &lt;p&gt;If I find myself repeated using some pattern in my code, I like to give the pattern a name and disconnect &lt;strong&gt;what&lt;/strong&gt; I'm doing from &lt;strong&gt;how&lt;/strong&gt; I'm doing it. I call this named pattern a "function". I find this allows me to reason about the program on a higher level and be more productive. Kind of a crazy, academic, not-enterprise-ready idea, but I think it might catch on.&lt;/p&gt;    &lt;p&gt;&amp;lt;sarcasm&amp;gt;But for Real Programming in Java, it's just not readable to have "implied" things going on. In fact, the ability to define functions and classes should be removed from Java, since abstraction is such an obstacle to readablity.&amp;lt;/sarcasm&amp;gt;&lt;/p&gt;   &lt;blockquote&gt; &lt;p&gt;As for the closure example, it's nice, but so what? Why not just add closures to Java (&lt;a href="http://gafter.blogspot.com/2006/08/closures-for-java.html"&gt;which is being looked into for the Java 7 release&lt;/a&gt;)? Better that than to throw away all of Java. In the meantime, I'm happy to wait. It's not as if I've &lt;strong&gt;&lt;em&gt;ever&lt;/em&gt;&lt;/strong&gt; felt the lack, but I'm sure closures will be cool when Java gets them.&lt;/p&gt; &lt;/blockquote&gt;   &lt;p&gt;First of all, I cannot imagine &lt;strong&gt;not&lt;/strong&gt; missing closures. At my day job, I am constantly thinking "this would be so easy with first class functions and closures." The only reason I can see for not "ever [feeling] the lack" would be never really having used them.&lt;/p&gt;    &lt;p&gt;Secondly, it's too late to add closures to Java. Sure, you hack them into the language. But every single Java library in the world (Remember? The ones that make Java such a great language to work with?) is writen in a style idiomatic of a language without closures. The cool thing about closures in Ruby is that they've been there from very early on and are used everywhere.&lt;/p&gt;    &lt;p&gt;Okay, I'm done. I've almost certainly not been totally fair, so be sure to read the linked post to get the whole story.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-115906211284827560?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/115906211284827560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=115906211284827560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115906211284827560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115906211284827560'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/09/ruby-fud-abstraction-is-bad.html' title='Ruby FUD: Abstraction is bad'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-115902822943659391</id><published>2006-09-23T08:53:00.000-07:00</published><updated>2006-11-11T14:36:57.598-07:00</updated><title type='text'>Making experts-exchange.com usable</title><content type='html'>&lt;p&gt;I've always wondered how &lt;a href="http://www.experts-exchange"&gt;Experts Exchange&lt;/a&gt; got their PageRank. It seems like every time I search for some problem, their (apparently) useless site is in the results.&lt;/p&gt;

&lt;p&gt;For example, look at this &lt;a href="http://www.experts-exchange.com/Operating_Systems/Linux/Q_21912738.html"&gt;question&lt;/a&gt;. Notice the large "view solution" buttons. Which, of course, asks you to pay to see the "solution". (Which may or may not be the solution, just the rest of the posts in the thread).&lt;/p&gt;

&lt;p&gt;However, if you scroll down to the bottom of the page, past all the ads, the rest of the posts in the thread are visible. What's that? Don't see them? Okay, try this: Delete cookies from experts-exchange.com, and then block cookies from them. Refresh. That's right: It appears that they're using cookies to ensure that you only see the answers &lt;i&gt;once&lt;/i&gt; without paying. This is probably so search engines can find them for better SEO, but normal users have to pay. Whatever the reason, you can get around it by blocking cookies from experts-exchange.com&lt;/p&gt;

&lt;p&gt;As an added bonus, if you have the &lt;a href="http://greasemonkey.mozdev.org/"&gt;Greasemonkey Firefox extension installed&lt;/a&gt;, you can install &lt;a href="http://vlajbert.blogspot.com/2005/06/greasemonkey-experts-exchange.html"&gt;this user script&lt;/a&gt; to remove the large block of ads in the middle of the page.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-115902822943659391?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/115902822943659391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=115902822943659391' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115902822943659391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/115902822943659391'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/09/making-experts-exchangecom-usable.html' title='Making experts-exchange.com usable'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-114999861353705683</id><published>2006-06-10T21:03:00.000-07:00</published><updated>2006-11-11T14:36:57.473-07:00</updated><title type='text'>The end is near</title><content type='html'>&lt;p&gt;Today I learned about a wonderful piece of software called "ClickYes."  I'd like you think about that name for a minute or two. What do you think it does?&lt;/p&gt;   	&lt;p&gt;That's right.&lt;/p&gt;   	&lt;p&gt;It clicks "yes."&lt;/p&gt;   	&lt;p&gt;Seriously. You can read about it &lt;a href="http://www.contextmagic.com/express-clickyes/"&gt;here&lt;/a&gt;. It comes it two versions, "Express" and "Pro". Again, I'm not making this up. Follow the link.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114999861353705683?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114999861353705683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114999861353705683' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114999861353705683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114999861353705683'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/06/end-is-near.html' title='The end is near'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-114533552790128904</id><published>2006-04-17T21:45:00.000-07:00</published><updated>2006-11-11T14:36:57.394-07:00</updated><title type='text'>Godwin's Law as applied to programming</title><content type='html'>&lt;p&gt;&lt;a href="http://www.catb.org/jargon/html/G/Godwins-Law.html"&gt;Godwin's Law&lt;/a&gt; states that "As a Usenet discussion grows longer, the probability of a comparison involving Nazis or Hitler approaches one."&lt;/p&gt;   	&lt;p&gt;Allow me to put forth something similar: "As a Usenet discussion regarding programming language features grows longer, the probability of a comparison involving assembly language or machine code approaches one."&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114533552790128904?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114533552790128904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114533552790128904' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114533552790128904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114533552790128904'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/04/godwins-law-as-applied-to-programming.html' title='Godwin&apos;s Law as applied to programming'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-114228131384046378</id><published>2006-03-13T13:21:00.000-07:00</published><updated>2006-11-11T14:36:57.290-07:00</updated><title type='text'>PHP6 will have goto</title><content type='html'>&lt;p&gt;I know I&amp;#8217;ve been hard on PHP &lt;a href="http://jcreigh.blogspot.com/2005/07/php-pop-quiz.html"&gt;in&lt;/a&gt; &lt;a href="http://jcreigh.blogspot.com/2005/08/php-magic-quotes.html"&gt;the&lt;/a&gt; &lt;a href="http://jcreigh.blogspot.com/2005/08/php-scope-when-requireing.html"&gt;past&lt;/a&gt;,  but it looks like PHP6 is going to be a little better. They&amp;#8217;re going to remove the insanity that is magic_quotes, register_globals and safe_mode. And as a concession to the several billion non-english speaking people in the world, they&amp;#8217;re going to support unicode.&lt;/p&gt;

 &lt;p&gt;Then, for an encore, they&amp;#8217;re going to &lt;a href="http://php.net/~derick/meeting-notes.html#adding-goto"&gt;add goto&lt;/a&gt;. That&amp;#8217;s right. Freaking goto. They could add something that the language really needs, like closures and first class functions. But no. It&amp;#8217;s goto.&lt;/p&gt;

 &lt;p&gt;Don&amp;#8217;t you just love PHP?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114228131384046378?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114228131384046378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114228131384046378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114228131384046378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114228131384046378'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/03/php6-will-have-goto.html' title='PHP6 will have goto'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-114171059341925323</id><published>2006-03-06T22:49:00.000-07:00</published><updated>2006-11-11T14:36:57.203-07:00</updated><title type='text'>A reddit by any other name</title><content type='html'>&lt;p&gt;Is it just me, or do services like &lt;a href="http://del.icio.us"&gt;del.icio.us&lt;/a&gt;, &lt;a href="http://www.reddit.com"&gt;reddit&lt;/a&gt; and &lt;a href="http://www.digg.com"&gt;digg&lt;/a&gt; all seem to carry the some stuff?&lt;/p&gt;   	&lt;p&gt;For instance, a piece called &lt;a href="http://www.cabochon.com/~stevey/blog-rants/tour-de-babel.html"&gt;Tour De Babel&lt;/a&gt; hit the reddit frontpage a couple days ago. Now, if you look at &lt;a href="http://del.icio.us/popular/programming"&gt;del.icio.us/popular/programming&lt;/a&gt;, you see that the aforementioned essay has the top spot.&lt;/p&gt;   	&lt;p&gt;Coincidence? Good thing? Bad thing? I have no idea.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114171059341925323?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114171059341925323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114171059341925323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114171059341925323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114171059341925323'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/03/reddit-by-any-other-name.html' title='A reddit by any other name'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-114151838065281343</id><published>2006-03-04T17:26:00.000-07:00</published><updated>2006-11-11T14:36:57.083-07:00</updated><title type='text'>Donald Knuth on programming as an art</title><content type='html'>&lt;blockquote&gt; Some programs are elegant, some are exquisite, some are sparkling. My claim is that it is possible to write grand programs, noble programs, truly magnificent ones! &lt;/blockquote&gt;  The above paragraph is from &lt;a href="http://www.paulgraham.com/knuth.html"&gt;this essay&lt;/a&gt; by Donald Knuth on programming as an art.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114151838065281343?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114151838065281343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114151838065281343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114151838065281343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114151838065281343'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/03/donald-knuth-on-programming-as-art.html' title='Donald Knuth on programming as an art'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-114020084845422636</id><published>2006-02-17T11:15:00.000-07:00</published><updated>2006-11-11T14:36:56.988-07:00</updated><title type='text'>IE7 motto: "Almost as good as Firefox!"</title><content type='html'>&lt;p&gt;IE7 will offer several exciting &lt;a href="http://en.wikipedia.org/wiki/IE7#New_features"&gt;new features&lt;/a&gt;, including tabbed browsing, "web feeds" (RSS/Atom support), and some &lt;a href="http://www.codinghorror.com/blog/archives/000513.html"&gt;revolutionary keyboard shortcuts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Seriously, kudos to Microsoft for copying Firefox's keybindings. It's nice to see that instead of what Microsoft usually does to standards. (Not that Firefox's keybindings are a "standard" by any means. It's just that Microsoft has a repuation of, er, shall we say, "embracing and extending" standards.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-114020084845422636?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/114020084845422636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=114020084845422636' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114020084845422636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/114020084845422636'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/02/ie7-motto-almost-as-good-as-firefox.html' title='IE7 motto: &quot;Almost as good as Firefox!&quot;'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113994329882950172</id><published>2006-02-14T11:54:00.000-07:00</published><updated>2006-11-11T14:36:56.902-07:00</updated><title type='text'>Obscure UNIX utility of the month: "units"</title><content type='html'>&lt;p&gt;The author of &lt;a href="http://www.ibiblio.org/harris/500milemail.html"&gt;The case of the 500-mile
email&lt;/a&gt; uses a utility I hadn't
seen before, &amp;quot;units&amp;quot;.&lt;/p&gt;


&lt;pre&gt;
~$ units
2084 units, 71 prefixes, 32 nonlinear units

You have: centimeters/minute
You want: furlongs/fortnight
        * 1.0021455
        / 0.99785914
You have: 720 miles
You want: kilometers
        * 1158.7277
        / 0.00086301554
&lt;/pre&gt;  
        
        &lt;p&gt;It can be used non-interactively as well:&lt;/p&gt;


&lt;pre&gt;
~$ units gallon liter
        * 3.7854118
        / 0.26417205
~$
&lt;/pre&gt;  
        
        &lt;p&gt;Granted, if have net access, you can just use the Google calculator for
this, but it's still pretty neat.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113994329882950172?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113994329882950172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113994329882950172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113994329882950172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113994329882950172'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/02/obscure-unix-utility-of-month-units.html' title='Obscure UNIX utility of the month: &quot;units&quot;'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113911783260089291</id><published>2006-02-04T22:37:00.000-07:00</published><updated>2006-11-11T14:36:56.779-07:00</updated><title type='text'>The miracle of IRC</title><content type='html'>&lt;p&gt;&lt;span class="caps"&gt;IRC&lt;/span&gt; is great. You can converse in realtime with anybody on the planet,
and have deep, meaningful interactions that help us see things from other
points of view and remind us that, deep down, we're all just a bunch of
selfish jerks. Ha ha! Little bit of blogger humor there.&lt;/p&gt;


        &lt;p&gt;But seriously, &lt;span class="caps"&gt;IRC&lt;/span&gt; is full of deep, incisive commentary. Like this gem:&lt;/p&gt;


&lt;pre&gt;
&amp;lt;meriad_&amp;gt; Am I just a sappy bloak or is a Walk To Remember frekain sad
&amp;lt;meriad_&amp;gt; IM IN tears here
&amp;lt;meriad_&amp;gt; :
&amp;lt;meriad_&amp;gt; (
&amp;lt;meriad_&amp;gt; :(
* meriad_ sobbss
* meriad_ wANNNNNHHH
&amp;lt;PurpleSmurf&amp;gt; why?
&amp;lt;meriad_&amp;gt; its so sad
&amp;lt;meriad_&amp;gt; PurpleSmurf he falls in love with this chick who has a terminal
and he didnt knoow and shit
&amp;lt;meriad_&amp;gt; PurpleSmurf u gotta see it to understand
        -- Seen on ##linux (freenode)
&lt;/pre&gt;  
        
        &lt;p&gt;Just warms the heart, doesn't it?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113911783260089291?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113911783260089291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113911783260089291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113911783260089291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113911783260089291'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/02/miracle-of-irc.html' title='The miracle of IRC'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113704616877452151</id><published>2006-01-11T23:09:00.000-07:00</published><updated>2006-11-11T14:36:56.616-07:00</updated><title type='text'>Playing chess online</title><content type='html'>&lt;p&gt;After an 8 or 10 month break, I've started to regain interest in playing chess online. For &amp;quot;normal&amp;quot;, realtime games &lt;a href="http://www.freechess.org/"&gt;&lt;span class="caps"&gt;FICS&lt;/span&gt;&lt;/a&gt; (Free Internet Chess Server) is nice. A couple of days ago I found a free corresponence chess service: &lt;a href="http://www.net-chess.com/index.php"&gt;Net-Chess.Com&lt;/a&gt;, on which I've started a handful of games. We'll see how it goes.&lt;/p&gt;   	&lt;p&gt;My handle is AndroFlux on &lt;span class="caps"&gt;FICS&lt;/span&gt;, and jcreigh on net-chess, in case anybody wants to play me.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113704616877452151?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113704616877452151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113704616877452151' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113704616877452151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113704616877452151'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/01/playing-chess-online.html' title='Playing chess online'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113676093831068517</id><published>2006-01-08T15:55:00.000-07:00</published><updated>2006-11-11T14:36:56.032-07:00</updated><title type='text'>Why blog?</title><content type='html'>&lt;p&gt;Lots of people, including me, have a blog.&lt;/p&gt;   	&lt;p&gt;Why?&lt;/p&gt;   	&lt;p&gt;Most blogs are senseless, stream-of-consciousness drivel. Including this one. There are, of course, bloggers whose posts are well written, thought provoking and profound. But they are the exception, not the rule.&lt;/p&gt;   	&lt;p&gt;So my first guess would be that blogs are journals for nerds. That theory fits me. But there's this whole other class of bloggers. You know the ones I'm talking about. They're in their teens, their twenties. They've got a blog on Xanga. They IM. They email. They use the internet (actually, most of them don't know that the internet is. They just use the word &amp;quot;internet&amp;quot; to mean &amp;quot;the web&amp;quot;) as primarily a social tool. Why do &lt;strong&gt;they&lt;/strong&gt; blog?&lt;/p&gt;   	&lt;p&gt;Couldn't tell you. Probably, they know people to whom their posts are significant. But it's hard for me to imagine, because the posts all seem to look like this:&lt;/p&gt;   &lt;blockquote&gt; Woke up this morning. Happens every morning, but still surprising. Couldn't decide whether to have eggs and bacon or a muffin.  Had both. Wasn't as good as I had hoped. In fact, was the worst breakfast I've ever had. Wanted to kill myself. Listened to Green Day to try and cheer me up. Didn't work. Went to my sucky job. Took the interstate, which I usually don't do, so I got stuck in traffic and was late. My boss yelled at me. Had a bad day. Got home.  Decided to blog about my most trivial experiences, decisions and emotions in short, incoherent sentences. &lt;/blockquote&gt;  	&lt;p&gt;I read posts like that and think, &amp;quot;Who cares about you and your stupid problems?  Write about something interesting! Write about something important!&amp;quot;. Then I decide to be part of the problem by blogging about it.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113676093831068517?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113676093831068517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113676093831068517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113676093831068517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113676093831068517'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/01/why-blog.html' title='Why blog?'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113644295406438045</id><published>2006-01-04T23:35:00.000-07:00</published><updated>2006-11-11T14:36:55.934-07:00</updated><title type='text'>Pet Peeve of the day</title><content type='html'>&lt;p&gt;Ebay makes you logon in order to search completed items. Why do they do this? Do they think that making me jump through hoops to use their service will make me want to buy more stuff on ebay? Do they like to put obstacles in front of their users? Probably they just like to tick me off.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113644295406438045?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113644295406438045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113644295406438045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113644295406438045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113644295406438045'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2006/01/pet-peeve-of-day.html' title='Pet Peeve of the day'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113450480998687407</id><published>2005-12-13T13:13:00.000-07:00</published><updated>2006-11-11T14:36:55.841-07:00</updated><title type='text'>Blogger bug</title><content type='html'>&lt;p&gt;Blogger strips out the newlines in a message posting by email. This makes trying to mark things up with a &amp;lt;pre&amp;gt; tag pretty useless. Observe:&lt;/p&gt;   &lt;pre&gt; There should be a newline right here: &amp;lt;- The "&amp;lt;" character should be the first character in this line. This should be a new line as well. &lt;/pre&gt;  	&lt;p&gt;See? I've reported this twice, and nothing has changed.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113450480998687407?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113450480998687407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113450480998687407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113450480998687407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113450480998687407'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/12/blogger-bug_13.html' title='Blogger bug'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113441099915972313</id><published>2005-12-12T11:09:00.000-07:00</published><updated>2006-11-11T14:36:55.607-07:00</updated><title type='text'>Disturbing</title><content type='html'>&lt;p&gt;While debugging a version of &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Conway's game of life&lt;/a&gt; that I was writing, my program became unresponsive, so I opened another terminal and typed:&lt;/p&gt;   &lt;pre&gt; ~$ killall life &lt;/pre&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113441099915972313?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113441099915972313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113441099915972313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113441099915972313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113441099915972313'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/12/disturbing.html' title='Disturbing'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113354406375006713</id><published>2005-12-02T10:21:00.000-07:00</published><updated>2006-11-11T14:36:55.432-07:00</updated><title type='text'>rss2email, mutt and lynx</title><content type='html'>&lt;p&gt;I've recently begun using &lt;a href="http://www.aaronsw.com/2002/rss2email/"&gt;rss2email&lt;/a&gt; to read &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds in mutt. Of course, to do this, having mutt set up to read &lt;span class="caps"&gt;HTML&lt;/span&gt; emails in a must. In my .mailcap:&lt;/p&gt;   &lt;pre&gt; text/html; lynx -assume-charset=%{charset} -dump -stdin; copiousoutput &lt;/pre&gt;&lt;p&gt;My my .muttrc:&lt;/p&gt; 
&lt;pre&gt;
alternative_order text/plain text/enriched
auto_view text/html
&lt;/pre&gt;
&lt;p&gt;The &amp;quot;alternative_order&amp;quot; is to ensure that in a message that has both text/plain and text/html as alternatives, mutt will select the text/plain. (see the &lt;a href="http://www.mutt.org/doc/manual/manual-5.html#ss5.5"&gt;section 5.5 of the mutt manual&lt;/a&gt; for more on this.)&lt;/p&gt;    &lt;p&gt;Also, I've hacked my local copy of &lt;a href="http://www.whytheluckystiff.net/ruby/redcloth/"&gt;RedCloth&lt;/a&gt; to not produce &amp;quot;smart&amp;quot; quotes or other tricky &lt;span class="caps"&gt;HTML&lt;/span&gt; entities, so the produced &lt;span class="caps"&gt;HTML&lt;/span&gt; should be more friendly now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113354406375006713?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113354406375006713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113354406375006713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113354406375006713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113354406375006713'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/12/rss2email-mutt-and-lynx.html' title='rss2email, mutt and lynx'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113354187114194267</id><published>2005-12-02T09:44:00.000-07:00</published><updated>2006-11-11T14:36:55.354-07:00</updated><title type='text'>Scott Adam's take on cloning</title><content type='html'>&lt;p&gt;Scott Adams has an &lt;a href="http://dilbertblog.typepad.com/the_dilbert_blog/2005/12/cloning.html"&gt;interesting take&lt;/a&gt; on cloning.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113354187114194267?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113354187114194267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113354187114194267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113354187114194267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113354187114194267'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/12/scott-adams-take-on-cloning.html' title='Scott Adam&apos;s take on cloning'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113347072199578071</id><published>2005-12-01T13:47:00.000-07:00</published><updated>2006-11-11T14:36:55.253-07:00</updated><title type='text'>Movies made from video games</title><content type='html'>Oddly enough, some of the &lt;a href="http://www.the-numbers.com/movies/series/BasedOnComputerGame.php"&gt;movies made from video games&lt;/a&gt; actually made money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113347072199578071?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.the-numbers.com/movies/series/BasedOnComputerGame.php' title='Movies made from video games'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113347072199578071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113347072199578071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113347072199578071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113347072199578071'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/12/movies-made-from-video-games.html' title='Movies made from video games'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113330655564362613</id><published>2005-11-29T16:22:00.000-07:00</published><updated>2006-11-11T14:36:55.152-07:00</updated><title type='text'>What's so great about the web?</title><content type='html'>&lt;p&gt;Why are blogs web-based? We&amp;#8217;ve had mailing lists and &lt;span class="caps"&gt;NNTP&lt;/span&gt; since the dawn of time, and Trackback/Pingback are basically reinventions of cross-posting and the &amp;#8220;References:&amp;#8221; header.&lt;/p&gt;   	&lt;p&gt;So why web-based? Why don&amp;#8217;t we string together some &lt;span class="caps"&gt;NNTP&lt;/span&gt; servers into a non-usenet network and hand out &amp;#8220;newsgroup&amp;#8221; names in some standard way. (&amp;#8220;country.first.middle.last&amp;#8221;?) Then if I wanted to post about something somebody else said, I&amp;#8217;d just reply and cross-post it to my blog. Then we get the functional equivilent of comments, &lt;span class="caps"&gt;RSS&lt;/span&gt;, trackback and pingback for free.&lt;/p&gt;   	&lt;p&gt;So why is it this way? Why do people love the web so much? Why are we trying layer state on top of a stateless protocol? Why are we trying to make desktop applications in browsers with &amp;#8220;AJAX&amp;#8221;? Would it be so hard to design a protocol that&amp;#8217;s actually &lt;strong&gt;designed&lt;/strong&gt; for UI? It&amp;#8217;s okay to reinvent the wheel if the current one is square. In our haste to be able to use the web for anything, have we doomed ourselves to having to use the web for everything?&lt;/p&gt;   	&lt;p&gt;The web has its uses, certainly. But it&amp;#8217;s not &lt;strong&gt;the&lt;/strong&gt; protocol. It&amp;#8217;s just one. Just a nice way way of getting data from point A to point B. And &lt;span class="caps"&gt;HTML&lt;/span&gt; is just a markup language. It&amp;#8217;s amazing what we&amp;#8217;ve been able to do with it. But I tire of kludge-up web &amp;#8220;applications&amp;#8221;. I tire of trying to craft a meaningful UI around the limits of &lt;span class="caps"&gt;HTML&lt;/span&gt;/HTTP. I and think, &amp;#8220;there must be a better way!&amp;#8221;. But sadly, right now, it appears there is not. As they say, &amp;#8220;that&amp;#8217;s life&amp;#8221;.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113330655564362613?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113330655564362613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113330655564362613' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113330655564362613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113330655564362613'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/11/whats-so-great-about-web.html' title='What&apos;s so great about the web?'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113278686515727335</id><published>2005-11-23T15:59:00.000-07:00</published><updated>2006-11-11T14:36:55.077-07:00</updated><title type='text'>Bush Braces As Cindy Sheehan's Other Son Drowns In New Orleans</title><content type='html'>I found &lt;a href="http://www.theonion.com/content/node/40764"&gt;this&lt;/a&gt; funny.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113278686515727335?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.theonion.com/content/node/40764' title='Bush Braces As Cindy Sheehan&apos;s Other Son Drowns In New Orleans'/><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113278686515727335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113278686515727335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113278686515727335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113278686515727335'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/11/bush-braces-as-cindy-sheehans-other.html' title='Bush Braces As Cindy Sheehan&apos;s Other Son Drowns In New Orleans'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113160260953933750</id><published>2005-11-09T23:03:00.000-07:00</published><updated>2006-11-11T14:36:54.988-07:00</updated><title type='text'>Doom ported to iPod</title><content type='html'>&lt;p&gt;After you get Linux running on a digital music player, the next logical step is to &lt;a href="http://www.ipodobserver.com/story/24265"&gt;get Doom running on it&lt;/a&gt;.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113160260953933750?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113160260953933750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113160260953933750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113160260953933750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113160260953933750'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/11/doom-ported-to-ipod.html' title='Doom ported to iPod'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-113132368302815923</id><published>2005-11-06T17:34:00.000-07:00</published><updated>2006-11-11T14:36:54.811-07:00</updated><title type='text'>Untrusted computing</title><content type='html'>&lt;p&gt;Yesterday, I bought Switchfoot&amp;#8217;s latest CD, &amp;#8220;Nothing is sound&amp;#8221;. What I do with all my CDs is immediately make a copy of it, so the original can stay safely in its case, and it&amp;#8217;s a &lt;span class="caps"&gt;CDR&lt;/span&gt; that I don&amp;#8217;t care about that gets thrown around in the car. When the &lt;span class="caps"&gt;CDR&lt;/span&gt; gets a scratch, I clone off a new one, thus giving my CDs a kind of Duncan Idaho immortality.&lt;/p&gt;   	&lt;p&gt;I don&amp;#8217;t have a burner in my Linux box, so I popped it into my parent&amp;#8217;s Window PC to copy it. A window popped up and asked me to agree to a license. I thought &amp;#8220;Oh, they&amp;#8217;ve put a music video on the CD&amp;#8221;, and clicked agree. &lt;em&gt;With no futher prompting&lt;/em&gt;, a progress bar marched from left to right, and then I was told that my CD-ROM drivers were to old to read the CD, and that they had been updated, and all I needed to do now was click a little &amp;#8220;Reboot Now&amp;#8221; button, and the &amp;#8220;Enhanced CD&amp;#8221;  installation would continue after a reboot.&lt;/p&gt;   	&lt;p&gt;So I rebooting, thinking this is probably some &lt;span class="caps"&gt;DRM&lt;/span&gt; crap but wanting to give them the benefit of the doubt. Big mistake. After the reboot, I copied the CD, put the copy into a CD player and got&amp;#8230;static. I began thinking thoughts about the recording industry that, while unprintable, are, in my opinion, completely true.&lt;/p&gt;   	&lt;p&gt;Whatever patch (&amp;#8220;patch&amp;#8221; is actually too kind a word. &amp;#8220;virus&amp;#8221; is more accurate.) was installed, it disabled &lt;strong&gt;any&lt;/strong&gt; sort of digital audio extraction for that CD. I couldn&amp;#8217;t even &lt;strong&gt;play&lt;/strong&gt; it a standard player. (Other, standard CDs could read fine, so that&amp;#8217;s one thing they didn&amp;#8217;t do wrong.) They probably have some little player that gets around their malware, but I didn&amp;#8217;t try to find out.&lt;/p&gt;   	&lt;p&gt;So I ended up ripped the CD with cdparanoia on my Linux box, and copying the wav files over the network and then burning them. And I ran system restore, and after that, I could play the CD in Winamp and probably could have ripped it fine.&lt;/p&gt;   	&lt;p&gt;I went back and actually read the &lt;span class="caps"&gt;EULA&lt;/span&gt;. It actually says all that will happen if you click agree. So, I was warned that malware was going to be installed on my computer, I just made the mistake of thinking that Columbia Records were not evil corporate weasels. I wonder what their home life is like. &amp;#8220;Hi honey, how was work?&amp;#8221; &amp;#8220;Great! I just screwed millions of legitimate customers!&amp;#8221;.&lt;/p&gt;   	&lt;p&gt;Lesson of the day: Don&amp;#8217;t run Windows. If you do run Windows, disable autorun. Programs from major record labels are not to be trusted.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-113132368302815923?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/113132368302815923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=113132368302815923' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113132368302815923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/113132368302815923'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/11/untrusted-computing.html' title='Untrusted computing'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112788196208813671</id><published>2005-09-27T21:32:00.000-07:00</published><updated>2006-11-11T14:36:54.670-07:00</updated><title type='text'>Firefox: Middle click on javascript links</title><content type='html'>&lt;p&gt;&lt;a href="http://www.extensionsmirror.nl/index.php?s=825ff41675dec314387e7f88dbf36b98&amp;#38;showtopic=4027"&gt;Smart Middle Click&lt;/a&gt;, a firefox extension, makes middle-clicking on a javascript link actually open it in a new tab instead of just opening a blank tab.&lt;/p&gt;   	&lt;p&gt;Now I merely strongly dislike Javascript links, instead of hating them with a burning passion.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112788196208813671?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112788196208813671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112788196208813671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112788196208813671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112788196208813671'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/09/firefox-middle-click-on-javascript.html' title='Firefox: Middle click on javascript links'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112779791872270226</id><published>2005-09-26T22:11:00.000-07:00</published><updated>2006-11-11T14:36:54.446-07:00</updated><title type='text'>Thud!</title><content type='html'>&lt;p&gt;Terry Pratchett has a new book out: &lt;a href="http://www.harpercollins.com/catalog/pratchett/site/books/description.asp?isbn=0060815221"&gt;Thud!&lt;/a&gt;. &lt;a href="http://www.harpercollins.com/catalog/pratchett/site/books/excerpt.asp?isbn=0060815221"&gt;Excerpt&lt;/a&gt;. It&amp;#8217;s a Discworld, and it&amp;#8217;s about the Watch, so should be fun. I&amp;#8217;ve got it on hold at the local library, but there&amp;#8217;s probably scads of people ahead of me in line.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112779791872270226?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112779791872270226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112779791872270226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112779791872270226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112779791872270226'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/09/thud.html' title='Thud!'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112606177390192777</id><published>2005-09-06T19:56:00.000-07:00</published><updated>2006-11-11T14:36:54.354-07:00</updated><title type='text'>Brave New World</title><content type='html'>&lt;p&gt;An Australian court has ruled that &lt;a href="http://yro.slashdot.org/yro/05/09/05/114226.shtml?tid=141"&gt;Kazaa is resposible for copyright infringements on their network&lt;/a&gt;. Of course, Kazaa uses &lt;a href="http://en.wikipedia.org/wiki/FastTrack"&gt;FastTrack&lt;/a&gt;, a decentralized system, so it&amp;#8217;s nearly impossible for them to do anything about it, but that&amp;#8217;s beside the point.&lt;/p&gt;   	&lt;p&gt;The thing that many business models will be unable to cope with is this: The economic cost to transfer information is very close to zero. If somebody wants to get an &lt;span class="caps"&gt;MP3&lt;/span&gt; of $ARTIST from point A to point B, it&amp;#8217;s so cheap to do so that most people would consider it free. (as in free beer.)&lt;/p&gt;   	&lt;p&gt;I not saying that all information is free as in free speech, or that it should be. It&amp;#8217;s just that if two people want to exchange information, whether copyrighted or not, they can, &lt;em&gt;and there&amp;#8217;s no way to stop them&lt;/em&gt;. There&amp;#8217;s things that can be done to make it harder. The &lt;span class="caps"&gt;RIAA&lt;/span&gt;&amp;#8217;s current strategy of suing 15-year olds is one. Outlawing crypto entirely is another. But as long as arbitrary information can be exchanged, there will always be some way for a sufficiently determined person to circumvent the obstacles placed in their way.&lt;/p&gt;   	&lt;p&gt;This is going to be awkward for a while. For instance, if/when usable e-book readers become widespread, there&amp;#8217;s absolutely no economic reason why libraries should exist. Libraries exist because there&amp;#8217;s a limited number of books. But when the book is stored electronically, everybody can have a copy. But that doesn&amp;#8217;t work at all with the concept of selling books, so there&amp;#8217;s going to be the same sort of thing going on then with books that&amp;#8217;s going on now with music.&lt;/p&gt;   	&lt;p&gt;It may be that the entire concept of intellectually property will break down, and that no one will be able to make software, books, music, art, or anything else that can be stored electronically, for a living.&lt;/p&gt;   	&lt;p&gt;Or, it may be that &amp;#8220;trusted computing&amp;#8221; (&amp;#8220;untrusted computing&amp;#8221; would be a better word) will become widespread. This would mean that you lose the right to do what you wish with your computer, and in exchange people with IP can make lots of money.&lt;/p&gt;   	&lt;p&gt;Or, it may be that something else entirely happens. That IP becomes weaker, but does not disappear entirely. That the freedom of the many is deemed more important than the prosperity of the few. That the marketplace adapts to this strange new world where information &lt;em&gt;can&lt;/em&gt; be transmitted freely, but doesn&amp;#8217;t &lt;em&gt;have&lt;/em&gt; to be. That some business models fall by the wayside, but others spring up to take their place. That is what I hope for.&lt;/p&gt;   	&lt;p&gt;Ready or not, here comes the future.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112606177390192777?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112606177390192777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112606177390192777' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112606177390192777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112606177390192777'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/09/brave-new-world.html' title='Brave New World'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112597734351510252</id><published>2005-09-05T20:29:00.000-07:00</published><updated>2006-11-11T14:36:54.227-07:00</updated><title type='text'>Star Trek IV</title><content type='html'>&lt;p&gt;Just watched &lt;a href="http://en.wikipedia.org/wiki/Star_Trek_IV"&gt;Star Trek IV&lt;/a&gt;. The plot involves traveling back in time to save the whales. I kid you not. If you don&amp;#8217;t believe me, read the Wikipedia article I linked to.&lt;/p&gt;   	&lt;p&gt;There are several disappointing things about the future. For instance, computer display technology has regressed considerably, and we&amp;#8217;ll be back to using &lt;span class="caps"&gt;EGA 200&lt;/span&gt; years hence. Also, it turns out that they &amp;#8220;don&amp;#8217;t use money&amp;#8221; in the future. Everytime they mentioned this fact, I kept wondering, what &lt;em&gt;do&lt;/em&gt; they use in the future?  Faster than light travel, okay. Time travel, okay. Whales as a higher intelligence, okay. But communism working? Really now, you expect me to believe &lt;strong&gt;that&lt;/strong&gt;? :-)&lt;/p&gt;   	&lt;p&gt;Kirk is at his preachy best, calling people in 1986 a &amp;#8220;extremely primative and paranoid culture&amp;#8221;. People of the 23rd century are, it appears, far superior in every way to 20th century man. Except, of course, that they&amp;#8217;re still judgemental self-righteous twits.&lt;/p&gt;   	&lt;p&gt;Still, that&amp;#8217;s what makes Star Trek fun to watch, and in that area Star Trek IV does not disappoint.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112597734351510252?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112597734351510252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112597734351510252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112597734351510252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112597734351510252'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/09/star-trek-iv.html' title='Star Trek IV'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112546160056904748</id><published>2005-08-30T21:13:00.000-07:00</published><updated>2006-11-11T14:36:54.119-07:00</updated><title type='text'>Tau Zero</title><content type='html'>&lt;p&gt;I just finished &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0575070994/002-3353222-5708051"&gt;Tau Zero&lt;/a&gt; by Poul Anderson. Good stuff, read it if you get the chance. Reminded me somewhat of the Isaac Asimov short story &lt;a href="http://www.cptdean.com/?page_id=48"&gt;The Last Question&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112546160056904748?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112546160056904748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112546160056904748' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112546160056904748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112546160056904748'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/tau-zero.html' title='Tau Zero'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-112545388644747373</id><published>2005-08-30T19:01:00.000-07:00</published><updated>2006-11-11T14:36:54.021-07:00</updated><title type='text'>If you're wondering who to blame...</title><content type='html'>&lt;pre&gt;
19:20 -!- Netsplit zelazny.freenode.net &amp;lt;-&amp;gt; irc.freenode.net quits: caff-work, stefan, thoran, VeerZ
19:20 -!- Netsplit over, joins: thoran, stefan, caff-work
19:21 -!- Netsplit over, joins: VeerZ
19:22 -!- mrsolo [n=mrsolo@dsl092-025-194.sfo1.dsl.speakeasy.net] has quit ["Leaving"]
19:24 &amp;lt; rue&amp;gt; Is it just me or have we had a lot of splits?
19:25 &amp;lt; imperator&amp;gt; it's you
19:25 &amp;lt; rue&amp;gt; Hm
19:25 &amp;lt; imperator&amp;gt; it's ALWAYS you
19:25 &amp;lt; imperator&amp;gt; netsplits? rue
19:25 &amp;lt; imperator&amp;gt; syntax errors? rue
19:26 &amp;lt; imperator&amp;gt; world hunger, famine, war, disease - rue, rue, rue, RUE!
19:26 &amp;lt; dagbrown&amp;gt; Trolls?
19:26 &amp;lt; imperator&amp;gt; rue
        -- #ruby-lang on freenode
&lt;/pre&gt;

&lt;p&gt;When I first tried to post this via email, Blogger ate the newlines in the message, and since the log snippet is marked up with &amp;lt;pre&amp;gt; it made the log pretty useless. So I reported this problem to Blogger, and then did a cut 'n paste into the web interface, which is somewhat of a pain. I think it's rue's fault. :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112545388644747373?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112545388644747373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112545388644747373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112545388644747373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112545388644747373'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/if-youre-wondering-who-to-blame.html' title='If you&apos;re wondering who to blame...'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112545149433260188</id><published>2005-08-30T18:24:00.000-07:00</published><updated>2006-11-11T14:36:53.569-07:00</updated><title type='text'>Who knows what I want better than me?</title><content type='html'>&lt;p&gt;A couple months ago, I ran into something I hadn&amp;#8217;t seen before. I googled for something, clicked on a link, and found that my search term was hightlighted on the page. Obviously, people are getting clever and looking at the referer to see if it&amp;#8217;s from a search engine and pulling out the search term.&lt;/p&gt;   	&lt;p&gt;Since then, I&amp;#8217;ve seen it a couple more times. I don&amp;#8217;t like it. If I&amp;#8217;d &lt;strong&gt;wanted&lt;/strong&gt; it hightlighted, I &lt;strong&gt;would&lt;/strong&gt;. But it&amp;#8217;s a minor thing, so I&amp;#8217;m trying to put my finger on why I mind it so much. Maybe it&amp;#8217;s a control thing: I don&amp;#8217;t want some &lt;span class="caps"&gt;PHP&lt;/span&gt; monkey coder telling me that I&amp;#8217;m obviously using a browser without adequate searching features, so he&amp;#8217;ll just step in and &amp;#8220;fix&amp;#8221; it for me. Heck, as long as they think they know what we want better than we do, maybe they should look at the User-Agent and only give highlighting if it&amp;#8217;s IE. :-)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112545149433260188?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112545149433260188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112545149433260188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112545149433260188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112545149433260188'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/who-knows-what-i-want-better-than-me.html' title='Who knows what I want better than me?'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112525883107857019</id><published>2005-08-28T12:53:00.000-07:00</published><updated>2006-11-11T14:36:53.489-07:00</updated><title type='text'>PHP Magic Quotes</title><content type='html'>&lt;p&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; has a &amp;#8220;feature&amp;#8221; called &lt;a href="http://us2.php.net/magic_quotes"&gt;Magic Quotes&lt;/a&gt;. Basically, if it&amp;#8217;s on, all user data (GET, &lt;span class="caps"&gt;POST&lt;/span&gt;, cookies) is automatically escaped for use in a &lt;span class="caps"&gt;SQL&lt;/span&gt; query. This, in and of itself, is not too horrible, it just makes you have to explicitly un-escape instead of explicitly escape. I still think it&amp;#8217;s a bad idea, because it&amp;#8217;s designed to let you drop request variables directly into a &lt;span class="caps"&gt;SQL&lt;/span&gt; query without validation, which is still a bad idea, even if &lt;span class="caps"&gt;SQL&lt;/span&gt; injection isn&amp;#8217;t possible.&lt;/p&gt;   	&lt;p&gt;But do you know what they did? They made it an &lt;em&gt;option&lt;/em&gt;. That&amp;#8217;s right. One &lt;span class="caps"&gt;PHP&lt;/span&gt; hosting service might have it on, and another might have it off, so you have to code for both cases. So you have to wrap getting request varibles into a helper function that checks for you at runtime and does whatever behavior you want.&lt;/p&gt;   	&lt;p&gt;This means that Magic Quotes actually makes it &lt;em&gt;harder&lt;/em&gt; to do the right thing than if the feature didn&amp;#8217;t exist! You have to go to extra work to make sure that your program works correctly in all cases.&lt;/p&gt;   	&lt;p&gt;On the other hand, if you don&amp;#8217;t care about doing the Right Thing, &lt;span class="caps"&gt;PHP&lt;/span&gt; might just be for you.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112525883107857019?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112525883107857019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112525883107857019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112525883107857019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112525883107857019'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/php-magic-quotes.html' title='PHP Magic Quotes'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112502905067807267</id><published>2005-08-25T21:04:00.000-07:00</published><updated>2006-11-11T14:36:53.404-07:00</updated><title type='text'>Regrets</title><content type='html'>&lt;p&gt;I may not be the man I want to be;&lt;br/&gt; I may not be the man I ought to be;&lt;br/&gt; I may not be the man I could be;&lt;br/&gt; I may not be the man I can be;&lt;br/&gt; but praise God, I&amp;#8217;m not the man I once was.&lt;br/&gt;        &amp;#8212;Martin Luther King, Jr.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112502905067807267?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112502905067807267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112502905067807267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112502905067807267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112502905067807267'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/regrets.html' title='Regrets'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112493324131800435</id><published>2005-08-24T18:27:00.000-07:00</published><updated>2006-11-11T14:36:53.310-07:00</updated><title type='text'>Python Challenge</title><content type='html'>&lt;p&gt;A couple days ago I found the &lt;a href="http://www.pythonchallenge.com/"&gt;Python Challenge&lt;/a&gt;. It&amp;#8217;s a series of riddles designed to be solved with the help of Python. It doesn&amp;#8217;t actually have to be Python: Most other languages would work just as well. I&amp;#8217;ve been using Ruby. But, as their &lt;a href="http://www.pythonchallenge.com/faq.htm"&gt;FAQ&lt;/a&gt; explains, a couple puzzles use Python-dependent features.  So you might have trouble if you haven&amp;#8217;t use Python at all.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112493324131800435?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112493324131800435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112493324131800435' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112493324131800435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112493324131800435'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/python-challenge.html' title='Python Challenge'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-112468291145217319</id><published>2005-08-21T20:55:00.000-07:00</published><updated>2006-11-11T14:36:53.237-07:00</updated><title type='text'>Apple's four button mouse</title><content type='html'>&lt;p&gt;This is old news, but Apple is selling a &lt;a href="http://www.apple.com/mightymouse/"&gt;four button mouse&lt;/a&gt;, which &lt;a href="http://www.ucomics.com/foxtrot/2005/08/16/"&gt;this FoxTrot comic&lt;/a&gt; refers to. Why did Apple wait so long?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112468291145217319?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112468291145217319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112468291145217319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112468291145217319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112468291145217319'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/apples-four-button-mouse.html' title='Apple&apos;s four button mouse'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112432787210092280</id><published>2005-08-17T18:17:00.000-07:00</published><updated>2006-11-11T14:36:53.152-07:00</updated><title type='text'>Google "language" tools</title><content type='html'>&lt;p&gt;If you go to the &lt;a href="http://www.google.com/language_tools"&gt;Google Language Tools&lt;/a&gt; page, you&amp;#8217;ll see some interesting &amp;#8220;languages&amp;#8221;, including &lt;a href="http://www.google.com/intl/xx-klingon/"&gt;Klingon&lt;/a&gt;, &lt;a href="http://www.google.com/intl/xx-bork/"&gt;Bork, bork, bork!&lt;/a&gt;, &lt;a href="http://www.google.com/intl/xx-piglatin/"&gt;Pig Latin&lt;/a&gt;, &lt;a href="http://www.google.com/intl/xx-elmer/"&gt;Elmer Fudd&lt;/a&gt; and &lt;a href="http://www.google.com/intl/xx-hacker/"&gt;Hacker&lt;/a&gt; (Unfortunately, Google does not appear to agree with the &lt;a href="http://www.catb.org/~esr/jargon/html/H/hacker.html"&gt;Jargon File definition&lt;/a&gt;, and this is just leet speak. Still hiliarious to view Google help pages, though.)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112432787210092280?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112432787210092280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112432787210092280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112432787210092280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112432787210092280'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/google-language-tools.html' title='Google &quot;language&quot; tools'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112415421387442260</id><published>2005-08-15T18:03:00.000-07:00</published><updated>2006-11-11T14:36:53.068-07:00</updated><title type='text'>Fun tetris games</title><content type='html'>&lt;p&gt;In the &amp;#8220;interesting tetris clone&amp;#8221; department, we&amp;#8217;ve got &lt;a href="http://fph.altervista.org/prog/bastet.shtml"&gt;bastet&lt;/a&gt;, a tetris clone that actually selects the worse possible piece for you &lt;em&gt;on purpose&lt;/em&gt;. Pure evil to play. And then there&amp;#8217;s &lt;a href="http://www.tetris1d.org/"&gt;1D Tetris&lt;/a&gt;. Yeah, you read that right.&lt;/p&gt;

&lt;p&gt;&lt;span class="caps"&gt;EDIT&lt;/span&gt;: Almost forgot. If you ever feel the need to play a good game of Tetris without loading up an entire OS, you can always play &lt;a href="http://www.iagora.com/~espel/hacks.html"&gt;ktris&lt;/a&gt;, a tetris game written in 8086 assembler that can fit in the boot sector.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112415421387442260?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112415421387442260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112415421387442260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112415421387442260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112415421387442260'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/fun-tetris-games.html' title='Fun tetris games'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112415395757125014</id><published>2005-08-15T17:59:00.000-07:00</published><updated>2006-11-11T14:36:52.990-07:00</updated><title type='text'>Funny slashdot comment</title><content type='html'>&lt;p&gt;&lt;a href="http://slashdot.org/comments.pl?sid=159051&amp;#38;cid=13321834"&gt;This comment&lt;/a&gt; was posted on a &lt;a href="http://slashdot.org/article.pl?sid=05/08/15/1225245&amp;#38;tid=188"&gt;story about a documentary on the &lt;span class="caps"&gt;BBS&lt;/span&gt; era&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112415395757125014?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112415395757125014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112415395757125014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112415395757125014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112415395757125014'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/funny-slashdot-comment.html' title='Funny slashdot comment'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112398758741182312</id><published>2005-08-13T19:46:00.000-07:00</published><updated>2006-11-11T14:36:52.898-07:00</updated><title type='text'>Quote of the day</title><content type='html'>&lt;p&gt;A passage from &lt;a href="http://en.wikipedia.org/wiki/Surely_You%27re_Joking%2C_Mr._Feynman%21"&gt;Surely You&amp;#8217;re Joking, Mr. Feynman!&lt;/a&gt;&lt;/p&gt;  	&lt;blockquote&gt; 		&lt;p&gt;There were a lot of fools at that conference &amp;#8211; pompus fools &amp;#8211; and pompous fools drive me up the wall.  Ordinary foolks are all right; you can talk to them, and try to help them out. But pompus fools &amp;#8211; guys who are fools and are covering it all over and impressing people as to how wonderful they are with all this hocus pocus &amp;#8211; &lt;span class="caps"&gt;THAT&lt;/span&gt;, I &lt;span class="caps"&gt;CANNOT STAND&lt;/span&gt;! An ordinary fool isn&amp;#8217;t a faker; an honest fool is all right. But a dishonest fool is terrible!&lt;/p&gt; 	&lt;/blockquote&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112398758741182312?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112398758741182312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112398758741182312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112398758741182312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112398758741182312'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/quote-of-day.html' title='Quote of the day'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112381659943607995</id><published>2005-08-11T20:16:00.000-07:00</published><updated>2006-11-11T14:36:52.706-07:00</updated><title type='text'>Converting text to HTML anywhere</title><content type='html'>&lt;p&gt;I &lt;a href="http://jcreigh.blogspot.com/2005/08/posting-via-email.html"&gt;posted                                                    
eariler&lt;/a&gt;                                                                                                                         
about how I&amp;#8217;m using &lt;a href="http://www.textism.com/tools/textile/"&gt;Textile&lt;/a&gt; to                                            
convert readable plain text to &lt;span class="caps"&gt;HTML&lt;/span&gt;. I&amp;#8217;m using                                                      
&lt;a href="http://www.whytheluckystiff.net/ruby/redcloth/"&gt;RedCloth&lt;/a&gt;, a Ruby                                                       
library, but there&amp;#8217;s also a &lt;a href="http://dealmeida.net/en/Projects/PyTextile/"&gt;Textile library for                         
Python&lt;/a&gt;&lt;/p&gt;                                                                                                                      
                                                                                                                                    
        &lt;p&gt;Not extremely interesting in an of itself, (unless you like Python), but                                                 
the author has &lt;a href="http://dealmeida.net/en/Projects/PyTextile/textile_favelet_part_2.html"&gt;posted a                            
bookmarklet&lt;/a&gt;                                                                                                                     
that allows you to select text in any textarea, and then click the                                                                  
bookmarklet to convert the selected text to &lt;span class="caps"&gt;HTML&lt;/span&gt;. It passes your text                                     
through a Python &lt;span class="caps"&gt;CGI&lt;/span&gt; running on his server, and you&amp;#8217;ve got &lt;a href="http://hobix.com/textile/"&gt;clean, easy                                                                                                                              
&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/a&gt; everywhere.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112381659943607995?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112381659943607995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112381659943607995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112381659943607995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112381659943607995'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/converting-text-to-html-anywhere.html' title='Converting text to HTML anywhere'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112373337559308644</id><published>2005-08-10T21:09:00.000-07:00</published><updated>2006-11-11T14:36:52.387-07:00</updated><title type='text'>Infrequently Asked Questions in comp.lang.c</title><content type='html'>&lt;p&gt;&lt;a href="http://www.plethora.net/~seebs/faqs/c-iaq.html"&gt;Infrequently Asked Questions in comp.lang.c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very funny non-answers to non-questions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112373337559308644?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112373337559308644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112373337559308644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112373337559308644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112373337559308644'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/infrequently-asked-questions-in.html' title='Infrequently Asked Questions in comp.lang.c'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112345229592410712</id><published>2005-08-07T15:04:00.000-07:00</published><updated>2006-11-11T14:36:52.297-07:00</updated><title type='text'>Posting via email</title><content type='html'>&lt;p&gt;&lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt; has a nice feature where you can send email to a magic address, and then it automatically posts to your blog. I&amp;#8217;ve set up some mutt aliases and send-hooks to filter mail to blogger.com through &lt;a href="http://www.whytheluckystiff.net/ruby/redcloth/"&gt;Red Cloth&lt;/a&gt;, which is a Ruby implementation of the &lt;a href="http://www.textism.com/tools/textile/"&gt;Textile&lt;/a&gt; text-to-HTML language.&lt;/p&gt;   	&lt;p&gt;Now I don&amp;#8217;t have to worry about matching tags, or making sure everything is properly escaped, and I&amp;#8217;ll probably end up posting more often, which may or may not be a good thing.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112345229592410712?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112345229592410712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112345229592410712' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112345229592410712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112345229592410712'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/posting-via-email.html' title='Posting via email'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-112338384024443842</id><published>2005-08-06T20:02:00.000-07:00</published><updated>2006-11-11T14:36:52.065-07:00</updated><title type='text'>A Conundrum</title><content type='html'>&lt;p&gt;Why can't I remember how to spell "mnemonic" without looking it up?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112338384024443842?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112338384024443842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112338384024443842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112338384024443842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112338384024443842'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/conundrum.html' title='A Conundrum'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112335690258081272</id><published>2005-08-06T12:22:00.000-07:00</published><updated>2006-11-11T14:36:51.963-07:00</updated><title type='text'>Assembly-like programming games</title><content type='html'>&lt;p&gt;A few days ago, I found &lt;a href="http://necrobones.com/atrobots/"&gt;AT-Robots&lt;/a&gt;, an old DOS game I used to play on my parent's 25Mhz 486SX Packard Bell computer with 4 megs of RAM. The basic idea is you program robots in an assembly-like langauge, and then they fight in an arena. If that sounds boring, this program probably isn't for you, go &lt;a href="http://en.wikipedia.org/wiki/Special:Random"&gt;find something else to read&lt;/a&gt;. Anyway, AT-Robots runs fine under &lt;a href="http://www.dosemu.org/"&gt;dosemu&lt;/a&gt;, so I've been trying my hand at making some robots. I wish I had my old ones saved somewhere so I could see if I've gotten any better over the years.&lt;/p&gt;

&lt;p&gt;Also of interest is &lt;a href="http://www.corewars.org/"&gt;corewars&lt;/a&gt;, another programming game using an assembly-like language. What makes corewars different is that instead of telling your robot how to navigate a virtual physical space, you battle over the memory ("core") of a virtual machine, trying to overwrite the other programs. Self-modifing code everywhere. It's really interesting, but much harder for me to wrap my brain around than AT-Robot's simple turn and shoot style of robots.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112335690258081272?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112335690258081272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112335690258081272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112335690258081272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112335690258081272'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/assembly-like-programming-games.html' title='Assembly-like programming games'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112330439291901164</id><published>2005-08-05T21:54:00.000-07:00</published><updated>2006-11-11T14:36:51.873-07:00</updated><title type='text'>"Things My Girlfriend and I Have Argued About"</title><content type='html'>&lt;p&gt;Wow, my third post today. Just like real bloggers, except without actual content and lower quality of writing. Oh, and since I'm using an off-the-shelf free blogging server, my blog doesn't look as nice, there's no (Ping|Track)backs, and there's a useless little "toolbar" at the top.&lt;/p&gt;

&lt;p&gt;But other than that, just like real bloggers&lt;/p&gt;

&lt;p&gt;Anyway, this is too funny not to post: &lt;a href="http://www.mil-millington.pwp.blueyonder.co.uk/things.html"&gt;Things My Girlfriend and I Have Argued About&lt;/a&gt;. Don't read while drinking something.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112330439291901164?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112330439291901164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112330439291901164' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112330439291901164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112330439291901164'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/things-my-girlfriend-and-i-have-argued.html' title='&quot;Things My Girlfriend and I Have Argued About&quot;'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112329986093350162</id><published>2005-08-05T20:43:00.000-07:00</published><updated>2006-11-11T14:36:51.785-07:00</updated><title type='text'>The future of the space shuttle</title><content type='html'>Here's an &lt;a href="http://www.idlewords.com/2005/08/a_rocket_to_nowhere.htm"&gt;interesting post&lt;/a&gt; about the usefulness of the space shuttle program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112329986093350162?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112329986093350162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112329986093350162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112329986093350162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112329986093350162'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/future-of-space-shuttle.html' title='The future of the space shuttle'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112329611926014321</id><published>2005-08-05T19:09:00.000-07:00</published><updated>2006-11-11T14:36:51.717-07:00</updated><title type='text'>Windows isn't ready for the desktop</title><content type='html'>&lt;p&gt;Here's &lt;a href="http://zdnet.com.au/news/software/soa/Why_Linux_isn_t_ready_for_desktops/0,2000061733,39202374,00.htm"&gt;another story&lt;/a&gt; about how Linux isn't for the desktop.&lt;/p&gt;

&lt;p&gt;All the points he raises are, in my opinion, valid. The typical Linux distribution is not a great OS for the average user. But is Windows ready for the desktop? No, really? Of those "average users", for whom Windows is supposedly such a great platform, how many of them actually think that Windows is a great platform? When I talk to people who use computers because they have to, not because they want to, I've never heard anybody talk about how easy Windows is. I've never heard anybody talk about how everything is simple and clear, and nothing ever goes wrong, and life is good.&lt;/p&gt;

&lt;p&gt;You know why? 'cause it's not. Computers are &lt;i&gt;not&lt;/i&gt; easy to use. I don't care if you wrap it in a GUI, I don't care if you have a "desktop metaphor", I don't care if you've got tooltips, I don't care if you have a talking paper clip, computers are &lt;i&gt;not&lt;/i&gt; easy to use. Period. We don't life in a perfect, happy world where people who's never used a computer before can sit down at a GUI and start clicking, draging and droping within minutes, his face aglow with magic of it all. Sorry, doesn't happen. Please stop telling me that Windows makes it easy for people with no training to use some of the most complex machines ever made. It doesn't, and pretending it does doesn't fix anything.&lt;/p&gt;

&lt;p&gt;Of course, all this is just whining. If Windows, isn't good enough, what is? And if "nothing" isn't a good enough answer, then what do we do? I see people struggling to use their computers and I wish it were easier for them. I wish they could just do what they wanted simply and easily and not spend hours trying to fix something that they, and a fundamental level, don't care about. Of course, I'm selfish, so mostly I just wish they would stop having to call me with their problems. I don't know what a good user interface looks like. But I'm fairly convinced it isn't Windows, or anything else that I've seen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112329611926014321?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112329611926014321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112329611926014321' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112329611926014321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112329611926014321'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/windows-isnt-ready-for-desktop.html' title='Windows isn&apos;t ready for the desktop'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112320812223005041</id><published>2005-08-04T19:11:00.000-07:00</published><updated>2006-11-11T14:36:51.597-07:00</updated><title type='text'>What Business Can Learn From Open Source</title><content type='html'>&lt;p&gt;Paul Graham has posted a &lt;a href="http://www.paulgraham.com/opensource.html"&gt;new essay&lt;/a&gt;. Quoting from the link:&lt;/p&gt;

&lt;blockquote&gt;
When I say business can learn from open source, I don't mean any specific business can. I mean business can learn about new conditions the same way a gene pool does. I'm not claiming companies can get smarter, just that dumb ones will die.
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112320812223005041?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112320812223005041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112320812223005041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112320812223005041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112320812223005041'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/what-business-can-learn-from-open.html' title='What Business Can Learn From Open Source'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112303575211460231</id><published>2005-08-02T19:01:00.000-07:00</published><updated>2006-11-11T14:36:51.525-07:00</updated><title type='text'>PHP scope when require()'ing</title><content type='html'>&lt;p&gt;I know I whined about PHP in my &lt;a href="http://jcreigh.blogspot.com/2005/07/php-pop-quiz.html"&gt;last post&lt;/a&gt;, but this behavior ticked me off enough to write once again about the language I love to hate.&lt;/p&gt;

&lt;p&gt;if you require() or include() a file, it gets the scope of the caller. So if you have a file like so:&lt;/p&gt;

&lt;PRE&gt;
$foo = read_some_db_table();
foreach($foo as $name =&gt; $value) {
        $libray_variable[$name] = $value;
}
# Define library functions and classes that use $library_variable
&lt;/PRE&gt;

&lt;p&gt;And the if you do a "require()" (or a "require_once()") when you have, say, a $name (or $foo or $value. And, of course, $library_variable, but presumably the risk is lower with prefixed names) variable, it gets clobbered by the required file. To avoid this, you have to stuff the init logic into a function:&lt;/p&gt;

&lt;PRE&gt;
function library_init() {
        global $library_variable;
        $foo = read_some_db_table();
        foreach($foo as $name =&gt; $value) {
                $libray_variable[$name] = $value;
        }
}

library_init();
# Define library functions and classes that use $library_variable
&lt;/PRE&gt;

&lt;p&gt;Okay, maybe I should figure out a better than than using a global to avoid hitting the database more than once. But still, I don't see any good use for having required files use the same scope. It binds you too tightly to the code you're loading: Variables you defined could effect it, and variables it defines could effect you. It's not an abstraction if you have to know implementation details to use it safely.&lt;/p&gt;

&lt;p&gt;Once again, the behavior is &lt;a href="http://www.php.net/manual/en/function.include.php"&gt;well documented&lt;/a&gt;, but this doesn't seem like a good excuse to me. "Didn't you read the signs? The dragon eats someone &lt;i&gt;every&lt;/i&gt; week!"&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112303575211460231?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112303575211460231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112303575211460231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112303575211460231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112303575211460231'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/08/php-scope-when-requireing.html' title='PHP scope when require()&apos;ing'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112269685619260882</id><published>2005-07-29T20:44:00.000-07:00</published><updated>2006-11-11T14:36:51.455-07:00</updated><title type='text'>PHP Pop Quiz</title><content type='html'>&lt;p&gt;Quick! What is the output of this PHP script?&lt;/p&gt;

&lt;pre&gt;
[jason@jpc ~]$ cat example.php 
&amp;lt;?php
        $strings = array("/bin/baz", "/usr/bin/foo", "/etc/goober.conf");

        foreach($strings as $string) {
                if(strpos($string, "/bin") == 0) {
                        echo "'$string' begins with /bin\n";
                }
        }

        for($i = 0; i &lt; 5; ++$i) {
                echo "Number: $i\n";
                sleep(1);
        }
?&amp;gt;
[jason@jpc ~]$ php example.php 
'/bin/baz' begins with /bin
'/etc/goober.conf' begins with /bin
Number: 0
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
Number: 6
Number: 7
Number: 8
^C
[jason@jpc ~]$
&lt;/pre&gt;

&lt;p&gt;What happened?&lt;/p&gt;

&lt;p&gt;If you read the &lt;a href="http://www.php.net/manual/en/function.strpos.php"&gt;documentation for strpos&lt;/a&gt;, you see that it returns boolean false when no match is found. Due to PHP rather loose ideas of truth, the statement "false == 0" evaluates to true. You have to use the stricter "===" operator.&lt;/p&gt;

&lt;p&gt;But what's wrong with the loop? The problem is the condition, "i &lt; 5". This obviously should be "$i &lt; 5". PHP sees the "i", looks for a constant named "i", and when it doesn't find one, it assumes you meant a string containing the name of a the constant. PHP would issue a warning when doing this, if E_NOTICE warnings were enabled, which aren't by default. So have have the string "i" in a comparision, when PHP then converts to a number. And what does PHP do with strings that obviously aren't numbers? It just uses a zero. So PHP tests for "0 &lt; 5", and we have an infinite loop.&lt;/p&gt;

&lt;p&gt;Moral: Always have all warnings enabled in php.ini, and read the docs carefully. (Or, if the option presents itself, don't use PHP.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112269685619260882?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112269685619260882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112269685619260882' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112269685619260882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112269685619260882'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/07/php-pop-quiz.html' title='PHP Pop Quiz'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112165278137165264</id><published>2005-07-17T18:47:00.000-07:00</published><updated>2006-11-11T14:36:51.372-07:00</updated><title type='text'>The right tools</title><content type='html'>&lt;p&gt;When I first installed Linux, I cast about for a good email client. The text-mode ones seemed too complicated. I just wanted to read mail. I can't remember exactly what I tried first. It may have been Mozilla Mail. At some point, I tried Evolution. But they all seemed too slow. Then I found &lt;a href="http://sylpheed.good-day.net/"&gt;sylpheed&lt;/a&gt;, which is pretty snappy compared to Mozilla Mail and Evolution. I used that for about two years, then, due to the way life works, I was without a Linux box for about a month, so I got my mail using gmail's web interface. The best thing you can say about gmail's interface is that it's better or at least as good as other web interfaces. The worst thing you can say about gmail's web interface is that it's a web interface.&lt;/p&gt;

&lt;p&gt;So, once again finding myself in a real OS, decided it was time to try mutt. After throwing fetchmail, procmail and &lt;a href="http://msmtp.sourceforge.net/"&gt;msmtp&lt;/a&gt; I was ready to go. Well, not quite. Ready to configuring everything, figure out why msmtp isn't sending, get procmail sorting the way I want, and &lt;i&gt;then&lt;/i&gt; ready to go. Having only used mutt for an hour or two, I'm obviously not as adept at reading mail in it as I would be in sylpheed, or some other graphical mailer. But I can see how powerful it is, and I can see how, in the very near future, the time I spent setting it up will begin to pay itself back.&lt;/p&gt;

&lt;p&gt;A similar thing happened to me when it came to choosing an editor. Emacs and vim were scary, so I used mcedit, a little "just press keys and they go onto the screen" type editor bundled with Midnight Commander. And that was okay. But then I took the time to learn vim, and I can edit much faster now than I could mcedit.&lt;/p&gt;

&lt;p&gt;All this to say, the best tools usually have the steepest learning curves. Be nice if they didn't, but that seems to be the way it is. So don't be afraid to learn.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112165278137165264?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112165278137165264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112165278137165264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112165278137165264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112165278137165264'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/07/right-tools.html' title='The right tools'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112154909814441089</id><published>2005-07-16T13:48:00.000-07:00</published><updated>2006-11-11T14:36:51.285-07:00</updated><title type='text'>Linux and the greater good</title><content type='html'>&lt;p&gt;There's &lt;a href="http://linux.slashdot.org/linux/05/07/16/1928223.shtml?tid=106"&gt;yet another story&lt;/a&gt; about how there's too many Linux distributions, too many toolkits, too many packaging systems, and if people don't start cooperating, Linux will never succeed on the desktop, etc.&lt;/p&gt;

&lt;p&gt;Notice how people talk about this: "Linux" (ie, the tens of thousands of developers worldwide writing the software that together make up what we call a Linux system.) should have this, "Linux" should have that. Fewer, more powerful distros, tools to do what I want. People who talk likes this are essentially saying to people working for free: "Write my code". If you don't like it, shut up and code.&lt;/p&gt;

&lt;p&gt;Secondly, is having lots of distributions really all that bad? For broad view of this, see Rick Moen's excellent essay &lt;a href="http://linuxmafia.com/faq/Licensing_and_Law/forking.html"&gt;Fear of Forking&lt;/a&gt;. But in the case of distributions, do you ever hear anyone talking about how great it was back when you only could use SLS? I wasn't using Linux then, so I googled to make sure I was right about SLS really being the only game in town early on. I found &lt;a href="http://lwn.net/Articles/91371/"&gt;this LWN article&lt;/a&gt; on early Linux distributions. Notice this bit:&lt;/p&gt;

&lt;blockquote&gt;
SLS dominated the market until the developers made a decision to change the executable format (if you remember the a.out to ELF conversion you'll remember this). This was not well received by the user base. Just around the time this happened Patrick Volkerding had taken SLS and adapted, modified, tweaked and cleaned it up making it a different thing all together. He called it Slackware. With the unpopular direction SLS had taken, Slackware quickly replaced it and became the dominant distribution used by nearly everyone. In fact it's still in use today.
&lt;/blockquote&gt;

&lt;p&gt;What was, in essense, the first distribution, forked &lt;i&gt;because people didn't like it&lt;/i&gt;. People didn't like it, so they changed it, and made it their own. So, in what for the lack of a better word I shall call the "mind" of a Slashdotter, what should have been done? Indeed, would they have supported Linux in the first place? Or would they have said, "There's enough Unixes. Don't make another."?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112154909814441089?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112154909814441089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112154909814441089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112154909814441089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112154909814441089'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/07/linux-and-greater-good.html' title='Linux and the greater good'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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-14408200.post-112114530067580114</id><published>2005-07-11T21:58:00.000-07:00</published><updated>2006-11-11T14:36:51.199-07:00</updated><title type='text'>The other Jason Creighton</title><content type='html'>I did an ego search on Google and found &lt;a href="http://jasoncreighton.com/"&gt;this guy&lt;/a&gt;. He's an aspiring musician with a frame-based website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112114530067580114?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112114530067580114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112114530067580114' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112114530067580114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112114530067580114'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/07/other-jason-creighton.html' title='The other Jason Creighton'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14408200.post-112113919828803179</id><published>2005-07-11T20:18:00.000-07:00</published><updated>2006-11-11T14:36:51.099-07:00</updated><title type='text'>Monitor specifications and common sense</title><content type='html'>&lt;p&gt;So I'm trying to find the model name/number on the el cheapo 15" monitor I'm using right now. It says "Mag Innovision" on the front, and the back of the monitor is completely blank. Nothing about FCC compliance, no manufacture date, nothing. They decided to, in a moment of brilliance, put the serial numbers and whatnot on the &lt;span style="font-style: italic;"&gt;bottom&lt;/span&gt; of the monitor. So to see the model number, you have to turn the monitor around, and tilt it at about a 45 degree angle to read it. Turns out it's a "DX15F". Great, I google for it, find the specs no problem, enter them into xorg.conf, and away I go.&lt;/p&gt;

&lt;p&gt;Then it hit me. Why didn't they just print the horizontal and vertical sync ranges on the back? Heck, why not the front? Didn't &lt;span style="font-style: italic;"&gt;anybody&lt;/span&gt; think of this? Did somebody say "Hey, you know what would be good? If we printed the specs right on the monitor!" and then they &lt;span style="font-style: italic;"&gt;didn't&lt;/span&gt; do it? This isn't rocket science.&lt;/p&gt;

&lt;p&gt;I realize this is a non-issue with modern monitors, as they have some magic way to tell the video card what they support. Come to think of it, I don't even know what that standard is called. It's invisible. It just works. In my experience, anyway. I'm sure lots of people have horror stories to tell. But it's a lot better than having to plug in the numbers yourself, or else use some flickering VESA mode.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14408200-112113919828803179?l=jcreigh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcreigh.blogspot.com/feeds/112113919828803179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14408200&amp;postID=112113919828803179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112113919828803179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14408200/posts/default/112113919828803179'/><link rel='alternate' type='text/html' href='http://jcreigh.blogspot.com/2005/07/monitor-specifications-and-common.html' title='Monitor specifications and common sense'/><author><name>Jason Creighton</name><uri>http://www.blogger.com/profile/03218766081192764530</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></feed>
