Content from 2008-10

Now we're cooking with gas...

posted on 2008-10-26 05:23:37

As a word of warning, my blog may be a bit flooded with good old "linkposts" for the next few days. The biggest reason for that is I had a few old sessionstore.js files laying around that I had saved for one reason or another with good links in them. The other main motivation is that I'll actually refer back to stuff I post and/or link to in here as opposed to losing it forever. So...just thought I'd warn you in advance.

I've enjoyed trying to pick up cooking a thing or two since living on my own and I'm no master chef but I'm slowly getting a bit better. Perhaps unfortunately, I've been indulging in my darker side lately though and trying to perfect a Fried Chicken Recipe. I'm trying to come up with a good almagation by experimenting with 3 separate recipes:
One, Two and Three.

The last recipe (from Google's former chef) is particularly tricky because it's industrial-sized (30 cases of free-range chicken) and uses every spice known to man. I haven't quite gotten around to converting the measurements for our portions and figuring out how much money I'd sink into a spice rack. At least the second time I made chicken was considerably better than the first. I'll take slow but steady progress.

I think next I'd like to make a Chicken Caprese. Sonya made one that was lovely back when we were dating and I've poked around for some recipes but haven't found anything quite equivalent. I remember she served it over pasta (maybe with a mushroom cream sauce). I'll probably just ask Sonya for her recipe.

I know that Teresa and I are cooking at her parents for Thanksgiving. We rather foolishly requested the task. :-) Hey, if people pay, we'll cook. At any rate, I'm planning on deviating from Turkey and running with my mother's classic Pork Tenderloin for the main course. At some point on the trip though I'm hoping to try out Pioneer Woman's Chocolate Chip Cookies and Cinnamon Rolls recipes. I already made the Blueberry Muffins and they were lovely. Pretty much everything on her site looks fantastic. Maybe it's because she starts most recipes with a stick or two of butter. *sigh* My death approaches.

I also have some recipes for Tiropetes (cheese mixture wrappred in filo bread...mmm) and Greek Meatballs that I need to try in the near future. It'd be nice to pick up homemade hummus and spanokopitta as well. Then all I would need to throw a Mediterranean cook-off at my house would be a good kebab recipe. Any pointers?

I'm also torn between two Pho Ga (Vietnamese Chicken Noodle soup, I swear by it) recipes and interested in grabbing a samosa recipe or two but they're rather abundant. A Thai Peanut Noodle recipe wouldn't hurt either. But I'll probably stick to Saigon Cafe and Rose of India for the time being to be honest. Other than that I just want to cook a Peppercorn New York Strip and bribe Dusty into handing over his French Onion Soup recipe. I tried one that was decent but it didn't quite knock me on my ass like his. I'll keep working on it.

Also, I now know I'm truly far into Linux nerd territory becuase I don't give a damn about the Gnome and Ubuntu discussions about how to envision a next-generation desktop and be competitive with Apple when it comes to user friendliness. First I had to explain to my Windows friends that I didn't care about playing video games anymore. Then I had to explain to my Mac OS friends that I appreciated control, freedom, tinkerability and programming potential to aesthetics. Now I'll have to explain to the Ubuntu people that I just want a command prompt, a tiling window manager and some package repos. :-)

Lusting for a Laptop: Lenovo the Liberator?

posted on 2008-10-24 06:02:36

Trust your Technolust

I promised to go into more detail about this yesterday and I meant it. I called my good friend Kris earlier today and filled him on my plans. Hardware purchasing plans, that is, assuming I go back to school. Kris and I are in agreement that purchasing and/or assembling new hardware is one of the most exciting and fun things in the world. It's good old technolust at work. Part of why it's exciting for me is that I only make computer purchases every 4 or 5 years and for the most part I manage to not care about hardware outside that time period.

Now, I have gotten a $300 laptop off eBay and an LCD in the past two years but that's not what I'm talking about. My personal computer (the desktop) which I hand-built back in the summer before my Freshman year of college is what I'm talking about. Any self-respecting nerd has a primary computer which stands above the rest. That's what I'm talking about. Anytime you think of replacing that you have the freedom to dream. My needs and desires have changed a lot between now and then though.

Then I wanted a powerful computer that could play games and do anything else I wanted. As much as was possible with the $1,500 or so dollars I had available anyway. That largely meant a desktop. These days I want something lightweight with excellent battery life. Something portable. Something which is great for running Linux and playing with code but future proof as well that could replace my aging desktop at home. Now, as I've mentioned before the desktop appears to be in great shape and is plenty powerful enough but it certainly isn't mobile and you never know when hardware might start failing. The laptop I have now is alright but...well, the wireless only works on unsecured networks in Linux and the battery life tops out at around 45 minutes. Some of that could be worked around but it's less than ideal for the commuting programmer student I'll hopefully be come January.

I've been aware of this desire for about a year now. The desire to rid myself of the desktop (or at least relegate it to server duties) and get some better mobile hardware. So I've been keeping my eyes on the laptop market. In that time only 8 machines have caught my eye and only 1 is really a reasonable option. The 8 machines I considered were the System76 Darter Ultra, the ZaReason UltraLap SR, the Dell XPS M1330, the Lenovo X200, the Lenovo X300, the Lenovo X301, the Dell Latitude E4200 and the Dell Latitude E4300. What I needed was a laptop which had A) weight under 4 lbs and battery life in excess of 5 hours, B) an Solid State Drive option, C) LED Backlighting (again at least optionally), C) good Linux support (in-kernel graphics, sound and wireless drivers, preferably working suspend/resume), D) a docking option and E) preferably some sort of next-gen AV out option whether HDMI or DisplayPort.

At first, I forgot I'd need a dock. The Darter, the UltraLap and the XPS M1330 were quick considerations because they have Ubuntu pre-installed and the hardware works brilliantly. They're also quite affordable. The Darter lacks an SSD option but the warrantied isn't voided by buying an aftermarket SSD and installing it and it's otherwise excellent and very cheap. The UltraLap is a bit heavy and short on the battery life but otherwise good. None of them have a docking option though and none of them have HDMI or DisplayPort out.

Of the remainder, only the Latitudes and the X200 have docking stations. The X300 and X301 have many positive qualities, meet every other requirement (except maybe the HDMI/DisplayPort) and at least the X300 is reasonably affordable compared to the Latitudes. The closer I got to really needing to make a decision though the more I realized the docking station was a real deal breaker. If this thing is going to replace my desktop at home I want to be able to walk in the door, drop it on the dock and get to work with the keyboard, mouse, LCD setup at my desk, no questions asked.

The Latitudes, for their part, just came out and (consequently) are just too damn expensive. They also don't have any kind of option to ship without an optical drive which (let's be honest) I (and probably you) would only use to install the Operating System (if you do that) and load a few applications. There's a USB CD-ROM in the Oglethorpe computer lab I can use for that. The X200 does have such an option though and it is the X200 I will happily get assuming I'm accepted to SPSU and get some student loans taken out. Besides this tiny little 12 incher weighs 3.5 lbs with the largest battery you can get for it and people have used it unplugged in excess of 8 hours! It's not quite as thing as the Macbook Air but it's close and almost as lightweight (with the extended battery).

Sexy, Sexy Laptop

The last issue to work out was whether or not to get a SSD included or upgrade it later. There are 2 reasons for that. One being that the SSD option bumps the price up by $830 on the X200. Pretty drastic, right? Additionally, all the kinks aren't quite worked out of SSD drives yet. There are several people I'm aware of that have been very happy with SSD-based laptops for 6-months to a year now (Jeff Atwood and Stephen O'Grady, I'm looking at ya'll) but a Linux filesystems expert whose opinion I trust, Val Henson, has made some stern comments on the matter. Even Linus Torvalds is happy with his but at the X200's $800+ dollar price point I can wait and upgrade later when the hardware is better and the prices are cheaper. For now, I've at least found out the X200 uses a Samsung drive which OCZ sells rebranded on

That's it for tonight. Hardware is always exciting and I hope I get to start hacking on an X200 before New Year's. That said, I've got to get some sleep tonight so that I can get back to hacking tomorrow. I made a list of code projects today among other things and there's plenty to do come morning.

Mercurially Me

posted on 2008-10-23 05:34:39

Something non-techy for starters, Don Gerz has posted three separate entries about Alan Moore's Watchmen in the last week. In two days, actually. And (perhaps due to my prodding) Kris Osterhage threw up a post mentioning his Watchmen experience among other things. It's fun. Maybe I should try to re-read it and write a nice essay before the movie comes out in March.

I haven't been getting quite enough done lately but what else is new. I have been learning some good things and as always there's good stuff coming down the pipe. I've banged out the features I thought my version of hangman was most lacking, a real word-list\dictionary and a fix for a bug I may not have mentioned. If a letter occurred more than once in a word (i.e. "o" in "cook") and was guessed only the first instance of the letter would show up. Those fixes are committed and I'm moving on to things like the cleanup suggestions Xach made and then who knows.

Finishing PCL is probably next on the priority list. I took some crappy notes which I keep telling myself to turn into a "Common Lisp for Schemers" series of articles but I haven't gotten around to it. Maybe because I'll just embarass myself but that's what the internet is for so I'll probably do it anyway. I've also been wanting to finish the Picture Language stuff in SICP 2.2. But whenever I try to load the SICP module in DrScheme my CPU utilisation goes through the roof and it just sits there for a while. Personally, I'm not one for waiting as this seems to happen with any module on PLaneT. It's probably just me though and I'm willing to look into it more later. There are some .scm files for MIT-Scheme on the SICP site and I'm still considering what to do.

Also, I've been peeking at Scheme implementations again. I'm still fond of the massive concurrency option of Gambit/Termite and I like DrScheme for it's strong community and many good features...but my heavens, Chicken Scheme is armed to the teeth with eggs. Is it even for real? That looks like fun to me. Implementation surfing is a dangerous distraction when you should be writing code though. I'll worry more about scheme implementations when I bang out a x86_64 edition of RedLinux before college starts (hopefully in the Spring). I'll write more about that tomorrow but I've been worrying about my upgrade path for a while now and going back to school has brought some of those issues back to the front for me. My laptop positively refuses to get on a secured wireless network. Now, that's probably something to fix with a usb wifi card or something but the battery life is also under an hour. I'll just say I've been thinking about it a lot and come to some conclusions.

Additionally, OOPSLA and Lisp50 just wrapped up. I really wanted to go but I wouldn't have been much more than a fanboy at this point and my funds were limited. Hopefully videos of a few talks and more blogging on the conference will trickle out. The clatter about clojure continues to grow too. It's something worth keeping an eye on no doubt.

Last but not least, more mercurial fun tonight. What you didn't guess from the title? I found two good sources on Mercurial today. The first was a general mercurial guide and the other dealt with emacs integration. On to some quick tips.

Let's assume you forgot to setup your username in .hgrc and you've just fired off the old add-commit. You haven't pushed (and we'll assume no one had the ability to pull) yet so no one has to know about your silly mistake and crazy machine name. Just run hg rollback to eliminate that last commit but be forewarned that you can't rollback a rollback. For simpler cases where you've added, removed or something similar but haven't committed yet just use hg revert. You can also use hg revert filename to undo changes to a particular file.

Also, I'm enjoying using mercurial.el in emacs. Just drop mercurial.el into your emacs/site-lisp directory and (require 'mercurial) into your .emacs file. C-c h s does hg-status and C-c h c will start a commit but allow you to unmark any files you don't want to commit before doing so. C-c h a is hg-add and C-c h U is hg revert, C-x v u being for the current file only. C-c h < works as hg-pull and C-c h u is hg-update. Finally, C-c h > is hg-push. There you have it folks. Mercurial in a paragraph. I'm a bit tired so that's all for tonight. See you tomorrow.

Quick Mercurial Tip

posted on 2008-10-17 19:20:36

I hadn't actually looked into ignoring files with Mercurial until today. You can set up a file in the root of your repository called .hgignore that will make your life a bit easier. Mercurial will read that file (which is a list of patterns in glob or regexp format) and will ignore any files that match those patterns when it does it's versioning work. So, want to ignore anything under the unversioned directory, mercurial configuration files and any temporary files? Here you go:

syntax: glob


Also, there are some great mercurial articles here. I'm also playing around with Zach Beane's ZS3 library. Nice stuff. Also nice is his Common Lisp small project guide. That's damn handy. Unfortunately, all I'm using S3 for at the moment is to store RedLinux (695mb iso) and drakma currently requires loading the full file in memory to upload it with PUT. I guess I'll be keeping an eye on Edi Weitz then. More later...

Hangman's Hope

posted on 2008-10-17 08:02:04

The last week has been really, really hard. Mostly because I've been confronted with something I hoped wouldn't have to happen: The necessity of returning to academia. I've applied to a few more jobs and we'll see what happens there. I got turned down by King & Spalding in a letter today and am going to call tomorrow and ask why. I'm really just not getting enough done on my own to justify being out of school. I'm not learning enough. Perhaps I do need the structure. I'm disappointed but I have to re-evaluate based on my experience. State changes and given my present state I'm looking at returning to SPSU in the Spring or Fall of next of year. There's some notion of transferring to GA Tech as well but I'm not sure what I think about that.

One nice thing about SPSU would be that I'd at least have the spare time to continue pursuing LISP and other personal studies. It's also worth noting that a significant motivation in this year off was to at least get the fundamental concepts of programming down some before being buried in the specifics of the monstrous languages used to instruct most Freshman in Computer Science these days (i.e. Java; pythonistas at Tech, you're lucky).

Anyway, tonight I was frustrated with the fact that I hadn't written any code in a long time and I hadn't written a real program of my own in an even longer time. For one reason or another, implementing Hangman in Common Lisp seemed like a good idea. Now, I'm not claiming that hangman is ever any great feat...except maybe if you write it in BrainFuck. Nor is it any great feat to write it in under a hundred lines. Worse still is that it lacks any ASCII art. That said, I did this in a few hours, found it pretty fun and think it came out fairly readable and concise in the end. After all, how couldn't it? It's hangman.

;; Hangman
;; Brit Butler
;; v.01
;; Feature Ideas: ASCII hangman. Eliminate explicit elt references and other hackish
;; stuff, especially show-letter. Import dictionary in place of *word-list*.

(defparameter *word-list* '("cookies" "kittens" "fairies"
"unicorns" "words" "linux"
"lisp" "music" "songs"
"sex" "love" "fun"
"code" "cease" "and"
"desist" "read" "print"
"eval" "loop" "macro"))

(defparameter *turn-count* '())
(defparameter *letters-picked* '())
(defparameter *word-in-progress* '())
(defparameter *solved-word* '())

(defun hangman ()
(setf *turn-count* 7)
(setf *letters-picked* '())

(defun select-game-type ()
(if (y-or-n-p "Would you prefer to have a word chosen at random?")
(set-the-words (elt *word-list* (random (length *word-list*))))
(set-the-words (string-downcase (read-prompt "Please input your desired word: ")))))

(defun set-the-words (word-of-the-run)
(setf *solved-word* word-of-the-run)
(setf *word-in-progress* (make-array (length word-of-the-run)
:initial-element #\- :element-type 'character))
(format t "~a~%" *word-in-progress*))

(defun read-prompt (query-string)
(format *query-io* query-string)
(read-line *query-io*))

(defun check-letter (letter)
(if (already-picked? letter)
(format t "You already picked that goofball! Try again...~%")
(push letter *letters-picked*))
(cond ((is-in-word? letter) (show-letter letter))
((not (is-in-word? letter)) (decf *turn-count*)
(format t "Nope. Not in there. ~a turns left.~%" *turn-count*))))

(defun is-in-word? (letter &key (start 0))
(position letter *solved-word* :start start))

(defun already-picked? (letter)
(position letter *letters-picked*))

(defun show-letter (letter)
(setf (elt *word-in-progress* (is-in-word? letter)) letter)
(format t "~a~%" *word-in-progress*))

(defun pick-a-letter (&key (message "Pick a letter please: "))
(let ((rtn (read-prompt message)))
(if (> (length rtn) 1)
:message "We only need ONE letter thank you very much. Try again: ")
(check-letter (elt rtn 0)))))

(defun work-on-word ()

(defun word-finished? ()
(if (= *turn-count* 0)
(if (string= *solved-word* *word-in-progress*)
(play-again? "Congratulations.")

(defun game-over ()
(format t "Sorry. The word was ~a.~%" *solved-word*)
(play-again? "You're all out of turns. Game over."))

(defun play-again? (message)
(format t "~a~%" message)
(if (y-or-n-p "Would you like to play again?")
(format t "Thanks for playing!~%")))

Another Emacs/Slime Cheatsheet

posted on 2008-10-12 05:37:04

I've been picking up more and more Emacs and SLIME while working my way through Practical Common Lisp over the last week or two. I'm really happy with it as a work environment at this point but have tons left to learn. I haven't even written any elisp code to script it. Of course, I haven't had a need yet. I'll get there and I'll update this as I learn new things. I'll just note that I'm also quite attached to ArchLinux as my distro and, increasingly, Xmonad as my window manager. It's the first time I've felt really settled on an Operating System/environment since moving to Linux. Maybe ever. I'm pretty happy about it and aside from using RedLinux as a way to see what I like, I've posted all the config files here. Before the cheatsheet here's a quick Linux tip on killing processes I found. Try passing -1 or -9 to kill along with the PID. Try -1 first then -9 if all else fails. On to the cheatsheet.

EDIT: Yes, it's ugly. Piss off. I miss monospaced fonts already, I'm grumpy, I'm tired, it's 1:40 am and I haven't been up this late in forever. I'll fix it later. ;-P

;;Emacs Cheatsheet:

; C-7                         Undo.
; C-8                         Backspace.
; C-s                          I-search forward.
; C-v                          Page-down
; M-v                         Page-up
; M-<                        Beginning of document/file.
; M->                        End of document/file.
; C-l                          Center screen on cursor.
; C-n                         Next-line/Down-arrow
; C-p                         Previous-line/Up-arrow
; M-f                         Forward a word
; M-b                         Backward a word
; M-bksp                    Delete previous word.
; C-k                         Send a line to the kill ring. Cut.
; C-y                         Place a line from the kill ring. Paste.
; C-x C-f                    Find (or create) a file and open it in the buffer.
; C-x C-s                    Save the file in the buffer.
; C-x b                       Switches to a buffer. Type for a specific buffer or hit enter to go with the default (last buffer).
; C-x o                       Moves the cursor between windows.
; C-x 0                       Closes the current window if other windows exist. (Kill this window.)
; C-x 1                       Makes the current window the only window. (Kill all other windows.)
; C-h t                       Start the emacs tutorial.
; C-h k                       Prompts for a keystroke and tells what command it invokes.
; C-h w                      Prompts for a command and describes the keystroke it's bound to.
; C-h b                       Displays a list of bindings to various commands.
; C-u num command   Repeats the given command num times.

;; Slime Cheatsheet:

; M-p                                  Is the up arrow for the slime repl.
; C-c C-c                             Sends an s-expression to slime.
; C-c C-k                             Compile and load the file represented by the current buffer.
; C-C C-L                             Load a file in slime, defaults to the file in the current buffer.
; C-c C-z                              Pulls up the repl in a frame and moves the cursor there.
; C-c RET                             Runs macroexpansion.
; , quit                                 Kills the running inferior-lisp and closes all the SLIME buffers.
; q                                       Leave the debugger and return to the repl.
; M-x Slime-inspect               Run the inspector.
; M-x Slime-profile-package   Run the profiler.
; M-x Slime-profile-report      Check the profiler results.
; M-x Slime-profile-reset        Reset the profiler.

Everything in the World

posted on 2008-10-12 05:08:07

I can't believe it's already October. It seems like only yesterday that I decided to take a break from school. For that matter, it seems like only yesterday that I became unemployed...but this was week 3 and a pleasant week it was. I'm continuing to try and buckle down and be more productive in various ways in spite of the fact that I don't really need money for another month and a half or so. So, what's been going on of late?

The Employment World: My interview with King and Spalding went pretty well. It was very straightforward and none of the technical questions were remotely difficult. By the sound of it, it will also pay more than my last job. That's a good and bad thing. It's good because a decent wage would be nice and my last job wasn't one in my opinion. It's bad because it may be more remedial than my last job. It's a little retroactively upsetting to realize that I'd be paid more here for what sounds like substantially less difficult technical work. We'll see. I also know it'll take a week or two before they let me know whether or not I'm on the list for an in-person interview. Thanks to everyone who asked about it and or wished me well. Devon and Don, I'm looking at ya'll.

The Education World: My friend Will keeps sending me awesome links to research, papers, sites and articles. I also had a fascinating conversation on schools and education with Oglethorpian Chris Latshaw and was reminded why I love Oglethorpe in the process. Conversations like those made the school worth it. I should get around to writing more about all that next week. Also, (to Will) I'm half-way through Practical Common Lisp and hung up on an element of the chat program. I'm being a sissy about e-mailing you questions. I'll write this one off soon, I promise but I'm just trying to wrap a sane Chat UI around the Spread library. I'll send more details soon. Finally, I've downloaded about 100GB of video lectures about coding and math this week. I spent an afternoon queuing them up and left it running a few days. Remember me complaining about everything being in Real Format? Well, I still won in the end. It wrapped up this afternoon. My apologies to the Internet Archive's Ars Digita mirror. They must feel violated.

The Linux World: The Linux Kernel version 2.6.27 was released Friday. Development will start on 2.6.28 now. I'm excited about 2.6.28 because I'm hoping btrfs gets pushed into mainline. That could take a little while but it's still fun. Also, this is the first time that release season has come around and I'm really not interested in Ubuntu or Fedora. Arch/RedLinux has me pretty satisfied.

The Code World: There are some really cool lectures at the S3 conference. I posted about it before because Dan Ingalls presented the Lively Kernel but at this point I'm also really interested in the STEPS project and Ian Piumarta's work. Partially because I'm really jealous of Luke Gorrie, again. And I hope that OLPC XO's really do become more reflective and Lisp Machine like. Beyond that, I stumbled on two web framework tutorials lately, neither of which I have the time to work through really. Sad. One is in Factor and the other is in PLT Scheme. Sexy!!!

The Friends World: Don Gerz has written a number of things that caught my eye lately. Particularly a piece about Kierkegaard. Lex has also written some provocative questions about Banksy. I hope she'll post her paper when it's done. She's also looking to try Ubuntu in the near future. Go lex! Kris Osterhage simply hasn't been posting enough. ;-)
Chris Blair wants this election to be over. I'm rather with him on that one.

That's most of it. I need to write up a cheatsheet for the emacs and slime commands I'm using and then 2 or 3 articles on the stuff about Common Lisp I've been learning. Maybe at the end of it all I'll go back and revise my positions from the Language Adoption and Lisp article. Other than that, I'm trying to get through Season 2 of 30 Rock before Season 3 kicks off at the end of this month and really enjoying the break from employment that I have. Now somebody hire me already! More soon, everyone.

Planning to Plan

posted on 2008-10-06 21:53:31

A lot has been happening lately but I'm keeping my head above water and presently have enough cash to make it through November. Unfortunately, I'm keeping the car though my parents are helping me out by covering car insurance. I'd like to get rid of the car but the timing isn't right quite yet. On the whole things are going pretty well and since I'm unemployed I figured it's time to draft up a new and more accurate schedule so that I can get more done. Gotta keep moving forward.

More informative entries headed your way soon...

7:00AM - Wake up. Shower. Food. Site check (google reader/arstechnica/proggit/hn/lwn/etc).
8:00AM - Reading and writing code (presently Common Lisp).
11:00AM - Make lunch. Possibly write a blog entry. E-mails.
Noon - Go for a walk and/or skateboard. Job hunting.
1:00PM - Reading and writing code (presently Common Lisp).
5:00PM - Video games/friends. AIM.
6:00PM - Start making dinner.
7:00PM - Serve dinner and watch 30 Rock (2 episode limit).
8:00PM - Final hour of errands (i.e. bills, groceries) and/or code/a lecture.
9:00PM - Freedom.
Midnight - Asleep.

Unless otherwise credited all material Creative Commons License by Brit Butler