# posts

title: On Youth (draft)
date: 2007-10-29 17:21:23.000000
format: html
content:
  This popped out in my Discrete Mathematics class today after walking there listening to Funkadelic's Maggot Brain and reading some of Pablo Neruda's work. Tell me what you think. Also, title suggestions please.<br><br>Youth, I know not what became of you.<br>Lakes and cities, a fiery rebellion.<br>Always aware of a justice without touch or name.<br>You walked with me through the mud caked<br>ruins behind the trees of the subdivision<br>and sought out with me a refuge from the<br>savages in the weeds of back roads and trails.<br>You were there when the infection poured<br>out from the skin of my back like mineral water<br>from the mountain. You were there for<br>escapes to beaches and oceans whose splendor<br>seemed to swallow all that I knew.<br>But that was another world.<br>These days only the vaguest memories remain.<br>Flickering images whose sources cannot be pinned<br>down, absent of references or citations. Only a feeling<br>and a thought which, I know, as Milosz has said are<br>"too much for the meager word".<br>How is it that I am nostalgic for what I cannot recall<br>of my own life? A great sadness wells up within me.<br>As though what cannot be remembered did not occur.<br>I know that to be a fallacy, but in my weakness must<br>hope that in some eternal memory that beauty<br>and difficulty which I suffered does persevere.


title: One More Reason
date: 2008-02-15 18:44:31.000000
format: html
content:
  I knew this day would come sooner or later. I finally ran up against a task that was perfect to use <a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)">Unix Pipes</a> for. I needed to rename 2335 MP3s and I did it in 1 minute and 40.686 seconds.<br><br>Here's the backstory:<br>I recently got a new MP3 player because my old one died. When I got my last MP3 player I had selected the 2000 songs I actually liked and regularly listened to out of my 17000 or 18000 and copied them to the MP3 player and my PS3. Those songs were sort of a pain to get off my PS3 onto the new player so I figured I might as well keep a separate copy of them somewhere on my desktop. Eventually I'm planning on moving them to my server as well at which point <a href="http://redlinernotes.com/jukebox">Redline Radio</a> will get up and running again!<br><br>Anyway, I copied all the files off of my new MP3 player to my desktop to create said separate copy and found that the filename on each song had been changed to SONG_NAME.b-mtp-XXXX where the X's were the song numbers up to 2335. I'll be damned if I was going to rename all those by hand. So, I thought I'd use Unix Pipes which allow you to take the output from one command and feed it into another command. And just for fun, I timed it.<br><br>To time a command you just put the word time in front of it. So to time the change directory command you'd type, "time cd DIRECTORY". To rename all those files I would use the rename command, but it would only rename one file at a time or at best one directory. I had a few hundred directories. So, I needed a command that would find each file by searching through the directories and find is the perfect command for the job. I can call find and tell it to search for files with that weird extension and then each time it does, run rename on the file with a <a href="http://en.wikipedia.org/wiki/Regular_expression#POSIX_Basic_Regular_Expressions">regular expression</a> to change that extension to mp3. And here's how that looks:<br><pre><br>time find ./ -type f -exec rename 's/b-mtp-[0123456789]*/mp3/' {} ;<br></pre><br>That's it. It says time the find command searching from this directory down for files (ignoring directories, etc) and when you find one rename it based on this regular expression. Done. 2000 files renamed in 2 minutes. And people wonder why I use Linux. Yes, Apple Automator does do this. But do you know why the robot icon for Automator is holding a pipe? That's right. It's an homage to Unix Pipes. You could of course do this in Apple's Terminal. That would be pretty cool. You hear me Dobbs?<br><br>Anyway, I've been thinking a bit about Alan Perlis' Programming Epigram: "A language that doesn't affect the way you think about programming, is not worth knowing." And I think there's an analogue for Operating Systems as well in all likelihood. Text editors, too (here comes the <a href="http://en.wikipedia.org/wiki/Editor_war">Vi vs. Emacs</a> crowd). So, I may be using a <a href="http://en.wikipedia.org/wiki/Blub_%28programming%29">blub</a> operating system but I haven't soaked up all I can learn from it yet. I just need to remember to try other things too.<br><br>Just for fun, here's one more. This one outputs the 50 largest directories on my hard drive and their sizes to a text file on my desktop. du is Disk Usage, the -S option tells it to not to include subdirectories (so I only get leaves and not branches of the filesystem tree in my results). | passes output from one command as input to the next so | sort -nr passes the list of the directories and their sizes to sort which thanks to the nr switch sorts them in Reverse Numerical order. Greatest first, right? Then | head -n50 takes that output and cuts off everything after the first 50 lines. Finally, > dumps the final output into a text file at the location given. Ta da.<br><pre><br>du -S / | sort -nr | head -n50 > /home/redline/Desktop/50large.txt</pre>


title: One Week Worth of Tricks
date: 2008-08-03 17:18:28.000000
format: html
content:
  In the course of migrating my webserver to a new box this week I learned two useful tricks. They may or may not prove useful for anybody else but I think they're fun so here we go.<br><br>One, SSH Tunnels. SSH Tunnels are useful if you ever need to surf the web securely and you're on public or untrusted wireless (say at Starbucks) or when a website is blocked by a firewall and you need to access it.<br><br>SSH Tunnels are actually quite easy. Assuming you've got ssh setup on the remote server and an account at that server all you have to do is run "ssh -D 8080 username@website-or-ip-address.com". Once you're logged in, open the Preferences for your web browser. This example will use Firefox 3. Go to Edit-&gt;Preferences, then the Advanced section, the Network tab and click Settings. Click the "Manual Proxy Configuration" radio button and under SOCKS Host put "localhost" and set the port to 8080. That's it! Surf away.<br><br>Two, resetting your wordpress admin account password. This is useful if you're such an idiot that you forget to change the random password that's initially on the account after you install wordpress. It assumes you have an ssh account to the server hosting the blog as well as access to the database tables for the blog. SSH into the server and run "echo -n your-new-password | md5sum". Copy that down and hang on to it. Then run "mysql -u user-with-access -p". Then run the following commands:<br><code><br>USE wordpress-database-name;<br>UPDATE wp_users SET user_pass="md5-you-wrote-down"<br>WHERE user_login="admin";<br></code><br>Check to make sure it went through with "SELECT user_pass FROM wp_users;" then type "exit".<br><br>Yep. It's good stuff. That's all I've got for now. I'm hoping to post up some mostly finished SICP sections in the next few days. If I'm lucky I'll even write something intelligent about education.


title: Open Content, Mass Storage
date: 2008-09-16 17:53:42.000000
format: html
content:
  I think it's generally agreed upon that free video lectures are cool. I'm not saying that everyone wants to watch them but the fact that it's possible to download M.I.T. and Berkeley lectures, course readings and assignments most people seem to view as positive perhaps because many of us will never attend those schools.<br><br>There is tons of content out there and it's often difficult to find it all. There are a few sources I've found that help in sorting through everything but my sources tend to lead towards what suits my studies (computer science) best. That would be <a href="http://freescienceonline.blogspot.com/">Peteris Krumins blog</a> and <a href="http://www.lecturefox.com/">Lecturefox</a>. There are plenty of <a href="http://www.youtube.com/user/googletechtalks">Google Techtalks</a> and <a href="http://youtube.com/atgoogletalks">Authors@Google</a> videos that are good as well. Beyond that, I occasionally find <a href="http://www.datawrangling.com/hidden-video-courses-in-math-science-and-engineering">one off blog posts</a> that may link to content I wasn't aware of. If anyone knows of any ACM conferences similar to the <a href="http://www.acm.uiuc.edu/conference/2008/">Reflections conference at UIUC</a> where videos are released please post in the comments.<br><br>Unfortunately, most to all of these sources have a curious notion of "sharing" or online distribution. There are one or two problems that all the content they've posted online [under the egalitarian notion of global learning] suffers from. The first problem being that it's <a href="http://webcast.berkeley.edu/course_details.php?seriesid=1906978454">streaming content which is difficult to download</a> (generally .flv or .rm format). The second problem being that if there is a download option for the content it's through a <a href="http://itunes.berkeley.edu/">non-cross platform or DRM-encumbered client</a> (such as iTunes).<br><br>Thankfully, <a href="http://www.mplayerhq.hu/design7/news.html">Mplayer</a> exists. Mplayer is my video player/encoder of choice (though <a href="http://www.videolan.org/">VLC</a> is quite good, too). And wouldn't you know it? It provides support for watching, <a href="http://gentoo-wiki.com/MPlayer/Rip_streams#Ripping">ripping</a> and <a href="http://gentoo-wiki.com/TIP_MEncoder_Tips_and_Tricks#RealPlayer_rtsp_Video_Streams">converting</a> those frustrating rm streams in addition to everything else. Flash videos are easy enough to rip through existing <a href="https://addons.mozilla.org/en-US/firefox/addon/3006">Firefox Extensions</a>.<br><br>To make things even more exciting, there's no reason anyone can't mirror all the educational content out there. Except for legality of course, I can't speak to those details and I expect most of this content is under separate licenses. I do wonder if the <a href="http://creativecommons.org/">Creative Commons</a> No Derivative Works clause includes transcoding though. I suspect it doesn't based on the <a href="http://en.wikipedia.org/wiki/Derivative_work">definition of derivative work</a>. But to return to my original point about mirroring, storage is cheap now. Even <a href="http://computers.pricegrabber.com/network-storage-devices/p/69/st=category/">NAS setups</a> though they still run a good deal more than regular storage. But c'mon, it's a fileserver in a box. You knew that though, right? When you can get a <a href="http://computers.pricegrabber.com/hard-drives/m/53348506/st=product/sv=title/">320GB PS3 or Notebook drive</a> for $100, a <a href="http://computers.pricegrabber.com/hard-drives/m/51329442/st=quality/qlty=n">500GB external</a> for $100 and a <a href="http://computers.pricegrabber.com/hard-drives/m/56371451/st=product/sv=title/">1TB internal drive</a> for $140 you know life is good. Not that I'm not excited about the day when the same will be possible with <a href="http://en.wikipedia.org/wiki/Flash_drive">SSDs</a> but don't worry, <a href="http://www.engadget.com/2008/05/25/samsung-announces-crazy-fast-256gb-ssd-our-knees-buckle/">that day is coming</a>.<br><br>Also, to the folks who filmed the <a href="http://www.tele-task.de/page50_lecture3621.html">Lively Kernel Talk</a> from last night as well as those filming technical talks generally: If most of what the presenter/speaker is discussing concerns what's happening on the computer screen, you should be filming the computer screen. It's a handy rule.<br><br>Now, if you're not a Computer nerd or <a href="http://en.wikipedia.org/wiki/Free_software">Software Freedom</a> Advocate you may wonder why any of this would bother anyone. After all, you can still stream the videos with RealPlayer or watch them via Youtube in any event, right? Not quite, though I'll admit my problem is mostly with the egalitarian notions of education that I perceived (or imagined) to underpin this whole <a href="http://en.wikipedia.org/wiki/Open_educational_resources">OpenCourseware</a> initiative. If your stated goal is to make a set of educational resources available to as much of the world as possible via the internet then you're effectively after every demographic. There's not a section of the market you can afford to alienate.<br><br>In many parts of the world, I expect it's a real pain to find the time to sit in front of a computer and stream a file. Particularly in places where internet connections are scarce and are not broadband where they are available. Particularly if the file is a one or two hour lecture that you might want to rewind or pause at various points. If a guy can't watch the file in (connected) India, how is it free learning throughout the connected world? Additionally, if someone wants to watch video lectures when it suits their schedule (say at the gym or on the train) why would you prevent them from doing so unless they had a specific brand of portable video player?<br><br>If you're trying to promote free educational content then the first step you can take to responsibly pursue your goal is to choose the most widely viewable formats and lend your content to the widest possible types of use (including offline use but perhaps excluding commercial profit). Poor choices have been made in both respects. Flash Player historically wasn't available for x86_64 based Linux platforms though that has been recently remedied and iTunes U isn't available on Linux at all. More seriously, RM and FLV videos are difficult to download and use portably. Conversion to another format tends to be necessary as well.<br><br>Somewhat relatedly, I'd like to suggest that the masses of Open Content out there could use a good marketing push. Open Courseware is as underused as music, images and video in the Creative Commons. Someone really needs to create a service which finds Open Content and recommends or reviews it based upon the more familiar proprietary content in Music, Film and TV that consumers are fans of. Just giving it away isn't enough.


title: Overcast with scattered thunderstorms
date: 2011-08-06 21:55:22.000000
format: html
content:
  Today is my 25th birthday. So far I've mostly done chores: grocery shopping, laundry, handing over the keys to my old apartment, odds and ends. And, by design, I don't have any social plans for this afternoon or evening. I'm usually pretty pensive and melancholy around my birthday. This year continues the trend. Generally, when my birthday is coming up I think, "Okay. You've gotten this far and accomplished this much. Maybe it wasn't all you wanted but at least you're further than last year. What's next?" Not the best party conversation. :)<br><br>In all fairness, it's been a good year. I finally finished my undergrad degree, got my first job as a professional programmer (a damn good job at that), and moved into an apartment with <a href="http://twitter.com/burkehramsey">one of my oldest and dearest friends</a>. That said, I've been struggling a lot lately. A large part of that is because I don't know what I want for myself anymore or what my goals are. Personal relationships both romantic and otherwise, career ambitions and hobbies all seem up in the air. It's had me feeling pretty mixed up. I can't say I'm terribly proud of where I am at 25. Oh, well. I'll certainly enjoy taking some time off this winter to try and sort through things more. At least I've had fun hacking on <a href="http://vintage-digital.com/hefner/software/shuffletron/">Andy Hefner's Shuffletron</a> (a Common Lisp command line app, something I have <a href="http://aur.archlinux.org/packages.php?ID=30242">*some* experience</a> with...) music player lately. The <a href="https://github.com/redline6561/shuffletron/commits/playlists">main changes so far</a> have been to add playlists and a long TODO file. It's a fun diversion until I get ever so slightly more acclimated to my professional coding life and come up with a serious project that will push me more.<br><br>It's been hard to post lately for two reasons. The first is that I've simply been busy. The second is that I haven't had much to say. My thoughts are jumbled. The same thing happened <a href="http://redlinernotes.com/blog/?p=1219">last year</a> and like last year I'm going to borrow some of the words of my favorite poet, <a href="http://redlinernotes.com/blog/?cat=24">Czeslaw Milosz</a>. Wherever you are, thanks for reading this far and I hope the sun is bright and your world is well.<br><br><h3><b>Conversations with Jeanne</b></h3><br><br>Let us not talk philosophy, drop it, Jeanne.<br>So many words, so much paper, who can stand it.<br>I told you the truth about distancing myself.<br>I've stopped worrying about my misshapen life.<br>It was no better and no worse than the usual human tragedies.<br><br>For over thirty years we have been waging our dispute<br>As we do now, on the island under the skies of the tropics.<br>We flee a downpour, in an instant the bright sun again,<br>And I grow dumb, dazzled by the emerald essence of the leaves.<br><br>We submerge in foam at the line of the surf,<br>We swim far, to where the horizon is a tangle of banana bush,<br>With little windmills of palms.<br>And I am under accusation: That I am not up to my oeuvre,<br>That I do not demand enough from myself,<br>As I could have learned from Karl Jaspers,<br>That my scorn for the opinions of this age grows slack.<br><br>I roll on a wave and look at white clouds.<br><br>You are right, Jeanne, I don't know how to care about the salvation of my soul.<br>Some are called, others manage as well as they can.<br>I accept it, what has befallen me is just.<br>I don't pretend to the dignity of a wise old age.<br>Untranslatable into words, I chose my home in what is now,<br>In things of this world, which exist and, for that reason, delight us:<br>Nakedness of women on the beach, coppery cones of their breasts,<br>Hibiscus, alamanda, a red lily, devouring<br>With my eyes, lips, tongue.<br>Guava juice, the juice of <em>la prune de Cythere</em>,<br>Rum with ice and syrup, lianas-orchids<br>In a rain forest, where trees stand on the stilts of their roots.<br><br>Death you say, mine and yours, closer and closer,<br>We suffered and this poor earth was not enough.<br>The purple-black earth of vegetable gardens<br>Will be here, either looked at or not.<br>The sea, as today, will breathe from its depths.<br>Growing small, I disappear in the immense, more and more free.


title: Overdue Update 1
date: 2007-10-02 16:56:16.000000
format: html
content:
  good music: nostalgia 77 - seven nation army, skye - feel good inc, asobi seksu - lions and tigers, marconi union - shibuya crossing, telefon tel aviv - when it happens it moves all by itself<br>honorable mention: massive attack - dissolved girl<br><br>links:<br><a href="http://sneakymustard.com/2007/09/15/">sun's corporate strategy</a><br>hahaha (i do like sun though)<br><a href="http://www.gapingvoid.com/Moveable_Type/archives/000825.html">gapingvoid</a><br>his comics leave me speechless and not a little afraid.<br><a href="http://www.gardnercampbell.net/blog1/?p=529">open</a> <a href="http://davecormier.com/edblog/?p=3">education</a><br>i really hope things move in this direction for my (future?) kids and myself<br><a href="http://news.ycombinator.com/item?id=60357">paul graham as chuck norris</a><br>that's just amazing. most of these jokes are too nerdy for me to get!<br><a href="http://www.boingboing.net/2006/06/28/p2p-insurer-will-pay.html">p2p\file sharing insurance</a><br>it's so cool that this exists i'm speechless. record industry, take note.<br><a href="http://blogs.cnet.com/8301-13505_1-9783147-16.html?part=rss&amp;tag=feed&amp;subj=TheOpenRoad">gartner says open source pwns</a><br>just yep.<br><br>A tasty Neruda poem... and a real blog post soon. Promise this time.<br><em>I Ask For Silence</em>:<br><br>Now they can leave me in peace,<br>and grow used to my absence.<br><br>I am going to close my eyes.<br><br>I only want five things,<br>five chosen roots.<br><br>One is an endless love.<br><br>Two is to see the autumn.<br>I cannot exist without leaves<br>flying and falling to earth.<br><br>The third is the solemn winter,<br>the rain I loved, the caress<br>of fire in the rough cold.<br><br>My fourth is the summer,<br>plump as a watermelon.<br><br>And fifthly, your eyes,<br>Matilde, my dear love,<br>I will not sleep without your eyes,<br>I will not exist but in your gaze.<br>I adjust the spring<br>for you to follow me with your eyes.<br><br>That, friends, is all I want.<br>Next to nothing, close to everything.<br><br>Now they can go if they wish.<br><br>I have lived so much that someday<br>they will have to forget me forcibly,<br>rubbing me off the blackboard.<br>My heart was inexhaustible.<br><br>But because I ask for silence,<br>don't think I'm going to die.<br>The opposite is true;<br>it happens I'm going to live.<br><br>To be, and to go on being.<br><br>I will not be, however, if, inside me,<br>the crop does not keep sprouting,<br>the shoots first, breaking through the earth<br>to reach the light;<br>but the mothering earth is dark,<br>and, deep inside me, I am dark.<br>I am a well in the water of which<br>the night leaves stars behind<br>and goes on alone across fields.<br><br>It's a question of having lived so much<br>that I want to live that much more.<br><br>I never felt my voice so clear,<br>never have been so rich in kisses.<br><br>Now, as always, it is early.<br>The light is a swarm of bees.<br><br>Let me alone with the day.<br>I ask leave to be born.


title: Overextended
date: 2009-09-27 20:47:27.000000
format: html
content:
  Today is not my best day but it is a nice day. The sun's out. I had a fantastic brunch with <a href="http://knitordie.livejournal.com/">Teresa</a> and some <a href="http://girlonthewing6.livejournal.com/">dear</a> <a href="http://piratesforpedro.livejournal.com">friends</a>. I skateboarded a bit.<br><br>Unfortunately, the further I go the more I'm aware that this semester is much harder than it <em>should</em> be. I didn't particularly enjoy summer semester but it didn't seem this...difficult. A few months back I alleged that I was low energy but <a href="http://redlinernotes.com/blog/?p=1043"><em>not</em> <em>depressed</em></a>. I'm not as sure that's the case anymore. Things are too hard for me to think that everything is running as ordinary. It doesn't help that I'm not enjoying <em>any</em> of my classes this semester or that <em>none of them</em> require me to <strong>write code</strong> which is what I'd really like to be doing right now. I do feel that the best way to learn this stuff is to use it.<br><br>But in general, I just feel overextended lately. I don't believe that taking a semester off is an option and I'm already almost in the middle of this one. Energy comes and goes as does my mood but applying that energy to productive tasks (particularly some of the seemingly useless academic ones) has become vastly more challenging. It hasn't felt so hard in a long while. I'll try to rise to the challenge because I don't want to regress. Hopefully, this will pass in a short while.<br><br>At least I know <a href="http://vintage-digital.com/hefner/software/mixalot/mixalot.html">what I want to be working on</a>. Even if I don't know how to get <a href="http://www-scf.usc.edu/~ise575/a/index.html">there</a>...or how long it will take.


title: Paktahn 0.8.2 and other news...
date: 2010-01-14 04:36:33.000000
format: html
content:
  The last week has been thoroughly insane in ways both good and bad. As a gift, I had my thoroughly aged Nokia 6010 replaced by a shiny new <a href="http://arstechnica.com/gadgets/reviews/2010/01/nexus-one-review.ars">Nexus One</a>. Much as I would've liked an N900 they aren't subsidized by any carrier and so will remain out of my price range. I've also switched service to T-Mobile and thus far been quite satisfied. Then again, coming from a phone without a data plan I have no way of evaluating the 3G I'm getting.<br><br>The holidays were good. I have a skateboard again so when the weather clears up I can get back to enjoying that.  Time with mom was really good as was some peace and quiet and time to reflect. I took the opportunity to discover some new music as I usually do and also to read two novels by Vernor Vinge that I <strong><em>thoroughly</em><span style="font-weight: normal;"> enjoyed: <em><a href="http://en.wikipedia.org/wiki/A_Fire_Upon_the_Deep">A Fire Upon the Deep</a></em> and <em><a href="http://en.wikipedia.org/wiki/A_Deepness_in_the_Sky">A Deepness in the Sky</a></em>. Careful, those wiki links have spoilers. As for the music, I've considered compiling a top 5 favorite albums of 2009 list but haven't gotten around to it. Besides, <a href="http://last.fm/user/redline6561">last.fm should tell you most of that</a>. I will say I've been deeply enjoying Jon Hopkins, Ametsub and Minus the Bear this week. It's kind of an odd mix.</span></strong><br><br>Moving on, I got back into code last Tuesday after a long holiday absence. I really needed the break to recharge. 2009 was a full year. I spent the bulk of the second half of last week and the weekend writing code, reading code or screwing around with configuration files...which are all things I enjoy a good bit. Over the break I had fooled around with a new window manager (StumpWM in lieu of XMonad) and started using clbuild instead of asdf-install. I also spent a little time adding <strong><a href="http://gitorious.org/~redline6561/clbuild/clbuild-dev/commits/new-projects">a lot of projects</a></strong><a href="http://gitorious.org/~redline6561/clbuild/clbuild-dev/commits/new-projects"> to clbuild</a> in case I felt like playing with them. In the course of all this fiddling, I made a fresh archlinux install in a new partition with essentially nothing but Lisp and C compilers, a tiling window manager, Chromium, Emacs and a music player. To some degree, I'm <a href="http://redlinernotes.com/docs/lisp_on_linux/">fleshing it out</a> still. It's a dumb diversion but every now and then I just have to rip my system up a little. It's hard to explain.<br><br>On Sunday, after 3 months of work Leslie and I finally made <a href="http://blog.viridian-project.de/2010/01/10/paktahn-0-8-2-released/">the Paktahn 0.8.2 release</a>. For all intents and purposes, the wait was worth it. A lot of new features and fixed bugs are present but there is still so much on <a href="http://wiki.github.com/skypher/paktahn/brits-notes-redline6561">my Paktahn.todo list</a>. And of course <a href="http://github.com/skypher/paktahn/issues">there are bugs</a> to fix. It's hard to explain why I'm so invested in Paktahn. Part of it is the work I've put in to date, part of it is how pleasant it's been working with Leslie and how much I've learned. Another large part is that there is great joy in having written some part of my day to day software and having a (relatively) deep understanding of it. It's kind of silly because<a href="http://wiki.archlinux.org/index.php/AUR_Helpers"> AUR Helpers </a>are a dime a dozen (or two dozen) but I'm still having fun.<br><br>The Paktahn release was not without some drama though. Almost immediately after the release I started having odd issues building paktahn with sbcl. The resulting executable would exit as soon as you ran it complaining of a fatal error and a lost gc invariant. Not what you want to see. The bad thing was the error was intermittent and I couldn't isolate the cause. I had issues with it in my old archlinux install as well as the new one, with old and current checkouts of my code and with a checkout of Leslie's tree. I'm pretty sure I tried it with a fresh, recompiled sbcl and also tried removing all fasls and recompiling. I got very confused in the course of all that trying to figure out what happened. I should've been taking notes. At this juncture, it builds fine again and I can't get it to act up. :( Ah, well. At least I can get back to developing. It certainly gives me some impetus to finish <a href="http://gitorious.org/~redline6561/paktahn/paktahn-dev/commits/redline6561-ccl">the CCL port I started Dec 28th</a>.<br><br>So on to school this semester. I'm interning at a company called Kloudshare and have begun work on open sourcing a portion of their code. It's good fun and I hope to have more to share on that note very shortly. The administrative person I spoke with before break failed to get the internship registered in SPSU's system though so I spent a good deal of Tuesday getting that worked out with her. Then I had the unpleasant experience of learning that online courses are *substantially* more expensive than offline ones. Apparently, the state doesn't subsidize them because they can be taken advantage of by anyone or something like that. In my case, I was just trying to avoid an hour and a half commute both ways and try to find more time to code. I guess you really can't have it all. Now I have to jump through more financial aid hoops. Joy.<br><br>Soon I hope to have some code to show here. Maybe I'll spend 10 minutes and just throw my dotfiles up on github for the hell of it tomorrow. Other than that...I miss long form writing, poetry, essays...but my focus is elsewhere. Plus I'm tired. The rest will have to wait for another day.


title: Paktahn 0.9 is out!
date: 2010-05-18 18:16:40.000000
format: html
content:
  Well, it's been a long spell since <a href="http://blog.viridian-project.de/2010/01/24/paktahn-0-8-3-released/">the last paktahn release</a>. There are reasons for it but I'm just glad we got the release out.<br><br>The "big feature" of the release is AUR updates which I am happy to have implemented. I wouldn't have been able to get it done if versioning support hadn't been kicked off by Wei Hu (wh5a) <a href="http://github.com/wh5a/paktahn/commit/a82b9dacfc0549d60067e367c8efdcc4021c8b7e">a while back</a> though. At any rate, AUR Updates are in as is support for the .tar.xz format which Arch has adopted for packages going forward.<br><br>Beyond that we have a new contributor to the project, <a href="http://github.com/bigjust">Justin Caratzas</a>, that I've enjoyed working with and hope to work with more in the future. Justin fixed <a href="http://github.com/skypher/paktahn/issues/closed#issue/22">a bug in how AUR packages were installed</a> regarding whether or not they were installed as dependencies.<br><br>I should have more time to hack on paktahn this semester than last semester so hopefully there won't be a commit gap for 2 months like there was before. I'm already looking at features for 1.0 and my biggest priority is reworking the command-line option handling using <a href="http://github.com/astine/unix-options">astine's unix-options</a> and then extending paktahn to support pacman's -Syu, -Sy and -Su. Then I wouldn't ever need to call down to "regular old" pacman. Other than that it might be nice to get support for Paktahn on <a href="http://trac.clozure.com/ccl">CCL</a> or <a href="http://ecls.sourceforge.net/">ECL</a> and a test suite written. CCL support is complete save catching Ctrl+C and offering restarts as appropriate. There <a href="http://thread.gmane.org/gmane.lisp.openmcl.devel/5393">isn't exactly a clear path</a> to implementing said support...<br><br>Anyway, if you're a user and you find a bug or want a feature, head for <a href="http://github.com/skypher/paktahn/issues">the issues page</a> and let us know about it!


title: Paktahn Progress
date: 2011-02-01 05:39:00.000000
format: html
content:
  In the last 3 weeks, Paktahn 0.9.2 and 0.9.3 have been released. Go <a href="http://aur.archlinux.org/packages.php?ID=30242">install or upgrade</a> it, quick! Leslie Polzer has passed on the role of Maintainer to me and I was privileged to accept it. Paktahn had been pretty quiet from May-Aug 2010 and was practically silent Aug-Dec 2010. As a consequence, a big part of my focus right now is revitalizing the project, making it clear we're still working on it and making it easy for new contributors to join in.<br><br>The biggest focus of the last two releases have been bugfixes, unifying the code style and reorganizing the project some. For example, my old gitorious repo has been taken down, all the TODO items are now in one place, etc. That doesn't mean there are no new features though. Among other things you can now finally upgrade all packages by running "pak -Syu --aur", pak -Ss which behaves like pacman -Ss extended to support AUR and various UI improvements. The rest is visible in the <a href="https://github.com/redline6561/paktahn/blob/master/NEWS">NEWS</a> as always.<br><br>My plans for the next two releases can be found in the <a href="https://github.com/redline6561/paktahn/blob/c98f2c3bfbf27796eca92dac128ea6e43de67ab9/TODO">TODO</a>. The short version is that I'm going to improve our option handling so pak can be used for as many pacman tasks as possible (i.e. -Q*, etc) and clean up the code for the next release. There should also be some small UI improvements. After that, I'm going to get a solid test suite in place. My github repo is the <a href="http://github.com/redline6561/paktahn">canonical source location</a> at this point but Leslie's Issues page is the <a href="http://github.com/skypher/paktahn/issues">canonical bugtracker</a>. As always, please file any bug reports or feature requests you have there. If there's any other feedback you have about the project you're welcome to post it on <a href="https://bbs.archlinux.org/viewtopic.php?id=77674&amp;p=6">our forum thread</a>.<br><br>I'm going to try to run a tighter release cycle for a little bit. There have already been two releases in January. I guarantee that there will be another point release so 0.9.4 is out by the end of February, I can't guarantee any more than that at this time though. That's all for now. I've got to get to sleep for an early class.


title: Pascal’s Triangle
date: 2008-02-07 03:25:28.000000
format: html
content:
  <p>A little over two weeks ago I came up against <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#call_footnote_Temp_54">Exercise 1.12</a> in <a href="http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs">the venerable Structure and Interpretation of Computer Programs</a>.</p><br><p>The exercise wants you to write a recursive program to compute elements of <a href="http://en.wikipedia.org/wiki/Pascal's_triangle">Pascal's Triangle</a>.</p><br><p>This exercise has pretty much infuriated me and it's all my own fault. Upon first hearing the problem statement I got it in my head that the function should look something like "(define (pas n)...)". I always think of number series  being described in terms of a single argument (i.e. the 12th element) so it seemed natural to me that the pascal's triangle function should be computed in this way even though it is not, in some sense, a traditional series.</p><br><p>After a while, I cracked and read the precursor text (but not the code) to <a href="http://eli.thegreenplace.net/2007/06/28/sicp-section-122/">Eli Bendersky's solution</a> and noticing that he defined the function with two arguments (for columns and rows) arrived fairly quickly with that insight at what seems to be the <a href="http://www.kendyck.com/archives/2005/03/22/solution-to-sicp-exercise-112/">more </a>or <a href="http://blog.petersheats.com/2007/09/11/exercise-112/">less</a> standard solution. I have had this much completed for a week but gotten stalled trying to figure out the problem of a pascal function that takes one argument.</p><br><p>As of today I've solved the problem though and hoped to share my results here. First, the throwaway code that ended up being good for nothing!</p><br><pre><br>(define (is-one? element)<br>  (define (is-one-iter ones count flag)<br>    (cond ((< element 5) #t)<br>	  ((= ones element) #t)<br>	  ((> ones element) #f)<br>	  ((= flag 1) (is-one-iter (+ ones 1) count (- flag 1)))<br>	  (else (is-one-iter (+ ones count) (+ count 1) (+ flag 1)))))<br>  (is-one-iter 4 2 0))<br>;Value: is-one?</pre><br><p>That code tests to see whether a given element equals one and it does take a single argument which is nice. I couldn't figure out a way to use it to compute the actual elements though.</p><br><p>After a little bit of experimenting I stumbled on <a href="http://www.research.att.com/~njas/sequences/A080956">this number sequence</a> (OEIS #A080956) which when put in the following procedure would allow me to compute n from a given column and row.</p><br><p>EDIT: Corrected dyslexic mistake in my code (I'd replaced all instances of col with row and vice versa). See comments.</p><br><pre><br>(define (n-from-rowcol row col)<br>  (define (f x)<br>    (- (/ (* (+ x 1) (- 2 x)) 2)))<br>  (+ row col (f (- row 1))))<br>;Value: n-from-rowcol</pre><br><p>Now all I had to do was find a way to reverse the function to give me the inputs if I gave it the output. I actually stumbled upon <a href="http://www.research.att.com/~njas/sequences/A000124">another number sequence </a>(OEIS #A000124, also known as the <a href="http://en.wikipedia.org/wiki/Lazy_caterer's_sequence">Lazy Caterer's Sequence</a>) which when put into the following procedure returns the correct column and row for a given element. At last, working code:</p><br><pre><br>(define (pascal n)<br>  (define (pas col row)<br>    (cond ((= col 1) 1)<br>	  ((= row 1) 1)<br>	  ((= col row) 1)<br>	  (else (+ (pas (- col 1) row)<br>		   (pas (- col 1) (- row 1))))))<br>  (define (colrow-from-n)<br>    (define (col-iter count)<br>      (define (f x)<br>	(- (/ (+ (square x) x 2) 2) x))<br>      (cond ((> (f count) n) (pas (- count 1) (- n (- (f (- count 1)) 1))))<br>	    ((= (f count) n) (pas (f count) 1))<br>	    (else (col-iter (+ count 1)))))<br>    (col-iter 1))<br>(colrow-from-n))<br>;Value: pascal</pre><br><p>Any insights into cleaner code, better algorithms, or comparisons between the two number series are welcomed.</p>


title: Placeholder Post
date: 2009-04-20 15:58:32.000000
format: html
content:
  So another week has passed and apparently it's time for me to write another blog post. I have some interesting things I've been wanting to talk about but unfortunately I don't have the time to post right now. I may later on this week, say Friday, but finals and schoolwork is taking precedent for the time being.<br><br>I'll still say a few brief things here just so you know what's coming.<br><ul><br>	<li> Dad has had some recent complications and we're still waiting for word from the doctors as to what can be done about them. More forthcoming.</li><br>	<li> I happened to remember and watch Fist of Legend over the weekend which got me thinking about Cross Training and reading modern martial arts history on Wikipedia.</li><br>	<li>I've been recognizing some things about why I like Smash Bros so much and why Street Fighter IV has been trying for me even though I find much to commend it.</li><br>	<li>Teresa and I are all set to move in to the Aventine at Ashford May 8th. There will be a goodbye Windsor house party/video game tourney/thing before then.</li><br></ul>


title: Planning to Plan
date: 2008-10-06 21:53:31.000000
format: html
content:
  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.<br><br>More informative entries headed your way soon...<br><br>M-F<br>7:00AM - Wake up. Shower. Food. Site check (google reader/arstechnica/proggit/hn/lwn/etc).<br>8:00AM - Reading and writing code (presently Common Lisp).<br>11:00AM - Make lunch. Possibly write a blog entry. E-mails.<br>Noon - Go for a walk and/or skateboard. Job hunting.<br>1:00PM - Reading and writing code (presently Common Lisp).<br>5:00PM - Video games/friends. AIM.<br>6:00PM - Start making dinner.<br>7:00PM - Serve dinner and watch 30 Rock (2 episode limit).<br>8:00PM - Final hour of errands (i.e. bills, groceries) and/or code/a lecture.<br>9:00PM - Freedom.<br>Midnight - Asleep.


title: Playing with Haskell
date: 2009-05-03 04:47:39.000000
format: html
content:
  Before I start running my mouth without thinking, some disclaimers:<br>1) This has no business showing up on reddit. It's a journal entry from a dumb kid who played for a few hours. I'm acutely aware of it. Also, there would be no post (no code) at all if cgibbard (Cale) in #haskell hadn't been so damn helpful. Thanks also goes out to olsner, ski, yitz and Twey.<br>2) This post is completely programming related for readers of my blog who aren't interested in that.<br><br>I've been increasingly enamored with Haskell recently. Back in March I picked up Real World Haskell and read through 3 chapters <a href="http://redlinernotes.com/code/rev/5b8bc8cbfa98">stopping short of finishing the last 3 exercises in Chapter 3</a> one day over spring break. School and real life caught up with me unfortunately and I've just now had time to sit down with Haskell again. I've been following the language pretty heavily since February and read a number of Dons blogs <a href="http://donsbot.wordpress.com/2006/12/16/programming-haskell/">on</a> <a href="http://donsbot.wordpress.com/2006/12/17/programming-haskell-string-processing-with-a-dash-of-concurrency/">things</a> <a href="http://donsbot.wordpress.com/2006/12/18/programming-haskell-argument-handling-and-a-complete-cat/">like</a> <a href="http://donsbot.wordpress.com/2006/09/22/simple-unix-tools/">writing simple unix tools</a>. That's proof enough of disclaimer #1.<br><br>Looking back over some of the RWH stuff, I stumbled upon mention of a book by Italo Calvino called <a href="http://en.wikipedia.org/wiki/Cosmicomics">Cosmicomics</a>. Cosmicomics is just a cool word. I decided to see how many words like it I could generate. That is, how many words could I generate that are anagrams smushed together by a shared letter. Naturally, I decided it'd be fun to try to do it in Haskell.<br><br>The resulting code is 39 lines, 35 removing comments. It is quite readable as far as I'm concerned and as I mentioned, I'm an idiot. The code compiles to a nice, native linux binary that takes up 684k on my machine (ArchLinux x86_64, GHC 6.10.2, etc). It reads in a 6750 word dictionary file with a word on each line and certainly does more computation than is necessary to get the desired result: a printed list of words like cosmicomics. It executes in just over 17 seconds. Fast enough for me. Here's the code:<br><br><pre lang="haskell">-- how to find words like "cosmicomics":<br>-- words which can be split into anagrams by the middle letter<br>-- PRESENTLY ASSUME THAT ALL WORDS ARE LOWERCASE! I should probably unit test or type for this.<br><br>import Data.List (sort)<br>import System.Environment (getArgs)<br><br>main = do<br>         [f] <- getArgs<br>         inFile <- readFile f<br>         let dict = filter (not . null) (lines inFile)<br>         printFunnies (filter notSameWord (findFunnies dict))<br><br>isAnagram :: String -> String -> Bool<br>isAnagram word1 word2 = sort word1 == sort word2<br><br>hasJoiner :: String -> String -> Bool<br>hasJoiner word1 word2 = last word1 == head word2<br><br>isFunnyWord :: String -> String -> Bool<br>isFunnyWord word1 word2<br>            | isAnagram word1 word2 && hasJoiner word1 word2 = True<br>            | otherwise                                      = False<br><br>notSameWord :: (String, String) -> Bool<br>notSameWord (word1, word2) = word1 /= word2<br><br>sameLength :: String -> [String] -> [String]<br>sameLength word xs = filter (\x -> length x == length word) xs<br><br>printFunnies :: [(String, String)] -> IO [()]<br>printFunnies xs = mapM (\(x,y) -> putStrLn (x ++ tail y)) xs<br><br>partialFind :: [String] -> String -> [(String, String)]<br>partialFind dict word = [(word,w) | w <- sameLength word dict, isFunnyWord word w]<br><br>findFunnies :: [String] -> [(String, String)]<br>findFunnies xs = concatMap (partialFind xs) xs</pre><br><br>Note from the future: Accidentally navigated away from this page, Wordpress lost the last 600 words\40 minutes of work. Future posts will be written in Emacs.<br><br>I found the tricky parts of <b>the problem</b> to be findFunnies, partialFind and printFunnies. findFunnies I was actually on the right track about, I was just using map instead of concatMap. I'd bumped into concatMap earlier while looking at a different problem but it slipped my mind until Cale said, "Hey, you actually want concatMap here". Remember when I said I was dumb? partialFind may have been the trickiest and there are two reasons for that. One, I'd completely forgotten about list comprehensions. Clever, right? Even if I'd remembered them I had no idea you could test predicates while you built the list. Again, thanks Cale. Then it was working but I wanted to format the results differently and introduced two non-exhaustive pattern matches trying to do it so it was back to hastle #haskell. I was soon talking with Cale again. Finally, I realized you had to get the type system to accept the IO being done in printFunnies but I was using map as I didn't know something like mapM existed. Even had I known, I doubt I would've been able to throw together the lamba function it's being passed. Cale gave me a working version with forM and I found my way from there.<br><br>I came to Haskell from SBCL (Common Lisp) which I had come to from Scheme (PLT/MIT/Chicken, take your pick). I feel like a lot of my thoughts on Haskell are deeply colored by that trajectory so take the following with a few nice big grains of salt. Now then, for three random thoughts on Haskell from one of those fools who plays way too much with languages instead of getting better by actually <i>getting things done</i>.<br><br>It's really nice that Haskell actually has a dominant implementation, GHC, as well as a good package manager, Cabal. Consequently, all the libraries I've encountered on Hackage are easily installable and compatible with GHC. Conversely, I can't say if any require GHC extensions or are compatible with HUGS. That said, everything seems pretty up to date and I haven't even had to think about installing something from version control. Having easily installable bindings to a major cross platform toolkit like GTK or QT and Curses is pretty essential in my opinion. Don't even get me started on the awesomeness that is Hoogle and Hayoo.<br><br>Haskell is the first language that's made me see types can actually be useful. To be fair, before this I'd only programmed in Lisp, Scheme, Python and C. A trivial amount of each, at that, so you can see why I wasn't thrilled by static typing. To be fair, I did get a good number of compiler errors over typing problems in my code but they were always helpful. I'm not decidedly on either side of the fence with regards to typing and my gut says that both lend themselves better to certain problems (see the ease of multiple arity functions in Lisp and Scheme, for example) but at least now I can see the issue from both sides.<br><br>Haskell is also the first language with non-lispy syntax that I actually like. Dons posted an article called <a href="http://donsbot.wordpress.com/2006/12/14/on-syntax/">On Syntax</a> a while back proclaiming the superiority of Haskell's syntax but did a bit of a disservice by using a trivial example. Haskell's syntax gets a fair bit more complicated doing anything non-trivial though the code remains concise by consequence. That said, it's far from unreadable and I hope that it'll become more natural as I spend more time writing code. While I found Python's syntax pretty tolerable, Haskell's use of Pattern Matching and Guards really puts it over the top. Lisp has been said to have no-syntax which certainly makes it easier (read: feasible) to use macros, not that it's merely a matter of syntax. I don't even want to think about Template Haskell. I remember reading something along the lines of "Lisp's no-syntax as syntax is certainly flexible but it doesn't lend itself to expressing anything in a very elegant way so much as expressing nothing in a very inelegant way". At least now I can vaguely understand why people could think Perl's syntax was a good idea.<br><br>Ironically, an article got posted on the Haskell subreddit earlier regarding Haskell's syntax and difficulty reading it. I thought <a href="http://www.reddit.com/r/haskell/comments/8hc3v/ask_reddit_haskell_has_proved_difficult_to_read/c09a3u9">Nostrademons comment</a> was pretty thoughtful and it largely sums up my issues, particularly points 2 and 3. Maybe if I'm lucky I'll encounter point 1 as I code more in the coming months. Most importantly, none of these issues (syntax, typing or anything else) are dealbreakers. If you want to learn Lisp or Haskell you absolutely can and the main reason for that is the exceedingly helpful communities that surround them. When you can jump into a chatroom, mention a problem you're having and instantly get advice from some much smarter and more experienced folks there's no reason not to dive in and play around. More and more, I'm convinced that languages make it or break it based in large part on their communities and I promise Haskell and Lisp both have damn good ones.<br><br>If you're interested in learning Haskell, these are some of the best resources I've found on the web so far (excluding #haskell, of course):<br>Books:<br><a href="http://book.realworldhaskell.org/read/">Real World Haskell</a> - A book available in paperback and readable free online.<br><a href="http://learnyouahaskell.com/chapters">Learn You a Haskell</a> - A freely readable online book.<br><a href="http://en.wikibooks.org/wiki/Haskell">Haskell Wikibook</a> - Community edited online Haskell book.<br>Docs:<br><a href="http://www.haskell.org/ghc/docs/latest/html/libraries/">The GHC Standard Library</a><br><a href="http://www.haskell.org/ghc/docs/latest/html/users_guide/">and User Manual</a><br>Any packages docs on Hackage. Just click any of the links under "Modules".<br>Wiki:<br><a href="http://www.haskell.org/haskellwiki/Haskell">The Haskell Wiki</a> is phenomenal and has stacks of articles on everything from <a href="http://www.haskell.org/haskellwiki/Category:Style">style</a> and <a href="http://haskell.org/haskellwiki/Category:Idioms">idioms</a> to <a href="http://haskell.org/haskellwiki/Category:Tutorials">tutorials</a>.<br>Search Engines: Search the libraries for a function by either name or type!<br><a href="http://holumbus.fh-wedel.de/hayoo/hayoo.html">Hayoo</a><br><a href="http://www.haskell.org/hoogle/">Hoogle</a><br><br>Finally, here's the output of <code>time funnyWords english-words.txt</code> behind a cut:<br><!--more--><br>advertstarved<br>aptap<br>artstar<br>ascendances<br>backwardrawback<br>batab<br>boresober<br>copescope<br>cosmicomics<br>creatoreactor<br>daredread<br>dasheshades<br>designeresigned<br>dialaid<br>doomood<br>dreadared<br>eightheight<br>gearage<br>gumug<br>gunsung<br>hookshook<br>hostshots<br>idealsailed<br>laidial<br>layerelay<br>leapale<br>lightedelight<br>loopspool<br>masterstreams<br>meatame<br>moodoom<br>mugum<br>mugsmug<br>nailsnail<br>nastieretains<br>nestens<br>newerenew<br>nutstun<br>opusoup<br>ownsnow<br>parsespares<br>patap<br>phaseshapes<br>pillspill<br>pinspin<br>pitip<br>portsport<br>prayspray<br>racescare<br>ratstar<br>rattlestartle<br>reclaimiracle<br>reseterse<br>resetsteers<br>resignedesigner<br>resignsingers<br>restartstarters<br>restedesert<br>revisediverse<br>routour<br>shouthous<br>singeresign<br>sisteresist<br>spitips<br>spooloops<br>starats<br>steereset<br>stunuts<br>sunguns<br>tabat<br>tackstack<br>talestale<br>tapat<br>teamsteam<br>tearstare<br>thesesheets<br>thoushout<br>thrustruths<br>tipit<br>tipspit<br>tourout<br>tradestared<br>tripstrip<br>unsetunes<br>vilevil<br>wingswing<br><br>real	0m17.083s<br>user	0m16.629s<br>sys	0m0.070s


title: Politics and Polemics
date: 2008-03-18 02:37:07.000000
format: html
content:
  <p>Dear Livejournal Readers: I feel like there's some pretty good discussion of my last post going on at my primary blog, <a href="http://www.redlinernotes.com/blog/?p=882#comments">drop in and comment if you like</a>.</p><br><p>I've bumped into <a href="http://feeds.feedburner.com/~r/InfectiousGreed/~3/253300971/crude_oil_at_70.html">several</a> <a href="http://www.portfolio.com/views/columns/economics/2007/12/17/Why-Oil-Prices-Will-Drop">suggestions</a> today that prices for crude oil will spiral back down in a short term period (under a year) for various reasons. I'm not sure whether to be distressed over this news or not. I worry that we may lose ourselves again to <a href="http://video.google.com/videoplay?docid=-9153550196656656736">the path of least resistance</a>, rather than recognizing that non-renewable energy should be discouraged and there is much we stand to gain if we can kick the habit. More on that soon. Sleep tight, folks.</p>


title: Politics and the Digital World, v0.1
date: 2007-05-04 10:08:00.000000
format: html
content:
  *References:<br>http://redline6561.livejournal.com/155783.html<br>http://david.navi.cx/blog/?p=136<br>http://www.worldchanging.com/archives/006626.html<br>http://www.andrewlih.com/blog/2007/05/02/what-does-cyber-revolt-look-like/<br>http://blog.wired.com/business/2007/05/wikipedia_locks.html<br><br>Preface:<br>I feel I should explain a bit about why the events of May 1st were so important, why it was as I called it "a watershed day". Since I wrote that piece this afternoon the events covered have been very much in my thoughts and I've discussed them with a number of friends of mine, some technically inclined, some not.  There were two events. The first being Dell's decision to offer Ubuntu preinstalled on select computers of theirs. This is a huge victory for Open Source Software generally and also Linux particularly. It's a larger victory for the Open Source Production Model because it stands as evidence that such a production model can compete with that of proprietary vendors such as Microsoft, Apple, etc. That I consider to be (significantly)  less important than the second event of the day. That is, the HD-DVD <em>scandal</em>. Or the <em>cyber riot</em>. Whatever it should be called. Those of you who know how much I trumpet on about Open Source and Linux should understand what a large claim that is for me. It's more important that a ton of people revolted online against a standard than that Dell said they would sell (Ubuntu) Linux computers. And I've been predicting that Linux on the Desktop thing for a good year now. A year's expectations fulfilled but secondary to some arbitrary online screaming fit? Yes. Part of that is because I was expecting the Linux thing to happen sooner or later. I'm glad it was sooner but not shocked. I figured Linux would be about ready by now it would just take a company with the guts to try it. I can say I'm half-surprised (but pleasantly) that the company was Dell. The revolt was much more important though and showed us <em>much much more</em> about the dynamics of online communities and power structures.<br><br>Backstory:<br>First, by way of introduction to the problem space, I'd like to clear up what could be an easy misconception. What essentially happened was a 16 byte code (<a href="http://www.google.com/search?q=09-f9-11-02-9d-74-e3-5b-d8-41-56-c5-63-56-88-c0&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a" onclick="javascript:urchinTracker ('/outbound/article/blog.digg.com');" target="_blank">09-f9-11-02-9d-74-e3-5b-d8-41-56-c5-63-56-88-c1</a>) that protects HD-DVDs from being pirated, played on unsupported platforms (such as Linux), being ripped, etc. was leaked onto the internet. A piece of legislation protecting the code called the DMCA was passed in 1998 which extends the protections of copyright and makes it illegal to produce or spread methods of circumventing or infringing copyright. So, the code is not protected speech. My posting it here even is illegal. (It should be noted that some feel the very existence of the code and the resulting inability to play HD-DVDs on Linux or back them up is a consumer rights violation. Legally, this assertion is not ungrounded but until the DMCA is repealed it is irrelevant. The DMCA for its part has faced much derision and opposition since its inception for many reasons, vagueness high among them. If I informed you that you could circumvent copyright and reproduce a book with a copier, paper and ink, I could be in violation of the DMCA, for example.) The Movie Companies whose copyrights are protected by this code are of course upset that the safety of their product is now jeopardized by piracy. The code leaked out onto the web in February and the movie companies began sending out cease and desist letters so that sites would take it down. Then, on May 1st people started noticing. Three sites in particular which all derive their content (information) from their users formed the center of it all. Slashdot, Digg, and Wikipedia. Slashdot and Digg are user-generated technology news sites and Wikipedia is, of course, the online encyclopedia we all know and love. When Wikipedia and Digg started trying to censor the code (Slashdot didn't)  from their sites people started noticing and rebelled in extraordinary fashion. Within 48 hours the number of hits when the code was searched for on Google went from under 1,000 to over a million. Digg and Wikipedia were swarmed with people trying to propagate the code in dozens of forms (such as masquerading it as lottery numbers, an IP address, or even a picture of stripes where the colors' hex values spelled out the code). Digg was the center of the controversy and simply could not control the number of users forcing the information onto the site through stories, diggs (votes that increase a story's visibility on the main page), and comments. Wikipedia had more success by locking the entry for HD-DVD and did a number of other things to prevent the spread but still had it's forums inundated with the code.<br><br>The Punchline:<br>The important fact wasn't that people spread the code and lashed out\fought back against what they perceive as draconian intellectual property regimes and corporations (that happened for regular old DVDs with DeCSS in 1999) but that these sites, the icons of the Social Web or Web 2.0, were at the mercy of their userbases.<br><br>The Analysis:<br>The amazing promise of the Open Source revolution has been the efficiency and power of it's production models. That's what enabled a few thousand volunteers and about a thousand dollars a month to compete with Encyclopedia Britannica through Wikipedia. That's what enabled a rag tag bunch of software developers from round the globe compete with Microsoft and Apple through Linux. While it's clear that the Open Source Model has definite advantages its limitations and drawbacks are somewhat less studied and, perhaps due only to lack of experience and evidence, less clear. We remain uncertain what can benefit from "going open," we remain uncertain about exactly how the power structures work, and we remain uncertain about exactly who is in control. It's the difference between the interactions and activities of hierarchies and bureaucracies (which we understand so well) and those of networks. The importance of such knowledge and it's relevance in the coming century has been demonstrated by our need to understand the dynamics of networked organizations like Al-Qaeda and the Taliban. For the most part, our bureaucracies have trouble stopping them even with considerably greater resources due to networks decentralized nature. It's as though there's no point to attack. What is particularly significant about the events of May 1st is that Wikipedia and Digg are not equal in their openness. Specifically, digg was unable to control it's users and Wikipedia was. This seems to imply that digg is <em>more open</em> than Wikipedia. Wikipedia however is promoted as more open than Digg and is designed with openness in mind. Digg's openness was, at least to some extent, accidental. Wikipedia has had to deal with more cyber-vandalism of this sort and so it was better equipped for the task. However, the same tools and methods of control that allowed them to prevent vandalism of entries enabled them to censor as well. Everything on Wikipedia is under an Open Source legal license (the GFDL). Digg's content is protected in no such way but it has fewer restrictions and administrative tools to control submissions and content. This is in part interesting because some people have suggested that Digg took advantage of its userbase to aggregate news content but this implies a control that is completely lacking. The suggestion at face value does seem a bit ridiculous when you consider that Wikipedia is doing precisely the same thing until you consider that Digg is a for-profit venture and grosses about $3 million annually. What's interesting about that suggestion is that it agrees with what we might imagine to be the case. Digg allows people to submit the news which people do because they enjoy it and Digg profits from it. But it's not that simple. Digg provides a platform on which people can author and vote on content and they profit from being an attention center of the web. Attention is becoming economically valuable. When companies use Google's AdSense they are essentially trying to buy attention. The web has made the reproduction of content an exercise in attention economics. All content, all video, audio, images, and text can be reproduced and distributed (effectively) for free. The scarcity has become one of time, one of attention. Hence the attention is the valuable thing. Sites on the web which get the most traffic are directly linked to the highest advertising profits. Digg gets the importance of attention and the users get the <em>platform</em>. That's a very important distinction so I'm going to repeat it once more. <em>The users don't get the content, they get the platform.</em> The essential defining element of any open source media, maybe any open source thing (so far as I can puzzle out) is that the users get the platform. The product, whether it's software, media, or otherwise is not what the users get. The users get the toolset that leads to the product and they (as the community) control the resulting product but that control is coincidental. As Jimmy Wales (founder of Wikipedia) said, "The big secret of course is that Wikipedia is not really about an encyclopedia, it's just a big game of nomic." The whole point is having control of the rules of the game. To this extent, I'm skeptical even of the claim that Wikipedia is more or less open than Digg. While Wikipedia locked entries from editing, the forums were still swamped with the Code they were trying to Censor. Moreover, as Jimmy Wales stated the rules could be changed at any time. While the platform has more controls and different power structures than Digg it still belongs to the users.<br><br>The Aftermath:<br>There have been numerous responses to the Code Frenzy over the last few days. One interesting reaction cited the entire movement as dumb because this sort of mass civil disobedience wasn't legal and wouldn't change the law or the decisions of the Content Corporations to use it and to use encryption. While those are all valid points I think they generally eschew the interesting aspects of this event in terms of hierarchies and networks clashing as social-organizational structures. Another reaction takes on the view of the necessary incentive to get people to spread sensitive information or participate in this sort of viral protest movement. Another still criticized Wikipedia for even trying to censor the number as it's effort would obviously be futile. The most interesting part is still Digg folding to it's user base. Businessweek had a cover story on Digg in August of last year and while Digg may make $3 million annually it's esteemed value is closer to 200 million dollars. Here's a 200 million dollar icon of the web being forced, more or less, to decide to work with or against their user base (which is the source of their power) and deciding to surrender to the whims of that user base even when that stance clearly flies in the face of the law and places them at odds with far more established and wealthy firms (the entire movie industry).<br><br>The Conclusion\Why it matters:<br>So, really, why such a big fuss about a little code and some cyber disobedience? Why the emphasis on new organizational structures? It is largely, for me, personal. I wrote this because these moments remind me of the little subtleties that I forget make Open Source special as an organizational form. I wrote this because I feel like I have a better understanding of makes something, anything, not just software, open than I did before the events of May 1st. But I'm also writing it because there's a direct connection between Economic\Material Progress and Innovation. New goods produce new profits and creativity is, I'm pretty sure, king. Google isn't open source but they've done the next closest thing. They've tried to foster good relations with their userbase and they allow their employees twenty percent time to work on what they want. That twenty percent time is motivating for people to produce. We all want to do what we want. I think that's a huge part of why Google's on top. They've found a way to make work not so worklike and in so doing increased the productivity of their workers. Eric Raymond once wrote that Enjoyment predicts Efficiency and I think that's a much more profound statement than he may have realized when he wrote it. If that's true and if, as I believe, Open Source fosters more enjoyment from it's participants than other methods of organizing production then it is a more efficient method of production than any other in existence. Open Production Models harness this enjoyment through voluntary selection of labor and many other motivating factors which I believe cause it to be potentially the most innovative organizational mode in existence. What's really fantastic is that I think it fixes a lot of the Spiritual Decay (which flies in the face of Material Progress) that Capitalism (depending on your view) has brought about. Finally, I think it's self-empowering and educating which ties into both the enjoyment and spiritual repair bits and also seems to foster a sort of social capital when many sociologists are concerned that our social capital is deteriorating, all the while providing public goods and services and reinvigorating the idea of a commons. Even if it just raises human efficiency in production and creativity, I'd say we can't ask for much better than that.<br><br>PS: I've underestimated the excellence of Radiohead's <em>Kid A</em>.<br>PPS: Sorry this wasn't a short entry like I promised.


title: Programming in the Debugger
date: 2008-08-13 19:57:40.000000
format: html
content:
  There's a quote I recalled reading on the internet and wanted to send to a friend recently but I couldn't find it. I stumbled across it today over on <a href="http://lambda-the-ultimate.org/">Lambda the Ultimate</a> and am archiving it here due to awesomeness. Lambda the Ultimate is a fantastic community centered around programming languages and there are many great discussions worth reading. This discussion starts off with the aforementioned quote which I'll excerpt here and goes on to discuss dynamism in languages, specifically as it relates to interactivity versus a specific typing discipline. Ready for the awesome quote? Good.<br><br><a href="http://lambda-the-ultimate.org/node/12">By way of Luke Gorrie over on Lambda the Ultimate</a>:<br><div class="content" style="padding-left: 30px;"><span>By way of Joe Marshall in <tt>comp.lang.lisp</tt>:</span><br><pre>Here's an anecdote I heard once about Minsky.  He was showing a<br>student how to use ITS to write a program.  ITS was an unusual<br>operating system in that the `shell' was the DDT debugger.  You ran<br>programs by loading them into memory and jumping to the entry point.<br>But you can also just start writing assembly code directly into memory<br>from the DDT prompt.  Minsky started with the null program.<br>Obviously, it needs an entry point, so he defined a label for that.<br>He then told the debugger to jump to that label.  This immediately<br>raised an error of there being no code at the jump target.  So he<br>wrote a few lines of code and restarted the jump instruction.  This<br>time it succeeded and the first few instructions were executed.  When<br>the debugger again halted, he looked at the register contents and<br>wrote a few more lines.  Again proceeding from where he left off he<br>watched the program run the few more instructions.  He developed the<br>entire program by 'debugging' the null program.</pre><br></div>


title: Progress Report
date: 2007-07-02 00:11:00.000000
format: html
content:
  I never thought this would be so much trouble. I'm getting the ftp server up and working more on the site as we speak. It was down when I woke up because of an AT&amp;T service outage in my area and we didn't get internet access (and consequently the site) back up until about 3pm. At any rate, I'm headed for the gym now and will come back to work on it more later. Aside from getting the ftp server up I'm hoping to get <a href="http://www.ampache.org">ampache</a> installed which would let me stream whatever music I put on the machine out onto the net. It would be an internet jukebox. Yeah! Additionally, there's still lots of content and prettifying left to be done on the general site so my work is cut out for me. Especially if I want to try to migrate all the old livejournal posts on there. *sigh* More later. Wish me luck.<br><br>-B


title: Quick Code Post
date: 2009-08-25 20:04:17.000000
format: html
content:
  I'm hoping to get back on track with my blogging (and following other folks blogs) in the next few days. I wanted to post this code real quick though before I forget about it. I've had a lot of fun playing with lisp lately and have written...4 silly, small scripts in the last week.<br><br>- The first goes through 12 months of CSV call logs from AT&T to find out the 5 people I spend the most minutes talking to.<br><br>- The second recurses through a directory running an external program to find the bpm on each one and logging the difference from the current BPM in id3 tag to a file. It's 90% done, I just have to clean up some of the output parsing from the external process. Very rarely, my cl-ppcre regex doesn't match. Silly corner cases.<br><br>- The third takes a directory of 20 or fewer *.ogg files, maps them to keystrokes and I'm working on a simple loop so that they play in a spawned "ogg123" whenever I press said keys. The main hold-up at present is that (read-char) blocks while waiting for a #\Newline and (read-char-no-hang) gave me some other error I forgot.<br><br>More on all that later. Some M3U files (playlists) I had laying around weren't importing into a different mp3 player. The reason? They weren't using absolute pathnames. My solution was hackish but I coded it, fixed them and moved on with my life in about 3-5 minutes. Hard to argue with that. And the code:<br><br><pre lang="lisp"><br>(defpackage :fix-m3u<br>  (:use :common-lisp))<br><br>(in-package :fix-m3u)<br><br>(defun fix-m3u (path)<br>  (let ((new-m3u (make-array 16 :adjustable t :fill-pointer 0)))<br>    (with-open-file (in path)<br>      (loop for line = (read-line in nil) while line do<br>	(let ((abspath (concatenate 'string "/home/redline/music/" line)))<br>	  (vector-push-extend abspath new-m3u))))<br>    (with-open-file (out path :direction :output<br>			      :if-exists :supersede)<br>      (loop for line across new-m3u do<br>	(format out "~a~%" line)))))<br></pre><br>


title: Quick Emacs Question
date: 2008-04-21 04:01:58.000000
format: html
content:
  Dear Interwebs,<br><br>I've gotten rather accustomed to Edwin as I've worked my way through SICP. Eventually I'll want to use a different scheme so I'll have to switch to Emacs. I've been working on that lately but there's one thing holding me back that I can't find a solution to anywhere. I've got quack installed and really like the edwin behavior of C-x C-e. That is, when I evaluate an S-Expression I want it to be evaluated on a REPL in the background and the resulting value or error information dumped into the text editing buffer. I do not want a REPL to show up with that information in a new frame. Please, Emacs folk: Help.


title: Quick Mercurial Tip
date: 2008-10-17 19:20:36.000000
format: html
content:
  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 .<a href="http://linux.die.net/man/5/hgignore">hgignore</a> 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:<br><br><code><br>syntax: glob<br><br>unversioned/*<br>.hgrc<br>.hgignore<br>*~<br>\#*<br>*.elc<br>.DS_Store<br></code><br><br>Also, there are some great mercurial articles <a href="http://dougsland.livejournal.com/tag/hg">here</a>. I'm also playing around with <a href="http://www.xach.com/lisp/zs3/">Zach Beane's ZS3</a> library. Nice stuff. Also nice is his <a href="http://xach.livejournal.com/130040.html">Common Lisp small project guide</a>. That's damn handy. Unfortunately, all I'm using S3 for at the moment is to store <a href="http://redlinernotes.com/blog/?p=723">RedLinux</a> (695mb iso) and drakma <a href="http://common-lisp.net/pipermail/drakma-devel/2008-September/000732.html">currently requires loading the full file in memory</a> to upload it with PUT. I guess I'll be keeping an eye on <a href="http://www.weitz.de/">Edi Weitz</a> then. More later...


title: Quick Music Post...
date: 2009-04-25 15:51:31.000000
format: html
content:
  Then back to working on a final CS project. Sorry if I haven't been around.<br><div><!--  @import url(http://skreemr.com/styles/embed.css); --><br><table border="0" cellspacing="0" cellpadding="0"><br><tbody><br><tr><br><td class="sk-topleft" width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-topleft.gif" alt="" /></td><br><td class="sk-toprow">Jamie Lidell - All I Wanna Do</td><br><td class="sk-topright" width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-topright.gif" alt="" /></td><br></tr><br><tr valign="middle"><br><td class="sk-lightleft3" width="16"></td><br><td class="sk-lightback3"><object width="290" height="24" data="http://skreemr.com/audio/player.swf" type="application/x-shockwave-flash"><param name="bgcolor" value="#ffffff" /><param name="align" value="middle" /><param name="flashvars" value="playerID=1&amp;bg=0xCDDFF3&amp;leftbg=0x357DCE&amp;lefticon=0xF2F2F2&amp;rightbg=0xF06A51&amp;rightbghover=0xAF2910&amp;righticon=0xF2F2F2&amp;righticonhover=0xFFFFFF&amp;text=0x357DCE&amp;slider=0x357DCE&amp;track=0xFFFFFF&amp;border=0xFFFFFF&amp;loader=0xAF2910&amp;soundFile=http://captainsdead.com/pfork2008/091%20Jamie%20Lidell%20-%20All%20I%20Wanna%20Do.mp3" /><param name="src" value="http://skreemr.com/audio/player.swf" /><param name="wmode" value="transparent" /><param name="quality" value="high" /></object> <img style="padding:0;border:0;vertical-align:bottom" src="http://skreemr.com/images/skreemr_logo_small_name_only.png" alt="" /></td><br><td class="sk-lightright3" width="16"></td><br></tr><br><tr><br><td width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-bottomleft.gif" alt="" /></td><br><td class="sk-bottomrow">Found at <a href="http://skreemr.com/link.jsp?id=625A4A5152556315&amp;source=embed">skreemr.com</a></td><br><td width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-bottomright.gif" alt="" /></td><br></tr><br></tbody></table><br></div><br><div><!--  @import url(http://skreemr.com/styles/embed.css); --><br><table border="0" cellspacing="0" cellpadding="0"><br><tbody><br><tr><br><td class="sk-topleft" width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-topleft.gif" alt="" /></td><br><td class="sk-toprow">The Velvet Teen - Chimera Obscurant</td><br><td class="sk-topright" width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-topright.gif" alt="" /></td><br></tr><br><tr valign="middle"><br><td class="sk-lightleft3" width="16"></td><br><td class="sk-lightback3"><object width="290" height="24" data="http://skreemr.com/audio/player.swf" type="application/x-shockwave-flash"><param name="bgcolor" value="#ffffff" /><param name="align" value="middle" /><param name="flashvars" value="playerID=1&amp;bg=0xCDDFF3&amp;leftbg=0x357DCE&amp;lefticon=0xF2F2F2&amp;rightbg=0xF06A51&amp;rightbghover=0xAF2910&amp;righticon=0xF2F2F2&amp;righticonhover=0xFFFFFF&amp;text=0x357DCE&amp;slider=0x357DCE&amp;track=0xFFFFFF&amp;border=0xFFFFFF&amp;loader=0xAF2910&amp;soundFile=http://pigeonkicking.googlepages.com/04ChimeraObscurant.mp3" /><param name="src" value="http://skreemr.com/audio/player.swf" /><param name="wmode" value="transparent" /><param name="quality" value="high" /></object> <img style="padding:0;border:0;vertical-align:bottom" src="http://skreemr.com/images/skreemr_logo_small_name_only.png" alt="" /></td><br><td class="sk-lightright3" width="16"></td><br></tr><br><tr><br><td width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-bottomleft.gif" alt="" /></td><br><td class="sk-bottomrow">Found at <a href="http://skreemr.com/link.jsp?id=62524B55535565&amp;source=embed">skreemr.com</a></td><br><td width="16"><img style="padding:0;border:0;" src="http://skreemr.com/images/corner-bottomright.gif" alt="" /></td><br></tr><br></tbody></table><br></div>


title: Quick Poll
date: 2007-06-16 18:50:00.000000
format: html
content:
  Dear Lazyweb,<br><br>If I had to get a domain name (www.something.com) what should that it\something be? I was thinking britlit.com but I'd love to hear others peoples opinions, ideas, suggestions. Let me know in the comments.<br><br>-B


title: Quick Quote
date: 2007-10-04 03:05:03.000000
format: html
content:
  This is a really good essay on complexity in software appropriately entitled<a href="http://http://www.gamearchitect.net/Articles/SoftwareIsHard.html"> Why Software Is Hard</a>.<br><br>(The difference is that the overruns on a physical construction project are bounded.  You never get to the point where you have to hammer in a nail and discover that the nail will take an estimated six months of research and development, with a high level of uncertainty.  But software is fractal in complexity.  If you're doing top-down design, you produce a specification that stops at some level of granularity.  And you always risk discovering, come implementation time, that the module or class that was the lowest level of your specification hides untold worlds of complexity that will take as much development effort as you'd budgeted for the rest of the project combined.  The only way to avoid that is to have your design go all the way down to specifying individual lines of code, in which case you aren't designing at all, you're just programming.<br><br>Fred Brooks said it twenty years ago in "No Silver Bullet" better than I can today:  "The complexity of software is an essential property, not an accidental one. Hence, descriptions of a software entity that abstract away its complexity often abstract away its essence.")<br><br>I also found an interesting opinion piece/writeup on <a href="http://www.berniecode.com/writing/inheritance/">Inheritance</a>.<br><br>More later. It's sleepy time.


title: Quick Thoughts on Languages
date: 2009-03-26 16:37:21.000000
format: html
content:
  <p>John Wiegley posted an article that I thought was fun a week or so back called "Hello Haskell, Goodbye Lisp". Naturally, it made it on <a href="http://news.ycombinator.com/item?id=516038">Hackernews</a> and <a href="http://www.reddit.com/r/programming/comments/84o17/hello_haskell_goodbye_lisp/">Reddit</a> and there were comments of all stripes. Whenever somebody posts an article about a language they're learning the initial reaction from some folks is "What an idiot. Implement something big and hard already!" and I think that is a bit obnoxious as well as missing the point. John Wiegley doesn't think he's a genius because he cracked Haskell's code. I think he knows that Haskell is a deep language and he's playing in the shallow end. What he (and many other people) are trying to figure out is which Programming Languages are equipped to deal with the future requirements of programming well and where the languages stand in terms of personal appeal.</p><br><p>Someone mentioned that Clojure would've been a more fair comparison for Haskell than Common Lisp and there's some truth to that. You'd think that Wiegley being a Lisp fan would cause him to lean towards Clojure but he <a href="http://www.newartisans.com/2009/03/the-jvm-and-costs-vs-benefits.html">really doesn't like the JVM for scripting</a>. Why? He thinks it's startup times are unacceptable. I don't mind that but I'd be more concerned about the difficulty in producing standalone binaries and the reliance on having a JRE installed at all. It's just not my thing but that's what we're talking about here: preferences.</p><br><p>Different languages are suited to different domains. It's so bad I'm not even sure I believe in the phrase "general purpose languages" anymore. You've got the "server/enterprise" languages (Java,C#,etc), "scripting" languages (Python/Perl/Ruby generally, PHP/JS for web), "embedded" languages (Forth, C/C++, Lua), and then C and C++ again for Operating Systems, Compilers, "low level stuff" and real-time applications/games. Not that games don't often contain twice as much in the way of Lua\Python scripts as C++ core. *sigh*</p><br><p>So, let's be clear. You have to know several languages and the question is: Which languages do I use to be the most happy and efficient? I want my programming future to be fun! My thoughts are presently as follows. I'm not sure how many languages you can <em>really</em> hold in your head at one time. For regular, proficient (expert?) use I'd say I think 2-3 is about right and a half dozen is possible. I have a hard time imagining simultaneous mastery and regular use of 12 languages. I'm going to try to keep my list to 5 languages.</p><br><p>1. You have to be able to deal with C. You just do. It doesn't hurt to know assembly (ARM, 6502, x86, or whatever) but you have to be able to deal with C. If only to create bindings from other languages to C code. So deal. At least we now have a Low-Level and Embedded language covered that will give us the ability to work with lots of Open Source Software and older code. Also, I didn't choose C++ because I think C is simpler and cleaner. Obviously, there's a lot of C++ code around but trying to really know C++ has to be equivalent to really knowing 2 or 3 other languages. I'm skeptical. Again, preferences.</p><br><p>2. Python has lots of libraries, lots of existing code, and is reasonably readable and self-consistent. I think it serves as a good scripting language and can be used for web development fairly well (see: reddit). Plus it's actually employable and higher level than C.</p><br><p>3. I like Lisps. Don't ask me why, it's just a preference and I think they're fun. My priorities with a Lisp are being able to work with C code well, produce fast native code (preferably with some plan for multicore {futures,stm,threading solution,shared nothing message passing, etc), generate standalone executables and have a decent collection of libraries. That leaves me torn between SBCL (30MB hello-world?! I guess I could use CLISP but what about multicore performance?), Chicken Scheme (multicore performance again? they do have futures...) and Clojure (I need the JVM, you don't do standalone binaries, and there's no asdf/rubygems/cabal/chicken-setup/easy_install/anything?). *sigh* Oh, lisp.</p><br><p>4. Haskell does have some advantages. As far as I know it's the most "parallel-ready" programming language presently available. This is largely because it has solutions for the most granularities of parallel\concurrent code. And yes, I know parallelism and concurrency aren't the same thing...even though Wikipedia confuses them. Erlang, Scala and Clojure all have benefits but for various reasons Haskell is my pick of the lot. I'm open to that changing but it wouldn't hurt to know a lazy, bondage and disciple-style typed functional language regardless. It's an interesting way of thinking. Hackage is reasonably impressive considering the youth of the language in terms of mainstream use and Hayoo and Hoogle are quite unusual and cool methods for code search. The quality of the toolset is also impressive (GHC,Haddock,QuickCheck,Cabal,etc).</p><br><p>5. Factor. I'm not trying to be weird here, I'm just interested in knowing a concatenative language. The library support is pretty good. The code looks pretty clean. It produces standalone binaries which are both pretty small and pretty fast. I feel like a lot of smart design decisions have been made. I'm really interested in seeing where Factor goes. There are a considerable number of libraries given the number of people working on Factor and it's age. Hopefully, it'll only keep getting better.</p><br><p>So, what are my preferences stated more explicitly?</p><br><ul><br><li>I prefer the late-binding/dynamic/whatever-the-hell-you-want-to-call-them languages like Lisp, Scheme, and Factor. They just make the development process more fun than anything else I've worked with. Clojure tempts me but the lack of standalone binaries, package management, and the requirement on the JVM makes me a little nauseous. I don't think Emacs is too heavyweight for text editing but I think <em>that's</em> too heavyweight. Sadly, these languages appear to me to be in the worst library position, save Clojure which is saved via Java. There's a lot of division of effort among the others and there always has been.</li><br><li>Haskell in emacs with ghci open in a shell isn't perfect but it isn't bad either and you do get all that type safety/power/relatively-painless-multicore-speedups. Plus the libraries and hayoo/hoogle, etc are pretty great.</li><br><li>As for C and Python, they're on the list so I can possibly be employed at some point as well as play in the codebases of my favorite Open Source Software.</li><br></ul><br><p>I like High Level Languages and I like a lean towards functional programming. Haskell has been fun and I'm now interested in type systems that are actually nice to use but I would still run to a Lisp that made fast parallel code easily, even if it meant having some special typing constructs just for stateful behavior. Object Orientation was the hammer used to hit everything that looked like a nail for the last 20 years and while it unquestionably has it's place, I prefer the functional style in my personal experience where possible. That may well change when I start writing projects &gt; 1000 LOC. Other than that, I just want a nice development environment and good libraries.</p><br><br>Before I forget, I should note that <a href="http://www.reddit.com/r/programming/comments/86zjg/ask_proggit_im_15_and_i_absolutely_love/c08f6wi">gaze made a very good comment</a> worth keeping in mind on a recent reddit thread about programming languages which I'll try to sum up in a sentence or two: "The important part of a programming language is using it. You'll learn theory as you go, now write code." Anyway, I'm going to run away from social news sites for a bit and try to get some real work done.


title: Quick Update
date: 2007-09-12 03:03:33.000000
format: html
content:
  I'm studying for a Discrete Mathematics test tomorrow. Aaah!! I'm learning Predicate Calculus in that class though so that's exciting. It's fun to finally be a bit more versed in all that. It also helps that I listened to <a href="http://video.google.com/videoplay?docid=-4167170843018186532">Faith, Evolution, and Programming Languages</a> yesterday and feel like I have a better understanding of <a href="http://en.wikipedia.org/wiki/Type_theory">Type Systems Theory</a> thanks to that.<br><br>Other stuff: Thinking too much, as usual. Mostly about computers but also had good discussions with Teresa and Bria about the notion of progress and whether or not we are in a state of decline. More on that soon hopefully. I need to get some of those thoughts down after the discussions have fleshed out a bit more. Anyone else have thoughts to contribute or want in on the discussion?<br><br>I really want to write something about why Computer Science as a field is provocative and unique to me. I've also sort of started my nerd/programming pdf/ebookshelf. Presently on it are the following:<br>Structure and Interpretation of Computer Programs by Abelman and Sussman<br>The Art of Computer Programming, Vol. 1-3 by Donald Knuth<br>Concrete Mathematics by Donald Knuth<br>Code Complete, 2e by Steve McConnell<br>The Tex Book by Donald Knuth<br>Programming Erlang by Joe Armstrong<br>The Best Software Writing (selected) by Joel Spolsky<br>Introduction To Algorithms, 2e by MIT Staff<br>Learning Perl, 4e by Phoenix and Schwartz<br>Linear Algebra and It's Applications, 3e by Gilbert Strang<br>The Practice of Programming by Kernighan and Pike<br>How to Think Like a Computer Scientist: Learning With Python by Downey, Elkner, and Meyers<br><br>I also have some physical copies of other books and should probably come up with a comprehensive syllabus (similar to the one I did for <a href="http://www.redlinernotes.com/blog/?p=245" title="Open Source Syllabus">open source a while back</a> and my <a href="http://www.redlinernotes.com/blog/?p=225" title="Hypothetical Bookshelf">book wish list</a> just before summer) for CS books in the near future.<br><br>This means I'm now studying two languages for school and two in my spare time. Java and C for school and Erlang and Scheme for fun. It makes me feel a little crazy because I don't know that anyone else actually does this. If there was someone else at SPSU that was studying Erlang that would literally surprise the hell out of me and I don't know how to feel about that. *shrug*<br><br>Also, I'm looking forward to possibly switching from Ubuntu to Fedora when Test2 drops on Thursday and I'm thinking of trying FreeBSD and Nexenta or OpenSolaris in the future. More on stuff like that and hardware nonsense later.<br><br>Finally, a few songs I've been enjoying:<br>Incubus - Talk Shows on Mute<br>The Stills - Yesterday Never Tomorrows<br>Guster - I Hope Tomorrow Is Like Today<br>Zero 7 - Out of Town<br>Incubus - Agoraphobia


title: Quick Update\Summer Reading List
date: 2007-05-30 07:40:00.000000
format: html
content:
  The first day of work was pretty good. I'll say more tomorrow cause I need to get to bed for tonight. My summer reading list has lengthened though.<br>My summer reading list was:<br><a href="http://www.amazon.com/Worldchanging-Users-Guide-21st-Century/dp/0810930951">Worldchanging by Alex Steffen</a><br><a href="http://www.amazon.com/Wealth-Networks-Production-Transforms-Markets/dp/0300110561/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496576&amp;sr=1-1">The Wealth of Networks by Yochai Benkler</a><br><a href="http://www.amazon.com/Infotopia-Many-Minds-Produce-Knowledge/dp/0195189280/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496785&amp;sr=1-1">Infotopia by Cass Sunstein</a><br><a href="http://www.amazon.com/Code-Other-Cyberspace-Lawrence-Lessig/dp/0465039138/ref=sr_1_3/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496809&amp;sr=1-3">Code by Lawrence Lessig</a><br><a href="http://www.amazon.com/Just-Fun-Story-Accidental-Revolutionary/dp/0066620732/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496835&amp;sr=1-1">Just for Fun by Linus Torvalds and David Diamond (finished)</a><br><a href="http://www.amazon.com/C-Programming-Language-2nd/dp/0131103628/ref=pd_bbs_2/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496856&amp;sr=1-2">The C Programming Language by Kernighan and Pike (Amazon lies. I have the first edition!!!)</a><br><a href="http://www.amazon.com/Introduction-Computing-Systems-gates-beyond/dp/0072467509/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496940&amp;sr=1-1">Introduction to Computing Systems by Patt and Patel</a><br><a href="http://www.amazon.com/Emergence-Connected-Brains-Cities-Software/dp/0684868768/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496965&amp;sr=1-1">Emergence by Steven Johnson</a><br><a href="http://www.amazon.com/Sync-Order-Emerges-Universe-Nature/dp/0786887214/ref=pd_bbs_2/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180496999&amp;sr=1-2">Sync by Steven Strogatz</a><br><a href="http://www.amazon.com/Borges-Collected-Fictions-Jorge-Luis/dp/0140286802/ref=pd_bbs_sr_2/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497029&amp;sr=1-2">Collected Fictions by Jorge Luis Borges</a><br><a href="http://www.amazon.com/Godel-Escher-Bach-Eternal-Golden/dp/0465026567/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497049&amp;sr=1-1">Godel, Escher, and Bach by Douglas Hofstader (Amazon lies again. First edition! [even though it's not as cool as 1st ed. k&amp;p])</a><br><br>Today I purchased\added to that:<br><a href="http://www.amazon.com/Cradle-Remaking-Way-Make-Things/dp/0865475873/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497112&amp;sr=1-1">Cradle to Cradle by Braungart and McDonough</a><br><a href="http://www.amazon.com/Programming-Universe-Quantum-Computer-Scientist/dp/1400033861/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497133&amp;sr=1-1">Programming the Universe by Seth Lloyd</a><br><a href="http://www.amazon.com/Future-Ideas-Commons-Connected-World/dp/0375726446/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497156&amp;sr=1-1">The Future of Ideas by Lawrence Lessig</a><br><a href="http://www.amazon.com/Singularity-Near-Humans-Transcend-Biology/dp/0143037889/ref=pd_bbs_sr_1/002-2810119-2873630?ie=UTF8&amp;s=books&amp;qid=1180497184&amp;sr=1-1">The Singularity is Near by Ray Kurzweil</a><br><br>Oh, boy. Good times. Busy times. Also, in case you don't know: Never let me near a bookstore ever again.


title: Quick Vote Results
date: 2007-06-20 00:40:00.000000
format: html
content:
  Ladies and Gentlemen,<br><br>I have to say your contributions were wonderful, particularly those made to the "other" category. One of the domain names suggested had such a wonderfully high pun factor and semantic richness to it that I decided to go with it outright. I have registered the domain redlinernotes.com from Network Solutions for one year, effective immediately. Now I just need to get a server up and have the DNS point to it. I was going to use an old system I have lying around the house here but it doesn't like me. I'd rather have a dedicated machine for this than serve off my desktop. That's just not good practice. I'll figure something out. Give me time. If anyone has an old system they are about to toss (Pentium II, 128 mb of ram or better) feel free to give me a call and let me put it to good use.<br><br>Thanks again,<br>Brit


title: Quick Vote
date: 2007-06-19 00:39:00.000000
format: html
content:
  Ladies and Gentleman,<br><br>I will now conduct a vote which will end at 5pm this tuesday afternoon. Simply indicate which domain name you think I should purchase. Your Choices:<br>1. codebetweenthelines.com org or net<br>2. britblit.com org or net<br>3. Other: Fill in here. (Bonus points if it incorporates in some way the word redline)<br><br>Thank you,<br>Brit


title: Quote Post
date: 2008-02-28 18:08:57.000000
format: html
content:
  This is probably the most succinct way to put what I'm, in part, getting at. Make no mistake, I will flesh out that essay...it just might take a while. For now, I'm back to programming. More soon though guys.<br><br>"Civilization advances by extending the number of important operations which we<br>can perform without thinking about them."<br>–Alfred North Whitehead<br><br>This quote sourced from one of <a href="http://www.dreamsongs.com/">Richard Gabriel</a>'s essays, <a href="http://www.dreamsongs.com/Files/ObjectsHaveFailedSlides.pdf">Objects Have Failed</a>. It also appears in <a href="http://www.dreamsongs.com/Files/RoadNotTaken.pdf">The Road Less Taken</a>.


title: Quotes on Programmers
date: 2007-09-14 14:40:13.000000
format: html
content:
  "15 years of experience interviewing programmers has convinced me that the best programmers all have an easy aptitude for dealing with multiple levels of abstraction simultaneously." - Joel Spolsky, <em><a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html">The Guerilla Guide to Interviewing v3.0</a></em><br><br>"As Lyle Ramshaw, a former graduate student of Knuth's, points out, "Don claims that one of the skills that you need to be a computer scientist is the ability to work with multiple levels of abstraction simultaneously. When you're working at one level, you try and ignore the details of what's happening at the lower levels. But when you're debugging a computer program and you get some mysterious error message, it could be a failure in any of the levels below you, so you can't afford to be too compartmentalized." - <a href="http://www.salon.com/tech/feature/1999/09/16/knuth/index1.html">Salon.com Article on The Art of Programming</a><br><br>"The key to being a good hacker may be to work on what you like. When I think about the great hackers I know, one thing they have in common is the extreme difficulty of making them work on anything they don't want to. I don't know if this is cause or effect; it may be both." - Paul Graham, <em><a href="http://paulgraham.com/gh.html">Great Hackers</a></em><br><br>Fun stuff that maybe relates...or I've just been reading anyway:<br><a href="http://weblog.raganwald.com/2005/07/why-you-need-degree-to-work-for-bigco.html">Why You Need A Degree For Big Companies (parody)</a><br><a href="http://paulgraham.com/colleges.html">News From The Front (Why the College you go to doesn't matter)</a><br><a href="http://paulgraham.com/love.html">How To Do What You Love</a>


title: Random Midweek Thoughts
date: 2007-06-20 19:47:00.000000
format: html
content:
  I wish I had included John Mayer - New Deep and Guster - Amsterdam in the songs of summer. They'll probably be in next week's. I also am really getting back into Amon Tobin but his jazz/samba/drum'n'bass/insanity isn't really any particular season.<br><br>Lessig made a big announcement this week. I'll cover it in the monday update. He's smart and awesome.<br><br>In response to Justin last night: Linux has as many problems as you want it to. Get your hands dirty.<br><br>Speaking of, this week's linux lesson is looking like it should be fantastic. Max, get ready. Expect to learn about &lt;tab&gt; at the command prompt, more permissions, man pages, and the "|" key (that's shift backslash). It'll let you do fun things like "ls -l | wc -l" and "ps -ax | grep "yourmom"" and such.<br><br>Currently setting up subversion box and building jetty\terracotta cluster. More on that in t3h future. This week is turning out pretty nice.<br><br>Also, I was at the command prompt and ran "locate yourmom" and got nothing? So, where is she?<br><br>.<br>.<br>.<br>.<br>;-)


title: Random Quote Post
date: 2007-11-24 19:07:55.000000
format: html
content:
  I've been stumbling across these this morning and find them all quite provocative. What do you think?<br><br>"As Navrozov explains, the word "power" in Russian means "possession" and is a cognate to the English word "wield." Since in a democracy public opinion is power and universities are the source of all legitimate opinion, they can be said in a sense to possess and wield our minds. So no one at a university should be surprised to smell the marmoset, not even in an innocent little department called "computer science," but I knew the stench from childhood and to say I was shocked would be an understatement." - <a href="http://unqualified-reservations.blogspot.com/2007/07/my-navrozov-moments.html">Unqualified Reservations</a><br><br>"Of course, in a sense, anything you do with in a computer can be described as "mathematics." The point is not whether or not programming is math. The point is what notation is most effective for expressing programs. Choosing the best notation is the entire problem of programming language design, and this problem is neither mathematical nor scientific. A programming language is a user interface for programmers, and if you can reduce UI design to math, science, or any formal process, call Apple, not me." - <a href="http://unqualified-reservations.blogspot.com/2007/08/whats-wrong-with-cs-research.html">Unqualified Reservations</a>


title: Random Thoughts
date: 2008-08-25 14:14:44.000000
format: html
content:
  It's already Fall semester. How messed up is that? I haven't learned near as much as I was hoping to by now. That said, I'm no longer as much of an idiot when it comes to programming. I'm just unlearned. Well, maybe that's what I was before. At any rate, some good fortune has come my way in that department. I'm helping out with a very cool startup related to cloud computing and getting mentored by a guy doing the sort of work I'd be interested in. He also happens to share some of my views on society and education.<br><br>I've had lots of financial thoughts lately. It's funny when you realize that you can count on one hand the material things that make you happy and count on the other hand your material needs. Afterwards you should figure out what it really costs you to <em>happily</em> live (barring dependents) and figure out just how money jobs could consequently sustain you that way. Take that, put it in your pipe and smoke it.<br><br>Two parting thoughts:<br><br>One, this <a href="http://news.ycombinator.com/item?id=285107">hackernews</a> discussion on the article <a href="http://ournature.org/~novembre/illich/1970_deschooling.html">Deschooling Society</a> is excellent. Someone should make a Facebook note about it and get some OU kids in on the discussion.<br><br>Two, Red Hat and Fedora's servers got hacked recently. The situation was resolved before any nastiness could filter downstream. CentOS servers were unaffected though and this makes me wonder if Fedora didn't share infrastructure whether they would've been hacked as well. What's the thought here? Well, it makes me think there's <em>less</em> incentive to attack community distributions and, similarly, community products. I could certainly be wrong. Your thoughts?


title: Random Updates
date: 2011-04-01 22:25:45.000000
format: html
content:
  The last 2 months have flown by. My time as an undergrad is coming swiftly (and happily) to an end and I'm finalizing my plans for after graduation. I said Paktahn 0.9.4 would be out by the end of February and wound up being two weeks late on that. <a href="http://aur.archlinux.org/packages.php?ID=30242">Paktahn 0.9.4.8</a> is out now and my users seem to be <a href="https://bbs.archlinux.org/viewtopic.php?pid=908026#p908026">pretty happy</a>. At the end of the day, it's all about customer service. There were a number of bugfix/point releases to 0.9.4 due to the libalpm C library that paktahn has long used having some API changes in version 6 that needed accomodating. I <a href="https://github.com/falconindy/pacman/commit/bbeca6f78a5eb0a452834283357464e79280251b">found a regression</a> in libalpm though which was pretty fun.<br><br>I seem to be staring at a lot more C code this semester than usual. Aside from paktahn, one of my classes has me working on the cl-opencv library which is a set of FFI bindings to Intel's OpenCV computer vision library. This semester has been the first time I've used CL's FFI and the CFFI library and in spite of some hiccups it's been a lot of fun. It certainly opens up a new world of possibilities being able to reuse all the C code that's already been written. I remember looking into /usr/include/ one day recently, seeing gobs of C header files and feeling joy. It almost makes me want to write and compile some C myself. ... Almost. ;) Unfortunately I have more than enough lisp software to keep me busy for a spell and I hope to have more to say on that subject very soon.<br><br>Other than school I've been enjoying skateboarding, as usual, and eating lots of Sushi. And my latest musical kick, as I'm sure some of you were wondering, is Childish Gambino. Gambino is the alias of Donald Glover who you may also know as Troy from the delightfully funny TV show Community and as a former staff writer on 30 Rock. His EP and last album, Culdesac, are available on <a href="http://www.childishgambino.blogspot.com">his website</a> for free. The guy is crazy prolific. That's all for now...


title: Reading Material
date: 2009-09-09 03:15:24.000000
format: html
content:
  I screwed around a little this weekend trying to port some <a href="http://en.wikipedia.org/wiki/Common_Lisp">Common Lisp</a> code to <a href="http://haskell.org/">Haskell</a>. I hadn't messed with Haskell in months, made a bit of a fool of myself on the #haskell IRC channel and then promptly realized I'm being silly. Why? It's fun learning languages. I have half a mind to try learning some <a href="http://factorcode.org/">Factor</a> by porting the same code to it.<br><br>It's silly because I'm finally at the point where Lisp is starting to feel natural and I'm getting real work done in it. Nothing fancy or sophisticated mind you. I'm thoroughly a noob. But I'm a noob who is learning by working on bigger projects. If I give in to the "new language diversion" now, it may be fun and I may get something out of it but it's mostly writing toy programs in another language instead of continuing to work on bigger programs in a language I'm finally starting to think of as a native tongue.<br><br>So, here's some reading I hope to do in the near term:<br>I might as well get as good at SLIME as I can since it's my environment of choice. Bill Clementson has <a href="http://bc.tech.coop/blog/081209.html">a series of good articles</a>.<br>I am finally going to take some time and try to pick up web dev. I'll start at the high level and go lower as I have to. It seems like Weblocks is the most <a href="http://bitbucket.org/skypher/weblocks-stable/overview/">active</a> and <a href="http://groups.google.com/group/weblocks">awesome</a> Lisp Web Framework so I'm sure I'll be writing about that some. <a href="http://weitz.de/hunchentoot/">Hunchentoot</a> and <a href="http://weblocks.viridian-project.de/">weblocks</a> are installed on my laptop so I just need to hit <a href="http://trac.common-lisp.net/cl-weblocks/wiki/UserManual">the</a> <a href="http://viridian-project.de/~sky/user-guide.stx.html">docs</a> and get hacking.<br>If there's stuff I can't figure out how to do, between #lisp on IRC, some mailing lists and <a href="http://rosettacode.org/wiki/Category:Common_Lisp">RosettaCode</a>, I'm sure to be in good shape.<br><br>Finally, if you're interested in lisp do as Xach said and read some of abhishek's stuff before you get started. <a href="http://abhishek.geek.nz/docs/lisp-answers/">Dispel the myths</a> and <a href="http://abhishek.geek.nz/docs/features-of-common-lisp">know about the features</a>.


title: Ready for a New Year?
date: 2007-12-29 07:20:24.000000
format: html
content:
  I am. 2007 was more trouble than I was really looking for. I'm certain that 2008 is going to rock hard though.<br><br>Part of that is that I've been cleared to work at TVS full time starting in January. That's one thing off my mind. I'll have more details when I return from my trip to Montana on the 9th. I leave next Wednesday, if you're curious.<br><br>I've got a lot that I've been taking care of and still have to take care of before the trip. So sorry for being distant. And the blog silence. Things are picking up though. I also have a slew of interesting projects to drone on about in the New Year.<br><br>Before all that though, a Xmas Recap. Xmas was great.<br><br><img src="http://www.redlinernotes.com/images/happy_xmas07.jpg" title="Happy Xmas 07" alt="Happy Xmas 07" height="576" width="768" /><br><br>You had this much fun too, right? I'm finally moved back into my room. Most importantly, my digital life is all pimped out.<br><br><img src="http://www.redlinernotes.com/images/workbench.jpg" title="Workbench" alt="Workbench" height="576" width="768" /><br><br>See? I've been working on pulling so much power from one outlet that I kill the house. Unfortunately I've only succeeded in dimming the lights. Just kidding. Well, about the trying to part anyway.<br><br>Before I get any questions I should note that the iPod is Dad's. I haven't converted yet. Additionally, the old Nokia has been replaced. The setup is great. I can switch between the laptop, desktop/server, and PS3 on the LCD. Presently I keep the speakers tied to the PS3 at all times but I'll probably buy an adapter to share them across the devices. Eventually I'll get around to doing the same for the keyboard and mouse. Fear the cable nesting that will occur.<br><br><img src="http://www.redlinernotes.com/images/fear_it.jpg" title="Fear It" alt="Cable Mess and Electrical and Heating Disasters, Here I come!" height="576" width="768" /><br><br>Now, on to projects. Of course, I'm going to start programming first and foremost. I've decided I ought to progress in the following order: Structure and Interpretation of Computer Programs, then Concepts, Techniques, and Models of Computer Programming, and finally How to Design Programs. On the side I'll be working on Rosen's Discrete Math, Spivak's Calculus, and maybe Strang's Introduction to Linear Algebra. If I manage to work through even half of that this year that would be pretty good stuff. So far I own the following programming texts.<br><br><img src="http://www.redlinernotes.com/images/first_books.jpg" title="CS Heavyweights Represent" alt="There should be a sign: SICP Coming Soon. Right next to the Sipser. Yep." height="576" width="768" /><br><br>SICP is in the mail along with Discrete Math. I'm planning on ordering Spivak's Calculus and Strang's Linear Algebra later on.<br><br>Besides programming though you've got to have some stuff up your sleeve and I certainly do. I'm going to set this PC up for recording work and get some guitar doodles down at some point, just for fun. I also am filming virtual footage for a skate video. It makes me the biggest nerd possible but I don't mind. I've got 1 minute and 40 seconds of decent footie so far and some friends working on parts. Beyond that I'm going to work on getting Linux up and going properly on the PS3 and getting the speakers and input devices shared between all my systems as mentioned (probably with a KVM). I also will look into getting my PS3 to behave as a legitimate media server. Finally, I'm looking at getting my website server moved to a VM and run off my desktop. I've got the VM up and we'll see about performance issues and other testing soon.<br><br>I'm collecting Course Materials for SICP at the moment and have to run to take care of some of today's other nonsense but I'll be back for more soon. Peace!


title: Recent Developments
date: 2007-12-03 04:20:12.000000
format: html
content:
  I know I haven't posted in a while. A lot has been happening. I found out earlier today that my Dad has lung cancer. I didn't want to post anything until we were sure. It's stage 4 and has spread beyond the lungs. It is treatable and we're going to see what we can do. All of this is a bit surreal. These are strange times. Oddly though, everything is pretty well timed. Mom is taking some time off work. I'm actually taking a year off school, working full time, and will be living at home for a few months so I'll be able to help out. I'm doing fine so far. Maybe the news will hit hard later.<br><br>I can say this: I don't have any regrets about not knowing him or spending time with him. It's been 16 or so awesome years. Hopefully there will be many more but I wouldn't change a thing about what's come so far. And that's one thing I can be very, very happy about.


title: Redlinernotes Reborn
date: 2009-02-27 23:29:33.000000
format: html
content:
  I can't believe it's only been 8 days since I posted last.  Life has been moving at an insane speed but I've been really happy.  A lot of things are just sort of coming together lately and I have to say it's a pretty pleasant change of pace. Dad's on the mend. We don't have the cancer beat but it's certainly at bay for a little while. He'll likely never be out of the woods completely. Schoolwork is going pretty well. I haven't been working absolutely as hard as I can but I have low A's or high B's in all my courses. I planned out my course schedule for the next few semesters and figured out that I'll graduate in December of 2010. That's with 4 course summer sessions. It's longer than I'd like but nothing from Oglethorpe carries anywhere. Plus CS is my second time switching majors so I was practically starting over. *sigh* Still, I have a plan and that's pretty nice. I also did taxes this week and found out I'll get a $1500 rebate.<br><br>You also may notice that <a href="http://redlinernotes.com/">redlinernotes.com</a> is going significantly faster of late. I finally manned up and began paying for "real hosting". There are a number of benefits, not least of which are freeing up my home connection from requiring a Static IP. Moreover, the upload speed and latency are much, much better at the hosting facility. It's a Virtual Private Server running ArchLinux which I purchased through <a href="http://www.linode.com/">Linode</a>. It's $20 a month and so far I couldn't be happier with it. I may do web development on it in Haskell, Scheme or Lisp at some point but that's down the road a bit.<br><br>Not everything is roses though. I got hosed on my berrics predictions. Of course, I blame Steve Berra. Marc and Steve were supposed to have a nice game of skate but then Steve caught something awful that looks like chicken pox. Instead of putting the round off further, Steve MC'd and pitted Marc against Johnny Layton who failed to make his first round appearance. Marc was definitely having an off day. He missed like 4 tricks before beginning to hit his stride and it was <a href="http://theberrics.com/dailyopspost.php?postid=810">too little, too late</a>.  If I recall Marc missed a regular 360 flip and a nollie flip. It was painful to watch. Anyway, my whole bracket is F-ed.<br><br>I'm having a Street Fighter IV tournament tonight. I've been spending a lot of time working on my game this week. For some reason I get really competitive about fighting games but only fighting games. I don't think SF4 has the mass appeal or the elegance of Smash Bros though. I'll probably try to write more on that later and I should acknowledge I have a strong bias that I'm trying to compensate for from years of Smash Bros play. So far I've settled on Fei Long as my main character and I'm planning to spend some time getting decent with Gouken as my secondary. The tournament should be fun, at any rate.<br><br>Other than that, I'm having trouble thinking of what else has been going on. The one bug in Linux that's been bugging me is <a href="http://mailman.alsa-project.org/pipermail/alsa-devel/2009-February/014778.html">fixed upstream</a> so the next ALSA release will make me pretty damn happy. I'm increasingly enamored with Haskell. I'm slowly beginning to work my way through <a href="http://book.realworldhaskell.org/">Real World Haskell</a> and plan to spend a good bit more time on it over spring break (March 8th-14th if you were wondering). It's the only language I've seen that seems like it can handle issues of parallelism and concurrency more or less today. I'm definitely keeping a close eye on it.


title: Redlinernotes.com is Live!
date: 2007-07-01 12:17:00.000000
format: html
content:
  Dear Friends,<br><br>Redlinernotes.com is finally up. But BE WARNED! It is not yet pretty. At all. In fact, it's a repulsive mess. It is however online and I'll be working on it all day tomorrow so hopefully by nightfall it will look pretty decent.<br><br>Stay classy, readers!<br><br>Yours,<br>Editor-in-Chief


title: RedLinux released!
date: 2008-09-23 17:13:53.000000
format: html
content:
  At long last and at least 3 days later than expected I'm released RedLinux into the wild. Keep in mind this is really just an ArchLinux derivative that I've had lots of fun working on. Most to all thanks should go to the awesome folks behind <a href="http://www.archlinux.org/">ArchLinux</a> and the <a href="http://larch.berlios.de/">larch</a> software for creating Live CDs. That said, you can now download the ISO image for RedLinux from my <em><strong><a href="http://s3.amazonaws.com/redlinux/redlinux.iso">High-Speed Amazon S3 mirror</a> and <a href="http://redlinernotes.com/blog/?p=724">there is an Install Walkthrough</a> now available.</strong></em> Burn the ISO to CD and reboot with it in your CD or DVD drive to try it out.<br><br>There's a new user guide at <a href="http://www.redlinernotes.com/docs/redlinux/new_user_guide.txt">http://www.redlinernotes.com/docs/redlinux/new_user_guide.txt</a> and the config files also reside in <a href="http://www.redlinernotes.com/docs/redlinux/">that directory</a>. I'll be creating an individual page with an installation tutorial and a few other things in the coming weeks. There are a few other things I'm focused on at the moment but that is coming. You can of course always contact me via blog comments, IM, or e-mail if you're trying it and having any problems however.<br><br>Four quick pointers (not in hexadecimal):<br>1). The default username and password are guest. The new_user_guide.txt file on my website or in the home directory of the install tells you how to change it and/or create new users, etc.<br>2). The "start menu" so to speak is accessed by right-clicking on an empty part of the desktop. You should be able to get to anything you need from there (file manager, text editor, web browser, music player, reboot/shutdown, etc).<br>3). There's a run command available by pressing Alt+F2. Typing wicd-client gets you the wireless/network browser, firefox gives you the browser, etc. Wicd-client is supposed to load on launch but does not. Accidentally messed up a start script, getting it fixed and uploaded this afternoon hopefully.<br>4). You can install RedLinux by opening a terminal (Right-click, then Terminal) and typing "sudo /opt/larchin/run/larchin.py" and hitting enter. Enter the guest password at the prompt and off you go.<br><br>I'll be updating this post and the upcoming RedLinux portion of the site as more content is available.


title: RedLinux Revamped
date: 2009-05-12 20:00:25.000000
format: html
content:
  So the last time I really blogged about RedLinux was back in September 08 when I made <a href="http://redlinernotes.com/blog/?p=723">the first release</a>. I kept tweaking things now and again but at this point I've got something that I'm really not messing with very often. I've christened it "Redlinux v.20" and I'm planning on trying to make releases every six months or so. They'll mostly consist of package updates with any other changes listed in the changelog. I'll be trying to keep the latest versions of all my dotfiles and a complete archlinux package list in the <a href="http://redlinernotes.com/docs/redlinux/">redlinux docs</a> portion of my website. With the dotfiles and the package list, you could basically build the thing yourself anyway and it keeps my life easier besides. The only real long term plans other than that are to improve documentation and make it more friendly for other people to tinker with.<br><br>I've made a Live CD image with an installer and uploaded the ISO to my Amazon S3 account. You can <a href="http://s3.amazonaws.com/redlinux/redlinux.iso">grab the ISO here</a>. The <a href="http://redlinernotes.com/blog/?p=724">old install guide</a> still applies.


title: Remembering Poetry
date: 2009-09-04 04:26:40.000000
format: html
content:
  It's been a long time since I've read poetry, as I related to a friend recently. I've wanted to get back to it and so poked through two volumes given to me by friends who know my love of poetry. I absolutely have to post one of the poems I read. The poem is taken from the book <b>Good Poems</b>, given to me by Don Gerz on my 22nd birthday. It was compiled by Garrison Keillor. It's called <em>To be of use</em> by Marge Piercy taken from p. 157. It's really outstanding. Someday I hope I work as well as those depicted...and find work as worth doing as that described.<br><br><blockquote><br>The people I love the best<br>jump into work head first<br>without dallying in the shallows<br>and swim off with sure strokes almost out of sight.<br>They seem to become natives of that element,<br>the black sleek heads of seals<br>bouncing like half-submerged balls.<br><br>I love people who harness themselves, an ox to a heavy cart,<br>who pull like water buffalo, with massive patience,<br>who strain in the mud and the muck to move things forward,<br>who do what has to be done, again and again.<br><br>I want to be with people who submerge<br>in the task, who go into the fields to harvest<br>and work in a row and pass the bags along,<br>who are not parlor generals and field deserters<br>but move in a common rhythm<br>when the food must come in or the fire be put out.<br><br>The work of the world is common as mud.<br>Botched, it smears the hands, crumbles to dust.<br>But the thing worth doing well done<br>has a shape that satisfies, clean and evident.<br>Greek amphoras for wine or oil,<br>Hopi vases that held corn, are put in museums<br>but you know they were made to be used.<br>The pitched cries for water to carry<br>and a person for work that is real.


title: Report Card, Semester 1
date: 2008-07-22 15:58:17.000000
format: html
content:
  So, I've been trying to do this self-study thing for 30 weeks. I probably should've stepped back to evaluate my progress before now but I've allowed myself to be distracted with other things. You know, moving out, working my first full-time job, learning how to cook, clean and take care myself. That's no excuse though. Rather than beat around the bush some more let's just get to the heart of it:<br><blockquote>"You got an F. What the hell's the matter with you? Ya big failure.<br>Final Grade: 20.786516853932586%<br>To be fair, you would've had to do 14.0 problems a week to finish the book in 26 weeks.<br>They are pretty hard problems. Just keep at it man. You may want to revise your strategy though."</blockquote><br>We're 30 weeks into 2008 and I've only done 74 of the 356 problems in that legendary text, the <a href="http://mitpress.mit.edu/sicp/">Structure and Interpretation of Computer Programs</a>, which was the central object of my study this semester. That's about two and a half problems a week. Not my brightest shining moment. This whole experience definitely gives me new appreciation for the people that tried to structure and/or educate me in the past. Clearly, I need one of two things:<br><br>1) A good kick in the ass to really get going.<br>2) A new gameplan.<br><br>Personally, I'm going to try a mix of the two. Where 1) is concerned I recently wrote <a href="http://redlinernotes.com/code/?rev/d2c83643c13e" title="Yep. Self-study.scm.">a self-study program</a> (the biggest program I've ever written, actually) to help me keep abreast of my own progress and help me chart my course a bit. Where 2) is concerned I'm going to have to start making concessions to maintain momentum and I'm not entirely comfortable with that.<br><br>What concessions do I mean? Well, some of the SICP problems are hard. Really hard. <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-29.html#%_sec_4.4.4">Unreasonably hard</a> (see Exercise 4.79 at the bottom for which a good answer is "probably worth a Ph.D."). The book has it's reputation for a reason. It's a reputation of difficulty but also of <a href="http://www.amazon.com/review/R403HR4VL71K8/">enlightenment</a>. A lot of very smart people say it's the best way to learn Computer Science and probably the best book on the subject yet written. I'm willing to take their word for it. Anyway, there are problems that I get hung up on and I haven't been letting myself move on to the next section of the book without solving all the problems in the current section. That just isn't scaling well. I'm already hung up on the last 4 problems in <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html">Section 2.1</a>. God knows what would happen come 4.4. I'll surely never finish the thing if I don't let myself move forward.<br><br>With that in mind, a week or so ago I did let myself move forward a bit and work on Section 2.2. I've already got about a third of it done. Maybe even half. I'm worried about this because I want to stay honest. I don't want to shirk the hard stuff. I won't move past problems unless I'm <em>really</em> stumped and I will circle back at various points to try to work through them. Aside from SICP, I've worked on <a href="http://www.htdp.org/">HTDP</a> (How To Design Programs) and <a href="http://gustavus.edu/+max/concrete-abstractions.html">CA</a> (Concrete Abstractions) as well this semester. I got an almost reasonable portion of HTDP done but next to nothing on CA. I'd really like to try plowing through as much of those three books and <a href="http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/ref=pd_sim_dbs_b_1">The C Programming Language</a> (rocking the 1st ed.) as possible before Xmas.<br><br>Semester 3 (starting in January) I'm hoping to work on Algorithms (<a href="http://www.cs.berkeley.edu/~vazirani/algorithms.html">DPV</a>, not <a href="http://projects.csail.mit.edu/clrs/">CLRS</a>), <a href="http://www.amazon.com/Essentials-Programming-Languages-Daniel-Friedman/dp/0262062798/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1216741298&amp;sr=1-1">Essentials of Programming Languages</a> (1st edition, baby!) and one of my Operating Systems texts. Of course, <a href="http://www.mhhe.com/math/advmath/rosenindex.mhtml">Discrete Math</a> (5th ed) would be more prudent and judging by this semester this could all be revised by Xmas. Well, back to work. Happy Hacking!


title: Resolutions and Predictions
date: 2009-01-02 02:59:31.000000
format: html
content:
  So this is a stupid New Years Post and maybe it's a little late. Are you supposed to post these on New Years Eve? I don't know. Anyway, here we go.<br><br>Resolutions:<br><br>- By May, I will be over half way done with HTDP.<br>- By May, I will have analyzed over 1000 songs for samples and make at least one composition from said samples.<br>- I will maintain a 3.5 GPA. Sure that's probably not rigorous or demanding but discipline before excellence.<br>- I will blog and exercise (gym, jogging, or skateboarding) at least once a week.<br><br>Predictions:<br><br>- <span style="text-decoration: line-through;">Solid State Drives will attain an across-the-board performance advantage with a reasonable size disadvantage by Q4 2009. (~256gb for $300 or ~$1.25/gb)</span> Edit: Okay, that was <em>really</em> stupid and not what I meant to express. Solid State Drives <em>already</em> have an across the board performance advantage with a (for some definitions of) reasonable size disadvantage if you get a good drive (Read: Intel or Samsung). I was really trying to comment on affordability of said quality drives. The Intels are sitting at $500/80gb right now and I don't know about the Samsungs. I'm predicting ~$300/256gb by the end of 2009. I'm leaving myself leeway by not stating whether or not I mean fiscal 2009.<br>- No console will have a strong lead by the end of 2009 and we'll have to call this generation Console War a draw.<br>- Linux and Mac will continue to infiltrate the consumer market but will not exceed 10% of worldwide market share.<br>- The MPAA will follow the RIAA's lead and stop their lawsuits to pursue alternative means of Intellectual Property Rights enforcement.<br>- IP Law and laws covering digital property and privacy will see increased scrutiny and public awareness. (Hey, I'm just hoping.)<br><br>What haven't I thought of that I should have?


title: Rethinking
date: 2007-06-18 07:30:00.000000
format: html
content:
  I think I was dumb today. This being my first significant breakup I didn't realize that we were broken up yet. I'm not sure I have realized that even now. Also, I had convinced myself there was a chance things would still work out. Also, my only two friends that I hang out with outside of school are moving in the fall and I'm transferring. Not far but I'm transferring. So, I've got a pretty fresh start on my hands. Naturally, I don't want it. I mean I'm glad to study computer science and not be at Oglethorpe but I have no idea what to do as far as my relationships with people. That's very intimidating of course. A lot is happening at once and I'm (I think understandably) pretty mixed up and confused. I also think I might be faking being okay so something bad might just set in any day now. I'll try to find a way to focus this energy but aside from reading books, working, and going to the gym I can't think of any good ones. And I feel like I'm so crazy and have been for so long (particularly with regards to Sonya) that nobody really wants to hear any of this and I don't blame them. I don't know what to say half the time. When I face problems that I can't mentally untangle I'm not sure that I do well at all. If I can't think about something clearly I'm kind of screwed. Anyway, I'm very tired so I'm going to go to bed and hope I can get it together before work Tuesday. But today was hard.


title: Rilke via O’Reilly
date: 2008-06-09 14:22:25.000000
format: html
content:
  I haven't posted, read or written much poetry in a while. I've been focused on other things and while I'm happy about how I've chosen to focus my energies I miss poetry. With that in mind, I stumbled across a Rilke poem this morning <a href="http://radar.oreilly.com/archives/2008/06/americas-capability-for-change.html">thanks to Tim O'Reilly</a> and decided to reproduce it here.<br><br>Archaic Torso of Apollo<br>We have no idea what his fantastic head<br>was like, where the eyeballs were slowly swelling. But<br>his body now is glowing like a lamp<br>whose inner eyes, only turned down a little,<br><br>hold their flame, shine. If there weren't light, the curve<br>of the breast wouldn't blind you, and in the swerve<br>of the thighs a smile wouldn't keep on going<br>toward the place where the seeds are.<br><br>If there weren't light, this stone would look cut off<br>where it drops so clearly from the shoulders,<br>its skin wouldn't gleam like the fur of a wild animal,<br><br>and the body wouldn't send out light from every edge<br>as a star does...for there is no place at all<br>that isn't looking at you. You must change your life.


title: Scripting with SBCL
date: 2009-09-09 17:40:14.000000
format: html
content:
  Over the labor day weekend, I had fun. I avoided dreary schoolwork, I played guitar, I hung out with <a href="http://trashed-ideas.net/">cool</a> <a href="http://krow684.livejournal.com/">people</a>, I celebated my second anniversary with a <a href="http://redlinernotes.com/images/she_is_hardcore.jpg">lovely lady</a>, I wrote code.<br><br>One bit of code I worked on is a script to read in AT&T call logs and figure out the 5 people you call most often. As you might guess, this can be useful for people contemplating switching to T-Mobile (say, for an <a href="http://maemo.nokia.com/n900/">upcoming piece of hardware</a> designed for their 3G network). In short, the script is run from the command prompt with <code>./myfaves.lisp</code> and prints out the 5 people you've talked to the most based on your call logs and the total percentage of your minutes those calls account for. The call logs this script processes can be downloaded from wireless.att.com. Login to your wireless.att.com account, go to "Bill & Payments". Under "Wireless Statement Summary" click the "Call Details" tab and finally scroll down a bit and click "Download Call Details". Using the dropdown box, select each month then click CSV format and submit. Put all those files in the same directory and then execute the following lisp script from that directory.<br><br><pre lang="lisp"><br>#!/usr/bin/sbcl --script<br>(declaim (sb-ext:muffle-conditions style-warning))<br><br>(eval-when (:compile-toplevel :load-toplevel :execute)<br>  (let ((*standard-output* (make-broadcast-stream))<br>	(*error-output* (make-broadcast-stream)))<br>    (require 'asdf)<br>    (require 'split-sequence)<br>    (require 'osicat)<br>    (require 'cl-containers)))<br>  <br>(defpackage :my-faves<br>  (:use :common-lisp :cl-containers :osicat)<br>  (:import-from split-sequence split-sequence))<br><br>(in-package :my-faves)<br><br>;; ATT CSV info<br>;; call logs start on line 24, entries on every other line (evens)<br>;; voice calls final line starts with "Totals"<br>;; 5th comma-entry is number, 7th is duration in minutes<br><br>(defparameter *months* nil)<br>(defparameter *results* (make-array 6 :fill-pointer 0))<br>(defparameter *call-log* (make-container 'sorted-list-container<br>					 :test #'equal<br>					 :key #'car<br>					 :sorter #'string<))<br><br>(defun init ()<br>  (loop for path in (list-directory (truename ".")) do<br>    (let* ((pathstr (native-namestring path))<br>	   (ext (subseq pathstr (- (length pathstr) 3))))<br>      (when (string= "csv" ext)<br>	(push path *months*)))))<br><br>(defun find-faves ()<br>  (loop for file in *months* do<br>    (load-calls file))<br>  (analyze-data)<br>  (print-results))<br><br>(defun load-calls (path)<br>  (catch 'load-calls<br>    (with-open-file (in path)<br>      (loop for i from 1 to 23 do<br>	(read-line in nil))<br>      (loop for line = (read-line in nil) do<br>	(parse-call line)))))<br><br>(defun parse-call (csv-line)<br>  (cond ((string= "" csv-line))<br>	((finished-voice csv-line) (throw 'load-calls 'done))<br>	(t (let* ((split-line (split-sequence #\, csv-line))<br>		  (number (fifth split-line))<br>		  (minutes (parse-integer (seventh split-line))))<br>	     (insert-call-sorted number minutes)))))<br><br>(defun finished-voice (csv-line)<br>  (string= "Totals" (subseq csv-line 0 6)))<br><br>(defun insert-call-sorted (number minutes)<br>  (let ((present (search-for-item *call-log* number :key #'car)))<br>    (if present<br>	(incf (cdr (search-for-item *call-log* number :key #'car)) minutes)<br>	(insert-item *call-log* (cons number minutes)))))<br><br>(defun analyze-data ()<br>  (ensure-sorted *call-log*)<br>  (sort-elements *call-log* #'> :key #'cdr)<br>  (loop for number from 0 to 4 do<br>    (vector-push (item-at *call-log* number) *results*))<br>  (let ((total-free (loop for i from 0 to 4 summing (cdr (aref *results* i))))<br>	(total-mins (reduce-elements *call-log* #'+ :key #'cdr)))<br>    (setf (aref *results* 5) (round (* 100 (/ total-free total-mins))))))<br><br>(defun print-results ()<br>  (format t "AT&T -> T-Mobile myFaves Recommendations:~%")<br>  (format t "-----------------------------------------~%")<br>  (format t "According to our analysis of your call logs, these are your 5 most frequently dialed numbers.~%")<br>  (format t "-----------------------------------------~%~%")<br>  (loop for i from 0 to 4 do<br>    (format t "~A whom you spoke to for ~A minutes.~%~%" (car (aref *results* i)) (cdr (aref *results* i))))<br>  (format t "These numbers should be your myFaves as they accounted for ~A% of your total minutes.~%" (aref *results* 5)))<br><br>(init)<br>(find-faves)</pre><br><br>I'm sure it's not the prettiest, lispiest code out there but it could be an awful lot worse. Also, sbcl emitted style-warnings when the script was run. This behavior surprised me a little bit. After all, if I'm <i>running</i> the script I have little need for the style-warnings. After some digging, I learned enough to write <a href="http://redlinernotes.com/sbcl/fix.patch.txt">this patch</a> for the program which suppressed the undesirable output. I hope to submit a patch to the SBCL manual in the next week or so that notes this may be desired as nothing on <a href="http://www.sbcl.org/manual/Shebang-Scripts.html">the current page</a> regarding <code>sbcl --script</code> would indicate that any output from the compiler would appear.


title: Second Friday Linux Lesson
date: 2007-05-25 19:59:00.000000
format: html
content:
  So, I'm running a little short on time here and cutting things a bit close but I've been thinking it out and we've got some great stuff to cover. Additionally, there's more great news on the Linux front that I'll be covering in depth before Monday but that's for later.<br><br>For my second Linux Lesson we're using what I think is one of the more important concept-application distinctions between *nix systems (Mac included) and Windows. The concept of the hour: Permissions also known as User Access Control and numerous other things. I should also note that permissions is somewhat tied to the concept of a superuser and so I'll brush over that as well.<br><br>Permissions are, in effect, the Operating System restricting the user to only being able to do the things they need to do. The idea here is to keep from handing the common computer user (who may not be a nerd) a desert eagle or shotgun with which they might blow off their own foot. So, the user has permission to mess with things like their /home/username directory (which in *nix systems is analogous to the My Documents, My this, My that, of Windows). Windows effectively lacks a permissions structure pre-Vista <em>by default</em>. I'll probably write more on this later as a concept called Sensible Defaults but for now just remember that Linux wants to help you not hurt yourself by keeping your ability to do bad things to a minimum.<br><br>Now for the command, sudo. Occasionally, you my find that you need to do something that you don't have permission to do. This doesn't in itself mean that what you want to do is a bad idea. Just use common sense. If you're deleting files you don't recognize, maybe it's a bad idea. If it's installing an application you want it's probably okay. It just depends. If you open the terminal, covered in our <a href="http://redline6561.livejournal.com/159234.html">last lesson</a>, and type "sudo other_command_you_want_to_do" then the Operating System will let you run that one command as the superuser (which is simply a user with no permissions restrictions, i.e. the ability to do anything) and prompt you for your password. If you successfully enter your password (which shouldn't be too tricky as long as you remember it) it will let you run the one command you didn't have permissions for one time and that's it. That single command, in conjunction with all the other commands you'll end up using it with, will end up making your life easier over and over again. That's it for this week.


title: Second Monday Update
date: 2007-05-21 23:29:00.000000
format: html
content:
  We'll start with a summary of last week.<br>Summer: Week 1: Finished<br><strike>Bank Deposit\Finances</strike><br><strike>Haircut</strike><br><strike>Econ Ch. 13, 6</strike><br><strike>Start Programming (C, Python, or a Functional Language {Haskell, Erlang, OCaml})</strike><br><strike>Talk to Mom about Blockbuster Movie Delivery. Begin Piracy Scheduling. Or open Netflix account.</strike><br><strike>Gym x3</strike><br><strike>Kower</strike><br><strike>Work on repartitioning System for Space. Switch Arch to Else? Yup. Fedora 7.</strike><br>Unexpected Projects completed:<br><a href="http://img459.imageshack.us/img459/782/screenshotzm5.png">Getting Rid of Windows Partition and Getting Windows running as a VM (Virtual Machine) in QEMU</a><br>I also made a fresh arch install and had some good fun pirating some things and uploading<br><strike><br></strike>Summer:Week 2:Goals<br>Monday<br>Kower\Econ Articles<br>Music Library Re-organization<br>Further Arch Linux Configuration (possibly try alternative WM (fluxbox?))<br>Tuesday<br>Gym<br>Kower\Econ Test??<br>Sonya<br>Wednesday<br>Computer Programming Chapter 2<br>Thursday<br>Gym<br>Econ Test<br>Friday<br>Anything Left at Oglethorpe (Econ)<br>Signatures on Withdrawal Forms for Fall<br><br>News for 5/21/07:<br>First off, there's an <a href="http://direct2dell.com/one2one/archive/category/1021.aspx">update on Dell's Linux offerings</a> on the Dell blog. It's noteworthy that they appear to be helping work on hardware support for Linux. I hope that means ATI/Nvidia support.<br>On the open source ATI front, Dave Airlie has announced a new <a href="http://airlied.livejournal.com/43975.html">release candidate of the X.org ATI Driver</a>.<br>There's been, as usual, a ton of activity in the <a href="http://gitweb.opencompositing.org">CompComm git</a> but it's interestingly centered around packaging and organization. I think we're getting closer to 0.1!!!<br>Purdue University had a big week, complete with an <a href="http://www.sciencedaily.com/releases/2007/05/070518163146.htm">advance in fuel cell technologies</a> that brings us much closer to hydrogen fuel and some folks at Michigan State University have made <a href="http://www.techreview.com/Energy/18741/">advances in corn-based biofuels</a>.<br>The University of Delaware has produced the <a href="http://www.techreview.com/Infotech/18745/">first silicon-based spintronics device</a>.<br>A very clever start up called Soliant Energy out of California has come up with a <a href="http://www.techreview.com/Energy/18718/">much more efficient way to do Solar Power</a>.<br><a href="http://starcraft2.com/">Blizzard announced Starcraft 2</a>!<br>And <a href="http://avant-window-navigator.googlecode.com/svn/trunk/ChangeLog">NJ Patel showed back up after a near 2 month absence</a> and is continuing work on some of his exciting projects like the Avant Window Navigator, Tracker, Affinity, and Arena. Good to have you back NJ.<br>Finally, the magnificent <a href="http://www.cbsnews.com/stories/2007/05/20/60minutes/main2830058.shtml">OLPC project made it on 60 minutes</a>. Intel is being dicks to them. Everyone who reads my blog, please stick with AMD. Really.


title: Second Thursday Literary Lines
date: 2007-05-25 02:24:00.000000
format: html
content:
  Another one of my favorites. This is the second Milosz poem I ever read but it's really stuck with me. I'll give the last of my three favorites next week and then move on.<br><br>3. Paradise by Czeslaw Milosz:<br>Under my sign, Cancer, a pink fountain<br>Pours out four streams, the sources of four rivers.<br>But I don't trust it. As I verified myself,<br>That sign is not lucky. Besides, we abhor<br>The moving jaws of crabs and the calcareous<br>Cemeteries of the ocean. This, then, is the Fountain<br>Of Life? Toothed, sharp-edged,<br>With its innocent, delusive color. And beneath,<br>Just where the birds set alight, glass traps set with glue.<br>A white elephant, a white giraffe, white unicorns,<br>Black creatures of the ponds. A lion mauls a deer.<br>A cat has a mouse. A three-headed lizard,<br>A three-headed ibis, their meaning unknown.<br>Or a two-legged dog, no doubt a bad omen.<br>Adam sits astonished. His feet<br>Touch the foot of Christ who has brought Eve<br>And keeps her right hand in his left while lifting<br>Two fingers of his right like the one who teaches.<br>Who is she, and who will she be, the beloved<br>From the Song of Songs? This Wisdom-Sophia,<br>Seducer, the Mother and Ecclesia?<br>Thus he created her who will conceive him?<br>Where then did he get his human form<br>Before the years and centuries began?<br>Human, did he exist before the beginning?<br>And establish a Paradise, though incomplete,<br>So that she might pluck the fruit, she, the mysterious one,<br>Whom Adam contemplates, not comprehending?<br>I am these two, twofold. I ate from the Tree<br>Of Knowledge. I was expelled by the archangel's sword.<br>At night I sensed her pulse. Her mortality.<br>And we have searched for the real place ever since.


title: Second Tuesday Quotables
date: 2007-05-22 20:33:00.000000
format: html
content:
  Giving the <a href="http://en.wikipedia.org/wiki/Linus_Torvalds" class="extiw" title="wikipedia:Linus_Torvalds">Linus Torvalds</a> Award to the Free Software Foundation is a bit like giving the <a href="http://en.wikipedia.org/wiki/Han_Solo" class="extiw" title="wikipedia:Han_Solo">Han Solo</a> Award to the <a href="http://en.wikipedia.org/wiki/Rebel_Alliance_%28Star_Wars%29" class="extiw" title="wikipedia:Rebel_Alliance_(Star_Wars)">Rebel Alliance</a>. - <a href="http://en.wikipedia.org/wiki/Richard_M_Stallman">Richard M Stallman</a><br><br>Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. - <a href="http://en.wikipedia.org/wiki/Brian_Kernighan">Brian Kernighan</a><br><br>One thing about school - I always had this attitude that I was in school to learn, and attempted to do whatever was involved in that process, while school had this attitude that I was there to earn grades, which I couldn't care less about. Unsurprisingly, my grades weren't very good. - <a href="http://en.wikipedia.org/wiki/Bram_Cohen">Bram Cohen</a><br><br>Where there is love, distance doesn't matter. - <span class="new">Mata Amritanandamayi</span><br><br>Love demands all, and has a right to all. - Ludwig van Beethoven<br><br>And think not you can direct the course of love; for love, if it finds you worthy, directs your course. - Khalil Gibran


title: Second Wednesday Songs of Summer
date: 2007-05-24 05:10:00.000000
format: html
content:
  Maroon 5 - A Little of Your Time<br>John Mayer - Clarity<br>Beck - I Think I'm In Love<br>Andrew Bird - Wishing for Contentment<br>Guster - Careful


title: Secondhand Standards
date: 2008-02-27 05:27:22.000000
format: html
content:
  <p>Every now and then I see, hear, or read something that sets my brain on fire. I find some connection that I didn't notice before and go off exploring. It happened a week or two ago over lunch at work. Occasionally there are lunch meetings around work-related activities that you can voluntarily attend. This particular lunch had us watching <a href="http://www.greenbuild365.org/videos/video_gb06_2.html">Paul Hawken's speech at Greenbuild 2007</a>. It set the old wheels turning and the dominos toppling over. This is what spilled out...</p><br><p>For me, I think this all started formally with Thoreau. He was the first person who promoted an idealogy that I both a) actually heard and b) identified with. This would've been in the 11th grade. Prior to this I was more or less an anarchist and held no ethos as my own. Long story short, I've moved on but the transcendentalists sort of hold a special place in my heart. And the thing is, while I've hung onto Walden like a treasure I haven't read it in too long. So when Paul Hawken started mentioning transcendentalists in his speech it was a moment of revelation for me as I came full circle.</p><br><p>There's a crystallization of my beliefs here that has taken years and is an ongoing journey so bear with me. The older I've grown the more interest I've taken in the notion of Historical Progress, or at the very least, of charting where the universe has been and where it's going. Particularly in the last two years or so, thinking about forms of social organization and things like <a href="http://www.amazon.com/Nonzero-Logic-Destiny-Robert-Wright/dp/0679758941">Robert Wright's Nonzero</a> and <a href="http://www.amazon.com/Singularity-Near-Humans-Transcend-Biology/dp/0143037889/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1204088999&sr=1-1">Ray Kurzweil's The Singularity is Near</a> have been interesting brain food. Of course, I've also been following Open Source, flirting with the environmentalists, and trying to figure out the lispers. And I think I see what I identify with and agree with in it all.</p><br><p>You see, I have this 90% theory. The theory states that at least 90% of human labor is expended to maintain the status quo and that only a fraction of our energy can go to what we care about or to new and creative things. This has come about because of increasingly complex social strata emerging as political and economic forms cave under the growth of civilization. Not western civilization but all civilization. It's a growing interdependency as <a href="http://www.ted.com/index.php/talks/view/id/68">Robert Wright</a> describes.</p><br><p>He's more or less nailed it. And this interdependency has occurred through large centralized institutions (particularly corporations and governments) that have driven forward economic progress at the price of independence. It's much harder in the 21st century to figure out how to completely sustain yourself in your basic survival needs without withdrawing from society altogether. The sort of experimentalism that was possible by providing for oneself outside of the traditional means is no longer a realistic goal. We have boxed ourselves in.</p><br><p>This seems to me an ethical issue. It is not an ethical issue because consumerism or capitalism is wrong but because one of the lauded premises (whether actual or not) of our nation was some increased degree of influence over one's destiny. In the present day, this influence is lacking if one wants to live in a social setting but with strong self-provision of needs. This frontier opportunity has gone missing on both the frontier of new societal forms and the independent pursuit of sustenance through life, liberty, and happiness.</p><br><p>This is not, it is important to note, the fault of capitalism or democracy. Rather, these are the limits of these systemic forms under burdens of complexity they are not equipped to handle. They have become our Golden Hammers. (A recent e-mail from a dear friend and former teacher of mine eloquently expresses <a href="http://redlinernotes.com/docs/Objects.doc">distress over this fact</a>.) In short, the promised revolutionary nature of America has been lost. The Internet is another thing that has been lauded as inherently free. And like the <a href="http://www.fsf.org/">FSF</a> and <a href="http://www.opensource.org/docs/osd">Open Source</a> this meant free in the context of freedom, libre, not free as in beer.</p><br><p><a href="http://www.lessig.org/">Lawrence Lessig</a> was the first to note to us that the internet is not inherently free. That being a man-made thing, like a government, the internet was subject to our control and thus could have its freedom removed. Whether or not that is occurring right underneath us remains a subject of debate. I contend, however, that is has already occurred with regards to our nation and, thanks to globalization, much of the "westernized" world. We are buried under the mountains of our own bureaucracy; democracy and capitalism have become organizational forms which limit our innovation and our efficiency. Most importantly, this has impeded our capacity to <a href="http://paulgraham.com/love.html">do what we love</a>.</p><br><p>And I feel like that is what the transcendentalists realized so long ago. They saw it coming and just maybe saw some of the things we stood to lose. Paul Hawken says Emerson realized that "It's all connected". That's why Thoreau reasoned his way into jail, because if he paid taxes while Texas Rangers raped Mexican women he figured it made him a rapist. That's why my friend Alexa saw people in South America who lived in poverty and slept on the job and instead of asking why they weren't like us, <a href="http://flyingover.livejournal.com/511887.html">asked why we weren't like them</a>. And that's why <a href="http://www.oreilly.com/openbook/freedom/ch01.html">Richard Stallman found ethics in software</a> (namely a printer driver). It's why a <a href="http://www.ft.com/cms/s/0/5554c882-d90d-11dc-8b22-0000779fd2ac.html?nclick_check=1">British journalist decries college</a> and <a href="http://www.lambdassociates.org/Blog/bipolar.htm">lispers wage a near religious war on tedium and repitition</a>.</p><br><p>These all seem like strange places to find ethics. And maybe they are. But this seems to be the strand that ties together article after article I read about <a href="http://www.paulgraham.com/colleges.html">why college is unnecessary</a> or <a href="http://paulgraham.com/nerds.html">high school is drudgery</a> or work is slavery. And I think if I had to give it a name, I could only call it Efficiency. Because we're just not as efficient as we'd like to be. We've finally lost the right to enough of our time that we're jealous about it. There's a recognition that there should be a way to keep society going without all of us dedicating all our time to make sure that it's still there tomorrow. And in come the environmentalists, shouting about the world we leave our children, talking about building to last.</p><br><p>And if there is one question I'm interested in answering it's this: Surely, there is a way for us to restructure society so that only 70% of human labor or 50% or less has to go to maintaining the status quo. Right? Then the rest could go to creativity or innovation or progress or us. I think there is and I'm not opposed to spending my life trying to answer the question. There do thankfully seem to be a number of revolutionary trends coming about, some of which are already well in swing. But it's late, I have work tomorrow, and much as I'd love to I have to call this a wrap for one night.</p>


title: Seeking a Net Win
date: 2008-06-19 03:36:05.000000
format: html
content:
  Things have been really crazy lately. I've been trying to do so much and it really is hard. The real world finds ways to eat most of the time you have. It makes you small. It's gotten to the point where it's hard to find time to do anything other than maintain a few precious friendships and keep the bills paid and the house clean.<br><br>That said, I'm trying to push forward. I've gotten in touch with some professors at Northeastern University where I'd very much like to study Computer Science in Fall of 2010, ideally. I also wrote code today for the first time in three weeks. It's hard to find the time, man!<br><br>More immediately I'm looking for a new job and have an interview tomorrow morning. For a variety of reasons I'm just not pleased with my current job and I think I can grow more and be happier elsewhere. Cross your fingers for me.<br><br>Finally, <a href="http://en.wikipedia.org/wiki/Jonathan_Zittrain">Jonathan Zittrain</a> was on <a href="http://www.comedycentral.com/colbertreport/full-episodes/index.jhtml?episodeId=173608">The Colbert Report tonight talking about his book</a>, <i>The Future of the Internet and How to Stop It</i>. I heard about it in advance and was very excited to see him speak. Unfortunately, I feel that he really botched the interview and I got into a long discussion with Ben about it. I'm pretty disappointed because there are important political issues about technology but they're rarely communicated to the public coherently and concisely and I'm no good at it myself.<br><br>I'll probably try to think of a good way to present it and give a fuller update in the next few days though. If I don't get bogged down with the promised education post or the emerging philosophy post or the big easy posts that is. Or hell, SICP 2.1. Yeah, right.


title: Self-Improving Means...
date: 2011-09-05 22:59:45.000000
format: html
content:
  Per Vognsen, whom I greatly admire, recently tweeted the following: "Least favorite type of blog: Unaccomplished 20-somethings writing self-improvement 'how to be awesome like me' articles." I would put myself in the category of unaccomplished 20-somethings but, happily, I'm not trying to tell you guys how to be awesome like me. ...cause I'm just some dude. And here's what's going on in ma domepiece (i.e. "head")...<br><br>My writing on this blog has flitted back and forth between being for an audience and being for myself. Of late, I think it's definitely swung back towards just for myself though I hope to blog some about hacking or other techno rants again in the near future. Of late, the only way I've been able to get anything down is to try and transcribe the massive looming smorgasborg of coagulating nonsense in my head. Which rather mirrors my life. Things have been good lately. I'm quite busy but I've been putting investment strategies and student loan payoff plans into place, moving, adjusting to my first "real" job, learning to be an adult (which itself is a loosely defined collection of things) and so on. I also just signed up for an <a href="http://ai-class.com/">AI course at Stanford</a> that they're offering free online this Fall. My CS and programming skills are nowhere near as broad or deep as I'd like them to be. And let's not even discuss my math chops!<br><br>I've finally gotten back into a rhythm of hobby hacking again which I'm quite thankful for. My latest project has been <a href="http://vintage-digital.com/hefner/software/shuffletron/">Shuffletron</a>, a command line music player I use daily but am not the original author of. So far I have added playlists and now...scrobbling! I'm a big fan of last.fm, simply because I listen to <a href="http://last.fm/user/redline6561">tons of music</a> and enjoy tracking those habits via graphs and a few simple statistics. A lot of other people enjoy using it and so I thought I'd add scrobbling support to shuffletron. It was involved enough that it deserved its own library and that has given birth to the unimaginatively named <a href="http://github.com/redline6561/cl-scrobbler/">cl-scrobbler</a> which I've been working on for about 3 weeks now to my surprise and chagrin. Also unexpected was the ~575 lines of code (counting whitespace and tons of docstrings) it has taken to produce said library. Granted, it would be 130 lines of code less if I just added a dependency on <a href="http://common-lisp.net/project/bese/arnesi.html">Arnesi</a> for plain old <a href="http://en.wikipedia.org/wiki/FIFO_(computing)">FIFO</a> <a href="http://en.wikipedia.org/wiki/Queue_(data_structure)">Queues</a>. Anyway, I'm hoping to get it into <a href="http://www.quicklisp.org/">Quicklisp</a> in the near future and then package up shuffletron as a new potential piece of silly software for Archlinux hipsters to consume from the <a href="https://wiki.archlinux.org/index.php/Arch_User_Repository">AUR</a>.<br><br>Tonight I hope to start writing a study buddy that will help me get through a large directory of academic papers and code I'd like to read by picking different bite sized, daily portions for me to get through. There are things I'd like to do every day to try and continue improving my skills and I would appreciate having some automation help me do them. More on that in the near future...


title: Server Purchased
date: 2007-06-26 21:06:00.000000
format: html
content:
  Ladies and Gentlemen,<br><br>A small update for you. I have, as previously announced, registered redlinernotes.com for one year. Previous efforts to get some old hardware together to host/serve the site did not work as planned so I just purchased a server from "pricewatch.com". You can see it <a href="http://www.pcdirectsource.com/Item.cfm?ID=2130">here</a>. It's pretty impressive what you can get shipped to your house for $120. Granted there's no monitor, keyboard, or mouse but once the server is up and hosting you don't need them. Anyway, the server is probably overkill for the amount of load/traffic my site will generate but considering the next cheapest thing was half as powerful and only would've saved me $20 I think I made the right call. Expect the site up by next friday...I'll keep you posted.<br><br>Thanks,<br>Editor-In-Chief


title: Setting up a Mercurial VCS on Ubuntu
date: 2008-04-22 17:47:37.000000
format: html
content:
  I've been meaning to set up a <a href="http://en.wikipedia.org/wiki/Revision_control">Version Control System</a> for a long time now. VCS as a concept has been around for a while but recently a new paradigm in VCS called DVCS (for distributed version control system) has emerged. This new paradigm has cured or at least mitigated the warts of the old "centralized" version control systems and brought new benefits. The thing is there hadn't been a dominant VCS up until now and though some would argue to the contrary I would claim there still isn't. This article strives not to be concerned with the choice of a DVCS. The truth if you choose any of the 4 relatively high-profile DVCS systems that exist today (<a href="http://en.wikipedia.org/wiki/Darcs">darcs</a>, <a href="http://en.wikipedia.org/wiki/Bazaar_(software)">bazaar</a>, <a href="http://en.wikipedia.org/wiki/Mercurial_(software)">mercurial</a>, or <a href="http://en.wikipedia.org/wiki/Git_(software)">git</a>) you'll be able to migrate between any of them later without too much difficulty if you change your mind. I was initially leaning towards bazaar or git but eventually settled on (and am thus far quite happy with) mercurial. If you must know some of my reasoning I find that <a href="http://www.dribin.org/dave/blog/archives/2007/12/30/why_mercurial/">Dave Dribin has captured</a> something close to my opinions.<br><br>So, the three things I'd like to cover in this article are mostly covered in <a href="http://www.selenic.com/mercurial/wiki/index.cgi/QuickStart">two</a> or <a href="http://www.selenic.com/mercurial/wiki/index.cgi/PublishingRepositories">so</a> places on the mercurial site. I thought I'd group it all together here for simplicity and future reference. The three things I'll be covering are the initial setup including installation and repository creation, making that repository accessible via web browser through a cgi script, and then setting up some authentication to allow you to push changes over HTTP. Let's get started!<br><br>Initial Setup<br>Installation of the software is really straightforward on Ubuntu (see the mercurial site for other installs). Just run<br><code>sudo apt-get install mercurial</code> and you're done. You'll have to set one thing in your configuration file before you can make your repository. Insert the following in ~/.hgrc with nano:<br><code><br>[ui]<br>your_username = FirstName LastName <youremail@host.com></code><br><br>Your next step of course will be to create a repository. For this, I assume you have some code you'd like stored. I make no claims about what will happen if you try creating an empty repository. It is also worth noting that mercurial tracks content, not files, so it won't carry empty directories. You can work around this on Linux by dropping a hidden file in the directory like so: <code>touch dirname/.hidden</code>.<br>Once you've done that navigate to the directory you'd like the repo to be in and run the following commands:<br><code><br>hg init<br>hg add<br>hg commit</code><br><br>This should bring up nano for you to enter a commit message into describing what changes you're making. Type in a message, save and exit nano. Now you can check and see if this was successful with <code>hg log</code>. If there are no changes listed or exiting nano generated an error you should check your file permissions and see if entering the [ui] information in another config file (perhaps /etc/mercurial/hgrc) fixes the problem.<br><br>Setting up the Web Server<br>I'm assuming that you already have a working repo (naturally) and an install of apache at this point. If you don't have the apache install try running <code>sudo apt-get install apache2</code>. There should be a copy of the cgi script mercurial uses in /usr/share/doc/mercurial/examples/. Copy that to /var/www/cgi-hg/ and rename it index.cgi, then open it up with nano. Around the the third to last line (under def make_web_app) you should see something like:<br><code><br>return hgweb("/path/to/your/repo", "Your Repo Description Here")</code><br><br>Fill in those values with your information but preserving the quotation marks. Also make sure to remove the comments (#s) before import os and import sys. Finally, be sure to run <code>sudo chmod a+x index.cgi</code> on the file so that Apache can execute it. You'll need to edit your apache config file so fire up nano again and open /etc/apache2/apache2.conf to insert the following:<br><code><br>Alias /code /var/www/cgi-hg<br><directory "/var/www/cgi-hg"><br>    DirectoryIndex index.cgi<br>    AddHandler cgi-script .cgi<br>    Options ExecCGI<br>    Order allow,deny<br>    Allow from all<br></directory></code><br><br>Finally, restart the server with <code>sudo /etc/init.d/apache2 restart</code> and try navigating your web browser to yourdomain.com/code.<br><br>Adding Push Support<br>Use nano to open your_repo/.hg/hgrc (not ~/.hgrc) again. This time we're putting in the server configuration and it should look something like this:<br><code><br>[web]<br>allow_push = your_username<br>push_ssl = false</code><br><br>Now you'll have to set up a file to hold the passwords for the users you want to allow to upload changes. To create it and add the first user and password run <code>sudo htpasswd -c /etc/apache2/hg.pass your_username</code> but make sure to omit the -c argument when adding new users in the future or the file will be overwritten. Then you'll need to set up apache to check this information. Open /etc/apache2/conf.d/hg.conf in nano and add the following:<br><code><br><location /code><br>    AuthUserFile /etc/apache2/hg.pass<br>    AuthGroupFile /dev/null<br>    AuthName "Your Repository Name"<br>    AuthType Basic<br>        <limitExcept GET><br>        Require valid-user<br>        </limitExcept><br></location></code><br><br>Save and exit nano. You'll need to change the permissions on the repo tree to allow apache to write to it so run <code>sudo chown -R www-data:www-data /path/to/your/repo</code> and then restart the apache server again. That's it! Time to test it...<br><br>***BONUS ROUND***<br>To test your setup, go to another computer and use apt-get to install mercurial and set your username in the ~/.hgrc. Then run <code>hg clone http://yourdomain.com/code</code> and you should see mercurial make a clone off of your server. Open one of the cloned files and make a small edit or add some new files, whatever you like. When you're done run <code>hg add</code> and <code>hg commit</code> remembering to add commit messages. If you need to delete a file do it through <code>hg remove filename</code>. Finally, try pushing your changes back to the server by running <code>hg push http://yourdomain.com/code</code>. You should get asked for a username and password and if you give valid login information your changes should push through. Now navigate to http://yourdomain.com/code in the browser and see if the changes show up. If they do, you're off to the races.


title: Setting up a MoinMoin Wiki on Ubuntu
date: 2008-04-15 17:55:23.000000
format: html
content:
  I had a bit of trouble with one or two things setting this up at work last week so here's a report from my side of the IT world for anyone who is looking to do this.<br><br>1) Don't apt-get moinmoin.<br>2) You will create a specific instance for your wiki separate from the base install. This is explained below.<br><br>Okay. So, first things first. Check to see if python is installed by running this on the command line:<br><pre>python -v</pre><br>then wget the tar from <a href="http://moinmo.in/MoinMoinDownload">moinmoin</a>:<br><pre>wget http://static.moinmo.in/files/moin-1.6.2.tar.gz</pre><br>extract it:<br><pre>tar zxvf moin-1.6.2.tar.gz</pre><br>and then run:<br><pre>sudo python setup.py install --prefix='/usr/local' --record=install.log</pre><br>This will get a basic install up and running. Now you need to create a wiki instance. You can create one wherever you like but I'd put it in /var/www/YOURWIKI or whatever you'd like to call it. The moinmoin folks have even created a <a href="http://moinmo.in/HelpOnInstalling/WikiInstanceCreation?action=AttachFile&amp;do=view&amp;target=createinstance.sh">handy script</a> to take most of the work out of your hands and make sure the permissions are right. Grab and read that, decide where you'd like the files to go and then:<br><pre><br>sudo ./createinstance.sh /var/www/YOURWIKI<br>sudo mkdir /var/www/YOURWIKI/cgi-bin<br>sudo cp /usr/local/share/moin/server/moin.cgi /var/www/YOURWIKI/cgi-bin/.<br>cd /var/www<br>sudo chown -R www-data:www-data YOURWIKI/cgi-bin<br>sudo chmod -R ug+rx YOURWIKI/cgi-bin<br>sudo chmod -R o-rwx YOURWIKI/cgi-bin</pre><br>Your instance is installed, now you just have to set the config files up to point to it. Add the following two lines to /etc/apache2/httpd.conf where the Alias is /moin_staticYOURVERSIONNUMBER:<br><code><br>Alias /moin_static162/ /usr/local/share/moin/htdocs/<br>ScriptAlias /tvswiki /var/www/tvswiki/cgi-bin/moin.cgi</code><br><br>Set the path to your wiki to /var/www/YOURWIKI in /var/www/YOURWIKI/cgi-bin/moin.cgi<br>Set the data dir and underlay dir to their (absolute, i.e. /var/www/YOURWIKI/WHATEVER) paths in /var/www/YOURWIKI/wikiconfig.py<br>Restart apache with<br><pre>sudo /etc/init.d/apache2 restart</pre><br>and you're done!<br>Of course, the next thing to look into will be setting up <a href="http://moinmo.in/HelpOnAccessControlLists">groups and ACLs</a> and <a href="http://moinmo.in/HelpOnThemes">theming it</a>. Happy Hacking!


title: Seventh Friday Linux Lesson
date: 2007-06-29 19:06:00.000000
format: html
content:
  Okay, folks. I have a confession. My Linux Lessons are so under par. Seriously. I was looking at a site just the other day that did a much better job of presenting concepts in a sensible order and getting users familiar with the command prompt. Oh, well. There's still plenty to be done here so on I go. Today we're going to be looking at a few simple things that might go missed at the command prompt but are insanely great. If there is really a concept today it's on shortcuts and things like tab completion.<br><br>So, let's start with a few basics. If you're at a command prompt and press the Up Arrow you'll cycle through the commands you entered last. That's history. If you're midway though typing a command or a directory and you hit the Tab key, the system will try to autocomplete it for you. That is, if you're typing "cd /home/user/Desktop" and once you've typed "cd /home/user/D" you hit tab, as long as there is no other directory that starts with a capital d in "/home/user" it will finish typing "esktop" for you. This ends up being useful for all kinds of things. Especially when something is several directories deep but you don't feel like typing or remembering whatever you typed earlier. Additionally, one should always remember that "." is equivalent to the directory you're currently in, as in "cd .", and ".." is equivalent to a directory one above the directory you're in such that "cd .." while in "/home/user/Desktop" would move you to "/home/user". Finally, how about a command? Typing "pwd" will print the present working directory to let you know where you are in the system. This, in conjunction with tools like "ls" and "cd" will help you navigate the filesystem in a sensible manner.<br><br>Finally, I'm going to talk about "|" today. That's shift-backslash. The wonderful thing about "|" is that it feeds the output of one command into a second command. For example, "ls /home/user/Desktop | wc -l" would use "wc" the word count program to count the number of lines in "/home/user/Desktop". You end up putting two commands together to get a count of the number of files in that directory. You could also use something like "grep" to find a file like so: "ls /home/user/Desktop | grep *.doc" and list all your  documents. This simple combination allows for some fantastically complex things which I'll be exploring in the coming weeks. For now, I hope you enjoyed the friday Linux Lesson and (if I'm lucky) the next Linux Lesson will be found here and also on "redlinernotes.com". Have a good one folks.


title: Seventh Monday Update
date: 2007-06-25 15:10:00.000000
format: html
content:
  Summer: Week 6: Finished<br><strike>Potentially Buy Skateboard at Ruin.<br>Gym<br>Skate<br>TVS<br>Sonya's Birthday? (Powerless? Pretty certainly.) *tear emo tear* (Ended up being aquarium visit. Nice.)</strike><br>Unexpected: Aquarium visit with Sonya probably qualifies, as do awesome birthday parties. Phone and house calls. Wrote a crazy ass post that predictably didn't get commented on. Maybe I shouldn't write things at 4am...<br><br>Summer: Week 7: Schedule<br>Monday<br>TVS (an anomaly caused by taking off early on Thursday for the aquarium)<br>Call Sonya? (after work today or after work tomorrow?)<br>Southern Polytech State University Orientation (3-7pm); Register for Classes (Discrete Mathematics, C Programming, other)<br>Gym (after work or after SPSU Orientation?)<br>Read Lessig<br>Tuesday<br>TVS<br>Program<br>Read Lessig<br>See people?<br>Wednesday<br>TVS<br>Gym<br>Read Lessig<br>See people?<br>Thursday<br>TVS<br>Ubuntu Gutsy Alpha 2 Release. Install on new partition. Test.<br>Money hits bank. Do banking. Buy server?<br>See people.<br>Read Lessig?<br>Friday<br>Chill.<br>Play in Gutsy Alpha 2.<br>Work on site\server?<br>People. Justin\Bria. Others too?<br><br>News for 6/25/07:<br>CompComm has been officially renamed to <a href="http://smspillaz.wordpress.com/2007/06/25/compiz-fusion-community-newstm-edition-7-for-june-24-2007-new-name/">Compiz Fusion</a>. Packaging and site migration are underway. Expect the first official release this week. And be excited. There's good stuff coming.<br>Neil J Patel released some software that takes advantage of the clutter API to view Flickr photos, appropriately titled <a href="http://njpatel.blogspot.com/2007/06/flickr-clutter-fluttr.html">Fluttr</a>.<br>I also discovered a new media center app that appears promising called <a href="http://sofa.sourceforge.net">Sofa</a>. That's probably not news but what the hell. Is anyone reading this? Hello?<br>Some <a href="http://tirdc.livejournal.com/11843.html">good patch work is underway</a> with airlied and pzad hard at work on the ati driver.<br>Somewhat comically <a href="http://weblog.licio.eti.br/2007/06/21/get-your-ubuntu-by-microsoft/">Microsoft offered Ubuntu</a> on it's Windows Live Marketplace this week.<br>There was also a <a href="http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html">great article by Steve Yegge on compilers</a>, a <a href="http://blog.pmarca.com/2007/06/why_theres_no_s.html">good post on why Web 2.0 is silly</a>, and a very <a href="http://www.lessig.org/blog/archives/003800.shtml#003800">surprising post from Lessig</a> on a change in career focus\direction.<br>A new study was done on <a href="http://www.technologyreview.com/read_article.aspx?id=18944">reorienting the web's traffic distribution</a> using peer 2 peer techniques. Intriguing, no?<br>Finally, in one of those seemingly small developments sure to have a big impact, a Cornell University scientist has found a practical way to <a href="http://www.technologyreview.com/read_article.aspx?id=18949">store light</a>.


title: Seventh Thursday Literary Lines
date: 2007-06-28 23:49:00.000000
format: html
content:
  I was in Borders the other day and strolled through the poetry section. Surprisingly, there was a Milosz volume that my copy of his Collected Poems didn't contain. I also realized how much I'd like to read Bukowski and Neruda. I'm still working my way through the mountains of Milosz' catalog but diversity is a very important thing and when it comes to poetry I've just sort of been sitting in one corner for a while. T.S. Eliot would certainly be a more distant jump than Neruda or Bukowski. Frost would also be a good distance for that matter. Whitman not as much. At any rate, I stumbled upon a Neruda work online today that seems so applicable to events of late that I feel oddly compelled to post it. It's titled Tonight I Can Write The Saddest Lines.<br><br>Tonight I can write the saddest lines.<br><br>Write, for example,'The night is shattered<br>and the blue stars shiver in the distance.'<br><br>The night wind revolves in the sky and sings.<br><br>Tonight I can write the saddest lines.<br>I loved her, and sometimes she loved me too.<br><br>Through nights like this one I held her in my arms<br>I kissed her again and again under the endless sky.<br><br>She loved me sometimes, and I loved her too.<br>How could one not have loved her great still eyes.<br><br>Tonight I can write the saddest lines.<br>To think that I do not have her. To feel that I have lost her.<br><br>To hear the immense night, still more immense without her.<br>And the verse falls to the soul like dew to the pasture.<br><br>What does it matter that my love could not keep her.<br>The night is shattered and she is not with me.<br><br>This is all. In the distance someone is singing. In the distance.<br>My soul is not satisfied that it has lost her.<br><br>My sight searches for her as though to go to her.<br>My heart looks for her, and she is not with me.<br><br>The same night whitening the same trees.<br>We, of that time, are no longer the same.<br><br>I no longer love her, that's certain, but how I loved her.<br>My voice tried to find the wind to touch her hearing.<br><br>Another's. She will be another's. Like my kisses before.<br>Her void. Her bright body. Her infinite eyes.<br><br>I no longer love her, that's certain, but maybe I love her.<br>Love is so short, forgetting is so long.<br><br>Because through nights like this one I held her in my arms<br>my soul is not satisfied that it has lost her.<br><br>Though this be the last pain that she makes me suffer<br>and these the last verses that I write for her.


title: Seventh Tuesday Quotables
date: 2007-06-26 15:31:00.000000
format: html
content:
  "Alas, we are mired in the modern and mystified by the moth-eaten. The earth is a muddy, muddy place." - Jim<br><br>"Even by the most *stringent* reasonable rules, we add a new bug every four days. That's just something that people need to accept. The people who say 'we must never introduce a regression' aren't living on planet earth, they are living in some wonderful world of Blarney, where mistakes don't happen, developers are perfect, hardware is perfect, and maintainers always catch things." - Linus Torvalds (more on that here:http://kerneltrap.org/node/8414)


title: Seventh Wednesday Songs of Summer
date: 2007-06-27 15:46:00.000000
format: html
content:
  Guster - Amsterdam<br>John Mayer - New Deep<br>Coldplay - Swallowed by the Sea<br>Incubus - Aqueous Transmission<br>Andrew Bird - Fiery Crash


title: SICP Section 1.1
date: 2008-01-19 03:18:23.000000
format: html
content:
  <p>Well, <a href="http://www.redlinernotes.com/blog/?p=857">I said I would do this and I meant it</a>. These entries will be a bit lengthy. I feel a little pain for any feeds I'm aggregated on. So, in the interest of not driving you all mad, these weekly semester updates will be behind a cut. <!--more--></p><br><p>Like so.</p><br><p>With that out of the way, here are the details. Each week, I'll post the resources I used (i.e. what I read, what I watched, etc) and the solutions to the relevant problems along with any notes of interest I had. I may offer other general musings (or even specific ones) inspired by my studies in other posts but these will tend towards a cut and dry solution to the exercises. Finally, I'll post a link to any sources I might have found or used to check answers I wasn't sure of and if I got the answer wrong I'll disclose that in the post.</p><br><p>As for the math, I haven't decided what to do about that. I mean, it doesn't make sense to post up a ton of math solutions though I suppose by that logic it doesn't make sense to post code snippets either. If I come up with something I'll let you know. If you have suggestions by all means write them in.</p><br><p>Resources:<br /><br>Read: <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-9.html#%_chap_1" title="Start">Chapter 1</a> through <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html#%_sec_1.1" title="Finish">Section 1.1</a><br /><br>Watch: <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/" title="Lectures">Lectures</a> <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/videos/Lecture-1a.avi">1-a</a><br /><br>Checked against: <a href="http://eli.thegreenplace.net/category/programming/lisp/sicp/">Eli Bendersky's Blog</a></p><br><p>SICP Notes and Exercises:</p><br><p>Notes<br /><br>Pgs. 28-30: Definitions and explanations of scope and locality. It is becoming evident that subtle errors can easily emerge due to differences in locality and scope. These errors are colluded by the fact that there is no distinction in lisp between variables and procedures. (i.e. you could have a procedure that used abs (another procedure) as a variable.)</p><br><p>Quotes<br /><br>"First, we want to establish the idea that a computer language is not just a way of getting a computer to perform operations but rather that it is a novel formal medium for expressing ideas about methodology. Thus, programs must be written for people to read, and only incidentally for machines to execute." - Preface to the First Edition</p><br><p>"The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology - the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects." - Preface to the First Edition</p><br><p>Exercises<br /><br><a href="http://sicp.org.ua/sicp/Exercise1-2">1.2</a>:</p><br><pre lang="lisp"><br>(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 3))))) (* 3 (* (- 6 2) (- 2 7))))<br>;Value: -23/90</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-3">1.3</a>:</p><br><pre lang="lisp"><br>(define (two-of-three x y z)<br>  (cond ((< x y z) (+ (* y y) (* z z)))<br>	((< y x z) (+ (* x x) (* z z)))<br>	((< z x y) (+ (* x x) (* y y)))<br>	((or (= x y) (= x z)) (+ (* y y) (* z z)))<br>	((or (= y x) (= y z)) (+ (* x x) (* z z)))<br>	((or (= z x) (= z y)) (+ (* x x) (* y y)))))<br>;Value: two-of-three</pre><br><p>Comments: The original version of the program lacked the last three lines but I realized if you got inputs that were equal to each other there wasn't a condition that matched that so I changed it. I'm sure there's a much more elegant way to do it but the job is done. And it's mostly readable.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-4">1.4</a>:<br /><br>This procedure checks to see if B is greater than 0. If it is, it adds A and B. Otherwise, it subtracts B from A.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-5">1.5</a>:<br /><br>This procedure when evaluated using applicative-order evaluation will not resolve as it infinitely recurses trying to evaluate (p). An interpreter using Normal-order evaluation will not have this problem because in the example the if condition evaluates to true so the p function is never evaluated. (The Scheme interpreter uses Applicative-Order evaluation.)</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-6">1.6</a>:<br /><br>Again, this is a case of infinite recursion due to Applicative-Order evaluation. Sqrt-iter continues to call itself regardless of the value of (good-enough? guess x) if you must know.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-7">1.7</a>:</p><br><pre lang="lisp"><br>(define (good-enough? guess x)<br>  (< (abs (- (improve guess x) guess)) (* 0.000001 guess)))<br>;Value: good-enough?</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-8">1.8</a>:</p><br><pre lang="lisp"><br>(define (curt-iter guess x)<br>  (if (good-enough? guess x)<br>      guess<br>      (curt-iter (improve guess x) x)))<br>;Value: curt-iter<br><br>(define (good-enough? guess x)<br>  (< (abs (- (cube guess) x)) 0.001))<br>;Value: good-enough?<br><br>(define (cube x)<br>  (* x (* x x)))<br>;Value: cube<br><br>(define (curt x)<br>  (curt-iter 1.0 x))<br>;Value: curt<br><br>(define (improve guess x)<br>  (/ (+ (/ x (* guess guess)) (* 2 guess)) 3))<br>;Value: improve</pre><br><p>##NOTE:<br /><br>Here is an example rewrite of the sqrt program using block structure and lexical scoping. It is inserted here because this was the point of discussion but no relevant exercise was assigned.</p><br><pre lang="lisp"><br><br>(define (sqrt x)<br>    (define (sqrt-iter guess)<br>        (if (good-enough? guess)<br>            guess<br>            (sqrt-iter (improve guess))))<br>    (define (good-enough? guess)<br>        (< (abs (- (square guess) x)) 0.001))<br>    (define (average a b)<br>        (/ (+ a b) 2))<br>    (define (improve guess)<br>        (average guess (/ x guess)))<br>    (sqrt-iter 1.0))</pre>


title: SICP Section 1.2
date: 2008-02-29 19:39:36.000000
format: html
content:
  <p>I finally finished SICP Section 1.2 last night. I'm tremendously excited because this means that next week I can start tackling <a href="http://en.wikipedia.org/wiki/Higher-order_function">Higher Order Functions</a> and (I hope) <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closures</a>. At any rate, here is the last month's work:</p><br><p><!--more--></p><br><p>Resources:<br /><br>Read: <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-9.html#%_chap_1" title="Start">Chapter 1</a> through <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html" title="Finish">Section 1.2</a><br /><br>Watch: <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/" title="Lectures">Lectures</a> <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/videos/Lecture-1b.avi">1-b</a><br /><br>Checked against: <a href="http://eli.thegreenplace.net/category/programming/lisp/sicp/">Eli Bendersky's Blog</a>, <a href="http://sicp.org.ua/sicp/Section1-2">SICP Wiki</a>, <a href="http://www.kendyck.com/solutions-to-sicp/">Ken Dyck's Solutions</a>, <a href="http://www.michaelharrison.ws/weblog/?p=47">Autodidact</a> and <a href="http://lispy.wordpress.com/2007/09/22/mastering-higher-order-programming-techniques-with-sicp-chapter-1/">Lispy</a> for Inspiration.</p><br><p>SICP Notes and Exercises:</p><br><p>Notes<br /><br>Pg. 35: Explanations of Iteration and Recursion in Processes and Procedures and Tail-Recursion in Compilers.</p><br><p>Maybe I was wrong about SICP. I mean the hardest thing about these exercises was letting the stuff sit in my head for a bit. And the motivation to get some of the more lengthy ones done. We'll see how this goes.</p><br><p>Quotes<br /><br>"A recursive definition does not necessarily lead to a recursive process." - Gerald Jay Sussman, SICP Lecture 1-B's Time-Space Complexity explanation, approx. 25:30 - 30:30</p><br><p>"The key to understanding complicated things is knowing what not to look at." - Gerald Jay Sussman, SICP Lecture 1-B from Swiss Archive, approx. 10:00</p><br><p>"The reason why people think of programming as being hard is because you're writing down a general rule which is going to be used for lots of instances that a particular instance must process correctly." - Gerald Jay Sussman, SICP Lecture 1-B from Swiss Archive, approx. 46:45</p><br><p>Exercises<br /><br><a href="http://sicp.org.ua/sicp/Exercise1-9">1.9</a>:<br /><br>The first procedure evaluates as follows:</p><br><pre lang="lisp"><br>(inc (+ 3 5))<br>(inc (inc (+ 2 5)))<br>(inc (inc (inc (+ 1 5))))<br>(inc (inc (inc (inc (+ 0 5)))))<br>(inc (inc (inc (inc 5))))<br>(inc (inc (inc 6)))<br>(inc (inc 7))<br>(inc 8)<br>9</pre><br><p>This is a recursive procedure and a recursive process.</p><br><p>The second procedure evaluates as follows:</p><br><pre lang="lisp"><br>(+ 3 6)<br>(+ 2 7)<br>(+ 1 8)<br>(+ 0 9)<br>9</pre><br><p>This is a recursive procedure but an iterative process.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-10">1.10</a>:<br /><br>(A 1 10) evaluates as follows:</p><br><pre lang="lisp"><br>(A 0 (A 1 9))<br>(A 0 (A 0 (A 1 8)))<br>(A 0 (A 0 (A 0 (A 1 7))))<br>(A 0 (A 0 (A 0 (A 0 (A 1 6)))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 4)))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 3))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 2)))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2)))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 4))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 8)))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 16))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 32)))))<br>(A 0 (A 0 (A 0 (A 0 64))))<br>(A 0 (A 0 (A 0 128)))<br>(A 0 (A 0 256))<br>(A 0 512)<br>1024</pre><br><p>(A 2 4) evaluates as follows:</p><br><pre lang="lisp"><br>(A 1 (A 2 3))<br>(A 1 (A 1 (A 2 2)))<br>(A 1 (A 1 (A 1 (A 2 1))))<br>(A 1 (A 1 (A 1 2)))<br>(A 1 (A 1 (A 0 (A 1 1))))<br>(A 1 (A 1 (A 0 2)))<br>(A 1 (A 1 4))<br>(A 1 (A 0 (A 1 3)))<br>(A 1 (A 0 (A 0 (A 1 2))))<br>(A 1 (A 0 (A 0 (A 0 (A 1 1)))))<br>(A 1 (A 0 (A 0 (A 0 2))))<br>(A 1 (A 0 (A 0 4)))<br>(A 1 (A 0 8))<br>(A 1 16)<br>(A 0 (A 1 15))<br>(A 0 (A 0 (A 1 14)))<br>(A 0 (A 0 (A 0 (A 1 13))))<br>(A 0 (A 0 (A 0 (A 0 (A 1 12)))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 1 11))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 10)))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 9))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 8)))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 7))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 6)))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 4)))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 3))))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 2)))))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2)))))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 4))))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 8)))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 16))))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 32)))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 64))))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 128)))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 256))))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 512)))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 1024))))))<br>(A 0 (A 0 (A 0 (A 0 (A 0 2048)))))<br>(A 0 (A 0 (A 0 (A 0 4096))))<br>(A 0 (A 0 (A 0 8192)))<br>(A 0 (A 0 16384))<br>(A 0 32768)<br>65536</pre><br><p>(A 3 3) evaluates as follows:</p><br><pre lang="lisp"><br>(A 2 (A 3 2))<br>(A 2 (A 2 (A 3 1)))<br>(A 2 (A 2 2))<br>(A 2 (A 1 (A 2 1)))<br>(A 2 (A 1 2))<br>(A 2 (A 0 (A 1 1)))<br>(A 2 (A 0 2))<br>(A 2 4)<br>65536</pre><br><p>(see evaluation of (A 2 4) above)</p><br><p>The defined procedures f, g, and h intriguingly map as follows:<br /><br>(f n) -> (* 2 n)<br /><br>(g n) -> 2^n<br /><br>(h n) -> 2 raised to itself, n times.</p><br><p>##NOTE:<br /><br>In the book examples are given of recursive and iterative ways to compute the fibonacci sequence. However, the example given for the fibonacci sequence computes a term beyond what is desired to arrive at it's final answer. The termination condition is count = 0 at which point b is returned. This is a small change to that program to fix what I perceive as a flaw. Have I missed something?<br /><br>My version returns a when count = 1.</p><br><pre lang="lisp"><br>(define (fib n)<br>  (fib-iter 1 0 n))<br>(define (fib-iter a b count)<br>  (if (= count 1)<br>      a<br>      (fib-iter (+ a b) a (- count 1))))</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-11">1.11</a>:<br /><br>A tree recursive process that computes f is demonstrated in the following procedure:</p><br><pre lang="lisp"><br>(define (f n)<br>  (cond ((< n 3) n)<br>	   ((or (= n 3) (> n 3))<br>            (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3)))))))</pre><br><p>An iterative process that computes f is demonstrated in the following procedure:</p><br><pre lang="lisp"><br>(define (f n)<br>  (f-iter 2 1 0 n))<br><br>(define (f-iter a b c count)<br>  (cond ((< count 3) count)<br>	(else (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1)))))</pre><br><p>Figuring out the iterative process was scary. It was the first moment I thought I wouldn't be able to do this and might need real help. I was unsure of whether I needed three or four state variables. It clicked after a few minutes of thinking though and was much smoother from there.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-12">1.12</a>:<br /><br>This one actually gave me some trouble for a bit because I wanted to solve the problem in a non-standard way. After a while, I cracked and read the precursor text (but not the code) to <a href="http://eli.thegreenplace.net/2007/06/28/sicp-section-122/">Eli Bendersky's solution</a> and noticing that he defined the function with two arguments (for columns and rows) arrived fairly quickly with that insight at what seems to be the more or less standard solution. I had this much completed for a week or more but got stalled trying to figure out the problem of a pascal function that takes one argument. That diversion contributed greatly to the delay in my progress. I <a href="http://www.redlinernotes.com/blog/?p=866">did solve it though</a> and posted the results separately. Here's the standard solution:</p><br><pre lang="lisp"><br>(define (pas row col)<br>  (cond ((= row 1) 1)<br>	((= col 1) 1)<br>	((= row col) 1)<br>	(else (+ (pas (- row 1) (- col 1))<br>		 (pas (- row 1) col)))))<br>;Value: pas</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-13">1.13</a>:<br /><br>I need to define a few things for this one first.<br /><br>rad = the square root of 5 or</p><br><pre lang="lisp">(sqrt 5)</pre><br><p>phi = (1 + rad) / 2 or</p><br><pre lang="lisp">(/ (+ 1 rad) 2)</pre><br><p>psi = (1 - rad) / 2 or</p><br><pre lang="lisp">(/ (- 1 rad) 2)</pre><br><p>fib = you remember our fibonacci function from before right? That's all this is.</p><br><p>Prove that Fib(n) is the closest integer to (/ (phi ^ n) rad). Hint: Use psi as defined above, induction and the definition of the Fibonacci numbers to prove that Fib(n) = ((phi ^ n) - (psi ^ n)) / rad.</p><br><p>Okay, this one is intimidating for a number of reasons. One being that I've never done a formal proof before. At least that I can remember. I've seen proofs done and I've read one or two but I've never done one. Either my math education was lax or I was lax about my math education. In fairness, it was probably a bit of both. That unfamiliarity combined with the aforementioned pascal with a single argument problem served to keep me unmotivated and distracted for a bit.</p><br><p>Prove: That Fib(n) = ((phi ^ n) - (psi ^ n)) / rad.<br /><br>First, you have to prove your base cases.</p><br><p>Fib (0) = ((phi ^ 0) - (psi ^ 0)) / rad.<br /><br>That reduces to, 0 = (1 - 1) / rad, So the first base case holds.</p><br><p>Fib (1) = ((phi ^ 1) - (psi ^ 1)) / rad.<br /><br>That reduces to, 1 = ((1 / 2) + (rad / 2) - (1 / 2) + (rad / 2)) / rad.<br /><br>That reduces to, 1 = rad / rad, so the second base case holds.</p><br><p>The definition of Fibonacci numbers is that fib(n) = fib(n-1) + fib(n-2) so fib(2) = 0 + 1 = 1. Having found that our lemma is true for n-1 and n-2 will it hold for n?</p><br><p>Fib (2) = ((phi ^ 2) - (psi ^ 2)) / rad.<br /><br>Remembering that Phi is the golden ratio it meets the condition that (phi ^ 2) = phi + 1.<br /><br>This gives fib (2) = (2.61803398 - 0.38196601) / rad.<br /><br>This reduces to fib (2) = 2.23606797 / rad giving 1.</p><br><p>Thus, our lemma holds for fib(n). This does not explain how Fib(n) is always the closest integer to phi ^ n / rad though.</p><br><p>To explain that we must note that in the base case of 1 it holds as phi ^ n / rad evaluates to 0.723606798 and Fib(1) is 1. So, it holds here.<br /><br>We may then observe that psi being less than 1 will always approach zero as it's exponent is increased.<br /><br>Thus, the difference between the fib(n) and (/ (phi ^ n) rad) will always be less than 0.381 for n >= 2.<br /><br>This is what we needed to show.</p><br><p>Whew. After checking this against other people's solutions it turns out I'm not crazy and am roughly correct in my proof which is a relief.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-14">1.14</a>:<br /><br>Okay. I drew the tree on paper but trying to draw this tree in ASCII for you guys would about kill me. Thankfully on checking my solution I was lucky to find a correct tree image which I will steal with credit. Thanks, <a href="http://www.kendyck.com/archives/2005/04/25/solution-to-sicp-exercise-114/">Bhrgunatha</a>.<br /><br>Here is <a href="http://e.photos.cx/sicp.ex1.14-00b.png">the tree</a>.</p><br><p>As for the order, we can observe that at least in terms number of steps the growth follows that of our tree-recursive fibonacci function and is exponential. I think it's growing at <em>O(x<sup>n</sup>)</em> but it could be growing at <em>O(n<sup>x</sup>)</em>. Has anyone come to a definitive conclusion about this? Upon checking Ken Dyck's site again I see that Tim Eichner has an interesting solution. Can anyone confirm this?</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-15">1.15</a>:<br /><br>a. How many times is the procedure p applied when (sine 12.15) is evaluated?</p><br><pre lang="lisp"><br>(p (sine 4.05))<br>(p (p (sine 1.35)))<br>(p (p (p (sine 0.45))))<br>(p (p (p (p (sine 0.15)))))<br>(p (p (p (p (p (sine 0.05))))))<br>(p (p (p (p (p 0.05)))))</pre><br><p>P is applied 5 times.</p><br><p>b. What is the order of growth in space and number of steps (as a function of a) used by the process generated by the sine procedure when (sine a) is evaluated?</p><br><p>This one I did need help with. I realized quite clearly that the growth was related to the number of divisions by 3 our angle took to get below the threshold (0.01). I did not realize that the abstraction I was looking for to describe this growth was that of a logarithm. That being said, I checked a few other solutions and went over the wiki page for <a href="http://en.wikipedia.org/wiki/Logarithm">logarithms</a> once or twice. I really need to order <a href="http://www.amazon.com/Calculus-Michael-Spivak/dp/0914098896">Spivak's Calculus</a> now. Anyway, the process is <em>O(log(a))</em> in both space and time. Specifically it's <em>O(log<sub>3</sub>(n))</em>.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-16">1.16</a>:<br /><br>This was tricky until I modeled the state transformations holding to the rule suggested for (* a (b^n)). Once I did that it was pretty easy.</p><br><pre lang="lisp"><br>(define (expt b n)<br>  (define (expt-iter b n a)<br>  (cond ((= n 0) a)<br>	((even? n) (expt-iter (square b) (/ n 2) a))<br>	(else (expt-iter b (- n 1) (* a b)))))<br>  (expt b n 1))<br>;Value: expt-iter<br><br>(expt-iter 2 1000 1)<br>1071508607186267320948425049060001810561404811705533607443750388370351051124936122493198378815695858127594672917553146825187<br>1452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062<br>914571196477686542167660429831652624386837205668069376<br>;;That's a 300 digit number. This algorithm is O(log n). This computed in 16 steps.</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-17">1.17</a>:</p><br><pre lang="lisp"><br>(define (* a b)<br>  (define (double x)<br>    (+ x x))<br>  (define (halve x)<br>    (/ x 2))<br>  (cond ((= b 0) 0)<br>	((= a 0) 0)<br>	((= b 1) a)<br>	((even? b) (* (double a) (halve b)))<br>	(else (+ a (* a (- b 1))))))<br>;Value: *<br><br>(* 2 1000)<br>;Value: 2000<br>;;16 steps again. logarithmic in time. space too? I think it's just linear in space.</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-18">1.18</a>:</p><br><pre lang="lisp"><br>(define (* a b)<br>  (define (double x)<br>    (+ x x))<br>  (define (halve x)<br>    (/ x 2))<br>  (define (*-iter a b c)<br>    (cond ((= b 0) 0)<br>	  ((= a 0) 0)<br>	  ((= b 1) (+ a c))<br>	  ((even? b) (*-iter (double a) (halve b) c))<br>	  (else (*-iter a (- b 1) (+ c a)))))<br>  (*-iter a b 0))<br>;Value: *<br><br>(* 2 1000)<br>;Value: 2000<br>;;16 steps again. logarithmic and iterative, so it does it in O(1) space. boo-yah. today was a good day to code.</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-19">1.19</a>:<br /><br>This was just a really difficult problem to understand. I wasn't even sure what they were really asking. Once I realized I just needed to use algebra to try and expand and then factor out a few things I felt a lot more comfortable.</p><br><pre lang="lisp"><br>(define (fib n)<br>  (fib-iter 1 0 0 1 n))<br>;Value: fib<br><br>(define (fib-iter a b p q count)<br>  (cond ((= count 0 ) b)<br>	((even? count)<br>	 (fib-iter a<br>		   b<br>		   (+ (square p) (square q)) ;; compute p'<br>		   (+ (* 2 p q) (square q))  ;; compute q'<br>		   (/ count 2)))<br>	(else (fib-iter (+ (* b q) (* a q) (* a p))<br>			(+ (* b p) (* a q))<br>			p<br>			q<br>			(- count 1)))))<br>;Value: fib-iter</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-20">1.20</a>:<br /><br>This is one of those exercises that Abelman and Sussman are sort of bastards for including.</p><br><p>;;Normal order evaluation is fully expand to primitives and then reduce.<br /><br>;;Applicative-order is...well, what we've been doing all along.</p><br><p>How many remainder operations are performed in the normal order version of<br /><br>(gcd 206 40)?</p><br><p>How many in the applicative order version?<br /><br>4: (206 4), (40 6), (6 4), (4 2)</p><br><p>Applicative order first:<br /><br>(gcd 206 40)<br /><br>(gcd 40 (remainder 206 40))<br /><br>(gcd 40 6)<br /><br>(gcd 6 (remainder 40 6))<br /><br>(gcd 6 4)<br /><br>(gcd 4 (remainder 6 4))<br /><br>(gcd 4 2)<br /><br>(gcd 2 (remainder 4 2))<br /><br>(gcd 2 0)<br /><br>2</p><br><p>Normal order version:<br /><br>(gcd 206 40)<br /><br>;;we can count the number of times remainders occur in b, which is always evaluated.<br /><br>(gcd 40 (remainder 206 40)) ;;rc = 1<br /><br>if (= (remainder 206 40) 0) = false</p><br><p>(gcd (remainder 206 40) (remainder 40 (remainder 206 40)))) ;;rc = 1+2<br /><br>if (= (remainder 40 6) 0) = false</p><br><p>(gcd (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))) ;;rc = 1+2+4<br /><br>if (= (remainder 6 4) 0) = false</p><br><p>(gcd (remainder (remainder 206 40) (remainder 40 (remainder 206 40))) (remainder (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))) ;;rc = 1+2+4+7<br /><br>if (= (remainder 4 2) 0) = true!<br /><br>now that if is true we evaluate a: (remainder (remainder 206 40) (remainder 40 (remainder 206 40))) which has 4 remainders to the 14 that have been evaluated in prior predicates. tada! 18 evaluations in total for normal order. 4, if you didn't notice, for applicative order.</p><br><p>GCD is effectively a loop here and the only way for the loop to exit is for the if predicate to evaluate to true, after which the consequent is evaluated. The alternate is only substituted for in this case, never evaluated outright as it never becomes primitive.</p><br><p>In this way, the problem seems to me more of a study into the if conditional than evaluation models. Once you understand that the alternate never gets evaluated, you can simply figure out how many remainders get fed to it before it's true and then how many are in the consequent.</p><br><p>That's the best I could come up with for this one but <a href="http://eli.thegreenplace.net/2007/07/04/sicp-sections-124-125/">Eli Bendersky has a solution</a> you may find more clear or detailed.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-21">1.21</a>:</p><br><pre lang="lisp"><br>(smallest-divisor 199)<br>;Value: 199<br><br>(smallest-divisor 1999)<br>;Value: 1999<br><br>(smallest-divisor 19999)<br>;Value: 7</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-22">1.22</a>:<br /><br>The code for this exercise is not <em>particularly</em> difficult. It's not easy but it's fairly straightforward. Because this exercise was written over 10 years ago though it's pretty difficult to use on modern hardware. You're supposed to observe algorithmic efficiency because this code is supposed to stress your hardware. Unfortunately, in 2008 this code makes my hardware yawn for numbers on the scale they were asking for. So I started things off at 13 digits and scaled up from there. I also decided to rework the code so that it only outputs when it finds a prime.</p><br><pre lang="lisp"><br>(define (start-prime-test n start-time)<br>  (if (prime? n)<br>      (report-prime (- (runtime) start-time) n)))<br><br>(define (report-prime elapsed-time n)<br>  (newline)<br>  (display n)<br>  (display " *** ")<br>  (display elapsed-time))<br><br>(define (search-for-primes current end)<br>  (cond ((even? current) (search-for-primes (+ current 1) end))<br>	((> current end) (display " done! "))<br>	(else (timed-prime-test current)<br>	      (search-for-primes (+ current 2) end))))</pre><br><p>So, there's the code. Now for my results:<br /><br>(search-for-primes 100000000000 100000000060)</p><br><p>100000000003 *** 1.1600000000000037<br /><br>100000000019 *** 1.1899999999999977<br /><br>100000000057 *** 1.240000000000009 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 1000000000000 1000000000070)</p><br><p>1000000000039 *** 3.91<br /><br>1000000000061 *** 3.759999999999998<br /><br>1000000000063 *** 3.9400000000000013 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 10000000000000 10000000000100)</p><br><p>10000000000037 *** 12.280000000000001<br /><br>10000000000051 *** 12.510000000000005<br /><br>10000000000099 *** 12.200000000000003 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 100000000000000 100000000000098)</p><br><p>100000000000031 *** 38.190000000000026<br /><br>100000000000067 *** 38.16<br /><br>100000000000097 *** 37.95000000000002 done!<br /><br>;Unspecified return value</p><br><p>Checking all of these it appears we are very close to the projected (sqrt 10) increase per digit.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-23">1.23</a>:</p><br><pre lang="lisp"><br>(define (find-divisor n test-divisor)<br>  (cond ((> (square n) n) n)<br>	((= (modulo n test-divisor) 0) test-divisor)<br>	(else (find-divisor n (next test-divisor)))))<br>;Value: find-divisor<br><br>(define (next n)<br>  (cond ((even? n) (+ n 1))<br>        (else (+ n 2))))<br>;Value: next</pre><br><p>The results this time were:<br /><br>(search-for-primes 100000000000 100000000060)</p><br><p>100000000003 *** .7400000000000091<br /><br>100000000019 *** .7200000000000273<br /><br>100000000057 *** .7099999999999795 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 1000000000000 1000000000070)</p><br><p>1000000000039 *** 2.3600000000000136<br /><br>1000000000061 *** 2.2900000000000205<br /><br>1000000000063 *** 2.319999999999993 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 10000000000000 10000000000100)</p><br><p>10000000000037 *** 7.350000000000023<br /><br>10000000000051 *** 7.340000000000032<br /><br>10000000000099 *** 7.189999999999998 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 100000000000000 100000000000098)</p><br><p>100000000000031 *** 23.110000000000014<br /><br>100000000000067 *** 22.879999999999995<br /><br>100000000000097 *** 22.920000000000016 done!<br /><br>;Unspecified return value</p><br><p>This time we also are pretty close to half the previous times but it's slightly over half.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-24">1.24</a>:</p><br><pre lang="lisp"><br>(define (start-prime-test n start-time)<br>  (if (fast-prime? n 500)<br>      (report-prime (- (runtime) start-time) n)))<br>;Value: start-prime-test</pre><br><p>And these results were:<br /><br>(search-for-primes 100000000000 100000000060)</p><br><p>100000000003 *** 9.999999999990905e-3<br /><br>100000000019 *** 0.<br /><br>100000000057 *** 9.999999999990905e-3 done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 1000000000000 1000000000070)</p><br><p>1000000000039 *** 0.<br /><br>1000000000061 *** 9.999999999990905e-3<br /><br>1000000000063 *** 0. done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 10000000000000 10000000000100)</p><br><p>10000000000037 *** 0.<br /><br>10000000000051 *** 0.<br /><br>10000000000099 *** 0. done!<br /><br>;Unspecified return value</p><br><p>(search-for-primes 100000000000000 100000000000098)</p><br><p>100000000000031 *** 9.999999999990905e-3<br /><br>100000000000067 *** 0.<br /><br>100000000000097 *** 0. done!<br /><br>;Unspecified return value</p><br><p>We can see that this is definitely in <em>O(log(n))</em>. The times have gone below the precision of my instruments in most cases.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-25">1.25</a>:<br /><br>I honestly had to look to <a href="http://eli.thegreenplace.net/2007/07/04/sicp-sections-124-125/">Eli</a> and <a href="http://http://www.kendyck.com/archives/2005/06/19/solution-to-sicp-exercise-125/">Ken</a> for help on this one. I was hand evaluating the original code before trying Alyssa's and having some trouble. I had noticed that the fast-expt procedure had two arguments where expmod had three so I figured part of the computation was being moved around. I even realized that Alyssa's way went ahead and computed the base to the exponent and then tested the remainder against it once. That just seemed like it should've been better to me. I didn't have the sense to just add runtime in as an argument and see how much time they were taking. At any rate, the original expmod does lots of little remainder tests but because of <a href="http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic">Bignum arithmetic</a> that ends up being faster than a single test on a huge number.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-26">1.26</a>:<br /><br>(expmod base (/ exp 2) m) has to be evaluated an extra time each time the (even? exp) condition evaluates to true. This moves the algorithm from log n to n because, as I somewhat foolishly missed, it shifts the recursion from a linear recursion to a tree recursion. See the <a href="http://sicp.org.ua/sicp/Exercise1-26">SICP Wiki's solution</a> for more detail, it seems to be the best resource for rigorous complexity analysis.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-27">1.27</a>:</p><br><pre lang="lisp"><br>(define (expmod base exp m)<br>  (cond ((= exp 0) 1)<br>	((even? exp)<br>	 (remainder (square (expmod base (/ exp 2) m)) m))<br>	(else<br>	 (remainder (* base (expmod base (- exp 1) m)) m))))<br>;Value: expmod<br><br>(define (carmichael-test n)<br>  (define (try-it a)<br>    (= (expmod a n n) a))<br>  (define (carmichael-iter times)<br>    (cond ((= times 0) true)<br>	  ((try-it times) (carmichael-iter (- times 1)))<br>	  (else false)))<br>  (carmichael-iter (- n 1)))<br>;Value: carmichael-test</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-28">1.28</a>:</p><br><pre lang="lisp"><br>(define (expmod base exp m)<br>  (define (miller-rabin x)<br>    (and (not (= x 1)) (not (= x m)) (= (square x) (modulo 1 m))))<br>  (cond ((= exp 0) 1)<br>	((even? exp)<br>	 (if (miller-rabin (square (expmod base (/ exp 2) m)))<br>	     0<br>	     (remainder (square (expmod base (/ exp 2) m))<br>			m)))<br>	(else<br>	 (remainder (* base (expmod base (- exp 1) m))<br>		    m))))<br>;Value: expmod<br><br>(define (miller-rabin-search n)<br>  (define (try-it a)<br>    (= (expmod a (- n 1) n) 1))<br>  (try-it (+ 1 (random (- n 1)))))<br>;Value: miller-rabin-search<br><br>(define (miller-rabin-test n)<br>  (define (mr-iter count)<br>    (cond ((= count 1) #t)<br>             ((miller-rabin-search n) (mr-iter (- count 1)))<br>             (else #f)))<br>  (mr-iter (floor (/ n 2))))<br>;Value: miller-rabin-test<br><br>;;I got everything written right on this one but I had to check Ken's page again to notice that my try-it definition was<br>;;testing the expmod result against a, not 1. Once I fixed that I was right as rain.</pre><br><p>As a final note, I should point out that my solution here differs a bit from the norm. One, I'm pretty serious about not using primitives that haven't been introduced yet. Even <a href="http://www.kendyck.com/archives/2007/05/30/solution-to-sicp-exercise-128/">Ken Dyck's solution</a> uses let (though the <a href="http://sicp.org.ua/sicp/Exercise1-28">SICP wiki avoids it</a>). After all, this is my first serious work in programming ever. The closest thing besides this was my read through the <a href="http://www.redlinernotes.com/blog/?p=443">first chapter of K&R in summer of 2006</a>. Anyway, just keep in mind I'm taking this as my formal education.</p>


title: SICP Section 1.3
date: 2008-04-01 02:31:48.000000
format: html
content:
  <p>At long last, I'm through Chapter 1 of SICP. I'm a bit disappointed that <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closures</a> haven't been covered yet but they're in the first few pages of Chapter 2 and I've already got a few problems solved. As a matter of fact, I finished Chapter 1 last Wednesday it just takes time to get these posts up. I have a feeling I need to go back and study those explanations of <a href="http://en.wikipedia.org/wiki/Scope_(programming)">Lexical Scope</a> in Chapter 1 though. I'll try to write more about the experience thus far in a separate post. For now, here are my results for Section 1.3.</p><br><p><!--more--></p><br><p>Resources:<br /><br>Read: <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-9.html#%_chap_1">Chapter 1</a> through <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html">Section 1.3</a><br /><br>Watch: <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/">Lectures</a> <a href="http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/videos/Lecture-2a.avi">2-a</a><br /><br>Checked against: <a href="http://eli.thegreenplace.net/category/programming/lisp/sicp/">Eli Bendersky's Blog</a>, <a href="http://sicp.org.ua/sicp/Section1-3">SICP Wiki</a>, <a href="http://www.kendyck.com/solutions-to-sicp/">Ken Dyck's Solutions</a>, <a href="http://theloserblog-home.blogspot.com/search/label/SICP">Theloserblog</a>, <a href="http://wfasim.dyndns.org/wordpress/?page_id=136">Wfasim's Solutions</a>, <a href="http://www.michaelharrison.ws/weblog/?p=47">Autodidact</a> and <a href="http://lispy.wordpress.com/2007/09/22/mastering-higher-order-programming-techniques-with-sicp-chapter-1/">Lispy</a> for Inspiration.</p><br><p>SICP Notes and Exercises:</p><br><p>Notes<br /><br>Pgs. 63-66: Discussion of Let and Local Variable Binding.<br /><br>Pg. 76: Discussion of First-Class Status in programming languages.</p><br><p>Quotes<br /><br>"I'm going to write the...procedure here explicitly without giving it a name. I'm doing it anonymously, I don't necessarily have to give a name to something if I just want to use it once." - Gerald Jay Sussman, approx. 17:00, Lecture 2-a</p><br><p>"Procedures can be named by variables. Procedures are not special...Therefore they can be passed from one to another as arguments." - Gerald Jay Sussman, approx. 20:00, SICP Lecture 1-B from Swiss Archive, Higher-Order Functions Explanation</p><br><p>"Talent is to a great extent knowledge that we haven't yet learned how to formalize." - Gerald Jay Sussman, approx. 55:00, <a href="http://www.aduni.org/colloquia/sussman/">The Legacy of Computer Science</a></p><br><p>Exercises<br /><br><a href="http://sicp.org.ua/sicp/Exercise1-29">1.29</a>:</p><br><p>This exercise definitely wasn't easy. I think most of the difficulty is in figuring out how the math works and how the functions are all feeding into each other.</p><br><pre lang="lisp">(define (cube x) (* x x x))<br>;Value: cube<br><br>(define (sum term a next b)<br>  (if (> a b)<br>      0<br>      (+ (term a)<br>         (sum term (next a) next b))))<br>;Value: sum<br><br>(define (simpsons-rule f a b n)<br>  (define h (/ (- b a) n))<br>  (define (k-term x)<br>    (cond ((or (= x 0) (= x n)) 1)<br>	  ((even? x) 2)<br>	  (else 1)))<br>  (define (yk x)<br>    (* (k-term x)<br>       (f (+ a (* x h)))))<br>  (* (sum yk a (lambda (x) (+ x 1)) n)<br>     (/ h 3)))<br>;Value: simpsons-rule<br><br>(simpsons-rule cube 0 1 100)<br>;Value: 1/4<br><br>(simpsons-rule cube 0 1 1000)<br>;Value: 1/4</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-30">1.30</a>:<br /><br>Personally I think it's really nice that Abelson and Sussman have been throwing in these sort of review problems. They make me feel like I'm learning something. They give me hope. I solved this one in about 1 minute and a half and thought, "Hey, maybe I'm not a complete idiot. Maybe I'll actually know something about programming one day."</p><br><pre lang="lisp">(define (sum term a next b)<br>  (define (iter a result)<br>    (if (> a b)<br>        result<br>        (iter (next a) (+ (term a) result))))<br>  (iter a 0))<br>;Value: sum</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-31">1.31</a>:</p><br><p>a.</p><br><pre lang="lisp">(define (product term a next b)<br>  (if (> a b)<br>      1<br>      (* (term a)<br>	 (product term (next a) next b))))<br>;Value: product<br><br>(define (factorial n)<br>  (product (lambda (x) x) 1 (lambda (x) (+ x 1)) n))<br>;Value: factorial<br><br>(define (pi-approx approximations)<br>  (define (pi-term denom) (/ (- (square denom) 1) (square denom)))<br>  (define (next-term denom) (+ denom 2))<br>  (product pi-term 3 next-term approximations))<br>;Value: pi-approx<br><br>(pi-approx 40)<br>;Value: 4722366482869645213696/5938020471163465810125 (.795276)</pre><br><p>I just changed the variable names and commented pi-approx. The comment is omitted here in favor of this explanation. I couldn't figure out what on earth I was doing in the original so I actually wrote a brand new pi-approx with a different approach before realizing my original version was both correct and, I suspect, faster. I was computing 2 terms at a time based on their shared denominator.</p><br><p>b.</p><br><pre lang="lisp">(define (product term a next b)<br>  (define (iter a result)<br>    (if (> a b)<br>	result<br>	(* (term a)<br>	   (product term (next a) next b))))<br>  (iter a 1))<br>;Value: product</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-32/">1.32</a>:</p><br><p>a.</p><br><pre lang="lisp">(define (accumulate combiner null-value term a next b)<br>  (if (> a b)<br>      null-value<br>      (combiner (term a)<br>		(accumulate combiner null-value term (next a) next b))))<br>;Value: accumulate<br><br>(define (sum term a next b)<br>  (accumulate + 0 term a next b))<br>;Value: sum<br><br>(define (product term a next b)<br>  (accumulate * 1 term a next b))<br>;Value: product</pre><br><p>b.</p><br><pre lang="lisp">(define (accumulate combiner null-value term a next b)<br>  (define (iter a result)<br>    (if (> a b)<br>	null-value<br>	(combiner (term a)<br>		  (iter (next a) result))))<br>  (iter a null-value))<br>;Value: accumulate</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-33">1.33</a>:</p><br><pre lang="lisp">(define (filtered-accumulate combiner null-value term a next b filter)<br>  (cond ((> a b) null-value)<br>	((filter a) (combiner (term a)<br>			       (filtered-accumulate combiner null-value term<br>						    (next a) next b filter)))<br>	(else (filtered-accumulate combiner null-value term<br>				   (next a) next b filter))))<br>;Value: filtered-accumulate</pre><br><p>a.</p><br><pre lang="lisp">(define (sum-square-primes a b)<br>  (filtered-accumulate + 0 square a inc b prime?))<br>;Value: sum-square-primes</pre><br><p>b.</p><br><pre lang="lisp">(define (product-relative-primes n)<br>  (define (relatively-prime i)<br>    (= (gcd i n) 1))<br>  (filtered-accumulate * 1 identity 1 inc n relatively-prime))<br>;Value: product-relative-primes</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-34">1.34</a>:<br /><br>The procedure f only actually produces output when it's argument is another procedure, specifically a procedure which takes one formal parameter. Given a procedure of a different arity it will produce an error regarding the wrong number of arguments and given a non-procedural argument it will complain about the object not being applicable.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-35">1.35</a>:</p><br><pre lang="lisp">(define tolerance 0.00001)<br>;Value: tolerance<br><br>(define (fixed-point f first-guess)<br>  (define (close-enough? v1 v2)<br>    (< (abs (- v1 v2)) tolerance))<br>  (define (try guess)<br>    (let ((next (f guess)))<br>      (if (close-enough? guess next)<br>          next<br>          (try next))))<br>  (try first-guess))<br>;Value: fixed-point<br><br>(define (golden-ratio)<br>  (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0))<br>;Value: golden-ratio<br><br>(golden-ratio)<br>;Value: 1.6180327868852458</pre><br><p>Things are pretty straightforward from 1.29 through 1.36. The main thing to remember on 1.35 and 1.36 is that a transformation is just a function and serves as the f in the fixed-point.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-36">1.36</a>:</p><br><pre lang="lisp">(define (fixed-point f first-guess)<br>  (define (close-enough? v1 v2)<br>    (< (abs (- v1 v2)) tolerance))<br>  (define (try guess)<br>    (let ((next (f guess)))<br>      (display guess)<br>      (newline)<br>      (if (close-enough? guess next)<br>	  next<br>	  (try next))))<br>  (try first-guess))<br>;Value: fixed-point<br><br>(define (solve-for-x)<br>  (fixed-point (lambda (x) (/ (log 1000) (log x))) 2.0))<br>;Value: solve-for-x<br><br>(solve-for-x)<br>2.<br>9.965784284662087<br>3.004472209841214<br>6.279195757507157<br>3.759850702401539<br>5.215843784925895<br>4.182207192401397<br>4.8277650983445906<br>4.387593384662677<br>4.671250085763899<br>4.481403616895052<br>4.6053657460929<br>4.5230849678718865<br>4.577114682047341<br>4.541382480151454<br>4.564903245230833<br>4.549372679303342<br>4.559606491913287<br>4.552853875788271<br>4.557305529748263<br>4.554369064436181<br>4.556305311532999<br>4.555028263573554<br>4.555870396702851<br>4.555315001192079<br>4.5556812635433275<br>4.555439715736846<br>4.555599009998291<br>4.555493957531389<br>4.555563237292884<br>4.555517548417651<br>4.555547679306398<br>4.555527808516254<br>4.555540912917957<br>;Value: 4.555532270803653<br><br>(define (solve-for-x)<br>  (fixed-point (lambda (x) (average x (/ (log 1000) (log x)))) 2.0))<br>;Value: solve-for-x<br><br>(solve-for-x)<br>2.<br>5.9828921423310435<br>4.922168721308343<br>4.628224318195455<br>4.568346513136242<br>4.5577305909237005<br>4.555909809045131<br>4.555599411610624<br>4.5555465521473675<br>;Value: 4.555537551999825</pre><br><p>Pretty impressive. solve-for-x went from taking 34 steps to 9 steps thanks to average damping. I wonder what it does for golden ratio? And sqrt's for various inputs...</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-37">1.37</a>:<br /><br>a.</p><br><pre lang="lisp">(define (cont-frac n d k)<br>  (define (frac-iter i)<br>    (if (< i k)<br>	(/ (n i) (+ (d i) (frac-iter (+ i 1))))<br>	(/ (n i) (d i))))<br>  (frac-iter 1))<br>;Value: cont-frac<br><br>(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 11)<br>;Value: .6180555555555556</pre><br><p>b.</p><br><pre lang="lisp">(define (cont-frac n d k)<br>  (define (frac-iter count result)<br>    (if (= count 0)<br>	result<br>	(frac-iter (- count 1)<br>		   (/ (n count) (+ (d count) result)))<br>  (frac-iter k 0))<br>;Value: cont-frac<br><br>(cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 11)<br>;Value: .6180555555555556</pre><br><p>The main thing that's tricky about 1.37 is figuring out the math of continued fractions and starting with the base case of the last term and working backwards.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-38">1.38</a>:</p><br><pre lang="lisp">(define (euler-expand)<br>  (define (d-fun i)<br>    (cond ((= (modulo i 3) 2) (* (ceiling (/ i 3)) 2))<br>	  (else 1)))<br>  (cont-frac (lambda (i) 1.0) d-fun 8))<br>;Value: euler-expand<br><br>(euler-expand)<br>;Value: .7182795698924731</pre><br><p>So, my original iterative version of cont-frac didn't actually work for this problem. The iterative version didn't work for this problem because it treated division as though it's <a href="http://en.wikipedia.org/wiki/Commutativity">commutative</a> and it isn't. It took me a while to figure that out.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-39">1.39</a>:</p><br><pre lang="lisp">(define (tan-cf x k)<br>  (define (d i)<br>    (- (* 2 i) 1))<br>  (define (n i)<br>    (if (= x 1)<br>	x<br>	(square x)))<br>  (cont-frac n d k))<br>;Value: tan-cf<br><br>(tan-cf 1.0 5)<br>;Value: 1.5574074074074076</pre><br><p>This one is actually fairly tricky. If you fail to notice that this is a continued fraction that subtracts rather than adds you're completely hosed. I modified my cont-frac procedure to fix this once I noticed. There's probably an elegant way to extend cont-frac to accomodate these different uses (subtracting versus adding continued fractions, etc.) but I'm not going to chase it down myself. Anybody feel like improving on this?</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-40">1.40</a>:</p><br><pre lang="lisp">(define (cubic a b c)<br>  (lambda (x) (+ (expt x 3) (* a (expt x 2)) (* b x) c)))<br><br>(define dx 0.00001)<br>;Value: dx<br><br>(define (fixed-point-of-transform g transform guess)<br>  (fixed-point (transform g) guess))<br>;Value: fixed-point-of-transform<br><br>(define (cubic a b c)<br>  (lambda (x) (+ (expt x 3) (* a (expt x 2)) (* b x) c)))<br>;Value: cubic<br><br>(define (deriv g)<br>  (lambda (x) (/ (- (g (+ x dx)) (g x)) dx)))<br>;Value: deriv<br><br>(define (newton-transform g)<br>  (lambda (x) (- x (/ (g x) ((deriv g) x)))))<br>;Value: newton-transform<br><br>(define (newtons-method g guess)<br>  (fixed-point (newton-transform g) guess))<br>;Value: newtons-method<br><br>(newtons-method (cubic 4 3 2) 1)<br>;Value: -3.2695308420809894</pre><br><p>I didn't realize I just needed to literally translate the function. After I knew that I was fine. Again, time to study more math.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-41">1.41</a>:</p><br><pre lang="lisp">(define (double x)<br>  (lambda (i) (x (x i))))<br>;Value: double<br><br>(define (inc x) (+ x 1))<br>;Value: inc<br><br>((double inc) 0)<br>;Value: 2<br><br>(((double (double double)) inc) 5)<br>;Value: 21<br><br>;;This is because a double on a (double double) is effectively a square.<br><br>(double double)<br>;Value 16: #[compound-procedure 16]<br><br>(((double (double double)) inc) 0)<br>;Value: 16<br><br>((double (double (double inc))) 0)<br>;Value: 8<br><br>(((double (double (double double))) inc) 0)<br>;Value: 256</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-42">1.42</a>:</p><br><pre lang="lisp">(define (compose f g)<br>  (lambda (i) (f (g i))))<br>;Value: compose<br><br>((compose square inc) 6)<br>;Value: 49</pre><br><p><a href="http://sicp.org.ua/sicp/Exercise1-43">1.43</a>:</p><br><pre lang="lisp">(define (repeated f n)<br>  (if (= n 1)<br>      f<br>      (compose f (repeated f (- n 1)))))<br>;Value: repeated<br><br>((repeated square 2) 5)<br>;Value: 625</pre><br><p>Wow! That was a lot easier to think about using compose.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-44">1.44</a>:</p><br><pre lang="lisp">(define (smooth f)<br>  (define dx 0.00001)<br>  (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))<br>;Value: smooth<br><br>((smooth square) 2)<br>;Value: 4.000000000066667<br><br>(define (n-smoothed f n)<br>  (repeated smooth n) f)<br>;Value: n-smoothed<br><br>((n-smoothed square 16) 2)<br>;Value: 4</pre><br><p>Check <a href="http://theloserblog-home.blogspot.com/2007/11/sicp-exercise-144.html">The Loser Blog</a> for a potentially better answer.</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-45">1.45</a>:</p><br><pre lang="lisp">(define tolerance 0.00001)<br>;Value: tolerance<br><br>(define (fixed-point f first-guess)<br>  (define (close-enough? v1 v2)<br>    (< (abs (- v1 v2)) tolerance))<br>  (define (try guess)<br>    (let ((next (f guess)))<br>      (if (close-enough? guess next)<br>	  next<br>	  (try next))))<br>  (try first-guess))<br>;Value: fixed-point<br><br>(define (average x y)<br>  (/ (+ x y) 2))<br>;Value: average<br><br>(define (average-damp f)<br>  (lambda (x) (average x (f x))))<br>;Value: average-damp<br><br>(define (nth-root x n)<br>  (fixed-point (repeated<br>		(average-damp (lambda (y) (/ x (expt y (- n 1)))))<br>		(ceiling (/ n 2))) 1.0))<br>;Value: nth-root<br><br>(define (compose f g)<br>  (lambda (x) (f (g x))))<br>;Value: compose<br><br>(define (repeated f n)<br>  (if (= n 1)<br>      f<br>      (compose f (repeated f (- n 1)))))<br>;Value: repeated<br><br>(define (nth-root x n)<br>  (fixed-point-of-transform (lambda (y) (/ x (expt y (- n 1))))<br>			    (repeated average-damp (log2 n)) 1.0))<br>;Value: nth-root<br><br>(define (log2 n)<br>  (if (= 1 n)<br>      0<br>      (+ (log2 (floor (/ n 2))) 1)))<br>;Value: log2</pre><br><p>After testing the first 15 powers with my version of nth-root I couldn't figure out the relationship between n and the times to average damp. Just about everyone had trouble with this but I found the correct answer in <a href="http://eli.thegreenplace.net/2007/07/19/sicp-section-134/#comments">Eli's comment thread</a>...</p><br><p><a href="http://sicp.org.ua/sicp/Exercise1-46">1.46</a>:</p><br><pre lang="lisp">(define (iterative-improve tester improver)<br>  (define (iter guess x)<br>    (if (tester guess)<br>	guess<br>	(iter (improver guess) x)))<br>  (lambda (x) (iter 1.0 x)))<br>;Value: iterative-improve<br><br>(define (sqrt x)<br>  ((iterative-improve<br>    (lambda (guess) (< (abs (- (square guess) x)) 0.00001))<br>    (lambda (guess) (average guess (/ x guess)))) x))<br>;Value: sqrt<br><br>(define (average x y)<br>  (/ (+ x y) 2))<br>;Value: average<br><br>(sqrt 2)<br>;Value: 1.4142156862745097<br><br>(define (fixed-point f x)<br>  ((iterative-improve<br>    (lambda (guess) (< (abs (- guess (f guess))) 0.00001))<br>    (lambda (guess) (f guess))) x))<br>;Value: fixed-point<br><br>(fixed-point cos 1.0)<br>;Value: .7390893414033927</pre><br><p>(Edit: 05/18/08) Well, that wraps it up for Section 1.3. I can't believe how long it took me to find the time to come back and clean these answers up a bit. I have had a lot going on though. There will be a few small changes in convention starting in SICP 2.1 to make things more manageable for me. As always, the most up to date code is in <a href="http://www.redlinernotes.com/code">the repo</a>.</p>


title: SICP Section 2.1
date: 2008-08-07 20:54:02.000000
format: html
content:
  It's taken far too long to post this up and the last four problems remain unfinished. That said, I want to get more of the solutions I've worked written up and I shouldn't have waited this long in the first place. With any luck Section 2.2 will follow within a week. I'm around half done with it and you can see some solutions <a href="http://www.redlinernotes.com/code">here</a>.<br><br><!--more--><br><br>Resources:<br>Read: <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-13.html#%_chap_2">Chapter 2</a> through <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html">Section 2.1</a><br>Watch: <a href="http://www.swiss.ai.mit.edu/classes/6.001/abelson-sussman-lectures/">Lecture</a> <a href="http://www.swiss.ai.mit.edu/classes/6.001/abelson-sussman-lectures/videos/Lecture-2b.avi">2-b</a><br>Checked against: <a href="http://eli.thegreenplace.net/category/programming/lisp/sicp/">Eli Bendersky's Blog</a>, <a href="http://sicp.org.ua/sicp/Section2-1">SICP Wiki</a>, <a href="http://www.kendyck.com/solutions-to-sicp/">Ken Dyck's Solutions</a>, <a href="http://theloserblog-home.blogspot.com/search/label/SICP">Theloserblog</a>, <a href="http://wfasim.dyndns.org/wordpress/?page_id=136">Wfasim's Solutions</a> and the Scheme Wiki and Personal Wiki solutions listed <a href="http://doingthistolearn.net/links/SICP.html">here</a>.<br><br>SICP Notes and Exercises:<br><br>Notes<br><br>Quotes<br><br>Exercises<br><a href="http://sicp.org.ua/sicp/Exercise2-1">2.1</a>:<br><pre lang="scheme"><br>(define (make-rat n d)<br>  (let ((g (gcd n d)))<br>    (if (positive? (/ n d))<br>	(cons (abs (/ n g)) (abs (/ d g)))<br>	(cons (- (/ n g)) (abs (/ d g))))))<br>;Value: make-rat</pre><br><br><a href="http://sicp.org.ua/sicp/Exercise2-2">2.2</a>:<br><pre lang="scheme"><br>(define (make-point x y)<br>  (cons x y))<br>;Value: make-point<br><br>(define (x-point point)<br>  (car point))<br>;Value: x-point<br><br>(define (y-point point)<br>  (cdr point))<br>;Value: y-point<br><br>(define (start-segment segment)<br>  (car segment))<br>;Value: start-segment<br><br>(define (end-segment segment)<br>  (cdr segment))<br>;Value: end-segment<br><br>(define (make-segment p1 p2)<br>  (cons p1 p2))<br>;Value: make-segment<br><br>(define (print-point p)<br>  (newline)<br>  (display "(")<br>  (display (x-point p))<br>  (display ",")<br>  (display (y-point p))<br>  (display ")"))<br>;Value: print-point<br><br>(define (midpoint-segment s)<br>  (make-point (average (x-point (start-segment s))<br>		       (x-point (end-segment s)))<br>	      (average (y-point (start-segment s))<br>		       (y-point (end-segment s)))))<br>;Value: midpoint-segment</pre><br><br>This is really interesting to me. I feel like midpoint-segment should be expressible in 2 or 4 lines of code but I can't think of a way to elegantly do that with lets or function composition. The problem is each time you're composing different sets of functions. Without defining multiple lets or compositions it doesn't compress and if you do you lose your LOC gains anyway. I've decided this definition is sufficiently succinct.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-3">2.3</a>:<br><pre lang="scheme"><br>;;representation 1 - procedure based, working by magic:<br>(define (rect-area r)<br>  (* (length r) (width r)))<br>;Value: rect-area<br><br>(define (rect-perimeter r)<br>  (* 2 (+ (length r) (width r))))<br>;Value: rect-perimeter<br><br>(define (make-rect top-left bottom-right)<br>  (cons top-left bottom-right))<br>;Value: make-rect<br><br>(define (length r)<br>  (- (y-point (car r)) (y-point (cdr r))))<br>;Value: length<br><br>(define (width r)<br>  (- (x-point (cdr r)) (x-point (car r))))<br>;Value: width<br><br>;;representation 2 - not procedure based, working by reality:<br>(define (make-rect top bottom)<br>  (cons top bottom))<br>;Value: make-rect<br><br>(define (rect-top r)<br>  (car r))<br>;Value: rect-top<br><br>(define (rect-bottom r)<br>  (cdr r))<br>;Value: rect-bottom<br><br>(define (rect-left r)<br>  (make-segment (start-segment top)<br>		(start-segment bottom)))<br>;Value: rect-left<br><br>(define (rect-right r)<br>  (make-segment (end-segment top)<br>		(end-segment bottom)))<br>;Value: rect-right<br><br>(define (length r)<br>  (- (y-point (start-segment (rect-top r)))<br>     (y-point (start-segment (rect-bottom r)))))<br>;Value: length<br><br>(define (width r)<br>  (- (x-point (end-segment (rect-top r)))<br>     (x-point (start-segment (rect-top r)))))<br>;Value: width</pre><br><br>What working by magic really seems to do is make the cruft that's unnecessary to your implementation obvious.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-4">2.4</a>:<br><pre lang="scheme"><br>(define (cons x y)<br>  (lambda (m) (m x y)))<br>;Value: cons<br><br>(define (car z)<br>  (z (lambda (p q) p)))<br>;Value: car<br><br>(define (cdr z)<br>  (z (lambda (p q) q)))<br>;Value: cdr</pre><br><br>Wow. Just wow.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-5">2.5</a>:<br><pre lang="scheme"><br>(define (cons a b)<br>  (* (expt 2 a) (expt 3 b)))<br>;Value: cons<br><br>(define (what-exponent x y)<br>  (define (exp-iter count)<br>    (if (= (modulo y (expt x count)) 0)<br>	(exp-iter (+ count 1))<br>	(- count 1)))<br>  (exp-iter 1))<br>;Value: what-exponent<br><br>(define (car x)<br>  (what-exponent 2 x))<br>;Value: car<br><br>(define (cdr x)<br>  (what-exponent 3 x))<br>;Value: cdr</pre><br><br>This isn't quite as evil as the problem description makes it sound.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-6">2.6</a>:<br>Whew boy. Here goes...<br><br><pre lang="scheme"><br>(define zero (lambda (f) (lambda (x) x)))<br>;Value: zero<br><br>(define (add-1 n)<br>  (lambda (f) (lambda (x) (f ((n f) x)))))<br>;Value: add-1<br><br>(add-1 zero)<br>(lambda (f) (lambda (x) (f ((zero f) x))))<br>(lambda (f) (lambda (x) (f x))) ;; this was the difficult step for me. why? i couldn't understand how ((zero f) x) got worked down to x. I knew that the identity function was what eventually got returned but I figured it received f as it's argument. The trick was recalling that f gets passed into a function which does NOTHING WITH F and returns the identity function anyway. (zero f) reduces to the identity function because of the first lambda in zero that just throws it's argument away. Hence, you have (identity x) which is just x and leaves this result as one. somewhat sadly, formatting my code so that the substitution wasn't all on one line also could've made the difference and saved me a week or so.<br><br>(define one (lambda (f) (lambda (x) (f x))))<br>;Value: one<br><br>(add-1 one)<br>(lambda (f) (lambda (x) (f ((one f) x))));; again the f arg is thrown away and x is put into the second lambda to give...<br>(lambda (f) (lambda (x) (f (f x))))<br><br>(define two (lambda (f) (lambda (x) (f (f x)))))<br>;Value: two<br><br>;;clearly we're adding an application of f each time we add one. for example...<br>((two square) 5)<br>;Value: 625<br>;; which is the square of the square of 5 (* 25 25)<br><br>;;now i'm supposed to define an addition function which should perform like so:<br>(add one two)<br>(add (lambda (f) (lambda (x) (f x)))<br>     (lambda (f) (lambda (x) (f (f x)))))<br>...<br>(lambda (f) (lambda (x) (f (f (f x)))))<br>;;and then allow us to do this<br>(((add one two) square) 5)<br>(square (square (square 5)))<br>;Value: 390625<br><br>;;maybe the hard part of this problem is holding multiple levels of evaluation in your head at the same time. anyway...<br>;;it seems like what we really want to do is feed the f chains into each other somehow...p<br><br>(define (add a b)<br>  (lambda (f) (lambda (x) ((a f) (b f)) x)))<br>;Value: add<br><br>;;this is tempting but wrong. i realized you had to pass the f in to make sure you got the correct repeated calls but missed that if you passed (b f) into the resulting function you were passing a procedure instead of a value.<br><br>(define (add a b)<br>  (lambda (f) (lambda (x) ((a f) ((b f) x)))))<br>;Value: add<br><br>(add one two)<br>(lambda (f) (lambda (x) ((one f) ((two f) x))))<br>(lambda (f) (lambda (x) ((one f)<br>			 ((lambda (x) (f (f x))) x))))<br>(lambda (f) (lambda (x)<br>	      (lambda (x) ((f x)<br>			   (lambda (x) (f (f x)) x)))<br>(lambda (f) (lambda (x) (f (f (f x)))))<br><br>;;you want to hear what's really gross? i found that this worked for odd numbers but not even numbers and tried unsuccessfully to figure out what was wrong for an hour before re-evaluating my definitions for one and two and seeing it "just work".<br><br>(((add one two) square) 5)<br><br>(define (test churchnum)<br>  (define (inc x)<br>    (+ x 1))<br>  ((churchnum inc) 0))<br>;Value: test<br><br>(test (add one two))<br>;Value: 3<br><br>;;it's sort of insulting that after writing all that code you realize<br>you just implemented a fancy lambda version of repeated for<br>functions/church numerals.<br><br>;;proving above point:<br>(define (compose f g)<br>  (lambda (x) (f (g x))))<br>;Value: compose<br><br>(define (repeated f n)<br>  (if (= n 1)<br>      f<br>      (compose f (repeated f (- n 1)))))<br>;Value: repeated<br><br>(define (add a b)<br>  (lambda (f) (repeated f (+ a b))))<br>;Value: add<br><br>;;of course, this pretends that church numerals are integers but...you get the idea.<br></pre><br><br>This may have been the hardest problem I encountered thus far and I definitely had to peek at the way other people started solving the problem to get my own ideas flowing in the right direction.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-7">2.7</a>:<br><pre lang="scheme"><br>(define (lower-bound i)<br>  (car i))<br>;Value: lower-bound<br><br>(define (upper-bound i)<br>  (cdr i))<br>;Value: upper-bound</pre><br><br><a href="http://sicp.org.ua/sicp/Exercise2-8">2.8</a>:<br><pre lang="scheme"><br>(define (sub-interval x y)<br>  (let ((p1 (- (lower-bound x) (lower-bound y)))<br>	(p2 (- (lower-bound x) (upper-bound y)))<br>	(p3 (- (upper-bound x) (lower-bound y)))<br>	(p4 (- (upper-bound x) (upper-bound y))))<br>    (make-interval (min p1 p2 p3 p4)<br>		   (max p1 p2 p3 p4))))<br>;Value: sub-interval</pre><br><br>Similiar to the addition function the maximum value the difference could be is that of the furthest upper and lower bound and the minimum difference is that of the closest upper and lower bound. This seems to be the best way to test for that.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-9">2.9</a>:<br><pre lang="scheme"><br>(define (width-interval x)<br>  (/ (- (upper-bound x) (lower-bound x))<br>     2))<br>;Value: width-interval<br><br>(width-interval (mul-interval inter1 inter2))<br>;Value: 24<br><br>(width-interval (div-interval inter1 inter2))<br>;Value: .5333333333333334<br><br>(width-interval (add-interval inter1 inter2))<br>;Value: 4<br><br>(width-interval (sub-interval inter1 inter2))<br>;Value: 4</pre><br><br>Observe that the width of the interval which is the difference between inter1 and inter 2 is identical to the width of the interval which is the sum of inter1 and inter2.<br>This fact indicates that the width of summed or subtracted intervals is a function of the width of their source intervals. You can clearly see that the width of the intervals produced by multiplying or dividing inter1 and inter2 do not share this trait. Thus, the width of multiplied or divided intervals is not a function of their source intervals alone.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-10">2.10</a>:<br><pre lang="scheme"><br>(define (div-interval x y)<br>  (if (<= (or (upper-bound y) (lower-bound y)) 0)<br>      (error "Cannot divide by an interval that spans zero." y)<br>      (mul-interval x<br>		    (make-interval (/ 1.0 (upper-bound y))<br>				   (/ 1.0 (lower-bound y))))))<br>;Value: div-interval</pre><br><br>This fixes the issue of dividing by zero in the software by simply not allowing intervals to drop below zero. Whether intervals that "span" zero should be allowed is up for debate.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-11">2.11</a>:<br><pre lang="scheme"><br>(define (mul-interval x y) ;;even with lets this is ugly. i object!<br>  (let ((a (lower-bound x))<br>	(b (upper-bound x))<br>	(c (lower-bound y))<br>	(d (upper-bonud y)))<br>    (cond ((and (> a 0) (> b 0) (> c 0) (> d 0))<br>	   (make-interval (* a c) (* b d)))<br>	  ((and (> a 0) (> b 0) (< c 0) (> d 0))<br>	   (make-interval (* b c) (* b d)))<br>	  ((and (< a 0) (> b 0) (> c 0) (> d 0))<br>	   (make-interval (* a d) (* b d)))<br>	  ((and (< a 0) (> b 0) (< c 0) (< d 0))<br>	   (make-interval (* b d) (* a d)))<br>	  ((and (< a 0) (< b 0) (< c 0) (> d 0))<br>	   (make-interval (* b d) (* b c)))<br>	  ((and (< a 0) (< b 0) (< c 0) (< d 0))<br>	   (make-interval (* a c) (* b d)))<br>	  ((or (and (> a 0) (> b 0) (< c 0) (< d 0))<br>	       (and (< a 0) (< b 0) (> c 0) (> d 0)))<br>	   (make-interval (* b d) (* a c)))<br>	  (else (make-interval (min (* a d) (* b c))<br>			       (max (* a c) (* b d)))))))<br>;Value: mul-interval</pre><br><br>Eww. Gross.<br><br><a href="http://sicp.org.ua/sicp/Exercise2-12">2.12</a>:<br><pre lang="scheme"><br>(define (make-center-percent center tolerance)<br>  (make-center-width center (* (/ tolerance 100) center)))<br>;Value: make-center-percent<br><br>(define (percent i)<br> (* (/ (width i) (center i)) 100))<br>;Value: percent<br><br>(percent (make-center-percent 8 5))<br>;Value: 5</pre><br><br>It's not much and I plan on updating and expanding on this but it's done for now.


title: Sight
date: 2013-03-26 10:24:00.000000
format: md
content:
  It's been a while since I posted some poetry. Since I'm pretty sure I'll need glasses in the next year, here's a piece by Milosz about eyes.

  ## Eyes

  ```
    My most honorable eyes, you are not in the best of shape.
    I receive from you an image that is less than sharp,
    And if a color, then it's dimmed.
    And you were a pack of royal greyhounds once,
    With whom I would set out early mornings.
    My wondrous quick eyes, you saw many things,
    Lands and cities, islands and oceans.
    Together we greeted immense sunrises
    When the fresh air set us running on trails
    Where the dew had just begun to dry.
    Now what you have seen is hidden inside me
    And changed into memories or dreams.
    I am slowly moving away from the fairgrounds of the world
    And I notice in myself a distaste
    For the monkeyish dress, the screams and the drumbeats.
    What a relief. To be alone with my meditation
    On the basic similarity in humans
    And their tiny grain of dissimilarity.
    Without eyes, my gaze is fixed on one bright point,
    That grows large and takes me in.
  ```


title: Silly School
date: 2009-09-15 16:01:47.000000
format: html
content:
  This post is likely to be a bit scattered. Partially because I need to get back to doing homework in a minute but also because my brain has been in a lot of places lately. So here's a linkpost with thoughts on IP Law, Linux and other stuff. I also have a bunch of Lisp links but I'll dump those separately later...after I get some homework done.<br><br>I <a href="http://arstechnica.com/microsoft/news/2009/09/microsoft-teaches-best-buy-employees-how-to-troll-linux-users.ars">keep</a> <a href="http://arstechnica.com/open-source/news/2009/09/linux-foundation-to-microsoft-stop-secretly-attacking-linux.ars">hearing</a> <a href="http://arstechnica.com/microsoft/news/2009/09/ballmer-makes-a-scene-over-employees-iphone.ars">about</a> stupid moves by Microsoft lately. It's very confusing because in many ways my opinion of them has improved over the last few years. Not that I'd ever want to use a Windows-based OS again. I'm just too happy in Linux land. My point though, is that the company clearly has an old culture of anti-competitive wonkiness and a newer culture that seems more focused on creating good products and less on market manipulation. Maybe it's all just weird management stuff though. Hopefully that will change sooner rather than later. On the other hand, <a href="http://arstechnica.com/gaming/news/2009/08/sonys-ad-pokes-fun-at-self-internet.ars">Sony seems to be getting their console act together</a> between dropping prices and actually putting out effective advertising for perhaps the first time in history. I'm also quite pleased with <a href="http://arstechnica.com/tech-policy/news/2009/09/google-liberates-data-makes-it-easier-to-leave-the-cloud.ars">Google taking a (more official) stance on Data Portability</a>. It's something I feel pretty strongly about though I won't speak more about it today.<br><br>My hatred of AT&amp;T seems to be perpetually growing. The FCC is trying to come up with a more formal definition of broadband and the carriers are, in my view, trying to make that definition demand as little of them as possible. Generally, I've gotten to a point where I hate telecoms. So, I have a message for them: Give me fiber, or whatever wireless connectivity you're pimping this week, and shut the hell up. In other news, IP Law is still completely ridiculous and I can't begin to summarize or explain that here. I can offer an example or two though. The first is a list of <a href="http://gapersblock.com/mechanics/2009/08/17/seven-crimes-to-consider-befor/">seven felonies with less severe penalties than music piracy</a>. It's meant to be humorous. It's sadly surreal. I'll actually let that be enough of an example for today and link to a discussion of <a href="http://journalismschool.wordpress.com/2009/07/24/what-would-fair-use-look-like-in-an-online-era/">what fair use might look like in the 21st century</a> and <a href="http://arstechnica.com/tech-policy/news/2009/09/goodbye-drm-hello-stealable-digital-personal-property.ars">a curious idea of making digital property "stealable"</a>. Last but not least, I'm at least glad that good <a href="http://arstechnica.com/tech-policy/news/2009/09/software-patents-theres-no-baby-in-this-bathwater.ars">arguments against software patents</a> are being made to the Supreme Court. Crossing my fingers on that one!<br><br>Peter Seibel's <a href="http://www.codersatwork.com/">Coders at Work</a> has finally come out. I was looking forward to the book for a good while and have been enjoying reading the interviews. LtU recently <a href="http://lambda-the-ultimate.org/node/3613">posted about it</a> also. I've got 7 of 15 knocked out. I've been surprised that the two interviews I think I've enjoyed the most were with Simon Peyton-Jones and Brendan Eich. I was expecting the Lispers or Smalltalkers to be more to my liking. *shrug* I'll likely write a review or at least talk more about it when I'm finished.<br><br>I've been following a few pieces of software (as usual). It's nice to see the competitiveness in the browser market of late. The <a href="http://code.google.com/p/chromium/wiki/LinuxWeeklyNotes">Chrome Linux team was disbanded recently</a> and I take it that work is now part of mainline so hopefully there will be an official Chrome release for Linux "Real Soon Now". I should also note the <a href="http://arstechnica.com/open-source/news/2009/09/webkit-adoption-shows-strong-momentum-for-webgl-3d-graphics.ars">emerging standard for 3D Graphics on the web</a>. Something good will come of this. Additionally, GHC 6.12 is <a href="http://hackage.haskell.org/trac/ghc/query?status=new&amp;status=assigned&amp;status=reopened&amp;priority=high&amp;milestone=6.12.1&amp;order=priority">coming</a> <a href="http://hackage.haskell.org/trac/ghc/query?status=new&amp;status=assigned&amp;status=reopened&amp;milestone=6.12.1">along</a> nicely. Lots of bugfixes the last few days. Looking forward to GHC 6.12.1 RC getting out there even though I won't be using it. Rock on, Haskellers. <a href="http://pitivi.org/wiki/0.13.3">Pitivi also made another  release</a>. Now if only Arch would get an updated <a href="http://www.archlinux.org/packages/community/x86_64/pitivi/">pitivi package</a>, I'd be a very happy man. Oh, and there hasn't really been any more news on the N900. I'm keeping my ear to the ground.<br><br>Finally, this is the month of Linux conferences between the <a href="http://atlantalinuxfest.org/">Atlanta Linux Conference</a> this weekend, the almighty <a href="http://keithp.com/blogs/Linux_Plumbers_2009/">Linux Plumbers Conference</a> next week and the <a href="http://www.x.org/wiki/Events/XDC2009">X Developers' Conference</a> after that. Speaking of X, <a href="http://anholt.livejournal.com/41522.html">anholt reports continuing progress on the Intel front</a> and I feel warm and fuzzy inside. All for now folks, later!


title: Silly Slime
date: 2009-06-11 18:00:40.000000
format: html
content:
  Recently, SLIME has been acting funny. I think it's since an archlinux update but I hadn't had time to look into it. When I used the ~ key in the SLIME editor window (not the REPL) was causing some debugger error. So if I wanted to write a format string like "~a~%" then I was hosed. So...today I got fed up with it and using Emacs C-h k found that the key was invoking the "slime-sync-package-and-default-directory" function. Googling seemed to indicate this function was normally bound to "C-c ~".<br><br>At any rate, it shouldn't be bound to "~" so I went to the slime site lisp directory and ran <code>grep -r "slime-sync-package-and-default-directory" *</code>. Among the results was this:<br>contrib/slime-repl.el:  ("~" 'slime-sync-package-and-default-directory))<br>Aha. So the simple fix was changing the "~" to "\C-c ~". All seems to be well now...but what an odd thing to have to fix in the first place. *shrug*<br><br>Back to studying for Data Structures...and maybe lunch.


title: Since Last Time
date: 2009-10-19 23:04:56.000000
format: html
content:
  Well, it seems a lot has happened since last time. An additional lisp library for concurrency called <a href="http://www.cliki.net/Calispel">Calispel</a> has been released and is up on Cliki. Unfortunately, it depends on cl-jpl-utils which in turn depends on cl-rsm-queue, neither of which are on Cliki. Such is life. There are good things though, a <a href="http://article.gmane.org/gmane.lisp.openmcl.devel/4770">release candidate for CCL 1.4</a> has been put out. I've also started a branch porting Paktahn to Embedded Common Lisp. It didn't wind up being as tricky as I thought. Hopefully, I'll have something I can merge to master in a week or two. Of course, I wouldn't have gotten anywhere without <a href="http://blog.viridian-project.de/about/">Leslie</a>. Geez, that guy is patient. Anyway, what about non-lisp news? The ACM Reflections conference is over and hopefully <a href="http://www.acm.uiuc.edu/conference/2009/videos.html">videos will be posted</a> soon. Additionally, there's been <a href="http://article.gmane.org/gmane.comp.lang.factor.general/3454">some</a> <a href="http://www.reddit.com/r/programming/comments/9ukis/improved_write_barriers_in_factors_garbage/">discussion</a> about whether or not it's time for Factor 1.0. There's still really great work being done on the language implementation. I would like a proper book for it and binaries to be available in my linux distro but I can wait.<br><br>There's also been a good discussion on what math programmers need to know on reddit recently. The outstanding comments (IMO) are <a href="http://www.reddit.com/r/programming/comments/9uo0z/programmers_should_know_math_just_not_all_of_it/c0ej8az">here</a>, <a href="http://www.reddit.com/r/programming/comments/9uo0z/programmers_should_know_math_just_not_all_of_it/c0eiqo4">here</a>, <a href="http://www.reddit.com/r/programming/comments/9uo0z/programmers_should_know_math_just_not_all_of_it/c0eisdp">here</a> and <a href="http://www.reddit.com/r/programming/comments/9uo0z/programmers_should_know_math_just_not_all_of_it/c0eiv0w">here</a>. Similarly, there was a good thread a few weeks back titled "What do you wish you knew when you started programming?".  A few of my favorite comments are <a href="http://www.reddit.com/r/programming/comments/9pc69/what_are_some_things_you_wish_you_knew_when_you/c0dtcgb">here</a>, <a href="http://www.reddit.com/r/programming/comments/9pc69/what_are_some_things_you_wish_you_knew_when_you/c0dtllp">here</a>, <a href="http://www.reddit.com/r/programming/comments/9pc69/what_are_some_things_you_wish_you_knew_when_you/c0dt23h">here</a> and <a href="http://www.reddit.com/r/programming/comments/9pc69/what_are_some_things_you_wish_you_knew_when_you/c0dte34">here</a>. More importantly, there was a <a href="http://www.ribbonfarm.com/2009/10/07/the-gervais-principle-or-the-office-according-to-the-office/">very enjoyable article</a> and <a href="http://www.ribbonfarm.com/2009/10/14/hello-to-slashdotters-gervais-principle-follow-ups/">followup</a> about Office Politics as interpreted by Hugh MacLeod and The Office. As some folks in the <a href="http://news.ycombinator.com/item?id=881296">hackernews thread</a> mention, the model isn't universally applicable. Yep, that's right. It's a model. Go figure.<br><br>Well, it's been a very hard week. Mostly because I just hate my Algorithms class. I don't hate algortihms just the way it's being presented and taught. I'm pretty sure I can overcome the obstacles involved, I'm just much less motivated to do so than I would like. The last two semesters I really had a fire under my butt about school for some reason. Maybe not but when I had to rise to the challenge, it was relatively easy to do so and I was kind of proud of that since it was a divergence from my past. This semester the fight just isn't in me and I have next to no pride in what I'm doing in school. I'm sort of coasting and I'm finding it hard to break out of that. Of course, I'm learning the material and I'm doing extracurricular things to improve my knowledge, joy and understanding because <em><strong>I care about programming</strong></em>. Whether that's stupid or not is another question but also kind of irrelevant, I didn't choose to be fascinated by this stuff. I just can't help it. So I'm not doing what I love, I'm doing what I can't help but do. It's gonna be a long road.<br><br>I've still been getting a few things done. I've written a few quick hackish, sbcl-dependent scripts. Maybe I'll post some of the code for them soon. I started working on Redlinux again. The last release I made was <a href="http://redlinernotes.com/blog/?p=962">back in May</a> and a lot has changed since then, more about my approach than about Redlinux. I'm hoping to make a new release by the end of November. So far the big change is my build process. As in, now there actually is one. It should be <a href="http://redlinernotes.com/docs/redlinux/fresh_redlinux.txt">trivial</a> to rebuild from scratch in the future. See what a non-distribution it is? The upcoming release should have a nice proper script for creating a new user and doing a little initial setup. Above and beyond that, I'm hoping to work on the documentation some. If anything, the real problem is it may not fit on a single CD with all the programming software I've bundled in.<br><br>A while back I wrote a post on getting an undergraduate CS education for under $1,000. It was mostly focused on which books and resources were ideal for self-study. I reworked said list and <a href="http://www.amazon.com/gp/richpub/listmania/fullview/RTK97991HYF8T/ref=cm_lm_pthnk_view?ie=UTF8&amp;lm_bb=">posted it on Amazon</a> over the weekend. A lot of my decisions about what's worthwhile for self-study has changed (since I've actually read more). My motivation stems largely from the fact that I prefer self-study to school. Finally, there are two slightly <a href="http://redlinernotes.com/blog/?p=761">older</a> <a href="http://redlinernotes.com/blog/?p=913">articles</a> of mine that linked to a bunch of really interesting articles that are still among my favorite blog posts I've stumbled upon since trolling the internet for programming stuff. I'm hoping to do a real writeup on a number of these articles and add in a few of my own ideas in the near future. And since I'm calling it "the near future" you know advance I'll never get around to it. Well, hopefully not. :)<br><br>That's all for now. Back to homework guys.


title: Single
date: 2007-06-15 18:55:00.000000
format: html
content:
  I remember when my hand was cut and I snuck over to your house on the first day we were together and you bandaged it.<br>I remember when I cooked you salmon and we made love, in my bedroom.<br>And so this is life. Rich, more than we are able to absorb in all it's facets, too rich for us.<br>Rich, beyond comprehension. Full, beyond belief. My cup overfloweth. And I know not what to do.


title: Site Downtime
date: 2008-05-24 20:17:38.000000
format: html
content:
  Ladies and Gents,<br><br>Redlinernotes.com will be down from 4:15pm EST - ~5:30pm to move the server to a new hosting facility (i.e. house).<br><br>Thanks for your understanding. I look forward to filling your RSS feed again soon.<br><br>-Admin


title: Site Progress
date: 2007-07-09 02:01:00.000000
format: html
content:
  This weekend has gone alright. I've caught up on some things I haven't got done in a while. I'm back into reading (which is Lessig at present) and been working on the site a little. There's tons to do. I just hope to have everything up the way I want before my birthday. Anyway, I'm mostly working on stylistic aspects right now and infrastructure (the FTP). Once that's done it's on to moving the old livejournal posts over and moving music onto Redline Radio. Anyway, have a peek folks and let me know how it looks to you. Also, let me know if you can see everything. I don't know how this looks below 1280x1024 resolution.<br><br><a href="http://www.redlinernotes.com">RedlinerNotes.com</a><br><br>Also, who thinks <a href="http://goukihq.org">this guy's page</a> layout is awesome and I should steal the frontpage design and possibly the about section?


title: Sixteenth Monday Update
date: 2007-09-03 19:03:30.000000
format: html
content:
  Week 15: Finished<br><strike>tvs<br>gym<br>classes<br>write e-mail to tim sweeney asking for permission to publicize conversation.<br>help pete with his computer after class.<br>ren and dani</strike><br>Unexpected: Hung out with Kris, Watched Good Will Hunting, Posted E-mail conversation with Sweeney, Got through about 60 pages of Programming Erlang.<br><br>Week 16: Schedule<br>Monday<br>It's labor day. No work, no school.<br>Laundry<br>Respond to LJ comments.<br>Intro to Computing HW!<br>Java and C Homework?<br>Discrete Math Homework?<br>Tuesday<br>tvs 7-11<br>prog and problem solving i - cse 1301 002 - 01:30-2:45pm J-Atrium 151<br>prog and problem solving i - cse 1301 053 - 03:00-04:40pm J-Atrium 251<br>c programming - cs 2123 002 - 07:30-08:45pm J-Atrium 161<br>gym<br>Wednesday<br>tvs 7-11<br>discrete mathematics - math 2345 002 - 12:00-12:50pm D-Classroom 234<br>intro to computing disciplines - cse 1002 001 - 03:00-3:50pm J-Atrium 217<br>Thursday<br>tvs 7-11<br>prog and problem solving i - cse 1301 002 - 01:30-2:45pm J-Atrium 151<br>c programming - cs 2123 002 - 07:30-08:45pm J-Atrium 161<br>gym<br>Friday<br>tvs 7-11<br>discrete mathematics - math 2345 002 - 12:00-12:50pm D-Classroom 234<br>Get in touch with BJ Bernstein.<br>Bake cookies for Bria. Mail them.<br>First Smash Tourney Fall 07?


title: Sixteenth Thursday Literary Lines
date: 2007-09-06 17:00:16.000000
format: html
content:
  This is the last scheduled post I'm going to write. After this, it's back to the good old days. Everything will be "Just For Fun" and I'll post what I like when I like. It's been a good experiment in generating content these past 2^4 weeks but this is the end of it. Though I do expect to have some very nerdy stuff up by Saturday. :-)<br>No promises.<br><br>That said, I'm ending with a bang. This untitled piece from <em>Unattainable Earth</em> touches on many of the frequent themes of the master poet Milosz. I hope you enjoy it:<br><br>Rustling taffetas. At sunset in a park by the Prypet River.<br>The party sets out for a walk on a path lined with flowers.<br>The fragrance of nicotianas, phlox, and resedas.<br>Great silence, the empty expanse of rising waters.<br>Meanwhile the servants bring in lamps, set the table for supper.<br>And the dining room windows lit the agaves on the lawn.<br><br>Lela, Marishka, Sophineta! Lenia, Stenia, Isia, Lilka!<br>Is it fair that I will never talk with you<br>In a language not disguised by etiquette<br>As less than language and reduced to table chatter<br>But austere and precise like a thought<br>That attempts to embrace the poor lives of beings?<br><br>I walk about. No longer human. In a hunting outfit.<br>Visiting our thick forests and the houses and manors.<br>Cold borscht is served and I am abstracted<br>With disturbing questions from the end of my century.<br>Mainly regarding the truth, where does it come from, where is it?<br>Mum, I was eating chicken with cucumber salad.<br><br>My pretty ones, abducted, beyond will and guilt.<br>My awareness harrows me as well as my silence.<br>All my life I gathered images and ideas,<br>I learned how to travel through lost territories,<br>But the moment between birth and disappearance<br>Is too much, I know, for the meager word.<br><br>Strings of wild ducks fly over the Respublica's waters.<br>Dew falls on Polish manners imported from Warsaw and Vienna.<br>I cross the river in a dugout to the village side.<br>Barking dogs greet me there and the bell of an Orthodox church.<br><br>What would I like to tell you? That I didn't get what I looked for:<br>To gather all of us naked on the earthly pastures<br>Under the endless light of suspended time<br>Without that form which confines me as it once confined you.<br><br>Seeing the future. A diviner. In a soft merciful night.<br>When pigweed grows on the paths of a cut-down garden<br>And a narrow gold chain on a white neck,<br>Together with the memory of all of you, perishes.


title: Sixteenth Tuesday Quotables
date: 2007-09-05 12:08:25.000000
format: html
content:
  "There is not and there cannot be anything more precious for any thinking creature than life. Death is an oddity tearing the spectator away from a huge stage before the play, which infinitely interests him, is over." - Casanova, <em>Memoirs</em><br><br>"The animal wrests the whip from its master and whips itself in order to become master, not knowing that this is only a fantasy produced by a new knot in the master's whiplash." - Kafka, <em>The Blue Octavo Notebooks p. 24</em><br><br>"He is a free and secure citizen of this earth, for he is attached to a chain that is long enough to make all areas of the earth accessible to him, and yet only so long that nothing can pull him over the edges of the earth. At the same time, however, he is also a free and secure citizen of heaven, for he is also attached to a similarly calculated heavenly chain. Thus, if he wants to get down to earth, he is choked by the heavenly collar and chain; if he wants to get to heaven, he is choked by the earthly one. And in spite of this he has all the possibilities, and feels that it is so; indeed, he even refuses to attribute the whole thing to a mistake in the original chaining." - Kafka, <em>The Blue Octavo Notebooks p. 32</em><br><br>Yes, Kafka is crazy. But so awesome...


title: Sixteenth Wednesday Songs
date: 2007-09-05 12:38:23.000000
format: html
content:
  Radiohead - Polyethylene (Pts. 1 + 2)<br>Radiohead - Subterranean Homesick Alien<br>Radiohead - The Tourist<br>Muse - Hyper Music<br>Red Hot Chili Peppers - She's Only 18


title: Sixth Friday Linux Lesson
date: 2007-06-23 02:36:00.000000
format: html
content:
  So, picking up from last week we need to know how to look up more detailed information about various commands and how to change permissions on things.<br><br>Today's concept is self-help. I won't be recommending books like <em>The Power Of Now</em> or trying to sell you anything. I will explain the linux man command and why self-help is the most important aspect of linux or even general computer usage in my opinion. Self-help means knowing how to go to google and search for a problem to look for a solution. Self-help means being able to think about the computer as something that does whatever you tell it to, including breaking.<br><br>The command of the day is the "man" command. Man stands for manual and when you type "man <em>command</em>" where <em>command</em> is another linux command (e.g. "man sudo") you pull up the "manpages" for that respective command. So, if we look at last week's problem: We typed ls -l to get permissions information on the output of a directory but couldn't decipher what all of the output meant. If we type "man ls" we learn that -l is a long list option but it doesn't tell us much about what that really <em>means</em>. It does note at the bottom that a command "info ls" will generate more information. At this point, you type ":q" to exit the manpage and then run "info ls" at the command prompt. In this case, the info page is identical to the manpage but now you're done. Besides, you didn't care much what all the obscure things meant anyway. And that's how easy self-help is. Note that not all problems really <em>need</em> to be solved. The next logical step with this though would have been what? Google, of course. And next week we'll dive into some general terminal tricks and the "|" operator. Get ready to have fun.


title: Sixth Monday Update
date: 2007-06-18 17:39:00.000000
format: html
content:
  Summer: Week 5: Finished<br><strike>Take Cody to the Vet for Annual Checkup<br>Gym.<br>Bank.<br>TVS<br>Started Next Book: Ended up being The Future of Ideas. Haven't gotten that far due to unexpected things.<br>Sonya?<br></strike>Unexpected: Heart Wrenching Breakup, Plans to buy Domain, Build Server, Install Wordpress, and Otherwise Go Completely Crazy.<br><br>Summer: Week 6: Schedule<br>Monday<br>Potentially Buy Skateboard at Ruin.<br>Gym<br>Reading<br>Run at the park at 5?<br>Tuesday<br>TVS<br>Justin and Bria or other people.<br>Invent something to be excited about here. Server work?<br>Wednesday<br>TVS<br>Gym<br>More server work and\or people. Early sleep.<br>Thursday<br>TVS<br>Reading<br>Sonya's Birthday? (Powerless? Pretty certainly.) *tear emo tear*<br>Something to distract me. Almost definitely people.<br>Friday<br>Gym at 2:30? Something like that.<br>Chill (Keep trying to get around to installing something from source. People. Stuff.)<br>Reading<br><br>News for 6/18/07:<br>There have been <a href="http://lists.freedesktop.org/archives/xorg/2007-June/date.html">murmurings on the X.org Mailing List (ML) about ATI</a> re-evaluating their Linux support model. By July, we'll know where they stand.<br>Neil J. <a href="http://avant-window-navigator.googlecode.com/svn/trunk/ChangeLog">Patel appears to be hacking away at Avant Window Navigator</a> because there was a new svn release this week.<br><a href="http://songbirdnest.com/blog">Songbird has started pushing out nightlies</a> again for the first time in a long time. Hopefully, 0.3 isn't too far off.<br><a href="http://www.winehq.org">WINE released a new version</a> with some Direct3D fixes, as always. Keep it up guys.<br>The CompComm mailing lists are crazy. Something has to happen soon. <a href="http://www.ubaight.com/pipermail/compcomm/2007-June/date.html#start">Seriously</a>.<br>There were also some new <a href="http://www.technologyreview.com/read_article.aspx?id=18910">breakthroughs in photovoltaics</a>.<br>There is a group developing <a href="http://www.technologyreview.com/read_article.aspx?id=18893">software to design nanotube circuits</a>.<br>There is a startup helping <a href="http://www.technologyreview.com/read_article.aspx?id=18909">consumers build their own mobile networks</a>(as in cell phones).<br><br>That's it for this week. Pray for me and I'll catch you guys later.


title: Sixth Thursday Literary Lines
date: 2007-06-22 06:20:00.000000
format: html
content:
  Today was awesome but as much as I love Borges I'm going to post some tasty Milosz tonight. More Borges next week...I promise. Or at least a different poet. :-D<br><br>Gift<br>A day so happy.<br>Fog lifted early, I worked in the garden.<br>Hummingbirds were stopping over honeysuckle flowers.<br>There was no thing on earth I wanted to possess.<br>I knew no one worth my envying him.<br>Whatever evil I had suffered, I forgot.<br>To think that once I was the same man did not embarrass me.<br>In my body I felt no pain.<br>When straightening up, I saw the blue sea and sails.


title: Sixth Tuesday Quotables
date: 2007-06-19 14:18:00.000000
format: html
content:
  "A time is marked not so much by ideas that are argued about as by ideas that are taken for granted. The character of an era hangs upon what needs no defense. Power runs with ideas that only the crazy would draw into doubt. The "taken for granted" is the test of sanity; "what everyone knows" is the line between us and them. This means that sometimes a society gets stuck. Sometimes these unquestioned ideas interfere, as the cost of questioning becomes too great. In these times, the hardest task for social or political activists is to find a way to get people to wonder again about what we all believe is true. The challenge is to sow doubt." - Lawrence Lessig<br><br>"The argument [of this book] is that always and everywhere, free resources have been crucial to innovation and creativity; that without them, creativity is crippled. Thus, and especially in the digital age, the central question becomes not whether the government or the market should control a resource, but whether a resource should be controlled at all. Just because control is possible, it doesn't follow that it is justified. Instead, in a free society, the burden of justification should fall on him who would defend systems of control." - Lawrence Lessig


title: Sixth Wednesday Songs of Summer
date: 2007-06-20 16:42:00.000000
format: html
content:
  Marvin Gaye - What's Going On<br>White Stripes - Rag and Bone<br>Silversun Pickups - Lazy Eye<br>Incubus - Nice to Know You<br>The Verve - Bittersweet Symphony


title: Skate 2
date: 2008-08-13 12:36:30.000000
format: html
content:
  So, I'm still into skateboarding these days. I don't mention that too much and I don't go skating as much as I'd like but it's true. I originally got into skateboarding because a dear friend twisted my arm to get me to play the original Tony Hawk's Pro Skater video game on the Playstation 1. God...I feel old now. Did I mention I just turned 22 last Wednesday? It didn't hit until I had to fly to Chicago for business the next day though. I was like, "It's August 7th, 2008? OMG WTF!!". Really.<br><br>Anyway, Tony Hawk's Pro Skater was awesome. I think what really captured my imagination was flip tricks. Frankly, I didn't know you could do any tricks at all with skateboards except maybe wheelies (manuals in the common parlance). Wheelies were one thing but the fact that people could jump in the air flip the board over under their feet and land and keep going just surprised me. Neversoft (the developer's of the Tony Hawk's series of games) produced a few more good titles and then had a sharp turn downhill. They were fun games but I worried another good skateboarding game wouldn't get made. Then EA (of all developers) came along last year and released skate. It was beautiful. In so much as you can get a skateboarding game right, they got it right. There's room for nitpicking but the nits are utterly trivial.<br><br>And EA is a big conglomerate. You don't expect them to do something that's true to skateboarding and it's culture. You expect cash-in, thanks for your money type work but skate was quality and I was converted. Skate 2 was recently announced and is, by all appearances, going to be fantastic but there's no official word on a release date. It flits from November 08 to March 09 so quickly I could punch a baby in frustration. Maybe not.<br><br>Anyway, they're naturally adding more professional skateboarders and companies to the lineup in the game but you can't add everybody. To that effect, a friend and I decided to figure that problem out. The solution, of course, is to cap the game at 50 riders. A representative sample of the world's top skateboarders, right? Well, that's what I figure. To keep the sample somewhat broad, choose 16 of the major board companies and restrict yourself to selecting 3 skateboarders from any given company (that makes 48) with room for two exception companies from which you'll pick 4 riders (50).<br><br>I selected all professionals (to my knowledge) and by only choosing pros on board companies I've effectively ruled that if you don't have a pro board you're not pro (sorry, Javier Sarmiento. you know I love you). This could be adjusted to allow for rippers who lack a board sponsor like Javier (inexplicable!) or to allow ams. Obviously, the roster will reflect my friend and I's biases circa 2008. To be fair, I've been bad at keeping up with skateboard news over the last two years (Dude! Boulala's in jail? The Firm shut down? Damn!) but I saw somewhere north of 70% of team videos (shop and indie vids are out) and magazine videos from 2002-2006. Alright, 16 companies, 50 riders. Go!<br><br>Alien Workshop: Dill, Kirchart, Saari<br>Almost: Haslam, Lutzka, Mullen<br>Baker: Kennedy, Reynolds, Romero<br>Blind: Brown, Creager, Laitala<br>Cliche: Brezinski, Nuske, Puig<br>Chocolate: Anderson, Calloway, Johnson<br>Darkstar: Gagnon, Machnau, Thomas<br>Element: Barbee, Stanton, Tim Tim<br>Enjoi: Barletta, Foster, Hsu<br>Flip: Appleyard, Burnquist, Glifberg, Rowley ; calling a 4<br>Girl: Anderson, Carroll, Koston, McCrank ; calling another 4sie<br>Habitat: Baxter-Neal, Getz, Janoski<br>Plan B: Duffy, Gallant, Way<br>Santa Cruz: Carolino, De Gros, Marfaing<br>Toy Machine: Bucchieri, Harmony, Marks<br>Zero: Cole, Rattray, Thomas


title: Sketchpad
date: 2007-09-12 18:34:12.000000
format: html
content:
  I was watching an <a href="http://channel9.msdn.com/Showpost.aspx?postid=326762">interesting video</a> this morning and had some thoughts I jotted down before class. I am reproducing them in their full, unsubstantiated, and provocative/controversial nature here. Later perhaps they will contribute to something a bit more formal. Note: The video features Simon Peyton-Jones talking about programming language evolution somewhat generally. I'd much rather him speak more about that stuff than the Haskell/STM talks he gave at OSCON. Hmm.<br><br>I promise I'll post something less disjointed and more intelligible/coherent/formal than this in the near future.<br><br>Notes:<br>Referencing Upcoming Radical Visions Essay, Trend A: Moving Away From X86<br>Facet 1) Hardware.<br><br>I'm sick of people poo-pooing the "concurrency crisis". To be fair, concurrency is the straw breaking the camel's back. To maintain sustainable growth in the computer industry we're having to do, as always, radical things on the hardware side. Not as always, however, is the fact that they're forcing lots of change in software/CS at the same time.<br><br>Is Erlang brilliant? Maybe. Is Erlang fortuitous? Certainly. It is probably the best option for the concurrency problem at hand. I'm not convinced that Scala or F# compare. Or Haskell for that matter. Haskell is a different sort of win.<br><br>We need concurrency more than controlled effects through a type system at present. The need for Haskell is still further out. Still less urgent.<br><br>^That's it. We're having two different conversations trying to discuss what the more urgent issue is. It's not Erlang vs. Haskell. It's concurrency vs. limited effects.<br><br>But what of (insert professor/coder name here)? What of those that are uninformed? Hell, what about (insert coder name here). What will they do when their code is sitting around not scaling to available resources?<br><br>Tertiary snippets:<br>Syntax is not semantics. Can we mistake it for such? Of course, but what does that look like? What is it to mistake syntax for semantics?<br><br>"That boy, does he already suspect that beauty is always elsewhere and always delusive?" - Czeslaw Milosz, New and Collected Poems, p. 284


title: Smorgasborg
date: 2007-08-02 17:29:46.000000
format: html
content:
  So, today has been unspeakably awesome. Things have been fun here at work, I've listened to good music, and I've read some wonderful things. Did I mention I have a kick ass new IBM Thinkpad running Linux? More on that later. First, here are some notes on the other stuff:<br><br>Songs of Summer<br>The Good, The Bad, and The Queen - History Song<br>Brightblack Morning Light - A River Could Be Loved<br>Zero 7 - This Fine Social Scene<br>Maximilian Hecker - Full of Voices<br>Mylo - Drop the Pressure<br>Broken Social Scene - Looks Just Like The Sun<br>Incubus - Favorite Things<br>My Brightest Diamond - Lucky (Radiohead Cover)<br>Foo Fighters - Generator<br>Broken Social Scene - Alive in 85<br><br>Literary Lines<br>More Neruda today. This one's called Poetry. It's gorgeous:<br>And it was at that age...poetry arrived<br>in search of me. I don't know, I don't know where<br>it came from, from winter or a river.<br>I don't know how or when,<br>no, they were not voices, they were not<br>words, not silence,<br>but from a street it called me,<br>from the branches of night,<br>abrubtly from the others,<br>among raging fires<br>or returning alone,<br>there it was, without a face,<br>and it touched me.<br><br>I didn't know what to say, my mouth<br>had no way<br>with names,<br>my eyes were blind.<br>Something knocked in my soul,<br>fever or forgotten wings,<br>and I made my own way,<br>deciphering<br>that fire,<br>and I wrote the first, faint line,<br>faint, without substance, pure<br>nonsense,<br>pure wisdom<br>of someone who knows nothing;<br>and suddenly I saw<br>the heavens<br>unfastened<br>and open,<br>planets,<br>palpitating plantations,<br>the darkness perforated,<br>riddled<br>with arrows, fire, and flowers,<br>the overpowering night, the universe.<br><br>And I, tiny being,<br>drunk with the great starry<br>void,<br>likeness, image of<br>mystery,<br>felt myself a pure part<br>of the abyss.<br>I wheeled with the stars.<br>My heart broke loose with the wind.<br><br>Social Brain Dump<br>http://news.com.com/8301-10784_3-9738924-7.html<br>http://radar.oreilly.com/archives/2007/07/why_congress_ne.html<br>http://www.ohloh.net/projects/3783/analyses/latest<br><br>http://www.eweek.com/article2/0,1759,2161500,00.asp<br>it's awesome to see suspicions confirmed in reality like this.<br><br>https://answers.launchpad.net/awn/+question/10849<br>AWN has moved to launchpad. Significant?<br><br>http://www.redmonk.com/jgovernor/2007/07/27/why-open-source-software-is-social-media/<br>T3H GR347357 343R!<br><br>http://geekz.co.uk/lovesraymond/archive/taking-freedom-further<br>tee hee<br><br>http://patricklogan.blogspot.com/2007/08/not-to-mention.html<br>this is really interesting. i know this guy is smart but i don't understand this enough. halp intarwebs!<br><br>http://feeds.feedburner.com/~r/oreilly/radar/atom/~3/139662644/your_web_browse.html<br>astounding. i need to play closer attention to o'reilly radar.<br><br>http://opendotdotdot.blogspot.com/2007/08/rock-on-amarok.html<br>this is really awesome\interesting in it's own right. self-explanatory, too!<br><br>That probably should've been like 4 separate posts but whatever. I love you guys. You love me too, right?


title: So Close and Yet So Far
date: 2013-03-16 12:22:00.000000
format: md
content:
  <img src="http://redlinernotes.com/images/famiclom_progress3.png"
       alt="Famiclom Progress" align="right" />


  <br/>
  > "Low-level programming is good for the programmer's soul." - John Carmack, [via ahefner](http://ahefner.livejournal.com/20528.html)

  > ["What I like about Lisp is that you can feel the bits between your toes."](http://compgroups.net/comp.lang.lisp/feeling-the-bits-between-your-toes/696643) - Drew McDermott, [via Michael Weber](http://www.foldr.org/~michaelw/log/programming/lisp/icfp-contest-2006-vm)
  <br/>

  <br/>
  ## Previously...
  I never did enough systems programming. In college, I actually convinced my Operating Systems professor to let me do the course project in lisp. So when I decided I wanted to get closer to the metal a year ago, I thought I'd look into Nintendo emulation with Common Lisp rather than systems hacking with C. Besides, my needs for a web server or other daemons were filled. So I embarked on that weird journey and came out with a shiny, readable, reasonably fast 6502 CPU emulator in under 800 lines of code. It even has an assembler and disassembler!

  ## Announcing Famiclom version least-positive-fixnum
  But a CPU emulator isn't much fun. No graphics, no sound, no I/O! After a break from September through January I got back to work in earnest a month ago. It started with getting Klaus Dorfmann's [exhaustive correctness tests](http://forum.6502.org/viewtopic.php?f=2&t=2241&sid=1e71a8a5f865ab8e503d081be7743dd4) for the CPU [added to my testsuite](https://github.com/redline6561/cl-6502/commit/aa90f1ee4c638e3cf2e70ad8535ae0bcba9461c5) and a lot of bugfixing. Then I used pcwalton's [lovely Rust code](https://github.com/pcwalton/sprocketnes) as inspiration and started getting the [memory mappers](http://wiki.nesdev.com/w/index.php/Mapper) and PPU (graphics) working with lispbuilder-sdl. So far we only support NROM mapped games though MMC1 should be coming soon(tm). As you can see at the top of the post, there are still some rendering bugs to work out. All testing so far has been done on CCL and SBCL on Linux.

  ## Current Status
  The good news is that the CPU, PPU, and [.nes file reading](http://github.com/redline6561/romreader) are all done in ~1570 lines of Lisp code! The CPU in particular I think makes for quite nice reading at this point. The [main NES code](http://github.com/redline6561/famiclom) still needs work. The bad news is that while the CPU runs at 2-3x the speed of the NES the graphics are about 15-20x **slower** so I'm going to have to spend some time optimizing. I'm in #lisp on freenode regularly and would love advice or patches from any low-level SBCL or lispbuilder-sdl hackers. :)

  ## Where to next?
  1. Preliminary input handling is written, hook it into the main event loop.
  2. Finish MMC1 loader. Get Mega Man 2 title screen loading at least.
  3. Fix rendering bugs and try to play a few games.
  4. Optimize and/or add audio support!


title: Social Web One-Liners
date: 2007-05-05 07:50:00.000000
format: html
content:
  Okay, so I had this realization at about 7am this morning and I don't have much more to add to it. It was pretty obvious once I realized it but I think I'll state it here for the hell of it.<br><br>I wrote some time back about Lessig and how the net has different levels of data collecting. I was characterizing web sites that collected information about you as bad and wondering about getting rankings for that sort of that thing so you could know what sites you were really anonymous on in some sense. Essentially though the web originally collected no data about who was on it and this anonymity was seen as good. As the web has taken on increasing functionality it has increased the data collected about users and the idea of anonymity of users has been subsumed by that of virtual identity. It allows the web to be more productive. I'll probably clean all that up later but the crux of it is the more we've moved forward in time the more data has been collected and the more the notion of online privacy (at least to the extent of anonymity) has become marginalized. Thusly, the social web has flipped the notion of online anonymity on it's head. In some sense, instead of being about not collecting information about you it's about collecting and <em>disseminating</em> certain information about you.<br><br>So, the one-liner: "The social web's (web 2.0/web NOW/uggh) idea seems to be to collect and <em>publicize</em> data about you as a service to you where the traffic or ads you generate through using the service sponsor/monetize it!"


title: Software in the Real World
date: 2008-01-10 19:28:55.000000
format: html
content:
  I'm a bit perturbed at the moment and I'm having a hard time figuring out why but it seems to happen to me after reading Spolsky articles and their associated reddit comments. That was the last time I remember having this same sense, at any rate. The sense that I might call "Computer Science scares the shit out of me". Either that or "the real world scares the shit out of me".<br><br>But on to the Spolsky article. I read Spolsky's article "<a href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html">The Perils of Java Schools</a>" and <a href="http://reddit.com/info/22199/comments/">the comments</a> from when it was posted on reddit. The article is about what it sounds like it is. Joel thinks that schools have dumbed down their CS programs by teaching Java instead of a functional language like LISP or Scheme or a low level language like C. The commenters then get into arguments about Joel being stupid, what the ONE TRUE WAY to teach Computer Science and/or programming is, the reason one set of skills or another is valuable in industry, the difference in industry's goals and academia's, and anything else they see fit to mention.<br><br>The argument in comments on these articles is often in fact a mere miscommunication. One side advocates that a good (or great) programmer is found by a seeking out those that are technically adept with things like tail-call recursion and functional programming or low-level bit-hackery and such. The other side advocates finding those that have good design principles and an understanding of architecture/best practices.<br><br>The missed point seems to be that the first side (to my thinking) presumes that their conditions ipso facto create the candidate argued for by the second side. That is, the first side thinks if someone understands tail-call recursive functions and pointers than they must have some sense of design to go with their knowledge of abstractions and that this, consequently, makes them good engineers. The second side is missing this fact and arguing that design skill is more important than technical ability. Both are large components though. I do not think Spolsky would advocate hiring programmers who had technical ability but little design skill or design skill and best practices but little technical ability.<br><br>After reading these articles however I have to step back and remember that we're talking about Computer Science or Programming both of which ultimately have in mind the creation of software or in Sussman's words a description of a process. That description (software) is supposed to automate work, to create value. And THAT is the scary part.<br><br>Computer Science scares me a little because I wonder if I have the necessary chops (and desire) to become a good programmer. It's also scary because it will take me a while to even figure out the answer to that question, probably longer than I'd like. Real life on the other hand scares me a lot more for an entirely different reason that I'll explain by way of confession.<br><br>I confess that I have an intense urge to read reddit and I find it very hard to resist. It borders on compulsion. The reason is this: I think I'm lazy. In fact, it's even more than that. I think I'm not going to make it out there. You know, in the real world. There are a few reasons for this. One, it's painted as scary and brutal by a lot of people. Two, and this is the bit about me being lazy, I think the real world is bullshit. Or at least mostly bullshit. It's people trying to find ways to stay busy so they can make money so they can eat and do things they actually care about. This next bit is important so I want to state it carefully:<br><br>It's not that I don't think that there aren't people out there getting things done that actually need doing. It's that I think that <a href="http://www.bubblegeneration.com/2008/01/bgsl-2008-2010-rethinking-economic.cfm">90% of human labor is about maintaining the status quo</a>, that maintaining the status quo is a huge waste of time if not for the fact you'd starve otherwise, and that the little last bit that actually creates new value and advances the state of things seems like accident or luck as often as the product of hard work. Moreover, there's no guarantee no matter who you are that you won't just get bad luck and get screwed. THAT is what's scary.<br><br>It's scary because I don't want to hate my job and just try to do what's necessary to make it. It's scary because I'd like to be in that little 10% and there is no guaranteed way to get there. And it's scary because the very fact of it is implicitly anti-hope or anti-progress. "90% of the world is about maintaining the world. Good luck."<br><br>I read reddit not because I want to avoid my other duties but because I wildly want to believe that somewhere on there I will find the guidance I need to not be a 90% human being. I want to be good at something, produce value, not fear starvation or unemployment, and love my craft. So far, I believe programming to be my best bet. Hopefully, this year off from college will bear that out one way or another.


title: Software’s Top 10
date: 2007-06-09 18:55:00.000000
format: html
content:
  This is a list of ten types of software in particular that I'm fired up about in no particular order. Software is kind of tough. I'm probably more interested in trends than software (and it feels kind of horrible typing that). Maybe a better way of saying that is if this were a top 10 list of things happening in computing I'd find it much easier to populate though of course I'd be drawing on a larger set of source material as well. That said, most of these will be open source because of my own biases but a few other things will poke out as well.<br><br>1. User Interface overhauls<br>I've always been interested in this kind of work. Think about it. Here you have an established paradigm of a file browser, desktop, icons, etc. It's been fundamentally unaltered since it emerged from Xerox PARC in the 70s. It is definitely not the most intuitive possible way to use a computer. It just isn't. It's the establishment so everyone finds it easy due to familiarity but they don't realize it. The very idea that it could be different is sort of invisible. There are two fundamentally different approaches to this problem. People who are extending the limits of the traditional UI through making it 3D or composited. That's mainly <a href="http://compiz.org/">compiz</a> and <a href="http://www.opencompositing.org/">compcomm</a>. Then there are people who are just rethinking the whole interface on a much deeper level, making it a representation of real world objects or trying to eliminate the distinction between local data and web data. I'm speaking of <a href="http://www.youtube.com/v/M0ODskdEPnQ">bumptop</a>, <a href="http://www.youtube.com/watch?v=B595KCi_Fgc&amp;mode=related&amp;search=">lowfat</a>, <a href="http://www.perceptivepixel.com/">Jeff Han's work</a> as being representative of real world environments and <a href="http://www.symphonyos.com">SymphonyOS</a>'s <a href="http://en.wikipedia.org/wiki/Mezzo_(desktop_environment)">Mezzo Desktop</a> as being representative of eliminating the Web\Local distinction.<br><br>2. File System overhauls<br>This is another thing that is pretty immediately apparent as an entrenched paradigm waiting to be rethought. A lot of work in this sense is underway with projects like <a href="http://www.gnome.org/projects/tracker/">tracker</a>, <a href="http://beagle-project.org/Main_Page">beagle</a>, and <a href="http://en.wikipedia.org/wiki/Spotlight_(software)">spotlight</a> working on "desktop search" (such a terrible name), and projects like the <a href="http://live.gnome.org/GnomeVfsPlans">Gnome-VFS<br>rewrite</a> trying to make filesystems user-centric. Then you've got people that are working on new filesystems altogether which is also crucial. <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a> seems like a stand out to me (maybe this is because Apple is using it to power Time Machine) but you never know how things like <a href="http://infohost.nmt.edu/~val/chunkfs/">ChunkFS</a>, <a href="http://en.wikipedia.org/wiki/Reiser4">Reiser4</a>, <a href="http://en.wikipedia.org/wiki/Ext4">Ext4</a>, and others might turn out.<br><br>3. Generative\Procedural Content-driven Apps<br>Here I'm thinking primarily of <a href="http://en.wikipedia.org/wiki/Demoscene">demoscene</a>, <a href="http://en.wikipedia.org/wiki/.kkrieger">.kkrieger</a>, and <a href="http://en.wikipedia.org/wiki/Spore_%28video_game%29">Spore</a>. I don't think <a href="http://en.wikipedia.org/wiki/Procedural_generation">procedurally generated content</a> is ready to storm the industry necessarily but it does seem so ripe for experimentation in many software markets that you wonder why the demoscene guys are still just hacking away on virtual laser shows. It's pretty powerful stuff if you can just think of a good way to apply it.<br><br>4. Driver Improvements<br>This is basically both open source specific and more or less specific to the graphics and wireless subsets of drivers. I think it's important that Linux (or any OS for that matter) have an excellent underlying system for graphics. Part of that is drivers and part of that is the server and the OpenGL implementation. Drivers for most hardware 3D accelerators (from ATI and Nvidia) are A) proprietary, not open source and B) not that great anyway. So, it seems imperative that we get Graphics vendors to open source their drivers or just make open source drivers ourselves. As an ATI R300-based product owner I'm pretty interested in <a href="http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-ati.git;a=summary">that driver</a>. Advancements in the server and OpenGL implementation are crucial too though, so I'm excited by work on <a href="http://wiki.x.org/wiki/XDC2007Notes">X.org</a> and <a href="http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=summary">mesa</a> and if the work on all those projects stays on track with the roadmap it should be competitive with if not superior to anything Mac or Windows has to offer by Christmas.<br><br>5. Impressive Virtualization<br>This is one of those technologies that isn't a panacea to very deep-seated problems but certainly is a painkiller and just sort of inherently useful. The main contenders are <a href="http://www.vmware.com/">VMware</a>, <a href="http://en.wikipedia.org/wiki/QEMU">Qemu</a>, and <a href="http://en.wikipedia.org/wiki/VirtualBox">Virtualbox </a>in the PC space with only <a href="http://en.wikipedia.org/wiki/VMware_Fusion">VMware Fusion</a> looking really ground breaking at this point. Fusion is only for Mac but expect the next version of Workstation to absolutely rock. <a href="http://www.pcsx2.net">PCSX2</a> on the other hand shows that even Console virtualization (yes, most call it emulation) is all too possible even with complex next generation platforms.<br><br>6. Impressive Emulation<br><a href="http://www.winehq.com">Wine</a> and <a href="http://www.reactos.org">ReactOS</a> are exciting projects to keep an eye on. Wine seeks to create an open source implementation of the Windows API so that users can run Windows binaries on Linux with full compatibility. ReactOS seeks to actually create an Open Source Operating System that is fully binary and device driver compatible with Windows. It is hard to say who has taken on the bolder task but it is apparent that Wine has a larger developer base and that can make progress appear more rapid. Both show promise for eventually getting high enough API compatibility that Windows becomes unnecessary in all but the most extreme cases.<br><br>7. Good Frameworks\Libraries\whatever_you_want_to_call_them<br>When I say good frameworks I'm talking about things like <a href="http://telepathy.freedesktop.org/wiki/">Telepathy</a>, <a href="http://gstreamer.freedesktop.org/">Gstreamer</a>, <a href="http://www.clutter-project.org/">Clutter</a>, <a href="https://core.fluendo.com/pigment/trac/">Pigment</a>, <a href="http://www.gtk.org/">GTK+</a>, <a href="http://trolltech.com/products/qt">QT</a>, <a href="http://www.freedesktop.org/wiki/Software/hal">Hal</a> and <a href="http://www.freedesktop.org/wiki/Software/dbus">D-Bus</a>. Telepathy is a framework for both presence information (Is this person online?Do they have their phone? How can you best contact them?) and IM and Chat networks and it can be used to create any number of clients, such as Empathy. Gstreamer is a media framework and can allow for tongs of applications to draw on it for media playback, recording, etc. D-Bus and Hal both offer numerous possibilities of their own at a slightly lower system level, GTK and QT are windowing toolkits and clutter and pigment are both rich user interface toolkits that take advantage of OpenGL but the overall win with all of these technologies is that a central library exists to reduce duplication of code. The more time developers spend not recreating the wheel , the better.<br><br>7. Web Integration<br>Clearly more and more of our data and applications are moving online. Hypothetically, the operating system that helps us most transparently leverage the increasingly hybrid nature of our online/offline workflows will have a leg up on the competition in working with these trends instead of against them. Two projects which are particularly promising on this front are <a href="http://developer.mugshot.org/wiki/Big_Board">Big Board</a> and <a href="http://beatniksoftware.com/gimmie/Main_Page">Gimmie</a>. Telepathy is to some extent valid here too. Big Board seeks to integrate online services into the desktop as a connected panel through the online <a href="http://mugshot.org">mugshot</a> service. Gimmie is similarly a panel which seeks to integrate online functionality chiefly through utilizing the telepathy libraries to provide presence information about your contacts.<br><br>8. Content Creation Apps<br>This is an area where Linux has been considered by many to be lagging behind due to the major proprietary software in the field (Final Cut Pro, Adobe Products especially Photoshop, Some CAD software, Audio production software, etc.) being unavailable though 3D rendering and modeling seems to be an exception. Open Source alternatives are emerging however to Digital Audio Production in software like <a href="http://www.jokosher.org/">Jokosher</a> and <a href="http://ardour.org/">Ardour</a> and of course software like <a href="http://gimp.org/">GIMP</a> and <a href="http://gimpshopdotnet.blogspot.com/">GIMPshop</a> continues to compete with photoshop. <a href="http://inkscape.org/">Inkscape</a> is available for vector graphics, <a href="http://www.blender.org/">Blender</a> for 3D work, <a href="http://www.openoffice.org/">OpenOffice</a> and <a href="http://www.scribus.net/">Scribus</a> as replacement Office Suite and Publishing Software. <a href="http://kinodv.org/">Kino</a>, <a href="http://www.jahshaka.org/">Jahshaka</a>, <a href="http://www.pitivi.org/wiki/Main_Page">Pitivi</a>, and <a href="http://heroinewarrior.com/cinelerra.php3">Cinelerra</a> exist now for video editing.<br><br>9. Consumer Media Apps<br>A lack of high-quality media playback and management apps has been a conspicuous lacking on Linux in the past. Now, we are seeing applications like <a href="http://f-spot.org/">F-Spot</a> emerge for Photo Management, <a href="http://www.songbirdnest.com">Songbird</a> as a replacement Music Library, Store, and Player, and programs like <a href="http://elisa.fluendo.com/">Elisa</a>, <a href="http://www.mythtv.org/">MythTV</a>, and njpatel's <a href="http://njpatel.blogspot.com/2007/03/im-not-even-supposed-to-be-here-today.html">forthcoming Arena</a> emerge as replacements for HTPC applications like Apple's Front Row. Finally, ripping and burning applications like <a href="http://en.wikipedia.org/wiki/GnomeBaker">GnomeBaker</a>, <a href="http://thoggen.net/">Thoggen</a>, and <a href="http://burtonini.com/blog/computers/sound-juicer">Sound Juicer</a> have also emerged to fill remaining gaps.<br><br>10. Web Apps<br>These are outright online applications or services that show promise for making good use of our data and uniquely taking advantage of peer production or the "social web". This includes applications like <a href="http://labs.live.com/photosynth/">photosynth</a>, <a href="http://www.last.fm">lastfm</a>, <a href="http://en.wikipedia.org/wiki/Twitter">twitter</a>, <a href="http://flickr.com">flickr</a>, <a href="http://www.google.com">google apps</a>, and <a href="http://www.zoho.com/">Zoho apps</a>.


title: Some Thing
date: 2007-06-11 22:13:00.000000
format: html
content:
  Fireflies flicker in skies like morning dew on leaves,<br>And drift about the evening air like mist upon the breeze,<br>I don't remember time or place where I've been more at ease,<br>The world usually seems clearer the closer man is to his knees.<br>I find it hard to try to tell what path did lead me here,<br>Though always seek companion who might like to lend their ear,<br>And through dark fears in younger years persevered to present day,<br>But perhaps should have left more warnings for others along the way.<br><br>If foreign lands with beckoning sands have grounded in my mind,<br>Then perhaps discoveries lie in wait more forward than behind,<br>But putting the past aside is difficult for what might be derived<br>is a succulent fruit, of knowledge to boot, waiting to be tried.<br>Temptation though to puzzle out what meanings there may lay<br>is better left for when I rise upon an older and wiser day.<br>And until then my unseen friend I raise my glass and say,<br>Godspeed to all of us. Into the tunnel. Light the way.


title: Spontaneous Monday Linkpost
date: 2008-03-03 17:52:17.000000
format: html
content:
  <a href="http://www.flickr.com/photos/runa-sankarshan/2301461767/sizes/o/">Bookshelf Jealousy</a><br><br>I need to <a href="http://farm4.static.flickr.com/3144/2299108310_25fe307f58_d.jpg">try</a> <a href="http://www.flickr.com/photos/ogmaciel/2255962057/">OpenBox</a> and build a trim install from the ground up <a href="http://www.redlinernotes.com/blog/?p=283">again</a>. Maybe with Gentoo this time? Or should I stick to Arch of Foresight?<br><br>I continue to hear <a href="http://feeds.feedburner.com/~r/pmarca/~3/244777356/an-hour-and-a-h.html">good things about Barack Obama</a>. Staggering amounts of good things. It's not that Marc Andreesen is saying this. It's that everyone who's had contact with the guy is saying this. Also, <a href="http://www.nytimes.com/2008/03/01/opinion/01rosen.html?_r=1&ex=1362200400&en=d3c8a88b587068f5&ei=5088&partner=rssnyt&emc=rss&oref=slogin">he's big on civil liberties</a>. Maybe from lecturing on Constitutional Law at University of Chicago. Hopefully that means he'll handle <a href="http://www.eff.org/deeplinks/2008/02/anonymous-gop-operatives-surprised-fearmongering-isnt-working">these fiascos</a> a little better than the current administration. It wouldn't be too hard.<br><br>I really want to hear a good comparison of <a href="http://bazaar-vcs.org/">bzr</a> and <a href="http://git.or.cz/">git</a> and I'm <a href="http://reddit.com/r/programming/info/62z0v/comments/">not convinced I've heard one yet</a>. It seems to be very "<a href="http://www.ivy.fr/blog/index.php/2008/02/25/82-git-linus-is-a-designer">Linus made Git!</a>" vs "<a href="http://blogs.gnome.org/newren/2008/03/01/happenings-in-the-vcs-world/">Yeah but mere mortals can use Bzr!</a>". Please guys can we elevate the sophistication in this debate?<br><br>Luis Villa comes up with some great ideas and <a href="http://tieguy.org/blog/2008/02/25/gnome-background-questions/">this is one of them</a>. Also, I may finally have to try greasemonkey because <a href="http://tieguy.org/blog/2008/02/28/reason-for-more-flickr-pictures/">adding pictures to my posts</a> continually sounds like a better and better idea. Well, at least some of my posts. While we're on Luis though, I take RSS feed reading seriously but I don't get <a href="http://tieguy.org/blog/2008/02/09/in-market-for-new-feed-reader/">near 800 feeds a day</a>. I'd be interested in hearing what he settles on.<br><br>I'm wondering if I should start <a href="http://johnc4510.wordpress.com/?p=33">contributing to Ubuntu's Weekly Newsletter</a>. It'd be a chance to do some volunteer work for a community I do care about and I have been thinking that down the road I might like to do some freelance writing so it wouldn't be a bad way to get a feel. What can I say? <a href="http://bushidobrown.livejournal.com/193189.html">Ben</a> <a href="http://www.redlinernotes.com/blog/?p=257#comments">inspired me</a>.<br><br>I'm glad people are thinking about the future. This <a href="http://feeds.feedburner.com/~r/worldchanging_fulltext/~3/234559180/007838.html">article from worldchanging</a> appears particularly promising. Anyone have any formal responses to this? I'm going to work on mine along with an update of the Secondhand Standards essay.<br><br>Also, I'm not personally a Nine Inch Nails fan but it is pretty cool that they've <a href="http://lessig.org/blog/2008/03/nin_goes_cc.html">released their latest album as CC'd work</a> and I kind of hope Radiohead does that with their next album...<br><br>Personally, I share <a href="http://redmonk.com/sogrady/">sogrady's</a> <a href="http://redmonk.com/sogrady/2008/02/25/have-i-finally-found-what-im-looking-for/">taste in laptops</a> and while I'm not in the market right now I am wildly optimistic about <a href="http://www.mahalo.com/Lenovo_X300">grabbing one of these</a> in a year or so off craigslist or something.<br><br>I'm trying to really get into <a href="http://en.wikiquote.org/wiki/Emacs">emacs</a>. I want to settle on an editor and really learn it. Since I'm learning <a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)">Scheme</a> for the next year or so Emacs seems like an insanely reasonable place to start. Making it <a href="http://peadrop.com/blog/2007/09/17/pretty-emacs-reloaded/">pretty seems like a good idea</a> though.<br><br>Finally, this guy is totally awesome and I hope I can come up with <a href="http://wingolog.org/archives/2008/02/29/im-telling-you">a project as cool as this</a> after my self-education.


title: Spontaneous Monday Poem
date: 2008-03-10 14:47:36.000000
format: html
content:
  I thought we all might share this.<br><br>It's titled <em>I would like to describe</em> by Zbigniew Herbert.<br><br>I would like to describe the simplest emotion<br>joy or sadness<br>but not as others do<br>reaching for shafts of rain or sun<br><br>I would like to describe a light<br>which is being born in me<br>but I know it does not resemble<br>any star<br>for it is not so bright<br>not so pure<br>and is uncertain<br><br>I would like to describe courage<br>without dragging behind me a dusty lion<br>and also anxiety<br>without shaking a glass full of water<br><br>to put it another way<br>I would give all metaphors<br>in return for one word<br>drawn out of my breast like a rib<br>for one word<br>contained within the boundaries<br>of my skin<br><br>but apparently this is not possible<br><br>and just to say - I love<br>I run around like mad<br>picking up handfuls of birds<br>and my tenderness<br>which after all is not made of water<br>asks the water for a face<br>and anger<br>different from fire<br>borrows from it<br>a loquacious tongue<br><br>so is blurred<br>so is blurred<br>in me<br>what white-haired gentlemen<br>separated once and for all<br>and said<br>this is the subject<br>and this is the object<br><br>we fall asleep<br>with one hand under our head<br>and with the other in a mound of planets<br><br>our feet abandon us<br>and taste the earth<br>with their tiny roots<br>which next morning<br>we tear out painfully.


title: Spontaneous Posting
date: 2007-11-24 07:31:25.000000
format: html
content:
  Okay.<br><br>Random blog post thingie. I didn't really expect to post anything but frequent, random and disjointed is a lot easier than occasional and structured/intelligent. So here goes.<br><br>First of all, many of you may know/love <a href="http://www.xkcd.com/">XKCD</a>. I mentioned to some of you but for some reason didn't think to post  that I found this <a href="http://www.acm.uiuc.edu/conference/2007/videos">great little talk</a> that the author of XKCD, Randall Munroe, gave at a programming conference. It's actually totally worth watching for at least the first 10 to 20 minutes just to hear some of his funny stories about FAA Regulations on Kite Flying and other such craziness. After that he talks for another hour about other stuff and there's comedy interspersed but it's not quite as constant.<br><br>There were some reassuring thoughts after having watched the first hour or so of that. One significant one being that Randall Munroe doesn't think he's a very good programmer because he can settle for "good enough" style hacks. The other being that here's this guy who's clearly pretty intelligent but maybe not interested in "the real world" and managed to go off and be interesting and do his own thing that he's interested in. He created a successful job that I couldn't have imagined and that certainly if it had been mentioned in table conversation as a future aspiration would've been laughed at. But look at him now. It makes me feel like you really can come up with some crazy thing and maybe actually live off it. Then again he might just be extraordinarily entertaining.<br><br>Two other thoughts:<br>What if hiring companies (you know, outsourced HR) did hiring like mutual fund and brokerage groups do investment? What if employees were low, medium, and high risk and selected by experts in a given sector of business? Certainly would change things a bit wouldn't it? And if people are really the biggest investments a company makes why isn't this done? (I'm thinking of this in terms of software and in response to a lot of things I've read lately including the latest <a href="http://weblog.raganwald.com/2007/11/what-if-powerful-languages-and-idioms.html">raganwald post</a> and some resumes. It's an interesting thought though isn't it?)<br><br>Finally, I read a <a href="http://jjinux.blogspot.com/2007/03/ernos-erlang-networked-operating-system.html">really cool blog entry</a> by a pretty smart and experienced guy (intimidating resume, don't know that mine could ever look like that) about an Erlang-based OS running on Minix 3. It's really a what-if kind of thing but very interesting none the less and compelling if one considers the fact that we are moving away from the present single processor, non-parallel, side effect laden nature of software.


title: Spontaneous Thursday Song Post
date: 2008-04-17 19:05:04.000000
format: html
content:
  I'm in Chicago on business today but I'm in a short lull so I thought I'd post a Radiohead song I've really been enjoying today. This song is fantastic and it has what seem like references to the Odyssey in it but I'm not sure what I'd say the song is actually about. Your thoughts?<br><br><div align="center"><style type="text/css"> @import url(http://skreemr.com/styles/embed.css);</style><table cellpadding="0" cellspacing="0"><tr> <td WIDTH="16" CLASS="sk-topleft"><img style="padding:0;border:0;" SRC="http://skreemr.com/images/corner-topleft.gif"/></td> <td CLASS="sk-toprow">Radiohead - There There (The Boney King Of Nowhere)</td> <td WIDTH="16" CLASS="sk-topright"><img style="padding:0;border:0;" SRC="http://skreemr.com/images/corner-topright.gif"/></td></tr><tr VALIGN="MIDDLE"> <td WIDTH="16" CLASS="sk-lightleft3"/> <td CLASS="sk-lightback3"> <embed class="SkreemRPlayer" wmode="transparent" style="height:24px;width:290px;" src="http://skreemr.com/audio/player.swf" quality="high" bgcolor="#ffffff" width="290" height="24" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="playerID=1&bg=0xCDDFF3&leftbg=0x357DCE&lefticon=0xF2F2F2&rightbg=0xF06A51&rightbghover=0xAF2910&righticon=0xF2F2F2&righticonhover=0xFFFFFF&text=0x357DCE&slider=0x357DCE&track=0xFFFFFF&border=0xFFFFFF&loader=0xAF2910&soundFile=http://www.craigandlori.com/tunes/Radiohead/Hail%20To%20The%20Thief/09%20There%20There%20(The%20Boney%20King%20Of%20No.mp3"></embed> <img style="padding:0;border:0;vertical-align:bottom" src="http://skreemr.com/images/skreemr_logo_small_name_only.png"/> </td> <td WIDTH="16" CLASS="sk-lightright3"/></tr><tr><td WIDTH="16"><img style="padding:0;border:0;" SRC="http://skreemr.com/images/corner-bottomleft.gif"></td><td CLASS="sk-bottomrow">Found at <a href="http://skreemr.com/link.jsp?id=6A5C42545055&source=embed">skreemr.com</a></td><td WIDTH="16"><img style="padding:0;border:0;" SRC="http://skreemr.com/images/corner-bottomright.gif"></td></tr></table></div><br><br>Potential ramblings on Obama, the Fed, SICP exercise 2.6 (<a href="http://en.wikipedia.org/wiki/Church_encoding">Church Encoding</a>), and more headed your way soon.


title: Spring 2008 Schedule and Syllabus
date: 2008-01-17 03:17:24.000000
format: html
content:
  <p>So, I've finally gotten everything nailed down. I know what courses I'm taking, what resources I'm using, and what my schedule is.</p><br><p>I've decided to break my studies into 2 semesters each of which is comprised of two courses and lasts 20 weeks. The first semester started this Monday (1/14) and ends Friday (5/30). I then take the month of June off. The second semester will start Monday (7/7) and end (11/21). Having June and December off will both motivate me to push through and also allow room for slight changes in schedule.</p><br><p>I'll study SICP and Discrete Math with Applications by Rosen this semester. I've already started in on the SICP. Obviously I'm a little behind on the math. At the end of each week I'm planning to post a summary of exercises and notes at least for the programming courses. I don't know what I'll do on the Math course. I also haven't quite settled on whose problem sets to do. Ah, well.</p><br><p>Next semester it's HTDP and CTM. I'm a little freaked out looking at all this but if I try I'm bound to learn something. Wish me luck.</p><br><p>And here's the week by week breakdown of the first 4 weeks for each course:</p><br><p>discrete math: resources include lectures, problem sets, and course notes<br /><br>dma - 787 pages / 20 weeks = 39.35(40) pgs/week<br /><br>1 is lecture 11-01-00 and pgs.1-44 (through section 1.3)<br /><br>2 is lecture 11-02-00 and pgs.44-80 (through definition 4)<br /><br>3 is lecture 11-03-00 and pgs.80-119 (through chapter 1)<br /><br>4 is lecture 11-06-00 and pgs.119-161 (through theorem 7)</p><br><p>sicp: resources include lectures, online book, course notes, problem sets, and eli bendersky's site<br /><br>sicp - 610 pages / 20 weeks = 30.5(31) pgs/week<br /><br>1 is lecture 1-a and pgs.1-31 (through section 1.1)<br /><br>2 is lecture 1-b and pgs.31-62 (through section 1.3.1)<br /><br>3 is lecture 2-a and pgs.63-97 (through section 2.1)<br /><br>4 is lecture 2-b and pgs.97-126 (through section 2.2.3)</p><br><p>As far as my schedule goes, the plan is to work from 7am-3pm Monday through Friday, go to the gym after work on MWF, and veg on the weekends where possible. The workweek will be dedicated to my "education" of course, beyond work and exercise.</p>


title: Stalling in India
date: 2012-10-16 18:10:15.000000
format: md
content:
  I've been in India almost 10 days now and I'm still not really ready to say anything about it. I return October 20th. I am enjoying the trip immensely however. I've spent time trying to experience India, shopping and being a sightseeing tourist, reconnecting with old friends, and resolving a longstanding personal question. At some point there will be pictures but for now, since I'm having trouble finding my own words, here are some from my favorite writer:

  > "They are made of amorous dough. As soon as they turn twelve, love has begun to take them somewhere. They see its glowing torch from afar and follow it through the half-light of childhood..." - **Carlo Gozzi**, *Memorie inutile*

  **Elegy for Y.Z.**

  ```
  A year after your death, Y.Z.,
  I flew from Houston to San Francisco
  And remembered our meeting on Third Avenue
  When we took such a liking to each other.
  You told me then that as a child you had never seen a forest,
  Only a brick wall outside a window,
  And I felt sorry for you because
  So much disinheritance is our portion.
  If you were the king's daughter, you didn't know it.
  No fatherland with a castle at the meeting of two rivers,
  No procession in June in the blue smoke of incense.
  You were humble and did not ask questoins.
  You shrugged: who after all am I
  To walk in splendor wearing a myrtle wreath?
  Fleshly, woundable, pitiable, ironic,
  You went with men casually, out of unconcern,
  And smoked as if you were courting cancer.
  I knew your dream: to have a home
  With curtains and a flower to be watered in the morning.
  That dream was to come true, to no avail.
  And our past moment: the mating of birds
  Without intent, reflection, nearly airborne
  Over the splendor of autumn dogwoods and maples;
  Even in our memory it left hardly a trace.
  I am grateful, for I learned something from you,
  Thought I haven't been able to capture it in words:
  On this earth, where there is no palm and no scepter,
  Under a sky that rolls up like a tent,
  Some compassion for us people, some goodness
  And, simply, tenderness, dear Y.Z.
  ```


title: Starting Again
date: 2014-11-30 21:20:00.000000
format: md
content:
  ## A Fresh Start

  I've been struggling a lot this year. I got stuck in a hole and it
  took me a while to find my way out. But I learned a few things along
  the way and I'm very excited about what's coming next.

  I've accepted a job as a Ruby on Rails instructor at [The Iron Yard][tiy].
  I'll be training people to become engineers in a very short timespan.
  For over a year, I've been whispering now and then about an interest
  in teaching, to Norma and friends. Starting January 5th, I'll have
  my first students. I'm equal parts nervous and exhilarated. I can't wait.

  [tiy]: http://theironyard.com/

  ## Learning How to Quit

  A lot of my happiness and self-worth is tied up in making visible
  progress on things I care about. Over the past 10 months I lost faith
  in what I was doing at work and enthusiasm for my personal
  projects. Rather than recognizing that I should find a job I was
  passionate about or spend time on projects that excited me, I dug my
  heels in. No longer.

  At one point, I said a [Nintendo emulator][towards] was my forever
  project. I'd still like to see it taken further but I'm not going to
  work on that now. Belligerently sticking to those guns has been
  limiting my own potential. The only purpose of personal projects is to
  *learn* and to *grow*. They are **mine** and no one else's.

  So until further notice, the emulator is on the backburner. Coleslaw
  will still get maintenance work but probably not much feature
  development. There are new things I'm fired up about and my focus will
  be on deriving as much momentum from them as possible.

  [towards]: http://blog.redlinernotes.com/posts/Towards-Comprehensible-Computing.html

  ## Going Forward

  I'm playing with [Renoise](http://renoise.com/) and trying to pick up
  some music theory. I'm still not really making songs but I'll get
  there.  I'm continuing to [learn melee][melee] and now that I have a
  real training regiment in place I'm seeing much faster improvement.
  Hopefully I'll make it out to local tournaments every now and then.

  I want to become more structured about *practice*. That includes
  starting to chip away at the stacks of CS and programming books I own
  that I haven't gotten around to reading. And experimenting with new
  tools like Ocaml, OpenMirage, and Ansible. And making room for *play*
  where nothing gets done.

  I need to learn how to love and care for myself in spite of how much I
  get done, in spite of visible progress made or unmade. Part of that is
  going to be taking back my online presence, away from the more
  cultivated space of the last few years. There's a lot I want to
  accomplish over the next year or so. I'm sure plenty of what I learn
  won't be according to plan. But it's time to get going. It's time get
  organized. It's time to dig in.

  [melee]: http://blog.redlinernotes.com/posts/Learning-Melee-1-Year-In.html


title: Still alive!
date: 2012-03-01 00:25:47.000000
format: html
content:
  Should start hacking more. Or posting about hacks? Haven't been writing anything terribly interesting lately though. Lots of config updates, work stuff, odds and ends. Little of substance. So in lieu of that, some soul nourishing poetry. Been reading more Milosz lately; Second Space, in particular. There are several really lovely pieces, here's one:<br><br><b>A Stay</b><br>My stay in that city was like a dream<br>And the dream lasted for years.<br><br>I was, in fact, not interested in anything<br>So long as I heard a voice dictating verses.<br><br>And in that way I invented a life,<br>And thus my destiny was being fulfilled.<br><br>Some people believed I was theirs,<br>So they put trust in my disguises.<br><br>I reproach myself for that,<br>For I wanted to be different,<br>Trustworthy, brave, noble-minded.<br><br>Later on I would only say: why reach so high?<br>I am and will be lame,<br>Which is no one's concern.


title: Still Kicking
date: 2008-01-30 19:26:42.000000
format: html
content:
  Okay. So, I didn't get the week 2 recap posted last Friday and I'm not getting it posted today either. Before you folks go judging me and deciding I turned into a lazy bum I thought I should make some note of progress.<br><br>As I've mentioned, SICP isn't going as fast as I hoped but I won't skip a thing. If my schedule goes out the window so be it but this book is getting finished. Of course, hopefully I can conform somewhat to the schedule as well. There will be an update this weekend even if I'm not through section 1.2.<br><br>In the meantime, I thought that I'd post up something I've been working on during my lunch hour. Namely, <a href="http://www.projecteuler.net">Project Euler</a> code.  Project Euler is a website that has about 180 Programming Problems of escalating difficult. I've only devoted one lunch hour to it so far but it's been fun and I'd love to get through a quarter to half the problems this year.<br><br>The challenge for me I think will come from the math side as well as the programming and some of these I just won't be able to solve for a while. Better to challenge myself from both ends, right? The code's hidden behind a cut for those who don't want their eyes scarred by this programming nonsense. Also, I'll be improving these as I discover better programming formalisms. I'm also solving each problem in both C and Scheme. I want to solve each problem from two paradigms (or more) if possible.<!--more--><br><br><a href="http://projecteuler.net/index.php?section=problems&amp;id=1">Problem 1</a> in <a href="http://redlinernotes.com/code/euler/euler001.c">C</a>:<br><pre><br>//Project Euler Problem 1:<br>//Sum the numbers below 1000 divisible by 3 or 5.<br><br>#include <stdio.h><br><br>int main (void)<br>{<br>	int count;<br>	int sum = 0;<br>	for (count = 1; count &lt; 1000; count++){<br>		if ((count % 3 == 0) || (count % 5 == 0))<br>			sum += count;}<br>	printf ("The sum of all multiples of 3 or 5 below 1000 is %d.n", sum);<br>	return (0);<br>}</pre><br><a href="http://projecteuler.net/index.php?section=problems&amp;id=1">Problem 1</a> in <a href="http://redlinernotes.com/code/euler/euler001.scm">Scheme</a>:<br><pre><br>;;Project Euler Problem 1:<br>;;Sum the numbers below 1,000 divisible by 3 or 5.<br><br>(define (euler1 top)<br>  (define (iter count sum)<br>    (define (divides? n)<br>      (or (= (modulo n 3) 0) (= (modulo n 5) 0)))<br>    (cond ((= count top) sum)<br>	  ((divides? count) (iter (+ count 1) (+ sum count)))<br>	  (else (iter (+ count 1) sum))))<br>  (iter 1 0))<br>;Value: euler1<br></pre><br><a href="http://projecteuler.net/index.php?section=problems&amp;id=2">Problem 2</a> in <a href="http://redlinernotes.com/code/euler/euler002.c">C</a>:<br><pre><br>//Project Euler Problem 2:<br>//Sum the even-valued terms in the Fibonacci sequence below 1,000,000.<br><br>#include <stdio.h><br><br>int main (void)<br>{<br>	int a = 1;<br>	int b = 2;<br>	int temp, sum = 0;<br>	while (a &lt;= 1000000){<br>		if (a % 2 == 0){<br>			temp = b;<br>			b += a;<br>			sum += a;<br>			a = temp;}<br>		else{<br>			temp = b;<br>			b += a;<br>			a = temp;}}<br>	printf ("The sum of the even valued Fibonacci terms below 1,000,000 is %d.n", sum);<br>	return (0);<br>}</pre><br><a href="http://projecteuler.net/index.php?section=problems&amp;id=2">Problem 2</a> in <a href="http://redlinernotes.com/code/euler/euler002.scm">Scheme</a>:<br><pre><br>;;Project Euler Problem 2:<br>;;Sum the even-valued terms in the Fibonacci sequence below 1,000,000.<br><br>(define (euler2 top)<br>  (define (iter current sum count)<br>    (define (fib n)<br>      (cond ((< n 3) n)<br>	    (else (+ (fib (- n 1)) (fib (- n 2))))))<br>    (cond ((> current top) sum)<br>	  ((even? current) (iter (fib (+ count 1))<br>				 (+ sum current) (+ count 1)))<br>	  (else (iter (fib (+ count 1)) sum (+ count 1)))))<br>  (iter 0 0 0))<br>;Value: euler2<br></pre><br>That's all for now. Hope I get section 1.2 done by this weekend!


title: Strange Loop Notes - Day 2
date: 2012-09-25 10:17:00.000000
format: md
content:
  ## Computing like the brain
  * Lots of detail on anatomy and physiology. Use that to derive theories and test with software.

  1. Neocortex is a predictive modeling system.
  2. Grok, a predictive modeling product.
  3. Future of AI.

  * Neocortex builds online models from streaming data. Think about it in terms of the senes.
  * Beware, vision is more than one sense. Retina is array of a million sensors. Auditory nerve is 30,000.
  * Brain has several million sensors changing firing in the 10s of milliseconds.
  * The brain invokes model building in response to novel sensory input. It can: make predictions, detect violations of predictions, generate actions.
  * The brain is more of a memory system than a computing system.

  1. Neocortex is a hierarchy of projected systems. retina->cochlea->somatic nerve. But all one memory algorithm.
  2. Primary memory is sequence memory. Playback of stored patterns. Stream processing!
  3. Sparse distributed representations of data.

  * Traditional computing uses dense representation. ASCII is a perfect example. Individual bits have no meaning, programmer assigns meaning.
  * Brain uses sparse representation. Mostly 0 bits, maybe 2% 1s. Sparse IntMap? Bits that represent specific things. Top bit that means X.

  SDR Properties:

  1. Similarity: shared bits = semantic similarity. A similar bit vector has similar semantics.
  2. Store and Compare: Store indices of active bits, don't traverse the whole thing. Subsampling is OK though!
     * Probability shows errors are very unusual even with subsampling. If you do make a mistake, it's a close/semantically similar one.
  3. Union membership: Sets! Is this SDR (10..001) a member of this union of SDRs (00..001)? Very high correctness.

  * The key to machine intelligence is sparse distributed representation.

  Sequence memory:

  * Digression on neuroscience.
      * Typical neuron has thousands of synapses.
      * Neural networks with only a few connections are nothing like real neurons.
      * Cell goes into a predictive state when it detects a coincidence.
      * Each cell is one bit in their SDR implementation.
      * When a cell is activated, it looks for cells that were active just prior to you. Recognition of former state. Pattern/prediction. Deeply probabilistic.
      * Multiple predictions can occur at once. Only single step memory. For larger sequences need Variable Order Sequence Memory.
      * 40 active columns, 10 cells per column: 10^40 ways to represent the same input in different contexts. Deeply distributed.
      * Different representation of sequences at columnar level and cellular. Architecture supports generalization.

  * If pattern does not repeat, forget it. If it does, reinforce it.
  * Synapses are either connected or not. Represented via scalar, if it's above a threshold, it is connected.
  * Typical system: 1 region, 2,000 columns, 30 cells per column, 128 dendrite segments per cell, 40 connections per segment. 300M connections. No SPOF.

  Predictive Analytics Today:

  * The world stores tons of data in databases, builds models and batch processes.
  * Too slow! Soon will be massive stream processing with automated model creation, continuous learning, and temporal and spatial models.
  * Grok is their product. Get a stream of data, run through encoders into SDRs, feed it into Sequence Memory that makes predictions with probabilities.
  * User provides a data stream, what to predict, how often and how far in advance.
  * Energy pricing and demand/response is a common user. Also, server loads, ads, etc. All running on Amazon AWS with a REST API and dev dashboard.
  * Helped a server management group provision instances ahead of time for video transcoding. Predicted server demand enough to reduce cost by 15%.

  Future of Machine Intelligence:

  * Supports alternate paths being pursued now: IBM Watson, Google Cars, etc. ...but strongly believes SDR and brain-derived solutions will eventually dominate.
  * Strong sensory-motor integration. New science coming out constantly. Need more answers/understanding.
  * How do we move this from the cloud to embedded/distributed sensor grids?
  * Lots of effort to make this fast in software. Doing it in hardware would be better! When/how? New memory architecture rather than CPU. VERY fault tolerant.
  * Most of your brain is connections, not processing mass. Chips aren't good at massive interconnects yet.
  * Cool applications will not be the classics (vision, language, speech).
      * Artificial brains? Maybe. Brain has ultimate latency for a result of 5ms. That's pushing it. Make 'em bigger. Faster!
      * Make a physicist brain that works round the clock really fast that never gets tired and never eats.
      * We're not designed to explore the universe. Make an artificial brain that is! Send it out, bring it back, ask it questions.

  ## Behind the Mirror: The birth of Light Table
  * 1974: MIT AI lab was using TECO. Tape Editor and COrrector for the PDP-10.
  * Not an editor like today. A language like for text manipulation.
  * Code samples. God it hurts. Called YAFIYGI "you ask for it you get it" in the first paper.
  * Richard Stallman finds WYSIWYG at the Stanford AI lab. Decides to make TECO WYSIWYG by adding macros. Emacs! Usability += 1000.

  35 years later...

  * Worked at Microsoft, got hired as a PM. PM on Visual Studio. Owned C#+VB in the IDE. Was asked "What is the future of editing?"
  * Well...how do users really work with it? NO end-to-end usability studies on Visual Studio. Only on specific features.
  * Watch a guy hacking from a room with a one-way mirror. Ask the user to think out loud as they do it.
      * One interesting finding: You /will/ touch the mouse. Even if you swear you never do.
  * Richest feedback you'll ever get on a product is a usability study.
  * Expectation: Visual Studio is amazing tech! Actual: Too complicated, too noisy. Shock: No one actually vocalized problem.
  * If it's true that the key attribute of a good programmer is keeping the system in your head, its very sobering. How to teach memory?
  * Everyone just uses: Code navigatoin, Debugger, Editor. Basic workflow has not changed since Emacs.
  * Many innovations but never went mainstream: Smalltalk, Lisp Machines, etc. Time to re-imagine.
  * Tried many things, nothing like Light Table. What changed?
  * Clojure taught [@ibdknox](http://twitter.com/ibdknox) that what makes great programmers is being able to abstract away parts of a system, not hold it all in their head at once.
      * Make black-box abstractions and traverse them. Don't keep it all in your head.
      * Perfect! How do we make an editor for that?
  * We're always dealing with abstraction. We are *not* recipe writers. We consume and subsequently create abstractions. We are synthesizing machines!
  * Need to ask questions about them. Poke at them. You don't understand code until you *run* it. Writing it is not enough.
  * Realization: Interactivity/REPLs were a big enabler at getting people into computing. Closer connection to what you're doing. YAFIYGI->WYSIWYG is similar.
  * What is an IDE for Abstractioners? Light Table. Initially a 6 day hack. Half a million people saw it in 2 days.
  * Raised 300k+ on kickstarter. Acknowledgement that we are in the dark ages of software dev. We're disconnected from our software!

  * Brief live demo...
  * Add a custom widget for git interaction.
      * Pull in lighttable stuff by creating namespace. Add an atom for git-state.
      * Add an update function. Ask the server to run ```git status``` and update the git-state with it.
      * Write an init function that runs update, and returns a div with a list of modified files.
      * Add a hook ```(on files.save [] (update))```. We're live!
  * Add a custom widget for HTML5 game dev.
      * Add a canvas widget in widget init.
      * Add buttons to start and stop the game loop. ```defui``` is a Light Table construct to make a DOM element and bind events to it.
      * Add some CSS to make it pretty.
  * Add a custom widget for live view of entities in the game. Player/enemies,
      * Add atom to track entities and accessors.
      * Add hooks to update entities in IDE when game functions are called.
      * Add CSS to improve visibility.

  * HA! We've been in a custom presentation mode.

  ## Runaway Complexity in Big Data
  Missed due to chatting with Chris Granger and other awesome folks.

  ## Computer Architecture from the 1960's
  * Burroughs B5000. Sassy ads. ALGOL syntax chart was first CACM centerfold. COBOL 61 chart was 4 times the size for half the capability.
  * "MULTIPLY PAY-RATE TIMES HOURS-WORKED GIVING TOTAL-PAY." - Burroughs ad where this is the only language needed to program it.
  * B5500 had dynamically sized arrays in hardware! Call by name! "They believed in lambda calculus when they created ALGOL."
  * Thunk came from CACM in 1961. :D
  * Pitched Haskell. Interesting and unexpected. "Trying to learn haskell so I can regain the purity I had back in 1969."

  ## Guess Lazily: Making a Program Guess and Guess Well
  * Guessing is a way to both set up and solve computationally hard problems.
  * Naive guessing doesn't get us far. How do we guess well? One simple principle.
  * Fail Early, Fail often. Be lazy. Constraint propagation!

  Okay, I couldn't keep up and had you been there you wouldn't blame me.

  But this was cool and analagous to the Byrd/Friedman running programs backwards and forward stuff from yestereday.

  Also, Buyer Beware: Oleg's papers may be more clear than his presentation style. :P

  ## An Audobon Society for Partial Failures
  * In an age of shamanism when it comes to operating computers.
  * Talking about pressure as it relates to large scale distributed systems. Cliff's company, Boundary, does high-volume streaming.
  * One day they noticed IOPS starting to disappear. Kafka message queue, writes to disk. If IOPS start dropping...
  * Pressure rising on interior nodes, data kept coming in, not going out. Death spiral! Chained failures.
  * Like riding out a storm, just trying to keep systems up until traffic dies down.

  * Erlang memory explosion:
      * Process is over capacity and can't keep up. Queues grow unboundedly.
      * GC and heap relocation takes more and more time, allowing more messages to pile up.
      * Until the VM tries to allocate 16GB of memory or so... and the OS is all "GTFO"!

  * There is no explicit flow control. But we need it! (We already have it.)
  * Think you know TCP? You don't! It has flow control. Designed for exactly this problem.
      * But our software doesn't take advantage of it!
  * Only documentation of queue explosion problem + flow control in Erlang. ... Ulf Wiger mailing list post.
  * Create an end-to-end linkage of back pressure so edge nodes can know when there's a problem and react.
  * In Erlang:
      * Active sockets produce Erlang messages internally.
      * ```{active, true}``` is an unfettered firehouse.
      * ```{active, once}``` provides explicit control over when delivery occurs. Overload then backs up to TCP receive queue. Slows down sender!

  * In Netty/JVM:
      * ```MemoryAwareThreadPoolExecutor```
      * Expresses back pressures by causing producer to sleep when execution pools are above a threshold.

  * Is this familiar? "SEDA: An Architecture for Highly Concurrent Server Applications"
  * What does this buy you? Back pressure gives you time to recover. Like System Dynamics, about getting a grip on non-linear behavior.

  * Distributed Erlang Considered Harmful!
      * Erlang protocol has an embedded heartbeat.
      * Heavily loaded connections *will* timeout the heratbeat - dropping a good connection.
      * Systems that move heavy throughput shouldn't use distributed Erlang protocol. *AHEM*, riak.
  * An aside: SCTP is a little better for this.

  ## Expressing Abstraction, Abstracting Expression
  * Grew up making JRuby ready for production work, PLT-wise.
  * Started with Ruby as a more practical lisp but got into JRuby because job demanded Java.
  * Started working on Ioke (pronounced I-oh-kee). A vehicle for exploring expressiveness, informal as it is.
  * Why are new languages still being created? Is it worth choosing languages strategically/Does language actually matter?
  * Ex-pres'sive-ness: "Effectively conveying thought or feeling."
  * A construct is expressive if it enables you to Write/Use an API that can't be written/used without it.
  * Of course, Turing completeness means any language can do it. But you might write an interpreter to emulate it!
  * "Beware of the Turing tarpit where everything is possible but nothing of interest is easy."
  * The Blub Paradox is oft mentioned. Raymond advises learning many different languages.

  Aspects of Expressiveness:

  * Regularity - whoops. missed this a bit.
  * Readability - A strange concept. Readable to who? Readable for what problems?
  * Learnability - whoops. missed this too.
  * Essence vs Ceremony - Anything not expressing the essence of your problem is ceremony. The weight of changes between brain and code.
  * Precision vs Conciseness - You will abstract *away* from the machine chasing conciseness. Reducers give up control of execution order.

  Expressiveness over performance, every time! (in Ioke)

  * Language is super slow. Duh.
      * "I think I made a mistake." If you can't run useful programs quickly, there's no point expressing them.
  * Theoretical Expressiveness by Matthias Felleisen *The Expresisve power of Programming Languages.*
      * An expressive feature is something you can't do without reorganizing the rest of the program.
      * The negative consequence of expressiveness is patterns. Not expressive enough on *some* dimension.
      * Argues design patterns *reduce* understanding and readability rather than *enhancing* it.
      * Let is macro-expressive as it can be transformed into lambda.
  * Seems there is folklore thinking that goes against these definitions. Still seems ad-hoc. Somewhat disappointing.
  * Spent most time thinking about practical expressiveness vs theoretical expressiveness.

  Types of Abstraction:

  * Abstracting objects. Ioke was prototype-based.
  * Abstracting class of objects.
  * Abstracting functionality. (Beware crossover, most Scheme programmers write their own object system. JS too.)
      * Classic "Object is a poor man's Closure/Closure is a poor man's Object" debate.
  * Abstracting structure (of data).
  * Abstracting structure (of code).
  * Abstracting relationship. Erlang vs Mozart-Oz. Actors or Dataflow variables! Constraint propagation/logic programming?
  * Abstracting paradigm. D, Racket, Common Lisp.
  * Elaboration. You need to be able to *change* an abstraction. CLOS MOP?

  Macros!

  * Language is much more impoverished by not having macros.

  Different kinds:

  1. C-style Preprocessor macros. No structure. Just string processing! AAAAAGHHHH.
  2. AST macros. Work on S-Expression, not AST.
     * Same language available as transformation language and host language. Metalanguage, etc.
     * Often use functions in a complex macro.
  3. Template macros. Type-directed expansion, turing complete.
     * This is scary because they are TWO different languages.
     * Similar situation to complex Type Systems in Haskell/Scala.

  Modularity!

  * Should be able to change components separately without changing multiple pieces. The Expression Problem!
  * Will be first thing looked at in language design/Ioke next time around.

  Static typing!

  * Way of abstracting that reduces the expressiveness of your language.
  * Makes illogical behavior illegal. Also restrict you from some valid/correct programs they can't typecheck.
  * Very powerful. Can make it impossible to compile a program with an invalid account number, for example.

  Generics!

  * Working with generic code over an unrestricted set of containers.
  * Haskell and Scala are only two mainstream languages with Type Classes. Not *really* a static language feature.
      * Ad-hoc polymorphism/dispatch mechanism. Ultimately a dynamic feature.
      * Type Classes enable *other* abstractions. Most monads use Type Classes and are more powerful consequentially. Synergistic abstractions.

  * Most abstractions are leaky. See ORMs. Occasionally can't get underneath it to use raw SQL.
  * "All non-trivial abstractions, to some degree, are leaky." - Joel Spolsky
      * Okay. Why?
      * Abstractions are leaky because they are not absolute.
      * They hide complexity in a single direction/dimension.
      * They expect a certain kind of use. ... What if you use the library from the side?
  * "Abstractions may be formed by reducing the information content of a concept, to retain information only relevant for a specific purpose." - What purpose?
  * Effective communication requires common experience/understanding. Referents in linguistics.

  Lin-guis-tics:

  * Some interesting features of natural languages...
      * Simile - A way to compare two things. (like, as) is to (subclassing, type classes)?
      * Metaphor - Doesn't seem to be a good PL analog.
      * Analogy - also missing somewhat.
      * Redundancy/repetition - Think about speechwriting. Java has this but we don't seem to like it.
  * Arguments/precision determined by caller rather than callee in Natural Langs.
  * Syntax, Semantics, Pragmatics. Linguistic pragmatics is the idea of how context contributes to meaning.
  * If you were talking to the King of Sweden, you'll speak differently to him. Not *wrong* but a faux pas.

  Communicating indirectly with many audiences though. The machine, team members, ops, etc. Even business stakeholders! Totally unique to programming.

  Syn-tax:

  * From a PLT perspective, doesn't matter. In day to day pragmatics, it *does* matter. Everyone knows this.
  * Can go too far in either direction, Salt or Saccharine.
  * Operator overloading. Probably not one right answer.
    1. Don't support it.
    2. Support overloading built-ins.
    3. Don't *have* operators. Everything is a function.
    4. Arbitrary operators to be defined or redefined. (haskell/ml)
  * Should built-ins look different than user defined stuff? (editors note: Hell no, let the editor show you/syntax highlighting).
  * Optimizing:
      * For writing. A bit undefined. Optimizing for the shortest part of code's life. Perl? What about communication?
      * For reading. Reading by a novice or an expert? Again, *who* is your audience?
      * For visual distinctiveness of different semantics

  * Expressiveness is not always better. Many dimensions to optimize along. Language design is a balancing act. Find the right clustering of features for a given point in the design space.
  * Expressiveness and abstractions are relative.

  ## Visible Programming
  * Designing a Programming Environment Around How Human Beings Do Things
  * What makes one programming environment better than another? Programmer productivity! ... huh? What's that?
  * Is the problem with programming we don't go fast enough? Huh. Nobody told me.
  * We're creating programs and we can't see what they're doing at runtime. If you can't see something, you can't understand it.
  * A programming environment should let us see and understand what the program is doing. A more directed goal than productivity.
  * And maybe productivity will fall out if we're lucky. ;)

  5 Principles to aim for:

  1. Must enable the programmer to read the vocabulary (program).
  2. Must enable the programmer to follow the flow (Call-flow-graph).
  3. Must enable the programmer to see the state (as it executes).
  4. Must enable the programmer to create by reacting (iterative, interactive development).
  5. Must enable the programmer to create by abstracting (what sort of tools?).

  Examples of these principles in a hypothetical environment: (JS & Processing for this talk)

  1. Normally we go to the docs or source. This sounds like using 4 sliders to choose arguments to something in Photoshop. UI garbage.
      * Mouseovers/tool-tips on each token in the code. Make meaning transparent!
  2. Great explanations show, not tell. Make it possible to see the output of a given form as inputs change. Explain in context!
      * Imagine a cooking show that introduces ingredients and then cuts to the result. You can do it yourself!
      * Step *through* execution via a slider. This helps but it is not enough. We can't see patterns in execution.
      * Plot it on a timeline. Which lines executed when? what patterns or alternate executions could there be?
  3. It is common to expect programmers to manipulate code in their heads. WHY?
      * It is the responsiblity of the environment to show what changes a line causes in the running program.
      * Show what lines executed, when, and what effect they produced.
      * Larger programs just become a data visualization problem.
      * Show the data, show the comparisons, eliminate hidden state.
      * Making global variable change visible is an option for inherently stateful lines.
      * More programs running forward and back. (editors note: you guys are jerks and you hurt my heart)
  4. Composing things in your head doesn't scale. Maybe this is why only small programs are beautiful! Use the environment as an external imagination.
      * Live coding is one way to approach this. Bit of a straw man argument here.
      * Core idea is you want to have program supply you ideas, not just keep you from hitting recompile.
      * Take completion further, what if autocompletion lists also included suggested values?
      * Useful but clearly limited to the domain of this specific problem: Processing/GUIs and visualization.
      * Dump all the parts on the floor so you see your raw materials. Functions are lego blocks. Have API browsing. Offers another problem-specific example.
  5. Encourage starting with constants, than adding variables and functions later once you know what behavior you want.
      * Editor can help by offering "factoring relations".
      * I know this wasn't intended to resemble a working production system but I was hoping for more than this.
      * I thoroughly agree with his premises but I do not think this was a convincing way to demonstrate their need.

  * How does this scale to real-world programming? I have answers but I think it's better to question the question.
  * Asking how to scale to everyday programming is like asking how *engines* benefit *horses*. We have to work like this.
  * Argues against static runtimes. I agree but this was a weak treatment. There is tooling to work around this.
  * "There is no future in destroy-the-world programming. It's got to go." - Agreed.

  ## The State of Javascript
  * Ten *days* in May 1995: Shipped Mocha.
  * September 1995: Livescript
  * December 1995: Javascript.
  * "Hey maybe we should fix equality?" "Nope, too late."

  * JS: Wat. We've all seen it.
      * JS is based on C but wanted to use braces for dictionaries like python. Based on Java so objects convert to string. So int->string->0 in {} + [].
      * This is awesome. Going through how JS processes every WAT in JS. Much respect to Eich for this.
      * NaN is a number but that's the IEEE's fault.
      * "W3C is gonna fail, web won't be XML, let's make HTML5!" - in a pub one time
      * Get the band back together, heal the rifts, hug it out. ES6!

  * ES6 Goals:
      * Make it better for applications.
      * Make it better for libraries.
      * Make it better for code generation.

  * Adding *very* minimal classes.
  * Adding *MODULES*!!!! Fuck. Thank God. FINALLY. Not first-class but better than nothing.
  * Symbols (formerly names or private names). They're self-named objects that you can't forge from strings. Hygiene!
  * If you're using symbols, there ought to be a nice way to deference/get at them. How about @symbol?
  * Utilities for symbols, many interesting applications.
  * Default parameters. arguments is a hideous hack. We will kill the arguments object but Brendan will pay to see that movie. :)
  * &rest parameters. Guess what, MO LISPY! Prototyped in Spidermonkey right now.
  * ... is spread, inverse of rest. I.e. the **kwargs\kwargs split. Splicing?
  * for-of, iterators and generators. Have to use of instead of in. Can finally iterate over values instead of keys.
  * Callback hell. What can we do? More problems than aesthetics, could capture too many outer variables.
  * Promises/futures still not here...but we will have coroutines from generators and use combinators to make things suck much less!
  * Array comprehensions. Lazy generator comprehensions too! When did they get feature-itis?
  * Sets too! Proxies for metaprogramming API. Think they got feature-itis when they thought about this audience. ;)
  * Can emulate NoSuchMethod/DoesNotUnderstand with proxies. Couldn't agree on standardization. Could add a default one to Object.Prototype.

  Apparently all that was library and application improvements. What about code generators?

  * altjs.org is taken seriously by ECMAscript standards body.
  * A portable bytecode feature may emerge one day. Probably not. UNTIL THEN...
  * The number one source of malware 0-days lately is Java on the client. Class loading still fucked. Gosling threw in the towel, hurt alot.

  So bytecode...

  * JS might actually be better than bytecode and COMPRESS better.
  * Bytecode standardization simply won't happen. Need to be versioned, deters competitive race, don't have the bandwidth in companies.
  * "Versioning is an anti-pattern on the web. You want to fail soft."
  * No call/cc for you! Also, many humans still like writing JS.
  * Proper tail calls have been standardized. Thanks Dave Herman!
  * What do you think of NativeClient?
      * Not portable.
      * Implementation-defined.
      * No view source.
      * Impressive engineering and good competition though. Not in the cards for standardization.
  * Just care about making the web better. Wound up adding Typed Arrays for WebGL. Big potential win for compilers there. See: emscripten.
  * "The reach of the web exceeds any other platform."
  * "To game developers, they're just excited about doing another port."
  * LLJS, low-level javascript is another experiment. C-like lang to typed arrays js to... Feel free to play with it.
  * ES4 collapsed when they tried to add something type-like. *NOT* adding types or contracts or whatever. Have typed arrays. Go away.
  * "People write Javascript in a latently well-typed way."
  * There is however a proposal for User-defined structs that are stored in typed arrays. Close enough, right?
  * The last missing JS feature is... MACROS. Not in ES6. Sweetjs.org though. It's on github, it works. It's a sound JS reader and hygienic macros.
  * "Worst thing I did out of Perl envy was to make regular expressions with slashes...means you have to parse (the whole thing) to lex!"
  * "Please help because if we can get this into ES7, we can get put ourselves out of business, and I can do something else."

  * Other cute projects:
      * Cross-compile XNA (jsil)
      * Cross-compile Android (xmlvm)
      * Parallelism so that JS doesn't use your battery up *really* fast. Not adding the hazards of threads to the language, of course.
      * River Trail uses pure functional APIs and going well. Possibly in ES7. PJS has task parallelism similar to Rust.
  * Left with a general optimism on the continued future of Javascript.

  ## Epilogue
  I was going to have to miss the last keynote and two talks as well as all the camaraderie that would occur after. Delta had screwed up my flight and I didn't have a hotel room for the night. Thankfully, some Loopers came to my rescue though Delta still managed to extract $170 from me. Soulless corporations! It was totally worth it. I can't think of a more worthwhile or energizing way to spend 3 days. I'd like to thank everyone I was able to spend time drinking and chatting with especially [Scott Vokes](http://twitter.com/silentbicycle), [Paul Snively](http://twitter.com/psnively), [Andreas Fuchs](http://twitter.com/antifuchs). [Brian Rice](http://twitter.com/briantrice), and [Jose Valim](http://twitter.com/josevalim). Obviously, I never want to go home.


title: Strange Loop Notes - Day 1
date: 2012-09-24 10:46:00.000000
format: md
content:
  ## ELC/Preconference talks
  Though I didn't take notes on these, or today's keynotes, I have seen quite good coverage of ELC and Strange Loop talks [here](http://strange-loop-2012-notes.readthedocs.org).

  ## Potificating Quantification
  * Generative testing with contracts used /in tests/ (to avoid runtime overhead) seems a good compromise.
  * Optional type systems that aren't part of the language are verification systems. Type systems must be part of the language by definition.
  * We are doomed by Godel to inconsistency, never truly safe.
  * My thought: How can we apply Paraconsistent Logics?

  ## Functional Design Patterns
  * Design Patterns: Are they a sign of weakness in your language?
  * Graph of known Monad tutorials. Skyrocketing. :P
  * Monads are a great abstraction to capture/describe patterns, NOT explain them.
  * A System of Patterns - book
      * Architecture Pattern > Design Pattern > Idiom (idioms are least general)

  1. State/Event Pattern
      * Store all the inputs and initial state. Rederive any point in execution.
      * Can be troublesome to track tons of inputs/events.
  2. Consequences Pattern
      * Input can trigger arbitrarily many events to fire/hooks.
      * Returns the events as a sequence (of thunks, presumably).
      * Don't let them recurse or you're turing complete!
  3. Data Building Patterns
      * Accumulator Pattern - Reduce a sequence to a scalar value. Duh.
          * If order matters, have to do it sequentially. Otherwise, divide!
      * Digression:
          * MapReduce about wringing data locality out of slow disk clusters. Already changing with SSDs.
          * Reducers are nice when you have associativty. Easy to parallelize trees of operations.
      * Recursive Expansion Pattern - Macroexpansion, Datmoic transaction, Are we done expanding? If not, keep going.
  4. Flow Control Patterns
      * Pipeline pattern - Code may be longer but it's cleaner. Enforced composition through layering+encapsulation. No branching allowed!
      * Wrapper pattern - Foundation for Ring. One main path with potential branches at each step. Just decorators/:before+:after+:around methods?
      * Token pattern - May need to cancel and operation. Call Begin, returns a destructor, basically. Don't need direct access to resource to destroy it.

  ## A Whole New World
  Possibly the talk I'm most excited for today. DESTROY ALL SOFTWARE!

  3 Confessions

  1. Wrote "An Editor"
      * Modal, Terminal Only, Neither VIM nor IDE
      * Layers! Annotations on source. Diffs. Tracebacks from prod logs. YES!
          * Crash - Have to parse logs+traceback, maybe use different checkout.
      * Interactions - On-demand Class Hierarchy/CFG. Code navigation methods.
          * No static analysis! Language-specific FIFO queues for program traces! Fork+render with graphviz. FUCK YEAHHHHH!
      * Answer questions like: What code does a web request hit? More importantly, what code might have reached this crash point in our traceback?
  2. Wrote "An Terminal"
      * DEC VT100 has determined terminal protocols for 30 YEARS. Powered by an 8080. @1978.
      * Add raster graphics, 24-bit color, momentary keypresses, font styles.
      * Use for more editor layers! Tag lines with profiling info. Bottom 95% grey, others yellow or red. Same thing for Type annotation. Record traces, remember?
      * Do you want it?
  3. Wrote "An Lies". HAS BEEN LYING.
      * All bullshit. C-c f t, flip all the tables.
      * Takes a long time to fake all that shit.
      * "Ship often. Ship lousy stuff, but ship. Ship constantly." -- bullshit
          * I KNOW that all software sucks.
      * Legacy & Paralysis? Legacy == Paralysis!

  They will not merge our kernel patches. How do we move forward?
  Our "Shipping Culture" is poisonous to infrastructure.
  We just *accrete* low level infrastructure. Programmer Archaeologists are we.
  INCREMENTAL DEVELOPMENT WILL NOT WORK FOR THIS.

  ## Type-Driven Functional Design
  * Basic overview of Haskell type syntax. Call to map. We all know this I hope.
  * Currying + Partial Application trivial in ML family. Duh. Syntactic support.
  * UML is garbage. Thinking of the /flow/ of types through your program gives insight.
  * Moved to miniKanren talk.

  ## Clojurescript
  * Growing benefit of compiling to JS. Lots of browser competition, obvio.
  * "Lisp programmers know the value of everything and the cost of nothing."
  * Hope to show that efficiency is important when getting richer semantics.
  * Expression-based and value based semantics, vs statements.
  * Go back to Robin Milner. Compiler figures out boolean inference.
  * Functions aren't primitive in Clojure, unlike Scheme+CL, like T.
  * Construct types that act like a fn, Collections are an instance of IFn.
  * Invocation always emitted as obj.call. Expensive in JS engines though. Again helped by Compilation. Use Google Closure for DCE, aggressive inlining, etc.
      * Whole Program Compilation allows propagation of args and type info.
      * Bit of a dev/prod divide. Dynamic for devs, static compilation for perf to ship.
  * arguments.slice is a big performance hit. Return a closure with a dispatch function for multiple arity defns.
  * Performance competitive with hand-written JS. Based on Bagwell and Okasaki (since compare-and-swap isn't available, I presume).
  * Digression on how persistent data structures don't suck. V8 handles them really well.
      * Within 3x performance hit on Chrome 22. Opera and Safari a bit worse off. Firefox good at operations on data but slow creating it.
      * But it won't be the bottleneck in your application. DOM traversal is vastly slower, for example, and probably dominates.
  * Local type extension with protocols. \o/ Used internally for hashing.
  * What about when you drop to JS? REPL connected to browser. Compiles in namespaces for you! Source maps should help with debugging.
  * And it has macros, of course. Zebra problem demo. PAIP shoutout! 24 billion possible solutions. Runs in JS in 16ms, 1000x than Norvig's from 1993.
  * Caveats:
      * Same broken numeric tower.
      * Debugging much harder than CoffeeScript. Not necessarily readable.
      * Needs Clojure. Not self-hosting. Not something they really want to fix.
      * Multimethods and keywords still slow.
      * Sure, the "runtime" looks big in generated code at first. But Google Closure compiles it down to a nice, small gzipped thing in the end.
  * Clojurescript host compiler in clj is only 4000 lines of code! ClojureScript side is 7500.

  ## Data Structures: The Code that isn't there
  > "A Data Structure is just a stupid programming language." - Bill Gosper

  Perhaps instead...
  > "A data structure is just a tiny virtual machine." - Scott Vokes

  * Fundamentals: Lists, Arrays, Hash Tables, Trees
  * Ruby 1.9.2 [briefly used](http://bit.ly/krkvJP) list instead of a hash-table or set for require. In big-oh this is O(#fail).

  > "The cheapest, fastest, and most reliable components are those that aren't there." - Gordon Bell

  * Good choice of data structure /subtracts/ code.
  * Data structures set the path of least resistance for interacting with your data.
  * You probably won't know the ideal DS up front. Don't paint yourself in a corner.

  * Skiplists
      * Take an ordered, linked list. Add an express lane! Jump by 2. Add another! Jump by 4. More closely resembles a binary tree...
      * But how do we balance it?
      * Doesn't have to be perfect. Real trees aren't balanced! Just balanced enough.
      * Use random probability distribution. Actually winds up balanced enough.
      * Roundabouts, not traffic lights
          * Traffic lights are SPOFs, bottle necks.
          * Roundabout decentralized, delegates to cars, smart at the node. Global order from local decisions.
      * Because only immediate neighbors are effected on insert, lock contention is low.

  * Difference Lists
      * Comes from Prolog. ```?- uses(prolog, Person).``` no.
      * Digression on Unification.
      * Allows appending to immutable list.
      * Closer to future/promises for new list elements than lazy evaluation.

  * Rolling Hashes!
      * Find matching/overlapping sequences in binary data. Rsync does this.
      * Bioinformatics loves this stuff. Genome seqs.
      * Hashing everything vs everything with traditional hashes (md5, sha) too slow.
      * Drop a letter off the front, add another to the back, hash. Add to set/bloom filter or something.
      * Rsync:
          * Break file into fixed width blocks + remainder.
          * Send the hash for each block. If it's different on the server, update!
      * Insert/delete shifts each block though...
      * Use rolling hash for files that are already on remote. Otherwise, blocks.
      * Can also be used for chunking data.
      * A rolling hash: finds deterministic breaks, cheaply matches blocks

  * Something new: A Jumprope
      * Stores large binary strings (or files)
      * Content Addressable Storage (reference by hash for easy distribution)
      * Persistent and immutable so you can cache it anywhere
      * ... so kind of like a git repo but much better for big files
      * Three structural elements:
          1. Leaf - chunk of raw data
          2. Limb - Series of content hashes and their links, stored in an array
          3. Trunk - A limb with a big end node.
      * Then you just back it with a key-value store.
          * Obviously, choice implies things about performance.
      * Somewhat like a skiplist that uses a hash as its probability function.
      * Good for pipelining streaming content thanks to seeking properties.
      * 2kb for limb nodes and 64kb overhead for leaf nodes.
      * Trivial to fetch, stream, mirror.
      * Using it for a distributed FS, scatterbrain!!
          * Similar to Amazon Dynamo.
          * lack of pointers, use Compare and Swap!
          * Emergence from local behavior.
          * Can tune bad performance to arbitrary guarantee. 1%, .1%, etc.
          * Currently backed by C and Lua. Also a quick'n'dirty Erlang implementation.

  * All coming to a [github near you](https://github.com/silentbicycle) soon.

  ## The Database as a Value & Making Javascript Fast
  Elided due to battery life.


title: Strangeloop 2013 Schedule
date: 2013-09-12 09:55:00.000000
format: md
content:
  I can't believe [Strangeloop](http://www.thestrangeloop.com/) is only a week away!

  **Thursday:**

  * Machine Learning for Relevance and Serendipity - Jenny Finkel (keynote)
  * Fast and Dynamic - Maxime Chevalier-Boisvert
  * Graph Computing at Scale - Matthias Broecheler
  * The History of Women in Technology
  * Software for Programming Cells - Colin Gravill
  * Learnfun and Playfun - Tom Murphy VII
  * Linear Logic Programming - Chris Martens
  * Creative Machines - Joseph Wilk
  * Making Software Development Make Sense to Everyone - Jen Myers (keynote)

  **Friday:**

  * The Trouble with Types - Martin Odersky (keynote)
  * Abstract Algebra Meets Analytics - Avi Bryant
  * Programming a 144-computer chip to minimize power - Chuck Moore
  * Web Apps in Clojure and Clojurescript with Pedestal - Brenton Ashworth
  * Getting Pushy - David Pollak || Why Ruby Isn't Slow - Alex Gaynor
  * Thinking DSLs for Massive Visualization - Leo Meyerovich
  * Finding a Way Out - Chris Granger || Servo - Jack Moffitt
  * What is a Strange Loop? - Douglas Hofstadter (keynote)
  * Thrown for a Loop - David Stutz


title: Strangeloop 2014
date: 2014-09-16 10:10:00.000000
format: md
content:
  It's time for the best programming conference of the year, again!

  I fly out to [Strangeloop](http://www.thestrangeloop.com/) later today.
  Here are the talks I'm planning on attending:

  **Wednesday the 17th**:
  [Future of Programming Workshop][fpw]/[Emerging Languages Camp][elc] (all day)

  **Thursdsay the 18th**:

  * 09:00 - Joe Armstrong, [The Mess We're In][tmwi]
  * 10:00 - Stephen Kell, [Liberating the Smalltalk Lurking in Unix][lslu]
  * 10:50 - Christine Flood, [Shenendoah: Open Source Pauseless GC for OpenJDK][ospo]
  * 12:20 - Leo Meyerovich, [The Sociology of Programming Languages][sopl]
  * 13:10 - Paul Snively, [Type Systems: The Good, the Bad, and the Ugly][tgbu]
  * 14:00!! - Core.async Debugging Toolkit, or Production Prolog?
  * 15:10!! - Consistency without Consensus, or Aeron: High Performance Messaging?
  * 16:00 - Stefanie Schirmer, [Dynamic Programming at Ease][dpae]

  **Friday the 19th**:

  * 09:00 - Nada Amin, [Programming Should Eat Itself][psei]
  * 10:00 - Evan Czaplicki, [Controlling Time and Space][ctas]
  * 10:50 - Yodit Stanton, [The Internet of Things in Practice][itip]
  * 13:10 - Ian Davis, [The Challenges and Benefits of an FRP Frontend][cbff]
  * 14:00 - David Renshaw, [Cap'n Proto and Rust: Type Systems for Sharing][cprs]
  * 15:10 - Julia Evans, [You Can Be A Kernel Hacker!][yckh]
  * 16:00 - Aaron Bedra, [Deterministic Memory Management for Managed Runtimes][dmmr]
  * 16:50 - Carin Meier, Sam Aaron - Our Shared Joy of Programming

  !! = Denotes time slots I'm uncertain about. Open to [suggestions][sug]...

  [sug]: https://thestrangeloop.com/schedule
  [fpw]: http://www.future-programming.org/program.html
  [elc]: http://emerginglangs.com/archive/2014.html

  [tmwi]: https://thestrangeloop.com/sessions/the-mess-were-in
  [lslu]: https://thestrangeloop.com/sessions/liberating-the-smalltalk-lurking-in-c-and-unix
  [ospo]: https://thestrangeloop.com/sessions/shenandoah-an-open-source-pauseless-gc-for-openjdk
  [sopl]: https://thestrangeloop.com/sessions/the-sociology-of-programming-languages
  [tgbu]: https://thestrangeloop.com/sessions/type-systems-the-good-bad-and-ugly
  [dpae]: https://thestrangeloop.com/sessions/dynamic-programming-at-ease-with-grammars-algebras-products

  [psei]: https://thestrangeloop.com/sessions/programming-should-eat-itself
  [ctas]: https://thestrangeloop.com/sessions/controlling-time-and-space-understanding-the-many-formulations-of-frp
  [itip]: https://thestrangeloop.com/sessions/the-internet-of-things-in-practice
  [cbff]: https://thestrangeloop.com/sessions/the-challenges-and-benefits-of-a-functional-reactive-frontend
  [cprs]: https://thestrangeloop.com/sessions/capn-proto-and-rust-type-systems-for-sharing
  [yckh]: https://thestrangeloop.com/sessions/you-can-be-a-kernel-hacker
  [dmmr]: https://thestrangeloop.com/sessions/deterministic-memory-management-for-managed-runtimes
  [osjp]: https://thestrangeloop.com/sessions/our-shared-joy-of-programming


title: Strangeloop Thoughts, 2014 Edition
date: 2014-09-24 16:05:00.000000
format: md
content:
  ### Why do Programming?

  After going to Strangeloop for the first time in 2012, I was really
  fired up about programming. I'd only been out of school a year and was
  already a full-remote Clojure developer making a great salary. Even
  better, I had made good progress on my lisp emulation project and
  received some recognition from hackers I respected for it.

  The last two years Strangeloop has been a lot more sobering. I told
  myself things in 2012 about how fast I'd get better and how good I'd
  be. Even though my expectations were unreasonable it's taken a long
  time to not feel bad about my (relative lack of) progress. I've been
  slow to accept the fact that I don't want to fight my way to being the
  best in my field.

  ### Strangeloop, 2014

  I got in Tuesday night, dropped my bags at the hotel, and immediately
  ran off to drinks and phenomenal conversation at the Schlafly Tap
  Room. Many of the best experiences I've had at Strangeloop have been
  at the tap room. Sure there is excellent food, beer, and technical
  conversation, but I've always gotten a sense of personal acceptance at
  gatherings there. Strangeloop is certainly a welcoming crowd.

  Wednesday was a blast as well, as any day with a trip to the STL City
  Museum should be, but more and more I found I cared about personal
  interactions more than the content of the talks I attended.

  By the end of Thursday, I was stressed out. I wasn't even *excited*
  about the talks, which isn't to say they weren't good. I hated the
  idea that I was just an average programmer, that I didn't aspire to
  more than hacking bog-standard Rails apps as a career, that I'd spent
  almost $2000 out of my own pocket to come to a conference that someone
  else might have gotten more out of. I went to bed early that night.

  I kept my mindset in check much better on Friday. I reminded myself to
  be excited about others discoveries and creations, not to demand
  myself learn every tool or technique. The conference wrapped up well
  and I particularly enjoyed some of the Distributed Systems talks, a
  subfield I still have no experience with. Not to say I want to go
  fight distributed heisenbugs soon or design highly reliable
  systems. The talks were quite entertaining and informative is all.

  ### Back Home

  The main takeaways I've had from Strangeloop have nothing to do with
  tech and everything to do with me. Strangeloop has, in many ways,
  been a time for me to reflect these last two years. I'm not sure
  that's a good way to use the conference but it seems to be what I've
  done.

  The first takeaway that comes to mind is that I need to try and
  respect myself for just being a decent Rails developer. I'm not great
  at solving algorithmically tricky problems and my CS background is,
  frankly, pretty damn weak. But no matter what I shouldn't beat up on
  myself for being "just a programmer". I need to put in an honest day's
  work and actually pat myself on the back at the end of it.
   
  The second takeaway is that I need to program for me again. I got
  into programming mostly because I wanted to know more about how
  computers work. The emulator and talks surrounding it, some of my
  favorite work, is really more an investigation than artifact.
  I still want to support coleslaw. It actually has a few satisfied
  users and I'm one of them. But the only real purpose of the emulator
  is to sate my curiosity. Not to become a real thing or be special or
  groundbreaking.

  There is plenty I'm still digesting and plenty I'm still not sure of,
  both technically and in terms of what I want for myself, my career, my
  life. But I'll leave that for another day. Cheers.


title: Stuff! Stuff everywhere!
date: 2007-10-25 02:47:52.000000
format: html
content:
  So, I'm going to pretend this post is less disjointed than it actually is.<br><br>I got a PS3 last week. Surprisingly some of the most fun I'm having is with a game called <a href="http://www.everydayshooter.com/">Everyday Shooter</a>, which is sort of like <a href="http://www.youtube.com/watch?v=at1jig-ezEw">galaga and pacman mixed together on acid</a>. Or maybe as depicted by Hunter S. Thompson.<br><br>Anyway, I've been reading <a href="http://www.gamespot.com/news/6181581.html?part=rss&amp;tag=gs_news&amp;subj=6181581">some</a> <a href="http://blog.newsweek.com/blogs/levelup/archive/2007/07/11/everyday-shooter-wunderkind-jonathan-mak-interview.aspx">interviews</a> with the developer behind the game <a href="http://www.queasygames.com/">Jonathan Mak</a>. (Yes, it's one guy. That takes you back to the early 90s doesn't it? When games could still be developed by one guy and all.) He's really cool and wrote something really cool about <a href="http://www.queasygames.com/old_blog/2005/03/duality-of-open-source-games.html">why games don't work as open source</a>. It's one of the best arguments I've ever heard.<br><br>Also, I had this thought today which is possibly trite and stupid but intrigued me enough to jot down:<br>"There are two kinds of advances in computing. Advances in what is computable and advances in what is worth computing. P=NP is an example of the former, Moore's Law is an example of the latter."<br><br>I've also been thinking about trying to get some of my writing published (my poetry) and reading awesome stuff about Linux, the PS3, Programming, etc and I'll try to write some more about all that soon.<br><br>/*Right now, I need to stop avoiding/not writing this C Program due tomorrow. I got sort of wrapped up talking to my folks about whether or not I could transer/get into GA Tech and whether that would be a better path than being self-taught or taking time off. Your thoughts?*/


title: Stupid Skateboarding
date: 2009-07-30 01:11:51.000000
format: html
content:
  The last week has positively flown by. I'm being much less productive than I hoped to be with my month off but I can tell that I need it. My batteries were pretty drained after the last 7 months. On some level it's disappointing but for now I'm enjoying the vacation.<br><br>I injured my wrist skateboarding Tuesday evening and am recuperating fairly well. Seems like a serious bruise or a mild sprain to me. Hopefully I'll be over it soon. That's contributed somewhat to my coding slowdown.<br><br>Other than that, I've done well on my battle of the berrics predictions for the last week. I did try <a href="http://funtoo.org/">Funtoo</a> in a VM but may replace my <a href="http://wiki.osx86project.org/wiki/index.php/Main_Page">OSx86</a> install with it for fun sometime in the near future. We'll see.<br><br>Oh, and Palm and Apple are <a href="http://www.reddit.com/r/programming/comments/948ee/palm_plays_catandmouse_with_apple_reenables/">still</a> <a href="http://www.engadgetmobile.com/2009/07/24/palm-complains-about-apple-to-usb-governing-body-while-pre-it/">at war</a>. It's just darling.<br><br>More news on all this in just a few days...


title: Suitable Title Not Found
date: 2009-05-18 15:43:58.000000
format: html
content:
  My father, John M Glenn Jr passed away (very peacefully I'm told) at 10:15am.<br>I had just gotten on a train to Arts Center to get on a bus to school.<br>I know I'll have more to say about him later, I'm not sure I'll find much to say about his passing. It's pretty hard to analyze or make sense of. There are really only two places to approach it from, an objective and detached place that can't signify the importance of the event as it's just the course of life or an emotional, irrational place which can't grant it importance enough.


title: Summer Reading Update
date: 2007-07-27 16:57:13.000000
format: html
content:
  Summer Reading List:<br><br>Worldchanging by Alex Steffen<br>The Wealth of Networks by Yochai Benkler<br>Infotopia by Cass Sunstein<br>Code by Lawrence Lessig<br>The C Programming Language by Kernighan and Pike (Amazon lies. I have the first edition!!!)<br>Introduction to Computing Systems by Patt and Patel<br>Sync by Steven Strogatz<br>Collected Fictions by Jorge Luis Borges<br>Godel, Escher, and Bach by Douglas Hofstader (Amazon lies again. First edition! [even though it's not as cool as 1st ed. k&amp;p])<br>Programming the Universe by Seth Lloyd<br>The Future of Ideas by Lawrence Lessig<br>The Singularity is Near by Ray Kurzweil<br>Rebel Code by Glen Moody<br><br>Read:<br>Just for Fun by Linus Torvalds and David Diamond<br>Cradle to Cradle by Braungart and McDonough<br>Hackers and Painters by Paul Graham<br>The Mutt by Rodney Mullen<br>Identity by Milan Kundera<br>Emergence by Steven Johnson<br><br>Stuff Partially Read This Summer:<br>The Future Of Ideas<br>Infotopia<br>Programming the Universe<br>Rebel Code<br>Collected Fictions<br>Introduction to Computing Systems<br><br>Stuff Partially Read Prior To Summer:<br>Sync<br>Code<br>Godel, Escher, and Bach<br>The C Programming Language<br>The Singularity Is Near<br>The Wealth of Networks


title: Sunday Morning
date: 2007-06-17 18:00:00.000000
format: html
content:
  I'm at church right now. I'm not in church but I'm at church writing this from a computer not far from the service area. I've been thinking about some things. Mostly I'm just trying to avoid having to deal with much until lunchtime. I'm trying to keep my mind among occupied. I haven't been to church in a while and it was interesting to listen to Michael speak again. I was reminded of some of the supremely good issues that Christianity forces one to address. Chiefly imperfection and pride and introspection. I was also reminded of the nonsensical approach (perhaps the word I'm looking for is presentation) that is given in the average church. I can actually watch the service from another monitor here in this control room. Anyway, I've been thinking about perspective and how difficult it is to ever be objective outside of your perspective. You can always be as objective as possible within your perspective but managing to actually go far enough out to get beyond your perspective (note: here perspective includes your understanding of the views of others) is really, really difficult. In fact, I'm having a real hard time finding a good way to define perspective. I'll try to come back to this later today. But I'm thinking about G.K. Chesterton's writings and how wonderfully prosaic his thinking was as well as his Christianity. I'm also thinking of Paul Graham and his essays on Education. And I'm remembering some of the issues I had to think about in youth groups or what have you in middle and high school. I think some of the things we had to confront were good even if the presentation or structure wasn't ideal. And it's making me wonder what a Hacker School would look like. What would a Hacker Church or Youth Group look like? What would make church or school more purposive, more elegant? They certainly aren't designed ideally now. I'm wondering how you captivate a generation of people and convince them that grappling with problems is a supremely more rewarding and better thing than having fun. Moreover, that grappling with problems can be fun (not that you shouldn't at times have regular fun too of course but more that it should be the exception rather than the rule). Christianity has a terrible tendency to make one believe that all things can be made Black and White as does much staunchly moralist thinking. Unfortunately, the real world strays much much closer to Mathematics or Literature. There is one concrete meaning or answer generally speaking. At the very least, there are answers that are definitely wrong. But there is a world of grey and interpretation and middle ground and the problem is several orders of magnitude more complex than I feel Church or Christianity prepares you to deal with and this is in part because I think it conditions you to think about things a certain way and to hold distaste for certain thoughts. Chesterton treated Christianity as a filter. He evaluated ideas particularly in terms of what their effect would be on him to some extent. He believed in the teachings of the church but he was also mindful of the fact that he should consider ideas which flew in the face of the church or solutions to problems that seemed unorthodox. However, he also considered many ideas on the basis of what spiritual effect they had on him. He thought of evolution as being a well and good idea in so much as it meant God took more time to make the world but a worthless idea in terms of equating man with the chimpanzee. Not because it necessarily wasn't correct so much as because for him the idea that he was equivalent to a chimpanzee was a degrading fact from which he could draw no implications about how to live or behave. It wasn't instructional. It was defeatist. I'm not saying that we should reject the idea that we're descended from Chimpanzees. We very well may be and provided we're not bothered by that then fine. But one must have ideas for pragmatic and practical reasons. They are meant to drive and further progress which is it's own challenge. A lot of our problem nowadays is that we're firm believers in universal solutions. Buckhead (30327) is the second wealthiest congressional district in the country (behind 90210) and we're sending our kids to cookie cutter programs with cookie cutter lives. And you know what? They will be cookie cutter adults that do not live up (on average) to the success of their parents. This is me predicting dangerously. The problem is that we need people to innovate but the parents aren't thinking that. They're not thinking we need to make sure our kids have the same crazy and ridiculous diversity of experience and adversity we had to be successful. They're thinking lets go to a safe, non-threatening, homogeneous place to raise a family that's as conforming to our idea of the good as possible. And that's largely what Buckhead is. It's kind of disgusting actually. The whole notion is that of group-think and not in the collaborative, open source, everyone can contribute everything kind of way. Buckhead is not a wiki. The problem with this is that kids aren't being taught to think for themselves, they're not being taught to find their own solutions to their own questions. They're not necessarily taught that the question (or to question) is important. And universal solutions don't work. We're slowly learning this. The trick is local solutions to local problems. Domain-specific versus Domain-inspecific. Anyway, I've got to run but more on this later. And everyone pray or wish luck on me between Noon and 2 o'clock.


title: Swanky Developments
date: 2012-09-04 13:22:05.000000
format: md
content:
  Now that the i's have been dotted and the t's crossed I'm pleased to announce I've accepted a new job. Starting September 17th, I'll be a Senior Developer working for Primedia. I'll be helping them migrate from ruby to clojure. I've been meaning to spend more time hacking Clojure as it is. I'm particularly delighted that I'll be in something of a teaching role and able to share my knowledge and experience with lisp with interested hackers.

  CMGdigital has been a phenomenal place to work for the last year and I'll miss everyone there dearly. I wasn't looking for a new job but Primedia found me and this was in many ways the right opportunity at the right time.

  I'm also very excited for the arrival of Leiningen 2.0 and happily running the latest preview. After using quicklisp, I disliked having to setup a mock project to experiment with arbitrary libraries in Clojure. Leiningen 2 uses a library called pomegranate under the covers which allows modifying the REPL classpath. Thus, dependencies can be [easily added to a running REPL](http://sunng.info/blog/2012/03/my-favorite-feature-in-leiningen-2/) and experimented with!

  In other lispy news, the dream of endless swank backends and SLIME on everything has died. [Previously](http://redlinernotes.com/images/slime-on-everything.png), I had coerced SLIME into running Clojure, Scheme, and Common Lisp simultaneously and [knowing which filetypes to associate with which repls](https://github.com/redline6561/dotemacs/commit/78581e7027284605d2aa77ccaf0df1265ccd8db8#L0L65). It took *a lot* of fiddling. I actually had a rant against the proliferation of swank backends for other languages like Chicken Scheme and Clojure happening outside the main SLIME tree. Anyway, between Emacs 24 shipping [package.el](https://github.com/redline6561/dotemacs/blob/master/init/packages.el#L1), [marmalade](http://marmalade-repo.org/), [nrepl.el](https://github.com/kingtim/nrepl.el) for Clojure, and [Geiser](http://geiser.nongnu.org/) for scheme, the situation has resolved itself even if the infinite SLIME dream is dead. And ultimately, that's better for hackers everywhere...so who am I to complain? :)


title: Tab Terminator
date: 2009-05-28 15:01:32.000000
format: html
content:
  So, my browser is getting full again and I feel like clearing out the backlog. Prepare yourselves for a linkpost! Also, I'll try to arrange links by progressive nerdiness or some such.<br><br>NOTE: I've been terrible at keeping up with <a href="http://dongerz.livejournal.com/">other</a> <a href="http://trashed-ideas.net/">people's blogs</a>. If you're a friend of mine and I haven't read/commented in a while, I'm sincerely sorry. I'll be trying to catch up soon. Also, if you haven't heard about the underground sensation tearing up comedy clubs everywhere, <a href="http://www.facebook.com/video/video.php?v=100585721736&ref=nf">his name is Justin Morgan</a> and I'd keep your eyes peeled for him.<br><br>I've been hearing about a few albums that might be good and that I should check out as a consequence. They follow:<br>Doves - Kingdom of Rust<br>White Rabbits - It's Frightening<br>Night Control - Death Control<br>Danger Mouse and SparkleHorse - Dark Night of the Soul<br><br>It's occurred to me recently that I really kind of need a phone and I'm ready to take the fancy smartphone leap. I did a quick survey of the competition yesterday and narrowed my choices down to 4 models, none of which are released yet and one of which isn't even official. Don't ask me about all that. I'm sure we'll discuss this later. Here they are: <a href="http://en.wikipedia.org/wiki/Palm_Pre">Palm Pre</a>, <a href="http://en.wikipedia.org/wiki/Samsung_I7500">Samsung I7500</a>, <a href="http://en.wikipedia.org/wiki/Nokia_N97">Nokia N97</a>, and the <a href="http://www.mobilecrunch.com/2009/05/24/exclusive-everything-there-is-to-know-about-nokias-next-tablet/">Nokia N900</a> (because Rover is a very stupid name for a phone). Hopefully some official word about the N900 will break soon.<br><br>Okay, so there's an awesome site about <a href="http://en.literateprograms.org/LiteratePrograms:Welcome">Literate Programs here</a>. If you're looking for some code to read it's probably not a bad place to start.<br><br>There was recently a great discussion on proggit about <a href="http://www.reddit.com/r/programming/comments/8lfx7/what_emacs_commands_do_you_use_most_and_find_most/">most used emacs commands</a>. That's some handy stuff to keep track of. Between that and the emacs-fu blog I referenced two posts back I'll be learning a good while.<br><br>Considering that it's old news, there's still a fair amount of <a href="http://www.reddit.com/r/programming/comments/8772y/why_mit_switched_from_scheme_to_python/c08fv0a">hollering about MIT</a> <a href="http://lambda-the-ultimate.org/node/3312">switching from Scheme and SICP</a> <a href="http://wadler.blogspot.com/2009/05/6001-rip.html">to Python</a> and <a href="http://www.reddit.com/r/programming/comments/8np9t/sicp_has_its_own_agenda_convincing_the_reader/">continuing debate on the value of SICP</a>. Indeed, it's not the holy bible and grauenwolf is getting a too many downvotes. He makes a number of very good points. I haven't taken time to read through the whole thread (should I?) but psnively seems to have the right idea to me, as usual.<br><br>O'Reilly Radar put up a pretty good article on the things HTML5 will enable and the resulting <a href="http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html">scramble to the finish</a> by a lot of big players.<br><br>There was a good discussion on the Haskell reddit about <a href="http://www.reddit.com/r/haskell/comments/8l5ud/should_ghc_wall_be_the_default/">making -Wall the default for GHC</a>, I chimed in because there didn't seem to be enough discussion to suit my tastes and though I'm an idiot I'd at least learn something. Learn I did and I'm wondering if <a href="http://hackage.haskell.org/trac/ghc/ticket/1968">this bug</a> is one of those referenced in response to my comment. <br><br>Other random Haskell stuff: <a href="http://www.reddit.com/r/haskell/comments/8m1gj/our_branding_sucks_monads_are_okay_after_a_bit/">Recommendations to learn monads after functors, monoids, etc</a> from Conal Elliott, a <a href="http://www.haskell.org/pipermail/haskell-cafe/2008-February/039639.html">curious DSL</a> from Sir Kiselyov, a <a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/adaptive-containers">neat package of adaptive datatypes</a> from Dons, an <a href="http://flygdynamikern.blogspot.com/2009/05/benchmarking-amazon-ec2-with-ghc.html">interesting article on benchmarking EC2 with GHC compile times</a> (which would be more relevant if I was trying to put off buying a computer or looking into working remotely) and some Haskell responding to Factor that <a href="http://www.reddit.com/r/programming/comments/88oln/factor_makes_you_write_better_code/c08kdnn">I wish I could read</a>.<br><br>Three last things: I found this cool programming problems blog that offers small, fun puzzles like <a href="http://projecteuler.net/">Project Euler</a>. It's called <a href="http://programmingpraxis.wordpress.com/">Programming Praxis</a>. There's a really neat paper that's over my head called <a href="http://lambda-the-ultimate.org/node/3319">Types are Calling Conventions</a> which makes a little sense but I wish it made more. And lastly, some thinking on the <a href="http://r6.ca/blog/20090511T013939Z.html">productivity boost of Object Oriented Languages</a> that harkened back to <a href="http://winterkoninkje.livejournal.com/58607.html">some things Wren Thorton wrote</a> and so on. Later!


title: Take 5
date: 2007-06-14 18:35:00.000000
format: html
content:
  I thought I'd take a quick break to make a work post. Things have been crazy lately and work's been hard but it's also been rewarding and I think I'm learning how to manage the stress. I went to the gym for the first time in a few weeks last night and also started reading my next book, <em>The Future of Ideas</em> by Lawrence Lessig. For the record, I adore Lessig. I think he's a bit brilliant and I'm sure he'll end up in my next tuesday quotables. Note: With Lessig, it is not necessary but helps if you have a bent for intellectual property notions\law. Also, I really need to make some mixtapes before I go to the beach (July 14-21). What would you put on a beach trip mixtape? Note: This is not a Cancun-crazy-party-beach-trip, this is a grayton-beach-outside-seaside (which_has_unfortunately_gotten_kind_of_huge) cozy-villa-beach-trip. Think me on a screen porch playing some blues on acoustic guitar while mom and dad sear tuna and rain falls on a tin roof.


title: Telecom Thoughts
date: 2009-07-21 14:26:43.000000
format: html
content:
  Since I've been getting a new phone I've spent a good deal of time lately thinking about the telephone industry. I have several problems with it but I suppose the largest is that I don't want voice service. I really just want to be paying for data. I'm happy to pay for Data at home and Data on the go. But I think it should all just be <i>data</i>. This sentiment is shared by a number of my friends. While you can get <a href="http://www.wireless.att.com/cell-phone-service/cell-phone-plans/pda-personal-plans.jsp">data-only plans for smartphones</a> it is not clear to me that they are truly unlimited as some are advertised. I was looking into what would be required to maintain a "phone number" if you did have an unlimited data plan with good coverage.<br><br>It seems you would need to use Local Number Portability to transfer your phone number to a virtual number provider which would then route all calls to that number to an SIP address. Then as long as you had an SIP provider that had some way to handle outbound calls to phone numbers you could get by with 3G just fine. I can't tell if <a href="http://www.google.com/googlevoice/about.html">Google Voice</a> might wind up resembling such a service but here's hoping, even if that would give Google an undue amount of power in my life. Better them than ATT. There's an SIP app for Android besides the Google Voice app called <a href="http://code.google.com/p/sipdroid/">SIPdroid</a> that looks pretty good and a list of SIP service providers <a href="http://www.cs.columbia.edu/sip/service-providers.html">here</a>. The GV Android app presently still routes calls through the PSTN. At least <a href="http://forum.xda-developers.com/showthread.php?t=516861">SIPdroid</a> lets you route calls through 3G or Wi-Fi but routing VoIP through 3G likely violates the TOS for most mobile carriers. <a href="http://code.google.com/p/sipdroid/wiki/FAQ#Prerequisites">Oh, well</a>.<br><br>Of course, there's an Android app for Google Voice already and it's rumored that number portability is coming to GV soon. We'll see. In addition to that, there are some other good things happening. Verizon is pushing FiOS and a group at nochokepoints.org is fighting for <a href="http://arstechnica.com/tech-policy/news/2009/06/fighting-att-verizons-chokehold-on-middle-mile.ars">more competitive access</a> to so-called "special access" lines. Finally, someone is <a href="http://blog.whatfettle.com/2009/06/22/etsi-2-0/">trying to communicate how we think to the telecoms</a> which can only do good.


