<?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-947243371254331195</id><updated>2011-07-31T07:14:42.921-04:00</updated><category term='memcached'/><category term='vim'/><category term='open source'/><category term='olpc'/><category term='common lisp'/><category term='web'/><category term='opensocial'/><category term='programming'/><title type='text'>John Watson</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.photodojo.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</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>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-3762193603134929937</id><published>2009-07-14T22:52:00.002-04:00</published><updated>2009-07-14T22:56:58.609-04:00</updated><title type='text'>I Never Update This</title><content type='html'>According to &lt;a href="http://driveyards.com/"&gt;Sean's&lt;/a&gt; blogroll alt-text, I never update this.&lt;br /&gt;&lt;br /&gt;Except to be a wise-ass, apparently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-3762193603134929937?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3762193603134929937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3762193603134929937'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2009/07/i-never-update-this.html' title='I Never Update This'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-1303995743794892426</id><published>2008-02-11T14:27:00.000-05:00</published><updated>2008-02-11T14:33:39.268-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>VIlisp</title><content type='html'>What got me to try Emacs/SLIME was the ability to send code from the editor to the REPL.  There are many other benefits, but that was the big one for me.  Thanks to &lt;a href="http://vim.sourceforge.net/scripts/script.php?script_id=221"&gt;VIlisp&lt;/a&gt;, I can get the functionality I want with Vim.&lt;br /&gt;&lt;br /&gt;The documentation is very good, so I'll just outline how I integrated it into my environment.  Although it has only been tested with CMUCL, it does work out of the box with SBCL.  However, I noticed that the REPL wasn't always quitting properly, so I changed &lt;tt&gt;$QUIT&lt;/tt&gt; in &lt;tt&gt;funnel.pl&lt;/tt&gt; to&lt;tt&gt; "(quit)"&lt;/tt&gt; and it works fine now.  On OS X, I changed the shebang line to use the Perl from macports; there's nothing wrong with the Perl that comes with the OS, I just didn't feel like adding packages with CPAN.&lt;br /&gt;&lt;br /&gt;I placed &lt;tt&gt;VIlisp.vim&lt;/tt&gt; and &lt;tt&gt;lisp-thesaurus&lt;/tt&gt; in&lt;tt&gt; ~/.vim/VIlisp-2.3&lt;/tt&gt; and added the following line to my &lt;tt&gt;.vimrc&lt;/tt&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;autocmd BufRead,BufNewFile *.lisp so $HOME/.vim/VIlisp-2.3/VIlisp.vim&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I put funnel.pl in my path, and placed the following alias for SBCL in my &lt;tt&gt;.bashrc&lt;/tt&gt;:&lt;code&gt;&lt;br /&gt;&lt;br /&gt;alias sbcl="PERL_RL=gnu funnel.pl $HOME/.lisp-pipe sbcl"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A nice side-effect of using funnel.pl is that your REPL will be "wrapped" by the GNU Readline library, so you'll get the benefit of command history and other line editing tools.  Many programs use Readline, so it's worth being familiar with the &lt;a href="http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html"&gt;user interface&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-1303995743794892426?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/1303995743794892426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/1303995743794892426'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2008/02/vilisp.html' title='VIlisp'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-3791676644861873649</id><published>2008-01-25T16:25:00.000-05:00</published><updated>2008-01-25T17:02:28.838-05:00</updated><title type='text'>Perl: Officially Unparseable</title><content type='html'>I came across a &lt;a href="http://perlmonks.org/?node_id=663393"&gt;formal proof&lt;/a&gt; that Perl cannot be parsed.  It is an interesting read if you're into computing theory and programming languages.  I hadn't considered the dynamic nature of Perl's grammar before, or the fact that it is impossible to parse unless you execute it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-3791676644861873649?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3791676644861873649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3791676644861873649'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2008/01/perl-officially-unparseable.html' title='Perl: Officially Unparseable'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-6408295648082753016</id><published>2008-01-22T19:32:00.000-05:00</published><updated>2008-01-22T19:48:25.011-05:00</updated><title type='text'>KDE 4.0</title><content type='html'>&lt;a href="http://arstechnica.com/reviews/os/kde-40-review.ars"&gt;Ars Technica&lt;/a&gt; has a great review of KDE 4.0.&lt;br /&gt;&lt;br /&gt;I installed the Kubuntu/KDE4 Live CD on my laptop (using &lt;a href="http://www.parallels.com/en/"&gt;Parallels&lt;/a&gt;), and overall I agree with the review; it's a great step forward, but not quite ready for everybody.  I've ben a GNOME guy for a lot of years, but I think I'll be switching to KDE in the near future.&lt;br /&gt;&lt;br /&gt;I'm having some trouble with screen repainting (it doesn't), but that's most likely a Parallels/Xorg problem.  Otherwise, provided that you follow the directions for &lt;a href="http://kb.parallels.com/entry/32/568/"&gt;Ubutntu 7.10 as a Guest OS&lt;/a&gt;, it works fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-6408295648082753016?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/6408295648082753016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/6408295648082753016'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2008/01/kde-40.html' title='KDE 4.0'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-3291340042989360382</id><published>2007-11-23T17:08:00.000-05:00</published><updated>2007-11-23T17:20:45.940-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><title type='text'>OLPC</title><content type='html'>The OLPC "Give One, Get One" program has been &lt;a href="http://www.laptopgiving.org/en/index.php"&gt;extended&lt;/a&gt; through December 31&lt;sup&gt;st&lt;/sup&gt;!  I've been really tempted to snap one up, given that it's a cool machine in particular, and a cool idea in general.  Now I have more time to hem and haw over it.&lt;br /&gt;&lt;br /&gt;There are a lot of really neat software being written for the OLPC... Check out &lt;a href="http://wiki.laptop.org/"&gt;wiki.laptop.org&lt;/a&gt; and &lt;a href="http://dev.laptop.org/"&gt;dev.laptop.org&lt;/a&gt; for details on what's out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-3291340042989360382?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3291340042989360382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/3291340042989360382'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2007/11/olpc.html' title='OLPC'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-4879530936332868562</id><published>2007-11-14T18:55:00.000-05:00</published><updated>2007-11-14T19:37:52.272-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Common Lisp and Vim</title><content type='html'>Don't get me wrong, there's a lot to be said for Emacs and &lt;a href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt;.  The fact that so many Lispers use it is hardly a coincidence — it makes for a very powerful and extensible development environment.  I have used the Emacs/SLIME combination long enough to know the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's very nice.&lt;/li&gt;&lt;li&gt;I don't like it.&lt;/li&gt;&lt;li&gt;No, I'm not trying to start a flame war.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Now,  opinions change over time, and perhaps mine will too.  I think the barrier to acceptance is the fact that my current setup with gVim and &lt;a href="http://sbcl.sourceforge.net/"&gt;SBCL&lt;/a&gt; is good enough that I can't justify spending the time to become an efficient Emacs user.  It turns out that Rob Warnock can't either, and he's a guy who really knows where his towel is.&lt;br /&gt;&lt;br /&gt;I came across &lt;a href="http://groups.google.com/group/comp.lang.lisp/msg/6e91e20f2f371b52"&gt;this&lt;/a&gt; message posted on comp.lang.lisp, and ended up writing my own version of the LOAD* function Rob talks about.  It's really a very handy tool, and makes it a lot easier to work with the REPL and your editor of choice.  I keep LOAD* and a few other frequently-used tools loaded in a custom core file, which I create using a file called &lt;a href="http://photodojo.org/lisp/make-core.lisp"&gt;make-core.lisp&lt;/a&gt;.  To create and use a core file, do the following:&lt;br /&gt;&lt;pre&gt;$ sbcl --load make-core.lisp&lt;br /&gt;$ sbcl --core ./sbcl.core&lt;br /&gt;&lt;/pre&gt;Bear in mind that LOAD* is rather naive and hasn't been tested much, so if there are any suggestions for improvement I'd be glad to hear them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-4879530936332868562?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4879530936332868562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4879530936332868562'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2007/11/common-lisp-and-vim.html' title='Common Lisp and Vim'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-4879847941244965865</id><published>2007-11-07T21:20:00.000-05:00</published><updated>2007-11-07T21:21:07.213-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='opensocial'/><title type='text'>OpenSocial</title><content type='html'>There has been a lot of chatter lately about &lt;a href="http://code.google.com/apis/opensocial/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;OpenSocial&lt;/span&gt;&lt;/a&gt;.  Tim &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;O'Reilly&lt;/span&gt; nicely &lt;a href="http://radar.oreilly.com/archives/2007/11/opensocial_social_mashups.html"&gt;summarizes&lt;/a&gt; my biggest problem with it:&lt;br /&gt;&lt;blockquote&gt;... If all &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OpenSocial&lt;/span&gt; does is allow developers to port their applications more easily from one social network to another, that's a big win for the developer, as they get to shop their application to users of every participating social network. But it provides little incremental value to the user, the real target. We don't want to have the same application on multiple social networks. &lt;em&gt;We want applications that can use data from multiple social networks&lt;/em&gt;.&lt;br /&gt;&lt;/blockquote&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OpenSocial&lt;/span&gt; needs to be more than just a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;middleware&lt;/span&gt; for application development. The web is the platform, not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Facebook&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;MySpace&lt;/span&gt; or anything else, and what's really needed are applications that share and leverage all of the information we've put out there. There is a ton redundant data on the web, and it's not limited to just social networks. For example, both Amazon.com and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Netflix&lt;/span&gt; have recommendation systems.  If I want accurate results from both, I have to rate the same movies twice on both sites, and keep both lists up to date.  And if I want to list my favorite movies in my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Facebook&lt;/span&gt; profile?  Yep, I have to enter them in again. I'm barely inclined to do this activity once, let alone three times, and that's just for movies!  If I want to add books, music, video games, etc. then the dance continues ad &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;nauseam&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;One solution is to create a common user database, where users can grant participating applications access to whatever parts of their profile they want.  This would allow applications to share data, and it provides users with a single account for all of the sites they visit. There are a million pros, cons, and technical challenges to this idea, but everything else seems to fall short.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-4879847941244965865?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4879847941244965865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4879847941244965865'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2007/11/opensocial.html' title='OpenSocial'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-947243371254331195.post-4640797960142714456</id><published>2007-11-06T20:24:00.000-05:00</published><updated>2007-11-06T21:00:54.526-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>memcached &amp; Common Lisp</title><content type='html'>My friend &lt;a href="http://myothercar.weebly.com/"&gt;Sean&lt;/a&gt; and I are working on a web site written mainly in Common Lisp.  Since there will be a lot of database reads, we are planning on using &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt; to reduce the load.  I looked around and was glad to find &lt;a href="http://common-lisp.net/project/cl-memcached/"&gt;CL-MEMCACHED&lt;/a&gt;, but in the end I decided to write my own client.  Sometimes you just have to reinvent the wheel when you're new to a language, and I'd rather make my mistakes early on in the development process.  I figure that since I know exactly how to write a memcached client in C, Perl, and Python, doing it in Common Lisp will allow me to focus on one thing (using the language correctly) rather than two (using the language and designing new code).&lt;br /&gt;&lt;br /&gt;I recently read Lamport, Shostak, and Pease's &lt;a href="http://research.microsoft.com/users/lamport/pubs/byz.pdf"&gt;paper&lt;/a&gt; on the &lt;a href="http://en.wikipedia.org/wiki/Byzantine_fault_tolerance"&gt;Byzantine Generals' Problem&lt;/a&gt;, and it gave me an idea on how to improve test coverage.  The memcached client must be tolerant of a server going down &amp;mdash; not too tolerant, mind you &amp;mdash; and one way to simulate this is to write a dummy server who takes the role of a traitorous lieutenant.  When issued a command, this server could&lt;br /&gt;&lt;ul&gt;&lt;li&gt;send a valid (but fake) reply&lt;/li&gt;&lt;li&gt;send a valid error message&lt;br /&gt;&lt;/li&gt;&lt;li&gt;send garbage&lt;/li&gt;&lt;li&gt;close the connection&lt;/li&gt;&lt;/ul&gt;I want to be sure that the library can handle errors appropriately.  Common Lisp has a very powerful condition mechanism &amp;mdash; much more versatile than exceptions &amp;mdash; and I would like to make the most of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947243371254331195-4640797960142714456?l=blog.photodojo.org' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4640797960142714456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/947243371254331195/posts/default/4640797960142714456'/><link rel='alternate' type='text/html' href='http://blog.photodojo.org/2007/11/memcached-common-lisp.html' title='memcached &amp; Common Lisp'/><author><name>John</name><uri>http://www.blogger.com/profile/04709081319381868866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
