tag:blogger.com,1999:blog-45202954615126676392024-03-13T19:02:01.412-07:00Steve's House Of LogicStephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-4520295461512667639.post-4440154743938183752014-01-25T10:15:00.000-08:002014-01-25T10:19:59.831-08:00The Roommate Antipattern(editor's note: this is an old post that was in my drafts folder that I only published now. That is why it appears like I don't know how to do math if you consider the dates versus the sine curve.)<br />
<br />
Mitch Altman, the inventor of TV-B-Gone and a person some refer to as 'the Johnny Appleseed of the hackerspace movement' gave a talk at the 24th Chaos Communication Conference about '<a href="http://hackerspaces.org/wiki/Design_Patterns">hackerspace patterns</a>'. It's a helpful lessons-learned guide for groups wanting to take the plunge and start their own.<br />
<br />
There are a couple of worrisome cautionary patterns in the list. One that stands out is '<a href="http://hackerspaces.org/wiki/The_Sine_Curve_Pattern">The Sine Curve Pattern</a>':<br />
<br />
<span style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;">Peak enthusiasm at a hackerspace has the form of a </span><b style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;">sine curve with a cycle duration of four years</b><span style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;">. Keep the hackerspace running, even if the feel-good-factor is temporarily on holidays. Chances are your space will be awesome again in two years. </span><b style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;">Don’t give up!</b><span style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;"> Maybe an exciting new member will knock on your door tomorrow.</span><br />
<br />
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">Having started in 2009 (official in 2010, but still) this put us in the trough of the pattern, at 3/2*PI. Over the summer things were pretty slow and admittedly I got kind of worried, but then I remembered that because it was summer a sizable part of the population of our college town was gone. Many people were off on vacations, too. By Fall we were back to having workshops and events and I'd be trying to simultaneously listen to 3 or 4 conversations at once at Public Meetings on Wednesdays again. We did experience some challenges, but things are definitely headed back up now (in accordance with the wisdom of Altman). Still, let's talk about it.</span></span><br />
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;"><br /></span></span><span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">First, we had a new member join in the winter. </span></span><span style="font-family: Verdana, sans-serif; font-size: x-small; line-height: 19.049999237060547px;">He was a pretty interesting guy who talked about possibly hosting a glass-blowing workshop. Generally, he seemed like a cool guy and people enjoyed talking to him. </span><span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">He was an artistic type, which I particularly liked as I am very big on the intersection of art and technology. </span></span><span style="font-family: Verdana, sans-serif; font-size: x-small; line-height: 19.049999237060547px;">However, we were to find out it would be more accurate to say he presented himself as an artistic type. Those of us who kind of idealize artists at times are prone to making these kinds of identification errors.</span><span style="font-family: Verdana, sans-serif; font-size: x-small; line-height: 19.049999237060547px;"> </span><span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">That was not really the problem, though. We want to be a welcoming environment and there's a social element to the place for sure, and it is true that a bullshitter can be fun to be around if he is an entertaining bullshitter. The problem can, as it turns out, be found in Altman's Design Patterns. This one is the <a href="http://hackerspaces.org/wiki/The_Roommate_Anti-Pattern">Roommate Anti-Pattern</a>.</span></span><br />
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;"><br /></span></span>
<span style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;">You need a space for meetings and as a lab, to store and work on materials for projects. In order to minimize rent or out of sympathy, you think it’s great when someone lives in your space. But somehow it doesn’t work, as you cannot use the lab anymore.</span><br />
<span style="background-color: #eeeeee; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19.049999237060547px;"><br /></span>
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">We had actually anticipated this, and one of our few rules is 'don't live at the space' (the others are 'don't be on fire' and 'be excellent to each other'). So this doesn't quite fit the pattern, because nobody thought, 'this is great'. This didn't happen overnight. Gradually we noticed the individual increasingly settling in. He would emerge from the shower in the middle of a C Programming class. He would watch youTube videos and grumble when people were having a workshop. His RV was parked at the space around the clock (irritating both our landlord and our neighbors). One morning I stopped by and noticed an extension cord running out our back door and into the door of his RV. Utility bills went up. Way up. As far as anyone could tell, most of what was happening was beer was being drunk and TV was being watched (TV! What would Mitch do?) It was not an incubator of great works of art.</span></span><br />
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;"><br /></span></span>
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">We discussed this with him a couple of times, but it got to the point where we were just going to have to go our separate ways. This was problematic in part because with a consensus organization, you can never get a consensus to kick a person out. There was much discussion within the group, and there was unanimous (-1) support for the idea that we needed to part ways. We decided on a rule to vote to put a person on probation, followed by a vote a month later on whether to keep the member.</span></span><br />
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;"><br /></span></span>
<span style="font-family: Verdana, sans-serif; font-size: x-small;"><span style="line-height: 19.049999237060547px;">As sometimes happens with these kinds of things, I think eventually the message got through that membership is not free rent. This guy's behavior fell well outside of 'being excellent to each other', and for a month or so there was some tension as we tried to sort out what to do. Eventually the individual came to agree that the situation wasn't working out and that his behavior was not what our space is about, and more importantly I think he realized we weren't really buying his bullshit anymore, and he left. It was not a happy series of events, but in the end we had gotten out of the Roommate Anti-Pattern, and everyone (-1) seemed to think things were handled well. We overcame it and moved on.</span></span>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com1tag:blogger.com,1999:blog-4520295461512667639.post-71897187757936757592014-01-25T10:14:00.001-08:002014-01-25T10:14:19.350-08:00Back in Action with Beagle Bone Black ExperimentsHey Folks, I have been away a long time. I once read advice about writing a letter, and the first thing the guy said was 'never start by apologizing for not writing'. So, no apologies for not writing. Instead, thanks for stopping by.<br />
<br />
As we may or may not know, I am active with Bloomington, IN's hackerspace, Bloominglabs. I handle the social media and promotional stuff and am on the board. Sometimes I even hack or make things.<br />
<br />
Recently we started a hackable thermostat project. We got the 'minimally viable' bit up and running, so for example if we have a meeting at 7, I remotely kick the heat on at 6. Also I can see what the temperature is remotely.<br />
<br />
https://xively.com/feeds/53278/<br />
<br />
We experienced some heartache recently, however, when it got below zero and we forgot to think about the fact that the laser cutter has an exhaust running directly outside, letting the cold air into the laser cutter, far from the temperature sensor I installed, freezing the water used to cool it, breaking the tube. As LaserDan put it, we learned nothing from the destruction of the first Death Star.<br />
<br />
So anyhow, back to the thermostat. Right now it's an Arduino with an Ethernet shield. We ran the cable across the space, so it's pretty awkward. Also the Arduino has pretty limited power, so we decided we are going to run things on the Beagle Bone Black.<br />
<br />
So far, so good. I have various sensors running in my house including temperature. I tried using the DHT22, however the code I found SUUUUUUCCCKKKKKKEEEDDDD, the reason being the timing was way off. On our friendly Arduino, we can be assured, especially if we turn off interrupts (as is done in the handy library from the adafruit people) that our program is the only one running. On the BeagleBoneBlack with Ubuntu, no such luck. Some people claimed to get it to work, but nobody was happy with it. I got it to give me readings, but with more errors than good readings.<br />
<br />
Now I could have gone down this rabbit hole forever, but as luck had it I also had a ds18b20 with the one wire protocol. This was (relatively) easy to set up, and way more reliable, as detailed <a href="https://github.com/sdcharle/blabs-thermostat/tree/master/BeagleBone">here</a>. Sometimes you just have to let go and move on.<br />
<br />
I'll try to post more frequently on here about my experiments, Beagle Bone Black and otherwise, especially about things I get stuck on and then solve. Hopefully somebody else will benefit. But if life takes me elsewhere and I don't post as much, well, no regrets and I'm not sorry.<br />
<br />
(I think I've covered myself from the sad 'HEY I'LL POST A BUNCH MORE' blog that hasn't had a new post for 10 years now.)<br />
<br />
<br />Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-44070501387746447952012-02-03T17:59:00.000-08:002012-02-03T18:00:34.721-08:00The Sheeva Plug and tiny computers in general<div style="background-color: transparent; "><b id="internal-source-marker_0.7059897994622588" style="font-weight: normal; "><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Ever since Bloominglabs hackerspace actually became a space in the physical sense, we wanted to put together an RFID access system for our space. After some experimentation and false starts, we came across </span><a href="http://shop.23b.org/"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">23b Shop’s</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "> </span><a href="http://code.google.com/p/open-access-control/downloads/detail?name=open_access_control_v132.zip"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">open-access-control system</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">, which essentially is the largest Arduino shield you’ve ever seen. It handles such matters as storing user tags in EEPROM, unlocking electric strikes via relays, and a bunch of other stuff. In the Open Source sense, it does what it does out of the box, plus it does anything you decide to add to it, should you follow the advice of American poet laureate Henry Rollins - ‘Don’t think about it, do it!’</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Among other things, visits (and alarms and sensors being set off) are logged to the serial port. So if you connect it to a server via a USB cable, you can do all sorts of things with this info. In arclight of 23b Shop’s case, he used a very small, low power (5W) ‘plug computer’ called the SheevaPlug as a server, installed ArmedSlack on it, and </span><a href="http://code.google.com/p/open-access-control/wiki/LinuxMonitoring"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">set up some scripts</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "> to mail people when somebody is at the space (or an alarm goes off).</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">As an Arduino fan I like really small computers, and I generally like things that provide ‘the right amount of power for the job’. For example, I think it’s dopey to drive a Hummer not only because it’s a stupid car that wastes gas and generally stinks up the place with pollution, but also because from an engineering standpoint, using all that gas to move a 200 pound individual from point a to point b seems like the stupidest and least elegant fucking thing ever. Sorry for the language.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">So I ordered a SheevaPlug from </span><a href="https://www.globalscaletechnologies.com/"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">Globalscale</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "> technologies for $99 (the low price is another thing I liked), and not long after that it arrived. I immediately was a bit disappointed that it came with Jaunty Jackalope, so any attempts to install anything or update anything were for naught, because Jaunty Jackalope is no longer supported. I’m not sure why they felt like this was the thing to do. It was pretty clear now why arclight had installed another distribution.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">I ended up going with Debian instead of ArmedSlack, because I like Debian and it seemed like the thing to do. It ended up being a good choice in part because I used this guide, and the guy (Martin) who wrote it was extremely responsive and helpful with some questions I had about the process. I created a filesystem and installed Debian on an 8GB SD card, and I was on my way, or so I thought. After a couple of days, the thing just died. A bit of </span><a href="http://www.plugcomputer.org/plugforum/index.php?PHPSESSID=psgnr88hshr0e07ob9qid1imp5;www;action=forum"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">forum</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "> searching turned up some frustration people had involving the power supply, including some not very flattering critiques of the soldering technique of the manufacturers. I returned the Plug asking for a replacement, and after a somewhat frustrating couple of weeks, I received my repaired SheevaPlug, with Jaunty Jackalope helpfully installed.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">This was a couple of months ago. While I was waiting for my SheevaPlug to be fixed, we set up a server running Fedora in what we’ve decided is the server room at Bloominglabs. Since the RFID system sits on top of the rack the server is housed in, we set up the monitoring system on that server, along with a bot in our irc channel that helpfully welcomes people with small talk about ‘that local sports team’ and so on.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">I ended up using the Sheeva plug for some experiments w/ sending info from </span><a href="https://pachube.com/feeds/42215"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">sensors to Pachube</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">. It’s been running fine for over a month now, and it’s nice to have a server I can leave running around the clock that doesn’t use much power or make annoying fan noises. I do have a problem where when I reboot, it doesn’t always recognize the SD Card, but for now I’ve attributed that to a crummy SD card and moved on. The Sheeva plug is worth checking out if you want to see what plug computing is about. Needless to say my experience was not optimal, but to their credit GlobalScale sorted out my problem with minimal fuss or hassle.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">By the way, if you haven’t heard about it, the </span><a href="http://www.raspberrypi.org/"><span style="font-size: 15px; font-family: Arial; color: rgb(17, 85, 204); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap; ">Raspberry Pi</span></a><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "> project is in a similar vein and looks VERY interesting. It’s an ARM/Linux box for $25! My initial feeling is that although they’ve already started manufacturing them, it will be very hard to get a hold of one for some time, but this is one of those things I’d be happy to be wrong about.</span></b></div>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-23586504576457328162011-12-31T09:28:00.000-08:002011-12-31T11:03:19.829-08:00Bloominglabs 2011 in review, Part II<span>Events</span><div><br /></div><div>We were involved in a couple of other events the past year in addition to the Workshops I mentioned last time and our Open House. The big ones being another BugBot workshop at Wonderlab, the 4th of July parade, and the Indy Mini Maker Faire.</div><div><br /></div><div><span>Bugbots at Wonderlab</span></div><div><br /></div><div>The Bugbot workshop was a bit of a step up for us. Our previous workshop was part of the Metal Mayhem Robot Day, but this one the workshop was the main event at Wonderlab, one of our favorite Bloomington institutions and one we look up to as a big success story in going from an idea to a very real and very cool place. Several people and their kids came out for this, and we had some valuable help from Wonderlab people in addition to the Bloominglabs members that came out for it. Many bugbots were built, and then when head to head (kind of) in the Bugbot arena. I've done this workshop a few times and am still impressed by how something so simple manages to navigate around and keep going for so long with obstacles and other bots in its way.</div><div><br /></div><div><span>4th Of July Parade</span></div><div><span><br /></span></div><div><span>This one was a bit funny, as while we were smart enough to start pretty early brainstorming for it (months ahead), we kind of fell short of our grand vision when the day rolled around. There were plans including a 'human bugbot', an infrared LED sign that could only be seen thru a digital camera (<a href="http://www.exo.net/~pauld/activities/astronomy/seeingir.html">you can see how this would work using a TV remote</a>), and a circuit bent band. Some of these grand plans fell victim to proof of concept research (LEDs in full sunlight? Maybe not.), others to the fact that we all have jobs and/or school or what not, or other projects drew us in (about which, more shortly).</span></div><div><span><br /></span></div><div><span>Enough suggested projects came through that we went ahead with the float - we had smoke cannons that were suggested and put together by Jenett and some others, Joe brought his guitar he had built himself and played it (alas there was no circuit bent band - the Steel Band behind us didn't know about the bullet they'd dodged there), and we had Twinkie cannons although we were not allowed to use them (the idea at one point made me think of Homer Simpson firing a shotgun outside the bowling alley as a 'promotion', so I wasn't entirely surprised by this). The big project and feature of the float was the Straandbeest. While as is often the case, this proved to be way more complicated than anticipated, I also saw it as a model of future projects I hope to see more of in Bloominglabs' future. </span></div><div><span><br /></span></div><div><span>Charlie suggested the idea, and then rather than sit back and congratulate himself on his mental and verbal work and waiting for the project to spontaneously organize and implement itself, he and Ross dug in heavily to researching and prototyping and making the thing happen. Toward the end, some 'build days' were organized where everybody could pitch in, and even if we were just drilling holes or sawing or hammering, the feeling of everybody pitching in to make it happen was a great thing I hope we see more of in 2012. As I said, it turned out to be far more complicated than anticipated, and installing motors and a drive system to make the thing walk around didn't happen in time for the parade, but all the structural parts including the walking motion were in place.</span></div><div><span><br /></span></div><div><span>The parade itself was great fun and helped us get the word out to the community that we existed, and in 2012 we'll see if we can pull off something on a grander scale.</span></div><div><span><br /></span></div><div><span>Indianapolis Mini-Maker Faire</span></div><div><span><br /></span></div><div><span>Indiana is doing well for itself this year in the Maker department. There were two Maker Faires in 2011, this one in Indianapolis, and one in Fort Wayne. Rex had the idea of putting together a Bloominglabs booth at the Indiana Mini-Maker Faire, and more importantly he put considerable effort and energy into making it happen, along with several other members. I kind of lamed out and wasn't part of the booth, but I did make it to the Maker Faire and was quite impressed with the booth and the Faire itself. Rex brought several robots and soldering stations, and showed how he designs and etches circuit boards, and Jay brought many Arduinos and laptops for people to play with. Jonathan helped out all-around as did Rex's son and wife and others.</span></div><div><span><br /></span></div><div><span>Projects</span></div><div><span><br /></span></div><div><span>A hackerspace is nothing without some cool projects. Well, that's not entirely true, it's a fun place to hang out and talk to really interesting people and have beer and pizza, but you can do that at Geek Dinners, too, and hackerspaces are all about doing things. At any given time people are working on individual projects - soldering together and playing with shields and Arduino kits, trying out ideas for bigger projects, and so on, but we do same bigger scale projects, too.</span></div><div><span><br /></span></div><div><span>RFID Access System</span></div><div><span><br /></span></div><div><span>This project took some time to get fully operational, but it's in place at the new space and is pretty cool. After some initial prototypes that ran into some interference problems, we ended up putting together and installing the <a href="http://hackerspaces.org/wiki/Open_Access_Control_for_Hacker_Spaces">Open Access Control</a> kit the good people at Shop 23b have released to the hackerspace world in the open source spirit. Being open source it is nicely hackable and customizable, and I'm working on a database-backed app that lets you manage and track users beyond the RFID tag values (0x324153 for example) stored in the EEPROM. There are also all kinds of cool things you can do with logging and tracking people's comings and goings, you can add sensors and alarms to the board - it's nicely open ended in the 'we can always add another cool thing to it' way of the Open Source and Open Hardware world.</span></div><div><span><br /></span></div><div><span>Reverse Geocache</span></div><div><span><br /></span></div><div><span>In what was probably not a highlight of 2011 for Bloominglabs, we were approached by the TEDxBloomington people to do a collaboration with the Geocaching community on a Toybox project. Initial enthusiasm about the project kind of ran into reality and some other factors including the fact that people were already pretty into 4th of July projects, the project idea was kind of open ended to the point where we weren't sure if our ideas were really appropriate to the vision of the project, and the fact that for whatever reason, the Bloominglabs and Geocache crews never really gelled, and the always important matter of funding and money.</span></div><div><span><br /></span></div><div><span>I did have a couple ideas I got jazzed about and plowed ahead with. One involved labelling Geocache boxes with a phone number or QR code so people could log their visits vocally or by text using the Twilio API. I put the code for the prototype together over a weekend, but at that point things kind of fizzled. I did try the idea with easter eggs I left in the park near our house on Easter, but either my daughter and I did too well hiding the eggs, or people are afraid to call numbers found in eggs left by strangers in the woods, or both. I may try some other variant of this (maybe a proper geocache) in the future.</span></div><div><span><br /></span></div><div><span>The other idea was for a <a href="http://arduiniana.org/projects/the-reverse-geo-cache-puzzle/">Reverse Geocache</a> (trademarked by Mikal Hart). I dug into this and put considerable effort and not inconsiderable money into it (the GPS unit alone was $60). In the end it was successful and I let some people play with it at the Open House (I really need to do a write up on it), but by the end of the project it was so much 'my baby' that I began in engineer fashion thinking of all the things that could go wrong if I released it into the wild (people dropping it, or trying to pry it open and destroying the lock, or other damage intentional or unintentional) and was by the end not about to let it go for the funding that was available at the time. That and none of the other boxes getting fully completed made this less than a high point for the group, but we learned a lot from the experience. I ended up pretty happy w/ the results and the people who've seen it and played with it like it, though.</span></div><div><span><br /></span></div><div><span>IR Harp</span></div><div><span><br /></span></div><div><span>The IR Harp is an ongoing project led by Jenett. This one's based on a project on the Cornell EE website, and I wrote about it in an earlier post. Ultimately it is to be a part of '<a href="http://truedungeon.com/">True Dungeon'</a>, as an interactive puzzle, and it is a really cool project that's been fun to watch take shape.</span></div><div><span><br /></span></div><div><span><a href="http://www.bloominglabs.org/index.php/Lockpicking_contest_system">Rumble Challenge</a></span></div><div><br /></div><div><span>A high point of the past year for us was having the 'Rumble Challenge' combo lock picking and drinking game which was part of the <a href="http://www.bloomingtonfools.org/">FOOLs</a> lockpicking village at Louisville's Derbycon featured in <a href="http://hackaday.com/2011/10/07/hackerspace-competition-combines-drinking-and-lock-picking-need-we-say-more/">hack-a-day</a>. dosman was the lead on this one (he also made a really cool fireworks control panel and other cool projects over the course of the year). I made some very modest contributions in the form of a Processing based scoreboard that communicated w/ the lockpicking stations via serial port communication. This one was great fun to demo - the rumbling is VERY loud and it makes quite an impression.</span></div><div><span><br /></span></div><div><span>That's it (but not all of it) for now</span></div><div><span><br /></span></div><div><span>This post has exceeded the usual preferred blogpost length. I've left a lot out, I'm sure, and I'm happy about that as it's because more happened in the past year than is easy to summarize. Our main goal for the new year is to do even more, especially in terms of big projects and we hope to draw in more interesting and interested people of all levels of skill and knowledge (serious about this - teaching people and bringing them into the making/hacking fold is a big part of what we do, and one of the most fun things besides).</span></div><div><span><br /></span></div><div><span>Among other things I need to post more in the blog and elsewhere (we're on the usual social media things, <a href="https://twitter.com/BloomingLabs">Twitter</a> and <a href="https://www.facebook.com/pages/BloomingLabs/123873197660062">Facebook</a>, and we've got our <a href="http://bloominglabs.org/index.php/Main_Page">wiki/website</a>). Hope to meet some new people next year at our Wednesday 7pm meetings. Happy 2012 to all!</span></div><div><span><br /></span></div>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-77302186088336445722011-12-26T10:50:00.000-08:002011-12-31T11:01:58.143-08:002011 at Bloominglabs Part I<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk6EYIqfj2lwBuqRDZJOTL95OPQx377ECPREYY_l_jgH-3IWbwZrRnpcsL8_Tgc4qvCXw7gxX_LqVe8iAauDu0PgCphOGNJmzaQuIhG6HlTHBmKaSbM0HdTrGvTtKNV5y3IUQH5iWLhYY/s1600/buddhaSoap.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"></a><div style="text-align: center;"><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSflAv7oyHiHVq6J1pXMhRht0am9fJeW4w2zBBrCPD_3vdPqYcafHG_tZjhYfTLf1L_hN_cH6GvOGKp9KhZpqRQ0JOREVkzer_VPmXeAZYbwqHL0BPdCcPf-rIBMqSjp0xXHL_HoNDIuI/s1600/openHouse.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSflAv7oyHiHVq6J1pXMhRht0am9fJeW4w2zBBrCPD_3vdPqYcafHG_tZjhYfTLf1L_hN_cH6GvOGKp9KhZpqRQ0JOREVkzer_VPmXeAZYbwqHL0BPdCcPf-rIBMqSjp0xXHL_HoNDIuI/s320/openHouse.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5690558279157160610" /></a>A lot happened at Bloominglabs over the past year. It was a better year for us than 2010, which in turn was better than 2009. Hopefully this trend continues. I'll try to sum it up for you here. This is not meant to be like a holiday 'Danny Jr. got a job at Wal-Mart in the summer' family update letter, but one of those magazine 'a look back at 2011' issues, so here we go.<div><br /></div><div><span class="Apple-style-span" style="font-size:130%;"><b>The Big Move</b></span></div><div>In 2010 we moved out of the basement and into a shared space with The Collaboration Room. We continued to meet and work there for the first half of the year, moving to our grand new much bigger (1000 sq ft) space in early July. We had an Open House late in July that was pretty well attended, and aside from the location being less ideal than the Collaboration Room's (we got spoiled being downtown in walking or biking distance of many members' homes) it has been really great to have a good HQ with room for workshops and our ever-growing collection of tools. Sadly the Collaboration Room is no longer in existence and currently the space is one of many commercial spaces around town that's empty. I know the owners have to make money, but in our search we did find that a lot of commercial spaces are pretty pricey even with a lot of them vacant, and they aren't exactly making money w/ nobody in them.</div><div><br /></div><div>Fortunately there are plenty of people in Bloomington determined enough to make cool things happen not to be discouraged by that, and I'm not just saying, 'yay for us' here, I'm thinking of other Bloomington institutions for creative types like <a href="http://www.bloomingtonprintcollective.org/contact">The Bloomington Print Collective</a> and <a href="http://www.papercranegallery.org/about-2/">The Paper Crane Gallery</a>, too.</div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhod8PCkj8QNYeZDi5yh-nfEd7-l_3M5-_h3aM92Uuq1nyFu-jl9M22Vp0KfWoJKvzcvqQFJJTgBCVQ2qzsDfzefL7waeuZukpxG-tBOkYVECt80J2SnFDx6csflIqadpnP6_wdIsoOC40/s320/phoneMold.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5690558434432852322" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 240px; height: 320px; " /></span></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><br /></span></div><div><span class="Apple-style-span" style="font-size:130%;"><b>Workshops</b></span></div><div>Our workshops started out with a Contact Microphone Workshop conducted by the rock/circuit bending band CMKT4 at Russian Recording (yet another cool Bloomington organization) in February. This brought out some new people and worked out really well - much fun was had with soldering irons and hot glue, and the band gave a performance while we waited for the plasti-dip coating the mics to dry. Joe S. was the main organizer/coordinator/flyer maker for this one, and a fine job he did.</div><div><br /></div><div>Jay S., who does training on Kuali Software professionally, put together and conducted a super-slick and professional Intro to Arduino Workshop that went beyond the standard blinky lights to temperature sensors and other applications. We're hoping to get Jay to host this one again in 2012.</div><div><br /></div><div>Jenett T. conducted a two-part workshop on AVR programming for those who wanted to go deeper into the AVR toolchain. This is one of the classic Bloominglabs workshops, in fact it's one of the first things we did when we started meeting. It was a fun workshop - as with the Arduino workshop, once people got things up and running, they really got into changing the code to try out their ideas.</div><div><br /></div><div>We had a visit from Catarina Mota that I mentioned in my previous blog post at the end of November. She talked about materials like conductive threads, fabric, and paint, quantum tunneling composites, all kinds of cool stuff, with of course several projects she'd made that demonstrated their use. One of the fun things I learned in this workshop was that there's a site that caters to people who want more fashionable versions of the fabled tinfoil hats that's a great source of conductive material. It's: <a href="http://lessemf.com/">lessemf.com</a></div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk6EYIqfj2lwBuqRDZJOTL95OPQx377ECPREYY_l_jgH-3IWbwZrRnpcsL8_Tgc4qvCXw7gxX_LqVe8iAauDu0PgCphOGNJmzaQuIhG6HlTHBmKaSbM0HdTrGvTtKNV5y3IUQH5iWLhYY/s320/buddhaSoap.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5690559123235175362" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 10px; cursor: pointer; width: 240px; height: 320px; " /></span><div><div><br /></div><div>In mid-December we held our second 'Holiday Mini-Workshops'. Mid December is not really a great time to schedule things in Bloomington, but we had a good turnout, and people brought along their kids. The most popular activity, as at last year, was making molds of pretty much anything people could think of with the vacuum former, and using the molds to make soap. Two new molds added to the collection were a Blackberry phone mold and a Buddha figurine (the mold was only good for one use due to the Buddha figurines' lack of convexity).</div><div><div style="text-align: center;"><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><br /></span></div><div><span style="font-size: 21px;"><b>In Part II:</b></span></div></div></div><div><span style="font-size: 21px;"><b><br /></b></span></div><div><span style="font-size: 21px;">Cool events and projects of 2011</span></div>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-77145509188491076792011-12-14T17:26:00.000-08:002011-12-14T17:41:22.450-08:00Quick 'n' Easy Polyphony for the Arduino<div style="background-color: transparent; "><span id="internal-source-marker_0.09865643992088735" style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Bloominglabs was lucky enough to have Catarina Mota of <a href="http://www.openmaterials.org/catarina/">OpenMaterials</a>, <a href="http://www.nycresistor.com/">NYCResistor</a>, ITP, and more visit our space last month to give us a demo on open materials - conductive threads and fabrics, materials for modeling parts (e.g., Sugru), quantum tunneling composites, conductive paint - it was very cool and we came away from it inspired to make projects using the things she showed us.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Catarina is partially known as co-creator of the <a href="http://openmaterials.org/2011/09/01/the-resistor-jeltone-an-edible-toy-piano/">Jeltone Jello piano</a>, which she brought to show us. Later during a health food stop a few of us made at the local Denny’s (the first time I’d eaten at one in at least 15 years) the subject of polyphony using the Arduino came up. Jennet, one of <a href="http://bloominglabs.org">Bloominglabs</a>’ founders, has been working on an <a href="http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2009/kac99/ECE_4760_Final_Project%20saf42%20kac99%20page%20v4.htm">IR harp based on a project some students did at Cornell</a>. The site is a great resource of project ideas, and the projects are very well documented.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Anyhow, the code for the IR Harp was written for the ATMega644, and as the user plucks the strings, the notes ring out in some sweet sounding (for 8 bit) chords. This gave us the idea that it could definitely be done, although of course it would require something more than the Tone library.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">I took a look at the code to see about porting it. Fortunately the Atmega328 the Arduino Uno is built around has pretty much the same registers and so on as the ATMega644, the main differences being the 644 has a lot more pins, and twice the memory.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">I had an AD5330 DAC I had played w/ before, inspired by <a href="http://www.sparkfun.com/tutorials/160">this tutorial over at Sparkfun</a>, so I decided to use that.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">To convert the code, I first switched over from using Timer0 to Timer2. Timer0 is used for millis() on the Arduino, so if you try to compile the code w/ Timer0, it will error out. I also had to add the code to accomadate my DAC (adapting for others shouldn’t be too tricky), and fiddled around a bit with which pins are used for what. I stuck with using the ‘PORT’ approach to I/O instead of the Arduino functions, b/c as we know they are way faster, and generally you want an interrupt routine to do its thing as fast as possible and get out.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">Another change was to have a function to load the different waveforms on the fly as needed. These were all being loaded up front, and like I said, the 328 has only half the memory. Also, the waveforms are calculated, so you do not need to store a table.</span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "></span><br /><span style="font-size: 15px; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; ">The <a href="https://github.com/sdcharle/Bloominglabs/blob/master/arduino_polyphonic/ArduinoPolyphonic.pde">demo code</a> goes thru all the waveforms, plucking out the same chord for each. Feel free to use it for whatever instrument you want. Maybe an Arduino-based 8bit clock tower/carillon. Why not?</span></div>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-77598299493977464242010-03-04T18:08:00.000-08:002010-03-04T19:21:27.828-08:00The Collaboration Room in Bloomington: You and Your Thoughts are WelcomeWhen last we left our heroes from the Bloomington hackerspace, they were working on robotic cats, robotic robots, game controllers, laser harps, 3-D printers, and blinky microcontroller projects in member and laser harp designer Jenette's basement. Fun was had, knowledge was shared, beer was consumed, and Nerf battles were waged.<br /><br />A month or so ago, we were alerted to the existence of <a href="http://thecollaborationroom.org/blog/">The Collaboration Room</a>, a fairly new place in town that makes the very cool town of Bloomington even cooler. It's a house on 214 N Rogers Street where artists and other collaborators can gather to work on projects. I visited a couple of weeks ago during a Friday night session (these are held every Friday from 5-8pm) with my daughter. We met Matthew and Matisse, and in no time we were contributing to prints that had been started by previous visitors. After doing that for a bit Matthew taught my daughter how to make prints with brayers, barens (new terminology to both of us) and colorful ink. Matthew is a good teacher who works well with kids, so it was not surprising to find out he works for the Boys and Girl's Club of Bloomington.<br /><br />Some other members of the hackerspace dropped by, so we talked about what hackerspace was about and what we'd been up to, and were graciously invited to have meetings at the Collaboration Room Tuesday nights. It seems to be working out very well, as the 2 groups have the same goal of working on creative projects with people with a variety of skills and different levels of expertise. At the first meeting, the collaborative spirit overtook us, and we put aside individual projects to work on a robotic (servo powered flapping wings) parrot we were determined to put together that night. It was not unlike a reality show challenge, only our opponents were the clock and boredom, both of whom we defeated.<br /><br />A few days later, some of us went to the Collaboration Room's first benefit at the Bishop. This featured a performance art work involving a guy mowing a small indoor lawn and several local bands. People were invited to participate in the Collaboration Room's Red Circle Animation project (I drew a red unicycle). Prints, including two my daughter and I had worked on, were on the wall for sale. I bought the one my daughter had worked on, so now she has sold work.<br /><br />Matisse runs an animation workshop on Saturday Morning. Spaces are very limited, so interested parents should contact Matisse via the website. At the first session, we watched some animated works made by previous kids for inspiration. One involved a pair of Gwar/Transformer hybrid characters in a guitar battle. After that, no time was wasted, and the kids dove right in to making clay characters and choosing or making sets for their works. By the end of the session, they had made 3 cartoons.<br /><br />While The Collaboration Room is very kid-friendly, it is a place for all ages. It's very much about inclusiveness and being accessible to anybody with a desire to participate in a constructive way. As they say, 'everybody brings something to the table'. Matthew has pointed out that Bloomington's Wonderlab (a science museum for kids) started out as a small operation run by a small but very enthusiastic and energetic core of volunteers. Bloomington's community radio station, WFHB, started out that way too. I would love to see The Collaboration Room reach the same level of success the Wonderlab and WFHB have enjoyed. If you live in Bloomington and are interested, go to a Friday Night open session, volunteer your talents and teach a workshop, or donate some art supplies.<br /><br />Related Links:<br /><ul><li><a href="http://thecollaborationroom.org/">The Collaboration Room</a></li><li><a href="http://hackerspace.bloomingtonfools.org/bloomington_hackerspace/index.php/Main_Page">Bloomington hackerspace wiki</a></li><li><a href="http://www.wonderlab.org/">Wonderlab</a></li><li><a href="http://wfhb.org/">WFHB</a></li></ul>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com1tag:blogger.com,1999:blog-4520295461512667639.post-79450620767793480322010-01-25T19:04:00.000-08:002010-01-25T19:08:12.898-08:00How I will lose 1,000 pounds in 2010I suffer from the admittedly 1st world problem of having too much junk. Over the years, stuff accumulates and gradually changes state from 'stuff' to 'junk'. In spite of its devaluation and the loss and damage of a lot of junk in moves from dwelling to dwelling, for me at least the junk comes in faster than it comes out, and I have a really hard time parting with the junk even though most of it has no sentimental value whatsoever. Even with stuff that has sentimental value (my daughter's art work) I have a tendency not to be selective about what gets archived.<br /><br />Left untreated, this could lead to an appearance on the television show 'Hoarders', which is not desirable to me even in these fame-obsessed, less-shame-influenced-than-ever times.<br /><br />In order to achieve this goal, I will need to drop 83 1/3 pounds a month. I will make an effort not to merely make the junk somebody else's problem by throwing it away, although I've gotten off to a bad start, throwing out 2 trashcans worth of junk that's accumulated in my cube at work. This junk was a combination of out-of-date calendars, obsolete software I got from MS when I was an MSDN member (now: open source for life!), and the sort of write-only notebooks that are part of my 'method'. Even though most of the notebooks have dates, I can't say the June 2006 notebook is going to answer any questions I have. I have made a move to logging things in electronic form recently (Google Docs), which is decidedly more searchable.<br /><br />This weekend I went through my technical book collection and weeded out some decidedly out of date tech books (Java 1.2, a book on Flash from 2000, that sort of thing). I would feel bad selling these on eBay, because they're worthless, and dumping them on somebody else for a couple bucks, while not as bad as selling crack, is still ethically questionable. I will recycle them instead.<br /><br />This stack of books weighed 24.5 pounds, and given the dimensions of the stack (10 1/4 in x 8 1/8 in x 12 in), that gives us a paper density of about 42 pounds per cubic foot. Since I didn't weigh the trashcan at work, I instead in Microsoft interview fashion measured the dimensions of the trashcan (16" x 6" x 12") and using that density (although there was some air in the trashcan that will being down the density some) that gives me 2 * .66666666 ft^3 *42 = 56 , plus the 24.5lbs for the books. So so far, we have 80.5 lbs.<br /><br />So I'm off to a good start so far, as far as January goes. I just need to find one or two more books to let go of. I really have no fear of running out of junk before 2010 is over. I can do this!Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-34610071929429746432009-09-04T13:25:00.000-07:002009-09-04T18:41:00.630-07:00Hackerspaces - a way for computers and the people who love them to get out more oftenAn unfortunate stereotype of members of the Geek Kingdom is that they are introverted and anti-social. There's an old joke:<br /><blockquote>Q: How can you tell if a programmer is extroverted?<br />A: He looks at your shoes instead of his when he talks to you.</blockquote>(I didn't say it was funny). The truth is that while Geeks do appreciate being left alone occasionally to focus on a problem or a project they're working on, they are often social animals, not unlike people in general. They go to conferences, they collaborate on Open Source projects, they go to events like Bloomington's ongoing Geek Dinners or user group meetings. In a college town like Bloomington (yes students, we townies do appreciate you) there are an abundance of opportunities to get out and mix it up.<br /><br />For all the 'we live in a new era' wonder of computers and the internet, they live in a somewhat insular world. Sure, data travels around the globe via TCP/IP, HTTP, etc, but for many their interaction with the world outside is limited to fingers tapping on their keyboard or perhaps a temperature sensor to make sure they don't melt down. I believe Macbooks have light sensors, too. But the fact remains: for most of the computers we see and interact with day-to-day (I'm not talking about all the more-or-less hidden microcontrollers all around us), there's no meaningful direct interaction with the outside, sun shining, birds singing, the <a href="http://www.instructables.com/id/Garduino_Gardening_Arduino/">plants need watering</a> world.<br /><br />There's a nice illustration in the book <a href="http://www.amazon.com/Physical-Computing-Sensing-Controlling-Computers/dp/159200346X">Physical Computing</a> that shows how your computer sees you:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuk-Z3lKU_Mrwfr9H2BI2DoWpFGaIeL3lFvWzEqWrgaxfjbadW0SnvMuwSp5dKU2fxYQ_KT_Axnp9qPCmk-dGywo6xEH-za0B9J2ACrPSRu1FCbdBjQ9owdITY-0wU4TIPMtvXdi7VZeg/s1600-h/computerSeesYou.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 147px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuk-Z3lKU_Mrwfr9H2BI2DoWpFGaIeL3lFvWzEqWrgaxfjbadW0SnvMuwSp5dKU2fxYQ_KT_Axnp9qPCmk-dGywo6xEH-za0B9J2ACrPSRu1FCbdBjQ9owdITY-0wU4TIPMtvXdi7VZeg/s320/computerSeesYou.jpg" alt="" id="BLOGGER_PHOTO_ID_5377719240172093378" border="0" /></a><br />Physical Computing is about giving computers (often really tiny inexpensive ones, aka microcontrollers) sensors to allow them to take in their environment, and sometimes motors or other physical/mechanical devices so they can move around or change their environment (as with the plant watering).<br /><br />A new place in town for like-minded creative types with interests in Physical Computing, electronics, and creative activities in general is the Bloomington Hackerspace (really cool name like NYCResistor or more serviceable name like HackDC to follow). <a href="http://hackerspaces.org/wiki/Hackerspaces">Hackerspaces</a> have been around for years, and as the name suggests they offer a physical (as opposed to virtual) space for hackers. Here hacker is defined as a person with an ongoing interest and aptitude for finding creative and usually not obvious uses for the objects, devices, and technological tools around them. These are NOT the let's-break-into-somebody's-system hackers. The very simple distinction: these hackers are all about creating, not destroying (although they do break things down for parts).<br /><br />While not every great idea with a lot of enthusiasm behind it coalesces into a real-life implementation, things have been going very well for the Bloomington hackerspace under the capable leadership of non-official leader Nathan H. (aka dosman). After an initial meeting a couple weeks ago featuring members of the IU Robotics Club (the future of which is uncertain as at this point as pretty much none of the members are students), a space was identified (donated by member Jennette T.).<br /><br />For the second meeting, we gathered in this space, which featured a worktable big enough for all of us and many breadboards and electrical components. Some of us brought our Arduinos and a guy named Will brought a MeggyJr he had built. I had heard about these hand-held, Arduino-based game consoles, but this was the first time I'd seen one. It was running a version of the classic memory game Simon, and later Will uploaded other games that one of Jennette's sons enjoyed playing.<br /><br />While the gathering had a somewhat informal air, we did have a defined goal, as we were all going to get a chance to wire up an ATMega8 (AVR microcontroller) and program it to do the 'Hello World' of microcontroller programming, blinking an LED. It sounds somewhat trivial, but it ended up being interesting as we had to debug things like malfunctioning components or minor wiring errors. As somebody who's played with the Arduino, I found it interesting to take a step down from the ease-of-use and accessibility of working with the Arduino.<br /><br />Arduino programming works like this:<br /><ol><li>Write your program using Wiring, a very nice IDE based on the very accessible Processing environment used for Visualization and graphics. (Actually the sketch is available as an Example).<br /></li><li>(Optional) put the long pin from your LED in the designated output pin, and the short one in ground (usually there'd be a resistor in the mix, but the Arduino's got that covered. Also there's an LED built in, so even this is optional).</li><li>Plug a USB cable into your computer, and the other end into the socket on the Arduino.</li><li>Upload the sketch.</li><li>Admire the blinky light.</li></ol>Programming the ATMega8 is a bit more involved:<br /><ol><li>Grab your breadboard, a 5 Volt Regulator, a power supply, a header for the programmer, the programmer, an LED, lots of wires, and of course, the microcontroller.</li><li>Wire up the regulator to your power supply so you have a nice steady 5V.<br /></li><li>Look up and print out or draw the pin diagram for the ATMega8. Here it is:</li><li>determine which pins from the ATMega8 connect to which pins on the header, and wire it up.</li><li>Don't forget the LED.</li><li>On your computer, set up avr-gcc and avrdude</li><li>Get a program for the blinky thing and preferably a Makefile. You don't necessarily have to write this one either, but you do have to locate it.<br /></li><li>Make it.</li><li>Connect the header to your computer.</li><li>Try to upload the code.</li><li>If it fails, go back and figure out where things went wrong. A second pair of eyes often helps here.<br /></li><li>Admire the blinky light.<br /></li></ol>This is not to say programming a microcontroller is hard or inaccessible - it's not, especially in the company of helpful and more experienced people. It did make me appreciate the relative simplicity of the Arduino, but not everybody can spring for a ~$30 a shot Arduino. ATMega chips are cheap. You can potentially do a lot for a lot less money once you've jumped this hurdle (the programmers are a non-trivial initial cost, but with a group you can share resources). Also, the Arduino is more a prototyping tool, so often once you've figured something out with the Arduino, you can build a more permanent version using an ATMega chip programmer in this manner.<br /><br />Having identified a space and had a successful hands-on meeting, things are really taking off for the Bloomington hackerspace. Perhaps some fantastic product or great robot will be born there, or a Jobs/Wozniak style partnership will form. Whatever happens, hackerspaces are a really great idea, Bloomington is lucky to have one, and I look forward to future meetings.<br /><br />Some Resources:<br /><br /><a href="http://itp.nyu.edu/physcomp/Tutorials/AVRCProgramming-Programmer">Tutorial on AVR programming</a> with pictures at the Physical Computing at ITP site.<br /><br /><a href="http://arduino.cc/en/Main/HomePage">Arduino Home Page</a><br /><br /><a href="http://www.sparkfun.com/commerce/categories.php">Sparkfun</a> is a good source of electronics<br /><br /><a href="http://adafruit.com/">Adafruit</a> is a good source for kits (including the MeggyJr)Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com1tag:blogger.com,1999:blog-4520295461512667639.post-55880136591797127402009-07-26T09:07:00.000-07:002009-09-04T18:32:54.519-07:00Hay-O! NSFW comic strip re: Key-Value storesHow do I query the database? - Click thru for the comic - uses the F-word, so if that offends you, now's the time to f-off.<br /><br /><a href="http://highscalability.com/nsfw-hilarious-fault-tolerance-cartoon">How do I query the database?</a><br /><br />This is from the <a href="http://highscalability.com/">highscalability</a> site, who have been doing a fine job chronicling the revolution, such as it is.Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-55634267340941096172009-07-05T13:01:00.000-07:002009-07-09T12:31:40.858-07:00When you know what you're after and you have to scale: distributed key-value storesLast time we talked about key/value databases like Berkeley DB and more recent variants like the Tokyo Tyrant. On the one (very small) end, these can make for really nice, in process datastores. On the other end, for very very large databases with high performance and scaling needs, these key-value stores have found a niche as well.<br /><br /><span style="font-weight: bold;font-size:130%;" >Do you really need mad scaling capability?</span><br /><br />It's probably not the case that your political blog needs to scale to serve millions of users, even if you have some readers who are not your relatives or friends, which would already place your blog in the top 10% of blogs. Additionally, although '<a href="http://www.simple-talk.com/sql/performance/sql-server-performance-crib-sheet/">we're not building Amazon.com</a>' is sometimes used as an excuse for neglecting performance considerations, it is really safe to say you are not building Amazon.com. Your needs are likely different. Ted Dziubia has covered this nicely in his blog post: <a href="http://teddziuba.com/2008/04/im-going-to-scale-my-foot-up-y.html">'I'm going to scale my foot up your ass</a>'.<br /><br /><span style="font-weight: bold;font-size:130%;" >So why bother talking about it at all, then?</span><br /><br />Academic interest. The pursuit of general well-roundedness. Boredom with writing for the more loosey goosey blog mentioned in my intro post. Perhaps I'm turning into one of the clowns I knew 10 years ago who always was installing the latest version of Red Hat, but never was in fact using Red Hat. I hope not. Also, who knows, you aren't building Amazon.com, but you may end up at a place using these things some day, or more likely, you may be using such technology via the much beloved 'cloud'.<span style="font-weight: bold;font-size:130%;" ><br /><br />Amazon's Dynamo</span><br /><br />The people who actually were building Amazon.com came up with a data storage system called Dynamo. If you'd like to read a paper describing it, from the source, you can download the <a href="http://www.google.com/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Fs3.amazonaws.com%2FAllThingsDistributed%2Fsosp%2Famazon-dynamo-sosp2007.pdf&ei=egpRSrzpEouCNMmQ6PUP&usg=AFQjCNEpBjuspsc5JvGcLtzw39GGRN-chA&sig2=jJUWwWfHPy_W0GQ-BhVD9A">pdf</a>.<br /><br />According to the paper, many of Amazon's services work just fine with a key-value store and don't necessarily need a relational database schema or flexible, declarative rather than imperative query language like SQL. This makes sense as Amazon's system is doing things like looking up products by key, storing shopping carts according to keys for customers, etc and so on. The really big goal, again, is scaling and efficiency, and according to the paper, systems with ACID properties tend to suffer where availability is concerned (thanks to locking needs and so forth - the thought of handling locks across hundreds or thousands of commodity servers in multiple data centers is headache inducing). It's said that you have to pick at most two from reliability, availability and consistency. Amazon trades consistency for availability and reliability (resiliance in the face of node failure) where needed.<br /><br /><span style="font-weight: bold;font-size:130%;" >Eventual Consistency</span><br /><br />Consistency is not completely thrown out the window. Dynamo has a property called 'Eventual Consistency'. All updates 'eventually' reach all nodes. High write availability is a goal of the system, which is easy enough to understand - forcing a user to wait until all nodes know that 'Infinite Jest' has been added to the shopping cart would be a good way to lose customers. There will be inconsistencies, but resolution of the inconsistencies is pushed off for reads to handle.<br /><br />The next question to address is whether the data store or the application is supposed to handle resolution. The author of an application (ideally) has knowledge of the data and how it is used, and would be perhaps best qualified to determine a resolution strategy. On the other hand, this sort of micro-management is a recipe for inconsistency across applications and may not be the best use of developer time.<br /><br />Dynamo stamps updates with something called a vector clock (while it'd be nice to stamp updates with a time stamp from a universal clock, unfortunately a universal clock doesn't exist in practice). The vector clocks can be used to determine which update is the latest. This is discussed in more detail in a post on <a href="http://hnr.dnsalias.net/wordpress/2008/08/consistency-and-availability-in-amazons-dynamo/">Paper Trail</a>. To cram the idea into a sentence, the dimensions of the vector are the servers, and the values of the dimensions are from an internal clock (or event counter) maintained by the server in question.<br /><br />Usually this is sufficient to determine which version is the latest, and this is referred to as syntactic reconciliation. When this can't be done, and the application has to handle it (for example, the contents of 2 versions of a cart might be merged), it's called semantic reconciliation. Feel free to use those terms to show off, but whatever you do, don't spell it 'symantec reconciliation', or people will laugh at you behind your back, much like we laughed at the pompous consultant who did that in one of his masterful 'roadmaps'.<br /><br /><span style="font-weight: bold;font-size:130%;" >Reliability</span><br /><br />One of the goals was to develop a system where nodes can be added as needed and failures can be handled smoothly. Also, the possibility of having nodes of various power needed to be factored in. To that end, an Amazon-ized version of consistent hashing (a really good write-up on consistent hashing by somebody who's used it in the field may be found <a href="http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/">here</a>) is used to partition the system, and instead of considering all nodes equal, virtual nodes are used - more powerful servers can be responsible for more virtual nodes.<br /><br />This being a key/value data store, and there being a hash function that's used to map the key to a 128-bit value, when we say 'partition the system', we're partitioning the key space. A number of virtual nodes (the 'preference list') are responsible for a range of keys, and that data is replicated across the first N (a parameter that's configured per-instance) nodes. N < (number of nodes a key maps to), to account for failures. Puts and gets are handled by the first of the top N nodes in the preference list. To maintain consistency, for a read, at least R nodes have to participate. For a read, W nodes. If R + W > N, congratulations, you have a 'sloppy' quorum system. R, W, and N are user configurable, with a typical choices being N = 3, R = 2, W = 2.<br /><br />In Amazon's case, the data is replicated across datacenters, for big-time fault tolerance. So again, a Mom and Pop shop is probably not going to have multiple datacenters, but even a Mom and Pop shop will be able to enjoy this kind of availability as cloud computing becomes more available and mainstream. Unfortunately this deprives the IT guy of the opportunity to swing his dick around bragging about his datacenters. You win some, you lose some.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Where does Berkeley DB fit in, again?</span></span><br /><br />According to the paper, different storage engines can be plugged in to this framework. The engines include Berkeley Database (BDB) Transactional Data Store, BDB Java Edition, MySQL, and an in-memory buffer with persistent backing store. Berkeley DB Transactional Data Store is the most common. Dynamo-esque systems like LinkedIn's Voldemort also provide this sort of plug-in framework.<br /><br /><span style="font-weight: bold;font-size:130%;" >What about security?</span><br /><br />It's assumed all of this is happening within an already secure, trusted environment. Only systems inside of Amazon are accessing this directly.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">So that's it?</span></span><br /><br />Obviously that's not all there is to Dynamo, and even the paper is an overview. It is a nice jumping off point when considering related #nosql options, especially considering that there are a number of Dynamo-like systems out there.<br /><br />A shortcoming of these systems is that they're not particulary good for reporting applications or ad-hoc querying. This is fine and dandy, since that's not primarily what they're designed to do, but in the future we'll talk about Map Reduce and other tools used to that end.<br /><br />That is all for now.Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-71335013133747236442009-06-07T17:45:00.001-07:002009-06-07T18:45:13.803-07:00When You Know Exactly What You're After: Key-Value Databases<span style="font-size:130%;"><span style="font-weight: bold;">In the beginning...</span></span><br /><br />Back in 1979, Ken Thompson, a programming deity responsible for Unix (and, with Dennis Ritchie, one of the original Unix '<a href="http://en.wikipedia.org/wiki/File:Ken_n_dennis.jpg">graybeards</a>') and the B language (predecessor to the more familiar C), wrote a program named, in typical UNIX terseness, 'dbm'. This was short for 'database manager', which was a nice thing to have on a computer then and now. Essentially, it stored data identified by keys in a file. This sort of data structure is known in Python circles as a dictionary, to Perl programmers as (way back when) an associative array or (more recently) a hash, and in Java and it's smarter little brother C#, a Map. It makes for a better way of storing or persisting data (and accessing it) than using a generic flatfile approach. What the user doesn't have is a nice declarative interface for pulling data out via queries specifying conditions of interest (date ranges, department, and yadda yadda yadda). If you don't know the key, tough luck.<br /><br />DBM is still here 30 years later, and by here I mean here on my Mac. If I type 'man dbm' at the prompt, I get the man page for it, and so will you, if you are a Mac or Linux user. Although some <a href="http://everything2.com/index.pl?node=BSD+Code+in+Windows">BSD code made it's way into Microsoft code</a>, dbm didn't, so Windows users won't have it. Not that that is a terrible loss in this day and age.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Let a Thousand dbm, Jrs Bloom</span></span><br /><br />As is often the case, dbm spawned off a number of successors, a notable one being the Berkeley Database created at Berkeley as part of the 1986-1994 effort to move from BSD 4.3 to 4.4, and also to move away from AT&T code. In 1996 Netscape asked for some extensions for their needs (for an LDAP server and for their browser) which resulted in the formation of the Sleepycat software company, who maintained and sold the embedded database through 2006, when they were acquired by Oracle (recent acquirers of Sun, and, with it, another well-known and popular database, MySQL). A visit to the official site these days reveals almost nothing useful, in addition to being stripped of the colorful name (it's now '<a href="http://www.oracle.com/database/berkeley-db/db/index.html">Oracle Berkely DB</a>' the site is the sort of scrubbed marketing enterprisese Oracle does really well). It is still a viable embedded (no server) database, used by, among other tools OpenLDAP and the source control tool Subversion (the open-source successor to the Netscape browser, Firefox, now uses SQLite to store bookmarks, history, and so on).<br /><br />Berkeley DB, in addition to being small (the library is about ~300K), fast, ACID compliant, and scalable, gives the user 4 storage options: Hash (as with the old style dbm, for 'I know what I'm looking for' storage), B-Tree (good for searching ranges), persistent Queue and RecNo (record numbers are the keys, and these are generated automatically). Also interesting is that a developer has the option of turning features like locking or transactions off or on as needed. In general, the prevailing value seems to be giving a developer control over a datastore without a lot of administration overhead, allowing the developer to optimize data access or shoot himself in the foot, depending on the choices she makes (I mixed up the developer's gender there. It happens.)<br /><br />One interesting thing I discovered in my investigations of Berkeley DB is the way joins are handled. Joins are very familiar to relational database users, but it's not obvious how one would join tables in a key-value store. First off, Berkeley DB has this thing called the 'secondary index', which gives one a way of accessing data using something other than the key (removing that limitation). For example, suppose you have an employee database, and you want to find employees in a given department. Rather than going through every record in the database, you'd now have the option of looking up employees according to department.<br /><br />Using secondary indices, it's possible to join tables. In the best <a href="http://pybsddb.sourceforge.net/reftoc.html">Berkely DB reference</a> I found, that's done like this (the example below is lifted from that source. I give attribution anyhow):<br /><br /><p>Consider the following three databases: </p>personnel<ul type="disc"><li>key = SSN </li><li>data = record containing name, address, phone number, job title </li></ul> lastname<ul type="disc"><li>key = lastname </li><li>data = SSN </li></ul> jobs<ul type="disc"><li>key = job title </li><li>data = SSN </li></ul> <p>Consider the following query: </p><blockquote>Return the personnel records of all people named smith with the job<br />title manager.</blockquote> <p>This query finds are all the records in the primary database (personnel) for whom the criteria <b>lastname=smith and job title=manager</b> is true. </p><p>Assume that all databases have been properly opened and have the handles: pers_db, name_db, job_db. We also assume that we have an active transaction to which the handle txn refers. </p><pre>DBC *name_curs, *job_curs, *join_curs;<br />DBC *carray[3];<br />DBT key, data;<br />int ret, tret;<br /><p>name_curs = NULL;<br />job_curs = NULL;<br />memset(&key, 0, sizeof(key));<br />memset(&data, 0, sizeof(data));<br /></p><p><br />if ((ret =<br />name_db->cursor(name_db, txn, &name_curs, 0)) != 0)<br />goto err;<br />key.data = "smith";<br />key.size = sizeof("smith");<br />if ((ret =<br />name_curs->c_get(name_curs, &key, &data, DB_SET)) != 0)<br />goto err;<br /></p><p><br />if ((ret = job_db->cursor(job_db, txn, &job_curs, 0)) != 0)<br />goto err;<br />key.data = "manager";<br />key.size = sizeof("manager");<br />if ((ret =<br />job_curs->c_get(job_curs, &key, &data, DB_SET)) != 0)<br />goto err;<br /></p><p><br />carray[0] = name_curs;<br />carray[1] = job_curs;<br />carray[2] = NULL;<br /></p><p><br />if ((ret =<br />pers_db->join(pers_db, carray, &join_curs, 0)) != 0)<br />goto err;<br />while ((ret =<br />join_curs->c_get(join_curs, &key, &data, 0)) == 0) {<br />/* Process record returned in key/data. */<br />}<br /></p><p><br />/*<br />* If we exited the loop because we ran out of records,<br />* then it has completed successfully.<br />*/<br />if (ret == DB_NOTFOUND)<br />ret = 0;<br /></p><p><br />err:<br />if (join_curs != NULL &&<br />(tret = join_curs->c_close(join_curs)) != 0 && ret == 0)<br />ret = tret;<br />if (name_curs != NULL &&<br />(tret = name_curs->c_close(name_curs)) != 0 && ret == 0)<br />ret = tret;<br />if (job_curs != NULL &&<br />(tret = job_curs->c_close(job_curs)) != 0 && ret == 0)<br />ret = tret;<br /></p><p><br />return (ret);</p><p style="font-family:arial;"><span style="font-size:100%;"><br /></span></p></pre>Simple, right? This brings up another point: all the major scripting languages have modules or libraries allowing a developer to accomplish this in a much briefer and more straightforward<br />manner. Life is too short to program in C when you don't need to.<br /><p style="font-family:arial;"><span style="font-size:100%;"><span style="font-weight: bold;font-size:130%;" >A Product Of Fine Japanese Engineering</span><br /></span></p><p style="font-family:arial;"><span style="font-size:100%;">Berkeley DB, like all successful software packages, has a number of offshoots, and a particularly interesting one is <a href="http://www.scribd.com/doc/12016121/Tokyo-Cabinet-and-Tokyo-Tyrant-Presentation">Tokyo Cabinet</a>, which can be an embedded database, or one can use the Tokyo Tyrant server for remote access. Also available: Tokyo Dystopia for full text search. Watch out for future releases, Tokyo Epidemic, Tokyo Martial Law, and Tokyo Zombie Apocalypse.</span></p><p face="arial">Tokyo Cabinet was written by Mikio Hirabayashi whilst working for <a href="http://mixi.co.jp/">mixi.inc</a> (apparently, it's like Facebook). Hirabayashi is also known for QDBM (yes, part of the DBM family). TC takes some of the ideas in Berkeley DB, and takes them further. Whereas your dbms and Berkeley DBs are primarily APIs for accessing local files, TC ups the ante with the aforementioned Tyrant for remote access (also available: replication, transaction logs, and hot backup). There are also a number of options for your underlying storage (as with Berkeley DB): Hash, B-Tree, Fixed-Length, and an option distinguishing it from Berkeley DB: the Table Engine, which mimics an RDBMS, but in a schema-less way. It is somewhat like CouchDB, which we'll eventually get to. The developer can declare indexes on columns, and query the Table in a SQLesque manner. While you wouldn't want to use it in a situation where a true RDBMS is what you need, this is definitely handy.</p><p face="arial">Tokyo Cabinet has developed a loyal following, who praise its speed, flexibility, and ease of use. It also has its <a href="http://www.ioremap.net/node/233">detractors</a>. There are bindings for numerous languages, but C, Perl, Ruby, Java and Lua appear to be best: in research I found people complaining that the pytc module for Python lacks support for some features.</p><p face="arial">As Tokyo Cabinet has developed some momentum, is fairly well established, and is interesting, I plan to dig into it further. Still, in the next installment, we will cover other databases.</p><p face="arial">Some fun Tokyo Cabinet links:</p><p face="arial"><a href="http://tokyocabinet.sourceforge.net/spex-en.html">The Online Manual</a></p><p face="arial"><a href="http://randomfoo.net/2009/04/20/some-notes-on-distributed-key-stores">Another Person's Notes on Distributed Key Stores</a></p><p face="arial"><a href="http://tokyocabinet.sourceforge.net/">The Sourceforge Project Page</a><br /></p>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-63901933137205189512009-05-20T17:31:00.000-07:002009-05-20T20:19:00.346-07:00Up next: a survey of the 9 bazillion databases in the world<span style="font-weight: bold;">Something's Happening But You Don't Know What It Is, Do you, Mr. Jones?</span><br /><br />High on the list of a technology professional's worst fears is becoming out of touch with technology and being left behind. Like death, it's going to happen one day no matter what you do, but as with death, one can 'rage against the dying of the light' and make every effort to stave it off as long as possible.<br /><br />I have been a database guy for a number of years, either as a developer using the database, or one of the guys designing the database, or even sometimes setting up and acting as an administrator for database servers. Pretty much every database system I've ever dealt with was an RDBMS, in other words, it followed the relational model outlined by E.F. Codd in 1970, and misunderstood by the majority of computer type professionals ever since.<br /><br />Monstrously large companies like Amazon and Google with monstrously large data sets and extreme scaling needs have in recent years run up against the 'ceiling' of what RDBMS's can do, and in some cases they are willing to trade off some of the letters in ACID to meet other needs. Their work is starting to make its way into the outside world: anybody can read the <a href="http://labs.google.com/papers/bigtable.html">BigTable</a> paper, Google has opened up Google App Engine (as mentioned in previous entries), and implementations like the open-source Hadoop have made BigTable-like storage available to anyone w/ the intellectual and budgetary resources to take it on.<br /><br />At the other extreme are the very tiny and lightweight databases like SQLite, for cases where a full-blown database system is overkill, but having the option of using a more-or-less standard interface to your data is great to have.<br /><br /><span style="font-weight: bold;">So You Put 2 and 2 together, and got 5?</span><br /><br />In future entries I intend to do more of a deep dive into these alternative options to boring old suit-and-tie, plastic-fantastic-wall-street-scene databases like SQL Server, Oracle, and DB2. But first a few cautionary words.<br /><br />To predict the death of the relational model is likely premature and ill-advised as well. As I mentioned earlier, and have observed over the past 15 or so years, many (almost all?) IT Professionals manage to go from 'hello world' to the executive suite without knowing or understanding much of anything about the databases that, you know, store and access the data. The thing distinguishing your business from every other business in the world (although maybe you also put cool stickers on your servers). A programmer might learn to regurgitate definitions of first, second and third normal form, and know the difference between an inner and outer join, and 'Congratulations! You got the job, kid.' (it worked for me at least once in my more ignorant days). A lot of times, 'I'm running into limitations in the relational model' can be translated as 'Huh. I didn't know you could do it that way.'<br /><br />Outside the walls of the IT ivory basement, the situation is even worse. Not particularly rigorous, but quite prolific writer Robert X. Cringely recently predicted the death of SQL in <a href="http://www.cringely.com/2009/05/the-sequel-dilemma/">this column</a>.<br /><br />There are some cringe-worthy howlers within:<br /><ul><li>It's SQL, not Sequel (but maybe he was just being clever)</li><li>SQL is the language, not the database (and hard-core relational theorists will talk yr ear off about where SQL diverges from the relational model, if you aren't careful)</li><li>Given the fumbling, Keystone Kops way a lot of shops handle the 'you install it, turn it on, and it runs itself' SQL Server, do you really want to turn something as game-changing as BigTable loose on them? That'd be like teaching a kindergarten class how to make Greek Fire.<br /></li></ul>All that said, going outside the playground perimeter of your day job and trying to learn completely new things is a good way to keep your brain from freezing, and this stuff is just interesting (to me) anyway. So next time, more about these new (or not so new) database systems that will preserve our way of life, eliminate the need for people to do tedious work of any kind, and bring about Ray Kurzweil's fabled Singularity.<br /><br />As @iamdiddy would say: LET'S GOOOOOOOOO!!!1!Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-65757434500335538942009-05-04T18:52:00.001-07:002009-05-04T19:11:30.044-07:00I guarantee you: no more music by the suckas.As mentioned earlier, I am a fan of blip.fm. I right now have 364 listeners, which is not shabby but not necessarily fantastic, either (<a href="http://blip.fm/SoundSystemSDC">I'm this guy</a>). Blip makes it easy to add people you follow: specifically, if you blip The Gap Band, you're presented with a list of 5 or so people who also blipped The Gap Band, and with one click you can add them all.<br /><br />This is not necessarily a bad idea, but these people add up fast, and horrendous musical whiplash can result as you find out somebody who blipped Sigur Ros once really really loves an abomination like 80s era Aerosmith. Even worse, a lot of these people won't be bothered to reciprocate: they'll have 5,000 listeners, but only 74 favorites. Perhaps they're discerning, but it just seems rude to me, and annoying.<br /><br />Anyhow, I had accumulated 500+ favorite DJs, and many of them were deadbeats who weren't reciprocating. So with the handy <a href="http://api.blip.fm/">blip.fm API</a>, I wiped them all out like in that revenge montage from the first Godfather movie. Very, very minimal Python was required:<br /><pre>def getNoRecip(bconn, username, length):<br /> lisses = bconn.user_getListeners(username,0,length)<br /> faves = bconn.user_getFavoriteDJs(username,0,length)<br /> lisNames = [l["urlName"] for l in lisses]<br /> favNames = [f["urlName"] for f in faves]<br /> noRecip = [f for f in favNames if f not in lisNames]<br /> noRecip.sort()<br /> youNoRecip = [l for l in lisNames if l not in favNames]<br /> youNoRecip.sort()<br /> return (noRecip, youNoRecip)<br /><br />if __name__ == "__main__":<br /> deaders = open("killed.log", "a")<br /> deaders.write("Getting ready to wax some chumps.\n")<br /> # need REAL password<br /> blipConn = BlipConnection(username = 'SoundSystemSDC',<br /> password='********')<br /> (dudes, youDiss) = getNoRecip(blipConn,<br /> 'SoundSystemSDC',<br /> 1000)<br /> for dude in dudes:<br /> print "Killin' wack punk:\t%\n" % dude<br /> blipConn.favorite_removeDJ(dude)<br /> time.sleep(5)<br /> deaders.write("Killed: %s\n" % dude)<br /> print "That's %i shifty dudes." % len(dudes)<br /> deaders.write("killed %s all told." % len(dudes))<br /> deaders.close()<br /></pre>I put the sleep(5) in there to be nice, although it really wasn't that many requests all told.<br /><br />It was quick and dirty, and kind of handy. Now it'd be nice to have a Greasemonkey plugin to filter out Blips from Aerosmith (and other unfavorite artists).Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-60065966028205452742009-04-16T18:40:00.000-07:002009-04-17T06:12:59.770-07:00Ignite Bloomington Recap (4-16-2009)<a href="http://ignite.oreilly.com/">Ignite </a>is a series of events sponsored by O'Reilly, the people that bring us the wonderful tech books with the animals on the cover. The idea behind it is simple: you have 5 minutes, 15 seconds per slide. There have been events in cities like Seattle, Portland, Paris, NYC, and tonight, Bloomington hosted its Ignite event at the Convention Center (the same place where the Chocolate Festival is held). As a loyal Bloomingtonian, I was confident my town would represent itself well, and it did. Here's a quick recap.<br /><br />1. Scotch Whisky by Jenn Hileman<br /><br />Jenn gave the audience an outline on the history of Scotch Whisky, the varieties, the various regions where it's produced, and recommendations on how best to enjoy it.<br /><br />2. My 12-Step Recovery from Corporate Communications by Christian Briggs<br /><br />Christian recounted the sordid story of his slide into Corporate Communications, from gateway drugs like Jack Welch's books, to harder stuff by Goebbels and Frederick Winslow Taylor. Eventually he came to realize he had a problem and needed to let go and let God, or let Twitter, in this case.<br /><br />3. Kshitiz Anand on Research Strategy: Design For Social Impact<br /><br />Kshitiz shared the lessons he learned from research in rural India. The slides were pictures of people from rural India and were the most interesting slides of the show, as they were the least 'Powerpointy'.<br /><br />4. Mark Krenz on Bloomingpedia<br /><br />Mark's presentation was both an introduction to <a href="http://bloomingpedia.org/wiki/Bloomingpedia">Bloomingpedia</a> and a call to action. Mark talked about Bloomingpedia's growth and success so far, and invited all in attendance to register for accounts and contribute by adding or editing articles, and adding more photographs.<br /><br />(5 minute break for snacks, beer, whatever)<br /><br />5. Kevin Makice on Mashups<br /><br />Kevin calls on local government, newspapers, and other sources of data to set that data free, that it may be mashed up, sliced and diced, visualized and analyzed. Also, June is 'Mashup Month', and again the audience was called upon to act: to go forth and create amazing mashups that reveal interesting facts about our town and community.<br /><br />6. Tall Steve Volan - 'What have you got to say for yourself?'<br /><br />Steve presented, in rhyme, an idea for a new athletic event: the Nonathlon. Competitors make 9 speeches, each 3 minutes in length, to an audience of at least 3. The speeches are speeches any human being leading a full life will be called upon to give at some point: a toast, a eulogy, a song, a poem, several others I can't remember at this time, and if I were more clever, this section would rhyme.<br /><br />7. Graffiti, by a guy from Sproutbox<br /><br />He is not a graffiti artist, but he loves the art form. <a href="http://www.woostercollective.com/">Lots of people</a> love graffiti, aka <a href="http://www.mentalfloss.com/blogs/archives/4379">the fun crime</a>. He gave us a brief history going back to hieroglyphics, explained 'Kilroy' of 'Kilroy was here' worked in bomb QA during WWII (Kilroy was here = this town was bombed). In an entertaining audience participation bit, he invited us to decipher several tags - almost nobody could. Sproutbox had a really nice tag designed by a local artist.<br /><br />8. Using technology for Social Justice by Geoff<br /><br />Another presentation that both informed and called the interested to action: Geoff proposes using recycled computers and free software (Ubuntu Studio) to build a media lab in Detroit. This will happen over 3 days as part of the 'Allied Media Conference' in July. He also gave examples of effective uses of technology in the interest of Social Justice like <a href="http://www.elcilantro.org/">elcilantro.org</a>, a site focusing on immigration rights and cleaner air and space.<br /><br />9. Trotzke of Sproutbox on 'Bursting the Bubble'<br /><br />Trotzke has founded 2 startups at times coinciding with the economy going into the toilet. He draws inspiration from the words of the Wilson Phillips hit 'Hold On' - 'thingsll go your way if you hold on for one more day'. He believes it's a great time to start a startup (there is a lot of great talent available) and 'called bullshit' on the concept of non-paying customers (it needed to be called bullshit on - Trotzke classifies the non-payers as 'prospects' - a more accurate label).<br /><br />That was that for the official program. Several really great O'Reilly books were given away, including <a href="http://www.amazon.com/Twitter-API-Running-Learn-Applications/dp/0596154615/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1239934659&sr=8-1">Twitter API: Up and Running</a> by Bloomington's own Kevin Makice (also a presenter as alert readers will remember). Unfortunately, none of the books were given away to ME. An informal question and answer session followed.<br /><br />All in all, the event was a success. 'Ignite' is a great concept - if it visits your town, check it out.Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com2tag:blogger.com,1999:blog-4520295461512667639.post-88453753631412173172009-03-20T18:40:00.000-07:002009-03-20T18:55:51.560-07:00ircontroller - super simple module for using the MacBook remote from PythonIn the event you have a MacBook, and would like to write a Python program that you can control via the nice little remote controllers that come with the MacBook, you might find ircontroller handy.<br /><br />It also gave me a chance to put something up on Google code. I had worked with SourceForge way back in the day, and being a rather Google-centric guy of late, Google code seemed like the place to go.<br /><br />You'd think there would already be a module like this about, but in my searching the best thing I could find was the code for the iremoted 'daemon'. Converting it to a Python extension was relatively straightforward. The only part that caused pain was determining how to get distutils to link in the IOKit and Carbon frameworks. I found a blog post by somebody who'd already dealt with that pain, so that was the end of that.<br /><br />Anyhow the setup.py file is super simple, and (once you know the quirks) way preferable to mucking about with a makefile.<br /><pre><span style="font-size:85%;">from distutils.core import setup, Extension<br />setup(name='ircontroller',<br /> version='1.0',<br /> ext_modules=[Extension('ircontroller', ['ircontroller.c'],<br /> extra_link_args=['-framework', 'IOKit', '-framework','Carbon'])])</span><br /></pre>Needless to say, this won't build on Windows (or Linux either, or Plan 9, or Solaris, or whatever).<br /><br /><a href="http://code.google.com/p/ircontroller/">Here ya go.</a>Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-4358368530248405462009-02-15T13:54:00.000-08:002009-02-15T14:38:14.633-08:00Google App Engine 2, Conclusion of Foray #1 into the cloud.In the previous post I mentioned several limitations of Google App Engine. In the time that's passed since then (less than a week), Google has announced that several of these restrictions are no more with the<a href="http://googleappengine.blogspot.com/2009/02/sdk-version-119-released.html"> release of 1.1.9</a>. Specifically:<br /><ul><li>It is now permissible to use <a href="http://www.python.org/doc/2.5.2/lib/module-urllib.html">urllib</a>, <a href="http://www.python.org/doc/2.5.2/lib/module-urllib2.html">urllib2</a> or <a href="http://www.python.org/doc/2.5.2/lib/module-httplib.html">httplib </a> to make HTTP requests. (previously users were restricted to using urlfetch. Python programmers will be familiar w/ urllib, urllib2, and etc, and welcome this (they won't have to revise modules that use urllib2, as I did with my Blip API wrapper).</li><li>The dreaded 10-second deadline for a request has been <a href="http://googleappengine.blogspot.com/2009/02/skys-almost-limit-high-cpu-is-no-more.html">expanded to 30 seconds</a>. While it's still not good form (actually, it's horrible form) to keep a user waiting for 30 seconds, this prevents errors if a website or API you are querying behind the scenes is slow.</li><li>No more 'high CPU request' warnings. Note that just as George Carlin once observed that buying a 'safe car' doesn't excuse you from the responsibility of learning how to drive, it's also true that this is not Google's way of saying 'to hell with everything, write wasteful code now'</li><li>The old 1MB limit on requests and responses was raised to 10MB</li></ul>The take-away point here is that Google listens to user feedback (up to a point: Ruby/PHP/etc users can still suck it, as far as Google App Engine goes), which is encouraging to those investing time and effort in learning the platform.<br /><br />Unfortunately I ran into some other issues with my application. While my restructuring (using naive, wrote it myself Javascript b/c I wasn't yet familiar with jQuery or the like) led to something much more robust, and the addition of a simple progress bar made waiting for Blip to respond more tolerable, in testing I ran into an issue with the API failing on a call to pull back certain users' 'blips'. Further investigation revealed a 500 error was being returned from the Blip API due to certain characters being present in the string for the blip.<br /><br />The good people of Blip were, as has always been my experience, quick to respond, and a fix is on the way, but it's not in place yet. As I mentioned in the previous post, the API is still private beta, so this is more a 'shame on me' matter, but as also mentioned in the previous post, this exercise is mostly an excuse to play around with Python and Google App Engine in order to learn more about it and generally 'keep brain from freezing', and as far as that goes, success was had. We'll re-visit it once Blip.fm has a fix in place.<br /><br />For now, some good resources I've found for learning about the Google App Engine follow.<br /><br /><a href="http://www.webappwednesday.com/">Web App Wednesday</a> - Michael Bernstein puts out a new web app, plus the code, every week.<br /><br /><a href="http://blog.giftag.com/2009/01/26/giftaggoogle-app-engine-case-study/">Giftag</a> - BestBuy used Google App Engine to put together Giftag, a gift registry add-on for Firefox and Explorer. The blog is a good source of GAE info.<br /><br /><a href="http://blog.appenginefan.com/">App Engine Fan</a> - This guy has been experimenting with GAE since it was first released, recording the results of his efforts in this blog.<br /><br /><a href="http://code.google.com/p/google-app-engine-samples/source/checkout">App Engine Samples</a> - code samples from Google itself.Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-51111099732619289022009-02-09T18:18:00.000-08:002009-02-09T18:44:51.928-08:00Google App Engine, or How I learned to Stop Worrying and Love Javascript (Part I)It has been over a week since my last post, so things are not exactly getting off to a rip-roaring start here. Rather than dwell on the past, though, here's an entry on some experimenting I've done recently with Google App Engine.<br /><br />There is much hype about 'the cloud', and like a lot of hype, most of it is not necessarily worth the paper it is or isn't printed on. However, as a programmer and not a computer guy (to some of you, this will make sense), the idea of abstracting away the server provisioning process is not without appeal. As a tightwad, the idea of 'only paying for what you use' is not without appeal. Finally, as an extreme tightwad, the idea of free (which Google App Engine is, up to 10 apps) sold me. I'm not starting a business here, I'm just getting my feet wet.<br /><br />As far as what to do, I am a huge fan of the website <a href="http://blip.fm/">blip.fm</a>, (the twitter-length pitch:'It's like twitter, but for music') and not long ago they released an <a href="http://api.blip.fm/">API</a>. It is currently in private beta, where it has been for a while now. At any rate, I got my keys, re-wrote the sample PHP wrapper for the API in Python, and I was ready to go. At least I thought I was.<br /><br />At this point I would like to praise the <a href="http://googlemac.blogspot.com/2008/05/app-engine-launcher-for-mac-os-x.html">Google App Engine Launcher</a> for MacOSX (and, indirectly, praise MacOSX). This was put together by John Grabowski at Google in his 20% time, so apparently that is not a Google urban legend like the one about Sergey or Larry sometimes give an underperformer a brand new Prius under the sole condition that they 'drive away, far away'. In this case using the Launcher simplified the process of getting something up and running using the development server quickly. It's very intuitive, and the interactive console is handy.<br /><br /><span style="font-weight: bold;font-family:lucida grande;font-size:130%;" >Not so fast</span><span style="font-size:130%;"><span style="font-weight: bold;font-family:lucida grande;" >, pal</span></span><br /><br />After a bit of hacking I had something fairly simple up and running which would grab info for a user via the Blip API, then show the user via an intensity map what the global distribution of 'listeners' and 'favorites' is. For this I used the lovely <a href="http://code.google.com/apis/visualization/">Visualization API</a> from Google. It also showed who you are following that is not following you, which is essential info not easily obtainable via Blip's website.<br /><br />The problem I encountered off the bat was that the queries against the API take time, and there really isn't a good way to get just the subset of info you want at this time. On the development server, requests could take awhile, especially for users with thousands of listeners (such people exist).<br /><br />Curious as to how I'd fare on the real thing, I deployed (a one-click operation w/ the GAE Launcher) the app to appspot.com. At this point all hell broke loose.<br /><br /><span style="font-weight: bold;font-size:130%;" ><span style="font-family:lucida grande;">Read the fine print</span></span><br /><br />In turns out, amongst the other limitations of GAE (for more Beavis and Butthead immature laffs, check out the Google App Engine Backup and Restore tool, aka <a href="http://aralbalkan.com/1784">GAEBAR</a>) you may have heard about (no background/batch processes, no mischief with sockets, etc) there are a couple tight limitations I should have looked into before deploying:<br /><ul><li>If a call to urlfetch takes more than 5 seconds, you lose, it times out.</li><li>If your request takes more than 10 seconds, you lose: 'DeadlineExceededError'.</li></ul>(It is worth noting here that according to <a href="http://googleappengine.blogspot.com/2009/02/roadmap-update.html">this release</a> from Google today, some of these limitations will vanish in the next 6 months).<br /><br />In addition, there is a limit to CPU that can be consumed by a single request. So even in the event you can fetch your data quickly, if you do too much crunching per request, you are going to violate a quota and start getting errors (the specifics of this limit: a 'high CPU request would be one consuming 0.84 CPU seconds, with the CPU in this case being a 1.2 GHz Intel x86. You are allowed 2 of these per minute).<br /><br />Thus, I needed to factor in that there'd be a lot of retries going on, but I would not be doing those retries within a request. The inescapable conclusion was that I'd have to use the back end as a simple data store, and rely on Javascript on the front end to handle the retries, putting the pieces together, boiling down the data, and pumping out the results. Also, I'd obviously need a progress indicator to keep the poor end-user updated as things proceeded, rather than leave them hanging.<br /><br />At this point I will leave you, the reader, hanging, until next time when we get into the Javascript side of things in Part II.Stephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0tag:blogger.com,1999:blog-4520295461512667639.post-36290061677811665962009-01-31T14:34:00.000-08:002009-01-31T15:00:15.685-08:00Hello, WorldThis is the introductory, statement of purpose post for 'Steve's House Of Logic'. I am your host, Steve. I have been working in and around software development for 14 years, and I have been blogging for 7 years or so. The problem with my old blog is that it was unfocused, ranging from posts about Python to CD reviews to commentary on amusing cat videos on youTube and even occasional forays into the gutter that is political blogging. I realized I needed a blog that focused on the tech side of my existence, and this is it.<br /><br />My tech interests include but are not limited to these topics, all of which I hope to get to in time. A goal of this blog is to post with relative frequency, but to try to avoid content free fluff posts and mindless link propagation.<br /><br /><ul><li>All things Python</li><li>Google App Engine and 'Cloud' technologies</li><li>Databases, relational as well as new technologies (BigTable, Column-oriented databases)<br /></li><li>Robotics</li><li>The Arduino Platform</li><li>The Processing Language/Platform</li><li>The 9-million APIs of the Internet and Mashups<br /></li><li>The 'Semantic Web' (RDF, SPARQL, and so on)</li><li>Freebase (<a href="http://www.freebase.com/">the product from Metaweb</a>, not the drug) and their Acre environment</li><li>Functional Programming</li><li>Prolog<br /></li></ul>Upfront disclosure as to my biases, to save both myself and readers time:<br /><br />Microsoft: Nay<br />Open Source: Yay<br />Mac: Yay<br />Videoblogging/The proliferation of instructional videos: Eh.<br />vi: Eh.<br />Emacs: YayStephen Charlesworthhttp://www.blogger.com/profile/03296534563932233342noreply@blogger.com0