<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:abstractstuff</id>
  <title>AbstractNonsense</title>
  <subtitle>William Bland</subtitle>
  <author>
    <name>William Bland</name>
  </author>
  <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom"/>
  <updated>2008-05-02T17:15:44Z</updated>
  <lj:journal username="abstractstuff" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://abstractstuff.livejournal.com/data/atom" title="AbstractNonsense"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:39859</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/39859.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=39859"/>
    <title>DNA Lounge on Justin.TV</title>
    <published>2008-05-02T17:15:44Z</published>
    <updated>2008-05-02T17:15:44Z</updated>
    <category term="justin.tv"/>
    <content type="html">I'm very pleased to see &lt;a href="http://www.justin.tv/dnalounge"&gt;justin.tv&lt;/a&gt; is working out for the &lt;a href="http://www.dnalounge.com/webcast/"&gt;dna lounge&lt;/a&gt; - my favorite club in SF!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:39578</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/39578.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=39578"/>
    <title>Free Tibet protests in San Francisco</title>
    <published>2008-04-09T20:35:30Z</published>
    <updated>2008-04-09T20:35:30Z</updated>
    <category term="justin.tv"/>
    <category term="olympics"/>
    <category term="protest"/>
    <category term="china"/>
    <category term="tibet"/>
    <content type="html">Things are pretty lively at the office today.  There are a bunch of helicopters overhead and sirens all around us.  A bunch of people are streaming live video from the protests over justin.tv - this one looks like the best right now:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.justin.tv/olympictorchsf1"&gt;http://www.justin.tv/olympictorchsf1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's being broadcast over EVDO, so it gets a little choppy at times, but generally it's a great feed.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:39225</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/39225.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=39225"/>
    <title>Isobel</title>
    <published>2008-04-03T05:40:02Z</published>
    <updated>2008-04-03T05:40:02Z</updated>
    <category term="isobel"/>
    <category term="cat"/>
    <content type="html">Enjoy the long sleep Isobel.&lt;br /&gt;&lt;br /&gt;You were a really good cat.  We miss you very much.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://abstractnonsense.com/isobel-in-tape.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://abstractnonsense.com/isobel-in-a-box.jpg" /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:39138</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/39138.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=39138"/>
    <title>Getting hired</title>
    <published>2008-03-12T18:10:38Z</published>
    <updated>2008-03-12T21:29:20Z</updated>
    <category term="justin.tv"/>
    <category term="startup"/>
    <content type="html">These are some notes on how I came to be working at &lt;a href="http://www.justin.tv/"&gt;justin.tv&lt;/a&gt;.  They may prove useful to you, if you're trying to find a job at a good startup.&lt;br /&gt;&lt;br /&gt;First a little background:  I grew up in the UK and was the first employee of a London-based startup in 2000.  I joined that company fresh out of finishing a PhD because one of the founders was my younger brother and he seemed to be having fun there.  The company was acquired in 2003 and, because it was still quite small, we were relocated to the sunny Silicon Valley.  I spent the next four years waiting for a Green Card and, when it finally arrived, I immediately started looking for a good startup to join.&lt;br /&gt;&lt;br /&gt;I already knew I wanted to join a &lt;a href="http://ycombinator.com/"&gt;Y Combinator&lt;/a&gt; company - even from the outside some of the enormous benefits that come from being funded by YC are easy to see.  From the inside they're even more apparent.  The network of highly competent and ever more experienced YC founders and friends turns out to be a huge time saver.&lt;br /&gt;&lt;br /&gt;I put together a list of what I thought were the best YC companies.  It's hard to define exactly what "best" means of course, but here are some of the things I looked for:&lt;ul&gt;&lt;li&gt;Users!  This was the most important factor.&lt;/li&gt;&lt;li&gt;A track record of getting press hits.&lt;/li&gt;&lt;li&gt;Smart people.  Once I had narrowed my list down to just a few companies, I spent some time on Google finding out everything I could about the people who worked at them.  I'm always amazed by how few people do this - both for people they're hiring, and for people they're considering going to work for.&lt;/li&gt;&lt;/ul&gt;I also asked a bunch of friends what they thought of each company's idea (if you do this, pay less attention to the bad stuff but listen carefully to the good bits.  It's much easier to knock an idea than it is to find the diamond in the rough).&lt;br /&gt;&lt;br /&gt;I didn't spend a huge amount of time doing this - probably about a day's work was enough to get a good feel of roughly how I would rank each company.  In the end, justin.tv was at the top of the list.&lt;br /&gt;&lt;br /&gt;While waiting for my Green Card I had worked on a bunch of spare-time projects.  Before applying, I made sure that the best of these were currently working, and were written about in my resume.  Spare-time projects can give you a huge advantage in complimenting your "official" work experience.  Before working at justin.tv I didn't have much recent on-the-job web programming experience, but two of my spare-time projects (&lt;a href="http://lispdoc.com"&gt;lispdoc&lt;/a&gt; and &lt;a href="http://clutu.com"&gt;clutu&lt;/a&gt;) showed that I knew this stuff all the same.&lt;br /&gt;&lt;br /&gt;Coincidentally, justin.tv advertised on &lt;a href="http://news.ycombinator.com/"&gt;news.yc&lt;/a&gt; right at the same time I decided I wanted to work for them.  The content of the ad was an extra indication that they would be a good fit for me - the problem they were asking candidates to solve was clearly written by someone with exposure to Lisp.  I wrote a quick solution to it (in Common Lisp) and sent an email introducing myself.&lt;br /&gt;&lt;br /&gt;Emmett liked my solution, and sent me their standard follow-up problem.  I decided to go all-out to impress, and went in to work a little late that day so I could solve the problem within about an hour of reading the email.  That seemed to do the trick, and I was invited to come in for a chat.  If you want to get hired somewhere really good it's worth going the extra mile even before the interviews.  Don't spam anyone of course, but do take every opportunity to show that you're competent and enthusiastic.&lt;br /&gt;&lt;br /&gt;The interviews went well I felt - I was asking the justin.tv guys as many questions as they were asking me, and I was certainly pleased with the answers they were giving.  Having been on both sides of the table I can't stress enough how important it is to engage in an interview.  I've interviewed people who responded to all my questions with one or two word answers (I've also interviewed people who just won't stop talking and let me get a word in!).  An interview should be a two-way thing, more like a conversation.  Of course it's awkward, but you can make it less so by just pretending the person you're talking to is a newish friend and you're both brainstorming ideas and swapping stories and experiences together.  Above all if you're excited about coming to work somewhere, &lt;i&gt;show it&lt;/i&gt; (and if you're not excited, don't bother going for an interview - people can&lt;br /&gt;tell when you're there because you couldn't find anything you liked better).  Be confident ("of course if you hire me I can figure out how to do this") but not arrogant ("anyone who can't figure this out is an idiot").&lt;br /&gt;&lt;br /&gt;After interviewing with the justin.tv guys, they wanted me to meet with &lt;a href="http://en.wikipedia.org/wiki/Paul_Buchheit"&gt;Paul Buchheit&lt;/a&gt; - one of the angel investors in justin.tv.  He's a very smart guy and it was fun to talk with him, even if I was a little intimidated at first to be meeting the guy who wrote gmail.  He has some awesome ideas and loves sharing them (breeding dragonflies in an oxygen-rich environment to see if they'll grow really big, is one that sticks in my mind).&lt;br /&gt;&lt;br /&gt;One thing everyone asked - all the justin.tv people, and Paul - was "what would you like to work on at justin.tv?".  The answer, for me, was obvious.  I'm confident enough in my ability to pick up new stuff that the answer is always "whatever is causing the most pain, that's what I want to work on".  That seemed to be an ok answer to give.&lt;br /&gt;&lt;br /&gt;When I was pretty sure I was going to be offered the position I pinged my good friend &lt;a href="http://www.beguelin.com/"&gt;Adam&lt;/a&gt;.  He's been an early employee at a bunch of different startups and, most recently was the co-founder of &lt;a href="http://truveo.com"&gt;Truveo&lt;/a&gt;.  If you have mentors like Adam who have been through the kinds of things you're trying to figure out, take every opportunity to pick their brains.&lt;br /&gt;&lt;br /&gt;A few days after talking with Adam, I was offered the job.  I accepted, gave notice, and went to Mexico for my honeymoon (I got married to my awesome wife a few days before the first justin.tv interview). At this point I should mention that, if you're attached, you should do yourself a favor and discuss startup life before you start looking for one to join.  My wife and I did this and it was very useful.  Startups are completely different to normal jobs and it's much more comfortable to be negotiating your employment terms knowing exactly what you can and cannot commit to, rather than having to say you'll have to get back to people on some points.&lt;br /&gt;&lt;br /&gt;I'm incredibly happy at justin.tv.  We are making great things happen and all our problems are the good kind (how on earth are we going to scale quickly enough to meet the &lt;a href="http://abstractnonsense.com/jtv-growth.png"&gt;demand&lt;/a&gt; we're seeing?).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a name="addendum"&gt;Addendum&lt;/a&gt;:  Try not to seem &lt;b&gt;too&lt;/b&gt; eager, or you'll find yourself working at the &lt;a href="http://news.ycombinator.com/item?id=135425"&gt;desk next to the bathroom&lt;/a&gt;&lt;/i&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:38659</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/38659.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=38659"/>
    <title>I could watch this all day.</title>
    <published>2008-02-29T03:02:40Z</published>
    <updated>2008-02-29T03:18:19Z</updated>
    <category term="justin.tv"/>
    <content type="html">The first online webcam I ever saw was streaming a fish-tank (very grainy, about 1 frame every second or two as far as I remember), so it was funny to see this new channel on justin.tv - fortunately a decade does quite a lot for video quality:&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id="2" /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:38635</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/38635.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=38635"/>
    <title>Jans Aasman - Lisp and the Semantic Web</title>
    <published>2008-02-23T19:02:25Z</published>
    <updated>2008-02-23T19:02:25Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">Jans gave a very interesting talk recently at the justin.tv office, as part of our &lt;a href="http://www.justin.tv/hackertv"&gt;hackertv&lt;/a&gt; series of live tech talks.&lt;br /&gt;&lt;br /&gt;For anyone who missed it, here's the &lt;a href="http://www.justin.tv/hackertv/68368/Jans_Aasman_Franz__How_Lisp_will_make_"&gt;archive&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:38271</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/38271.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=38271"/>
    <title>How Lisp Will Make Web 3.0 A Reality</title>
    <published>2008-02-13T17:21:57Z</published>
    <updated>2008-02-13T17:21:57Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">&lt;a href="http://blog.justin.tv/2008/02/jtv-tech-talk-jans-aasman-on-how-lisp.html"&gt;http://blog.justin.tv/2008/02/jtv-tech-talk-jans-aasman-on-how-lisp.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:37979</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/37979.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=37979"/>
    <title>Tech-talk on Scheme tomorrow.</title>
    <published>2008-01-23T16:56:04Z</published>
    <updated>2008-01-23T17:12:52Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="startup"/>
    <category term="lisp"/>
    <content type="html">Ethan Herdrick of &lt;a href="http://biographicon.com/"&gt;The Biographicon&lt;/a&gt; will be talking about running a startup on Scheme tomorrow, at the justin.tv office (36 Clyde St, SF - a block away from Caltrain).&lt;br /&gt;&lt;br /&gt;As usual we'll have free pizza at 12pm, and the talk will start at 12:30pm.  It'll be broadcast live on the &lt;a href="http://www.justin.tv/hackertv"&gt;HackerTV&lt;/a&gt; channel.  If you watch it there live (or come to the office in person!), you'll be able to participate in the Q&amp;A.  If you miss the talk you can always catch it in the archives at your convenience.&lt;br /&gt;&lt;br /&gt;The talk has a Facebook &lt;a href="http://www.facebook.com/event.php?eid=7721873963"&gt;event page&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:37674</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/37674.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=37674"/>
    <title>Adam Beguelin (Truveo.com) talking at Justin.tv tomorrow</title>
    <published>2008-01-02T21:35:17Z</published>
    <updated>2008-01-02T21:49:57Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <content type="html">My good friend Adam Beguelin is giving a talk at the &lt;a href="http://www.justin.tv/"&gt;Justin.tv&lt;/a&gt; office tomorrow as part of our series of &lt;a href="http://www.justin.tv/hackertv"&gt;live tech-talks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These talks are open to anyone.  The Justin.tv office is at 36 Clyde Street, San Francisco.  If you can't attend in person you can watch the talk live on the &lt;a href="http://www.justin.tv/hackertv"&gt;HackerTV channel&lt;/a&gt;, where you can participate in the live Q&amp;A session via our on-site chat.  If you don't catch the talk live, you can see it archived on that channel page later.&lt;br /&gt;&lt;br /&gt;The event has a &lt;a href="http://www.facebook.com/event.php?eid=21508381096"&gt;Facebook page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Post Exit Startup Wisdom&lt;/b&gt; &lt;i&gt;Adam Beguelin, PhD&lt;/i&gt;&lt;br /&gt;&lt;p style="margin-left:3em"&gt;Starting a company is an exciting, frustrating, and sometimes rewarding endeavor.  I've done four startups, founding two.  I've been through IPOs, acquisitions, near acquisitions, and the Venture Capital Nuclear Winter of 2001-2003.  This talk covers some of the lessons I've learned along the way. I'll talk about raising money, spending money, and some opinions on how to build and release software in a Web 2.0 world.&lt;/p&gt;Adam was the CTO and co-founder of &lt;a href="http://truveo.com/"&gt;Truveo&lt;/a&gt;, a leading video search engine acquired by AOL in December 2005.  He is currently retired and living with his family in his wife's native country of Vietnam.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:37420</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/37420.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=37420"/>
    <title>Justin.TV on an OLPC</title>
    <published>2007-12-27T18:38:11Z</published>
    <updated>2007-12-27T18:58:41Z</updated>
    <category term="olpc"/>
    <category term="justin.tv"/>
    <content type="html">Having had my OLPC delivered on Christmas Eve, I was eager to see how well it would cope with a &lt;a href="http://www.justin.tv/"&gt;live video&lt;/a&gt; website.  Turns out everything works great!  Here are some photos and a video of it working:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://abstractnonsense.com/olpc/olpc1-large.jpg"&gt;&lt;img src="http://abstractnonsense.com/olpc/olpc1-small.jpg" border="0"&gt;&lt;/a&gt; &lt;a href="http://abstractnonsense.com/olpc/olpc2-large.jpg"&gt;&lt;img src="http://abstractnonsense.com/olpc/olpc2-small.jpg" border="0"&gt;&lt;/a&gt; &lt;a href="http://abstractnonsense.com/olpc/olpc3-large.jpg"&gt;&lt;img src="http://abstractnonsense.com/olpc/olpc3-small.jpg" border="0"&gt;&lt;/a&gt; &lt;a href="http://abstractnonsense.com/olpc/olpc4-large.jpg"&gt;&lt;img src="http://abstractnonsense.com/olpc/olpc4-small.jpg" border="0"&gt;&lt;/a&gt; &lt;a href="http://abstractnonsense.com/olpc/olpc5-large.jpg"&gt;&lt;img src="http://abstractnonsense.com/olpc/olpc5-small.jpg" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;lj-embed id="1" /&gt;&lt;br /&gt;There's still (just!) time to &lt;a href="http://laptopgiving.org/en/index.php"&gt;get hold of an OLPC&lt;/a&gt; via the Give One Get One deal.  It's an awesome geek toy, a perfect kids' first laptop, and a great thing to do for the developing world.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:37253</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/37253.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=37253"/>
    <title>OLPC</title>
    <published>2007-12-24T20:49:00Z</published>
    <updated>2007-12-24T20:49:00Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">My OLPC arrived this morning - it's great that it got here on the Christmas break!  Having played with it for about an hour so far, I have to say this is one of the most exciting pieces of technology I've seen in a while.  The whole thing is engineered in a way that reminds me very much of the 8-bit microcomputers I grew up with in the 80s, although of course the OLPC takes full advantage of a lot of modern technology on offer (in fact I'm surprised by just how much cool hardware it has).&lt;br /&gt;&lt;br /&gt;The OLPC is a computer built for people, first and foremost.  It looks, and feels, and hopefully &lt;i&gt;is&lt;/i&gt; incredibly robust.  It's also very lightweight.  It doesn't get hot, or make any unwanted noises.  The keyboard is a membrane (&lt;i&gt;very&lt;/i&gt; reminiscent of some of the first computers I owned), but surprisingly not too bad to type on and of course great for kids and harsh environments.&lt;br /&gt;&lt;br /&gt;The software has a great feel too.  It's incredibly easy to quickly get started doing something fun and interesting.  Everything has the effect of encouraging more and more exploration, learning and experimentation.&lt;br /&gt;&lt;br /&gt;I haven't managed to find any kind of Lisp yet, but Python is there of course - quite prominently, and in a way that makes it a fun and easy thing to play around with.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Great job OLPC!&lt;/b&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:36992</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/36992.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=36992"/>
    <title>Peter Seibel on Why Syntax [Does|Doesn't] Matter.</title>
    <published>2007-12-18T18:02:17Z</published>
    <updated>2007-12-18T21:10:48Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">Peter gave us an excellent talk last week, and didn't seem to mind at all that we had technical problems right up to a couple of minutes before his talk was due to start, or that the pizza was late and arrived halfway through his talk!&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://www.justin.tv/hackertv/53433/Peter_Seibel_on_syntax_part_one"&gt;part 1&lt;/a&gt; and &lt;a href="http://www.justin.tv/hackertv/53442/Peter_Seibel_on_syntax_part_two"&gt;part 2&lt;/a&gt; of the talk.&lt;br /&gt;&lt;br /&gt;Next up:  Adam Beguelin (co-founder of &lt;a href="http://www.truveo.com/"&gt;Truveo&lt;/a&gt;), on "Tips and Tools for Internet Startups" - January 3rd.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:36717</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/36717.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=36717"/>
    <title>Reminder:  Peter Seibel is talking at the Justin.tv office on Thursday (Dec 13th)</title>
    <published>2007-12-11T19:17:13Z</published>
    <updated>2007-12-11T20:02:39Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">Peter Seibel, author of the Jolt Productivity Award winning book &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt;, will be giving a talk, "Syntax [Does|Doesn't] Matter" or "If you take out the parentheses, will it still be Lisp?" Peter's talk will explore the effects syntax can have on a programming language and on its programmers -- how a given syntax creates an environment in which certain language features can thrive and others will likely whither. Peter is a writer turned programmer or perhaps a programmer turned writer. After working briefly as a journalist he was seduced by the web and turned to a life of Perl and Java hacking. In 2003 he quit his job as the architect of a Java-based transactional messaging system and ended up writing Practical Common Lisp. He is now at work on a new book, &lt;a href="http://www.codersatwork.com/"&gt;Coders at Work&lt;/a&gt;, a collection of interviews with sixteen notable programmers.&lt;br /&gt;&lt;br /&gt;The Justin.tv office is at 36 Clyde Street, San Francisco.  Free pizza will be served from 12pm and Peter's talk will start at 12:30pm and run for about 40 minutes.  After the talk we'll have time for Q&amp;A.  If you're in the area, please feel free to drop by.  If you can't make it in person, you can see the talk live at &lt;a href="http://www.justin.tv/hackertv"&gt;http://www.justin.tv/hackertv&lt;/a&gt; (12:30pm &lt;b&gt;PST&lt;/b&gt;) and participate in the Q&amp;A via the chat pane on that page.  And of course if you don't manage to catch the talk live, the archived video will soon show up on that page for you to watch when you're ready.&lt;br /&gt;&lt;br /&gt;Incidentally, thanks are due to &lt;a href="http://lisperati.com/"&gt;Conrad Barski&lt;/a&gt;, who created the awesome artwork that's on the hackertv channel!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:36472</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/36472.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=36472"/>
    <title>Ecmacs?</title>
    <published>2007-12-07T21:32:02Z</published>
    <updated>2007-12-07T21:32:02Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">Steve Yegge posted a &lt;a href="http://steve-yegge.blogspot.com/2007/12/boring-stevey-status-update.html"&gt;status update&lt;/a&gt; about his recent work at Google.&lt;br /&gt;&lt;br /&gt;For me the most interesting thing was a project that would allow people to write Emacs extensions in javascript.&lt;br /&gt;&lt;br /&gt;Of course, attempts to replace elisp have a long and unfruitful history, but surely it &lt;i&gt;has&lt;/i&gt; to happen one day.  If it's not going to be a real Lisp (e.g. Scheme or Common Lisp), then javascript seems like a good alternative.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:36158</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/36158.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=36158"/>
    <title>Peter Seibel on Why Syntax [Does|Doesn't] Matter:  justin.tv, December 13th</title>
    <published>2007-12-06T23:01:29Z</published>
    <updated>2007-12-06T23:01:46Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">Peter Seibel will be giving our second justin.tv live tech talk, December 13th.&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;Thursday, December 13, 2007, 12:00pm - 2:00pm.&lt;br /&gt;&lt;br /&gt;Justin.tv&lt;br /&gt;36 Clyde St&lt;br /&gt;San Francisco, CA&lt;br /&gt; 	&lt;br /&gt;Justin.tv is hosting tech talks for the SOMA hacker community.  Free pizza will be served at noon, and the talk will start at 12:30. The talks will be open to anyone in the area who is interested in listening, and will also be broadcast on justin.tv/hackertv.&lt;br /&gt;&lt;br /&gt;Peter Seibel will be giving a talk entitled "Why Syntax [Does|Doesn't] Matter."&lt;br /&gt;&lt;br /&gt;Peter Seibel is the author of "Practical Common Lisp", and is now working on "Coders At Work" (which will be published by Apress as a companion book to Jessica Livingston's "Founders At Work").&lt;br /&gt;&lt;br /&gt;Facebook event page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/event.php?eid=6383715741"&gt;http://www.facebook.com/event.php?eid=6383715741&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:36082</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/36082.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=36082"/>
    <title>Amazon startup competition</title>
    <published>2007-12-03T21:10:33Z</published>
    <updated>2007-12-03T21:12:32Z</updated>
    <category term="justin.tv"/>
    <content type="html">The startup I work at has been selected as a finalist in the Amazon startup competition.  If you think Justin.TV is awesome, why not &lt;a href="http://developer.amazonwebservices.com/connect/amazon_startupchallenge.jsp?"&gt;vote for us&lt;/a&gt;?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:35813</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/35813.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=35813"/>
    <title>Second live tech talk at justin.tv</title>
    <published>2007-11-20T01:34:30Z</published>
    <updated>2007-11-20T01:34:30Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">&lt;a href="http://gigamonkeys.com/"&gt;Peter Seibel&lt;/a&gt; will be giving our &lt;a href="http://techblog.justin.tv/2007/11/second-live-tech-talk-peter-seibel.html"&gt;second justin.tv live tech talk&lt;/a&gt;, on December 13th.&lt;br /&gt;&lt;br /&gt;As with all of these talks, if you're in the area please feel free to drop by.  Otherwise catch the talk (live or archived) on the &lt;a href="http://www.justin.tv/hackertv"&gt;hackerTV&lt;/a&gt; channel.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:35530</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/35530.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=35530"/>
    <title>Tech talks</title>
    <published>2007-11-17T19:08:33Z</published>
    <updated>2007-11-17T19:08:33Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">I'm really excited about the latest project we've been brewing at &lt;a href="http://www.justin.tv/"&gt;justin.tv&lt;/a&gt;:  Live tech talks.&lt;br /&gt;&lt;br /&gt;They'll be taking place every other Thursday afternoon.  If you're in &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;q=Clyde+St,+San+Francisco,+CA+94107&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=34.396866,82.265625&amp;amp;ie=UTF8&amp;amp;ll=37.779076,-122.394154&amp;amp;spn=0.008378,0.020084&amp;amp;z=16&amp;amp;iwloc=addr&amp;amp;om=1"&gt;the area&lt;/a&gt;, drop by our office.  If not, catch the event live online (and if you miss it, there's always the archives!).&lt;br /&gt;&lt;br /&gt;Our first speaker will be &lt;a href="http://leahculver.com/"&gt;Leah Culver&lt;/a&gt;, of &lt;a href="http://pownce.com/"&gt;Pownce&lt;/a&gt;, who will be talking about &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt; on the 29th of November.  There's a &lt;a href="http://www.facebook.com/event.php?eid=5907866589&amp;amp;ref=mf"&gt;Facebook&lt;/a&gt; page for the event with more details.&lt;br /&gt;&lt;br /&gt;Between talks, I'll be broadcasting a bunch of videos that should be of interest to hackers, starting with the excellent Abelson and Sussman SICP lectures.  Come watch them, and chat with other hackers on the &lt;a href="http://www.justin.tv/hackertv"&gt;hackerTV channel page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you have any suggestions for speakers, or for videos to show between talks, please email me:  bill@justin.tv</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:35158</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/35158.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=35158"/>
    <title>Lunch</title>
    <published>2007-11-08T20:53:46Z</published>
    <updated>2007-11-08T20:53:46Z</updated>
    <category term="justin.tv"/>
    <category term="startup"/>
    <content type="html">&lt;img src="http://abstractnonsense.com/lunch.jpg"&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:34892</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/34892.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=34892"/>
    <title>Interfacing with the jtv search engine</title>
    <published>2007-11-07T23:26:44Z</published>
    <updated>2007-11-08T01:18:44Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <content type="html">A &lt;a href="http://techblog.justin.tv/2007/11/jtv-search-api.html"&gt;justin.tv update&lt;/a&gt;, where you can learn how to use Lisp and the new justin.tv search api to write a basic Feline Video Alert System, should you ever need one.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:34781</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/34781.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=34781"/>
    <title>What century is this again?</title>
    <published>2007-09-21T21:02:49Z</published>
    <updated>2007-09-21T21:02:49Z</updated>
    <category term="computers"/>
    <category term="python"/>
    <content type="html">Apparently Python doesn't have real closures.  I went looking to see when closures are from.  Turns out they were first fully implemented in Scheme, in the &lt;i&gt;1970s&lt;/i&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:34365</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/34365.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=34365"/>
    <title>New day, new job</title>
    <published>2007-09-09T21:34:36Z</published>
    <updated>2007-09-09T21:36:38Z</updated>
    <category term="justin.tv"/>
    <category term="computers"/>
    <category term="life"/>
    <category term="lisp"/>
    <category term="clutu"/>
    <content type="html">Tomorrow will be my first day working at live video startup &lt;a href="http://www.justin.tv/officecam"&gt;justin.tv&lt;/a&gt; in San Francisco.  If you haven't heard of jtv, check it out.  I think live (and potentially mobile) video streaming is going to be a big thing soon.&lt;br /&gt;&lt;br /&gt;I'll keep working on my &lt;a href="http://clutu.com/"&gt;crossword site&lt;/a&gt; whenever I can.  I'll have a couple of hours every day on the train.&lt;br /&gt;&lt;br /&gt;I have plenty of new music to keep me company on the train ride too - I just discovered &lt;a href="http://youtube.com/watch?v=I3e1YCLV9bA"&gt;squarepusher&lt;/a&gt; (I'm not sure what took me so long - I've loved practically everything that's come out of Warp Records).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:34092</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/34092.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=34092"/>
    <title>tic-tac-toe for fun and profit</title>
    <published>2007-08-30T18:02:01Z</published>
    <updated>2007-08-30T18:05:50Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <category term="jobs"/>
    <content type="html">As a precursor to a recent job interview, I was given the task of writing a tic-tac-toe web application.  Wanting to impress my interviewers by getting it done quickly, I gave myself one hour to write it (which is why it does ugly things like requiring hunchentoot instead of having a proper &lt;a href="http://www.cliki.net/asdf"&gt;asdf&lt;/a&gt; file).  I think it worked out pretty well.  I was lucky enough to have read about the tic-tac-toe/game-of-15 isomorphism a long time ago, but I did miss a couple of rules which means if you're clever you can beat the game when it makes the wrong move.&lt;br /&gt;&lt;br /&gt;If you want to run it yourself, make sure you have &lt;a href="http://weitz.de/hunchentoot/"&gt;hunchentoot&lt;/a&gt; and &lt;a href="http://weitz.de/cl-who/"&gt;cl-who&lt;/a&gt; installed first.&lt;br /&gt;&lt;br /&gt;&lt;pre class="htmlize"&gt;(&lt;a href="http://lispdoc.com/?q=eval-when"&gt;eval-when&lt;/a&gt; (&lt;span class="builtin"&gt;:compile-toplevel&lt;/span&gt; &lt;span class="builtin"&gt;:load-toplevel&lt;/span&gt; &lt;span class="builtin"&gt;:execute&lt;/span&gt;)
  (&lt;a href="http://lispdoc.com/?q=require"&gt;require&lt;/a&gt; &lt;span class="builtin"&gt;:hunchentoot&lt;/span&gt;)
  (&lt;a href="http://lispdoc.com/?q=require"&gt;require&lt;/a&gt; &lt;span class="builtin"&gt;:cl-who&lt;/span&gt;))

(&lt;a href="http://lispdoc.com/?q=defpackage"&gt;defpackage&lt;/a&gt; &lt;span class="builtin"&gt;:tictactoe&lt;/span&gt;
  (&lt;span class="builtin"&gt;:use&lt;/span&gt; &lt;span class="builtin"&gt;:cl&lt;/span&gt; &lt;span class="builtin"&gt;:hunchentoot&lt;/span&gt; &lt;span class="builtin"&gt;:cl-who&lt;/span&gt;)
  (&lt;span class="builtin"&gt;:export&lt;/span&gt; #:start-web))

(&lt;a href="http://lispdoc.com/?q=in-package"&gt;in-package&lt;/a&gt; &lt;span class="builtin"&gt;:tictactoe&lt;/span&gt;)

(&lt;a href="http://lispdoc.com/?q=eval-when"&gt;eval-when&lt;/a&gt; (&lt;span class="builtin"&gt;:compile-toplevel&lt;/span&gt; &lt;span class="builtin"&gt;:load-toplevel&lt;/span&gt; &lt;span class="builtin"&gt;:execute&lt;/span&gt;)
  (&lt;a href="http://lispdoc.com/?q=setf"&gt;setf&lt;/a&gt; &lt;span class="variable-name"&gt;*hunchentoot-default-external-format*&lt;/span&gt; (flex:make-external-format &lt;span class="builtin"&gt;:utf-8&lt;/span&gt; &lt;span class="builtin"&gt;:eol-style&lt;/span&gt; &lt;span class="builtin"&gt;:lf&lt;/span&gt;)
        &lt;span class="variable-name"&gt;*default-content-type*&lt;/span&gt; &lt;span class="string"&gt;"text/html; charset=UTF-8"&lt;/span&gt;
        (html-mode) &lt;span class="builtin"&gt;:sgml&lt;/span&gt;
        &lt;span class="variable-name"&gt;*read-eval*&lt;/span&gt; nil
        &lt;span class="variable-name"&gt;*dispatch-table*&lt;/span&gt; (&lt;a href="http://lispdoc.com/?q=list"&gt;list&lt;/a&gt; 'dispatch-easy-handlers
                               (create-folder-dispatcher-and-handler &lt;span class="string"&gt;"/static/"&lt;/span&gt; &lt;span class="string"&gt;"./"&lt;/span&gt; &lt;span class="string"&gt;"text/plain"&lt;/span&gt;)
                               (create-prefix-dispatcher &lt;span class="string"&gt;"/"&lt;/span&gt; 'print-main-page))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;start-web&lt;/span&gt; (&amp;amp;optional (port 4321))
  (start-server &lt;span class="builtin"&gt;:port&lt;/span&gt; port))

(&lt;a href="http://lispdoc.com/?q=defparameter"&gt;defparameter&lt;/a&gt; &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; nil)

(&lt;a href="http://lispdoc.com/?q=defparameter"&gt;defparameter&lt;/a&gt; &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt; nil)

(&lt;a href="http://lispdoc.com/?q=defparameter"&gt;defparameter&lt;/a&gt; &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt; nil)

(&lt;a href="http://lispdoc.com/?q=defparameter"&gt;defparameter&lt;/a&gt; &lt;span class="variable-name"&gt;*magic*&lt;/span&gt; #2A((2 7 6)
                          (9 5 1)
                          (4 3 8)))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;print-main-page&lt;/span&gt; ()
  (&lt;a href="http://lispdoc.com/?q=let*"&gt;let*&lt;/a&gt; ((human (or (get-parameter &lt;span class="string"&gt;"human"&lt;/span&gt;) ""))
         (computer (or (get-parameter &lt;span class="string"&gt;"computer"&lt;/span&gt;) ""))
         (human-sym (if (&amp;gt; (length human) (length computer)) 'x 'o))
         (computer-sym (if (equal human-sym 'x) 'o 'x)))
    (&lt;a href="http://lispdoc.com/?q=let*"&gt;let*&lt;/a&gt; ((&lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt; (map 'list (lambda (c) (position c &lt;span class="string"&gt;"0123456789"&lt;/span&gt;)) human))
           (&lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt; (map 'list (lambda (c) (position c &lt;span class="string"&gt;"0123456789"&lt;/span&gt;)) computer))
           (&lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; (sort (set-difference (list 1 2 3 4 5 6 7 8 9)
                                                     (append &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt; &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;))
                                     (lambda (x y) (and (evenp x) (not (evenp y)))))))
      (&lt;a href="http://lispdoc.com/?q=cond"&gt;cond&lt;/a&gt; ((&lt;a href="http://lispdoc.com/?q=and"&gt;and&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=not"&gt;not&lt;/a&gt; &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt;)
                  (&lt;a href="http://lispdoc.com/?q=not"&gt;not&lt;/a&gt; &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)
                  (&lt;a href="http://lispdoc.com/?q=%3E"&gt;&amp;gt;&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=random"&gt;random&lt;/a&gt; 100) 25)) &lt;span class="comment"&gt;;; Computer lets monkey play first 75% of the time&lt;/span&gt;
             (&lt;a href="http://lispdoc.com/?q=setf"&gt;setf&lt;/a&gt; human-sym 'x
                   computer-sym 'o))
            ((&lt;a href="http://lispdoc.com/?q=not"&gt;not&lt;/a&gt; (game-is-won))
             (make-next-move)))
      (with-html-output-to-string (&lt;a href="http://lispdoc.com/?q=*standard-output*"&gt;*standard-output*&lt;/a&gt; nil &lt;span class="builtin"&gt;:prologue&lt;/span&gt; t &lt;span class="builtin"&gt;:indent&lt;/span&gt; t)
        (:html
         (:head
          (:style &lt;span class="string"&gt;"html body{font-family:sans-serif; font-size:large} a{text-decoration:none;}"&lt;/span&gt;)
          (:title &lt;span class="string"&gt;"tic tac toe"&lt;/span&gt;))
         (:body
          (:h1
           &lt;span class="string"&gt;"tic tac toe"&lt;/span&gt;)
          ((:table &lt;span class="builtin"&gt;:cellpadding&lt;/span&gt; &lt;span class="string"&gt;"10px"&lt;/span&gt; &lt;span class="builtin"&gt;:cellspacing&lt;/span&gt; &lt;span class="string"&gt;"0"&lt;/span&gt;)
           (&lt;a href="http://lispdoc.com/?q=dotimes"&gt;dotimes&lt;/a&gt; (row 3)
             (fmt &lt;span class="string"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)
             (&lt;a href="http://lispdoc.com/?q=dotimes"&gt;dotimes&lt;/a&gt; (col 3)
               (fmt &lt;span class="string"&gt;"&amp;lt;td align=\"center\" width=\"33%\" style=\"background:#ddddff; border:1px solid #888888\"&amp;gt;"&lt;/span&gt;)
               (&lt;a href="http://lispdoc.com/?q=cond"&gt;cond&lt;/a&gt; ((&lt;a href="http://lispdoc.com/?q=member"&gt;member&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=aref"&gt;aref&lt;/a&gt; &lt;span class="variable-name"&gt;*magic*&lt;/span&gt; row col) &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt;)
                      (fmt &lt;span class="string"&gt;"~A"&lt;/span&gt; human-sym))
                     ((&lt;a href="http://lispdoc.com/?q=member"&gt;member&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=aref"&gt;aref&lt;/a&gt; &lt;span class="variable-name"&gt;*magic*&lt;/span&gt; row col) &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)
                      (fmt &lt;span class="string"&gt;"~A"&lt;/span&gt; computer-sym))
                     ((game-is-won)
                      (fmt &lt;span class="string"&gt;"-"&lt;/span&gt;))
                     (t
                      (fmt &lt;span class="string"&gt;"&amp;lt;a href=\"/?human=~A~A&amp;amp;computer=~{~A~}\"&amp;gt;-&amp;lt;/a&amp;gt;"&lt;/span&gt;
                           human
                           (&lt;a href="http://lispdoc.com/?q=aref"&gt;aref&lt;/a&gt; &lt;span class="variable-name"&gt;*magic*&lt;/span&gt; row col)
                           &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)))
               (fmt &lt;span class="string"&gt;"&amp;lt;/td&amp;gt;"&lt;/span&gt;))
             (fmt &lt;span class="string"&gt;"&amp;lt;/tr&amp;gt;"&lt;/span&gt;)))
          (&lt;a href="http://lispdoc.com/?q=when"&gt;when&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=or"&gt;or&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=null"&gt;null&lt;/a&gt; &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;)
                    (game-is-won))
            (fmt &lt;span class="string"&gt;"&amp;lt;p&amp;gt;&amp;lt;a href=\"/\"&amp;gt;play again&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;"&lt;/span&gt;))
          (:p
           ((:a &lt;span class="builtin"&gt;:href&lt;/span&gt; &lt;span class="string"&gt;"/static/tictactoe.lisp"&lt;/span&gt;) &lt;span class="string"&gt;"source code"&lt;/span&gt;))))))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;triples&lt;/span&gt; (set)
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((result nil))
    (&lt;a href="http://lispdoc.com/?q=dolist"&gt;dolist&lt;/a&gt; (i set result)
      (&lt;a href="http://lispdoc.com/?q=dolist"&gt;dolist&lt;/a&gt; (j set)
        (&lt;a href="http://lispdoc.com/?q=dolist"&gt;dolist&lt;/a&gt; (k set)
          (&lt;a href="http://lispdoc.com/?q=unless"&gt;unless&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=or"&gt;or&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=equal"&gt;equal&lt;/a&gt; i j) (&lt;a href="http://lispdoc.com/?q=equal"&gt;equal&lt;/a&gt; j k) (&lt;a href="http://lispdoc.com/?q=equal"&gt;equal&lt;/a&gt; i k))
            (&lt;a href="http://lispdoc.com/?q=push"&gt;push&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=list"&gt;list&lt;/a&gt; i j k) result)))))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;game-is-won&lt;/span&gt; ()
  (&lt;a href="http://lispdoc.com/?q=or"&gt;or&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=some"&gt;some&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=lambda"&gt;lambda&lt;/a&gt; (triple) (&lt;a href="http://lispdoc.com/?q=%3D"&gt;=&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=apply"&gt;apply&lt;/a&gt; #'+ triple) 15))
            (triples &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;))
      (&lt;a href="http://lispdoc.com/?q=some"&gt;some&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=lambda"&gt;lambda&lt;/a&gt; (triple) (&lt;a href="http://lispdoc.com/?q=%3D"&gt;=&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=apply"&gt;apply&lt;/a&gt; #'+ triple) 15))
            (triples &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt;))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;is-winner&lt;/span&gt; (digit)
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((&lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt; (cons digit &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)))
    (game-is-won)))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;is-blocker&lt;/span&gt; (digit)
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((&lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt; (cons digit &lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt;)))
    (game-is-won)))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;is-fork&lt;/span&gt; (digit)
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((&lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt; (cons digit &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)))
    (&lt;a href="http://lispdoc.com/?q=some"&gt;some&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=lambda"&gt;lambda&lt;/a&gt; (next) (is-winner next))
          (&lt;a href="http://lispdoc.com/?q=remove"&gt;remove&lt;/a&gt; digit &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;is-fork-blocker&lt;/span&gt; (digit)
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((&lt;span class="variable-name"&gt;*human-digits*&lt;/span&gt; (cons digit &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)))
    (&lt;a href="http://lispdoc.com/?q=some"&gt;some&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=lambda"&gt;lambda&lt;/a&gt; (next) (is-winner next))
          (&lt;a href="http://lispdoc.com/?q=remove"&gt;remove&lt;/a&gt; digit &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;))))

(&lt;a href="http://lispdoc.com/?q=defun"&gt;defun&lt;/a&gt; &lt;span class="function-name"&gt;make-next-move&lt;/span&gt; ()
  (&lt;a href="http://lispdoc.com/?q=let"&gt;let&lt;/a&gt; ((winner (find-if #'identity &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; &lt;span class="builtin"&gt;:key&lt;/span&gt; #'is-winner))
        (blocker (find-if #'identity &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; &lt;span class="builtin"&gt;:key&lt;/span&gt; #'is-blocker))
        (fork (find-if #'identity &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; &lt;span class="builtin"&gt;:key&lt;/span&gt; #'is-fork))
        (fork-blocker (find-if #'identity &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; &lt;span class="builtin"&gt;:key&lt;/span&gt; #'is-fork-blocker))
        (center (first (member 5 &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;))))
    (&lt;a href="http://lispdoc.com/?q=dolist"&gt;dolist&lt;/a&gt; (x (&lt;a href="http://lispdoc.com/?q=remove"&gt;remove&lt;/a&gt; nil (&lt;a href="http://lispdoc.com/?q=list"&gt;list&lt;/a&gt; winner blocker fork fork-blocker center (&lt;a href="http://lispdoc.com/?q=first"&gt;first&lt;/a&gt; &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;))))
      (&lt;a href="http://lispdoc.com/?q=when"&gt;when&lt;/a&gt; x
        (&lt;a href="http://lispdoc.com/?q=push"&gt;push&lt;/a&gt; x &lt;span class="variable-name"&gt;*computer-digits*&lt;/span&gt;)
        (&lt;a href="http://lispdoc.com/?q=setf"&gt;setf&lt;/a&gt; &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt; (&lt;a href="http://lispdoc.com/?q=remove"&gt;remove&lt;/a&gt; x &lt;span class="variable-name"&gt;*remaining-digits*&lt;/span&gt;))
        (&lt;a href="http://lispdoc.com/?q=return-from"&gt;return-from&lt;/a&gt; make-next-move x)))))
&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:34008</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/34008.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=34008"/>
    <title>User registration</title>
    <published>2007-07-27T16:54:35Z</published>
    <updated>2007-07-27T16:54:35Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <category term="clutu"/>
    <content type="html">I just added optional user registration to my &lt;a href="http://clutu.com/"&gt;crossword game&lt;/a&gt;, clutu.&lt;br /&gt;&lt;br /&gt;Right now, registering a username does nothing other than reserving a name that nobody else can use.  Once I'm sure the code is solid I'll add some more interesting features.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:abstractstuff:33631</id>
    <link rel="alternate" type="text/html" href="http://abstractstuff.livejournal.com/33631.html"/>
    <link rel="self" type="text/xml" href="http://abstractstuff.livejournal.com/data/atom/?itemid=33631"/>
    <title>FORMAT is awesome</title>
    <published>2007-07-25T16:16:52Z</published>
    <updated>2007-07-25T16:19:39Z</updated>
    <category term="computers"/>
    <category term="lisp"/>
    <category term="clutu"/>
    <content type="html">I love Common Lisp's &lt;code&gt;FORMAT&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Here's a snippet of code from the &lt;a href="http://clutu.com/"&gt;crossword&lt;/a&gt; site I've been working on.  This gets invoked after you press the "check" button and clutu has identified any words that are filled-in wrong:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(&lt;a href="http://lispdoc.com/?q=push"&gt;push&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=list"&gt;list&lt;/a&gt; &lt;span class="string"&gt;"clutu"&lt;/span&gt;
	    (&lt;a href="http://lispdoc.com/?q=if"&gt;if&lt;/a&gt; wrong
		(&lt;a href="http://lispdoc.com/?q=format"&gt;format&lt;/a&gt; nil &lt;span class="string"&gt;"~{~#[~;~a~;~a and ~a~:;~@{~a~#[~;, and ~:;, ~]~}~]~} ~[is~:;are~] wrong"&lt;/span&gt;
			(&lt;a href="http://lispdoc.com/?q=reverse"&gt;reverse&lt;/a&gt; wrong)
			(&lt;a href="http://lispdoc.com/?q=1-"&gt;1-&lt;/a&gt; (&lt;a href="http://lispdoc.com/?q=length"&gt;length&lt;/a&gt; wrong)))
		&lt;span class="string"&gt;"everything is ok"&lt;/span&gt;))
      (chat-of game))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It produces output (in the chat pane) like "clutu: 13 across and 4 down are wrong".&lt;br /&gt;&lt;br /&gt;I think I started by grabbing an example from &lt;a href="http://www.gigamonkeys.com/book/"&gt;Peter's book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Format is one of the things that looked scary when I first came to Common Lisp, but now I hate to do without when I'm using some lesser language.</content>
  </entry>
</feed>
