<?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-5728814948530385321</id><updated>2012-01-27T14:04:54.380-07:00</updated><category term='network analysis'/><category term='lisp-ru'/><category term='AOP'/><category term='media'/><category term='technology'/><category term='functionalprogramming'/><category term='parallel computing'/><category term='GWT'/><category term='public library of science'/><category term='javascript'/><category term='XP'/><category term='web'/><category term='books'/><category term='compilers'/><category term='CLUDG'/><category term='metasystems'/><category term='continuations'/><category term='software transactional memory'/><category term='academic publishing'/><category term='Apple'/><category term='coworking'/><category term='common lisp'/><category term='software systems'/><category term='distributed systems'/><category term='spreadsheets'/><category term='tuplespaces'/><category term='HTTP'/><category term='motivation'/><category term='psychology'/><category term='travel'/><category term='dylan'/><category term='SaaS'/><category term='postmodernism'/><category term='DomainDrivenDesign'/><category term='internet'/><category term='futurism'/><category term='web programming'/><category term='Subtext'/><category term='AppropriateTechnology'/><category term='work'/><category term='ilc07'/><category term='scheme'/><category term='emacs'/><category term='britain'/><category term='java'/><category term='FreeSoftware'/><category term='ClearSky'/><category term='cloud computing'/><category term='information warfare'/><category term='security'/><category term='academic journals'/><category term='politics'/><category term='programming'/><category term='smalltalk'/><category term='MobSoftware'/><category term='lisp'/><category term='concurrency'/><category term='hackers'/><category term='networking'/><category term='montreal'/><category term='databases'/><category term='transactional systems'/><category term='economics'/><category term='RMS'/><category term='computer vision'/><category term='computer architecture'/><category term='ilc09'/><category term='biomimetics'/><category term='network programming'/><category term='garbage collection'/><category term='ParenScript'/><category term='lisp tutorial'/><category term='history'/><category term='scam'/><category term='architecture'/><category term='automation'/><category term='sociology'/><category term='calgary'/><title type='text'>a CONS is an object which cares</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default?start-index=101&amp;max-results=100'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>149</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5240503123318085074</id><published>2012-01-24T19:24:00.000-07:00</published><updated>2012-01-24T19:40:23.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>WebRTC and the File API</title><content type='html'>Two interesting developments in HTML5 I've recently been made aware of are &lt;a href="http://www.webrtc.org/"&gt;WebRTC&lt;/a&gt; (thanks to &lt;a href="http://axisofeval.blogspot.com/"&gt;Manuel Simoni&lt;/a&gt;) and &lt;a href="http://www.w3.org/TR/file-system-api/"&gt;File API&lt;/a&gt; (thanks to &lt;a href="https://github.com/Miserlou"&gt;Rich Jones&lt;/a&gt;). The RTC part of WebRTC stands for Real-Time Communications, but it's basically a way to provide TCP/IP sockets for a web browser while pretending you're not providing TCP/IP. The top-layer part consists of various video and audio codecs, but the basic gist is a way of providing a bidirectional channel for web browsers to communicate with each other. This is accomplished with NAT traversal in mind (the functionality for traversing NATs and proxies in the reference implementation is provided by the very handy looking &lt;a href="http://code.google.com/p/libjingle/"&gt;libjingle&lt;/a&gt; library that seems to do most of the common NAT traversal tricks).&lt;br /&gt;&lt;br /&gt;One obvious use of WebRTC is providing audio and video chat in webpages without Flash (WebRTC specifies audio/video input, real-time codecs, and jitter buffers). Another obvious use is to develop a BitTorrent-like distribution protocol for videos; something like this should really cut down on YouTube's bandwidth bills.&lt;br /&gt;&lt;br /&gt;The File API provides the potential to use WebRTC for any kind of P2P file sharing. This is I think the most exciting potential of WebRTC.&lt;br /&gt;&lt;br /&gt;To step back in terms of commentary, the web browser has now come full circle to being a very weird virtualized operating system, whose APIs rival Windows in size, idiosyncrasies and complexity. The need for application hosting declines - both the application and "putting your data in the cloud" can now be handled by a Freenode or Tahoe-LAFS-like WebRTC library. What's interesting is that friction surrounding development and deployment should push new web applications away from a centralized server and towards the P2P approach. Unlike fully hosted apps, there is no extra effort involved in making an offline version. Server rent/lease and administration costs are reduced considerably by offloading as much data storage and computation as possible onto the browser. This latter possibility in particular should enable many startups to avoid the capital requirements needed for scaling up services that depend on the network effect, such as most "social" things. I don't like to use buzzwords, but this looks to be disruptive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5240503123318085074?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5240503123318085074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5240503123318085074' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5240503123318085074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5240503123318085074'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/webrtc-and-file-api.html' title='WebRTC and the File API'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-9217877140755563805</id><published>2012-01-22T18:05:00.000-07:00</published><updated>2012-01-22T18:06:13.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>Hollywood Mob</title><content type='html'>The shutdown of MegaUpload and arrest of Kim Dotcom and several MegaUpload employees has been a big news item this week. The event demonstrates one thing: all you have to do is admit that your service can maybe, possibly be used to infringe on copyrights owned by members of the RIAA or MPAA for your company to be shut down, yourself arrested and all your assets seized.&lt;br /&gt;&lt;br /&gt;The tactics of the RIAA/MPAA mafia (&lt;a href="http://partialobjects.com/2012/01/internet-activists-take-down-sopa-goverment-retaliates/"&gt;"essentially the cultural arm of the United States"&lt;/a&gt;) are akin to suing the postal service and manufacturers of cardboard boxes for making it possible for people to receive counterfeit goods. The intimidation is aimed at all strata of online individuals and organizations: viewers of audio/video, hosting services, and software developers.&lt;br /&gt;&lt;br /&gt;I have &lt;a href="http://carcaddar.blogspot.com/2011/12/wealth-vs-creativity.html"&gt;observed before&lt;/a&gt; that the actual business of the RIAA/MPAA members has nothing to do with audio or visual production, but is all about controlling distribution. The goal of the ongoing intimidation is to prevent innovation in distribution channels, and force viewers/hosts/developers to conform to the single distribution model authorized by RIAA/MPAA, regardless of whether any copyrights owned by members of the RIAA/MPAA are actually involved or not.&lt;br /&gt;&lt;br /&gt;An interesting observation is that the RIAA/MPAA doesn't actually know what that distribution model is supposed to be. They are content to do business as usual &lt;a href="http://carcaddar.blogspot.com/2011/12/wealth-vs-creativity.html"&gt;selling plastic discs&lt;/a&gt; (all the while attempting to lock out smaller content producers and distributors with initiatives such as Macrovision, CGMS-A, CSS, ARccOS, SDMI, CPRM/CPPM, Sony rootkit CDs, AACS, Trusted Computing, UEFI (in an unholy alliance with Microsoft), PlaysForSure, HDCP, COPP, PMP, DVB-CPCM, FairPlay, OpenMG, etc.), and pretending that the ol' innertubes is a regional on-demand cable network (Netflix, Hulu, Spotify). Selling singles on iTunes (regionally restricted, of course) is about as innovative as the RIAA/MPAA members have dared to get in online distribution.&lt;br /&gt;&lt;br /&gt;The arrest of Kim Dotcom has parallels to the 2004 arrest of Isamu Kaneko, author of the Winny file sharing program.&lt;br /&gt;&lt;br /&gt;I am a card-carrying member of the Pirate Party of Canada. Given all the above observations and my previously expressed opinions on the futility and negative consequences of online copyright enforcement, I believe it's not safe for me to head up a project one of whose possible uses is to distribute files at the current time.&lt;br /&gt;&lt;br /&gt;On the other hand, I have gotten really interested in research around F2F overlay networks and cryptographically-enabled online privacy, so expect me to write more about that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-9217877140755563805?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/9217877140755563805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=9217877140755563805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9217877140755563805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9217877140755563805'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/hollywood-mob.html' title='Hollywood Mob'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7713321117787543613</id><published>2012-01-18T17:06:00.001-07:00</published><updated>2012-01-18T17:10:57.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Upcoming presentation about Parenscript</title><content type='html'>I'm going to be giving a talk about &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; to the &lt;a href="http://www.meetup.com/Montreal-Scheme-Lisp-Users-Group/"&gt;Montreal Scheme/Lisp Users Group&lt;/a&gt; on Thursday, January 19 (meeting details &lt;a href="http://www.meetup.com/Montreal-Scheme-Lisp-Users-Group/events/46269562/"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The slides I'm going to be using are &lt;a href="https://sites.google.com/site/vsedach/parenscript_mslug.pdf"&gt;here&lt;/a&gt;, and a list of links referenced in the talk is below. The &lt;a href="http://carcaddar.blogspot.com/2007/09/lisping-in-nyc.html"&gt;last time&lt;/a&gt; I gave a presentation on Parenscript was to &lt;a href="http://www.lispnyc.org/"&gt;LispNYC&lt;/a&gt; in 2007. Parenscript has received a huge number of changes and improvements since then, and continues to be the best language/compiler to JavaScript and one of the best tools available for web application development. What's also new since 2007 are libraries and tools that extend Parenscript: &lt;a href="https://github.com/gonzojive"&gt;Red Daly&lt;/a&gt; has added CLOS and the Common Lisp condition system to JavaScript as a Parenscript library, and there are now several options for interactive development with SLIME in your browser.&lt;br /&gt;&lt;br /&gt;Links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://ceaude.twoticketsplease.de/js-lisps.html"&gt;Moritz Heidkamp's survey of Lisp-in-JavaScript implementations&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.kantz.com/jason/programs/jsgen/"&gt;Jason Kantz's JSGEN&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://github.com/gigamonkey/monkeylib-foo/blob/master/lispscript.lisp"&gt;Peter Seibel's Lispscript&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://github.com/gonzojive/paren-psos"&gt;Red Daly's PSOS&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Dumping_Grounds#Language"&gt;Catherine Gaudron and Marc Feeley's JavaScriptScheme Scheme to JavaScript compiler&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Web frameworks: &lt;a href="http://bknr.net/html/home.html"&gt;BKNR&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/ucw/"&gt;UCW&lt;/a&gt;, &lt;a href="http://weblocks.viridian-project.de/"&gt;Weblocks&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/teepeedee2/"&gt;teepeedee2&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Libraries: &lt;a href="http://common-lisp.net/project/suave/"&gt;Suave&lt;/a&gt;, &lt;a href="https://github.com/paddymul/css-lite"&gt;css-lite&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/clouchdb/"&gt;clouchdb&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt;, &lt;a href="http://code.google.com/p/cl-closure-template/"&gt;cl-closure-template&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-sop.inria.fr/indes/scheme2js/"&gt;Scheme2JS&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lists.common-lisp.net/pipermail/parenscript-devel/2009-November/000641.html"&gt;Parenscript mailing list thread on multiple value return&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blogs.bl0rg.net/netzstaub/2005/03/14/parenscript/"&gt;Manuel Odendahl's original Parenscript announcement&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://github.com/3b/slime-proxy"&gt;slime-proxy&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7713321117787543613?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7713321117787543613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7713321117787543613' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7713321117787543613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7713321117787543613'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/upcoming-presentation-about-parenscript.html' title='Upcoming presentation about Parenscript'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-3029118024417586833</id><published>2012-01-17T19:39:00.001-07:00</published><updated>2012-01-17T19:42:31.828-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Compiling by simplifying</title><content type='html'>When you read the original &lt;a href="http://library.readscheme.org/page1.html"&gt;Lambda Papers&lt;/a&gt; carefully, one thing you notice is that Steele didn't view Scheme as just a programming language, but also (and I would argue, primarily) as a philosophy of constructing compilers.&lt;br /&gt;&lt;br /&gt;This philosophy made clear and transparent the issues of translating a high-level language into Von Neumann-style register machine code, and provided mechanisms to radically simplify the transformation. Continuation-passing style reified issues of control transfer, temporary stack values, and register use. Function arguments become registers, function calls - jumps. Difficult issues like nested scopes, first-class functions, closures, and exceptions become easy.&lt;br /&gt;&lt;br /&gt;The other great, simplifying thing about Steele's philosophy is the self-similarity of the code as it undergoes transformation. The input of each stage of the compiler is a Scheme program, and (until machine code generation), the output is a simpler Scheme program.&lt;br /&gt;&lt;br /&gt;Many compilers miss out on the self-similarity aspect of Scheme in two major ways. Those compilers that do follow continuation-passing style usually implement the CPS portion of compilation using completely different data structures than the other portions. This adds needless boilerplate code and makes the CPS portion look more complicated than it is. This needless complexity shows up in some ML compilers - in particular, Andrew Appel's otherwise excellent and highly recommended Compiling with Continuations, and causes people to remark that implementing &lt;a href="http://mlton.org/pipermail/mlton/2003-January/023054.html"&gt;SSA is not all that much harder than doing CPS&lt;/a&gt; (Olin Shivers &lt;a href="http://www.ccs.neu.edu/home/shivers/papers/cfa-retro.ps"&gt;disagrees&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The subtler, but even more serious omission is ignoring Steele's advice to implement the parts of the language above the intermediate layers as macros. This spreads the complexity for implementing features like classes and objects throughout the different portions of the compiler, starting with the parser.&lt;br /&gt;&lt;br /&gt;Following Steele's techniques, building a Scheme compiler that is several times faster (and many times smaller) than the compilers/virtual machines of popular dynamic languages like Python and Ruby is easy. &lt;a href="http://s48.org/"&gt;Scheme 48&lt;/a&gt; was originally written in 48 hours. If you don't have that much time, Marc Feeley can show you how to build a &lt;a href="http://www.iro.umontreal.ca/~boucherd/mslug/meetings/20041020/minutes-en.html"&gt;Scheme compiler in 90 minutes&lt;/a&gt;. And if you're really strapped for time and don't want to sit through CPS theory, Abdulaziz Ghuloum shows you how to dive right into &lt;a href="http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf"&gt;generating x86 machine code in 10 pages&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-3029118024417586833?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/3029118024417586833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=3029118024417586833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3029118024417586833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3029118024417586833'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/compiling-by-simplifying.html' title='Compiling by simplifying'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2725105162111429000</id><published>2012-01-11T12:53:00.002-07:00</published><updated>2012-01-11T12:56:13.056-07:00</updated><title type='text'>The personal computer you've never heard of</title><content type='html'>I was watching Dan Ingalls' &lt;a href="http://www.youtube.com/watch?v=pACoq7r6KVI#t=42m50s"&gt;Seven (give or take) Smalltalk Implementations&lt;/a&gt; talk given at Stanford in 2005 on YouTube, and around the 43 minute mark Ingalls talked about something I consider shocking:&lt;br /&gt;&lt;br /&gt;In 1978*, a year after the introduction of the Apple II, Xerox PARC built a portable computer with a 7 inch, 640 by 480 resolution bit-mapped, touch-screen display based around a commonly available 1 MHz, 16-bit microprocessor with 128 KiB** of memory running Smalltalk-76. The computer was called the NoteTaker.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-pb0o9zoRXT0/Tw3pK9V1qRI/AAAAAAAAATs/A8KyN8H47Vg/s1600/xerox_notetaker.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 286px;" src="http://4.bp.blogspot.com/-pb0o9zoRXT0/Tw3pK9V1qRI/AAAAAAAAATs/A8KyN8H47Vg/s400/xerox_notetaker.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5696465478167669010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The NoteTaker ran Smalltalk as fast as the Alto (the Smalltalk-76 VM (6 KiB) actually executed bytecode twice as fast on the 8086 as on the Alto, but the memory bus was much slower, making interactive performance feel similar).&lt;br /&gt;&lt;br /&gt;I always thought the 8086 was extremely underpowered and good only for DOS and terminals. In hindsight, it's mind-boggling how long it took x86 PCs to catch up with the Macintoshes and Amigas of the 1980s.&lt;br /&gt;&lt;br /&gt;* Note that Wikipedia and other sources give the NoteTaker's date as 1976, but this is likely the date when design started, as the 8086 design also just started in 1976 and the processor did not ship until 1978. The &lt;a href="http://www.bitsavers.org/pdf/xerox/notetaker/memos/19790118_NoteTaker_System_Manual.pdf"&gt;NoteTaker manual&lt;/a&gt; is also dated December, 1978.&lt;br /&gt;&lt;br /&gt;** The &lt;a href="http://www.bitsavers.org/pdf/xerox/notetaker/memos/19790118_NoteTaker_System_Manual.pdf"&gt;NoteTaker manual&lt;/a&gt; specs the machine at 256 KiB of memory.&lt;br /&gt;&lt;br /&gt;*** The &lt;a href="http://en.wikipedia.org/wiki/Xerox_NoteTaker"&gt;current Wikipedia article about NoteTaker&lt;/a&gt; claims this computer would have cost more than $50,000 if sold commercially (presumably in 1978 dollars). Assume that the CRT, floppy disk, power supply, keyboard and mouse cost $2,000 (a whole Apple II system with 4 KiB memory &lt;a href="http://oldcomputers.net/appleii.html"&gt;retailed for $1,298.00 in 1977&lt;/a&gt;). The 8086 &lt;a href="http://www.techrepublic.com/blog/classic-tech/intels-8086-passes-the-big-3-0/142"&gt;originally wholesaled&lt;/a&gt; for $360. According to the NoteTaker manual, the NoteTaker had a second 8086 which acted as an I/O processor but was "also available for general purpose computing tasks." It would have been entirely possible to replace the I/O processor with a much cheaper CPU. Looking again at Apple's price list, a 48 KiB Apple II board retailed for $1,938, while a bare-bones 4 KiB one sold for $598, which gives $31 per KiB. So 128 KiB would retail for $3,900 and 256 KiB would retail for $7,800. It certainly would have been possible to produce and maybe even sell the NoteTaker with 256 KiB of memory for less than $15,000. Note that a few years later, Kim McCall and Larry Tessler made &lt;a href="http://www.scribd.com/doc/77942852/TinyTalk-a-Subset-of-Smalltalk-76-for-64KB-Microcomputers"&gt;a subset of Smalltalk-76&lt;/a&gt; that ran in 64 KiB of memory, but with the full system image only about 8 KiB of memory was available for user programs.&lt;br /&gt;&lt;br /&gt;**** The NoteTaker also came with an Ethernet interface.&lt;br /&gt;&lt;br /&gt;PS - While researching this article, I also stumbled on another PC you've probably never heard of. The &lt;a href="http://www.computerhistory.org/timeline/?year=1971"&gt;Kenbak-1&lt;/a&gt;, similar in operation and capabilities to the MITS Altair 8800 (both came with lights, toggle switches, and 256 bytes of memory), was sold via advertisements in Scientific American for $750 in 1971, four years before the Altair.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2725105162111429000?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2725105162111429000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2725105162111429000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2725105162111429000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2725105162111429000'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/personal-computer-youve-never-heard-of.html' title='The personal computer you&apos;ve never heard of'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pb0o9zoRXT0/Tw3pK9V1qRI/AAAAAAAAATs/A8KyN8H47Vg/s72-c/xerox_notetaker.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-574568301451687573</id><published>2012-01-11T11:04:00.000-07:00</published><updated>2012-01-11T11:06:06.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>What is ClearSky going to look like as an application?</title><content type='html'>&lt;a href="http://carcaddar.blogspot.com/search/label/ClearSky"&gt;ClearSky&lt;/a&gt; is going to have to be as simple as possible to use. Facebook-level simplicity. The only unavoidable extra requirement is that the node software is going to have to run as a binary on your own computer. The installation process needs to consist of just downloading a single binary. Once you have it, no more extra installation steps.&lt;br /&gt;&lt;br /&gt;The first time the binary is run, it opens a web browser pointing to a page that asks you to choose a nickname and password (the binary will have a web server to present the local interface). In the background, it's going to generate a private/public key pair and set up the filesystem directory where you store data for that account. After that, it will let you look up friends online. I'm undecided about how this step will work. There are a lot of alternatives for federated, centrally located directories: just build a web one, &lt;a href="http://xmpp.org/"&gt;XMPP&lt;/a&gt; (integration with chat seems like a good idea), IRC, etc. I don't know a lot about how the distributed options work, but they are out there and seem to work ok (&lt;a href="http://freenetproject.org/"&gt;Freenet&lt;/a&gt;, &lt;a href="https://gnunet.org/"&gt;GNUnet&lt;/a&gt;, etc.). It seems like a good idea to make this part modular, but present it behind a consistent and easy to use interface.&lt;br /&gt;&lt;br /&gt;The binary will provide an HTTPS port to the outside world to let your friends log in remotely (see &lt;a href="http://carcaddar.blogspot.com/2012/01/friends-with-login-benefits.html"&gt;previous discussion&lt;/a&gt;). If you're behind a NAT gateway, it's going to take some extra work - both the &lt;a href="http://en.wikipedia.org/wiki/NAT_Port_Mapping_Protocol"&gt;NAT-PMP&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol"&gt;IGD&lt;/a&gt; protocols will need to be supported.&lt;br /&gt;&lt;br /&gt;In general, &lt;a href="http://www.brynosaurus.com/pub/net/p2pnat/"&gt;UDP hole punching&lt;/a&gt; needs to be present to let two ClearSky nodes talk to each other, although it alone is not enough to provide remote logins from the outside. UDP hole punching needs an accessible third party to be present - using either a friend's computer that has an unrestricted connection, or a central server if no such friends are available. Using unknown third parties is problematic because it relies on either volunteers (every ClearSky client can be a volunteer, but this opens up possibilities for surveillance) or your &lt;a href="http://carcaddar.blogspot.com/2012/01/payment-for-hosting-and-mirroring.html"&gt;mirror provider&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All traffic between you and your friends goes over &lt;a href="http://en.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt;. Messages and files are cryptographically signed to ensure authenticity, but encryption during transport is provided by SSH. The ClearSky client should encrypt data before writing it to disk to ensure privacy even if the hosting computer gets lost or stolen.&lt;br /&gt;&lt;br /&gt;Apps are going to be started in a separate process (via fork(), or by running the same executable with different options) for extra security, stability, and to let the OS handle resource control. Games, content libraries, chat, voice, calendars etc. are all possible apps. One example app that could be built but that's not possible with Facebook is a &lt;a href="https://tahoe-lafs.org/"&gt;Tahoe-LAFS&lt;/a&gt; that would let you trade harddrive space with your friends to securely and redundantly back up your private data.&lt;br /&gt;&lt;br /&gt;Apps will communicate with the ClearSky process via sockets and the file system. Security is going to be provided by language-level virtualization. The app runtime will prompt the user when the app wants to access filesystem folders or other resources. Things like video and audio will ideally be handled by HTML5, if not then by Flash. It's undesireable to have the app display native UI or use the OS multimedia or other capabilities directly - this shouldn't be included in the platform unless there's a good concrete demonstration that it's needed. OTOH, having an app be able to manage its own sockets may be a good idea.&lt;br /&gt;&lt;br /&gt;Common Lisp is a good language/runtime to base the ClearSky platform on. A Common Lisp binary can run all the basic ClearSky functions (web server, crypto, discovery, networking, SSH) in the same process, provides excellent support for language-level virtualization (and of course already comes with a compiler), and has very good support for hosting and virtualizing other programming languages - of the popular scripting ones, &lt;a href="https://github.com/franzinc/cl-python"&gt;CLPython&lt;/a&gt; and &lt;a href="https://github.com/akapav/js"&gt;CL-JavaScript&lt;/a&gt; are currently available, and new ones are easy to implement: CL-JavaScript was written by 3 people (Alan Pavičić, Marijn Haverbeke, and Iva Jurišić), CL-Python by just one person (Willem Broekema).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-574568301451687573?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/574568301451687573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=574568301451687573' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/574568301451687573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/574568301451687573'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/what-is-clearsky-going-to-look-like-as.html' title='What is ClearSky going to look like as an application?'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5809342387773095960</id><published>2012-01-09T13:04:00.002-07:00</published><updated>2012-01-09T13:08:34.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>Payment for hosting and mirroring</title><content type='html'>Having a purely p2p private messaging and file sharing network works up to a tradeoff between the number of nodes, the aggregate average availability and bandwidth of all nodes, and the file sizes being shared. The larger a p2p network becomes, the less trusted and private it's going to be. But for example a torrent with a small number of seeders with low upload speeds doesn't work very well for huge files.&lt;br /&gt;&lt;br /&gt;It would be nice to share a large number of large files securely with your friends over a high-bandwidth link. As well, having a reliable server on a high-bandwidth link would make replication and backup of your data more convenient.&lt;br /&gt;&lt;br /&gt;A large number of companies offer storage services that can do that. Dropbox is the most popular, but it doesn't provide convenient sharing features because it focuses on replicating and syncing your private files. Ubuntu One is similar. These services are also insecure - Dropbox and Ubuntu One can read your files.&lt;br /&gt;&lt;br /&gt;The service that's most convenient for private and easy to share storage on remote hosted servers was &lt;a href="http://allmydata.org"&gt;Allmydata&lt;/a&gt;. Allmydata may be gone, but the people behind and software behind it (&lt;a href="https://tahoe-lafs.org/"&gt;Tahoe-LAFS&lt;/a&gt;) are still there. Tahoe-LAFS is Free Software and the techniques and algorithms well documented.&lt;br /&gt;&lt;br /&gt;But storage and bandwidth aren't free. How would the economic model behind a secure, private mirroring service work?&lt;br /&gt;&lt;br /&gt;Very few people want to pay cash for mirroring. Can't have the mirror show you ads - that would defeat the privacy aspect (besides, how would these ads be served and where would they be viewed?).&lt;br /&gt;&lt;br /&gt;But your computer is going to be on a lot of the time to participate in the p2p network. Why not have it mine &lt;a href="http://bitcoin.org/"&gt;bitcoins&lt;/a&gt;? Then you can pay for mirroring storage/bandwidth with the bitcoins gained from contributing work to a &lt;a href="https://en.bitcoin.it/wiki/Pooled_mining"&gt;mining pool&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Metcalfe's_law"&gt;Metcalfe's law&lt;/a&gt; hypothesizes that each node brings value to the network when it joins. A logical conclusion is that not only the network, but the node itself should be able to realize that value in monetary terms. Cryptographic currency mining enables this.&lt;br /&gt;&lt;br /&gt;Another long sought-after idea that may be enabled by the mining approach is micropayments, but that's a problematic and unrelated area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5809342387773095960?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5809342387773095960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5809342387773095960' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5809342387773095960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5809342387773095960'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/payment-for-hosting-and-mirroring.html' title='Payment for hosting and mirroring'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4189313904395057597</id><published>2012-01-07T13:54:00.003-07:00</published><updated>2012-01-07T14:16:44.382-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>Who else is working on this stuff?</title><content type='html'>None of the ideas in the &lt;a href="http://carcaddar.blogspot.com/search/label/ClearSky"&gt;ClearSky&lt;/a&gt; concept are original to me. This is sort of the zeitgeist of the times. Here's a list of people and projects that have thought about or are working on the same problem:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://freedomboxfoundation.org/"&gt;FreedomBox Foundation&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://the-edge.blogspot.com/"&gt;Dave Taht&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lists.canonical.org/pipermail/kragen-tol/"&gt;Kragen Javier Sitaker&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://singly.com/"&gt;Singly&lt;/a&gt; (see also this &lt;a href="http://www.ugotrade.com/2011/02/10/jeremie-miller-the-locker-project-give-a-data-platform-to-the-people-in-the-era-of-data-everywhere-and-bloom-presents-fizz/"&gt;hype piece&lt;/a&gt;)&lt;br /&gt;&lt;li&gt;The guy behind &lt;a href="http://unqualified-reservations.blogspot.com/2011/10/personal-cloud-computing-in-2020-or-not.html"&gt;Unqualified Reservations&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.tonido.com/"&gt;Tonido&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://unite.opera.com/applications/"&gt;Opera Unite&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://storify.com/andybroomfield/at-leashless-cryptographic-internet-tweets"&gt;Vinay Gupta&lt;/a&gt;&lt;/ul&gt;The basic idea stems back to the home media convergence attempts of the late 90s (and indeed Tonido is still following this marketing strategy).&lt;br /&gt;&lt;br /&gt;Why no one has been successful so far is that the solutions offered are too hard to use (if it's any harder than Facebook, very few people will use it), don't address the issue of replication (Tonido and Opera Unite, for example), and don't have sustainable revenue models. I think that with the right design, engineering and business approach, these problems are not insurmountable.&lt;br /&gt;&lt;br /&gt;You might notice I left out one project: &lt;a href="https://joindiaspora.com/"&gt;Diaspora&lt;/a&gt;. A look at Diaspora's &lt;a href="https://github.com/diaspora/diaspora"&gt;source code&lt;/a&gt; should convince you that while the project claims the same goals, the approach they're taking does not address any of the three aspects mentioned above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4189313904395057597?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4189313904395057597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4189313904395057597' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4189313904395057597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4189313904395057597'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/who-else-is-working-on-this-stuff.html' title='Who else is working on this stuff?'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-73896441925514621</id><published>2012-01-07T13:47:00.001-07:00</published><updated>2012-01-07T13:48:43.352-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FreeSoftware'/><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>The future of the App Store is source-only distribution</title><content type='html'>Following up on the &lt;a href="http://carcaddar.blogspot.com/2012/01/i-dont-want-clouds-i-want-clear-skies.html"&gt;ClearSky idea&lt;/a&gt;, let's look at what the applications that run on your and your friends' computers will be like.&lt;br /&gt;&lt;br /&gt;Obviously, the &lt;a href="http://developer.apple.com/library/ios/#technotes/tn2250/_index.html#//apple_ref/doc/uid/DTS40009933"&gt;Apple app store model of cryptographic signing&lt;/a&gt; is useless as a measure of trust of what an application does in a decentralized scenario (note that this is different than using signing to establish authenticity during application distribution). The Apple app store model of cryptographic signing is actually useless for Apple app store apps as well - I know of at least two apps that have made it into the Apple app store that will keep an open, non-password protected telnet port on your iPhone. So centralized quality control does not work.&lt;br /&gt;&lt;br /&gt;Will virtualization be able to solve the safety problem? What virtualization is really about is names and meta-machines. In the case of running a VMware virtual machine on your real PC, your real PC is the meta-machine from the point of view of the VMware one, and memory addresses are the names. As long as the software in the VMware box has no access to the memory addresses belonging to your real PC, it cannot escape to do things that the VMware virtual machine cannot already do (you can think of virtualization like being the plot of The Matrix).&lt;br /&gt;&lt;br /&gt;Even if the virtualization is unbreakable and the virtual machine does everything you need without posing a danger to your data (and how would it do that if it needs to modify your data to be useful?), you cannot tell whether the app that the virtual machine will run doesn't have secret back-doors or information leaking channels (both can be accomplished using steganography to hide things in the data the app consumes and produces as part of its regular operation). Checking compiled binaries for these is simply not feasible.&lt;br /&gt;&lt;br /&gt;The only alternative that is left is the one advocated by Richard Stallman - you can't trust a program unless you can read its source code. While it is still possible to hide back-doors in source code, it requires a very large and extremely messy code base to hide them effectively. And very large and extremely messy code bases tend to lead to shit applications that no one really wants to use (unless corporate IT makes you). Applications with clean code bases that are easy to audit are nice; use them.&lt;br /&gt;&lt;br /&gt;Note that this model of software distribution (source-only) is not new - in fact, it has been the most popular method of software distribution for the last 10 years. This is how JavaScript works. And JavaScript has also shown that language-level virtualization (ie "sandboxing") is extremely effective as a security mechanism - there have been very few exploits where an attacker was able to escalate privileges outside of the JavaScript virtual machine.&lt;br /&gt;&lt;br /&gt;There are two ways to get around the "easily auditable source" ideal with JavaScript. The most popular way is to use code obfuscation tools. The other way (which in the past year has gained more and more recognition) is to use JavaScript itself to implement another virtual machine (kind of like Russian nesting dolls).&lt;br /&gt;&lt;br /&gt;While there is no way to prevent these two techniques (and in fact it is undesirable to do so; but it doesn't stop Apple from trying), you certainly should be able to have the freedom to use applications written and audited by people you trust. The centralized, signed app store approach used by Apple destroys this continuum of trust by putting all applications on an equal level - "approved by Apple" doesn't mean much when the approval process is secretive, arbitrary, and does not guarantee quality or security.&lt;br /&gt;&lt;br /&gt;Are there any other benefits to source-only distribution besides security? Plenty: complete portability, high performance (compile to native code), tiny download sizes, easy dependency management, etc.&lt;br /&gt;&lt;br /&gt;One way to encourage the ideal of "easily auditable source" is via licensing. This is where the innovation of Henry Poole comes in handy - the &lt;a href="http://www.affero.org/oagpl.html"&gt;Affero GPL&lt;/a&gt; is the most business-friendly of all Free Software licenses (more on that in a later post) and when used effectively will enable disruptive new business models. The "platform" part of the hypothetical ClearSky virtual machine will benefit tremendously from being licensed under the AGPL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-73896441925514621?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/73896441925514621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=73896441925514621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/73896441925514621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/73896441925514621'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/future-of-app-store-is-source-only.html' title='The future of the App Store is source-only distribution'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7209762106147231197</id><published>2012-01-05T10:25:00.002-07:00</published><updated>2012-01-07T13:49:06.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>Friends with [login] benefits</title><content type='html'>To follow up on the &lt;a href="http://carcaddar.blogspot.com/2012/01/i-dont-want-clouds-i-want-clear-skies.html"&gt;last post&lt;/a&gt;, think about what it would mean to have a web application running on your friends' computers. How would you log in from a random computer on the Internet?&lt;br /&gt;&lt;br /&gt;The account name and password combination is convenient to remember and seems to work well in practice for logging in to computer systems.&lt;br /&gt;&lt;br /&gt;It's easy enough keeping your password secret when you log into your own machine, and you can use public-key cryptography to have trusted communications with your friends. You can remember your account name and password, but you're not going to be carrying around your private key (if such a system is to work for most people, you're probably not even going to be aware you have a private key).&lt;br /&gt;&lt;br /&gt;You can trust your friends, but you don't want to tempt them by transmitting the cleartext passwords to their machine (ever have an obsessive ex as a friend on Facebook?). Having a unique password for each of your friends' machines won't work because you can't remember them all.&lt;br /&gt;&lt;br /&gt;On the other hand, you can assume that your friends probably won't want to crack your password hash to get your password, and if their machine ever gets stolen, they'll tell you so you can change your password (ok, maybe that last point is not true).&lt;br /&gt;&lt;br /&gt;If you take your password, assign each of your friends a unique salt, and give them the salt and the PBKDF2 (or whatever) digest of the salt and password, you can do the password checking in any browser with JavaScript by having their machine send the salt to the browser, the browser computing the PBKDF2 digest and sending it back to their machine, and their machine verifying the digest.&lt;br /&gt;&lt;br /&gt;Your friends don't have your private key, but they can sign your messages with the private keys on their machines on your behalf. If you see strange messages signed on your behalf, you can assume that either your password has been compromised, or your friend's machine is acting maliciously (because it has been stolen, compromised, or your friend is doing the equivalent of the "let's post "I'm pregnant" status update" joke when you forgot to log out of Facebook).&lt;br /&gt;&lt;br /&gt;You still have your private key on your machine, from where you can change your password, repudiate the fake messages, and publish a revised list of friends that you trust to sign messages on your behalf.&lt;br /&gt;&lt;br /&gt;I'm sure this scheme has been thought of before, and I'm sure it has problems I didn't see. Any thoughts or comments? Where should I post this to get the opinions of people knowledgeable on cryptography?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7209762106147231197?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7209762106147231197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7209762106147231197' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7209762106147231197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7209762106147231197'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/friends-with-login-benefits.html' title='Friends with [login] benefits'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-656083750879803011</id><published>2012-01-04T13:57:00.003-07:00</published><updated>2012-01-04T14:02:22.311-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClearSky'/><title type='text'>I don't want Clouds, I want clear skies</title><content type='html'>The Cloud is one of the most idiotic things to happen to computing.&lt;br /&gt;&lt;br /&gt;The only thing fuzzy about The Cloud is the definition of the word. It's basically a way for large companies to bamboozle you into giving up your privacy.&lt;br /&gt;&lt;br /&gt;There's also a lot of wishful thinking reality distortion involved here. Large companies would love it if the only way people could do anything was in The Cloud, because today that word really means "hundreds of thousands of servers," and only large companies have enough capital to afford that, keeping competition out. Hosting companies like Amazon (there, I've said it) love it even more, because they get better utilization of their hundreds of thousands of servers, and therefore of their capital.&lt;br /&gt;&lt;br /&gt;This situation should remind you of something: the 70s. This isn't really any different than the mainframe era. Can't afford &lt;s&gt;a mainframe&lt;/s&gt; tons of servers? Call &lt;s&gt;Tymshare&lt;/s&gt; Amazon!&lt;br /&gt;&lt;br /&gt;So why are all these hundreds of thousands of servers needed? In the case of Google or YouTube, it seems pretty straightforward - it takes a lot of space to index most of the Internet and host millions of cat videos. But what about Facebook? What's really on there besides a few hundred (or maybe thousand) photos, links to YouTube cat videos shared by your friends, and your whiny status updates? It's hard to purchase a USB memory stick that would be small enough &lt;b&gt;not&lt;/b&gt; to fit all that three times over.&lt;br /&gt;&lt;br /&gt;It turns out there are a lot of other things on Facebook. Things like your click stream (ie - things you don't care about), which is needed for analytics (ie - using statistics to invade your privacy) to better serve you advertisements (ie - make you buy things you don't want).&lt;br /&gt;&lt;br /&gt;The only reason Facebook needs to be "web scale!!!" is so they can sell ads. The only reason they're selling ads is because millions of people signed up for Facebook. The only reason millions of people signed up for Facebook is because it's the easiest way to share photos, links to cat videos, and important news about where they had lunch with their friends (oh yeah, and play Farmville or whatever).&lt;br /&gt;&lt;br /&gt;Putting it this way, it's obvious why Facebook needs to sell ads - their service isn't valuable enough to you to get you to pay for it. So it's certainly not worth your time to set up your own web server with a bunch of pub/sub protocols and get all your friends to do the same so you can log into your MyFace social network to post inane status updates and grow virtual beets from other random computers connected to the Internet. That's hard, and who wants to pay for hosting?&lt;br /&gt;&lt;br /&gt;Except you and your friends already have one or more computers connected to the Internet. What if it was easy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-656083750879803011?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/656083750879803011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=656083750879803011' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/656083750879803011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/656083750879803011'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2012/01/i-dont-want-clouds-i-want-clear-skies.html' title='I don&apos;t want Clouds, I want clear skies'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-844696438741871663</id><published>2011-12-24T10:27:00.002-07:00</published><updated>2011-12-24T11:29:37.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Don't steal my REPL, or Lisp lessons from ledger</title><content type='html'>&lt;a href="http://newartisans.com/"&gt;John Wiegley&lt;/a&gt;'s &lt;a href="https://github.com/jwiegley/ledger"&gt;ledger&lt;/a&gt; is a popular double-entry accounting system with a Unix command line interface.&lt;br /&gt;&lt;br /&gt;What many people don't know is that &lt;a href="https://github.com/jwiegley/cl-ledger"&gt;version 3&lt;/a&gt; of ledger was written in Common Lisp. This version was never made into an official release. In a &lt;a href="http://twit.tv/show/floss-weekly/150"&gt;FLOSS weekly podcast&lt;/a&gt;, Wiegley explains (31:00) that Common Lisp wasn't the best choice for ledger's users.&lt;br /&gt;&lt;br /&gt;I emailed John to learn more about this. He replied that there were only two major problems: building cl-ledger was more difficult than building ledger, and that cl-ledger could no longer be scripted from the command line. In effect, the Common Lisp REPL had stolen the place of the Unix command line as ledger's interface.&lt;br /&gt;&lt;br /&gt;cl-ledger was written in 2007, and there are now good solutions to these problems. ASDF works well as a build system, but before &lt;a href="http://www.quicklisp.org/"&gt;Quicklisp&lt;/a&gt;, dependency management for Common Lisp applications was difficult. Quicklisp solved the biggest outstanding problem in building Common Lisp applications. (PS - you can give Zach a &lt;a href="http://www.quicklisp.org/donations.html"&gt;Christmas gift&lt;/a&gt; for his work on Quicklisp)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lrde.epita.fr/~didier/about/news.php"&gt;Didier Verna&lt;/a&gt;'s &lt;a href="http://www.lrde.epita.fr/~didier/software/lisp/clon.php"&gt;Command-Line Options Nuker&lt;/a&gt; is a widely portable Unix CLI library with many features that you can use to build command-line driven Common Lisp applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-844696438741871663?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/844696438741871663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=844696438741871663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/844696438741871663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/844696438741871663'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/12/dont-steal-my-repl-or-lisp-lessons-from.html' title='Don&apos;t steal my REPL, or Lisp lessons from ledger'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-9116120870816771350</id><published>2011-12-22T21:31:00.003-07:00</published><updated>2011-12-22T21:43:05.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='psychology'/><title type='text'>Wealth vs Creativity</title><content type='html'>The basis of wealth is exclusively material. Everything non-material in an economy is a social convention.&lt;br /&gt;&lt;br /&gt;Money, trade, and even labor is worthless unless it satisfies a particular desire in a particular point in time (see Deleuze and Guattari's &lt;em&gt;Anti-Oedipus&lt;/em&gt; about the role of desire in capitalism).&lt;br /&gt;&lt;br /&gt;It's easy to accept that money is a social convention, but how can labor be worthless? The famous illustration is &lt;a href="http://en.wikisource.org/wiki/That_Which_Is_Seen,_and_That_Which_Is_Not_Seen"&gt;Bastiat's "broken window" fallacy&lt;/a&gt;. While Bastiat's conclusions are correct, his reasoning starts with the wrong assumptions. Wealth has nothing do with the classical notions of trade and utility and "money better spent elsewhere" - the broken window fallacy is directly explained by the material reality of objects.&lt;br /&gt;&lt;br /&gt;The key thing to understand is that material objects are cumulative and impermanent. These two qualities are what drive everything else about wealth.&lt;br /&gt;&lt;br /&gt;A window is cumulative in that it satisfies a desire and has a physical manifestation, and it is impermanent in that the physical manifestation is now broken and the desire is no longer satisfied. Even if currency were completely devalued tomorrow, the fact that a window is there would still satisfy the desire.&lt;br /&gt;&lt;br /&gt;This is why the labor theory of value (indeed any other theory of value that doesn't take into account Deleuze and Guattari's desire machines as the ultimate driver of the economic process) is wrong. Labor or technology itself has no value whatsoever, unless it ultimately (if through a long series of immaterial social transactions) results in the production of a material object &lt;em&gt;that satisfies a desire&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;So far this essay has talked about labor, but what about trade? To understand trade, first we need to define the word: there is no such single thing as "trade," rather the word refers to two things, which may or may not be present in a particular "trade" (transaction): the social (buyer/seller, consignee/consignor relationship) and the material (embodied in labor as transportation of material objects). A purely social transaction would be finance, a purely material one would be theft.&lt;br /&gt;&lt;br /&gt;Trade is obviously important in satisfying desire - if a material object is not in the right place at the right time, it can't satisfy that desire. A chain of social trades resulting in the transportation of a material object then obviously has value.&lt;br /&gt;&lt;br /&gt;One of the most pressing questions today (see: SOPA act), is where does this leave purely social transactions? If you want $10 for a pile of bits, money that will buy you lunch, but someone else is satisfied with a "thanks for sharing!" for the same pile of bits, where does materialism come in?&lt;br /&gt;&lt;br /&gt;The material reality of the world is that those bits are worthless. The movie, music, and publishing industries were built on material objects: selling time slots in seats in a movie theater, selling vinyl and plastic discs, selling bound stacks of paper. The particular content on those material objects was in a very fundamental way completely irrelevant to their business, even if paradoxically it was the key to their business model.&lt;br /&gt;&lt;br /&gt;Knowledge may be cumulative, but it is worthless unless it can be applied to satisfy a desire. It is also &lt;em&gt;permanent&lt;/em&gt; - it cannot be stolen. What knowledge is great at is helping produce better material objects with less cost and greater ability to satisfy desire.&lt;br /&gt;&lt;br /&gt;The real competition to the movie, music and publishing industries are the computer manufacturers and ISPs.&lt;br /&gt;&lt;br /&gt;What the MPAA and RIAA and the SAG are doing when they attempt to put in digital restrictions management into computer hardware and force ISPs to filter content is the equivalent of the Luddites burning water mills and power looms. This is a strategy that will ultimately fail, but in the short term causes a slow-down in the rate of improvement of material objects, both directly (PCs and Internet connections suck more because of attempts to implement digital restrictions management), and indirectly (this improvement in the production of objects is driven by knowledge produced with the aid of PCs and the Internet, in a cumulative process).&lt;br /&gt;&lt;br /&gt;So what about the MPAA excuse that no one will be able to finance the production of big-budget action movies anymore? At a time when the very same progress in material production is drastically reducing the cost of producing a movie (via an all-digital process and computer-generated imagery), this is exactly like arguing that no one will be able to afford to author books during the time of Gutenberg's invention of the printing press.&lt;br /&gt;&lt;br /&gt;The creative urge is a desire &lt;em&gt;in and of itself&lt;/em&gt;. If there's anything you should take away from this essay, it's that people pay to have their desires satisfied.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-9116120870816771350?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/9116120870816771350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=9116120870816771350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9116120870816771350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9116120870816771350'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/12/wealth-vs-creativity.html' title='Wealth vs Creativity'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1597708300858220615</id><published>2011-12-20T22:06:00.003-07:00</published><updated>2011-12-20T22:23:34.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming considered harmful</title><content type='html'>&lt;ul&gt;&lt;li&gt;gotos make it possible to write bad programs&lt;br /&gt;&lt;li&gt;threads make it possible to write bad programs&lt;br /&gt;&lt;li&gt;global variables make it possible to write bad programs&lt;br /&gt;&lt;li&gt;anonymous functions make it possible to write bad programs&lt;br /&gt;&lt;li&gt;macros make it possible to write bad programs&lt;br /&gt;&lt;li&gt;mutable variables make it possible to write bad programs&lt;br /&gt;&lt;li&gt;continuations make it possible to write bad programs&lt;br /&gt;&lt;li&gt;dynamic scoping makes it possible to write bad programs&lt;br /&gt;&lt;li&gt;objects make it possible to write bad programs&lt;br /&gt;&lt;li&gt;recursion makes it possible to write bad programs&lt;br /&gt;&lt;li&gt;...&lt;/ul&gt;&lt;br /&gt;Take this argument far enough, and you are left with the &lt;a href="http://en.wikipedia.org/wiki/SKI_combinator_calculus"&gt;S-K combinators&lt;/a&gt;, and now it is impossible to write good programs.&lt;br /&gt;&lt;br /&gt;Having few features in a programming language is a fault, not a virtue. The bigger fault lies in failing to provide the language with the &lt;a href="http://carcaddar.blogspot.com/2009/06/why-your-language-needs-macros.html"&gt;facilities to be extended with new features&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;No amount of language design can force a programmer to write clear programs.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;--Guy Steele &amp; Gerald Sussman&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1597708300858220615?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1597708300858220615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1597708300858220615' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1597708300858220615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1597708300858220615'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/12/programming-considered-harmful.html' title='Programming considered harmful'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-745097807070299598</id><published>2011-12-12T17:41:00.002-07:00</published><updated>2011-12-12T17:58:51.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Announcing: CLiki2 public beta 2</title><content type='html'>&lt;a href="http://www.cliki.net/index"&gt;CLiki&lt;/a&gt;, the Common Lisp wiki, is a good resource for finding out about Common Lisp libraries and other information. However, the code behind CLiki itself is hard to maintain and add features to. &lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/archimag"&gt;Andrey Moskvitin&lt;/a&gt; and I have been working on a replacement wiki web application on and off for the past eight months. The first public beta came out in the summer. Since then, I've worked the software to the point where I think it's ready as a replacement to power CLiki.&lt;br /&gt;&lt;br /&gt;The second beta of CLiki2 is now up at &lt;a href="http://74.207.228.11/"&gt;http://74.207.228.11/&lt;/a&gt;. Please try it out and let me know what you think. Bugs can be reported at &lt;a href="https://github.com/archimag/cliki2/issues"&gt;https://github.com/archimag/cliki2/issues&lt;/a&gt; or by sending me email: vsedach@gmail.com&lt;br /&gt;&lt;br /&gt;Most of the new features center around spam prevention:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wikipedia-style history lists and diffs for all pages&lt;br /&gt;&lt;li&gt;Lists of edits by account/IP address&lt;br /&gt;&lt;li&gt;Blacklist of accounts and IP addresses&lt;br /&gt;&lt;li&gt;Atom change feeds for individual pages (as well as all of CLiki)&lt;br /&gt;&lt;li&gt;HTML tag filtering&lt;/ul&gt;Other new features include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Real article deletion and undeletion&lt;br /&gt;&lt;li&gt;Code coloring using cl-colorize&lt;br /&gt;&lt;li&gt;Working list of uncategorized/orphan articles&lt;br /&gt;&lt;li&gt;Pages that work well in text browsers (and hopefully screen readers)&lt;br /&gt;&lt;li&gt;No JavaScript&lt;/ul&gt;Pages are marked up using a mixture of HTML (with some tags and attributes filtered out) as well as a slightly simplified form of CLiki syntax.&lt;br /&gt;&lt;br /&gt;Behind the scenes, CLiki2 is powered by &lt;a href="http://weitz.de/hunchentoot/"&gt;Hunchentoot&lt;/a&gt;, &lt;a href="https://github.com/hanshuebner/bknr-datastore"&gt;BKNR-datastore&lt;/a&gt;, and Nathan Froyd's &lt;a href="https://github.com/froydnj/diff"&gt;diff&lt;/a&gt; library.&lt;br /&gt;&lt;br /&gt;Source code is at &lt;a href="https://github.com/vsedach/cliki2"&gt;https://github.com/vsedach/cliki2&lt;/a&gt;, and is licensed under the Affero GPL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-745097807070299598?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/745097807070299598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=745097807070299598' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/745097807070299598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/745097807070299598'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/12/announcing-cliki2-public-beta-2.html' title='Announcing: CLiki2 public beta 2'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4953006507904021095</id><published>2011-11-28T13:44:00.003-07:00</published><updated>2011-11-28T16:47:02.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Montreal Scheme/Lisp Users Group back in action</title><content type='html'>After a long hiatus, the &lt;a href="http://www.meetup.com/Montreal-Scheme-Lisp-Users-Group/"&gt;Montreal Scheme/Lisp Users Group (MSLUG)&lt;/a&gt; is back to regular meetings, with the latest one taking place November 24.&lt;br /&gt;&lt;br /&gt;Marc Feeley gave two talks, the first presenting his experiences adapting the &lt;a href="http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Main_Page"&gt;Gambit Scheme&lt;/a&gt; implementation into the &lt;a href="http://itunes.apple.com/us/app/gambit-repl/id434534076?mt=8"&gt;Gambit REPL&lt;/a&gt; Scheme interpreter app for iOS (most of the difficulties seemed to revolve around the Apple app store screening process). (&lt;a href="http://www.iro.umontreal.ca/~gambit/Gambit-REPL.pdf"&gt;slides&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Then Marc showed and discussed a demo doing distributed computing using mobile, serialized continuations bouncing around Gambit instances on x86 Macs and ARM-based iPhones/iPods. The &lt;a href="http://www.iro.umontreal.ca/~gambit/Distributed-computing-with-Gambit.pdf"&gt;slides&lt;/a&gt; are well worth checking out, particularly for insight into how serialization of problematic objects like I/O streams/ports is done.&lt;br /&gt;&lt;br /&gt;There's at least one Common Lisp project (&lt;a href="http://www.cliki.net/cl-walker"&gt;cl-walker&lt;/a&gt;) that claims to be able to serialize continuations, and another library (&lt;a href="http://www.cliki.net/Storable%20Functions"&gt;Storable Functions&lt;/a&gt;) which claims to be able to serialize closures (from which you can get continuations with a CPS transformer); I haven't tried either and to my knowledge there hasn't been any works done on mobile continuations for Common Lisp, or that much work for mobile code in CL in general.&lt;br /&gt;&lt;br /&gt;The next MSLUG meeting is tentatively January 19th; I'm scheduled to present a talk on &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4953006507904021095?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4953006507904021095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4953006507904021095' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4953006507904021095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4953006507904021095'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/11/montreal-schemelisp-users-group-back-in.html' title='Montreal Scheme/Lisp Users Group back in action'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1737134590850602408</id><published>2011-11-05T15:11:00.001-06:00</published><updated>2011-11-05T15:16:30.129-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Optional dependencies</title><content type='html'>Both &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt; and &lt;a href="https://github.com/paddymul/css-lite"&gt;css-lite&lt;/a&gt; provide optional support for generating JavaScript templates via &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt;. However, I did not want to make Parenscript a required dependency for either library.&lt;br /&gt;&lt;br /&gt;Previously, this was implemented using the #+parenscript &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/01_ebaa.htm"&gt;read-time conditional&lt;/a&gt; in the source files.&lt;br /&gt;&lt;br /&gt;That worked ok if you loaded Parenscript before loading css-lite, but there were two problems:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you initially compiled css-lite without loading Parenscript first, you'd need to go back and re-compile css-lite by hand after loading Parenscript if you wanted the JavaScript output.&lt;br /&gt;&lt;li&gt;If you loaded the css-lite fasls compiled with Parenscript into a fresh Lisp image without loading Parenscript first, you'd get an error.&lt;/ol&gt;&lt;br /&gt;Both of these error stem from the fact that ASDF didn't know anything about the optional Parenscript dependency.&lt;br /&gt;&lt;br /&gt;Didier Verna has written about &lt;a href="http://www.didierverna.com/sciblog/index.php?post/2011/01/25/Optional-system-dependencies-(Clon-v1.0b18)"&gt;optional ASDF dependencies&lt;/a&gt; previously (make sure to read the &lt;a href="http://www.mail-archive.com/asdf-devel@common-lisp.net/msg01405.html"&gt;asdf-devel thread on optional dependencies&lt;/a&gt; Didier links to if you're interested in this). In short, relying on ASDF's :weakly-depends-on seems quite hairy.&lt;br /&gt;&lt;br /&gt;I think I found a simple alternate solution for uri-template that seems to work: put all the Parenscript-dependent code into one file, and then use read-time conditionals in the uri-template.asd list of files like so:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;:components ((:file "package")&lt;br /&gt;             ...&lt;br /&gt;             (:file "destructure-uri")&lt;br /&gt;             #+parenscript (:file "parenscript-implementation")&lt;br /&gt;             )&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can see the full implementation in the latest &lt;a href="https://github.com/vsedach/uri-template/commit/499f8fac92d133205230b2d556fcf16cd7092b6a"&gt;patch to uri-template&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Let me know if you have any ideas about this technique, or optional dependencies in general.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1737134590850602408?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1737134590850602408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1737134590850602408' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1737134590850602408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1737134590850602408'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/11/optional-dependencies.html' title='Optional dependencies'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7481102619130701416</id><published>2011-10-30T15:00:00.000-06:00</published><updated>2011-10-30T16:11:19.316-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Common Lisp is the best language to learn programming</title><content type='html'>Now that Conrad Barski's Land of Lisp (see &lt;a href="http://books.slashdot.org/story/10/11/03/1238213/Land-of-Lisp"&gt;my review on Slashdot&lt;/a&gt;) has come out, I definitely think Common Lisp is the best language for kids (or anyone else) to start learning computer programming.&lt;br /&gt;&lt;br /&gt;Between Land of Lisp, &lt;a href="http://www-2.cs.cmu.edu/~dst/LispBook/"&gt;David Touretzky's Common Lisp: A Gentle Introduction to Symbolic Computation&lt;/a&gt; (really great book for people new to programming, available for free) and The Little LISPer (3rd edition, editions four and up use Scheme) you have three really great resources to get started.&lt;br /&gt;&lt;br /&gt;Lisp's syntax is a great advantage because it is so simple to learn and has so few special cases. The interactive, iterative development style and real late-binding means you can build programs in parts and add to them as you go. The presence of real metaprogramming means you always have the ability to look at any part of your program and its state to find out what it's doing/what's wrong. The &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Front/index.htm"&gt;HyperSpec&lt;/a&gt; and &lt;a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/clm.html"&gt;Common Lisp The Language&lt;/a&gt; are two of the best programming language reference manuals ever written.&lt;br /&gt;&lt;br /&gt;The best parts about Common Lisp are that it's a language that's hard to outgrow and that it makes difficult things easy. One of the chapters in Land of Lisp explains HTTP and HTML and has you build a basic web server. That chapter is only 15 pages! There's tons of ideas in the language, and because you're not restricted to a particular programming paradigm, you're always discovering better ways of doing things and developing a personal style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7481102619130701416?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7481102619130701416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7481102619130701416' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7481102619130701416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7481102619130701416'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/10/common-lisp-is-best-language-to-learn.html' title='Common Lisp is the best language to learn programming'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7096856069632716150</id><published>2011-10-14T13:53:00.005-06:00</published><updated>2011-10-14T14:20:39.164-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>The new digital divide</title><content type='html'>Steve Jobs passed away last week.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kieranhealy.org/"&gt;Kieran Healy&lt;/a&gt; wrote a &lt;a href="http://kieranhealy.org/blog/archives/2011/10/10/a-sociology-of-steve-jobs/"&gt;wonderful examination&lt;/a&gt; of his role at Apple. But there is one thing in there that bears a closer look:&lt;br /&gt;&lt;blockquote&gt;Jobs wanted people to love his products, take care to notice their craftsmanship, and be creative with them. They were supposed to help you make and do awesome things. But this love and attention to creativity was not extended to those involved in the manufacturing process.&lt;/blockquote&gt;I've been meaning to write about this subject, and now seems a good time.&lt;br /&gt;&lt;br /&gt;The iPad, the iPhone, and the Apple App Store are not leading to a new age of digital freedom and creativity. They are creating the &lt;i&gt;real&lt;/i&gt; digital divide.&lt;br /&gt;&lt;br /&gt;Original PCs used to ship with a Basic interpreter. When that stopped, you could still get a programming language implementation without too much trouble. But Apple &lt;a href="http://www.pbs.org/idealab/2010/05/programming-language-for-kids-banned-from-apple-app-store118.html"&gt;goes out of its way&lt;/a&gt; to make the iPad and iPhone not programmable by anyone except a self-selected caste of "developers."&lt;br /&gt;&lt;br /&gt;The awesome things you can do with the iPad have very real limits. Limits that are unnecessary, artificially imposed, and at core opposed to iPad's essence as a programmable computer.&lt;br /&gt;&lt;br /&gt;Ellen Rose wrote about the infantilization of computer "users" in &lt;i&gt;User Error: Resisting Computer Culture&lt;/i&gt;, but few products until the iPad have shown how literal this effect is. Consider Apple's marketing:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-eMpuUCkOe7E/TpiXHpvQfwI/AAAAAAAAARo/4AJeJhOn4xI/s1600/ipadchild.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://1.bp.blogspot.com/-eMpuUCkOe7E/TpiXHpvQfwI/AAAAAAAAARo/4AJeJhOn4xI/s400/ipadchild.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5663442689137344258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Does the above image remind you of anything?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-1HzXyCBNfXU/TpiXIN3egHI/AAAAAAAAAR0/Gju0BJ-UM8A/s1600/Speak%2Band%2BSpell%2BAd%2B1984.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 297px; height: 400px;" src="http://1.bp.blogspot.com/-1HzXyCBNfXU/TpiXIN3egHI/AAAAAAAAAR0/Gju0BJ-UM8A/s400/Speak%2Band%2BSpell%2BAd%2B1984.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5663442698835492978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Further evidence of how literal the infantilization has become is the infamous "fart app" - it is nothing but a direct throwback to the anal stage of Freud's model.&lt;br /&gt;&lt;br /&gt;Richard Stallman made a poorly received &lt;a href="http://stallman.org/archives/2011-jul-oct.html#06_October_2011_%28Steve_Jobs%29"&gt;comment on Jobs' legacy&lt;/a&gt; upon news of the latter's death. I think the negative consequences of the iPad extend well beyond Apple's hostile and exploitative stance towards Free Software&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7096856069632716150?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7096856069632716150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7096856069632716150' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7096856069632716150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7096856069632716150'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/10/new-digital-divide.html' title='The new digital divide'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-eMpuUCkOe7E/TpiXHpvQfwI/AAAAAAAAARo/4AJeJhOn4xI/s72-c/ipadchild.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-8770701893987433538</id><published>2011-09-23T11:30:00.002-06:00</published><updated>2011-09-23T11:32:56.092-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='motivation'/><title type='text'>This is not the Google campus</title><content type='html'>&lt;blockquote&gt;A substantial fraction of workers were absent on any given day, and those at work were often able to come and go... at their pleasure to eat or smoke... [the workplace] would have eating places, barbers, drink shops, and other facilities to serve the workers taking a break. Some mothers allegedly brought their children with them... Workers' relatives would bring food to them.&lt;/blockquote&gt;&lt;i&gt;A Farewell To Alms&lt;/i&gt;, Gregory Clark. p. 363&lt;br /&gt;&lt;br /&gt;This is not about the &lt;a href="http://www.usatoday.com/tech/news/2007-05-10-google-perks_N.htm"&gt;Google complex&lt;/a&gt;, but a description of a 19th century Indian textile factory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-8770701893987433538?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/8770701893987433538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=8770701893987433538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8770701893987433538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8770701893987433538'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/09/this-is-not-google-campus.html' title='This is not the Google campus'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7816055482866699266</id><published>2011-09-20T16:00:00.000-06:00</published><updated>2011-09-20T14:50:17.438-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Common Lisp is case sensitive</title><content type='html'>One Common Lisp feature that needs more publicity is case sensitivity. A common misconception is that Common Lisp is case insensitive, when in fact symbols in Common Lisp are case sensitive.&lt;br /&gt;&lt;br /&gt;By default, the Common Lisp reader is case-converting: all unescaped characters in a symbol name get upper-cased. This gives the practical effect of making it seem as though symbol case doesn't matter. This is desirable behavior for interfacing with other case-insensitive languages (such as Fortran; from what I understand the main motivation for the default Common Lisp behavior), but a pain to interface with case-sensitive ones (such as C).&lt;br /&gt;&lt;br /&gt;The behavior of the reader can be customized via &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_rdtabl.htm"&gt;readtable-case&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The one that might seem to be most useful for having case-sensitive symbols at first glance is :preserve, however remember that all code read in with the default setting (:upcase) is in upper-case, as are all the standard Common Lisp symbols (this is defined by the standard), so this means you will need to spell out all CL and external symbols IN ALL UPPERCASE. To make this less annoying, the :invert readtable-case is the most practical - all-lowercase symbol names become uppercase, all-uppercase become lowercase, and mixed-case stays mixed-case (the important part for case sensitivity). The Lisp printer outputs symbol names correctly this way by default. The only problem now becomes inconsistent spelling of a symbol in all lowercase or all uppercase in old code that expects case conversion. But otherwise you can get case sensitivity for your software by setting readtable-case to :invert today.&lt;br /&gt;&lt;br /&gt;An easy way to manage the readtable-case is by using the &lt;a href="http://common-lisp.net/project/named-readtables/"&gt;named-readtables&lt;/a&gt; library. I've recommended named-readtables before; besides case sensitivity, it helps manage reader macros.&lt;br /&gt;&lt;br /&gt;[This blog post is adapted from the &lt;a href="http://www.cliki.net/Case%20sensitivity"&gt;case sensitivity CLiki FAQ&lt;/a&gt; entry I wrote. Feel free to make corrections and other suggestions on the CLiki page.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7816055482866699266?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7816055482866699266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7816055482866699266' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7816055482866699266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7816055482866699266'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/common-lisp-is-case-sensitive.html' title='Common Lisp is case sensitive'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-8059012218361962714</id><published>2011-09-13T10:40:00.002-06:00</published><updated>2011-09-13T10:43:27.814-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Pioneers are the ones with the arrows in their backs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-gP0Vr0u9Y3g/Tm-HiFSInyI/AAAAAAAAARg/uH6qWni9Okg/s1600/clark-table.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 352px; height: 400px;" src="http://2.bp.blogspot.com/-gP0Vr0u9Y3g/Tm-HiFSInyI/AAAAAAAAARg/uH6qWni9Okg/s400/clark-table.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5651885076976803618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Table of the fates of the inventors of the textile machinery that drove the Industrial Revolution in England. From &lt;i&gt;A Farewell to Alms&lt;/i&gt;, Gregory Clark, p. 235&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-8059012218361962714?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/8059012218361962714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=8059012218361962714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8059012218361962714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8059012218361962714'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/09/pioneers-are-ones-with-arrows-in-their.html' title='Pioneers are the ones with the arrows in their backs'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gP0Vr0u9Y3g/Tm-HiFSInyI/AAAAAAAAARg/uH6qWni9Okg/s72-c/clark-table.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5965621268362285961</id><published>2011-08-28T13:15:00.003-06:00</published><updated>2011-09-06T11:49:33.106-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='psychology'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programmer myopia</title><content type='html'>We like to assume that people are basically competent and rational. Computer programmers enjoy pretending they are more competent and rational than people in other professions.&lt;br /&gt;&lt;br /&gt;In many cases neither of those assumptions is true.&lt;br /&gt;&lt;br /&gt;Two popular memes surrounding programming languages in the 80s and 90s were the assertions that "garbage collection is too slow" and that "dynamic typing doesn't work for large programs."&lt;br /&gt;&lt;br /&gt;Many programmers were convinced both those things were true. In hindsight they were completely wrong, as languages such as Tcl (more on the importance of Tcl in the history of programming languages in an upcoming post), Perl, Java and Python "dragged people halfway to Lisp" and changed public perception.&lt;br /&gt;&lt;br /&gt;How could so many people who consider themselves above-average in competence and rationality be so wrong? (Assume that every programmer is indeed a special snowflake and the &lt;a href="http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect"&gt;Dunning-Kruger&lt;/a&gt; effect doesn't apply).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A hermit spent 10 years writing a program. 'My program can compute the motion of the stars on a 286-computer running MS DOS,' he proudly announced. 'Nobody owns a 286-computer or uses MS DOS anymore,' Fu-Tzu responded.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Eloquent JavaScript&lt;/i&gt;, Marijn Haverbeke&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The problem is that programmers seem unable to think even a couple of years into the future. People complaining about garbage collection in the 80s were looking back at their existing 8-bit Trash-80s instead of at contemporary computers being produced and the future computers being planned. The idea that computers can be good at &lt;a href="http://news.ycombinator.com/item?id=645338"&gt;automating rote tasks&lt;/a&gt; like managing memory and checking and inferring types never occured to them.&lt;br /&gt;&lt;br /&gt;People have trouble imagining the future even if the trends, such as Moore's law, are in front of them. It takes a very long time for people to understand the right ideas. Just ask Alan Kay. Being able to find the appropriate point of view really is better than a high IQ.&lt;br /&gt;&lt;br /&gt;Here are some other Lisp concepts that programmers believe out of ignorance that will take a long time to dispel:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;tail recursion is unnecessary and makes debugging difficult&lt;br /&gt;&lt;li&gt;macro-based metaprogramming results in unmaintainable programs&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5965621268362285961?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5965621268362285961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5965621268362285961' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5965621268362285961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5965621268362285961'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/08/programmer-myopia.html' title='Programmer myopia'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2781117862709197595</id><published>2011-08-12T11:53:00.003-06:00</published><updated>2011-08-12T12:16:24.221-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><category scheme='http://www.blogger.com/atom/ns#' term='futurism'/><title type='text'>Implications of self-driving cars</title><content type='html'>I predict one of the first things &lt;a href="http://googleblog.blogspot.com/2010/10/what-were-driving-at.html"&gt;Google will do with self-driving cars&lt;/a&gt; is automate the trucking industry. This will be a huge change in terms of improving shipping efficiencies, but I don't believe that it will fundamentally disrupt the logistics industry: at most trucking companies, the turnover rate for drivers is &lt;a href="http://en.wikipedia.org/wiki/Trucking_industry_in_the_United_States#Turnover"&gt;&lt;i&gt;over 100%&lt;/i&gt;&lt;/a&gt;. Truck drivers are already treated like robots.&lt;br /&gt;&lt;br /&gt;The current passenger automobile system, on the other hand, will undergo a complete and total change.&lt;br /&gt;&lt;br /&gt;Self-driving cars will lead to an almost complete elimination of both privately owned cars and public transportation in cities. Robot taxis will become so cheap and ubiquitous, and parking space so expensive, that it no longer makes sense to own your own car (many residents of NYC and San Francisco already find parking unaffordable today).&lt;br /&gt;&lt;br /&gt;The first step to this is already being implemented - the &lt;a href="http://cabulous.com/"&gt;automation of taxi dispatching&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Robot cars are safe. The auto insurance industry will be virtually eliminated.&lt;br /&gt;&lt;br /&gt;Robots cars need less maintenance and will refuel themselves. Most gas stations and service shops will be consolidated into a few large service depots.&lt;br /&gt;&lt;br /&gt;A city will have less automobiles but its citizens will use cars more often - even with peak demand, a smaller fleet of robot taxis than private vehicles can service commuter needs.&lt;br /&gt;&lt;br /&gt;Self-driving cars have better road capacity utilization, so even with increased automobile usage the amount of paved roads in cities will be reduced, as unused lanes are reclaimed for real estate development. The same thing will happen to parking lanes and lots - even as demand for parking goes down, the price will rise as the parking spaces get reallocated to more profitable real estate development and the supply shrinks at a faster rate. This will have the effect of greatly reducing road maintenance expenses and increasing property tax income for city governments.&lt;br /&gt;&lt;br /&gt;The layout of cities will return to the pre-automobile era, the most visible changes being narrower streets.&lt;br /&gt;&lt;br /&gt;On the other hand, the highway system will face pressure to expand, as robot taxis will undoubtedly be used as a substitute for air, train, and bus travel. Robot taxi operators will be national or even international in scale, and who cares if a particular robot taxi was working in New York yesterday and is in Chicago today, as long as on average the operators' fleet utilization is maximized? The key ability of self-driving cars to link into aerodynamic paceline "trains" (much like bicycle racing teams) will make long-distance fuel consumption competitive with trains and buses.&lt;br /&gt;&lt;br /&gt;The robot taxis by themselves will also be much more aerodynamic than today's cars. With the elimination of private ownership, automobile body design will no longer be driven by the status symbol desire, but by taxi operators' need to minimize fuel consumption.&lt;br /&gt;&lt;br /&gt;What does this mean for public transit? Buses and street-level tramways will be out, but subway networks will likely remain viable because subways are not vulnerable to traffic jams and snow.&lt;br /&gt;&lt;br /&gt;In terms of traffic, it's likely that the top speed of a journey will decrease, while the average speed increases. Robot cars can potentially negotiate intersections much more effectively than human drivers. Congestion at peak times will likely still be a problem in city centers due to decreased road capacity, but the traffic jams are likely to be shorter and involve higher average speeds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2781117862709197595?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2781117862709197595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2781117862709197595' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2781117862709197595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2781117862709197595'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/08/implications-of-self-driving-cars.html' title='Implications of self-driving cars'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2985371947191771308</id><published>2011-08-12T10:00:00.000-06:00</published><updated>2011-08-12T11:50:18.302-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Smart enough to predict stupidity</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;I think the root of your mistake is saying that macros don't scale to larger groups.  The real truth is that macros don't scale to stupider groups.&lt;/i&gt;&lt;/blockquote&gt;--Paul Graham on &lt;a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg02031.html"&gt;ll1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;People who design programming languages sometimes like to imagine an idealized "average programmer" who will employ their design. The underlying assumption being that the language designer is smarter than the "average programmer," and will set out to protect the latter from their own incompetence.&lt;br /&gt;&lt;br /&gt;The arrogance behind this view is twofold - not only is the language designer deeming himself objectively smarter than other people, but that he will be able to predict how other people's stupidity will play out. In view of this egotism, the (lack of) &lt;a href="http://harmful.cat-v.org/software/java"&gt;quality of the end result&lt;/a&gt; should not be surprising.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;This objection -- "but bad programmers will make a mess of it" -- is the stock objection everybody makes to every unorthodox programming construct. Since it is an objection to everything, it is an objection to nothing.&lt;/i&gt;&lt;/blockquote&gt; --Daniel Gackle on &lt;a href="http://news.ycombinator.com/item?id=2855242"&gt;programming language features&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2985371947191771308?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2985371947191771308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2985371947191771308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2985371947191771308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2985371947191771308'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/08/smart-enough-to-predict-stupidity.html' title='Smart enough to predict stupidity'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2502481908763082501</id><published>2011-06-06T14:32:00.001-06:00</published><updated>2011-06-06T14:36:28.934-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><category scheme='http://www.blogger.com/atom/ns#' term='continuations'/><title type='text'>Continuation-based web applications: just say no</title><content type='html'>Many people still seem to regard continuations as a possible or even preferable method for writing web applications. This blog post aims to dispel that notion and demonstrate that continuation-based web apps belong in the 90s.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why are continuations good?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Anton van Straaten's excellent &lt;a href="http://ll4.csail.mit.edu/slides/rest-slides.pdf"&gt;Continuations Continued&lt;/a&gt; argues that continuations are a good way to &lt;i&gt;model&lt;/i&gt; server-side code, ergo they are a good way to &lt;i&gt;implement&lt;/i&gt; server-side code. The modeling assertion is for some instances correct, the implementation assertion is not.&lt;br /&gt;&lt;br /&gt;Continuations made sense for pre-JavaScript web applications, where each new functionality predicated on a possible user choice (&lt;a href="http://lib.store.yahoo.net/lib/paulgraham/bbnexcerpts.txt"&gt;ViaWeb's color picker palette&lt;/a&gt; being a good example) would lead to combinatorial growth in the complexity of the state machine behind the pages that that functionality would interface with. This is because the server was burdened with what is essentially transient client-side state. With AJAX, this is no longer the case.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why are continuations bad for clients?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are well-known problems with continuation-based web apps: bookmarks, history, and back/forward buttons don't work.&lt;br /&gt;&lt;br /&gt;A web application session is a call-graph from the point of view of the browser, where the URLs are akin to procedures. HTTP interaction flows like a program, with the user making decisions of which procedure to invoke/URL to visit. By this analogy, &lt;i&gt;using continuations is exactly like giving random names to all of the procedures in a program each time a procedure is called&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;This is the core of the problem with continuation-based web applications. Everything that revolves around user control of accessing URLs (bookmarking, history, back/forward, etc.) breaks. This also makes it much harder to test continuation-based web applications programmatically and makes debugging harder.&lt;br /&gt;&lt;br /&gt;One incidental advantage of this breakage is that some URLs do need to be unique and single-access to prevent cross-site attacks and duplicate form submissions. I argue that these mechanisms should be thought of as token-issuing state machines, and implemented explicitly. This leads to simpler code and manifest state.&lt;br /&gt;&lt;br /&gt;Another strategy that has been used is storing continuations on the client side using cookies or URL query parameters. This approach is problematic for the amount of data it transmits on each request, and the possible security implications (the continuations need to be encrypted, and the keys frequently rotated and expired - however the expiry of continuations is exactly the problem that query-parameter serialized continuations were supposed to avoid - links that rely on continuations stored on the server cannot be bookmarked!).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why are continuations bad for servers?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The essence of using continuations server-side is handing off control of inter-request state serialization to an implicit mechanism that is tied to the structure of application code.&lt;br /&gt;&lt;br /&gt;Both data and logic are now intermingled and stored in opaque continuation structures. This makes the code hard to debug, state difficult to replicate for fail-over redundancy, problems difficult to reproduce, and control flow difficult to understand.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What should you do?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The ability of JavaScript to make HTTP requests without reloading the current page (AJAX) allows you to keep what is essentially client-side state on the client. The server is now responsible for a set of URIs, where each URI can be thought of as a separate service that can be modeled as a state machine. This keeps web application state and control flow manifest. Different parts of your web application (represented by different URIs) can now be completely isolated; any state interactions and dependencies between them become explicit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2502481908763082501?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2502481908763082501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2502481908763082501' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2502481908763082501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2502481908763082501'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/06/continuation-based-web-applications.html' title='Continuation-based web applications: just say no'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6607618944708032832</id><published>2011-04-16T17:56:00.002-06:00</published><updated>2011-04-16T17:59:09.089-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming is a creative pursuit</title><content type='html'>There is still some debate around whether programming qualifies as a creative endeavor akin to writing, arts, or crafts. Paul Graham attempts to draw &lt;a href="http://www.paulgraham.com/hp.html"&gt;analogies between hacking and painting&lt;/a&gt; (unconvincingly, &lt;a href="http://www.idlewords.com/2005/04/dabblers_and_blowhards.htm"&gt;some argue&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The answer is a strong positive if you examine the motivational factors (examining motivation to get better insights is something that I have emphasized before).&lt;br /&gt;&lt;br /&gt;How else can you explain the motivational factors of people working on Free Software? Of people programming at work, and then going home and programming as a hobby? Of working on multiple, related and unrelated, projects simultaneously, sometimes over periods of years or decades at a time?&lt;br /&gt;&lt;br /&gt;Another obvious but almost never discussed aspect of programming as a creative pursuit is that it is almost impossible to succeed in programming as a career if you do not enjoy your work. This is true for all creative professions, but can you argue the same for plumbers or assembly-line workers or, closer to the idiotic "knowledge worker" label, accountants?&lt;br /&gt;&lt;br /&gt;Succeeding as a programmer of course has nothing at all to do with succeeding at being employed as a programmer, amusingly enough because of the widespread belief that programming is a non-creative profession and that 9 women can make 1 baby in 1 month. With perverse incentives such as "lines of code written" (when the only good thing about lines of code is how many you can remove) and no understanding by management of the impact of such things as technical debt, unit testing, or even basic things like quality, hapless code monkeys can stay on the payroll. But how many of them are recognized (in a positive way, mind you) by their peers? How many of them choose to continue to do programming into their 40s? The hapless code monkeys usually switch careers or "advance" themselves into the ultimate bastion of incompetence: management.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6607618944708032832?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6607618944708032832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6607618944708032832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6607618944708032832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6607618944708032832'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/04/programming-is-creative-pursuit.html' title='Programming is a creative pursuit'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2719671379928728354</id><published>2011-04-07T13:13:00.004-06:00</published><updated>2011-04-07T13:39:02.438-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Wanted: plug computer with HomePlug and 802.11</title><content type='html'>I've been thinking about mesh networks recently. Two of the better-known projects in this space are &lt;a href="http://www.open-mesh.com/"&gt;Open-Mesh&lt;/a&gt; and the &lt;a href="http://www.villagetelco.org/mesh-potato/"&gt;Mesh Potato&lt;/a&gt;. Both use 802.11 to build a wireless network, but &lt;a href="http://linuxconfau.blip.tv/file/4697619/"&gt;experience shows&lt;/a&gt; that wireless interference is a major problem in scaling these networks.&lt;br /&gt;&lt;br /&gt;The solution seems obvious: add a &lt;a href="http://en.wikipedia.org/wiki/HomePlug"&gt;HomePlug&lt;/a&gt; power line communications interface to the mesh routers. That way routers adjacent on the power grid (and so presumably adjacent to each other and other wireless devices, that is, in places with a lot of interference) can do forwarding over the wire.&lt;br /&gt;&lt;br /&gt;If you add HomePlug interfaces to devices themselves (are there any PC or notebook power supplies with HomePlug built-in?), pervasive mesh networking starts to look like an inevitability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2719671379928728354?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2719671379928728354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2719671379928728354' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2719671379928728354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2719671379928728354'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/04/wanted-plug-computer-with-homeplug-and.html' title='Wanted: plug computer with HomePlug and 802.11'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7325678154413204695</id><published>2011-03-29T13:00:00.000-06:00</published><updated>2011-03-29T14:14:24.999-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Lisp linkdump, March 2011 edition.</title><content type='html'>Here's a bunch of links to interesting Common Lisp stuff I've come across lately:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/adlai/Eos"&gt;EOS&lt;/a&gt; is a drop-in replacement for the &lt;a href="http://www.cliki.net/FiveAM"&gt;FiveAM&lt;/a&gt; test framework which has no dependencies on external libraries (one of the dependencies of FiveAM is heavily implementation-specific and doesn't work on LispWorks 6, among other platforms). I've converted all my FiveAM projects to EOS, and recommend you do the same.&lt;br /&gt;&lt;br /&gt;I've ported the Multilisp benchmarks from &lt;a href="http://www.iro.umontreal.ca/~feeley/papers/FeeleyPhD.pdf"&gt;Marc Feeley's PhD dissertation&lt;/a&gt; to &lt;a href="http://common-lisp.net/project/eager-future/"&gt;Eager Future2&lt;/a&gt;. Some of them tax your Lisp implementation a lot, and might reveal bugs. On my 32-bit x86 system, the only implementation to run all benchmarks to completion without segfaulting was SBCL. Try them on yours: load :test.eager-future2 and call benchmark.eager-future2:run-benchmarks.&lt;br /&gt;&lt;br /&gt;Speaking of Marc Feeley, here is some other cool work he has been involved in:&lt;br /&gt;&lt;br /&gt;Vincent St-Amour and Feeley came up with the &lt;a href="http://www.iro.umontreal.ca/~feeley/papers/StAmourFeeleyIFL09.pdf"&gt;PICOBIT R4RS Scheme&lt;/a&gt;, which can run Scheme programs in 256 bytes RAM and 8KiB of ROM &lt;i&gt;total&lt;/i&gt; (including VM footprint) on PIC microcontrollers.&lt;br /&gt;&lt;br /&gt;Feeley gave a talk about &lt;a href="http://www.iro.umontreal.ca/~gambit/"&gt;Gambit Scheme&lt;/a&gt; at ILC2010, and had a really great set of slides which you can get at &lt;a href="http://www.iro.umontreal.ca/~gambit/Gambit-inside-out.pdf"&gt;http://www.iro.umontreal.ca/~gambit/Gambit-inside-out.pdf&lt;/a&gt; (warning: 24MB PDF file!)&lt;br /&gt;&lt;br /&gt;Common Lisp &lt;code&gt;FORMAT&lt;/code&gt; continues to amaze. Peter Seibel pointed out &lt;a href="http://common-lisp.net/pipermail/pro/2011-January/000341.html"&gt;Erik Naggum's cool hack for formatting dates&lt;/a&gt; on the Lisp-pro mailing list. I recently learned that instead of passing nil or t or a stream to &lt;code&gt;FORMAT&lt;/code&gt;, you can pass a string with a fill-pointer, and "the output characters are added to the end of the string (as if by use of vector-push-extend)."&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mohiji.org/"&gt;Jonathan Fischer&lt;/a&gt; wrote a good article about feeding &lt;a href="http://www.mohiji.org/2011/01/s-expressions/"&gt;binary data from Common Lisp to C&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other things you can do with C is add s-expressions and macros - &lt;a href="https://github.com/deplinenoise/c-amplify"&gt;c-amplify&lt;/a&gt; does just that. c-amplify is motivated by the needs of game development, as was &lt;a href="http://en.wikipedia.org/wiki/Game_Oriented_Assembly_Lisp"&gt;GOAL&lt;/a&gt;, &lt;a href="http://all-things-andy-gavin.com/"&gt;Andy Gavin&lt;/a&gt;'s Lisp system which powered the Jak &amp; Daxter videogame franchise. Now there's a GPL-licensed attempt to create a GOAL-like environment called &lt;a href="https://github.com/emoon/Score"&gt;Score&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other places besides C you can now run Lisp:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/angavrilov/cl-gpu"&gt;cl-gpu&lt;/a&gt; translates a subset of CL to CUDA GPU kernels. &lt;a href="http://arduino.cc/forum/index.php/topic,55873.0.html"&gt;Arduino Lisp&lt;/a&gt; translates a subset of CL to a subset of C++ that can be compiled to run on the Arduino microcontrollers.&lt;br /&gt;&lt;br /&gt;I keep promoting &lt;a href="http://common-lisp.net/project/named-readtables/"&gt;named-readtables&lt;/a&gt; (seriously, try it!), but &lt;a href="http://trittweiler.blogspot.com/"&gt;Tobias C. Rittweiler&lt;/a&gt; has more cool libraries you should check out:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://common-lisp.net/project/hyperdoc/"&gt;Hyperdoc&lt;/a&gt; provides a way for your Lisp library documentation have fancy Hyperspec-like lookup in SLIME.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://common-lisp.net/project/parse-declarations/"&gt;Parse-Declarations&lt;/a&gt; is useful if you're building Lisp translators or code-walking tools.&lt;br /&gt;&lt;br /&gt;There was a very interesting discussion of syntax and s-expressions on Hacker News; one of the things I learned is that &lt;a href="http://news.ycombinator.com/item?id=2144774"&gt;according to X-bar linguistic theory, all natural languages basically consist of s-expressions&lt;/a&gt;. Of course the great thing about Common Lisp is, like natural languages, it is both homoiconic and its words have different meanings in different contexts. &lt;a href="http://www.scribd.com/doc/47702904/Bawden-Quasi-Quotation-in-Lisp"&gt;Alan Bawden&lt;/a&gt; came up with the "&lt;a href="http://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo"&gt;Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo&lt;/a&gt;" &lt;a href="http://paste.lisp.org/display/119129"&gt;let quine&lt;/a&gt; of the Lisp world (another one of the cool things I learned from Doug Hoyte's &lt;a href="http://letoverlambda.com/"&gt;Let Over Lambda&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;If you've been looking for example code of large CL web applications, you should check out &lt;a href="https://github.com/rigidus/cl-eshop"&gt;cl-eshop&lt;/a&gt;. cl-eshop currently runs the &lt;a href="http://www.320-8080.ru/"&gt;«ЦиFры» St. Petersburg store chain website&lt;/a&gt; and is licensed under the AGPL (Affero GPL).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7325678154413204695?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7325678154413204695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7325678154413204695' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7325678154413204695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7325678154413204695'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/lisp-linkdump-march-2011-edition.html' title='Lisp linkdump, March 2011 edition.'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5760720456678510545</id><published>2011-03-22T19:08:00.002-06:00</published><updated>2011-03-22T19:13:38.792-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Abstraction, indirection, and programming languages</title><content type='html'>A common mistake programmers seem to make is assuming that abstraction is about putting a layer of indirection (whether through function calls or data structures) into a program. Indirection is one of the more commonly used tools to implement abstractions, but just because there is now an extra layer of function calls in your program doesn't make it more understandable, maintainable, or a better fit to the domain. Those are better (although somewhat &lt;a href="http://carcaddar.blogspot.com/2010/08/input-needed.html"&gt;subjective&lt;/a&gt;) criteria for what makes effective abstractions than layers of indirection.&lt;br /&gt;&lt;br /&gt;Another thing programmers like to do is argue about programming languages and the abstractions (over machine language) they provide. Oftentimes you'll hear "language A has feature X" and the refrain "language B doesn't have feature X and is good enough, so feature X isn't important/is harmful." When iterated enough times, it's easy to see that this becomes a sort of &lt;i&gt;reductio ad assembler&lt;/i&gt; argument.&lt;br /&gt;&lt;br /&gt;Is a &lt;a href="http://home.pipeline.com/~hbaker1/sigplannotices/sigcol04.pdf"&gt;sufficiently powerful assembler&lt;/a&gt; good enough? So what makes C better than assembler? Why is C special? And what's better than C?&lt;br /&gt;&lt;br /&gt;It is productive to be able to both ask and answer the last question, which is why &lt;a href="http://carcaddar.blogspot.com/search?q=metaprogramming"&gt;real metaprogramming&lt;/a&gt; is an invaluable thing to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5760720456678510545?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5760720456678510545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5760720456678510545' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5760720456678510545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5760720456678510545'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/03/abstraction-indirection-and-programming.html' title='Abstraction, indirection, and programming languages'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1727320364721311763</id><published>2011-03-15T14:42:00.001-06:00</published><updated>2011-03-15T14:44:06.902-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FreeSoftware'/><title type='text'>Stallman's Four Freedoms</title><content type='html'>&lt;blockquote&gt;Freedom Zero is the freedom to run the program as you wish.&lt;br /&gt;&lt;br /&gt;Freedom 1 is the freedom to study the source code, and change it so the program does your computing as you wish.&lt;br /&gt;&lt;br /&gt;Freedom 2 is the freedom to help others; that's the freedom to make and distribute exact copies when you wish. &lt;br /&gt;&lt;br /&gt;And Freedom 3 is the freedom to contribute to your community, which is the freedom to distribute copies of your modified versions when you wish.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.networkworld.com/news/2011/031411-richard-stallman.html?page=3"&gt;An interview with Richard Stallman&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1727320364721311763?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1727320364721311763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1727320364721311763' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1727320364721311763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1727320364721311763'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/03/stallmans-four-freedoms.html' title='Stallman&apos;s Four Freedoms'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2126476953071960760</id><published>2011-02-15T21:26:00.003-07:00</published><updated>2011-02-15T21:39:25.947-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>SMP system wanted</title><content type='html'>Does anyone have an 8- or 16-way machine gathering dust? I need a many-processor box to do tests and tuning for Common Lisp future library implementations (I recently ported the &lt;a href="https://github.com/vsedach/Eager-Future2/blob/0558f0daeb6c41e84e621c0d9a0050faa6bc8223/test/benchmark.lisp"&gt;Multilisp benchmarks&lt;/a&gt; from &lt;a href="http://www.iro.umontreal.ca/~feeley/"&gt;Marc Feeley&lt;/a&gt;'s &lt;a href="http://www.iro.umontreal.ca/~feeley/papers/FeeleyPhD.pdf"&gt;PhD dissertation&lt;/a&gt; to Common Lisp). Age or architecture (as long as it runs SBCL or ECL) not a concern. Will pay shipping. The box will live at &lt;a href="http://foulab.org/"&gt;Foulab&lt;/a&gt;, where it will be given a good home for software projects.&lt;br /&gt;&lt;br /&gt;If you have such a system, or know someone who does, get in touch at vsedach at gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2126476953071960760?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2126476953071960760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2126476953071960760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2126476953071960760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2126476953071960760'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/02/smp-system-wanted.html' title='SMP system wanted'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6812027625364021605</id><published>2011-01-24T06:40:00.003-07:00</published><updated>2011-01-24T07:31:13.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='academic publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='scam'/><category scheme='http://www.blogger.com/atom/ns#' term='academic journals'/><category scheme='http://www.blogger.com/atom/ns#' term='public library of science'/><title type='text'>Academic publishing is a scam</title><content type='html'>Let's walk through the &lt;a href="http://www.asabe.org/pubs/29_jour_manuscript_submission.html"&gt;American Society's of Agricultural and Biological Engineers submission guide&lt;/a&gt; to see why:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Manuscript Submission&lt;br /&gt;&lt;br /&gt;It is helpful, but not required, to prepare your manuscript using ASABE Manuscript Templates and to follow the Journal Manuscript Format. Please include line numbers and page numbers on each page (the templates will do this for you).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Do your own proofreading, editing, and even layout. Doesn't sound unreasonable.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Copyright Transfer Form&lt;br /&gt;&lt;br /&gt;A complete Copyright Transfer Form must accompany your submitted journal manuscript. (Note: The Copyright Transfer Form replaces the earlier Manuscript Submission Form.) The manuscript will not be reviewed until the Copyright Transfer Form is received.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now they expect to take my copyright away from me? Can they at least bother to do layout for themselves?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Page Charges&lt;br /&gt;&lt;br /&gt;Please note that authors are required to pay, at publication, a page charge based on the number of published journal pages. The current charge is $100 ($110 for non-members) per 8.5 by 11 inch published page in Transactions of the ASABE and Applied Engineering in Agriculture, and $50 ($55 for non-members) per 6 by 9 inch published page in the Journal of Agricultural Safety and Health and Biological Engineering Transactions (formerly Biological Engineering). You will be advised of the total page charges when you receive the page proofs and billed when your article is published.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And now they expect me to pay for all this???&lt;br /&gt;&lt;br /&gt;How much are libraries paying for subscriptions again? (The answer is &lt;a href="http://www.asabe.org/pubs/PubCat02/periodicals.html#journals"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This journal is one particular example, but page charge fees levied on authors are not uncommon for scientific journals. Subscription costs to these journals for university libraries &lt;a href="http://en.wikipedia.org/wiki/Serials_crisis"&gt;are astronomical&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am &lt;a href="http://www.theaustralian.com.au/higher-education/opinion-analysis/let-internet-replace-journals/story-e6frgcko-1225803425489"&gt;not the first&lt;/a&gt; to have &lt;a href="http://www.universityworldnews.com/article.php?story=20091127122727576"&gt;similar concerns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Academic publishers have clearly become a scam industry. This is a market that is not only ripe for disruption, but by most reasonable standards should not exist (where do you think the money for subscription fees comes from? hint: probably your taxes).&lt;br /&gt;&lt;br /&gt;What about the &lt;a href="http://www.plos.org/"&gt;Public Library of Science&lt;/a&gt;? It's a good, non-profit scam. &lt;a href="http://en.wikipedia.org/wiki/Open_access_(publishing)"&gt;According to Wikipedia&lt;/a&gt;, "PLoS [author page charges] vary from $1,300 to $2,850." $2,000 to put your paper on the Internet. (note for those not aware: peer reviewers are volunteers that don't get paid, so there's no value-add costs that this $2,000 covers)&lt;br /&gt;&lt;br /&gt;"But Vladimir," you say, "who is going to pay for publishing my &lt;strike&gt;crap&lt;/strike&gt; research?" Your local university library already has printers, a connection to the Internet, and computers. Think "Digg for scientists" - verified accounts for peer reviewers (throw in digital signatures if you really care), with local library mirror proxies of papers (with BitTorrent-based distribution to cut down on bandwidth costs). Something like &lt;a href="http://arxiv.org/"&gt;arXiv&lt;/a&gt; with multiple virtual journals, peer review, and mirroring/distribution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6812027625364021605?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6812027625364021605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6812027625364021605' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6812027625364021605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6812027625364021605'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/academic-publishing-is-scam.html' title='Academic publishing is a scam'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5227000726810910092</id><published>2011-01-16T19:01:00.003-07:00</published><updated>2011-01-18T21:11:03.202-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>The Cloud, SaaS, source code escrow, and the Affero GPL</title><content type='html'>When making large deployments of commercial software, it is not uncommon for companies to force the suppliers to place the &lt;a href="http://en.wikipedia.org/wiki/Source_code_escrow"&gt;source code of that software into escrow&lt;/a&gt;. That might be an option if you're a large corporation, but for most users of SaaS/cloud computing services it is not, and not looking like one anytime soon.&lt;br /&gt;&lt;br /&gt;There's nothing stopping your service provider from going bankrupt, being acquired, or deciding to shut down the service. This has already happened when SalesForce acquired SiteMasher (the latter was discontinued), and Twitter acquired DabbleDB - development and new signups ceased, but at least the current users have the comfort of knowing that "In the event we terminate the service, we will provide out customers with at least 60 days advance notice." And then what?&lt;br /&gt;&lt;br /&gt;With shrink-wrapped software, you could continue running your existing version. Even if the discontinued software was tied to discontinued hardware, you could keep critical business functions running via judicious maintenance and spare parts suppliers (and later take advantage of emulation technology). This scenario is not uncommon, and of course entirely impossible for a cloud service.&lt;br /&gt;&lt;br /&gt;This makes SaaS/cloud computing a big risk for basing your business on. Richard Stallman has previously criticized the &lt;a href="http://www.guardian.co.uk/technology/2008/sep/29/cloud.computing.richard.stallman"&gt;lock-in risks of cloud computing&lt;/a&gt;, and there are also security concerns.&lt;br /&gt;&lt;br /&gt;I think there's an overlooked strategy for mitigating this risk based around the &lt;a href="http://www.gnu.org/licenses/why-affero-gpl.html"&gt;Affero GPL&lt;/a&gt;. Releasing your service software as AGPL would eliminate this risk for customers, but unlike the GPL or other licenses it would keep your product protected - all competitors using your code would have to release their changes to the public (and to you). There's also the possibility of dual-licensing your code - an "Enterprise" version with the possibility of escrow for large customers, and an AGPL version with less features for smaller customers.&lt;br /&gt;&lt;br /&gt;Why not simply provide an escrow clause into the contract with all customers? It won't help the smaller ones - they will certainly lack the knowledge and resources to go through your proprietary system and set it up on their Intranet. This is unlikely to be the case for Free Software that has a lot of users.&lt;br /&gt;&lt;br /&gt;As more web services are created and shut down and their customers burned, the trend is likely to sway away from cloud computing. I think a Free Software strategy based around the AGPL is a way to avoid a "cloud computing winter."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5227000726810910092?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5227000726810910092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5227000726810910092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5227000726810910092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5227000726810910092'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/cloud-saas-source-code-escrow-and.html' title='The Cloud, SaaS, source code escrow, and the Affero GPL'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2264648446121956002</id><published>2011-01-16T18:57:00.003-07:00</published><updated>2011-01-16T21:34:48.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Mouse-copy for Emacs</title><content type='html'>Zmacs, MCL's Fred, and the Lispworks editor all contain a very nice time-saving feature absent from Emacs called mouse-copy. &lt;a href="http://www.cl-http.org:8002/"&gt;Rainer Joswig&lt;/a&gt; wrote a good &lt;a href="http://lispm.dyndns.org/news?ID=NEWS-2007-11-18-1"&gt;description of mouse-copy&lt;/a&gt;; in brief it can be summarized as "hold down Ctrl and click on an s-exp to copy it to the current point."&lt;br /&gt;&lt;br /&gt;I first found out about mouse copy from working with &lt;a href="http://jazzscheme.org/"&gt;Jedi, JazzScheme's IDE&lt;/a&gt;, and ever since I've wanted it for my Emacs setup.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foldr.org/~michaelw/"&gt;Michael Weber&lt;/a&gt;'s &lt;a href="http://www.foldr.org/~michaelw/emacs/redshank/"&gt;redshank&lt;/a&gt; extensions to Paredit/SLIME include mouse-copy, but it depends on buffers being in Paredit mode.&lt;br /&gt;&lt;br /&gt;Fortunately there's a simple way to get generic &lt;a href="http://www.mail-archive.com/gnu-emacs-sources@gnu.org/msg00393.html"&gt;mouse-copy in Emacs&lt;/a&gt;. Unfortunately it doesn't do the right thing when it comes to spaces. This is easy to fix by borrowing a couple of lines from redshank. &lt;a href="http://paste.lisp.org/display/118722"&gt;This is the mouse-copy&lt;/a&gt; I use right now, and it seems to work pretty well.&lt;br /&gt;&lt;br /&gt;As you might suspect there's more time-saving things you can do with the mouse. For example, in redshank M-S-mouse-1 generates a skeleton for a make-instance when you click on a defclass definition. Looking at &lt;a href="http://www.unlambda.com/lispm/explorer-source/explorer-lispm-sources/public/zmacs/zmacs-mouse.lisp"&gt;TI Explorer ZWEI sources&lt;/a&gt;, Lisp Machines had an entire modifier-key-and-mouse-button-chord convention that really made s-exp manipulation easy and direct. It would be nice to have something like that for Emacs.&lt;br /&gt;&lt;br /&gt;If you have tips on better ways of using Emacs for editing Lisp, consider sharing them on CLiki's &lt;a href="http://www.cliki.net/Editing%20Lisp%20Code%20with%20Emacs"&gt;Emacs tips page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2264648446121956002?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2264648446121956002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2264648446121956002' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2264648446121956002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2264648446121956002'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/mouse-copy-for-emacs.html' title='Mouse-copy for Emacs'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6543115364621527542</id><published>2011-01-10T12:54:00.010-07:00</published><updated>2011-01-10T21:17:40.017-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>January Lisp happenings</title><content type='html'>The &lt;a href="http://wiki.alu.org/"&gt;ALU wiki&lt;/a&gt; is running again. Despite requiring registration and having a captcha on every edit, it seems to have a worse spam problem than &lt;a href="http://www.cliki.net/index"&gt;CLiki&lt;/a&gt;. Both seem to be being spammed by hand instead of by bots. Makes me wish the current SEO/content mill bubble would burst sooner.&lt;br /&gt;&lt;br /&gt;One thing the ALU wiki does need is more up-to-date content. In particular, if you're a &lt;a href="http://wiki.alu.org/Consultant"&gt;Lisp consultant or freelancer&lt;/a&gt;, please add yourself to the ALU wiki &lt;a href="http://wiki.alu.org/Consultant"&gt;Lisp consultants&lt;/a&gt; directory.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt; gave me some ad credit to try out their ad platform, and I'm planning to run ads targeted at technologists and product managers to &lt;a href="https://sites.google.com/site/beatingtheaveragescl/"&gt;this landing page&lt;/a&gt; that strongly encourages them to try Common Lisp. Any ideas for how I can make it better?&lt;br /&gt;&lt;br /&gt;One thing you might notice when perusing &lt;a href="http://weitz.de/"&gt;Ediware&lt;/a&gt; (what &lt;a href="http://kvardek-du.kerno.org/"&gt;Luís Oliveira&lt;/a&gt; branded &lt;a href="http://weitz.de/"&gt;Edi Weitz&lt;/a&gt;'s excellent Free Lisp Software) is the uniformly useful documentation right on the project webpage. What you may not realize is that Edi has written &lt;a href="http://weitz.de/documentation-template/"&gt;some software&lt;/a&gt; to help you write documentation like he does. &lt;a href="http://weitz.de/documentation-template/"&gt;DOCUMENTATION-TEMPLATE&lt;/a&gt; takes a package and generates HTML to describe the package's exported symbols (you are writing &lt;a href="http://www.psg.com/~dlamkins/sl/chapter10.html"&gt;docstrings&lt;/a&gt;, right?).&lt;br /&gt;&lt;br /&gt;Speaking of Ediware, one of the least appreciated of Edi's libraries is &lt;a href="http://weitz.de/cl-interpol/"&gt;CL-INTERPOL&lt;/a&gt;. Besides regular expressions, it's also handy for things like &lt;a href="http://paste.lisp.org/display/118522"&gt;HTML templating&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the highest-impact papers I've managed to overlook has come to my attention recently: Henry Baker's &lt;a href="http://home.pipeline.com/~hbaker1/MetaCircular.html"&gt;Metacircular Semantics for Common Lisp Special Forms&lt;/a&gt;. If you're working on Common Lisp compilers/translators/&lt;a href="http://www.cs.aau.dk/~normark/oo-scheme.html"&gt;simulators&lt;/a&gt; it's a must-read (I wish I had noticed it sooner because a lot of the techniques are applicable to &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt;). Techniques like that are also useful if you want to fake CL-style control flow mechanisms in other languages.&lt;br /&gt;&lt;br /&gt;Perhaps the coolest such hack I've seen is &lt;a href="https://github.com/gonzojive/paren-psos/commit/6578ad223515dc2c1ddf49346f4baf7c3bee37c4"&gt;Red Daly's implementation of the Common Lisp condition system for Parenscript&lt;/a&gt;. It's worth reading just for the fact that the implementation code explains how the condition system works better than the Hyperspec manages to.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bonjure.org/"&gt;Bonjure, the Montréal Clojure user's group&lt;/a&gt;, is having its next meeting January, Friday 21 at 17:30 at &lt;a href="http://www.crim.ca/"&gt;CRIM&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://functionaljobs.com/"&gt;FunctionalJobs.com&lt;/a&gt; recently launched. They seem to have bootstrapped their first listings from &lt;a href="http://lispjobs.wordpress.com/"&gt;Lispjobs&lt;/a&gt;; hopefully they'll have more Lisp-related jobs in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6543115364621527542?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6543115364621527542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6543115364621527542' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6543115364621527542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6543115364621527542'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2011/01/january-lisp-happenings.html' title='January Lisp happenings'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5263964395645952152</id><published>2010-12-16T19:51:00.005-07:00</published><updated>2010-12-16T23:06:37.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Лисп как клей</title><content type='html'>Перебежчик с Common Lispа на Clojure &lt;a href="http://zahardzhan.github.com/"&gt;zahardzhan (Роман Захаров)&lt;/a&gt; публиковал &lt;a href="http://zahardzhan.github.com/2010/my-first-work.html"&gt;отчёт о своей первой коммерческой программе в Clojure&lt;/a&gt;. Его тезис: "реальные программы — это комья грязи; липкая гадость которая склеивает энное количество технологий, семантик и языков."&lt;br /&gt;&lt;br /&gt;Понятие "glue language" - "язык-клей" началось с Tcl и Perl тк они обычно использовались для обработки и послания данных между разными, уже существующими системами ("cклеивая" их вместе). В принципе Лисп полностью годен как клей, но мешало плохая интеграция с операционной системой, неполноценные FFI, и отсутствие библиотек для парсинга разных форматов и интерфейсинга с базами данных и сетевых сервисов. Сейчас первые две проблемы во многих своих образах устранены, и количество библиотек для интерфейсинга все растет. Главные задачи что бы сделать Common Lisp годным как клей, это разработка новых библиотек для интерфэйсинга, и обновление и пиар существующих.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5263964395645952152?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5263964395645952152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5263964395645952152' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5263964395645952152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5263964395645952152'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/12/blog-post.html' title='Лисп как клей'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7204341650826132362</id><published>2010-12-15T22:01:00.005-07:00</published><updated>2010-12-15T22:25:21.889-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postmodernism'/><category scheme='http://www.blogger.com/atom/ns#' term='media'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Understanding Web in the context of the medium/message dichotomy</title><content type='html'>Web is not a medium. Web is a space of possible combinations of medium, message, and method. The medium and the message are familiar, but what exactly is a method? Methods are algorithms and effects. Previous media had no algorithmic component, no way to conditionalize or effect outcome (choose-your-own-adventure books came closest).&lt;br /&gt;&lt;br /&gt;Web IS NOT interactive. It is a two-way audience: every viewer is a publisher. But the websites themselves aren't publishers, they're the medium. &lt;em&gt;Every website is a new medium&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7204341650826132362?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7204341650826132362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7204341650826132362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7204341650826132362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7204341650826132362'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/12/understanding-web-in-context-of.html' title='Understanding Web in the context of the medium/message dichotomy'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4093679116375596582</id><published>2010-12-11T21:28:00.002-07:00</published><updated>2010-12-11T22:02:37.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming language evolution</title><content type='html'>Programming language evolution is sometimes claimed to be a search for greater abstraction.&lt;br /&gt;&lt;br /&gt;This is wrong, and mirrors the misunderstanding of biological evolution. There is no end-goal, no such thing as progress or improvement. It's about adaptation.&lt;br /&gt;&lt;br /&gt;There are different kinds of models and different kinds of environmental factors, such as machine constraints, and how ignorant of mathematics and past programming languages the designers of a programming language are.&lt;br /&gt;&lt;br /&gt;A good example of this is MapReduce. The programming paradigm goes back to APL. Limited support for parallelism was added in the form of vector co-processors on IBM mainframes. The first "massively" parallel implementation of the idea was &lt;a href="http://en.wikipedia.org/wiki/*Lisp"&gt;StarLisp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another example is Objective C. Brad Cox claims that the only reason he developed Objective C was because at the time Xerox wouldn't sell Smalltalk (&lt;a href="http://carcaddar.blogspot.com/2009/04/masterminds-of-programming.html"&gt;Masterminds of Programming&lt;/a&gt;, p. 258).&lt;br /&gt;&lt;br /&gt;In terms of parameters like dynamism and introspection, Lisp already had all the necessary features in 1958. From there the same basic idea of lambda abstraction has been applied to Actors and prototype-based languages like Self and JavaScript, but in terms of other "dynamic" programming languages, almost all of them are a step backward from 1958 Lisp.&lt;br /&gt;&lt;br /&gt;The same thing can be said about C and Algol 68.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4093679116375596582?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4093679116375596582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4093679116375596582' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4093679116375596582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4093679116375596582'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/12/programming-language-evolution.html' title='Programming language evolution'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5393398374913913803</id><published>2010-12-01T15:29:00.003-07:00</published><updated>2010-12-01T15:55:22.571-07:00</updated><title type='text'>Gaming academia, or why style is more important than substance</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;I started with failure. I submitted a couple of papers to conferences and then waited on pins and needles for months, only to be rejected. It was disappointing and motivating at the same time. I realized there was something fundamentally wrong in my writing strategy. At the same time, some of my counterparts at Microsoft were publishing prolifically, and I asked myself, "What is it about their papers that gets them accepted so regularly?" I printed several of their papers looking for a pattern, and I found it. Every one of their papers used the same template and certain stylistic elements. I started using a similar formula and found my papers getting accepted almost immediately. My team submitted papers to some important venues - SIGMOD, VLDB, ICDE, and others - and had 90% of everything we submitted accepted, even in venues in which the acceptance rates were 1 in 6 or 1 in 9. Between 2001 and 2007, my team published more than 35 papers. We became incredibly efficient at it, authoring professional papers in just a few days, almost always using ideas and experimental results we had on hand from our regular line item development work.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;--Sam Lightstone, &lt;i&gt;Making it Big in Software&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5393398374913913803?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5393398374913913803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5393398374913913803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5393398374913913803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5393398374913913803'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/12/gaming-academia-or-why-style-is-more.html' title='Gaming academia, or why style is more important than substance'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-3734882288161086429</id><published>2010-11-18T14:50:00.007-07:00</published><updated>2010-11-20T17:32:16.801-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeSoftware'/><title type='text'>Free Software license onion</title><content type='html'>There are tons of Free Software licenses out there, and it can be confusing choosing one for your Lisp project. I'm writing this guide to clear up some confusion, but be aware that I'm not a lawyer and you probably should consult one if you are going to take advantage of this advice for something that you hope to commercialize.&lt;br /&gt;&lt;br /&gt;A good strategy for choosing a license is to consider how the project would fit in a software stack - is it a general-purpose utility library? A library to interface to specific services or hardware? A web server that can be used to build applications? A content management system that you one day hope to commercialize? These projects all have different potential uses, but it would be nice if their licensing terms reflected those uses and allowed the content management system to use the web server, allowed the web server to use the service interface library, and allowed the service interface library to use utilities from the general-purpose library.&lt;br /&gt;&lt;br /&gt;I think general-purpose utility libraries should be public domain (consider using the &lt;a href="http://unlicense.org/"&gt;unlicense&lt;/a&gt;, which is a copyright waiver with a warranty discalimer). One thing people often want to do is copy-paste one or two functions out of them into random projects. Other good things to put into the public domain include benchmark code and test suites (you can release just those parts of your project as public domain).&lt;br /&gt;&lt;br /&gt;Next up on the hierarchy are permissive licenses. There are dozens of these around, however I think only those that are &lt;a href="http://opensource.franz.com/preamble.html"&gt;LLGPL&lt;/a&gt;v2.1 compatible should be used for Free Software written in Lisp (Wikipedia has a &lt;a href="http://en.wikipedia.org/wiki/File:Quick-guide-gplv3-compatibility.svg"&gt;chart summarizing Free Software license compatibilities&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;There are a few of these (see the &lt;a href="http://www.gnu.org/licenses/license-list.html"&gt;GNU license list&lt;/a&gt; whether a particular license is GPL-compatible or not), but generally most of them are like the BSD license. I recommend using the &lt;a href="http://en.wikipedia.org/wiki/ISC_license"&gt;ISC license&lt;/a&gt;, which is really concise and is used by OpenBSD. Good examples of projects that can be licensed under a permissive license are parsers for data formats and interfaces to C libraries or web services. Permissive-licensed software can include public domain code and code from most other permissive-licensed software.&lt;br /&gt;&lt;br /&gt;Projects you do not want to see forked into a closed-source product without giving back to community should be licensed under the &lt;a href="http://opensource.franz.com/preamble.html"&gt;LLGPL&lt;/a&gt;v2.1 (version 2.1 specifically, as LGPLv3 code cannot be used in a GPLv2 project). Why the LLGPL and not the LGPL or the GPL? The GPL makes it impossible to use a Lisp library as part of a closed-source product (even if you only use it as a library and make no modifications), and the wording of the LGPL does likewise because the "linking clause" basically presumes you're using C. &lt;br /&gt;&lt;br /&gt;LLGPL software can incorporate other LLGPL code, public domain code, and LLGPL-compatible permissive license code, but for example LLGPL code can't be put into an ISC-licensed project (the whole project would have to be re-licensed under the LLGPL).&lt;br /&gt;&lt;br /&gt;I think it's pretty obvious that you shouldn't license your Lisp library under the GPL if you want other people to actually use it, but how to decide between a permissive license and the LLGPL? I think that aside from practical considerations, many times it comes down to a moral choice. LLGPL forces sharing reciprocity on others. I believe copyright should be abolished or severely reformed, and until those changes start taking place, the LLGPL can be used to similar effects through the impact of works on which you own the copyright (the real pirates aren't the people downloading mp3s, they're the people violating the GPL).&lt;br /&gt;&lt;br /&gt;I think the most interesting licensing situation is when you want to develop commercial software, but allow proprietary use and extension only by certain parties (hopefully ones which will pay you lots of money). The general strategy for this is to dual-license your code under the GPL and a commercial license. The most prominent example of a project using this strategy is MySQL.&lt;br /&gt;&lt;br /&gt;One implication of this is that in order to make it into your official repository to be dual-licensed, any patches must have their copyright assigned to you/your company by their contributors.&lt;br /&gt;&lt;br /&gt;Which version of the GPL to choose for dual-licensing? I think either v2 or v3 is fine (one important thing v3 includes is the &lt;a href="http://en.wikipedia.org/wiki/Tivoization"&gt;anti-tivoization&lt;/a&gt; clause, which prevents closed hardware platforms). &lt;br /&gt;&lt;br /&gt;One thing the GPL doesn't cover is running proprietary modifications of GPLed software as a service without any distribution going on (for example, Google is rumored to have Linux kernel patches running that haven't been released). The &lt;a href="http://en.wikipedia.org/wiki/Affero_General_Public_License"&gt;AGPL&lt;/a&gt; addresses this issue. I don't know of any software dual-licensed under the AGPL, but I think it can be a promising strategy for a variety of projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-3734882288161086429?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/3734882288161086429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=3734882288161086429' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3734882288161086429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3734882288161086429'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/11/free-software-license-onion.html' title='Free Software license onion'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6390197856603420475</id><published>2010-11-16T08:34:00.008-07:00</published><updated>2010-11-16T16:31:56.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Character encoding is about algorithms, not datastructures</title><content type='html'>One thing you might be aware of is that both SBCL and Clozure represent characters using 4 bytes. There's been &lt;a href="http://lemonodor.com/archives/001498.html"&gt;significant discussion&lt;/a&gt; about this already, but I hope I can offer more insight into how you can apply this to your Lisp applications. &lt;br /&gt;&lt;br /&gt;First, the one thing &lt;a href="http://stackoverflow.com/questions/3613149/how-can-my-program-switch-from-ascii-to-unicode/3614105#3614105"&gt;most people seem to agree&lt;/a&gt; on is that &lt;a href="http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful/1855375#1855375"&gt;UTF-16 is evil&lt;/a&gt; (it should be noted that both CLISP and CMUCL use UTF-16 as their internal character representation).&lt;br /&gt;&lt;br /&gt;The important thing about UTF-32 vs. UTF-8 and UTF-16 is that it is not primarily a question of string size, but of algorithms.&lt;br /&gt;&lt;br /&gt;Variable-length encodings work perfectly fine for &lt;em&gt;stream&lt;/em&gt; algorithms. But &lt;em&gt;string&lt;/em&gt; algorithms are written on the assumption of constant-time random access and being able to set parts of a string to certain values without consing. These assumptions can't be satisfied when variable-length encodings are used, and most string algorithms would not run with any level of acceptable performance.&lt;br /&gt;&lt;br /&gt;What about immutable strings? Random access is still not constant-time for variable-length encodings, and all the mutator operations are gone. In effect most immutable string algorithms actually end up being stream algorithms that cons a lot.&lt;br /&gt;&lt;br /&gt;Chances are, you're already using stream algorithms on your strings even if you're not aware of it. Any kind of search over a string really treats that string as a stream. If you're doing string concatenation, you're really treating your strings as though they were immutable - consider using &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_w_out_.htm"&gt;&lt;code&gt;with-output-to-string&lt;/code&gt;&lt;/a&gt; to cut down on consing and to simplify your code.&lt;br /&gt;&lt;br /&gt;One thing that is special about UTF-8 is that it is the de-facto character encoding standard of the web. When you're reading UTF-8 into a Lisp string, what you're really doing is decoding and copying each character.&lt;br /&gt;&lt;br /&gt;Most web application patterns are based around searching for and extracting some string from the HTTP request, and either using that string as a retrieval key in a database or splicing it together with some other strings to form the reply. All these actions can be modeled in terms of streams.&lt;br /&gt;&lt;br /&gt;One of the things that makes &lt;a href="http://john.freml.in/*latest*"&gt;John Fremlin&lt;/a&gt;'s &lt;a href="https://github.com/vii/teepeedee2"&gt;tpd2&lt;/a&gt; fast is that it dispenses with the step of decoding and copying the incoming UTF-8 data into a Lisp string (this is also what &lt;a href="http://hoytech.com/antiweb/"&gt;antiweb&lt;/a&gt; does). Using some compiler macros and the &lt;a href="http://common-lisp.net/project/cl-irregsexp/"&gt;cl-irregsexp&lt;/a&gt; library, all the searching and templating is done on byte arrays that hold the UTF-8 encoded data (Lisp string literals are converted to UTF-8 byte arrays by compiler macros). The result is a UTF-8 byte array that can be sent directly back to the web browser, bypassing another character encoding and copying step.&lt;br /&gt;&lt;br /&gt;I read somewhere that the &lt;a href="http://pdos.csail.mit.edu/exo.html"&gt;Exokernel&lt;/a&gt; operating system permitted extending this concept further down the software stack by allowing applications to send back pre-formatted TCP/IP packets, although I don't know if that's actually possible or how much of a speedup it would give.&lt;br /&gt;&lt;br /&gt;In addition to skipping the overhead of copying and re-encoding characters, working on UTF-8 byte sequences directly means you can use algorithms that depend on working with a small alphabet set to achieve greater performance (an example of this is the &lt;a href="http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm"&gt;Boyer–Moore–Horspool string searching algorithm&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6390197856603420475?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6390197856603420475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6390197856603420475' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6390197856603420475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6390197856603420475'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/11/character-encoding-is-about-algorithms.html' title='Character encoding is about algorithms, not datastructures'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-727515129623085954</id><published>2010-11-07T18:12:00.006-07:00</published><updated>2010-11-07T19:16:31.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>uri-template, Eager Future и Руби, и ещё немного бреда о Лисповой операционной системе</title><content type='html'>Выставил &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt; и &lt;a href="http://common-lisp.net/project/eager-future/"&gt;Eager Future&lt;/a&gt; на github:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/vsedach/uri-template"&gt;https://github.com/vsedach/uri-template&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/vsedach/Eager-Future"&gt;https://github.com/vsedach/Eager-Future&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;uri-template теперь использует &lt;a href="http://common-lisp.net/project/named-readtables/"&gt;named-readtables&lt;/a&gt;, которое дает возможность использовать readtables и reader macros аналогично packages. Рекоммендую named-readtables всем кто использует read-macros, и даже всем кто их не использует из за readtable-case :invert (самый перспективный метод иметь регистры типа верблюжих в символах).&lt;br /&gt;&lt;br /&gt;План перевести uri-template на LLGPL (была лицензированной под BSD), а Eager Future переписать как совершенно новый проект с довольно уникальными свойствами среди конкурентных библиотек (тоже под LLGPL, но сначала надо додуматся как перебороть SBCL, там что-то вроде бага со слабыми ссылками - &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTinuKS_h-Y7r00ELtD4V%2BawTzh2cJ2LjOOTbBuaX%40mail.gmail.com&amp;forum_name=sbcl-help"&gt;подробности&lt;/a&gt; (англ)).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://imagine27.com/"&gt;Джастин Грант&lt;/a&gt; показал как можно реализовать &lt;a href="http://jng.imagine27.com/articles/2010-10-07-084756_ruby_subset_implementation.html"&gt;компилятор с Ruby на Лисп&lt;/a&gt; (англ). Я наконец сошел с ума и тоже хочу сделать компилятор на Лисп, только из C. Зачем? Что бы взять NetBSD, скомпилировать его драйвера на Лисп, и получить Лисповую операционную систему (я же сказал я сошел с ума). Подробности на &lt;a href="http://news.ycombinator.com/item?id=1878220"&gt;Hacker News (англ)&lt;/a&gt;. Проект &lt;a href="https://github.com/vsedach/Vacietis"&gt;вот здесь&lt;/a&gt;, для начало взял &lt;a href="http://www.cliki.net/Zeta-C"&gt;Zeta-C&lt;/a&gt;, C компилятор для Лисп-машин, но уже видно что почти всё придётся переписывать. Для начала, может кто нибудь знает, существует ли рабочий Лисповый парсер C (в Zeta-C противная дрянь генерирована yacc-ом времен СССР и переведенная в Zetalisp)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-727515129623085954?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/727515129623085954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=727515129623085954' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/727515129623085954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/727515129623085954'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/11/uri-template-eager-future.html' title='uri-template, Eager Future и Руби, и ещё немного бреда о Лисповой операционной системе'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-185556154207950938</id><published>2010-10-26T14:41:00.004-06:00</published><updated>2010-10-26T15:08:32.330-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Protect the flock (or how to mitigate the effects of HTTP session hijacking without using SSL)</title><content type='html'>So this thing called &lt;a href="http://techcrunch.com/2010/10/25/lazy-hackers-twitter-firesheep-boasts-100000-downloads-faceboo/"&gt;Firesheep is making a splash the past couple of days&lt;/a&gt;. It's a Firefox plugin that lets you hijack HTTP sessions on open WiFi networks (which presumably are NATed, hence trying to use the client IP address as extra authentication doesn't work).&lt;br /&gt;&lt;br /&gt;It's possible to mitigate the scope of this kind of session hijacking significantly without resorting to tricks that break the back button. A note about what "mitigate" means here: we're on an open network, so any traffic from the server to the client can be spied on, and since we don't want to break the back button by using one-time information, any GET request that is made by the client can be spied on and repeated by the hijacker. However, the hijacker won't be able to make GET requests to URLs that she hasn't yet spied on, and will be unable to make POST requests.&lt;br /&gt;&lt;br /&gt;So how does this work? I'm assuming the initial login is done over HTTPS, during which time the server sends the client a shared secret that the client then stores locally (window.name, Flash LSO, or localStorage). When a client wants to GET a URL, she rewrites it (this can be done using JavaScript on onload, for example) with a query parameter that is a hash (&lt;a href="http://pajhome.org.uk/crypt/md5/sha1.html"&gt;SHA1 in JavaScript&lt;/a&gt;, for example) of the secret concatenated with the URL. The server then verifies the hash before responding to the request. POST requests are handled by performing the same hashing on unique server-generated form identifiers (you're already using these to prevent duplicate form submissions, right?).&lt;br /&gt;&lt;br /&gt;That wasn't so hard. Let me know if you see any problems with this scheme, or know of a better way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-185556154207950938?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/185556154207950938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=185556154207950938' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/185556154207950938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/185556154207950938'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/10/protect-flock-or-how-to-mitigate.html' title='Protect the flock (or how to mitigate the effects of HTTP session hijacking without using SSL)'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1639780532665467752</id><published>2010-10-19T12:41:00.004-06:00</published><updated>2010-10-19T15:38:46.293-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Various Lisp news</title><content type='html'>I've put &lt;a href="http://github.com/vsedach/uri-template"&gt;uri-template&lt;/a&gt; and &lt;a href="http://github.com/vsedach/Eager-Future"&gt;Eager Future&lt;/a&gt; on github and did some work on both.&lt;br /&gt;&lt;br /&gt;uri-template got a new release, and now uses &lt;a href="http://common-lisp.net/project/named-readtables/"&gt;named-readtables&lt;/a&gt; to provide a modular way to use reader macros. I think named-readtables is a really big deal; if your library defines reader macros, start using named-readtables today. Once it is widely adopted, named-readtables can be used to facilitate things like a &lt;a href="http://www.cliki.net/Case%20sensitivity"&gt;global move to readtable-case :invert&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm working on some really interesting features for Eager Future, but I'm getting stumped by how finalizers and thread-interrupt interact in SBCL. Any help appreciated (I've posted the problem description to &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTinuKS_h-Y7r00ELtD4V%2BawTzh2cJ2LjOOTbBuaX%40mail.gmail.com&amp;forum_name=sbcl-help"&gt;sbcl-help&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;I've mentioned &lt;a href="http://svrg.net/CL-Javascript%200.10.05.html"&gt;CL-JavaScript&lt;/a&gt; before, and it's cool to see similar projects. &lt;a href="http://imagine27.com/"&gt;Justin Grant&lt;/a&gt; did a toy &lt;a href="http://jng.imagine27.com/articles/2010-10-07-084756_ruby_subset_implementation.html"&gt;Ruby to Common Lisp&lt;/a&gt; compiler that (no surprise) is a lot faster than Ruby at calculating factorials. &lt;a href="http://code.google.com/p/cl-ruby/source/browse/ruby.lisp"&gt;The source code&lt;/a&gt; is a good illustration of why Common Lisp is the ultimate language implementation language.&lt;br /&gt;&lt;br /&gt;In local news, &lt;a href="http://www.bonjure.org/"&gt;Montreal Clojure user's group&lt;/a&gt; will be hosting their first meeting October 26 (&lt;a href="http://groups.google.com/group/montreal-clojure-user-group/browse_thread/thread/71ea894c70816902"&gt;details&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;In less Lisp-related news, &lt;a href="http://foulab.org/"&gt;Foulab&lt;/a&gt; is hosting a &lt;a href="http://foulab.org/en/news/Foulab_News/2010/10/11/demoparty"&gt;demo party&lt;/a&gt; November 27.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1639780532665467752?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1639780532665467752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1639780532665467752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1639780532665467752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1639780532665467752'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/10/various-lisp-news.html' title='Various Lisp news'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-3091354391479705756</id><published>2010-08-15T17:52:00.003-06:00</published><updated>2010-08-15T19:04:13.286-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Input needed</title><content type='html'>Recently I've been doing a major cleanup/arson of &lt;a href="http://www.cliki.net/"&gt;CLiki&lt;/a&gt;. The cleanup effort was inspired by recurring comments on &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt; of the form: "I didn't find Lisp libraries" or "I couldn't decide which libraries to use." &lt;br /&gt;&lt;br /&gt;I would love for everyone to add a description of their Free Software Lisp libraries to CLiki with &lt;a href="http://www.cliki.net/ASDF-Install"&gt;ASDF-install&lt;/a&gt;able tarballs and appropriate topic markers so libraries are easy to find and compare (maybe do it for &lt;a href="http://www.cl-user.net"&gt;cl-user.net&lt;/a&gt; first; I'm entertaining the idea of writing a scraper that would auto-generate new CLiki pages from cl-user.net entries). Currently this does not seem to be very realistic. &lt;br /&gt;&lt;br /&gt;Instead I'm going to ask people who read &lt;a href="http://planet.lisp.org/"&gt;Planet Lisp&lt;/a&gt; (where this blog is syndicated) to contribute to two specific tasks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Go through the list of &lt;a href="http://www.cliki.net/Utilities"&gt;utilities&lt;/a&gt; packages on CLiki (add a CLiki entry with the *(utilities) tag for any utilities packages you know that aren't in the list) and add a description of what they contain to the package CLiki page.&lt;br /&gt; &lt;li&gt;Contribute to the &lt;a href="http://www.cliki.net/The%20Great%20Macro%20Debate"&gt;Great Macro Debate&lt;/a&gt; CLiki page.&lt;/ul&gt;&lt;br /&gt;Right now there are almost two dozen "utility" CL packages offering everything from &lt;code&gt;my-defun*$%#&lt;/code&gt; to &lt;code&gt;map-nthcadadar&lt;/code&gt; (that's a joke, but only a slight exaggeration). It's quite hard to decide what to choose why. To me &lt;a href="http://www.cliki.net/cl-utilities"&gt;cl-utilities&lt;/a&gt; seems to be the most sane package, but it hasn't had development since 2006 (maybe it doesn't need it?). Disclaimer: I use &lt;a href="http://www.cliki.net/kmrcl"&gt;kmrcl&lt;/a&gt; and &lt;a href="http://www.cliki.net/Anaphora"&gt;Anaphora&lt;/a&gt; in my software.&lt;br /&gt;&lt;br /&gt;The Great Macro Debate was a round-table at ILC 2009 that asked the unaskable: are macros evil? &lt;br /&gt;&lt;br /&gt;To most post-Y2K Lisp programmers (like me) this seemed ridiculous. We grew up on &lt;a href="http://4.bp.blogspot.com/_Wyx0KPrm0gg/TGiGXfrwdRI/AAAAAAAAANo/mDAfZ1JfTus/s1600/blubs.jpg"&gt;Paul Graham's kool-aid&lt;/a&gt;. Macros are powerful, macros are awesome, they are special, don't use them when you can use a function, everything will be great. &lt;br /&gt;&lt;br /&gt;But then all these experienced Lisp programmers came out at ILC and said that macros are bad for software maintenance. How can this be? In the absence of concrete examples, the cognitive dissonance was too great. The only defense mechanism was to tell yourself "bad programmers don't understand macros" and move on.&lt;br /&gt;&lt;br /&gt;Two events changed my point of view. The first was encountering &lt;a href="http://www.cliki.net/defclass*"&gt;defclass*&lt;/a&gt; in a commercial project. The second was working with the &lt;a href="http://github.com/vii/teepeedee2/blob/master/src/io/recvbuf.lisp"&gt;TPD2 networking code and encountering &lt;code&gt;my-defun&lt;/code&gt;&lt;/a&gt; (and you thought I was joking?). I came face-to-face with macros that made software maintenance hard.&lt;br /&gt;&lt;br /&gt;The point of the &lt;a href="http://www.cliki.net/The%20Great%20Macro%20Debate"&gt;Great Macro Debate&lt;/a&gt; CLiki page is to collect all relevant information as to &lt;em&gt;why&lt;/em&gt; to write macros. That information will then get distilled into a sort of macro style writing document, which will contain examples and recommendations of how to write relevant macros, and what kinds of macros not to write, to make software maintenance easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-3091354391479705756?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/3091354391479705756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=3091354391479705756' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3091354391479705756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3091354391479705756'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/08/input-needed.html' title='Input needed'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4503368118891883772</id><published>2010-08-15T11:47:00.002-06:00</published><updated>2010-08-15T17:12:45.493-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>JavaScript и Лисп</title><content type='html'>Недавно появился целый ряд новых проектов обеспечивающих совместимость JavaScript c Common Lispом:&lt;br /&gt;&lt;br /&gt;Ред Дэйли сделал Лисп байндинги для мозилловской &lt;a href="http://www.mozilla.org/js/spidermonkey/"&gt;SpiderMoney&lt;/a&gt;, &lt;a href="http://github.com/gonzojive/cl-spidermonkey"&gt;CL-SpiderMonkey&lt;/a&gt;. Ещё у него есть &lt;a href="http://github.com/gonzojive/slime"&gt;форк SLIMEа&lt;/a&gt; который делает возможным вещи как автодополнение для &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; кода и тп. На данный момент возможности расширения сервисов &lt;a href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt; под DSLы не очень хорошо поддержаны, но &lt;a href="http://archimag-dev.blogspot.com/2010/03/slime_12.html"&gt;archimag обещал сделать все как надо&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Некий &lt;a href="http://3bb.cc/"&gt;rb&lt;/a&gt; разработал &lt;a href="http://github.com/3b/slime-proxy"&gt;SWANK прокси&lt;/a&gt; и &lt;a href="http://github.com/3b/parenscript"&gt;форк Parenscriptа&lt;/a&gt; которые вместе позволяют подключить SLIME к браузеру (!) через web sockets. Так же он работает над &lt;a href="http://github.com/3b/3bil"&gt;компилятором с Лиспа на Флэш&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://marijn.haverbeke.nl/"&gt;Marijn Haverbeke&lt;/a&gt;, &lt;a href="http://svrg.net/"&gt;Alan Pavičić, и Iva Jurišić&lt;/a&gt; решили реализовать &lt;a href="http://github.com/marijnh/js"&gt;JavaScript компилятор в Лиспе&lt;/a&gt;. Местами он уже &lt;a href="http://twitter.com/marijnjh/status/18682548562"&gt;более производителен чем SpiderMonkey&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4503368118891883772?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4503368118891883772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4503368118891883772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4503368118891883772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4503368118891883772'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/08/javascript.html' title='JavaScript и Лисп'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5188572510650796831</id><published>2010-07-18T14:06:00.004-06:00</published><updated>2010-07-18T19:23:34.195-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Put JavaScript in your Lisp and Emacs in your JavaScript</title><content type='html'>This month, &lt;a href="http://github.com/gonzojive"&gt;Red Daly&lt;/a&gt; &lt;a href="http://common-lisp.net/pipermail/parenscript-devel/2010-July/000820.html"&gt;announced&lt;/a&gt; &lt;a href="http://github.com/gonzojive/cl-spidermonkey"&gt;cl-spidermonkey&lt;/a&gt;, a set of Common Lisp bindings to Mozilla's SpiderMonkey JavaScript implementation.&lt;br /&gt;&lt;br /&gt;Not long after that, I learned about &lt;a href="http://marijn.haverbeke.nl/"&gt;Marijn Haverbeke&lt;/a&gt;, &lt;a href="http://svrg.net/"&gt;Alan Pavičić, and Iva Jurišić&lt;/a&gt;'s &lt;a href="http://github.com/akapav/js"&gt;CL-JavaScript&lt;/a&gt; JS to CL compiler. Apparently it's already &lt;a href="http://twitter.com/marijnjh/status/18682548562"&gt;faster than SpiderMonkey&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Not content with just having JS in CL, Red Daly also has a version of &lt;a href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt; that integrates Parenscript to provide things like symbol completion (get it on github: &lt;a href="http://github.com/gonzojive/slime"&gt;http://github.com/gonzojive/slime&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A little while later another surprising discovery occurred: a certain &lt;a href="http://3bb.cc/blog/"&gt;3b&lt;/a&gt; hacked up a &lt;a href="http://github.com/3b/slime-proxy"&gt;SLIME proxy&lt;/a&gt; and a &lt;a href="http://github.com/3b/parenscript"&gt;fork of Parenscript&lt;/a&gt; that lets you run a SLIME/Parenscript REPL in a browser using WebSockets. Apparently this all happened in a couple of days as part of the  &lt;a href="http://dto.github.com/notebook/lgdc.html"&gt;The 2010 Lisp Game Design Challenge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unrelated but still cool, 3b also wrote a &lt;a href="http://github.com/3b/3bil"&gt;CL to Flash bytecode compiler&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5188572510650796831?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5188572510650796831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5188572510650796831' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5188572510650796831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5188572510650796831'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/07/put-javascript-in-your-lisp-and-emacs.html' title='Put JavaScript in your Lisp and Emacs in your JavaScript'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1098548995603890304</id><published>2010-07-14T10:44:00.001-06:00</published><updated>2010-07-14T10:45:49.278-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Book review: Nicholas C. Zakas, High Performance JavaScript</title><content type='html'>&lt;a href="http://oreilly.com/catalog/9780596802806"&gt;Nicholas Zakas' &lt;i&gt;High Performance JavaScript&lt;/i&gt;&lt;/a&gt; is a collection of tips and techniques for improving JavaScript web application performance. Although everything contained in the book has been published before, this is the first time the information has been compiled into one concise reference.&lt;br /&gt;&lt;br /&gt;One of the highlights of the book is the discussion of reflows and interactions between JavaScript code and the browser UI. This area of JS-browser interaction is frequently overlooked by web developers, but is frequently responsible for perceived performance problems. Bringing this area of JS performance to popular attention may be book's most valuable contribution.&lt;br /&gt;&lt;br /&gt;High Performance JavaScript is not a book to learn JavaScript from, and its weakest points are when it tries to review JS principles. The book attempts to provide explanations of JS semantics and implementation techniques, but the descriptions are inaccurate at best, wrong at worst. The explanation of JS scoping rules in particular is misleading and at times erroneous.&lt;br /&gt;&lt;br /&gt;The book also includes dubious language-agnostic techniques like Duff's device and backward counting loops. Without guides to profiling, performance tuning principles, and an understanding of JS implementations, all of which the book lacks, this kind of advice will cause more harm than good in the hands of novice JS programmers, and its inclusion into an introductory book on JS performance tuning is questionable. The same can be said for the IE6-specific performance hacks mentioned throughout the book.&lt;br /&gt;&lt;br /&gt;While the book has good coverage of contemporary JS profiling tools, it does not attempt to teach approaches to profiling and identifying bottlenecks. Also missing are tips on isolating sources of DOM access and reflow penalties.&lt;br /&gt;&lt;br /&gt;Another thing High Performance JavaScript is not, is a guide to those working on JS implementations - there is no data on the JavaScript feature use and performance bottlenecks of contemporary JS web applications and libraries.&lt;br /&gt;&lt;br /&gt;High Performance JavaScript is a concise collection of wide-ranging information on improving the performance of JavaScript web applications. However, it should be read with a solid understanding of JS and knowledge of general techniques for identifying and addressing performance problems. Recommended as a reference for anyone writing web applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1098548995603890304?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1098548995603890304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1098548995603890304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1098548995603890304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1098548995603890304'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/07/book-review-nicholas-c-zakas-high.html' title='Book review: Nicholas C. Zakas, High Performance JavaScript'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6836385190901123483</id><published>2010-07-13T23:10:00.003-06:00</published><updated>2010-07-13T23:55:53.609-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Лисп семинары в Северной Америке</title><content type='html'>&lt;a href="http://www.iro.umontreal.ca/~sfp2010/"&gt;2010 семинар Scheme и функционального программирования&lt;/a&gt; состоится в Монреале 21-22 августа. Коллеги будут вести презентацию доклада о &lt;a href="http://www.jazzscheme.org/"&gt;JazzScheme&lt;/a&gt;. Планирую присутствовать, и выставить впечатления здесь.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.international-lisp-conference.org/2010/index"&gt;2010 международная Лисп конференция&lt;/a&gt; будет в Рино, США 19-21 октября. В этом году не собираюсь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6836385190901123483?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6836385190901123483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6836385190901123483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6836385190901123483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6836385190901123483'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/07/blog-post_13.html' title='Лисп семинары в Северной Америке'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4024955228338666057</id><published>2010-07-05T14:06:00.003-06:00</published><updated>2010-07-05T14:55:30.126-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Lisp and JS events</title><content type='html'>Heads-up on some upcoming Lisp and JavaScript events:&lt;br /&gt;&lt;br /&gt;Tuesday July 13, the &lt;a href="http://js-montreal.org/"&gt;Montréal JavaScript User Group&lt;/a&gt; is having a meet-up. &lt;a href="http://ca.linkedin.com/in/jamesaduncan"&gt;James Duncan&lt;/a&gt; of &lt;a href="http://www.joyent.com/"&gt;Joyent&lt;/a&gt; will talk about why software sucks and JavaScript is the end of programming language history. &lt;a href="http://ca.linkedin.com/in/laurentvilleneuve"&gt;Laurent Villeneuve&lt;/a&gt; will demonstrate idiomatic use of closures.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.iro.umontreal.ca/~sfp2010/"&gt;2010 Workshop on Scheme and Functional Programming&lt;/a&gt; is taking place at the &lt;a href="http://www.umontreal.ca/"&gt;University of Montreal&lt;/a&gt; August 21-22.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.international-lisp-conference.org/2010/index"&gt;ILC 2010&lt;/a&gt; will be taking place October 19-21 in Reno, Nevada. Abstracts are due by August 1. I'm not planning on attending.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4024955228338666057?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4024955228338666057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4024955228338666057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4024955228338666057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4024955228338666057'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/07/lisp-and-js-events.html' title='Lisp and JS events'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-8947179847613094796</id><published>2010-07-01T14:29:00.002-06:00</published><updated>2010-07-01T14:55:40.356-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Новый Лисп стартап</title><content type='html'>Недавно Канадский Лисп-программист &lt;a href="http://ca.linkedin.com/pub/warren-wilkinson/22/289/71"&gt;Уоррен Уилкинсон&lt;/a&gt; объявил о своем новом проекте - &lt;a href="http://www.formlis.com/"&gt;FormLis&lt;/a&gt;. FormLis состоит из комбинации вики и системы генерации веб-форм из простейшей разметки (&lt;a href="http://www.demo.formlis.com/recruitrequesition/"&gt;пример&lt;/a&gt;), а так же безсхемной базы данных поддерживающей генерированные формы.&lt;br /&gt;&lt;br /&gt;Уоррен решил описать &lt;a href="http://formlis.wordpress.com/2010/06/30/forth-in-lisp/"&gt;конструкцию и использование встроенного Форт (Forth) компилятора в Лиспе&lt;/a&gt; (англ.). Интересно что &lt;a href="http://www.hcsw.org/"&gt;Дуг Хойт&lt;/a&gt; посвятил главу своей книги &lt;a href="http://letoverlambda.com/"&gt;Let Over Lambda&lt;/a&gt; конструкции встроенного Форт компилятора, но увидеть такое в веб-приложении неожиданно и оригинально.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-8947179847613094796?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/8947179847613094796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=8947179847613094796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8947179847613094796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8947179847613094796'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/07/blog-post.html' title='Новый Лисп стартап'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7998414748266924740</id><published>2010-06-30T21:32:00.003-06:00</published><updated>2010-06-30T21:52:14.532-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Lisp in startups</title><content type='html'>Calgary-area Lisper &lt;a href="http://ca.linkedin.com/pub/warren-wilkinson/22/289/71"&gt;Warren Wilkinson&lt;/a&gt; recently launched &lt;a href="http://www.formlis.com/"&gt;FormLis&lt;/a&gt;, a Lisp-powered web application that combines a wiki with an ingeniously easy way to create custom forms (backed by a schemaless database that automatically manages form definition changes). One of the interesting technical details is Warren's use of an &lt;a href="http://formlis.wordpress.com/2010/06/30/forth-in-lisp/"&gt;embedded Forth to Lisp compiler&lt;/a&gt;. &lt;a href="http://www.hcsw.org/"&gt;Doug Hoyte&lt;/a&gt;'s &lt;a href="http://letoverlambda.com/"&gt;&lt;i&gt;Let Over Lambda&lt;/i&gt;&lt;/a&gt; (read &lt;a href="http://carcaddar.blogspot.com/2009/04/review-let-over-lambda.html"&gt;my review&lt;/a&gt; of the latter) features a Forth to Lisp compiler as a case-study chapter, but it's interesting to see one used in a real application.&lt;br /&gt;&lt;br /&gt;In other news, &lt;a href="http://www.itasoftware.com/"&gt;ITA Software&lt;/a&gt; is trying to get &lt;a href="http://online.wsj.com/article/SB10001424052748703279704575335301017621606.html"&gt;acquired by Google for a billion dollars&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7998414748266924740?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7998414748266924740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7998414748266924740' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7998414748266924740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7998414748266924740'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/06/lisp-in-startups.html' title='Lisp in startups'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1027572282762982726</id><published>2010-05-02T22:24:00.001-06:00</published><updated>2010-05-02T22:27:04.508-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postmodernism'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Postmodern programming</title><content type='html'>Before the idea of postmodern programming can begin to be investigated, the question of whether anything like modernist and classical programming even exists needs to be asked.&lt;br /&gt;&lt;br /&gt;It's not surprising that the question of how to define postmodern programming is reframed by the OO contingent (reflecting their ignorance as much as their immature self-obsession) as literally "what comes after object-orientation?" That is a silly question to ask &lt;a href="http://video.google.com/videoplay?docid=-2950949730059754521#"&gt;when you don't know what object-oriented means&lt;/a&gt; or &lt;a href="http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf"&gt;what came before&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://homepages.ecs.vuw.ac.nz/~kjx/"&gt;James Noble&lt;/a&gt; and &lt;a href="http://hotsoft.carleton.ca/hotsoft/people/robert-biddle/"&gt;Robert Biddle&lt;/a&gt; attempted to address the issue in their &lt;a href="http://www.mcs.vuw.ac.nz/comp/Publications/CS-TR-02-9.abs.html"&gt;Notes on Postmodern Programming&lt;/a&gt;, but focused on the act of writing programs and left the question of programming paradigms unexamined.&lt;br /&gt;&lt;br /&gt;One possible interpretation gives surprisingly straightforward definitions: the development of the idea of algorithms constitutes the age of classical programming, while procedural and data abstraction, being the rationalization of the construction and application of algorithms, constitute modern programming.&lt;br /&gt;&lt;br /&gt;What then is the narrative of a modern program? The evaluation strategy. Algorithms are executed in steps. Modernist programming promotes rationalization in laying out these steps. Postmodern programming rejects the linear evaluation strategy.&lt;br /&gt;&lt;br /&gt;Curiously, we can arrive at the same conclusion by framing the relationship between procedural and functional programming in terms of a dialectic:&lt;br /&gt;&lt;br /&gt;The thesis of procedural programming is the description of programs in terms of time (sequential execution of instructions, or branching) and behavior (the semantics of instructions), as entities operating on data - object identity, and state of addressable (nameable) places (registers, variables, arrays, etc.).&lt;br /&gt;&lt;br /&gt;Functional programming presents a (quite literal) antithesis: programs are described in terms of data - identity (named functions) and state (first-class functions) - and operate on time (persistent/immutable data structures) and behavior (monads).&lt;br /&gt;&lt;br /&gt;The synthesis is a nondeterministic, reified (homoiconic), first-class program. The program exists for the sake of itself, becomes the object of study and center of efforts. The computational narrative of the evaluation strategy escapes control, and so from the point of view of the programmer becomes irrelevant.&lt;br /&gt;&lt;br /&gt;How, when, and why certain parts of the program are evaluated becomes subjective.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wall.org/~larry/pm.html"&gt;Perl&lt;/a&gt; wasn't the first postmodern programming language; Prolog was.&lt;br /&gt;&lt;br /&gt;Non-determinism as the rejection of computational narrative and the reification of time arise naturally from &lt;a href="http://en.wikipedia.org/wiki/No-communication_theorem"&gt;physical constraints&lt;/a&gt; when attempting to reason about concurrency. Most of the modernist concurrency techniques concern themselves with maintaining what I call the &lt;a href="http://carcaddar.blogspot.com/2009/10/impossibility-of-global-state.html"&gt;global state illusion&lt;/a&gt;, or quite literally forcing a single narrative on a distributed system. Not only does the current state of the system remain unknown and unknowable, but its past history permits an exponential number of &lt;a href="http://everything2.com/title/serializability"&gt;equally valid, relative interpretations&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey"&gt;Rich Hickey's 2009 JVM summit presentation&lt;/a&gt; explores these concepts of concurrency and time in a thought-provoking manner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1027572282762982726?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1027572282762982726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1027572282762982726' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1027572282762982726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1027572282762982726'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/05/postmodern-programming.html' title='Postmodern programming'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6035744631726224819</id><published>2010-04-20T21:27:00.003-06:00</published><updated>2010-04-20T21:39:49.008-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Манга о Лиспе</title><content type='html'>Для тех кто знает японский язык, недавно наткнулся на забавные учебники Лиспа в виде &lt;a href="http://lambda.bugyo.tk/cdr/mwl/"&gt;манга&lt;/a&gt; и &lt;a href="http://lyrical.bugyo.tk/"&gt;интерактивный&lt;/a&gt;. Ну а для англоязычных есть прославленный комикс &lt;a href="http://www.lisperati.com/casting.html"&gt;Casting SPELs in Lisp&lt;/a&gt; (автор которого написал целую иллюстрированною книгу по теме - будет опубликована этим летом издательским домом No Starch Press).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6035744631726224819?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6035744631726224819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6035744631726224819' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6035744631726224819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6035744631726224819'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/04/blog-post.html' title='Манга о Лиспе'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-633708250018130868</id><published>2010-04-20T21:14:00.003-06:00</published><updated>2010-04-20T21:27:20.349-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp tutorial'/><title type='text'>Lisp Manga</title><content type='html'>Many people will remember Conrad Barski's &lt;a href="http://www.lisperati.com/casting.html"&gt;Casting SPELs in Lisp&lt;/a&gt; illustrated Lisp tutorial (Conrad's illustrated book, &lt;a href="http://www.amazon.com/Land-LISP-Learn-Program-Game/dp/1593272006/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1271820276&amp;sr=8-1"&gt;Land of LISP&lt;/a&gt;, is due out this summer). I just came upon a &lt;a href="http://lambda.bugyo.tk/cdr/mwl/"&gt;Lisp manga&lt;/a&gt; and &lt;a href="http://lyrical.bugyo.tk/"&gt;interactive tutorial&lt;/a&gt; (both in Japanese) put together by a group of Japanese Lispers. Kawaii!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-633708250018130868?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/633708250018130868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=633708250018130868' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/633708250018130868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/633708250018130868'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/04/lisp-manga.html' title='Lisp Manga'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5098632009377488519</id><published>2010-03-07T16:10:00.002-07:00</published><updated>2010-03-07T16:19:00.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>New native AMQP client for Common Lisp</title><content type='html'>I posted about &lt;a href="http://carcaddar.blogspot.com/2009/12/common-lisp-bindings-now-part-of-zeromq.html"&gt;Common Lisp messaging libraries&lt;/a&gt; before, so I'm happy to see that &lt;a href="http://setf.de/"&gt;James Anderson&lt;/a&gt; has recently released &lt;a href="http://common-lisp.net/project/de-setf-amqp/"&gt;de.setf.amqp&lt;/a&gt;, a native Common Lisp AMQP client. (thanks to &lt;a href="http://13-49.blogspot.com/"&gt;Vitaly Mayatskikh&lt;/a&gt; for the heads-up).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5098632009377488519?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5098632009377488519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5098632009377488519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5098632009377488519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5098632009377488519'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/03/new-native-amqp-client-for-common-lisp.html' title='New native AMQP client for Common Lisp'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1093030144463602757</id><published>2010-03-01T07:11:00.004-07:00</published><updated>2010-03-01T07:42:05.315-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Обновление библиотек</title><content type='html'>На прошлой неделе сделал релиз &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; 2.1 и &lt;a href="http://common-lisp.net/project/eager-future/"&gt;Eager Future&lt;/a&gt; 0.4. В Parenscriptе добавилось неявное возвращение (как в Лиспе - те не надо всегда использовать &lt;code&gt;return&lt;/code&gt;), возвращение множеств значений, и &lt;a href="http://common-lisp.net/project/parenscript/reference.html"&gt;новое справочное руководство&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=""&gt;Paddy Mullen&lt;/a&gt; решил привести в приличный вид &lt;a href="http://www.cliki.net/css-lite"&gt;css-lite&lt;/a&gt;. На данный момент можно скачать здесь: &lt;a href="http://github.com/paddymul/css-lite"&gt;http://github.com/paddymul/css-lite&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thomas de Grivel сделал форк &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt;: его &lt;a href="http://github.com/billitch/cl-uri-templates"&gt;cl-uri-templates&lt;/a&gt; дает возможность использовать операторы замены, которые были добавлены в &lt;a href="http://tools.ietf.org/html/draft-gregorio-uritemplate-02"&gt;третьем черновике документа URI Template&lt;/a&gt;. Сами операторы довольно плохо продуманы, и в добавок uri-template позволяет использовать обычные Лисповые формы в шаблонах, что намного проще.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1093030144463602757?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1093030144463602757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1093030144463602757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1093030144463602757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1093030144463602757'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/03/blog-post.html' title='Обновление библиотек'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2288711031274612415</id><published>2010-02-28T19:07:00.006-07:00</published><updated>2010-03-01T07:08:47.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Software updates</title><content type='html'>I released &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript 2.1&lt;/a&gt; (Parenscript now has real version numbers!) this week. Check out the &lt;a href="http://common-lisp.net/project/parenscript/reference.html"&gt;updated reference manual&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://common-lisp.net/project/eager-future/"&gt;Eager Future&lt;/a&gt; also got a new release making it optionally eager (by popular demand).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://paddymullen.com/"&gt;Paddy Mullen&lt;/a&gt; decided to take over &lt;a href="http://www.cliki.net/css-lite"&gt;css-lite&lt;/a&gt; development. His fork includes new features and actual code examples. You can find it on github (ASDF-installable package coming soon): &lt;a href="http://github.com/paddymul/css-lite"&gt;http://github.com/paddymul/css-lite&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thomas de Grivel forked &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt;: &lt;a href="http://github.com/billitch/cl-uri-templates"&gt;cl-uri-templates&lt;/a&gt; adds the substitution operators introduced in the &lt;a href="http://tools.ietf.org/html/draft-gregorio-uritemplate-02"&gt;third draft of the URI Template proposal&lt;/a&gt;. I think they are quite horrible and so have abstained from implementing them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2288711031274612415?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2288711031274612415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2288711031274612415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2288711031274612415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2288711031274612415'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/02/software-updates.html' title='Software updates'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-99655988136186130</id><published>2010-01-08T14:21:00.002-07:00</published><updated>2010-01-08T14:49:22.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><title type='text'>First Montreal JavaScript user's group meeting</title><content type='html'>The inaugural meeting of the &lt;a href="http://js-montreal.org/"&gt;Montreal JavaScript user's group&lt;/a&gt; will take place in two weeks, on January 21 (to coincide with &lt;a href="http://2010.cusec.net/"&gt;CUSEC&lt;/a&gt;) at 7pm at the offices of &lt;a href="http://www.bloomdigital.com/"&gt;Bloom Digital&lt;/a&gt; (481 Avenue Viger Ouest, Suite 202, right near Square-Victoria metro).&lt;br /&gt;&lt;br /&gt;Laurent Villeneuve will present a talk about JavaScript domain-specific languages. You can follow announcements on Twitter (&lt;a href="http://twitter.com/jsmontreal"&gt;jsmontreal&lt;/a&gt;) and the &lt;a href="http://groups.google.com/group/js-montreal"&gt;mailing list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-99655988136186130?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/99655988136186130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=99655988136186130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/99655988136186130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/99655988136186130'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/01/first-montreal-javascript-users-group.html' title='First Montreal JavaScript user&apos;s group meeting'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4811503743538889139</id><published>2010-01-06T11:40:00.002-07:00</published><updated>2010-01-06T11:47:44.891-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Джон Фремлин о том как писать скоростной код на Lispе</title><content type='html'>Джон Фремлин начал серию статей о оптимизации Common Lisp кода на своём блоге (англ.):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: introduction&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-plan"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: planning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-gc"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: the garbage collector&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-gc-example"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: object pools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-builtins"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: builtins&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Много полезного.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4811503743538889139?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4811503743538889139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4811503743538889139' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4811503743538889139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4811503743538889139'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/01/lisp.html' title='Джон Фремлин о том как писать скоростной код на Lispе'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7874335875253815371</id><published>2010-01-06T11:33:00.003-07:00</published><updated>2010-01-06T11:40:11.497-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>John Fremlin's guide to writing fast code</title><content type='html'>These haven't shown up on &lt;a href="http://planet.lisp.org/"&gt;Planet Lisp&lt;/a&gt;, but they're definitely worth reading if you want to know how to write fast Common Lisp code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: introduction&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-plan"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: planning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-gc"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: the garbage collector&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-gc-example"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: object pools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://john.freml.in/sbcl-optimise-builtins"&gt;John Fremlin's blog: How to optimise Common Lisp under SBCL: builtins&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I'm looking forward to more installments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7874335875253815371?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7874335875253815371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7874335875253815371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7874335875253815371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7874335875253815371'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2010/01/john-fremlins-guide-to-writing-fast.html' title='John Fremlin&apos;s guide to writing fast code'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7478736214138741455</id><published>2009-12-03T16:56:00.003-07:00</published><updated>2009-12-03T17:14:59.077-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>Common Lisp bindings now part of ZeroMQ 2.0</title><content type='html'>Today &lt;a href="http://13-49.blogspot.com/"&gt;Vitaly Mayatskikh&lt;/a&gt; &lt;a href="http://lists.zeromq.org/pipermail/zeromq-dev/2009-December/001467.html"&gt;announced&lt;/a&gt; the inclusion of his Common Lisp ZeroMQ bindings into the &lt;a href="http://github.com/sustrik/zeromq2"&gt;ZeroMQ 2.0 source tree&lt;/a&gt;. ZeroMQ 2.0 is a high-performance messaging system, which is great news if you are trying to build distributed systems in Common Lisp.&lt;br /&gt;&lt;br /&gt;Previously, available Free Software alternatives for Common Lisp messaging included &lt;a href="http://common-lisp.net/project/cl-xmpp/"&gt;CL-XMPP&lt;/a&gt; (XMPP client only) and &lt;a href="http://www.nicklevine.org/cl-rabbit/"&gt;CL-RABBIT&lt;/a&gt; (Lispworks only).&lt;br /&gt;&lt;br /&gt;Note that ZeroMQ 2.0, unlike version 1, no longer implements AMQP, due to performance reasons.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7478736214138741455?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7478736214138741455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7478736214138741455' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7478736214138741455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7478736214138741455'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/12/common-lisp-bindings-now-part-of-zeromq.html' title='Common Lisp bindings now part of ZeroMQ 2.0'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2841085877441268583</id><published>2009-11-19T14:53:00.004-07:00</published><updated>2009-11-19T16:09:37.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network programming'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Как программировать скоростные сервера в Лиспе</title><content type='html'>17 Ноября я презентовал мои идеи о &lt;a href="http://vsedach.googlepages.com/lisp_high_perf_servers.pdf"&gt;конструкции скоростных серверов в Лиспе&lt;/a&gt; &lt;a href="http://schemeway.dyndns.org/mslug/mslug-home"&gt;Монреальской группе программистов Scheme и Лисп&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Идеи презентации исходят из моей экзаменации веб-серверов &lt;a href="http://hoytech.com/antiweb/"&gt;Antiweb&lt;/a&gt; и &lt;a href="http://common-lisp.net/project/teepeedee2/"&gt;TPD2&lt;/a&gt; (смотрим презентацию Джона Фремлина о TPD2 Шибуйским Лисперам &lt;a href="http://www.youtube.com/watch?v=uUymzUdWBuo"&gt;здесь&lt;/a&gt;). Один недостаток обоих серверов - довольно наивный подход к конкуренции и синхронизации. Я решил конструировать новый веб-сервер на базе этих примеров и размышлений, &lt;a href="http://wiki.github.com/vsedach/HTTP-DOHC"&gt;HTTP DOHC&lt;/a&gt; (DOHC - Dual Overhead Camshaft, когда в двигателе автомобиля двое распределительных валов в головке цилиндров - имя выбрано из за связанной двойной системы демультиплексирования в сервере).&lt;br /&gt;&lt;br /&gt;Планирую дальнейшее развитие HTTP DOHC в полноценный веб-сервер, с интерфейсом схожим с &lt;a href="http://weitz.de/hunchentoot/"&gt;Hunchentoot&lt;/a&gt; 1.0.&lt;br /&gt;&lt;br /&gt;Ещё хочу обратить внимание - освободилось личное время для коммерческих проектов. Пишите на &lt;a href="mailto:vsedach@gmail.com"&gt;vsedach@gmail.com&lt;/a&gt; если есть что интересное.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2841085877441268583?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2841085877441268583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2841085877441268583' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2841085877441268583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2841085877441268583'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/11/blog-post_19.html' title='Как программировать скоростные сервера в Лиспе'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1882612070763049940</id><published>2009-11-19T14:36:00.005-07:00</published><updated>2009-11-19T15:04:14.323-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='network programming'/><title type='text'>November Montreal Scheme/Lisp User Group presentation</title><content type='html'>On November 17, I gave a presentation to the &lt;a href="http://schemeway.dyndns.org/mslug/mslug-home"&gt;Montreal Scheme/Lisp User Group&lt;/a&gt; about &lt;a href="http://vsedach.googlepages.com/lisp_high_perf_servers.pdf"&gt;developing high-performance network servers in Lisp&lt;/a&gt;. I looked at the lessons to be learned from existing Common Lisp web servers, notably &lt;a href="http://hoytech.com/antiweb/"&gt;Antiweb&lt;/a&gt; and &lt;a href="http://common-lisp.net/project/teepeedee2/"&gt;TPD2&lt;/a&gt;, tried out some of the ideas in my own new under-development web server &lt;a href="http://github.com/vsedach/HTTP-DOHC"&gt;HTTP DOHC&lt;/a&gt; along with some new ideas about threading and concurrency, and put the results of my findings into the presentation.&lt;br /&gt;&lt;br /&gt;If you're interested in the topic, you should also watch &lt;a href="http://www.youtube.com/watch?v=uUymzUdWBuo"&gt;John Fremlin's TPD2 presentation to the Shibuya Lisp user's group&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I plan on making &lt;a href="http://github.com/vsedach/HTTP-DOHC"&gt;HTTP DOHC&lt;/a&gt; a full-featured Common Lisp web server with an interface that's somewhat compatible with &lt;a href="http://weitz.de/hunchentoot/"&gt;Hunchentoot&lt;/a&gt; 1.0.&lt;br /&gt;&lt;br /&gt;In other news, I now have time available for contract work. Get in touch at &lt;a href="mailto:vsedach@gmail.com"&gt;vsedach@gmail.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1882612070763049940?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1882612070763049940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1882612070763049940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1882612070763049940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1882612070763049940'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/11/november-montreal-schemelisp-user-group.html' title='November Montreal Scheme/Lisp User Group presentation'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-123397074671773862</id><published>2009-11-19T13:19:00.003-07:00</published><updated>2009-11-19T14:22:42.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp-ru'/><title type='text'>Шаблоны и генерация кода</title><content type='html'>Читатели &lt;a href="http://lisper.ru/planet/"&gt;Russian Lisp Planet&lt;/a&gt; уже знакомы с системой &lt;a href="http://archimag-dev.blogspot.com/"&gt;archimag&lt;/a&gt;а &lt;a href="http://code.google.com/p/cl-closure-template/"&gt;cl-closure-template&lt;/a&gt;. Повторять все подробности не буду, но сделаю несколько комментарий о этом подходе к шаблонам.&lt;br /&gt;&lt;br /&gt;Главное что надо заметить - cl-closure-template является не системой шаблонов, а &lt;i&gt;системой генерации систем шаблонов&lt;/i&gt;. Это примерно та же разница между любым парсером, и парсер-генератором yacc. Если посмотреть на &lt;a href="http://en.wikipedia.org/wiki/File:TempEngGen015.svg"&gt;диаграмму систем шаблонов на Википедии&lt;/a&gt;, то по сравнению cl-closure-template берет шаблон как параметр и выдает программу, которая берет дату и производит документ. &lt;br /&gt;&lt;br /&gt;Такой подход дата генерации истинно Лисповский, и имеет множество превосходств над обычными системами шаблонов. Например можно совместить его с Common Lispовской системой reader macros и получить полноправные новые правила синтаксиса (так сделано в &lt;a href="http://weitz.de/cl-interpol/"&gt;CL-INTERPOL&lt;/a&gt; и &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt;). Или пропустить генерированный код через систему трансляции типа &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; и получить возможность использовать те же самые шаблоны в разных языках программирования, как и делается в &lt;a href="http://code.google.com/p/cl-closure-template/"&gt;cl-closure-template&lt;/a&gt; и &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt;. Так же открывается возможность использования методов частичной эвалюации (partial evaluation) для генерации оптимизированного кода.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-123397074671773862?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/123397074671773862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=123397074671773862' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/123397074671773862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/123397074671773862'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/11/blog-post.html' title='Шаблоны и генерация кода'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1287513206168526102</id><published>2009-11-18T15:12:00.003-07:00</published><updated>2009-11-18T15:53:04.843-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ParenScript'/><title type='text'>Templates and code generation</title><content type='html'>Earlier this month Google released &lt;a href="http://code.google.com/closure/templates/"&gt;Closure Templates&lt;/a&gt;, a new templating library intended for generating HTML. Who cares? I personally dislike HTML templating, and avoid it whenever possible in lieu of s-expression based generation tools like &lt;a href="http://weitz.de/cl-who/"&gt;CL-WHO&lt;/a&gt;. At first look, Closure Templates didn't seem to be anything new or useful.&lt;br /&gt;&lt;br /&gt;The one thing that makes Closure Templates somewhat interesting is that the library works in both Java and JavaScript, so you get client and server-side templates in one place. I did a similar thing with &lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt; by having the URI template expand into code that executed in both Common Lisp and JavaScript via &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; (here I have to state that despite being an author of a templating library, I still dislike templating libraries and even find my own creation annoying at times).&lt;br /&gt;&lt;br /&gt;About a week after Closure Templates was released, Andrey Moskvitin (&lt;a href="http://archimag-dev.blogspot.com/"&gt;archimag&lt;/a&gt;) wrote an implementation in Common Lisp (interesting note: it took him &lt;a href="http://translate.google.com/translate?js=n&amp;prev=_t&amp;hl=en&amp;ie=UTF-8&amp;u=http%3A%2F%2Farchimag-dev.blogspot.com%2F2009%2F11%2Fclosure-template-5.html&amp;sl=ru&amp;tl=en&amp;swap=1&amp;swap=1"&gt;only five days and 1/15 the number of lines of code&lt;/a&gt; as the original). The resulting system, &lt;a href="http://code.google.com/p/cl-closure-template/"&gt;cl-closure-template&lt;/a&gt;, similarly generates JavaScript via Parenscript.&lt;br /&gt;&lt;br /&gt;I still didn't understand the motivation. Yesterday, &lt;a href="http://translate.google.com/translate?js=y&amp;prev=_t&amp;hl=en&amp;ie=UTF-8&amp;u=http%3A%2F%2Farchimag-dev.blogspot.com%2F2009%2F11%2Fclosure-templates.html&amp;sl=ru&amp;tl=en"&gt;Andrey was kind enough to explain it&lt;/a&gt;. Those pampered by web development in Common Lisp using s-expression HTML generation tools simply don't encounter the problem of trying to fit HTML templating onto the paradigm of incremental page updating via AJAX. So if you want to build an AJAX web application and use HTML templating, give &lt;a href="http://code.google.com/p/cl-closure-template/"&gt;cl-closure-template&lt;/a&gt; a try.&lt;br /&gt;&lt;br /&gt;[Blog metanote: if you're reading this blog through its feed, you will shortly see this post show up in Russian. &lt;i&gt;a CONS is an object which cares&lt;/i&gt; is now syndicated on &lt;a href="http://lisper.ru/planet/"&gt;Russian Lisp Planet&lt;/a&gt;, and I'm going to be writing Lisp-related posts in Russian as well as English. All such posts will be tagged 'lisp-ru'. Filter out that tag if you don't want the Russian version of the posts to show up in your feed reader.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1287513206168526102?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1287513206168526102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1287513206168526102' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1287513206168526102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1287513206168526102'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/11/templates-and-code-generation.html' title='Templates and code generation'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7517635947722652065</id><published>2009-11-05T15:02:00.002-07:00</published><updated>2009-11-05T19:48:00.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Recruiting Puzzles</title><content type='html'>One of the most interesting parts of &lt;a href="http://gigamonkeys.com/"&gt;Peter Seibel&lt;/a&gt;'s &lt;i&gt;&lt;a href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&amp;tag=vladimirsedac-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1430219483"&gt;Coders at Work&lt;/a&gt;&lt;/i&gt; (see &lt;a href="http://books.slashdot.org/story/09/09/02/1331233/Coders-At-Work"&gt;my review on Slashdot&lt;/a&gt;) was &lt;a href="http://norvig.com/"&gt;Peter Norvig&lt;/a&gt;'s discussion of the Google programmer hiring process.&lt;br /&gt;&lt;br /&gt;The impact of a bad hire on a programming team can be extremely negative - vastly increased code maintenance costs and reduced morale and productivity. "Hire slowly" is now becoming an ingrained mantra in software companies. Despite this, effective processes for evaluating candidate programmers still seem to be little known.&lt;br /&gt;&lt;br /&gt;Interview puzzle questions (made (in)famous by &lt;a href="http://aleemkhan.wordpress.com/2005/05/11/microsoft-puzzleanalytical-questions/"&gt;Microsoft&lt;/a&gt;) as a tool in the hiring process came up in Norvig's interview. Not surprisingly he is against the idea. For a while puzzle questions were a fad in programmer interviews, based on the (unfounded and unverified) assumption that they were a predictor of coding prowess. &lt;br /&gt;&lt;br /&gt;To examine why puzzle questions are a dumb idea, you need to look at the objectives you are trying to fulfill when hiring programmers:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hire someone who is good at programming.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hire someone who is good at programming &lt;i&gt;as part of your team&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;There is no need to resort to unrelated tasks with a low degree of correlation to see whether someone will help fulfill these objectives. A candidate can be assessed directly and efficiently by inviting them for three hours of pair programming. &lt;br /&gt;&lt;br /&gt;Why are you still wasting time asking how many golf balls can fit in an airplane?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7517635947722652065?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7517635947722652065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7517635947722652065' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7517635947722652065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7517635947722652065'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/11/recruiting-puzzles.html' title='Recruiting Puzzles'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-2377277183996228342</id><published>2009-10-20T14:41:00.003-06:00</published><updated>2009-10-20T14:56:19.292-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><title type='text'>Web shortcomings and opportunities</title><content type='html'>There is a very interesting post itemizing some of the &lt;a href="http://spacecollective.org/HackerLastPip/5242/Points-on-a-new-Internet"&gt;perceived shortcomings of the web&lt;/a&gt; over at the &lt;a href="http://spacecollective.org/"&gt;SpaceCollective&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Some of those problems have been addressed by researchers in the past - notable examples are &lt;a href="http://cs-www.cs.yale.edu/homes/freeman/lifestreams.html"&gt;Freeman and Gelernter's Lifestreams&lt;/a&gt;, and &lt;a href="http://video.google.com/videoplay?docid=-8329031368429444452#"&gt;Nelson's transclusion&lt;/a&gt; (I assume this is what the author of the SpaceCollective article means by the term &lt;i&gt;collage&lt;/i&gt;; in any case you can start using a limited form of &lt;a href="http://forge.blueoxen.net/purple-include/"&gt;transclusion today&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;Some of those problems are being addressed on an ad-hoc basis by commercial companies today. If you take some time to think about the problems, there is still a wide open field of opportunity to provide commercial offerings around the ideas there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-2377277183996228342?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/2377277183996228342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=2377277183996228342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2377277183996228342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/2377277183996228342'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/10/web-shortcomings-and-opportunities.html' title='Web shortcomings and opportunities'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-88345680908598898</id><published>2009-10-18T09:57:00.002-06:00</published><updated>2009-10-18T10:00:59.603-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The history of programming language syntax</title><content type='html'>&lt;a href="http://news.bbc.co.uk/2/hi/technology/8306631.stm"&gt;http://news.bbc.co.uk/2/hi/technology/8306631.stm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Only if all the other "programming language designers" had the conscience to apologize for the pain their thoughtlessness has caused.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-88345680908598898?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/88345680908598898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=88345680908598898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/88345680908598898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/88345680908598898'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/10/history-of-programming-language-syntax.html' title='The history of programming language syntax'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5981360038952347196</id><published>2009-10-15T16:50:00.003-06:00</published><updated>2009-10-15T19:08:31.755-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><title type='text'>Computers are not getting faster</title><content type='html'>&lt;blockquote&gt;When we discuss the inclusion of a feature in Lua, we ask ourselves, "OK, but will it run in a microwave oven?"&lt;/blockquote&gt; --Luiz Henrique de Figueiredo&lt;br /&gt;&lt;br /&gt;I recently started working with John Fremlin's &lt;a href="http://github.com/vii/teepeedee2"&gt;TPD2&lt;/a&gt; HTTP server, one of the &lt;a href="http://john.freml.in/teepeedee2-c10k"&gt;fastest web servers&lt;/a&gt; currently available. TPD2 uses a lot of interesting (at least from a Lisp point of view) techniques to achieve high performance. This reminded me of something I noticed in &lt;a href="http://carcaddar.blogspot.com/2009/04/masterminds-of-programming.html"&gt;Masterminds of Programming&lt;/a&gt;: both Chuck Moore and the creators of Lua emphasized the tendency of computers to scale down. &lt;br /&gt;&lt;br /&gt;When laptops and servers are getting faster processors with larger caches and more cores (which doesn't really help because &lt;a href="http://carcaddar.blogspot.com/2009/10/impossibility-of-global-state.html"&gt;we don't know even know how to think about writing software for them&lt;/a&gt;), it's easy to overlook the fact that we're trying to imbue ever smaller objects with computational intelligence. Moore provided the extreme example of a chip having cores with 64 words of RAM and 64 words of ROM memory each. A less extreme example comes in the form of smartphones.&lt;br /&gt;&lt;br /&gt;At the same time use of existing systems is increasing to the point where some people are measuring how much servers they buy by the &lt;a href="http://searchstorage.techtarget.com/news/article/0,289142,sid5_gci1232063,00.html"&gt;number of tons of waste their packaging generates&lt;/a&gt;. If each of your servers could handle three times as many requests per second, you could fit it on a computer three times as small, or have a datacenter a third of the size. The latter is a pragmatic consideration applicable at any time, but the former enables entirely new patterns of use and interaction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5981360038952347196?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5981360038952347196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5981360038952347196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5981360038952347196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5981360038952347196'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/10/computers-are-not-getting-faster.html' title='Computers are not getting faster'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7642589728142182075</id><published>2009-10-13T16:40:00.006-06:00</published><updated>2009-10-14T10:20:49.858-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>The impossibility of global state</title><content type='html'>(This post is a write-up of some ideas about concurrency that I've &lt;a href="http://carcaddar.blogspot.com/2009/03/p-cos-blew-my-mind.html"&gt;briefly discussed&lt;/a&gt; before).&lt;br /&gt;&lt;br /&gt;By far the bulk of concurrency practice is aimed at dealing with systems based around shared, mutable state. Participants are asked to imagine a world with a global state whose changes are instantaneously observable by everyone. &lt;a href="http://en.wikipedia.org/wiki/No-communication_theorem"&gt;This world is a physical impossibility&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The global state illusion is based on elaborate consensus mechanisms. The concept only works because our perception of the flow of time is fixed vis-a-vis the rest of the world, which happens to be just quick enough to execute consensus algorithms over large networks that we don't get annoyed.&lt;br /&gt;&lt;br /&gt;The common refrain to criticisms of the global state illusion is "but think of the bankers!" The consistent bank account with atomic deposits and withdrawals is an example found in almost all textbooks on concurrency. It is a neat and self-contained pedagogical tool for discussing the mechanisms needed to construct a global state illusion, but unfortunately its pervasive use seems to have done immense damage to any attempts to actually reason about concurrent systems.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/History_of_banking#Earliest_banks"&gt;Networked credit banking existed in 4th century BC Egypt&lt;/a&gt;. Banks still accept checks. Your bank account still has overdraft fees. Bank accounts work by reifying transactions as first-class objects. That this idea is &lt;a href="http://carcaddar.blogspot.com/2009/10/append-only-databases.html"&gt;considered&lt;/a&gt; &lt;a href="http://www.infoq.com/presentations/greg-young-unshackle-qcon08"&gt;novel&lt;/a&gt; is a testament to the pervasive confusion surrounding concurrency today.&lt;br /&gt;&lt;br /&gt;What is the global state illusion really needed for? &lt;a href="http://carcaddar.blogspot.com/2009/03/peer-to-peer-synchronized-simulations.html"&gt;Distributed shared simulations&lt;/a&gt;. Most commonly seen in the guise of videogames. There, all the participants really do need to see a consistent view of the world with changes occurring in quantized time steps.&lt;br /&gt;&lt;br /&gt;The key insight behind the global state illusion is that &lt;i&gt;it is not time-scale independent&lt;/i&gt;. Whether the illusion can be maintained depends on how the participants perceive the flow of time relative to how quickly the mechanisms behind the illusion work. Banks could have implemented a pen-and-paper two-phase commit protocol for deposits and withdrawals before the advent of telecommunications. It would not have been very useful. This is the same exact issue affecting cache-coherency protocols in multi-core processors, at the micrometer scale.&lt;br /&gt;&lt;br /&gt;The way forward in concurrency practice is the abandonment of the global state illusion in favor of constructing systems based on how concurrency works in the real world, taking cues and patterns from organizational and biological systems. This will entail the use of techniques from functional programming and &lt;a href="http://home.pipeline.com/~hbaker1/Use1Var.html"&gt;linear logic&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7642589728142182075?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7642589728142182075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7642589728142182075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7642589728142182075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7642589728142182075'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/10/impossibility-of-global-state.html' title='The impossibility of global state'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6955123387827087977</id><published>2009-10-10T16:44:00.005-06:00</published><updated>2009-10-10T18:30:21.795-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='functionalprogramming'/><title type='text'>Append-only databases</title><content type='html'>Two years ago, &lt;a href="http://blogs.msdn.com/pathelland/"&gt;Pat Helland&lt;/a&gt; wrote &lt;a href="http://blogs.msdn.com/pathelland/archive/2007/06/14/accountants-don-t-use-erasers.aspx"&gt;Accountants Don't Use Erasers&lt;/a&gt;, which resonated widely in the blogosphere. The central premise, append-only databases, offered a glimpse of the promises of purely functional programming. The idea itself is probably as old as transactional databases, however it has been significantly delayed in practical realization due to the nature of storage hardware.&lt;br /&gt;&lt;br /&gt;Append-only filesystems have been around for some time for hard-drives, used mainly for archival storage (the Plan9 &lt;a href="http://lsub.org/sys/doc/venti/venti.html"&gt;Venti&lt;/a&gt; filesystem being the most widely known example). Append-only database implementations have been held back by the high seek latency of mechanical drives. This is changing as high-capacity flash drives are becoming available.&lt;br /&gt;&lt;br /&gt;Over the summer, Slava Akhmechet (of &lt;a href="http://weblocks.viridian-project.de/"&gt;Weblocks&lt;/a&gt; fame), along with Michael Glukhovsky and Leif Walsh, started &lt;a href="http://www.rethinkdb.com/"&gt;RethinkDB&lt;/a&gt;, a project to build a new append-only MySQL backend. Aside from the performance improvement, RethinkDB manages to solve some glaring MySQL DB management problems: hot backups (without special tools) and fast failure recovery.&lt;br /&gt;&lt;br /&gt;The possibilities for flash storage to enable significantly greater database performance were previously noted in several papers (see &lt;a href="http://portal.acm.org/citation.cfm?id=1376723&amp;dl=&amp;coll=&amp;CFID=57106532&amp;CFTOKEN=47980771"&gt;Lee et alia&lt;/a&gt; and &lt;a href="http://www.cs.cmu.edu/~damon2007/pdf/graefe07fiveminrule.pdf"&gt;Graefe&lt;/a&gt;; even the late Jim Gray &lt;a href="http://research.microsoft.com/en-us/um/people/gray/papers/FlashDiskPublic.doc"&gt;weighed in on flash drives&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6955123387827087977?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6955123387827087977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6955123387827087977' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6955123387827087977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6955123387827087977'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/10/append-only-databases.html' title='Append-only databases'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-9130222778787338952</id><published>2009-09-30T23:42:00.004-06:00</published><updated>2009-10-02T05:47:35.326-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='hackers'/><title type='text'>A better way to do screencasts</title><content type='html'>My friend &lt;a href="http://paddymullen.com/"&gt;Paddy Mullen&lt;/a&gt; recently released &lt;a href="http://terminalcast.com/"&gt;TerminalCast&lt;/a&gt;, a sort of online &lt;a href="http://0xcc.net/ttyrec/index.html.en"&gt;ttyrec&lt;/a&gt; player with synced audio (it is in fact based on a full in-browser JavaScript reimplementation of rxvt). This lets you do non-blurry screencast tutorials with full copy-and-paste support. I'm planning to make a Lisp web tutorial sometime in the near future.&lt;br /&gt;&lt;br /&gt;Paddy will be giving a talk about TerminalCast at the next &lt;a href="http://www.lispnyc.org/home.clp"&gt;LispNYC&lt;/a&gt; meeting on October 13.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-9130222778787338952?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/9130222778787338952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=9130222778787338952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9130222778787338952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9130222778787338952'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/09/better-way-to-do-screencasts.html' title='A better way to do screencasts'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6893469038335422107</id><published>2009-09-21T07:21:00.002-06:00</published><updated>2009-09-21T07:26:04.568-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ParenScript'/><title type='text'>New Parenscript release.</title><content type='html'>A new version of &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; has just been released (see the official &lt;a href="http://common-lisp.net/pipermail/parenscript-devel/2009-September/000598.html"&gt;release announcement&lt;/a&gt; for some more details). This release fixes a number of issues (among them poor compilation speed due to terrible choice of implementation on the part of yours truly, for which I have recently been called a lot of &lt;a href="http://swizard.livejournal.com/127024.html"&gt;bad names in the Russian Lisp blog world&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6893469038335422107?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6893469038335422107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6893469038335422107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6893469038335422107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6893469038335422107'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/09/new-parenscript-release.html' title='New Parenscript release.'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4612165639255400597</id><published>2009-09-02T17:37:00.002-06:00</published><updated>2009-09-02T17:48:09.040-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel computing'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Eager Future</title><content type='html'>I just put up the &lt;a href="http://common-lisp.net/"&gt;common-lisp.net&lt;/a&gt; project page for &lt;a href="http://common-lisp.net/project/eager-future/"&gt;Eager Future&lt;/a&gt;, a library for concurrent programming with composable, eager futures (see &lt;a href="http://lambda-the-ultimate.org/node/3221"&gt;this LtU&lt;/a&gt; discussion of what that means).&lt;br /&gt;&lt;br /&gt;Eager Future is a rewrite of &lt;a href="http://marijn.haverbeke.nl/"&gt;Marijn Haverbeke&lt;/a&gt;'s &lt;a href="http://marijn.haverbeke.nl/pcall/"&gt;PCall&lt;/a&gt; library (I've blogged about &lt;a href="http://carcaddar.blogspot.com/2009/02/parenscript-tricks-and-parallelism.html"&gt;PCall&lt;/a&gt; and &lt;a href="http://carcaddar.blogspot.com/2009/03/assorted-lisp-news.html"&gt;extending it with support for composition&lt;/a&gt; before). Unlike PCall, Eager Future executes futures eagerly, which lets you use the futures composition mechanism for soft real-time programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4612165639255400597?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4612165639255400597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4612165639255400597' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4612165639255400597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4612165639255400597'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/09/eager-future.html' title='Eager Future'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-124623526175833337</id><published>2009-09-02T14:49:00.002-06:00</published><updated>2009-09-02T14:52:20.687-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Coders at Work</title><content type='html'>Slashdot just ran &lt;a href="http://books.slashdot.org/story/09/09/02/1331233/Coders-At-Work"&gt;my review&lt;/a&gt; of &lt;a href="http://gigamonkeys.com/"&gt;Peter Seibel&lt;/a&gt;'s &lt;a href="http://www.codersatwork.com/"&gt;Coders at Work&lt;/a&gt;. The book comes out next week. Bottom line: pre-order you copy now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-124623526175833337?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/124623526175833337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=124623526175833337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/124623526175833337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/124623526175833337'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/09/coders-at-work.html' title='Coders at Work'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6648742402077890026</id><published>2009-08-24T17:15:00.009-06:00</published><updated>2009-08-24T19:06:11.509-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainDrivenDesign'/><title type='text'>The right way to use ORM: don't</title><content type='html'>A couple of days ago I came across &lt;a href="http://blogs.tedneward.com/"&gt;Ted Neward&lt;/a&gt;'s essay on the problems with object-relational mapping schemes, &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;The Vietnam of Computer Science&lt;/a&gt;. A really good examination of the problems with ORM, the essay wraps up in a list of six possible approaches to the problem of working with relational databases.&lt;br /&gt;&lt;br /&gt;The database and the object-oriented application querying the database are clearly two different systems with two different domain models (the model of the programming language the application is written in, and SQL, respectively). From the perspective of domain-driven design, they represent two bounded contexts that are typically bridged using the &lt;a href="http://martinfowler.com/eaaCatalog/repository.html"&gt;repository pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Barring the trivial ways out of the problem - using an OO database, hacking around the ORM, or "abandonment" (which seems to be a nonsensical proposition, given that the application language will need to have some kind of model different from SQL), there are three interesting alternatives left from the list: manual ORM, embedded relational DSLs, or building on your language's object model with relational-friendly classes.&lt;br /&gt;&lt;br /&gt;I don't think embedded relational DSLs such as LINQ help solve the object-relational model mismatch in any but the most trivial ways. All they really are are macros providing syntactic sugar for database access; all the domain mismatch problems are still left unsolved.&lt;br /&gt;&lt;br /&gt;The manual ORM and object model extension methods have proven fruitful in my experience.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.matchcraft.com/index.html"&gt;Matchcraft&lt;/a&gt;'s &lt;a href="http://www.matchcraft.com/products-and-services/profiles-directory/index.html"&gt;web directory product&lt;/a&gt; was already using &lt;a href="http://sql2java.sourceforge.net/"&gt;sql2java&lt;/a&gt; to generate abstract Java classes (which were then subclassed and given domain logic) from a SQL schema hand-constructed from the domain model when I came on board the project. This approach worked well - the database schema and the object model were clean and sql2java's code generation provided efficient cruft-free boilerplate. There was no ORM layer to drain attention and fatten the software stack. &lt;br /&gt;&lt;br /&gt;The only problem was that some behaviors were implemented with hand-written SQL queries right inside the derived class. This mix of domains was reflected in the culprit behaviors being problematic to modify and unit-test. By refactoring the system to use the repository pattern, I was able to make those problems go away, while still preserving all the benefits of the "sql2java and some handwritten queries" approach that yielded both a clean database and a clean object model.&lt;br /&gt;&lt;br /&gt;On another project (this one to build a flight reservation system for small tour and air charter operators, written in Common Lisp), I went the other way with code generation. I wrote a set of macros that took domain object definitions and generated a SQL schema and CLOS objects describing those domain objects. The object instances were just lists of fields as returned by &lt;a href="http://clsql.b9.com/"&gt;CLSQL&lt;/a&gt; (with type conversions done automatically based on information in the "meta objects"). The behaviors were based on a mix of multimethods specialized on the "meta objects" as well as ones executing hand-written SQL queries directly.&lt;br /&gt;&lt;br /&gt;The above approach combined both aspects of the manual ORM and object model extension methods. While CLOS does come with an extensible meta-object protocol (and CLSQL already comes with a CLOS ORM based on the MOP), I wanted to prioritize a clean database schema above ease of integration with Lisp (as should any project where a SQL database is planned to be queried by more than one system). While Common Lisp's macros and multimethods made this approach extremely fast and easy, there is no reason it can't be used with other languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6648742402077890026?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6648742402077890026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6648742402077890026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6648742402077890026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6648742402077890026'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/08/right-way-to-use-orm-dont.html' title='The right way to use ORM: don&apos;t'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-8046883899466514795</id><published>2009-08-17T17:32:00.002-06:00</published><updated>2009-08-17T17:35:19.635-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>New homepage for uri-template</title><content type='html'>&lt;a href="http://common-lisp.net/project/uri-template/"&gt;uri-template&lt;/a&gt; now has its own &lt;a href="http://common-lisp.net/"&gt;common-lisp.net&lt;/a&gt; project page and mailing list:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://common-lisp.net/project/uri-template/"&gt;http://common-lisp.net/project/uri-template/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The current version of the library is 0.6, released on 2009-08-17.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-8046883899466514795?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/8046883899466514795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=8046883899466514795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8046883899466514795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8046883899466514795'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/08/new-homepage-for-uri-template.html' title='New homepage for uri-template'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-78808026819475966</id><published>2009-08-12T15:27:00.003-06:00</published><updated>2009-08-12T16:36:54.209-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>History of the American computer revolution</title><content type='html'>I recently came across &lt;a href="http://steveblank.com/"&gt;Steve Bank&lt;/a&gt;'s &lt;a href="http://steveblank.com/category/secret-history-of-silicon-valley/"&gt;&lt;i&gt;Secret History of Silicon Valley&lt;/i&gt;&lt;/a&gt; series of blog posts. The essays do a wonderful job of dispelling the myth of Silicon Valley as "a bunch of orchards and then Hewlett &amp; Packard came along." As with the major east-coast universities and research institutes that were instrumental in creating the computer revolution, it was the US military that turned out to have provided the resources for the start of Silicon Valley as we know it today (although in the form of the Air Force and not DARPA).&lt;br /&gt;&lt;br /&gt;The east-coast/DARPA contribution to the computing revolution is described in similar investigative detail in &lt;a href="http://www.wired.com/wired/archive/9.10/streetcred.html?pg=2"&gt;M. Mitchell Waldrop's &lt;i&gt;The Dream Machine: J.C.R. Licklider and the Revolution That Made Computing Personal&lt;/i&gt;&lt;/a&gt;. Blank's essays and &lt;i&gt;The Dream Machine&lt;/i&gt; do a very thorough job of detailing the rise of today's computing industry; I consider the latter essential reading and am now happy to add the former to the same category.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rheingold.com/texts/tft/"&gt;Howard Rheingold's &lt;i&gt;Tools for Thought&lt;/i&gt;&lt;/a&gt; is an interesting, light overview of the broader history of modern computing machines from &lt;a href="http://vsedach.googlepages.com/babbage_brief_overview.html"&gt;Charles Babbage&lt;/a&gt; to &lt;a href="http://ted.hyperland.com/"&gt;Ted Nelson&lt;/a&gt; (the first edition was published in 1985, back when hypertext was still hypertext and there was no web).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-78808026819475966?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/78808026819475966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=78808026819475966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/78808026819475966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/78808026819475966'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/08/history-of-american-computer-revolution.html' title='History of the American computer revolution'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-9000426472192725516</id><published>2009-07-29T13:39:00.003-06:00</published><updated>2009-07-29T21:09:36.254-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainDrivenDesign'/><title type='text'>The reusability fallacy and domain-driven design</title><content type='html'>How can you make software reusable? The prevailing design fashion is to anticipate changes in the way that software will be used, then try to provide mechanisms for accommodating these imaginary uses. This approach would work, if you could predict the future.&lt;br /&gt;&lt;br /&gt;The root cause of the drive to build reusable software is that the circumstances under which software is used change, ergo software needs to be changed to accommodate those circumstances. Seen this way, the concept of "building for reusability" is nonsensical. The solution is to go to the source of the problem and make software easier to change. Stop wasting time trying to design for reusability, start investing time in continuous refactoring.&lt;br /&gt;&lt;br /&gt;One way reusability is achieved is through abstraction. All successful software libraries (graphics, algorithms, etc.) set out to solve problems in a particular domain. This is not "designing for reusability," this is designing software to address a particular domain broad enough to be useful for a wide variety of applications. &lt;br /&gt;&lt;br /&gt;Platonic software design would consist of composing these domain libraries together using engineering techniques of abstraction, the outside ones building on the inside ones, like the layers of an onion. Two problems preventing this from being reality are &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;leaky abstractions&lt;/a&gt;, and domain mismatch, making techniques such as &lt;a href="http://www2.parc.com/csl/groups/sda/projects/oi/"&gt;Open Implementation&lt;/a&gt; necessary.&lt;br /&gt;&lt;br /&gt;The only code reusability technique that is somewhat successful is the &lt;a href="http://www.c2.com/cgi/wiki?StrategyPattern"&gt;strategy pattern&lt;/a&gt;, but that is because the strategy pattern is just first-class functions and polymorphic types, which have a simple formal model behind them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-9000426472192725516?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/9000426472192725516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=9000426472192725516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9000426472192725516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/9000426472192725516'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/07/reusability-fallacy-and-domain-driven.html' title='The reusability fallacy and domain-driven design'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-8000222133455565518</id><published>2009-06-28T13:44:00.004-06:00</published><updated>2009-06-29T19:34:45.895-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Live SQL database schema updates</title><content type='html'>I previously wrote about &lt;a href="http://carcaddar.blogspot.com/2009/03/p-cos-blew-my-mind.html"&gt;managing live DB schema changes using protocols and context-oriented programming&lt;/a&gt;. About a month ago, I came across Jonathan Oxer's presentation about &lt;a href="http://www.slideshare.net/jonoxer/selfhealing-databases-managing-schema-updates-in-the-field"&gt;dealing with live schema changes to MySQL databases&lt;/a&gt;. The technique Oxer presents is a kind of obvious-in-hindsight thing that is beautiful in its simplicity: run update scripts and retry if an error (unknown table/column) in the query occurs.&lt;br /&gt;&lt;br /&gt;Readers familiar with &lt;a href="http://exploring-lisp.blogspot.com/"&gt;Geoff Wozniak&lt;/a&gt;'s work will notice the similarity to his &lt;a href="http://exploring-lisp.blogspot.com/2008/01/auto-defining-functions.html"&gt;ideas about working with undefined functions&lt;/a&gt; (which, incidentally, was previously discussed on this blog in the context of &lt;a href="http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html"&gt;using metaprogramming techniques to implement DB abstraction layers&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;This is something I'm definitely going to try in my next SQL database based project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-8000222133455565518?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/8000222133455565518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=8000222133455565518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8000222133455565518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/8000222133455565518'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/06/live-sql-database-schema-updates.html' title='Live SQL database schema updates'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6254473174305494309</id><published>2009-06-08T20:51:00.004-06:00</published><updated>2009-06-08T21:05:04.884-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainDrivenDesign'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Why your language needs macros</title><content type='html'>A couple of days ago someone posted &lt;a href="http://news.ycombinator.com/item?id=644956"&gt;yet another "why do I need macros?" thread on Hacker News&lt;/a&gt;. The usual arguments and unconvincing examples arguing for macros were posted. Noted absence were the arguments against macros (all of which seem to be of the variety "programmers are too dumb to understand someone else's macros" - if you were at the Great Macro Debate at ILC 09 you would have heard it stated more eloquently). &lt;br /&gt;&lt;br /&gt;I've been thinking about macros in terms of domain-driven design lately, kicking around my idea of "domain onions" (I'll write more about this later), so I decided to post &lt;a href="http://news.ycombinator.com/item?id=645338"&gt;my current thoughts about why every programming language that aspires to be general-purpose needs macros&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6254473174305494309?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6254473174305494309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6254473174305494309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6254473174305494309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6254473174305494309'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/06/why-your-language-needs-macros.html' title='Why your language needs macros'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7030052562406339269</id><published>2009-06-08T20:27:00.004-06:00</published><updated>2009-06-08T21:09:18.219-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parallel computing'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><title type='text'>Gelernter</title><content type='html'>Two years ago I posted &lt;a href="http://carcaddar.blogspot.com/2007/06/how-to-write-parallel-programs.html"&gt;a review of Nicholas Carriero and David Gelernter's &lt;i&gt;How to write parallel programs&lt;/i&gt;&lt;/a&gt;. Today I came across an &lt;a href="http://www.edge.org/3rd_culture/gelernter09/gelernter09_index.html"&gt;Edge roundtable discussion with David Gelernter&lt;/a&gt; (via &lt;a href="http://patricklogan.blogspot.com/2009/06/david-gelernter-re-programming-forwith.html"&gt;Patrick Logan&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;The entire discussion is fascinating, and I recommend reading up more on Gelernter's work if you are not familiar with it before watching the interview. &lt;br /&gt;&lt;br /&gt;For me, there were three new insights from the roundtable:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Message passing is the assembly language of distributed systems.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Databases are a way to communicate through time. Networks are a way to communicate through space. Both are symmetrical. The point of Linda was to unify them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The most powerful computers today are botnets. Botnets are also on the leading edge of distributed systems techniques.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In the second video, Gelernter discusses &lt;a href="http://cs-www.cs.yale.edu/homes/freeman/lifestreams.html"&gt;Lifestreams&lt;/a&gt;. It's amazing how closely FriendFeed, Twitter, and the new Facebook are all following the roadmap established by Lifestreams over a decade ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7030052562406339269?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7030052562406339269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7030052562406339269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7030052562406339269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7030052562406339269'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/06/gelernter.html' title='Gelernter'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4588609817857745321</id><published>2009-06-04T14:02:00.002-06:00</published><updated>2009-06-04T14:06:23.002-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><title type='text'>Debugging with H-toot</title><content type='html'>&lt;a href="http://common-lisp.net/pipermail/tbnl-devel/2009-April/004688.html"&gt;Andreas Fuchs shows how to get Hunchentoot 1.0 to go into the debugger on handler errors&lt;/a&gt;, like previous versions of Hunchentoot used to do when *catch-errors-p* was nil.&lt;br /&gt;&lt;br /&gt;This should have come as part of the 1.0 release IMO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4588609817857745321?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4588609817857745321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4588609817857745321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4588609817857745321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4588609817857745321'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/06/debugging-with-h-toot.html' title='Debugging with H-toot'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5032377635666772314</id><published>2009-05-21T16:46:00.003-06:00</published><updated>2009-05-21T16:52:40.969-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metasystems'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>That may be, but my library is your programming language</title><content type='html'>In another instance of &lt;a href="http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html"&gt;look-what&lt;/a&gt;-I-can-&lt;a href="http://carcaddar.blogspot.com/2009/05/on-value-of-metaprogramming.html"&gt;do-with-closures&lt;/a&gt;-and-late-binding, &lt;a href="http://www.bitquabit.com/"&gt;Benjamin Pollack&lt;/a&gt; offers a &lt;a href="http://blog.bitquabit.com/2009/05/20/your-language-features-are-my-libraries/"&gt;criticism of C# and Linq&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5032377635666772314?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5032377635666772314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5032377635666772314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5032377635666772314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5032377635666772314'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/05/that-may-be-but-my-library-is-your.html' title='That may be, but my library is your programming language'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6601506452908583071</id><published>2009-05-04T17:37:00.002-06:00</published><updated>2009-05-04T17:56:33.776-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='metasystems'/><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><title type='text'>On the value of metaprogramming</title><content type='html'>Several weeks ago I wrote about a way to implement &lt;a href="http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html"&gt;Smalltalk-style predicate function-to-SQL translation in Common Lisp&lt;/a&gt;, so I was amused to come across &lt;a href="http://www.aminus.net/dejavu"&gt;Dejavu&lt;/a&gt; for Python (via &lt;a href="http://spyced.blogspot.com/2009/04/best-pycon-talk-you-didnt-see.html"&gt;Jonathan Ellis&lt;/a&gt;), which implements the same technique &lt;i&gt;by inspecting CPython bytecode&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;It's amazing what kind of dumb hoops people will jump through when they don't have a system that permits &lt;a href="http://carcaddar.blogspot.com/2009/03/i-think-i-finally-understand-what-alan.html"&gt;real metaprogramming&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6601506452908583071?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6601506452908583071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6601506452908583071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6601506452908583071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6601506452908583071'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/05/on-value-of-metaprogramming.html' title='On the value of metaprogramming'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4309792551524490329</id><published>2009-04-22T12:35:00.002-06:00</published><updated>2009-04-22T13:21:57.699-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Review: Let Over Lambda</title><content type='html'>So after a lot of not reading &lt;a href="http://www.hcsw.org/"&gt;Doug Hoyte&lt;/a&gt;'s &lt;a href="http://letoverlambda.com/"&gt;&lt;i&gt;Let Over Lambda&lt;/i&gt;&lt;/a&gt;, I finally did manage to read it all the way through.&lt;br /&gt;&lt;br /&gt;My overall impression first: Hoyte styles the book as a successor to PG's &lt;a href="http://www.paulgraham.com/onlisp.html"&gt;&lt;i&gt;On Lisp&lt;/i&gt;&lt;/a&gt;; I think &lt;i&gt;Let Over Lambda&lt;/i&gt; falls short of that goal, although it does contain enough interesting material to make the book worthwhile.&lt;br /&gt;&lt;br /&gt;The best parts of the book are the chapter on read macros and the subsection on sorting networks. Great, practical examples and illustrations of good programming style.&lt;br /&gt;&lt;br /&gt;The worst parts of the book are the chapter on implementing a Forth interpreter in Lisp and the "caddar accessor generator" (it's ok for me to say this because the name of this blog is ironic).&lt;br /&gt;&lt;br /&gt;The chapter on anaphoric macros has finally made me change my mind about those things. It's ok, use them when you need them. All the stuff about "sub-lexical scoping" (ie - various interesting ways of using macros to capture free variables) didn't really make a deep impression on me - maybe I'm just too dull to see any good uses for that.&lt;br /&gt;&lt;br /&gt;As pointed out in other reviews, the book could have used a lot more proofreading (esp of the code) and editing. Hoyte chose to self-publish the book, which I think was a mistake (and just today &lt;a href="http://www.fourhourworkweek.com/blog/2009/04/22/tim-ferriss-and-ramit-sethi/"&gt;Tim Ferriss blogged about some other reasons why it's not a good idea&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;To cap the review, don't read &lt;i&gt;Let Over Lambda&lt;/i&gt; until you've read &lt;i&gt;On Lisp&lt;/i&gt;. It's a fun book about some interesting Common Lisp programming techniques, but it could have been shorter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4309792551524490329?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4309792551524490329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4309792551524490329' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4309792551524490329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4309792551524490329'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/04/review-let-over-lambda.html' title='Review: Let Over Lambda'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7459901341983516757</id><published>2009-04-15T21:23:00.003-06:00</published><updated>2009-04-16T22:24:16.307-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><title type='text'>Problem-solving is hard, let's go write XML configuration files</title><content type='html'>Previously I blogged about why &lt;a href="http://carcaddar.blogspot.com/2009/03/frameworks-and-conjunction-fallacy.html"&gt;the premise behind software frameworks turns out to be a logical fallacy&lt;/a&gt;. This blog post will continue my attack on the framework cult by examining the reasons why people continue to believe in the myth of increased productivity through frameworks.&lt;br /&gt;&lt;br /&gt;There is one word that can summarize my argument: comfort.&lt;br /&gt;&lt;br /&gt;Consider carpentry tools. How do you use them? What do you use them to accomplish? Now consider a toy construction set such as the &lt;a href="http://www.amazon.com/Erector-Build-Play-Construction-Bucket/dp/B0001NKSCQ"&gt;Erector&lt;/a&gt;. The toy construction set offers you a path you can follow to arrive at some cool artifact, even if you don't know exactly what you want to do. The construction set can offer this security because it &lt;i&gt;limits what you can accomplish, and how you can accomplish it&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;According to Buddha, ignorance is the root of all evil. According to Christian tradition, people are inherently evil. It is then no surprise that most of the time most people do not know what they want to do. Finding out "what" is hard, requiring a lot of time and learning. In the realm of software development, this is practiced by methodologies such as &lt;a href="http://domaindrivendesign.org/"&gt;domain-driven design&lt;/a&gt;. It is a lot easier to write XML configuration files instead.&lt;br /&gt;&lt;br /&gt;There is a misguided comfort that comes from knowing that you did a day's worth of honest work. It doesn't matter if what you are doing is leading you down the wrong path, because with a framework you are at least accomplishing something, even if that something will not bring business value. As a project manager who decides to use a particular framework, you are in effect acting as a proxy sales agent for the party promoting that framework - selling your customer a solution that may not be in line with your customer's goals.&lt;br /&gt;&lt;br /&gt;Many logical fallacies go into the typical software development decision-making process. Frameworks in particular are notoriously prone to the &lt;a href="http://en.wikipedia.org/wiki/Bandwagon_effect"&gt;bandwagon effect&lt;/a&gt; (how many "enterprise" web-development frameworks for Java have come and gone and with what ridiculous frequency?). Any person held responsible for the consequences of a decision will be prone to &lt;a href="http://en.wikipedia.org/wiki/Post-purchase_rationalization"&gt;post-purchase rationalization&lt;/a&gt; (remember that before a person tries to sell a methodology to his organization, he has to have been sold on it her/himself), so the bandwagon effect is frequently used &lt;i&gt;as an argument&lt;/i&gt; for adopting a particular framework. In addition, nebulous terms such as "enterprise" (which, because of its strong association with frameworks, has almost universally acquired the definition as "verbose junk" in the software development world) somehow end up in place of well thought-out arguments and empirical evidence.&lt;br /&gt;&lt;br /&gt;Obviously, there is some circumstantial evidence that frameworks do enhance productivity - people become experts at particular frameworks and can efficiently develop applications. This is not because they are using a particular framework, or because they are using a framework at all. This is because they have become experts at it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7459901341983516757?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7459901341983516757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7459901341983516757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7459901341983516757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7459901341983516757'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/04/problem-solving-is-hard-lets-go-write.html' title='Problem-solving is hard, let&apos;s go write XML configuration files'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4119792581629683397</id><published>2009-04-09T18:52:00.007-06:00</published><updated>2009-04-09T20:35:27.834-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='metasystems'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Closure-oriented metaprogramming via dynamically-scoped functions</title><content type='html'>Today I came across &lt;a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg02096.html"&gt;this post&lt;/a&gt; from the &lt;a href="http://ll1.ai.mit.edu/"&gt;ll1&lt;/a&gt; mailing list (almost 7 years old now, via &lt;a href="http://collison.ie/blog/2007/10/ll1"&gt;Patrick Collison's blog&lt;/a&gt;) from Avi Bryant explaining how Smalltalk's message-based dispatch permits a type of metaprogramming with closures, as an alternative to macros.&lt;br /&gt;&lt;br /&gt;Of course if you've read &lt;a href="http://p-cos.net/documents/dynfun.pdf"&gt;Pascal Costanza's &lt;i&gt;Dynamically Scoped Functions as the Essence of AOP&lt;/i&gt;&lt;/a&gt; (and if you haven't, click the link and do it now; it's one of my favorite CS papers), you will realize that there is no need for message-based dispatch or any kind of object-oriented programming to do that. All we need are dynamically-scoped functions.&lt;br /&gt;&lt;br /&gt;Here is how I approached the problem:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(defpackage "BAR"&lt;br /&gt;  (:use "COMMON-LISP")&lt;br /&gt;  (:shadow #:=))&lt;br /&gt;&lt;br /&gt;(in-package "BAR")&lt;br /&gt;&lt;br /&gt;(defmacro dflet1 ((fname &amp;rest def) &amp;body body)&lt;br /&gt;  (let ((old-f-def (gensym)))&lt;br /&gt;    `(let ((,old-f-def (symbol-function ',fname)))&lt;br /&gt;       (unwind-protect (progn (setf (symbol-function ',fname) (lambda ,@def))&lt;br /&gt;                              ,@body)&lt;br /&gt;         (setf (symbol-function ',fname) ,old-f-def)))))&lt;br /&gt;&lt;br /&gt;(defmacro dflet* ((&amp;rest decls) &amp;body body)&lt;br /&gt;  (if decls&lt;br /&gt;      `(dflet1 ,(car decls)&lt;br /&gt;         (dflet* ,(cdr decls)&lt;br /&gt;           ,@body))&lt;br /&gt;      `(progn ,@body)))&lt;br /&gt;&lt;br /&gt;(defun first-name (x) (gnarly-accessor1 x))&lt;br /&gt;(defun address-city (x) (gnarly-accessor2 x))&lt;br /&gt;(defun = (&amp;rest args) (apply 'common-lisp:= args))&lt;br /&gt;(defmacro &amp; (a b) `(block-and (lambda () ,a) (lambda () ,b)))&lt;br /&gt;(defun block-and (a b) (when (funcall a) (funcall b)))&lt;br /&gt;&lt;br /&gt;(defun some-predicate (x)&lt;br /&gt;  (&amp; (= (first-name x) "John") (= (address-city x) "Austin")))&lt;br /&gt;&lt;br /&gt;(defun make-parse-tree-from-predicate (predicate-thunk)&lt;br /&gt;  (dflet* ((first-name (x) '#:|firstName|)&lt;br /&gt;           (address-city (x) '#:|addressCity|)&lt;br /&gt;           (= (a b) `(= ,a ,b))&lt;br /&gt;           (block-and (a b) `(&amp; ,(funcall a) ,(funcall b))))&lt;br /&gt;    (funcall predicate-thunk nil)))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then &lt;code&gt;(make-parse-tree-from-predicate #'some-predicate)&lt;/code&gt; yields &lt;code&gt;(&amp; (= #:|firstName| "John") (= #:|addressCity| "Austin"))&lt;/code&gt;, which we can manipulate and then pass to a SQL query printer.&lt;br /&gt;&lt;br /&gt;Here I implemented dynamically-scoped functions using &lt;code&gt;unwind-protect&lt;/code&gt;, which is not as powerful (or, possibly, efficient) as the implementation presented in Costanza's paper, but is simpler (I also used the same trick to implement dynamically-scoped variables in &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The property of the same Lisp code to mean different things in different contexts is called &lt;i&gt;duality of syntax&lt;/i&gt; by &lt;a href="http://www.hcsw.org/"&gt;Doug Hoyte&lt;/a&gt; in his excellent book &lt;a href="http://letoverlambda.com/"&gt;&lt;i&gt;Let Over Lambda&lt;/i&gt;&lt;/a&gt; (almost finished reading, promise to write a review soon). Lisp offers this property both at run-time (via &lt;a href="http://carcaddar.blogspot.com/2009/03/i-think-i-finally-understand-what-alan.html"&gt;late-binding&lt;/a&gt; and closures) and at macro-expansion time (via homoiconicity and the macro-expansion process itself).&lt;br /&gt;&lt;br /&gt;Another technique from &lt;i&gt;Let Over Lambda&lt;/i&gt; illustrated in the above code is the recursive macro. This one is a personal favorite of mine; I find that the iterative simplification that recursive macros express provides very clean and maintainable code.&lt;br /&gt;&lt;br /&gt;This code also provides examples of the two problems that the closure-oriented metaprogramming approach encounters in Common Lisp:&lt;br /&gt;&lt;br /&gt;The first is the fact that we had to shadow &lt;code&gt;=&lt;/code&gt; in our package. Common Lisp forbids the redefinition of the functions, macros and special forms defined in the standard, so we have to go out of our way if we want to achieve that effect. Barry Margolin &lt;a href="http://groups.google.com/group/comp.lang.lisp/msg/31cedb36e61d053d?hl=en"&gt;provided a rationale for this&lt;/a&gt; in comp.lang.lisp post.&lt;br /&gt;&lt;br /&gt;The second is the fact that Common Lisp has so many special forms and macros - &lt;code&gt;and&lt;/code&gt; just happens to be one of them. Smalltalk avoids this problem by doing virtually everything via message passing and closures. In Common Lisp we don't have this straightjacket, but we also don't have this luxury of assuming that everything is an object or a closure.&lt;br /&gt;&lt;br /&gt;Another Common Lisp feature that might break this example is function inlining (then again, I did just write about the benefits of late-binding...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4119792581629683397?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4119792581629683397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4119792581629683397' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4119792581629683397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4119792581629683397'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html' title='Closure-oriented metaprogramming via dynamically-scoped functions'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-1464026804307873848</id><published>2009-04-08T17:42:00.004-06:00</published><updated>2009-04-09T00:30:54.902-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Masterminds of Programming</title><content type='html'>Today my copy of &lt;a href="http://oreilly.com/catalog/9780596515171/"&gt;Masterminds of Programming&lt;/a&gt; arrived in the mail from O'Reilly; a small reward for &lt;a href="http://carcaddar.blogspot.com/2009/03/p-cos-blew-my-mind.html"&gt;giving a lightning talk at ILC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The book is a series of interviews with programming language designers. Along with some expected atrocities like Stroustrup on C++ and Gosling on Java, and bizarre ones such as a 50-page interview with Jacobson, Rumbaugh and Booch on UML, there are interviews with Adin Falkoff on APL, Moore on Forth, Wall on Perl, and a few others. The functional camp is well-represented with SPJ, Hudak, Wadler, and Hughes interviewed about Haskell, and Milner giving an interview about ML.&lt;br /&gt;&lt;br /&gt;It is telling that right at the preface the book starts off with an &lt;a href="http://www.ericdigests.org/1992-1/myths.htm"&gt;urban legend&lt;/a&gt;: "children can learn foreign languages much more easily than adults."&lt;br /&gt;&lt;br /&gt;Some of the interviews are very revealing. The discussions present an entertaining window on the cavalier attitudes and biases of many programming language designers, which helps explain some of the dysfunction of the software world today. I don't think this is what the editors intended, but it makes for hilarious reading material.&lt;br /&gt;&lt;br /&gt;Some of the interviews can be frustrating to read (every third question in Falkoff's APL interview seems to boil down to "lolz funny syntax"); thankfully this is balanced out by absolutely delightful ones such as Moore on Forth (IMO, the highlight of the book), and the Objective-C interview with Brad Cox and Tom Love. Overall the quality of the interviews varies widely, but not surprisingly mostly seems to correspond to the quality of the language being discussed.&lt;br /&gt;&lt;br /&gt;Ultimately Masterminds of Programming is worthwhile not for its insights into programming language design (most of which unsurprisingly boil down to "oops I made a bunch of mistakes because I didn't start with a good model/think/know any better/know enough math"), but into programming and computing history in general.&lt;br /&gt;&lt;br /&gt;To finish this review where it started off, here is another unintentionally amusing bit of insight from the preface:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Imagine that you are studying a foreign language and you don't know the name of an object. You can describe it with the words that you know, hoping someone will understand what you mean. Isn't this what we do every day with software?&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;It comes as no surprise that there is not a single entry for either "macro" or "metaprogramming" in the book's index (although Wadler does make a passing mention of Lisp macros in the Haskell interview).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-1464026804307873848?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/1464026804307873848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=1464026804307873848' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1464026804307873848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/1464026804307873848'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/04/masterminds-of-programming.html' title='Masterminds of Programming'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-5190617354469114324</id><published>2009-03-26T20:12:00.002-06:00</published><updated>2009-03-26T20:24:51.754-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ilc09'/><category scheme='http://www.blogger.com/atom/ns#' term='MobSoftware'/><category scheme='http://www.blogger.com/atom/ns#' term='biomimetics'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>P-Cos Blew My Mind</title><content type='html'>This post contains my impressions about the rest of ILC 2009. I'll start off with something that really impressed me.&lt;br /&gt;&lt;br /&gt;One of the things I have been thinking about lately is database schema evolution. The flip side of database schema changes are the corresponding changes in the client code they entail. Combining the two with live system upgrades can potentially give rise to inconsistencies. Even ignoring databases, loading code into a multithreaded Lisp image can result in undesired behaviour since the loading is non-atomic.&lt;br /&gt;&lt;br /&gt;This problem was &lt;a href="http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/3b2fca8fa6db209f/9e87daa364c8545e"&gt;discussed on comp.lang.lisp several years ago&lt;/a&gt;, with the general consensus being that some sort of atomic loading mechanism was needed to address the problem.&lt;br /&gt;&lt;br /&gt;However atomic loading alone does not eliminate inconsistencies for systems providing services via asynchronous protocols, such as web applications. Any users in the middle of a workflow consisting of a chain of requests to HTTP resources will be affected if any of those HTTP resources are changed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://p-cos.net/"&gt;Pascal Costanza&lt;/a&gt; came to the rescue by presenting (during a lightning talk) a solution utilizing &lt;a href="http://www.swa.hpi.uni-potsdam.de/cop/"&gt;context-oriented programming&lt;/a&gt;. Each set of updates was integrated into the system as a new layer. Atomicity is provided by the fact that layers can be (are?) activated atomically, and can be made completely independent of each other. By associating layers with web application sessions, Pascal was able to preserve consistency for those users in the middle of a session during the time of update.&lt;br /&gt;&lt;br /&gt;In a fascinating discussion on protocol versioning on &lt;a href="http://ocaml.janestreet.com/"&gt;Jane Street's OCaml blog&lt;/a&gt; a while back &lt;a href="http://ocaml.janestreet.com/?q=node/41#comment-122"&gt;someone advocated essentially the same approach&lt;/a&gt; to the problem by utilizing two servers running different versions of the application. Pascal's context-oriented approach not only eliminates the need for the extra hardware (one server for each version of the protocol), but also provides an elegant way to structure the code for multi-version protocols, and to apply other, orthogonal updates that would affect users of all protocols provided by the system, which would otherwise require backporting patches.&lt;br /&gt;&lt;br /&gt;If database access is implemented as an abstraction layer that acts as a protocol, the same technique can be applied to schema changes as well.&lt;br /&gt;&lt;br /&gt;From the above discussion it is easy to overlook a really neat fact, but &lt;a href="http://www.nicklevine.org/"&gt;Nick Levine&lt;/a&gt;'s lightning talk came to the rescue: &lt;code&gt;load&lt;/code&gt; and fasls make a really great patch distribution mechanism. You can view the code from his talk &lt;a href="http://enlivend.livejournal.com/8308.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.brown.edu/~sk/"&gt;Shriram Krishnamurthi&lt;/a&gt; gave a very nice talk about hooking kids on Scheme by letting disadvantaged inner-city middle-schoolers put lambdas in their lambdas so they can make videogames in their cellphones. Purely functional programming a-la &lt;a href="http://www.htdp.org/"&gt;&lt;i&gt;How to Design Programs&lt;/i&gt;&lt;/a&gt; turns out to be a really great way to teach algebra. Shriram also dislikes the OLPC project and thinks Etoys is weak.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.csail.mit.edu/mac/users/gjs/"&gt;Gerald Sussman&lt;/a&gt; gave a talk that essentially argued against formal methods for systems design, and for extensible systems with flexible failure modes.&lt;br /&gt;&lt;br /&gt;One of the key reasons why MIT shifted its introductory CS curriculum away from the SICP-style bottom-up abstractions building approach is that the behaviour of modern systems components is too complicated for it to be practical for them to either be well-specified, or modelled in a reductionist way. A lot of the time engineers have to resort to an empirical approach to discovering the actual semantics of a sub-component.&lt;br /&gt;&lt;br /&gt;To manage this complexity, Sussman argued for open systems that permit a great degree of extensibility and continue to function under various failure modes. An example he used was an autopilot system: it should continue to work under unexpected conditions such as control surface failures. This echoes some of the ideas of &lt;a href="http://www.dreamsongs.com/"&gt;Richard Gabriel&lt;/a&gt; about &lt;a href="http://www.dreamsongs.org/MobSoftware.html"&gt;mob software&lt;/a&gt;. Although Gabriel was at the conference, the term itself never came up, but Richard did object to macros at the macros debate by mentioning that they would be a hindrance to constructing systems worked on by thousands of programmers.&lt;br /&gt;&lt;br /&gt;Fail-fast behaviour of a whole system under unexpected circumstances is something that formal specifications cannot avoid. A great quote from Sussman was: "proofs considered harmful." What Sussman was arguing for, in his words, was high-quality abstract specifications, not low-quality well-specified ones.&lt;br /&gt;&lt;br /&gt;Sussman presented several ideas about taking inspiration from biological systems, among them &lt;a href="http://guava.physics.uiuc.edu/~nigel/courses/598BIO/498BIOonline-essays/hw4/files/HW4-QJ-Wang.pdf"&gt;biological degeneracy&lt;/a&gt;, which can best be summed up as "doing different things to get the same result," and the fact that a relatively small number of genes are responsible for common physiological structures in organisms.&lt;br /&gt;&lt;br /&gt;The bio-mimetic argument was echoed again in a lightning talk by someone whose name I unfortunately cannot recall or look up (as the full list of lightning talks has not yet been posted anywhere). One of the things mentioned was parallelism in multi-cellular systems - of course I had to jump in and point out that the best lesson we can take away from parallelism in the real world is a rejection of the concept of global state (more on that in an upcoming post).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ccs.neu.edu/home/shivers/"&gt;Olin Shivers&lt;/a&gt; gave essentially the same talk about his system for expressing scoping and iteration in terms of graphs as he did at &lt;a href="http://www.cs.indiana.edu/dfried_celebration.html"&gt;Danfest&lt;/a&gt;, and this time wasn't any more exciting. Someone actually fell asleep and started snoring loudly a few rows down from me. The discussion at the end was quite good though, one of the things Shivers emphasized that echoed Sussman's keynote was the fact that unspecified behaviour actually gave you more opportunity for expressive power.&lt;br /&gt;&lt;br /&gt;I gave a lightning talk based on a &lt;a href="http://carcaddar.blogspot.com/2009/03/i-think-i-finally-understand-what-alan.html"&gt;blog post I made previously&lt;/a&gt;, arguing that the criteria for whether language X is a Lisp should be how well you can write a metacircular evaluator for that language. No one booed or threw things at me, and some very smart people made insightful comments, so I think it went ok. The question of static typing came up, and after the talk I had a big argument with a couple of people trying to explain what type systems are and what they do. Typed calculi need to be taught as part of an undergrad CS cirriculum - most people have a very skewed understanding of what type systems are and this lets language "designers" get away with doing a lot of stupid shit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-5190617354469114324?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/5190617354469114324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=5190617354469114324' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5190617354469114324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/5190617354469114324'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/p-cos-blew-my-mind.html' title='P-Cos Blew My Mind'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-3445174193607923643</id><published>2009-03-24T08:50:00.004-06:00</published><updated>2009-03-24T09:11:50.827-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ilc09'/><title type='text'>ILC 09 Pt. 0</title><content type='html'>Flew into Boston on Monday, arrived at the Stata Center just after the conference lunch. Highlights so far: &lt;br /&gt;&lt;br /&gt;Michael Greenberg's lightning talk about &lt;a href="http://world.std.com/~awalker/cnmlist.html"&gt;TRAC&lt;/a&gt;, both for being probably the most well-prepared 5 minute talk ever, and for explaining the key essence (self-modifying code) of pure macro languages. Later during the macros debate Greenberg made the very insightful point that conceptually the Lisp language and Lisp macros are two distinct systems and need to be reasoned about as such.&lt;br /&gt;&lt;br /&gt;Joe Marshall's daughter's insight about the subject of his talk: "[continuations are] just autosave for your program!"&lt;br /&gt;&lt;br /&gt;Pascal Costanza's superhuman knowledge of Lisp history, wit, and strong opinions.&lt;br /&gt;&lt;br /&gt;Some things that have been done to death and should be irrelevant but still managed to be somewhat entertaining: the "future of Lisp" panel and the "are macros bad" debate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-3445174193607923643?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/3445174193607923643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=3445174193607923643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3445174193607923643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3445174193607923643'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/ilc-09-pt-0.html' title='ILC 09 Pt. 0'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4701095452427296802</id><published>2009-03-15T04:08:00.005-06:00</published><updated>2009-03-19T01:31:21.420-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ParenScript'/><title type='text'>Parenscript birthday present</title><content type='html'>A while ago I mentioned I &lt;a href="http://carcaddar.blogspot.com/2009/01/new-parenscript-release.html"&gt;was going to announce some exciting news about web development tools&lt;/a&gt;. Shortly thereafter my priorities changed, and I shelved the project with the intention of picking it up again in the future. Then I remembered about &lt;a href="http://www.lispnyc.org/soc2009.clp"&gt;LispNYC&lt;/a&gt;'s participation in the &lt;a href="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/a&gt; program - if I can't do the project now, why not try to get funding from Google to have a student work on it?&lt;br /&gt;&lt;br /&gt;Here is what all this is about:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The PSDE project aims to develop an Emacs-based JavaScript programming and debugging tool for AJAX-based RIAs. The implementation will provide an unobtrusive client-side script that can be loaded alongside any JavaScript web application, and an Emacs interface (REPL) that will enable debugging of remote and mobile clients, including the possibility of no-reload drop-in for live user sessions.&lt;br /&gt;&lt;br /&gt;Along with an interactive prompt/REPL, PSDE will provide a profiler, tracing and logging facilities, a DOM inspector, a completion and documentation system for DOM symbols, and other useful web programming tools, both by using the reflective capabilities of JavaScript, and by providing hooks (a la Open Implementation) into the Parenscript compiler to provide metaprogram information that cannot be gleamed using runtime techniques or analysis of JavaScript code.&lt;br /&gt;&lt;br /&gt;In addition to providing a valuable tool to the web development community, the OI extensions to the Parenscript compiler included as part of the PSDE project will be useful in their own right to those wishing to create other web development tools based on Parenscript, or web developers using Parenscript and needing advanced JavaScript generation capabilities. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The project has its roots in the "browser &lt;a href="http://en.wikipedia.org/wiki/Comet_(programming)"&gt;Comet&lt;/a&gt; REPL" demo I gave during my &lt;a href="http://carcaddar.blogspot.com/2007/09/lisping-in-nyc.html"&gt;talk about Parenscript at LispNYC in September 2007&lt;/a&gt;, but the idea of making a "browser &lt;a href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt;" didn't occur to me until this past November, when Daniel Gackle told me: "Why don't you make a browser SLIME?"&lt;br /&gt;&lt;br /&gt;If you are a student that might be interested in this project and qualify to participate in &lt;a href="http://code.google.com/soc/"&gt;Google SoC&lt;/a&gt;, or know of such an individual, get in touch: &lt;a href="&amp;#x6D;a&amp;#105;&amp;#108;&amp;#116;&amp;#x6F;:&amp;#118;&amp;#x73;&amp;#x65;&amp;#x64;a&amp;#99;&amp;#x68;&amp;#64;g&amp;#x6D;&amp;#x61;&amp;#105;&amp;#108;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"&gt;&amp;#118;&amp;#x73;&amp;#x65;&amp;#x64;a&amp;#99;&amp;#x68;&amp;#64;g&amp;#x6D;&amp;#x61;&amp;#105;&amp;#108;&amp;#46;&amp;#99;&amp;#111;&amp;#109;&lt;/a&gt;. I'll be happy to answer any questions and help you with preparing an application. Google will start accepting student applications March 23rd, with the cut-off date being April 3rd.&lt;br /&gt;&lt;br /&gt;UPDATE: &lt;a href="http://www.lispnyc.org/soc.clp"&gt;LispNYC has not been selected as a mentoring organization for SOC 2009&lt;/a&gt;. I would like to fund this project myself, but currently cannot afford it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4701095452427296802?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4701095452427296802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4701095452427296802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4701095452427296802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4701095452427296802'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/parenscript-birthday-present.html' title='Parenscript birthday present'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-31663908859418450</id><published>2009-03-14T16:30:00.000-06:00</published><updated>2009-03-14T16:30:44.052-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ParenScript'/><title type='text'>Parenscript's 4th birthday</title><content type='html'>Today is a day of many celebrations. As most of you are aware March 14 is &lt;a href="http://www.sciam.com/blog/60-second-science/post.cfm?id=happy-314-also-known-as-pi-day-2009-03-14"&gt;π Day&lt;/a&gt;. It also happens to be &lt;a href="http://talklikeaphysicist.com/"&gt;Einstein's birthday&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Four years ago, &lt;a href="http://blogs.bl0rg.net/netzstaub/2005/03/14/parenscript/"&gt;Manuel Odendahl announced the release of Parenscript to the public&lt;/a&gt;. Reflecting on the original post in the context of what &lt;a href="http://common-lisp.net/project/parenscript/"&gt;Parenscript&lt;/a&gt; is today, the power and appropriateness of Manuel's design have more than proven themselves, but also I see the amount of exciting work that is still ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-31663908859418450?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/31663908859418450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=31663908859418450' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/31663908859418450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/31663908859418450'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/parenscripts-4th-birthday.html' title='Parenscript&apos;s 4th birthday'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-6655354560995629828</id><published>2009-03-13T18:15:00.006-06:00</published><updated>2009-03-14T01:38:09.444-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functionalprogramming'/><title type='text'>I think I finally understand what Alan Kay is saying about Lisp</title><content type='html'>Joe Marshall recently wrote a series of very entertaining blog posts telling the story of his first experiences with Lisp:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://funcall.blogspot.com/2009/03/i-hate-lisp.html"&gt;I hate Lisp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://funcall.blogspot.com/2009/03/computers-ugh.html"&gt;Computers? Ugh.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://funcall.blogspot.com/2009/03/not-lisp-again.html"&gt;Not Lisp again....&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://funcall.blogspot.com/2009/03/writing-blog-entries-is-hard.html"&gt;Writing blog entries is hard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://funcall.blogspot.com/2009/03/few-speed-bumps.html"&gt;A few speed bumps&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I had a similar experience with Lisp - I didn't go to MIT or take 6.001, but reading the first couple of chapters of &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP&lt;/a&gt; changed my entire outlook on computer programming. By the time that happened (the summer of 2002, right before I started university), I was already somewhat proficient with C, although I wasn't particularly interested in computer programming as an activity in and of itself.&lt;br /&gt;&lt;br /&gt;The funny thing is I was exposed to Scheme my first year of high school through &lt;a href="http://cs.stuy.edu/mcs1/"&gt;Mike Zamansky's MCS1&lt;/a&gt; at Stuy. That experience wasn't particularly memorable, even less so was one of the other programming languages used in the course (Python, I think?). On the other hand the course also taught a whole bunch of really neat stuff in &lt;a href="http://education.mit.edu/starlogo/"&gt;StarLogo&lt;/a&gt;, which as they say in Canada was the cat's ass.&lt;br /&gt;&lt;br /&gt;An even more amusing fact is that after going to see the professor before the start of the first term and taking the challenge exam that would give me credit for the first computer science course, I decided that since the university computer science courses didn't look anything like SICP, I would probably be better off investing my time in a math degree. The algebra and calculus examples in SICP were my first exposure to elegant computational mathematics,  and a key reason for choosing math and not something else.&lt;br /&gt;&lt;br /&gt;What does this have to do with Alan Kay? &lt;br /&gt;&lt;br /&gt;Yesterday before falling asleep I was plagued by the question: why don't I enjoy using Haskell as much as Lisp? Haskell is purely functional, it features a really neat and unobtrusive type system, which when taken together with the great pattern-directed invocation programming style provides a better alternative to object-oriented programming. It's a really great programming language. &lt;br /&gt;&lt;br /&gt;Could the reason be the ugly syntax? No, &lt;a href="http://carcaddar.blogspot.com/2007/02/haskell-gets-normal-syntax.html"&gt;that's easy to fix&lt;/a&gt;. The type system doesn't bother me. There's a template system for both Haskell and Liskell syntax that provides preprocessor-style macros, but monads actually provide a much more powerful way of building control abstractions than macros do.&lt;br /&gt;&lt;br /&gt;The only thing I could think of that Lisp has that Haskell can't provide is a dynamic runtime system. It's as if Lisp comes with a really neat invisible virtual machine.&lt;br /&gt;&lt;br /&gt;Among the &lt;a href="http://bc.tech.coop/blog/060224.html"&gt;many nice things Alan Kay says about Lisp&lt;/a&gt;, the term &lt;i&gt;late binding&lt;/i&gt; comes up often. Practitioners of programming languages that Alan Kay did not have in mind when he invented the term "object-oriented" have taken it upon themselves to equate this to the concept they term &lt;i&gt;dynamic binding&lt;/i&gt;, which they define to be type-directed dispatch done at runtime. &lt;br /&gt;&lt;br /&gt;This is a textbook example of &lt;a href="http://www.jargon.net/jargonfile/c/cargocultprogramming.html"&gt;cargo cult programming&lt;/a&gt;. Dynamic types and runtime dispatch are not axioms of Lisp and Smalltalk, they are the emergent properties of self-describing computational systems. The key is that the definition of Lisp is written in Lisp. The "invisible virtual machine" in Lisp is Lisp. That is what Alan Kay means by &lt;i&gt;late binding&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Well, this insight did take almost seven years, but at least now I have a snappy label for the dynamic languages du jour whose existence helps put a lot of computer book publishers' editors' kids through college and kills hundreds of thousands of trees every year: &lt;i&gt;cargo cult programming languages&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The question that remains unanswered is why isn't Haskell self-describing? The reason is that there are actually &lt;i&gt;two&lt;/i&gt; computational systems behind Haskell: one for the language itself, and one &lt;a href="http://folli.loria.fr/cds/1999/library/pdf/curry-howard.pdf"&gt;underlying the type system for the language&lt;/a&gt;. If type systems could be expressed in a metacircular way by the systems they were trying to type, they wouldn't be able to express anything about types (restrictions on computational power) of that system.&lt;br /&gt;&lt;br /&gt;You can read more about the metacircular definition of Lisp in several books. The first of these is the original &lt;a href="http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf"&gt;Lisp 1.5 Programmer's Manual&lt;/a&gt;; Alan Kay has called the metacircular definition of Lisp provided there "Maxwell's Equations of Software." &lt;a href="http://mitpress.mit.edu/sicp/"&gt;SICP&lt;/a&gt; includes a section on constructing a metacircular evaluator, and a whole chapter based around extending that evaluator with non-determinism and logic programming. The most thorough examination of the metacircular evaluation formulation of Lisp is present in John Allen's highly recommended 1978 book, &lt;a href="http://www.amazon.com/Anatomy-Lisp-McGraw-Hill-computer-science/dp/007001115X"&gt;&lt;i&gt;Anatomy of Lisp&lt;/i&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-6655354560995629828?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/6655354560995629828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=6655354560995629828' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6655354560995629828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/6655354560995629828'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/i-think-i-finally-understand-what-alan.html' title='I think I finally understand what Alan Kay is saying about Lisp'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-4207425257323246959</id><published>2009-03-12T19:42:00.003-06:00</published><updated>2009-03-12T21:21:22.490-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software systems'/><title type='text'>Frameworks and the conjunction fallacy</title><content type='html'>Frameworks are great. After all, some helpful way to do X combined in some helpful way with some helpful way to do Y must be a whole lot more helpful than just a way to do X and just a way to do Y, right?&lt;br /&gt;&lt;br /&gt;Wait a minute, anyone who has used a framework might say, what if someone wants to do Z instead of Y? Why, of course, say the framework "architects," we'll just provide a helpful way to help you choose helpful ways.&lt;br /&gt;&lt;br /&gt;How helpful! Now not only do you have to know how to do X and how to do Y and how the framework helps you do X in a helpful way with doing Y, but you also need to know the helpful mechanisms behind letting you choose the helpful ways.&lt;br /&gt;&lt;br /&gt;Clearly the original argument for helpfulness broke down somewhere. But where, and why?&lt;br /&gt;&lt;br /&gt;The underlying fallacy behind the majority of software design today is the belief that computer systems can be "useful" and "helpful." Useful and helpful for doing what? For doing what they were designed to do. Stated in these terms it is immediately apparent that this mindset is a tautology. &lt;i&gt;Completely useless&lt;/i&gt; as a basis for reasoning.&lt;br /&gt;&lt;br /&gt;Is there a better way of thinking about software? Let's start by asking why. The entire motivation underlying our enterprise is the desire to accomplish X and Y. Each step we take can either bring us closer to that goal, or not. Given that time and other resources are finite, each step that does not bring us closer to the goal is "unhelpful" - it gets in the way of what we want to do. &lt;br /&gt;&lt;br /&gt;I believe the right way to think about computer systems is as things &lt;i&gt;that get in the way of what you want to accomplish&lt;/i&gt;. This way the goal of software design becomes &lt;a href="http://carcaddar.blogspot.com/2007/10/language-features-dont-matter.html"&gt;not getting in the way of what you want to do&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Given this approach it immediately becomes obvious that the argument presented at the start of this post is simply a &lt;a href="http://en.wikipedia.org/wiki/Conjunction_fallacy"&gt;conjunction fallacy&lt;/a&gt;. Likewise many other "reasonable assumptions" about software that are not borne out by experience can be shown to be flawed a priori. Most importantly, this mindset helps prevent such "reasonable assumptions" from being taken up in the first place.&lt;br /&gt;&lt;br /&gt;While this post debunked one of the arguments used to both justify the development of frameworks and their use, the decisions surrounding the latter are also driven by other logical fallacies, and, like the vast majority of human decision-making, by emotions. In a forthcoming post I will examine some of these factors.&lt;br /&gt;&lt;br /&gt;[Major thanks to &lt;a href="http://www.ryanholiday.net/archives/3_common_practices_i_dissent_f.phtml"&gt;Ryan Holiday&lt;/a&gt; for providing the inspiration for this blog post.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-4207425257323246959?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/4207425257323246959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=4207425257323246959' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4207425257323246959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/4207425257323246959'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/frameworks-and-conjunction-fallacy.html' title='Frameworks and the conjunction fallacy'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-7788454591571498902</id><published>2009-03-12T03:01:00.003-06:00</published><updated>2009-03-12T17:21:12.843-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Assorted Lisp news</title><content type='html'>Last week I came across &lt;a href="http://bartoszmilewski.wordpress.com/2009/03/03/broken-promises-c0x-futures/"&gt;Bartosz Milewski's blog post criticizing the proposed implementation of futures in the forthcoming C++ standard&lt;/a&gt;. Milewski's chief dissatisfaction was the absence of a mechanism for composition. &lt;a href="http://marijn.haverbeke.nl/pcall/"&gt;PCall&lt;/a&gt; (which I've &lt;a href="http://carcaddar.blogspot.com/2009/02/parenscript-tricks-and-parallelism.html"&gt;blogged about before&lt;/a&gt;) was in a similar position, so I decided to implement a mechanism for non-deterministic composition and &lt;a href="http://groups.google.com/group/pcall/browse_thread/thread/db32b2c4f3242203"&gt;send in a patch&lt;/a&gt;. Milewski's blog post also spawned an &lt;a href="http://lambda-the-ultimate.org/node/3221"&gt;excellent discussion about futures on Lambda the Ultimate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Today I rewrote the &lt;a href="http://common-lisp.net/project/parenscript/tutorial.html"&gt;Parenscript tutorial&lt;/a&gt; to use the recently released 1.0 version of &lt;a href="http://www.weitz.de/hunchentoot/"&gt;Hunchentoot&lt;/a&gt; instead of &lt;a href="http://opensource.franz.com/aserve/index.html"&gt;AllegroServe&lt;/a&gt;. &lt;a href="http://www.weitz.de/"&gt;Edi Weitz&lt;/a&gt; and &lt;a href="http://netzhansa.blogspot.com/"&gt;Hans Hübner&lt;/a&gt; did a major redesign for the 1.0 release, breaking interface compatibility with previous versions of Hunchentoot. The new interface provides greater &lt;a href="http://www2.parc.com/csl/groups/sda/projects/oi/"&gt;Open Implementation&lt;/a&gt; capabilities, and makes a sharp demarcation between methods intended for OI and those for regular server programming. I like it.&lt;br /&gt;&lt;br /&gt;Beware that if you're not using &lt;a href="http://www.lispworks.com/"&gt;LispWorks&lt;/a&gt;, the 1.0 release of Hunchentoot depends on certain library capabilities (I suspect it's &lt;a href="http://common-lisp.net/project/usocket/"&gt;usocket&lt;/a&gt; but haven't verified) that as of the time of writing haven't been made into official releases yet. This means that if you get Hunchentoot dependencies via &lt;a href="http://common-lisp.net/project/asdf-install/"&gt;ASDF-Install&lt;/a&gt; it will &lt;a href="http://common-lisp.net/pipermail/tbnl-devel/2009-March/004657.html"&gt;likely not work&lt;/a&gt; (for me, it just instantly dropped all incoming connections) - use &lt;a href="http://common-lisp.net/project/clbuild/"&gt;clbuild&lt;/a&gt; to get the latest repository versions of the dependencies.&lt;br /&gt;&lt;br /&gt;Earlier last year I found out about &lt;a href="http://letoverlambda.com/"&gt;Doug Hoyte's &lt;i&gt;Let Over Lambda&lt;/i&gt;&lt;/a&gt; and after reading the sample chapters promptly got excited. I visited the site recently and found out that the book was published a few months ago. This morning my copy arrived in the mail - I'll be posting a review here later. In the meantime you can &lt;a href="https://www.lulu.com/commerce/index.php?fBuyContent=2146309"&gt;obtain your own copy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lispnyc.org/home.clp"&gt;LispNYC&lt;/a&gt; is once again looking to participate in &lt;a href="http://code.google.com/soc/"&gt;Google's Summer of Code program&lt;/a&gt;. The list of accepted organizations hasn't been announced yet, but you can &lt;a href="http://www.lispnyc.org/soc.clp"&gt;start proposing summer projects on the LispNYC website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Just found out about &lt;a href="http://www.lisp.ru/"&gt;lisp.ru&lt;/a&gt;. For a non-English generalist Lisp website the forum gets a fair amount of traffic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-7788454591571498902?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/7788454591571498902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=7788454591571498902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7788454591571498902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/7788454591571498902'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/assorted-lisp-news.html' title='Assorted Lisp news'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-3030686479458256476</id><published>2009-03-10T04:31:00.000-06:00</published><updated>2009-03-10T04:31:15.413-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><title type='text'>Cassandra of Facebook, or A Tale of a Distributed Database, part 2</title><content type='html'>This is the third in my series of blog posts about Facebook's Cassandra distributed database. &lt;a href="http://carcaddar.blogspot.com/2009/03/cassandra-of-facebook-or-tale-of.html"&gt;Part 0&lt;/a&gt; discussed the background of the problem Cassandra is meant to address, while &lt;a href="http://carcaddar.blogspot.com/2009/03/cassandra-of-facebook-or-tale-of_10.html"&gt;part 1&lt;/a&gt; gave an overview of the distributed systems techniques employed by Cassandra. This post is a scattering of my observations from reading the code.&lt;br /&gt;&lt;br /&gt;The most obvious feature of Cassandra's code is the pervasive presence of checksums in communication and data handling modules. Checksums are used both to detect data and message corruption, and as a means of finding out if replicated nodes are out of sync.&lt;br /&gt;&lt;br /&gt;Cassandra is a production system with a large deployment and the management features present reflect this. There is code for measuring node statistics and sending them off to a collection server. Nodes register themselves with both &lt;a href="http://hadoop.apache.org/zookeeper/"&gt;Zookeeper&lt;/a&gt; and &lt;a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/"&gt;JMX&lt;/a&gt; cluster-management services, although exactly what both of those are used for at Facebook is unclear as their cluster-management tools have not been released as free software.&lt;br /&gt;&lt;br /&gt;The mechanism for selecting nodes for replication can be customized to use metadata about machines to choose nodes on redundant networks/power grids/backplanes/etc to increase availability. The strategy provided in the code indicates that Facebook structures their Cassandra deployment using IPv4 addresses so that all the machines with the same third octet of an address are in the same rack, and all machines with the same second octet are in the same datacenter.&lt;br /&gt;&lt;br /&gt;The gossip protocol, besides being used for failure detection, is also used for load-balancing the cluster. Workload is measured as the number of requests per number of keys in a given time window that are handled by a node responsible for a particular interval of the key ring, and is disseminated by each node to the others. To alleviate high load, a node may move itself around on the key ring to more evenly distribute the keys between itself and a lightly loaded neighbor. The approach is an implementation of &lt;a href="http://www.actapress.com/PaperInfo.aspx?PaperID=22339&amp;reason=500"&gt;Abdallah and Le's &lt;i&gt;Scalable Range Query Processing for Large-Scale Distributed Database Applications&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The gossip protocol itself is rather interesting, featuring three stages (gossip message, ack, ack-ack).&lt;br /&gt;&lt;br /&gt;An interesting artifact is the &lt;code&gt;com.facebook.infrastructure.continuations&lt;/code&gt; package, which has some stubs based on the &lt;a href="http://commons.apache.org/sandbox/javaflow/"&gt;Javaflow&lt;/a&gt; bytecode continuation transformer. You would guess this would be used for the server code since it's based on non-blocking IO, but the server code is actually hand-coded &lt;a href="http://www.eecs.harvard.edu/~mdw/proj/seda/"&gt;staged event-driven&lt;/a&gt;. The stubs in the package aren't used anywhere else, which means that some other Facebook project must be using those. I wonder what for?&lt;br /&gt;&lt;br /&gt;The code itself can be found at &lt;a href="http://code.google.com/p/the-cassandra-project/"&gt;http://code.google.com/p/the-cassandra-project/&lt;/a&gt;, but seems to be in the process of being moved to a different repository. In the meantime, there is an active git repository at &lt;a href="http://wiki.github.com/jbellis/cassandra-dev"&gt;http://wiki.github.com/jbellis/cassandra-dev&lt;/a&gt; that features community-submitted bugfixes and improvements.&lt;br /&gt;&lt;br /&gt;To end on a light note, it is refreshing to find that the authors of Cassandra give a nod to the LOLspeak &lt;a href="http://speaklolspeak.com/page/Teh"&gt;code commenting guidelines&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; * 3. Set one of teh messages to get teh data and teh rest to get teh digest&lt;br /&gt;  // 4. SendRR ( to all the nodes above )&lt;br /&gt;  // 5. Wait for a response from atleast X nodes where X &lt;= N and teh data node&lt;br /&gt;   * 6. If the digest matches return teh data.&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-3030686479458256476?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/3030686479458256476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=3030686479458256476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3030686479458256476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/3030686479458256476'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/cassandra-of-facebook-or-tale-of_1895.html' title='Cassandra of Facebook, or A Tale of a Distributed Database, part 2'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5728814948530385321.post-682731826457554756</id><published>2009-03-10T04:20:00.001-06:00</published><updated>2009-03-10T04:33:19.209-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><title type='text'>Cassandra of Facebook, or A Tale of a Distributed Database, part 1</title><content type='html'>This is the second part of my examination of the Cassandra distributed database. &lt;a href="http://carcaddar.blogspot.com/2009/03/cassandra-of-facebook-or-tale-of.html"&gt;Part 0&lt;/a&gt; described the problem that Cassandra is trying to address; this post will describe the distributed systems techniques that it utilizes to that end.&lt;br /&gt;&lt;br /&gt;The basis for this post is a presentation describing Cassandra by Prashant Malik, Karthnik Ranganathan, and Avinash Lakshman given to the Facebook staff and available online: &lt;a href="http://www.new.facebook.com/video/video.php?v=540974400803#/video/video.php?v=540974400803"&gt;http://www.new.facebook.com/video/video.php?v=540974400803#/video/video.php?v=540974400803&lt;/a&gt; (hosted on Facebook, an account is required for viewing). &lt;a href="http://mvdirona.com/jrh/Work/"&gt;James Hamilton&lt;/a&gt; provides a &lt;a href="http://perspectives.mvdirona.com/2009/02/07/FacebookCassandraArchitectureAndDesign.aspx"&gt;summary&lt;/a&gt; of the presentation on &lt;a href="http://perspectives.mvdirona.com/"&gt;his blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Underlying Cassandra is the technique of &lt;a href="http://www.akamai.com/dl/technical_publications/ConsistenHashingandRandomTreesDistributedCachingprotocolsforrelievingHotSpotsontheworldwideweb.pdf"&gt;consistent hashing&lt;/a&gt;. Using consistent hashing, the key space can be modeled as a circle of the keys' hash values, and nodes assigned to points on that circle, so that a node is responsible for an interval of the circle of key hashes between itself and its next neighbor. Nodes leaving or joining only affect their previous neighbor, and lookup has a very low communication cost. Due to its great simplicity and robustness compared to other mechanisms, consistent hashing is probably the most significant development in distributed systems in the 1990s - virtually all current peer to peer systems are based on it.&lt;br /&gt;&lt;br /&gt;Cassandra uses a &lt;a href="http://en.wikipedia.org/wiki/Gossip_protocol"&gt;gossip protocol&lt;/a&gt; for determining cluster membership and for failure detection (and for load-balancing, discussed in the next blog post). Failure detection in this context means the various &lt;a href="http://pi1.informatik.uni-mannheim.de/filepool/teaching/dependablesystems-2007/PDS_20070308.pdf"&gt;failure detector&lt;/a&gt; mechanisms that can be used to achieve &lt;a href="http://en.wikipedia.org/wiki/Consensus_(computer_science)"&gt;consensus&lt;/a&gt; in asynchronous distributed systems with unreliable nodes. Given unlimited time to finish a task, it is impossible to distinguish a dead node from one that is slow - failure detectors use timing assumptions and heartbeat messages between nodes to provide an answer (with some degree of uncertainty), something that would otherwise require a synchronous network between nodes. Cassandra implements a failure detector based on &lt;a href="http://vsedach.googlepages.com/HDY04.pdf"&gt;Hayashibara et alia's &lt;i&gt;The φ Accrual Failure Detector&lt;/i&gt;&lt;/a&gt;; the presenter points out that some "ghetto" failure detectors with simpler mechanisms do not work very well in practice.&lt;br /&gt;&lt;br /&gt;Each interval of the hash circle is replicated on a set number N of nodes. Cassandra provides a choice of replication scheme: optimistic replication, which gives eventual consistency, or stricter approaches for writes and reads: quorum write and sync on read. Optimistic replication allows writes even if all nodes that are responsible for storing the particular key are down: the node receiving the request logs it and later hands it to the appropriate nodes when they come back up. Under the quorum write scheme, a write is not successful until at least a specified x number of the N total replicas have performed the write. It would seem that if x=N, then we get both monotonic &lt;a href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html"&gt;read and write consistency&lt;/a&gt;. Sync on read synchronizes all replicas on each read request, which gives monotonic write consistency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5728814948530385321-682731826457554756?l=carcaddar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carcaddar.blogspot.com/feeds/682731826457554756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5728814948530385321&amp;postID=682731826457554756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/682731826457554756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5728814948530385321/posts/default/682731826457554756'/><link rel='alternate' type='text/html' href='http://carcaddar.blogspot.com/2009/03/cassandra-of-facebook-or-tale-of_10.html' title='Cassandra of Facebook, or A Tale of a Distributed Database, part 1'/><author><name>Vladimir Sedach</name><uri>http://www.blogger.com/profile/16250437982151203601</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/-HDm6WvdCfwQ/Tw3pdwNQ1OI/AAAAAAAAAT4/7EJwSwCpE3c/s220/sitting.jpg'/></author><thr:total>0</thr:total></entry></feed>
