Technomadic

Thursday, the 18th of September

Riding to Cure MS

Filed under: — Greg @ 07:33

In a few weeks (Oct. 5), I will once again be riding in the MS Bike Tour in New York. I’ll be riding 60 miles through Manhattan with Diana, my dad, and my brothers. The goal is for 5,000 riders to raise $3 million (that’s an average of $600 per rider) to fund research and services to treat people who have MS. Please help us reach this goal by donating at my page. Visit The National MS Society to find out more.

Thanks for your support.

Monday, the 23rd of June

Frustrated with Climbing Ratings

Filed under: — Greg @ 09:21

So, as everyone says, it’s hard to transpose ratings from one climbing area to another. I’m working on a solution to that, but in the meantime I figured it’d be good to jot down some relative weightings. There aren’t too many places I’ve climbed regularly, but here’s a simple chart to compare them. If you have climbed at one of these and have additional gyms to add to the comparison, please let me know.

MetrorockVertical WordPlanet Granite
Everett, MASeattle, WASunnyvale, CA
0+3+2

All ratings are relative to the hardest rated gym. EG, if the hardest rated gym (which has rating “0″) rates a route a 5.7, a gym rated “+2″ would likely call that same route a 5.9. Likewise, a 5.10b at the hardest gym would probably be a 5.10c at a gym rated “+1″.

Wednesday, the 5th of March

In case you thought Lisp was dead …

Filed under: — Greg @ 21:05

Two days ago I went to the largest usergroup meeting of any kind I have ever seen. It was the Boston Lisp Meeting (although it should be called the Cambridge Lisp Meeting, IMO). There were about 40 people in attendance, and when I left (at 22:00, four hours after my arrival), it still rivaled any usergroup in size.

With 40 people, the sitting-around-a-table-drinking-beer format is perhaps not the most effective. Sure, there is plenty of conversation to be a part of, but any single participant necessarily misses the majority of what’s going on. So, I apologize at the beginning that this can not be a comprehensive report, but rather an experiential summary of what I observed that fateful evening.

I showed up at 18:00, with probably over twenty people bulging from a single long table. Almost everyone who came after me ended up filling a second table. I took note of a few big names right off the bat (from #lisp and elsewhere): Rahul Jain (who traveled from New York) had come with me, and certainly Faré (our great organizer) was already there. Jeremy Jones (a founder of Clozure) and James Knight (foom) were also there before me. Alistair Bridgewater (aka, nyef) trekked down from New Hampshire, but I think Hans Hübner won the longest-distance award, having come all the way from Berlin. Ok, this list is getting crazy … there were also other well-known lispers in attendance. Gary King was supposed to have been there, but I didn’t see (or perhaps recognize) him. Both Zach Beane and dto had to miss because of transportation issues, which was quite disappointing.

I was afraid the group would be dominated by ITA employees, but I think they made up maybe a quarter of the entire group. None of the guys near me at the beginning were ITA employees, in fact, I think they were all Lisp hobbyists. As a result, there is always plenty of discussion about how to go about making Lisp your profession, which is a topic I do like to talk about. One of my favorite questions was “If you get to write Lisp at work all day, do you work in other languages when you get home?” The answer is pretty much “no” … at least, I don’t play with other languages any more than I did before I was writing Lisp professionally.

Later on in the night I moved around the table to see what was happening at Faré’s end. There seemed to be a lot of discussion about when meetings should be held, and how to organize them, etc., which is great to hear. We’ll be moving to a more presentation-oriented format, and I’m sure Faré will have all the details about future meetings sent around soon. There was an XO laptop that got passed around so everyone could enter in their contact information and how they would like to be involved with future mettings. So there ended up being a bit of discussion about the XOs, and who managed to get one (like me) and who didn’t.

Toward the end of the night, I got around the table to talk with Rahul and another of my co-workers, and had the chance to finally meet Alistair. Unfortunately, I had to leave shortly after we began talking … and he will be farther away than NH for the next few months because of various contracts he’s working on. Hopefully he’ll come to meetings when he’s back in the region.

I know … there’s not much Lisp content in this post. Honestly, it’s hard to remember exactly what was discussed. The meeting was great for getting to know more Lispers, and there was plenty of Lisp talk, but my focus at the time was more on having a good time (and some beers) with people that I have a lot in common with. There will be plenty of in-depth Lisp-hackery at future presentation-based meetings. For now I’m just excited about there being so many people here who are interested in it.

Tuesday, the 26th of February

Continuing about restarts

Filed under: — Greg @ 21:50

Update: these changes (along with an additional one for unbound slots) are now available in the CCL repo: http://svn.clozure.com/publicsvn/openmcl/trunk/<os><arch>/ccl

When I read Geoff Wozniak’s post (I know, I’m a week behind) I was disappointed to see Clozure CL wasn’t even taken into account. I decided to check it out for myself. Initially, I was a bit disappointed, but after only a couple minutes of hacking, I managed to improve the situation a bit.

Situation Lisp implementations
Allegro CL Lispworks SBCL CLISP Clozure CL
No function defined -
Failed function lookup - - -
No class found - -
Division by zero - - - -
No method found -
No slot found - - -
Replace function with generic function -
Redefine a generic function - - 1

1 The existing code handled a defmethod followed by a defmethod with an incompatible lambda-list, but not a defmethod followed by a defgeneric with an incompatible lambda-list.

Initially (the black) we could claim superiority only to SBCL [Ed: just kidding, guys], but after my changes (in red) we’re now on par with Allegro. And Open Source. The squeaky wheel and all that. Thanks to Geoff for pointing out the issue.

Note: these changes currently exist only on my own box. I’ll get them into CCL 1.2, though.

Monday, the 25th of February

Boston Lisp Meeting

Filed under: — Greg @ 21:37

It’s been about four months since I last posted, which is really unacceptable. I feel like I have to jump on the bandwagon with this announcement, though, and maybe it’ll get me back on track.

Next Monday (3 March 2008), is the inaugural Boston Lisp Meeting. Judging by talk around the office and in the community at large, it sounds like it’ll be well-attended. If you know any lispers, send them along. If you want to get to know some, come along yourself.

Sunday, the 21st of October

automated testing with CL & darcs

Filed under: — Greg @ 18:41

I spent a good chunk of today trying to get darcs to run my unit tests automatically. I haven’t actually gotten it right yet, but at least I have it running the tests before each commit (even if the commit happens regardless).

I set up the auto-testing with darcs setpref test &#8220;chmod +x test/run-tests; test/run-tests". test/run-tests is the test script, but darcs doesn’t allow you to add executable files to the repository, so you have to run chmod on the script before it can actually be executed.

Here’s the test script itself:

#!/usr/bin/env sbcl --noinform

;;; This requires that you have SBCL installed and set up to run
;;; scripts, as defined in
;;; http://www.sbcl.org/manual/Unix_002dstyle-Command-Line-Protocol.html

(require 'asdf)

;; need this on the front to make sure we use the right copy
(push *default-pathname-defaults* asdf:*central-registry*)

(asdf:oos 'asdf:load-op 'bordeaux-threads)
(asdf:oos 'asdf:load-op 'bordeaux-threads-test)

(let ((results (bordeaux-threads-test:run-tests)))
  (sb-ext:quit
   :unix-status (if (or (failures results) (errors results)) -1 0)))

What it should be doing is running the tests, and returning non-zero on failure. It runs the tests, but the failure bit isn’t exactly happening yet.

I figured I’d throw this out there and see if anyone else has a decent way of getting automated testing happening. The more I try to bridge between Lisp and Unix, the more I just want to live in a Lisp REPL.

Thursday, the 11th of October

Riding for a Cure

Filed under: — Greg @ 20:24

This Sunday (Oct 14), I’m going to be riding in the MS Bike Tour through New York. If you know someone with multiple sclerosis, you know what a horrible process it can be. The symptoms are random and often each is seriously debilitating on its own. There are also “good days”, when all the symptoms seem to go away, and the victim is given a brief reminder of what they’ve lost.

Please help make a difference by donating to support research toward treatment and a cure.

Thursday, the 4th of October

Excuse our mess

Filed under: — Greg @ 16:33

I just mostly-finished moving my blog to a new hosting company. There are still plenty of broken bits, but at least we’re up-and-running. Hopefully I’ll get the rest ironed out over the next few days.

Wednesday, the 26th of September

Remote Book Storage

Filed under: — Greg @ 14:56

Thanks to Casey, I’ve rediscovered the library. While it would be great to have a Netflix-like hold system, I’m already pretty happy with how far libraries have come since I was in elementary school (the last time I really used them). There’s a library two blocks away from me. I can request any book available in most of the Boston suburbs online, and it will be sent to the library that is just a minute away from my house. It operates about as quickly as Amazon’s Prime shipping (as long as you don’t care exactly which book shows up), and you don’t need to find space for more stuff in your house. I’m also a member of the Boston library, in case I need anything that the Minuteman Network can’t provide.

Libraries are particularly good for read-once books, like fiction. So I should be able to get rid of most of my fiction books no problem, right? I think they can be broken down into a few categories. I have books that

  1. are valuable in-and-of themselves (first editions, etc.),
  2. I actually refer back to often enough that it’s worth having a copy on-hand,
  3. are involved enough to require study and commitment over longer-than-library-loan periods (like Finnegan’s Wake)
  4. I keep around for nostalgia,
  5. I keep as a record of what I’ve read, and
  6. I keep as a list of things to read.

The first three groups are small and justifiable. The fourth and fifth can be replaced by some sort of “what I’ve read” list, like those available on Facebook or any number of other places. The sixth is just me looking for stuff to buy on Amazon, I guess. Things I’m interested enough in to queue up on a shelf.

I think the sixth group is actually detrimental. There’s no urgency in having to read them. They’ll always be on that shelf, and I can postpone them indefinitely. I think the three-week deadline of library books will keep me from postponing them as well as help me avoid the paradox of choice. It’ll be weird getting rid of books I haven’t read yet, but I think it’ll be the biggest help to make me actually read more.

Thursday, the 20th of September

Getting rid of books

Filed under: — Greg @ 13:10

I have way too many books. This picture is about half what I had before I moved. I managed to get rid of a bunch. However, that was more of an emergency culling. Now I have to go through the tough process of parting with books I actually care about. Being a GTDer, I broke it down a bit. I have to ?

(more…)

Wednesday, the 19th of September

Say “No” to Comment Spam

Filed under: — Greg @ 08:30

I think I got rid of comment spam. We’ll see. I had hundreds of thousands of them just sitting in the database. I made two simple changes. The first was adding a simple required checkbox in the comment form. This might not be enough, I don’t know. If it’s not, I can change it to a text box that requires specific text or something, but the checkbox is simpler for the user, so I want to see if that suffices.

The other change I’m less happy about. I turned off trackbacks for now. I’ll have to get those back on, but it’ll probably be a while. Basically, my site runs off of WordPress -2.0 or something. None of the modern spam removing stuff works on it. I should upgrade at some point, but meh.

Anyway, this means that comments will probably appear on the site in a more timely fashion. I’m still moderating them, but with the spam gone I won’t be ignoring them anymore. Also, if this actually turns out to work, I’ll get rid of the moderation.

Sunday, the 5th of August

Harder, Better, Faster, Higher

Filed under: — Greg @ 14:29

Today was another great day of climbing, with us doing 27 routes in 2 hours and 15 minutes. Which somehow is exactly 5 minutes per route. We basically did the same as last time, but added some triple climbs, and I even did a quadruple at the end (ok, it was a 5.7, but it was fun).

I’m actually surprised we climbed faster than last time, because I think we did some harder routes. I definitely spent more time on a few of them, but I guess the triples canceled that out ? and then some.

Our motivation for climbing faster is that Diana is super-busy studying for her MIT quals every day. We can’t take long leisurely trips to the gym for a while. Also, it’s a 1-hour commute to the gym as well, so that eats up a lot of the time. Of course, we’re not going to stop climbing, but something had to change. We needed to squeeze in enough climbing to make the trip worthwhile, but not cause Diana to lose too much studying time. So far it has worked out great.

The only really frustrating thing about climbing to me is that it means I have to cut my fingernails. That plays hell with the classical guitar stuff. Not that I really play anymore, but I still like to sit down and relax with the guitar sometimes. Does anyone have any recommendations for climbing + guitar? I’ve never tried fingerpicks, but they seem like they would suck compared to my natural fingernails. I suppose it’s my only option, though.

Wednesday, the 1st of August

Fast Ascent

Filed under: — Greg @ 21:39

Diana and I spent a few hours climbing today. We both have a lot of other things to get done, so we didn’t want to be at the gym for too long. In the 2 hours and 20 minutes between the first and last climb, we made 26 ascents between us. That’s 5:23 per climb, or a bit faster than 11 climbs/hour. Granted, it’s probably not setting any speed records, but when you realize that includes tying and untying between routes, looking for routes to do, waiting for other people to get out of the way, etc., it looks pretty good. It’s definitely better than I’ve ever done in the past.

Here’s how we did it:

  • do multiple climbs once you tie in ? either repeat the route or do different routes on the same rope (not only does it save time, but it helps with the endurance you need for longer outdoor climbs);
  • pick easier routes that allow you to focus on technique, rather than ones at your limit where you flail for each hold;
  • make a point of having someone on the wall as much as possible ? a quick review of key moves is good, but the chalking, drinking and tying should all be happening at the same time; and
  • just climb faster ? make yourself move a bit faster than you’re comfortable with (but not too fast to climb well), it’ll help you connect the moves more fluidly.

You might think that it sounds a bit draconian, but we both had a lot of fun. I’m sure everyone has had that day at the gym where a lot of time was lost on the ground ? you leave feeling like you spent too much time not climbing enough. The reason you’re there is to climb, presumably because you enjoy it. Maximize that enjoyment and have an exciting 2-hour trip rather than a drawn-out yawn fest on the mats.

Also, if you spend too much time off the rock between climbs, your muscles cool. You’ll end up tired after less wall time. Tonight was a good workout, staying just below a pump with a lot of fun technical moves.

Tuesday, the 24th of July

What the iPhone earbuds don’t do

Filed under: — Greg @ 07:02

when plugged into my MacBook:

  • pause/play iTunes,
  • accept/close voice chats, and
  • work as a microphone at all.

Also the A/V 1/8″->RCA cable that I got for my old iPod and iBook doesn’t transmit video when plugged into the MacBook. It also doesn’t even plug into the iPhone. It was one of my favorite accessories, but now the yellow plug just dangles uselessly as a reminder of what once was.

Apple’s overall impressive level of integration and convergence just makes their misses all the more glaring.

Saturday, the 7th of July

Boston Rocks

Filed under: — Greg @ 15:55

The longer I wait between posts, the harder it gets to post, so here’s an easy one to break the silence.

I’m in Boston and loving it. The weather’s a bit hot, but my new apartment is amazing as is the fact that I’m in the same town as my girlfriend again.

I’ve been climbing a lot again (after taking a while off while dealing with moving, etc.). The gym here isn’t bad, but ? despite the rave reviews ? it’s a distant third (at least) on my list. Number two is the Seattle Vertical World, where I’ve been a member for the past six months. Vertical World was for a long time the gym I rated all others by. It has incredible route density and variety. The routes are also fairly consistently graded. Recently I spent a day at Planet Granite in Sunnvale, California. That gym re-set the standard. They have indoor routes up to 85′ and four or five different indoor cracks. They also have great outdoor bouldering and climbing. The routes aren’t nearly as dense as they are at Vertical World (which is a shortcoming I’ve noticed at every gym), but there are so many ropes you don’t notice very often.

Anyway, the gym here … It’s MetroRock. I have a lot of fun there, but the routes are rated all over the place. Some of the 5.8 routes are as hard as some of the 5.10a routes. There are plenty of 5.9+ routes that are easier than 5.8s, but if you kind of average out the mis-ratings, it seems like the routes are two levels harder than they are rated. This makes a bunch of the training exercises much harder than they should be. When I’m doing a traverse or other aerobic stuff, I should end up tired ? not wishing my fingers could crimp just a few more times. And what’s with “5.9+"? Is the current rating scheme not fine-grained enough? I mean, I could see adding in-betweens if your consistency was through the roof, but when you can’t tell the difference between a 5.8 and a 5.10a? Not a chance. And there are other more confusing ratings, like “5.10-” and “5.10+". Do those map to “easier than 5.10a” and “harder than 5.10d", respectively? Or is a “-” like “5.10a/b” and a “+” like “5.10c/d"? Why make up ratings?

Of course, this ranting doesn’t change the fact that I like the gym. I had a fun time with a couple of more experienced boulderers helping me through a V2 when I was there yesterday. It’s just that I’m used to climbing in what is apparently one of the premier gyms in at least the US, and it’s a bit frustrating to move to one that is merely great.

In a couple months I’ll probably be taking a trip up to the family get-away in Maine. It’s not far from the Mt Washington Valley in New Hampshire, so I’m preparing myself to conquer Cathedral Ledge. Taking into account the variances in rating here, I’m working on red pointing the 5.10a routes. In Seattle I was on-sighting many of the 5.10a and red pointing the 5.10b. Hopefully I’ll pull myself up one 5.10c here before September hits.

Ok, that was a big brain dump. I need to do more of those. Sorry for the extended silence. I’m sure most of you had no interest in my climbing progression. Maybe the next one will interest more people. Although, if you’re not interested in the climbing stuff, my guess is you just haven’t tried it. Look up a local gym and drag a couple friends along. In fact, if I’m coming through your area ever, make sure to drag me along.

Saturday, the 7th of April

Integration is the Sincerest Form of Flattery

Filed under: — Greg @ 14:18

A while ago, Paul Graham blogged about not competing with Google. He mentioned how Google Calendar crushed other calendering apps because of ?Google Calendar’s integration with Gmail. The Kikos can’t very well write their own Gmail to compete.? And he actually concludes that ?the best solution for most startup founders would probably be to stay out of Google’s way.?

I think he’s right that integration was a major factor, but wrong in his evaluation of how to survive. Kiko doesn’t need to write their own mail app to integrate with, they just need some mail app to integrate with. All of these ?Web 2.0? guys need to think a bit more about the Unix idea of ?small, sharp tools?, and not re-implement social networking with each new feature.

I’ve been toying with a little Web app of my own and while I knew it needed some social networking, I also knew that I wasn’t going to waste time writing it. I’m going to piggy-back on Facebook. They have a nice API that other sites (like Bill Monk) are already capitalizing on. I’m not going to write my own e-commerce engine, either, I’m just going to use Amazon’s APIs.

To a startup, time is precious. You can’t throw away months re-implementing something that isn’t pushing boundaries. You just need to find someone who already did, and hop on for the ride. Don’t get caught in the pride of thinking you can do it better than them. If that’s true, you can prove it once you have a couple dozen employees and pretty solid ground, not when you need to make every hour count.

So, please, create a tool, give it a good API, and let the mashups take over. Being connected to everything is your best chance of survival.

Sunday, the 18th of March

Twittering

Filed under: — Greg @ 12:01

For those who haven’t seen it yet, Twitter is a sort of micro-blogging broadcast tool that is apparently the next big meme. I haven’t really bought into it yet, but I do have an account. If you’ve got a Mac, the Twitterrific application makes it much more usable.

So far it’s kind of cool. Less intrusive than IM, easy to shoot off links you want to share, or to say “I’m heading to lunch at Sucre et Salay, who’s coming?” We’ll see if it catches on. With messages limited to 160 chars, I don’t see it replacing blogging anytime soon.

Thursday, the 16th of November

Releases 1.1.0

Filed under: — Greg @ 23:08

Yesterday’s post was perhaps a bit off the cuff. There were a lot of people really scared about my script, and I don’t blame them. A lot of good points were brought up. It’s not that I didn’t consider them, it’s just that they’re already taken into account with how I do revision control. At least Luis had faith in me :)

Below is an example of how I tend to organize a project (my pre-1.0 releases are a bit different, so I’m just leaving them out for the moment). There are effectively two kinds of tags, fixed (in black) and mobile (in red).

Notice that all the fixed tags are three-number versions. This means that if you request my-library_1.1.1.tar.gz, you’re going to get that same code point all the time. However, you probably don’t want to do that …

(more…)

pre-Released

Filed under: — Greg @ 01:00

Quick followup to my last post before I go to sleep. Here’s a partial and buggy implementation for CVS and darcs. Yay. Maybe it’ll get better tomorrow.


(defun retrieve-release (filename)
  (multiple-value-bind (project branch archive-type) (parse-filename filename)
    (let ((working-dir (format nil "~a_~a" project branch)))
      (ecase *repository-type*
        (cvs
         (run-program "cvs"
                      (list "-d" *repository*
                            "co" "-r" branch "-d" working-dir project)
                      :wait t))
        (darcs
         (run-program "darcs"
                      (list "get"
                            "--tag" branch
                            (format nil "~a/~a" *repository* project)
                            working-dir)
                      :wait t)))
      (ecase archive-type
        (tar-gz (run-program "tar" (list "-czf" filename working-dir)
                             :wait t))
        (tar-bz2 (run-program "tar" (list "-cjf" filename working-dir)
                              :wait t)))
      (slurp-file filename))))

(defun parse-filename (filename)
  (destructuring-bind (remainder &rest archive-type)
      (cl-ppcre:split "." filename)
    (destructuring-bind (project branch) (cl-ppcre:split "_" remainder)
      (values project
              branch
              (intern (string-upcase (format nil "~{~a~^-~}" archive-type)))))))

Wednesday, the 15th of November

Breathe in … and Release

Filed under: — Greg @ 22:41

I wouldn’t say I disagree with Jack Unrue’s statement about releases being necessary, but I think there’s a way to make both groups happy (and maybe I should just get around to implementing it). If the no-release crowd thinks that we don’t need to indicate functionality changes in some way, there’s still an impasse. If that’s not the case, I may have a solution.

We all know that a URL doesn’t have to point to a file, so what if http://example.com/releases/my-library_0.3.4.tar.gz created the archive on the fly? It would be built from the “my-library” repository, using the tip of the “0.3.4? branch, using tar -cz (if the user had typed “.tar.bz2″ on the end, it would have used tar -cj). You can, of course, cache the archive (just check to make sure there are no new commits since the last build).

What are the benefits of this? Well, the developers don’t need to explicitly build release packages. Also, any bug fixes that get merged into the branch are included whenever the next person requests that archive. It gives the user the same interface that they’re used to. It works fine with ASDF, etc. (as long as you remember to set the latest tag on your current branch).

Actually, this may work better as a commit hook than being pull-based. This should be pretty trivial to build for any specific source control system. Maybe it’s my project for this evening.

Powered by WordPress