<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-4340896568676894885</atom:id><lastBuildDate>Thu, 08 Jul 2010 18:15:13 +0000</lastBuildDate><title>dho's random stuff</title><description></description><link>http://www.sitetronics.com/</link><managingEditor>devon.odell@gmail.com (dhobsd)</managingEditor><generator>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-4179252876198097348</guid><pubDate>Thu, 08 Jul 2010 12:23:00 +0000</pubDate><atom:updated>2010-07-08T08:38:29.625-04:00</atom:updated><title>Dear Baltimore Scum of the Earth</title><description>Dear Baltimore Scum of the Earth,&lt;br /&gt;&lt;br /&gt;Last night you broke into my car while I was in my favorite bar having a beer and a burger. I normally walk to the bar, because I feel like my car is safer behind my house. That, and I don't like driving after having excessive beer. Or any beer. You know, that whole illegal thing (not to mention unsafe). Besides, it's only 5 blocks or so, and I'm perfectly happy to walk that.&lt;br /&gt;&lt;br /&gt;I would like you to realize what kind of favor I did you. Not only did you have the extreme luck of having my car there, but you were actually correct in assuming that there was actually a GPS inside. Ignoring, for a moment, that the GPS was only worth about $80 new, you broke my window, which will cost me $100 to repair. Luckily for you, I also left a nice iPod Touch in the car for you. The theft of the iPod Touch (which has a password and no music that you'd like) brought your theft value above the value of damage, which somehow makes the theft less bad in my head. You're welcome for the other cool toy. Which, buy the way, is set up to have its interface in Dutch.&lt;br /&gt;&lt;br /&gt;So you thought you'd be comprehensive, but you are clearly missing a few screws up in your head. Let me point out a few flaws with your robbery:&lt;br /&gt;&lt;br /&gt;1) You left the iPod data cable. You took the car charger. You took the 1/8" M-M stereo cable. You left the data cable. Now not only are you not going to be able to use the iPod due to being locked out of it (and the fact that its interface is in Dutch, which you'll never navigate in a trillion years), you can't even get anything on it anyway.&lt;br /&gt;&lt;br /&gt;2) You took the small knife that was in my car. This knife was a POS and didn't lock. It had sentimental value, which is the only reason I kept it. You left the good knife.&lt;br /&gt;&lt;br /&gt;3) You stole the microfiber bag for my Oakleys. You did not steal my Oakleys. Why didn't you just leave the bag? They're not going to make your fake ones look cooler.&lt;br /&gt;&lt;br /&gt;4) The tennis racket, shoes, clothes, music, and other things that were too "high brow" for you and did not have a "quick turn around time" were all left. It's worth noting you could have made more money on those things than the iPod and GPS.&lt;br /&gt;&lt;br /&gt;5) If I had less restraint, I'd totally kick the shit out of you the next time I see you outside the bar. So would all of my friends in the bar. See, you are on camera. While I know the police won't actively look for you or know who you are, I will.&lt;br /&gt;&lt;br /&gt;Enjoy the stuff, miscreant detritus of the planet.&lt;br /&gt;&lt;br /&gt;Clearly you did all of this for your own gain, without considering the negative consequences it has on me. I have to subsidize your new toys. This is not the United States of DHO, and I am not a welfare check for you. Don't expect more subsidies. I have to spend around $400 or more to get all my stuff back. I can live with that, but it's still really, really annoying. Sometimes I wonder if your actions are dictated by some sarcastic deity. It really is uncanny how things like this happen as soon as I start telling people how awesome my life is going.&lt;br /&gt;&lt;br /&gt;Well, Deity, not this time. My life is going awesome, I just had the best weekend ever, and these little pissants aren't ruining that for me. So ha!&lt;br /&gt;&lt;br /&gt;Love,&lt;br /&gt;&lt;br /&gt;Devon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-4179252876198097348?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/07/dear-baltimore-scum-of-earth.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-8531018828839165585</guid><pubDate>Wed, 16 Jun 2010 13:21:00 +0000</pubDate><atom:updated>2010-06-16T09:33:34.715-04:00</atom:updated><title>Guitar</title><description>So I've been playing daily for at least an hour. It's going well, but I'm quickly getting to the point where I realize why I get frustrated with it. Hopefully, raw perseverance and determination will get me through the hump.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For instance, I've been working on recording some stuff. I played the bit of Rondo Alla Turca that I'm supposed to be working on and had to do several takes until I was happy with how I was playing. I am all over the place with tempo unless I have the metronome going. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that, I was going to record the Pink Floyd - Mother solo (another bit that I'm supposed to work on). When I'm playing along with the music, it sounds OK. When I play it back, I realize that my bends are off by a semitone, I don't have the sustain in the song, I don't play it with the same fluidity, and I'm not really doing a great job at the vibrato bits on sustained notes. Also, when I do bends, inevitably I end up bending into other strings as well, which get caught on my finger and ring when I release the bend. This sounds like shit. The song also has a rather large jump in frets, combined with some string skipping. That hasn't been *too* much of a problem, but again, the fluidity just isn't there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I decided to re-record Comptine d'un autre été: L'après-midi. I was still really rusty at the piece and I had to re-learn how to do the part on the bass clef. Once I had figured that out again, I remembered the difficult part, which I practiced a whole lot but never got smooth enough at to really record that bit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hopefully, I'll have something to put up soon. I've been thinking of doing a metal version of Comptine -- sounds like a lot of fun. For now, it's back to work.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-8531018828839165585?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/06/guitar.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-40089820480650457</guid><pubDate>Mon, 14 Jun 2010 22:43:00 +0000</pubDate><atom:updated>2010-06-14T21:07:09.448-04:00</atom:updated><title>Woo Stuff</title><description>Now that I have my guitar, my bass, my drumset, my microphone, and my Lexicon sound interface, I'm starting to get serious with music. I had my first guitar lesson last Saturday, and it was great. My instructor is a brilliant player; he impressed me mightily playing Rondo Alla Turca on guitar -- both the bass and treble clefs. I've always been a huge fan of Andres Segovia, but have never met anyone who could play classical guitar, so this was a real treat. He has me working on a bit from Rondo Alla Turca, which I'm able to do cleanly at about 40% speed, and sloppily (with some distortion) at about 60% speed. My picking technique has improved significantly after only a few days of practice, and I'm excited for my next lesson. I'm also practicing the solo for Mother (Pink Floyd) and the outro to The Good Soldier (NIN). The latter is easy; the former is only difficult because I find it very hard to do bends cleanly.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm still playing drums almost daily, and I'm getting better at that daily. I haven't picked up the bass much, but I don't think that's going to be a huge issue. The bass lines for the songs I want to cover are not hugely complex, so that works to my advantage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently went to a rave (Starscape) which was a lot of fun. Samy's girlfriend found out about it and suggested we all go. Totally worth it, I found two new bands to love (Lotus and Pretty Lights), and I've been listening to them almost non-stop at work. It's a nice break from the metal I've been listening to recently. Lotus is an electronica jam band, Pretty Lights ... well, they're just awesome. There are a few videos on my &lt;a href="http://www.youtube.com/dho0"&gt;YouTube channel&lt;/a&gt;, I definitely recommend checking them out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've also been hitting up the gym. Samy has been my trainer and we've been doing free weights. The workout program we are doing has us incrementing the weights every time unless we fail the sets, at which point we get 3 retries before we have to go down to the initial weight we started at. I haven't failed anything yet, but I'm close on the incline bench press. The regimen right now consists of:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;"Power" crunches (actually the only nautilus we do): 3 sets of 7 reps. Last workout was 115 pounds.&lt;/li&gt;&lt;li&gt;We did a calf exercise last time where you load up a machine with free weights and stand on your tip-toes. We both did 540 pounds for that, 3 sets of 10.&lt;/li&gt;&lt;li&gt;Bench press. My upper body strength blows. 3 sets of 5 reps, my last one was 30 pounds on top of the bar.&lt;/li&gt;&lt;li&gt;Upright row. 3 sets of 7 reps; last one was 55 pounds.&lt;/li&gt;&lt;li&gt;Chin-ups: as many as you can do. I'm sometimes able to do 3 now.&lt;/li&gt;&lt;li&gt;Squats or dead lifts. We switch these up; squats I'm doing 60 pounds on top of the bar, dead lifts are 80 pounds on top of the bar (I think).&lt;/li&gt;&lt;li&gt;Incline bench press. I'm doing 25 pounds on top of the bar, but I have so much difficulty passing since it's the last exercise we do. I'll get better.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Soon, I'll be photologging the progress, since it's hard to really recognize physical progress without evidence.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other than that, I've been keeping pretty busy. Cats are doing well. Couple pictures of Mia for anyone interested. Purr is still lazy -- both of them really, but that's because the air conditioning broke a couple times. Hopefully any leaks have been fixed; it seems to be working now. Anyway, Mia is still tiny, Purr still isn't getting any bigger. Click images for full pic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs518.ash1/30524_394611532337_511552337_4244241_1668911_n.jpg" target="_new"&gt;&lt;img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs518.ash1/30524_394611532337_511552337_4244241_1668911_n.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hphotos-snc3.fbcdn.net/hs534.snc3/30294_398509687337_511552337_4343796_3756088_n.jpg" target="_new"&gt;&lt;img src="http://hphotos-snc3.fbcdn.net/hs534.snc3/30294_398509687337_511552337_4343796_3756088_n.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs503.ash1/29779_384876447337_511552337_4015721_4695270_n.jpg" target="_new"&gt;&lt;img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs503.ash1/29779_384876447337_511552337_4015721_4695270_n.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-40089820480650457?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/06/woo-stuff.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-8014300509137977749</guid><pubDate>Thu, 20 May 2010 05:25:00 +0000</pubDate><atom:updated>2010-06-13T05:37:01.244-04:00</atom:updated><title>Arizona</title><description>&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Nothing cheesier than song lyrics.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;br /&gt;That taste&lt;br /&gt;All I ever needed&lt;br /&gt;All I ever wanted&lt;br /&gt;Too dumb to surrender&lt;br /&gt;&lt;br /&gt;She shakes&lt;br /&gt;Like the morning railway&lt;br /&gt;Ch-ch-checking me out&lt;br /&gt;Someone on a shoulder&lt;br /&gt;&lt;br /&gt;The lamp&lt;br /&gt;Flickers in the bedroom&lt;br /&gt;She must feel as awkward&lt;br /&gt;Whorehouse Arizona&lt;br /&gt;&lt;br /&gt;Now go&lt;br /&gt;Stand up to a giant&lt;br /&gt;Say that I'm a fighter&lt;br /&gt;Too drunk to remember&lt;br /&gt;Too drunk to...&lt;br /&gt;&lt;br /&gt;Shake hands&lt;br /&gt;My face is laying on the pavement&lt;br /&gt;Tasting something awful&lt;br /&gt;I hate when that happens&lt;br /&gt;&lt;br /&gt;She wades&lt;br /&gt;In and out of sexy&lt;br /&gt;She must be plum crazy&lt;br /&gt;I kinda think I like her&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;I kinda think I do&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-8014300509137977749?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/05/arizona.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-7856036620553902110</guid><pubDate>Mon, 17 May 2010 20:54:00 +0000</pubDate><atom:updated>2010-05-17T17:03:29.316-04:00</atom:updated><title>VMWare Sound Awesomeness</title><description>So I just went to Best Buy to get a USB sound card that I thought would be supported by Linux (which I really only run at work; otherwise FreeBSD / Plan 9 all the way, baby!). So I got this cheapo Creative X-Fi Go! card. Unfortunately, it turns out that this absolutely does not work whatsoever with any existing drivers, any OSS drivers, or with the Creative X-Fi product line drivers.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bummer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But then I remembered that VMWare will do USB device passthrough. I'd already had some luck using my iPod with iTunes inside VMWare (lesson learned: do not try to upgrade firmware via iTunes inside VMWare). But I was getting this really annoying error when trying to attach the USB device: "Remote USB device error: Remote device disconnected: An error occurred while sending data."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I forgot that I had this issue while using the iPod, turns out you just need to change the permissions on the appropriate device in /proc/bus/usb to 0666.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that, it just worked. Unfortunately, the playback will get choppy at times. I set the priority of Foobar2000 to "realtime" and reniced the vmware-vmx instance to -20, and this is marginally better, but I do still get some choppiness. Any suggestions welcomed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-7856036620553902110?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/05/vmware-sound-awesomeness.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-4958965466151054229</guid><pubDate>Thu, 13 May 2010 18:51:00 +0000</pubDate><atom:updated>2010-05-13T15:04:51.312-04:00</atom:updated><title>More mplayer scrobbliness</title><description>&lt;div&gt;I got tired of all the tunneling required to get CIFS/SMB mounts working from home -&gt; work, and now that I have a MacBook Pro, I've learned that iTunes won't play HTTP playlists. (Please correct me if I'm wrong, but it wouldn't work for me). So instead of dealing with forwarding a shitton of ports and whatnot, I'm just tunneling HTTP to my work machine since I'm connected to the VPN at home: ssh -g -R 8080:localhost:80 devon@10.x.x.x.&lt;br /&gt;&lt;br /&gt;So this works great right now, but then I have to frigging play it. I can't stream using iTunes and I don't feel like looking for a streaming client (or setting up icecast or anything like that). So I finally wrote a script that downloads a random song, plays it with the mplayer scrobbler, and then deletes it. (Maybe I'll make it index them at some point, or do more stuff like ask me to tag the file if it's missing and ID3 tag).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks, Pete, for the sed suggestion to get a given line from the file. I always forget about sed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This probably doesn't work for playlists with over 2^15-1 (32767) files.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/env bash&lt;br /&gt;PLS=$1&lt;br /&gt;NUMFILES=`wc -l $PLS | awk '{ print $1 }'`&lt;br /&gt;&lt;br /&gt;playfile() {&lt;br /&gt; OFF=$RANDOM&lt;br /&gt; let "OFF %= $NUMFILES"&lt;br /&gt;&lt;br /&gt; LINE=`sed -n -e "${OFF}p" $PLS`&lt;br /&gt;&lt;br /&gt; FILE=`mktemp -t tmp`&lt;br /&gt; mv $FILE ${FILE}.mp3&lt;br /&gt; FILE="${FILE}.mp3"&lt;br /&gt; ftp -o $FILE $LINE&lt;br /&gt; ./mplayer-lastfm $FILE&lt;br /&gt; rm $FILE&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while `true`; do playfile; done&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-4958965466151054229?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/05/more-mplayer-scrobbliness.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-7917930422246124782</guid><pubDate>Sun, 09 May 2010 16:59:00 +0000</pubDate><atom:updated>2010-05-16T02:38:57.346-04:00</atom:updated><title>Life Updates</title><description>I always wait a really long time in between writing entries on things in general. I guess that's likely because day-to-day happenings seem rather mundane; there's rarely anything that happens in a given day that I have the time or inclination to blog about. Obviously, if I'm faced with some technical challenge that is poorly documented and is a simple write-up, I do have a tendency to document that.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But given a significant period of time, the small stories and mundane details of life end up blossoming into big deals, proving to be more than negligible in nature as life unfolds new hurdles and mysteries to deal with and to solve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I suppose the biggest and perhaps most surprising turn of recent events has been that a certain prominent person in my life left. Overall, I'm disappointed not only that it happened, but how that series of events played out. I was lied to and deceived and, quite frankly, I was under the impression that she was a little more grown up than that. Certainly there were factors about myself that caused the split, and I'm happy that those were made clear to me, as I've had a chance to identify and fix many of them. However, the toying around with my emotions and deception that followed was completely uncalled for. What once was a beautiful relationship that I thought would last a lifetime has turned into one of indifference and avoidance. I no longer speak to her. It is difficult to avoid her as she and her newfound paramour both work in the same office building as I do (hopefully not for long). This used to be extremely difficult for me; now I simply turn my back. This is less emotionally painful at this point than I had thought it would be, and that is a positive thing. If this situation had to happen, I suppose it's best that it happened now, as opposed to having gone on after I had proposed, after marriage, or after children.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That said, I'm sort of enjoying being single right now. I'd been dating a bit, but am finding myself somewhat emotionally unavailable. I'm okay with that, but I don't want to get myself involved with people and end up having them fall for me while I'm unable to do the same. When things are right, the opportunity will present itself, and I'm sure I'll end up happy. In the meantime, I'm sure I'll continue to meet people and make friends.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cats are doing really well. They missed her for quite some time after she left, and enjoyed the few times she came to visit prior to the "final split" but they seem to be adjusting fine. Mia is now much more affectionate towards me, and I'm really happy about that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Work is going rather well. I'm sure there are tons of updates in that area I could write about, but there's nothing horribly exciting. I've worked on some really fun projects as well as some really tedious ones, but I suppose you get that anywhere. I'm moving over to the core engineering team in the next few months, and I'm really looking forward to that. Web development is really starting to take its toll on me, and getting back to doing C full-time is a very positive change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess that's about it. This is more of a reflective and therapeutic post, I suppose. It's feeling more and more odd to share these sorts of things with a completely anonymous audience as I continue to age, but clearly not yet so much that I won't do it. Hopefully things will calm down soon, life will cease its periodic churn, and I'll be blogging with some happier (or at least less bittersweet) news.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-7917930422246124782?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/05/life-updates.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-2798097997954143112</guid><pubDate>Fri, 23 Apr 2010 15:35:00 +0000</pubDate><atom:updated>2010-04-23T11:40:17.777-04:00</atom:updated><title>Installing Windows Vista Ultimate under VMWare Server 2</title><description>I kept getting some error when trying to install Windows Vista Ultimate under VMWare. It was pretty frustrating, because I need it to diagnose a client's issue at work. I was getting:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;Windows cannot open the required file X:\Sources\Install.wim.  Make sure all files required for installation are available, and restart the installation.  Error code:  0x8007000D.&lt;/blockquote&gt;Went to the recovery console, and indeed it wasn't there. Huh?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I remembered that I had a WinXP VM running that also had access to the CD device. I opened it and saw an explorer window opening and closing itself trying to autorun the DVD or something. I shut that down, restarted the VM I wanted to install Vista onto, and tried again. No luck.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I figured, hell, I'll just dd the image. Yeah, they're too clever. dd only reads about 452MB of the DVD before stopping, and I didn't feel like plopping around trying to figure what option combinations would get it to ignore / writethrough errors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(#@*%@(#*%! Grumble! I opened the device options in VMWare as a last hope, changed from ATAPI emulation to accessing the drive directly, and presto. It's installing now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At least it didn't take half a day to figure out.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-2798097997954143112?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2010/04/installing-windows-vista-ultimate-under.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-4309181904215615979</guid><pubDate>Fri, 23 Oct 2009 13:32:00 +0000</pubDate><atom:updated>2009-10-23T09:50:15.051-04:00</atom:updated><title>Gapless Playback and Scrobbling With mplayer</title><description>&lt;span style="font-family:georgia;"&gt;&lt;span style="font-size:180%;"&gt;Gapless Playback + Scrobbling = &lt;3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, I listen to music a lot. And I listen to a lot of music. A couple of my favorite artists track for gapless playback (two albums I'm queuing up right now include Colors by Between the Buried and Me and The Incident by Porcupine Tree). I got fed up trying to find a media player for Linux (I have CentOS at work) that doesn't suck majorly at everything, and I really would like to scrobble what I listen to.&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;If you read my blog (haha), you'll have noticed a previous post about mplayer. I went out and googled, and came up with the following.&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;You'll want to get &lt;a href="http://www.update.uu.se/%7Ezrajm/programs/mplayer-lastfm/mplayer-lastfm-0.2.2"&gt;&lt;span style="font-family:courier new;"&gt;http://www.update.uu.se/~zrajm/programs/mplayer-lastfm/mplayer-lastfm-0.2.2&lt;/span&gt;&lt;/a&gt; (if it disappears, send me an email). This is a perl script that parses mplayer output and scrobbles it to &lt;a href="http://last.fm"&gt;last.fm&lt;/a&gt;. It requires &lt;span style="font-family:courier new;"&gt;Digest::MD5&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;LWP::UserAgent&lt;/span&gt;. In addition to obviously needing mplayer, you'll also need taginfo from &lt;a href="http://grecni.com/software/taginfo/taginfo-1.2.tar.bz2"&gt;&lt;span style="font-family:courier new;"&gt;http://grecni.com/software/taginfo/taginfo-1.2.tar.bz2&lt;/span&gt;&lt;/a&gt; (which in turn needs taglib).&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;After this, create an &lt;span style="font-family:courier new;"&gt;.mplayer-lastfmrc&lt;/span&gt; file containing the lines:&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;user = [your username]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pass = [your password]&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;Once you've done this, follow these helpful steps (from &lt;a href="http://snipplr.com/view/18353/gapless-playback-for-mplayer-linux/"&gt;&lt;span style="font-family:courier new;"&gt;http://snipplr.com/view/18353/gapless-playback-for-mplayer-linux/&lt;/span&gt;&lt;/a&gt;):&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;mkfifo aufifo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;aplay -t raw -c 2 -f S16_LE -r 44100 aufifo &amp;amp;&gt; /tmp/aplayfifo.log &amp;amp;&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;After that, simply run:&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;./mplayer-lastfm-0.2.2 -ao pcm:nowaveheader:file=aufifo path/to/*.mp3 &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;Once mplayer-lastfm quits, though, you'll have to re-create your fifo. Perhaps I'll make a script for that. :)&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;br /&gt;--dho&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-4309181904215615979?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2009/10/gapless-playback-and-scrobbling-with.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-1135245891503487032</guid><pubDate>Tue, 23 Jun 2009 20:05:00 +0000</pubDate><atom:updated>2009-06-23T16:41:07.211-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>working out</category><category domain='http://www.blogger.com/atom/ns#'>work</category><category domain='http://www.blogger.com/atom/ns#'>music</category><category domain='http://www.blogger.com/atom/ns#'>holland</category><category domain='http://www.blogger.com/atom/ns#'>happenings</category><category domain='http://www.blogger.com/atom/ns#'>whatever</category><title>[Insert Title Here]</title><description>&lt;span style="font-size:180%;"&gt;[Insert Section 1 Header Here]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;So, here I am, blogging. It's been another couple months (and nobody reads this thing anyway, so I don't know why I even bother) and I've not updated. Things have been rather interesting recently. Perhaps the most shocking of happenings is that the tires and alloy rims were stolen from Alicia's 2008 Honda Fit right outside our apartment while we slept. This has me rather upset, because we moved into this complex thinking that it was a nice area. Since we've moved in, the following events have taken place:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;I called the police after witnessing a man punch his girlfriend in the face several times and push her down a hill.&lt;/li&gt;&lt;li&gt;Alicia's tires and rims were stolen (this is going to end up costing us around $700).&lt;/li&gt;&lt;li&gt;I was solicited this morning for money in our parking lot.&lt;/li&gt;&lt;li&gt;I've been solicited at the door multiple times for various products or services. (Not to mention the ridiculous number of pamphlet solicitations I've received that do nothing but increase U.S. paper consumption numbers.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Our washing machine broke. We called once, it was ``fixed.'' It was still broken. We called again, and it was ``fixed.'' It was still broken. The third time we called, they replaced it.&lt;/li&gt;&lt;li&gt;We've had a similar experience with our HVAC, which seems to be leaking freon or something because it craps out a day after they fix it, without fail.&lt;/li&gt;&lt;li&gt;We're on the 3rd floor with a (usually) very clean apartment, and we still get ants.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Now, in Maryland, there's a law that you're to be able to have quiet enjoyment of your rented area. I don't know that we've had issues with any sort of general din, but I wouldn't say we have enjoyed it. This is frustrating, because it seems there's really no legal precedent for early termination of our lease (which expires in November) based on any of these issues. I'm guessing we'll end up waiting it out. We're looking at the possibility of moving to Baltimore soon, though I believe that both of us are looking forward towards getting back out to the west coast area. (I only hope that I'll be able to keep my job if that happens -- I love this place.)&lt;br /&gt;&lt;br /&gt;My uncle has invited us on a trip to Austria with him in September. I'm looking forward to the possibility of that. I've considered visiting Holland, but I don't think that's happening anytime soon. The novelty of it has died at this point; it's impractical to go as often as I have wanted to go (and thus I've only been able to make it there once since I left), and my Dutch is so poor now that I doubt anybody would speak to me in Dutch anyway. I honestly spent about 30 minutes writing Margriet a rather short paragraph on the Loesje card I emailed for her birthday last month.&lt;br /&gt;&lt;br /&gt;Anyway: Austria. I've been there before, but this was literally about 15 years ago (I can't believe how long ago things are getting...) and I remember very little other than it was in general a rather good time. It's a beautiful place, from what I recall, with some rather amazing history.&lt;br /&gt;&lt;br /&gt;Work's going well. Not much new on that front.&lt;br /&gt;&lt;br /&gt;Plan 9 Google Summer of Code is going well. I'm doing a lot more organizational / administrative work than I initially anticipated doing, but it's been vital.&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;[Insert Section 2 Header Here]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Not much new elsewhere. The music front has been relatively static. I'm listening to Marilyn Manson right now (old shit: Cake and Sodomy); next on the queue is Porcupine Tree, and then perhaps some Tool before I head home.&lt;br /&gt;&lt;br /&gt;We have been working out quite a bit. I'm trying to lose the gut that I seem to have put on since I moved here (being able to afford a lot of delicious food isn't such a good thing for me, apparently... perhaps I should request a salary decrease? ;). In fact, I apparently weigh around 190 pounds right now, which is absolutely ridiculous. I remember being 160-ish and looking rather in-shape. (In fact, there's a picture on my Facebook page illustrating just that).&lt;br /&gt;&lt;br /&gt;I've been doing mostly nautilus weights, doing a couple reps of 21s for my biceps, but not noticing much difference. Putting on the weight is a lot easier than getting it off, unfortunately.&lt;br /&gt;&lt;br /&gt;Feeling somewhat uninspired at the moment, so I'll just end this posting before I end up rambling. I've got more work to do anyway.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-1135245891503487032?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2009/06/insert-title-here.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-8769057136067417735</guid><pubDate>Mon, 13 Apr 2009 13:17:00 +0000</pubDate><atom:updated>2009-04-13T10:15:45.203-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><category domain='http://www.blogger.com/atom/ns#'>AJAX</category><category domain='http://www.blogger.com/atom/ns#'>work</category><category domain='http://www.blogger.com/atom/ns#'>c</category><category domain='http://www.blogger.com/atom/ns#'>plan 9</category><category domain='http://www.blogger.com/atom/ns#'>Delivery Manager</category><category domain='http://www.blogger.com/atom/ns#'>Ecelerity</category><category domain='http://www.blogger.com/atom/ns#'>nat</category><category domain='http://www.blogger.com/atom/ns#'>Message Systems</category><category domain='http://www.blogger.com/atom/ns#'>real life</category><category domain='http://www.blogger.com/atom/ns#'>firewalls</category><category domain='http://www.blogger.com/atom/ns#'>Lua</category><category domain='http://www.blogger.com/atom/ns#'>jQuery</category><title>Updates and such.</title><description>&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:180%;"&gt;Intro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wanted to continue updating my 9vx.org blog, but I seem to have screwed up the lighttpd configuration, and I don't really feel like figuring out what's wrong with it. I'm really just more interested in getting a blog out, since I haven't done this in quite some time now (not that it really matters much, since nobody reads this damn thing).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Currently listening to a bunch of music out of my nostalgic Holland days. It gets me thinking quite a bit about the ``back then.'' 'Twas quite the fun, care-free time. It also seems like it was forever ago. I've been back in the US for almost 4 years now, which seems like quite a long time. My Dutch has become somewhat poor -- I can still type it, but my pronunciation is extremely poor, I've forgotten the gender of most nouns (which consequently has screwed up my grammar quite a bit), and I really have no way to practice it. It saddens me a bit; I really don't have anything else from that time to hold on to, except perhaps the music. Listening to Air, right now, which is right out of that `era.'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So here I am &lt;a href="http://www.messagesystems.com/"&gt;at work&lt;/a&gt; (not really slacking off, configuring a virtual machine to do some work, that's running in the background, and I've been here since about 8 AM). It's a fun job, and I've got a rather interesting role (at the moment). Currently, I work as a sort of intermediate between the front- and back- ends of our product, which is an enterprise SMTP server (it rocks, by the way -- my VMware instances can easily push around 3 million mails per hour in testing on a single node). The front end serves largely as a convenience for viewing metrics and configuring the system.&lt;br /&gt;&lt;br /&gt;Since we've just released a new version of the product, &lt;a href="http://www.messagesystems.com/press/NR040709DM30.pdf"&gt;Delivery Manager 3.0&lt;/a&gt;, I've spent a ton of hours fixing bugs, testing stuff, and adding new features (working both Saturday and Sunday for the past couple weekends -- I think I put in around 60 hours last week, if not more). One of the coolest things we've added to the product is a web user interface for creating policies and rules for alerts. This is implemented as an &lt;a href="http://www.jquery.com/"&gt;AJAX&lt;/a&gt; interface to a back-end that generates code in &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt;. I could continue to explain how it works, but a picture is worth a thousand words:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dB8hiypNW3s/SeNC9Kd9_EI/AAAAAAAAAGY/b72QLteB69k/s1600-h/policyeditor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 422px; height: 234px;" src="http://3.bp.blogspot.com/_dB8hiypNW3s/SeNC9Kd9_EI/AAAAAAAAAGY/b72QLteB69k/s320/policyeditor.png" alt="" id="BLOGGER_PHOTO_ID_5324172803031563330" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;Very cool stuff. I don't do the interface -- I'm really not that person. My part in this was designing the interface between the front- and back-end (a.k.a. ``architecting''), and implementing the back-end handlers for loading and saving scripts. It's a very powerful interface, and very minimal as well. I'm really pleased with how it turned out. It's looking like I'll be working on more of the back-back-end stuff (i.e. the core product) sometime soon, which will transition me into working primarily in C (as opposed to primarily PHP with a bit of C).&lt;br /&gt;&lt;br /&gt;Today, I'm working on some bugs in the web console for the 2.2 maintenance release we've got coming up in the next week (or whenever that's actually supposed to hit the market).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Home&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Home life is well. Alicia and I have a kitten (whose official name, I think, is just ``purr'', but I prefer to use ``Sir Purrgelot'' as his full name) -- he's quite the little terror, though if traumatized enough, he turns into a softie. We took him with us in the car up to New York this weekend; he slept in my lap all the way up, and all the way back. I don't think he likes the car much.&lt;br /&gt;&lt;br /&gt;We've got a ton of DVDs. (Or what I consider to be a ton, anyway.) We've got 2 DVD shelves that claim to be able to hold 88 DVDs per shelf, and they're both filled. We're going to get 2 more this week.&lt;br /&gt;&lt;br /&gt;As if travelling up to New York for Easter weekend wasn't enough, this weekend we will be travelling to Virginia Beach for a vacation weekend (my penance for throwing a huge party that probably got way out of hand a couple weeks ago). Looking forward to that; it'll be nice to relax. Hopefully the beach weather is nice, but I'm guessing the water will be too cold to really enjoy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Plan 9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My bad habit. I'm serving as a mentor for this year's Google Summer of Code for Plan 9. It's looking like we'll get 7 students this year; I'm hoping that we'll pull in the project that I want to mentor, which would get Plan 9 NAT support and a stateful packet classifier (and thus a modern firewall as well). Definitely looking forward to that. It's a fun endeavor.&lt;br /&gt;&lt;br /&gt;The strangest thing for me serving as a mentor for a student is that I never went to college. All the knowledge I have about these things is self-taught (or learned from others out of my own interest and pursuit). This year, I'd have a masters student. He's a bright guy, so I don't expect I'll need to do all that much outside of motivation and answering the occasional question about best practices and architecture.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Outro&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;I suppose that's about it for now. The VM is finally installed and configured, and I should really focus on getting these bugs squashed, as opposed to working on this blog post any more. Thanks for reading.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-8769057136067417735?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2009/04/updates-and-such.html</link><author>devon.odell@gmail.com (dhobsd)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_dB8hiypNW3s/SeNC9Kd9_EI/AAAAAAAAAGY/b72QLteB69k/s72-c/policyeditor.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-8111591999584648398</guid><pubDate>Mon, 29 Dec 2008 16:06:00 +0000</pubDate><atom:updated>2008-12-29T11:08:53.292-05:00</atom:updated><title>Technical Posts</title><description>Though I've typically used this blog for technical posts, those will be moving to &lt;a href="http://konijntje.9vx.org/blog/"&gt;http://konijntje.9vx.org/blog/&lt;/a&gt; -- please refer there for more technical posts. This blog will become more of a personal reflections area, though who knows how often I'll update it.&lt;br /&gt;&lt;br /&gt;--dho&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-8111591999584648398?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/12/technical-posts.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-4325883042278656076</guid><pubDate>Tue, 04 Nov 2008 21:57:00 +0000</pubDate><atom:updated>2008-11-04T16:58:35.287-05:00</atom:updated><title>Why Obama's Tax Plan is Superior: Politics and Socioeconomics</title><description>I wrote this essay in hopes that I could illustrate my view on why Obama's tax plan is superior to McCain's, and why McCain's plan is devilishly appealing, although nobody below the $603,000 income bracket can deny Obama's plan affects them terribly negatively.&lt;br /&gt;&lt;br /&gt;This is a collection of responses / comments on a portion of a note posted by of one of my friends. His note states:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;``I asked a friend today, I said hey, if I have a family member who makes 50 something thousand a year, and his household lives comfortably, although with not too much room to just spend, then why is somebody with $250,000 not able to give up an extra thousand or so, so that somebody who works just as hard, if not harder, but was not given as great of an opportunity, able to live more comfortably?&lt;br /&gt;&lt;br /&gt;The response: Well his family has an income, and after what they pay, barely have any money left over to spend on what they want. Apparently they pay 10,000 dollars a month in bills. $10,000. On what, I ask? Well, they own 3 houses.''&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This struck me, and I decided that I would try to figure out why a family earning $250,000 per year would be more apt to vote for a McCain plan than an Obama plan that would &lt;b&gt;barely&lt;/b&gt; affect them (increasing their tax by an average of $12 per year). It turns out that American fiscal responsibility is complete shit. This family cannot possibly afford 3 houses on that income. Perhaps if they lived in Kansas -- but this seems to be in the Newport News, VA area.&lt;br /&gt;&lt;br /&gt;The crux is, our socioeconomic model of the past 20 years has been one pushing towards lending and spending. So it appears this family can afford the houses and their lifestyle... but they really can't. Let me break this down for you; here is my spliced together series of comments on Shane's note (edited to fix a couple of consistency errors I amended and noted in later notes -- those amendment notices are also removed):&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;&lt;br /&gt;Hey, Shane. I decided to look up some of this stuff on income tax levels. Your friend whose family has a $250,000 income -- assuming they filed a married joint income tax return, their monthly income would be $15,691.66.&lt;br /&gt;&lt;br /&gt;That isn't quite right, because we don't figure in state taxes. For Virginia, it seems that number is $15,095/year. This brings monthly income down to $14433.75. I'm assuming they also have a family insurance policy. The monthly rate for a family insurance policy from my provider is $949. That takes the monthly income to $13,484.75. Factor in Social Security and Medicare taxes, which end up being $1,593.75 a month, and this number is down to $11,891. Now we're not factoring in &lt;b&gt;ANY&lt;/b&gt; savings yet, so say we want to put away $500/mo into a company matched 401(k) for retirement (this is a ridiculously small number for someone with that income and is less than the amount I will be contributing monthly on $80,000.) Down to $11,391. There's not enough to contribute 10% monthly income to any other form of savings, but I think a family with 3 houses would know that savings other than a 401(k) are vital (the current economic situation proves that). Say we put away $300/mo into a high yield savings account. We're at $11,091. This number is probably about accurate because, while they may have more deductions, they also likely have more taxable assets. We'll assume for their sake that the number is low, and give them $11,591 a month, for $500 in credits -- &lt;i&gt;that's $6,000/yr in tax credit&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Well, now we know they have $10,000 in bills on the three houses they own (for fairness' sake, I'm going to assume this includes gas / electric / water / garbage / other household-related bills). This brings their family monthly income down to $1,591. Assuming a 3-person family, that apportions $530/mo per individual for everything else. This includes food, transportation, and fun.&lt;br /&gt;&lt;br /&gt;Assuming they own their cars and have no other payments, and assuming they have reasonably fuel-efficient vehicles, and assuming they have an average commute to work each day -- average commute is about 25 minutes. We'll equate that to 25 miles, since it's about the same given standard gas mileages for city/highway use. That's 50 miles a day -- we'll assume a tank a week with additional driving adding an additional 100 miles or so. Say they can do that on a 10 gallon tank. Currently, that's costing about $26/week, for about $104/mo per vehicle. Down to $1,383/mo.&lt;br /&gt;&lt;br /&gt;Food is expensive. For myself, I can go through about $100 in food a week. A family of three gets to consolidate a bit better because they're going to be planning their meals, so say they spend 3/4 as much as I do on food -- that's going to be about $300 a month. Down to $1,083/mo.&lt;br /&gt;&lt;br /&gt;Leisure costs add up. You don't realize it, but impulse buys really, really add up. Spending $1.50 on the candy bar, going out to the movies a couple times a month, going out to eat every 2 weeks, buying the new bestseller... these costs add up. I give myself about $400/mo for this; let's be conservative and say they spend $200/mo per person on leisure costs. Down to $483/mo.&lt;br /&gt;&lt;br /&gt;I'll be nice and say their credit cards are only costing them about $200/mo. $283 left over.&lt;br /&gt;&lt;br /&gt;Stuff comes up. School field trip for the kid (or books or mom send money if the kid's in college), you end up with a little money for last minute stuff that comes up here and there. Honestly, for me, that can end up being anywhere from $100 to $600 in a given month (car needs fixing, oil changes, that kind of stuff). We'll hope theirs averages $100/mo, and they put the rest in an accessible savings fund for the months that this last minute expense adds up to more.&lt;br /&gt;&lt;br /&gt;And that, my friend, is how a family living on $250,000 per year can live paycheck to paycheck. They &lt;i&gt;can't&lt;/i&gt; really afford what they have (I realized before I even finished the costs that I had to give them a $6,000 tax credit for them to afford it). We yell at these people (or their lenders) who got loans on $300,000 homes that they couldn't afford.&lt;br /&gt;&lt;br /&gt;This is the same principle. This family has loans they're paying off on these houses, and if the shit hits the fan for 6 months in a row in those last-minute expenses that you &lt;b&gt;need&lt;/b&gt; to take care of so you can continue to get to work and continue to earn money and live healthily (hell, I forgot insurance copays on any medications, while we're on that note), you can be pretty easily (to put it bluntly) fucked.&lt;br /&gt;&lt;br /&gt;So it's not just these lower income people with houses they can't afford who are foreclosing. It's people, across the board, who are living beyond their means. This $250,000 family would be able to decrease their monthly expenditure and live MUCH more healthily getting rid of just one house costing them $3,000/mo in bills and taxes. I can see them owning two houses and living comfortably.&lt;br /&gt;&lt;br /&gt;To put things in perspective: I have an $80,000/year salary. Because I don't want to calculate everything a second time, let's just say that after insurance, 401(k), taxes, and whatnot, I bring in $48,000 a year. That's $4,000 per month that I have for rent, bills, transportation, and the like. &lt;i&gt;After all that is done, I can easily have significantly more than $1,591 left over.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I haven't clearly illustrated the political point, yet. From the tax code changes proposed by both candidates that I posted yesterday:&lt;br /&gt;&lt;br /&gt;If you make 227-603K a year:&lt;br /&gt;Obama: +12.00&lt;br /&gt;McCain: -$7,871&lt;br /&gt;&lt;br /&gt;Well, if you look at the numbers as an outsider, you might think, ``Shmeh, $12.00, that's not much of an increase. Go Obama!'' But as a person (or family) who is unable to afford your lifestyle and falling into this income tax bracket, &lt;b&gt;&lt;i&gt;you already can't afford the tax you're already paying to maintain the lifestyle you're living&lt;/i&gt;&lt;/b&gt;. A McCain administration promises you about $656/mo &lt;i&gt;more available income&lt;/i&gt; per month, while Obama is costing you $1/mo.&lt;br /&gt;&lt;br /&gt;This is a very scary thing, conceptually, because it means that people voting selfishly (for a candidate who fixes the problems THEY are facing -- in this case &lt;i&gt;due to their own irresponsibility&lt;/i&gt;) are more likely to vote McCain than Obama. Not because Obama's plan is bad -- Obama's plan isn't bad, and responsible families in this bracket will easily afford $12/year in tax increases. They're more likely to vote because McCain's plan will help them maintain their lifestyle of living beyond their means.&lt;br /&gt;&lt;br /&gt;Unfortunately, from a sociological standpoint, we are living in a society that encourages spending, so I find it highly unlikely that this extra $656 per month will actually become helpful to such an irresponsible household.&lt;br /&gt;&lt;br /&gt;This socioeconomic point has the side-effect of causing them to continue borrowing, which will end up screwing our economy more, since our lenders are already broke. Thus, looked at in a macro scale, McCain's plan will end up keeping us in a rut as a country economically, while Obama's plan forces those with more money to become more responsible with that money: they &lt;b&gt;have&lt;/b&gt; to give some of it to the government. That's not a bill that one can easily avoid.&lt;br /&gt;&lt;br /&gt;While both tax plans alleviate stress for the lower incomes, Obama's does more help. McCain's alleviates stress across the board, but can't cope with the socioeconomic desire of the country to spend more and more. Obama's plan encourages increased fiscal responsibility amongst the people paying most of our country's taxes -- that's why you levy the tax against them, it has a higher yield and lower overall socioeconomic impact as far as their economic class and lifestyle -- and because it actually brings in more money, it provides a means out of this economic crisis we find ourselves in where our lenders are broke and so are we.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-4325883042278656076?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/11/why-obamas-tax-plan-is-superior.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-6382912559570337697</guid><pubDate>Tue, 21 Oct 2008 16:10:00 +0000</pubDate><atom:updated>2008-10-21T13:29:42.112-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>baltimore</category><category domain='http://www.blogger.com/atom/ns#'>data structures</category><category domain='http://www.blogger.com/atom/ns#'>algorithms</category><category domain='http://www.blogger.com/atom/ns#'>linked list</category><category domain='http://www.blogger.com/atom/ns#'>amtrak</category><category domain='http://www.blogger.com/atom/ns#'>travel</category><category domain='http://www.blogger.com/atom/ns#'>penn station</category><category domain='http://www.blogger.com/atom/ns#'>Interviews</category><category domain='http://www.blogger.com/atom/ns#'>c</category><category domain='http://www.blogger.com/atom/ns#'>new york</category><title>How Not To Implement a Linked List Insert *and:* Fun with Amtrak</title><description>&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px;"&gt;Intro&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Yesterday, I took a trip down to Columbia, MD for a job interview. Columbia is a great little area (at least from the parts I saw and the reviews I have read, that seem to continually rank it among the United States' top 10 best places to live.) The actual trip was quite a disaster, but the interview went rather well. We'll see what happens; I've got my fingers crossed.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;How Not to Implement a Linked List&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I'm sure everyone who would be interested in reading this would also be smart enough to not do this, but you never know. I thought I was smart enough to not do this. Please don't laugh too hard.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here I am, interviewing, thinking everything is going well, and then it's time for the whiteboard implementation of a linked list insert routine. I seriously wrote this:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;struct list {&lt;br /&gt;   int data; /* whatever payload our list is carrying */&lt;br /&gt;   struct list *next;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void list_insert(struct list *head, int payload) {&lt;br /&gt;   struct list *tmp, *tmp2;&lt;br /&gt;&lt;br /&gt;   tmp = head;&lt;br /&gt;   while (tmp &amp;amp;&amp;amp; tmp-&gt;next != NULL) {&lt;br /&gt;       tmp = tmp-&gt;next;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   tmp2 = malloc(sizeof (struct list));&lt;br /&gt;   /* err... yeah, skipping out on error checking here */&lt;br /&gt;   tmp2-&gt;data = payload;&lt;br /&gt;   tmp2-&gt;next = NULL;&lt;br /&gt;   tmp-&gt;next = tmp2;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Yeah, it &lt;span class="Apple-style-span" style="font-style: italic;"&gt;works&lt;/span&gt;, but that's not the point. It doesn't work well. Comments are things I mentioned amidst writing it out. But I also, while writing &lt;span class="Apple-style-span" style="font-style: italic;"&gt;while&lt;/span&gt; on the whiteboard, had my brain kick in. Well, halfway. My brain said, ``Oh hello there, jolly ol' chap. That's not optimal. But I'll be damned if I'm telling you why!'' So here I am, with &lt;span class="Apple-style-span" style="font-style: italic; "&gt;while (tmp &amp;amp;&amp;amp; tmp-&lt;/span&gt; written up there, saying, ``Yeah, uh. This is by no means any kind of optimal.''&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I couldn't figure out why.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other than that, the interview went well, and I had a lot of fun. (Except for the travel, which was a nightmare, but an acceptable one.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I'm back on the train, heading up to New York, and all of a sudden it hits me. ``He said implement a linked list &lt;span class="Apple-style-span" style="font-style: italic;"&gt;insert&lt;/span&gt;, not &lt;span class="Apple-style-span" style="font-style: italic;"&gt;append&lt;/span&gt;.'' D'oh. Of course append *does* insert, but unless you're sorting or whatever... it's really useless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Except I didn't have any way to do the quick post-interview email. I had just brought a book for the train, and I certainly wasn't going to ask any of these weird businessey-salesy-markety guys to borrow their laptop with its nifty 3G PCMCIA card. (``Why not,'' you may ask. Because my train was delayed for an hour, I wasn't going to be getting home until 2AM at the earliest, and I simply wasn't in the mood to interact at that point.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, at the point that I did get home (at about 1:45AM, no less), I hopped on the computer and fired off an email. (I mean, seriously, who implements an O(n) linked list insert?) Instead, what you are supposed to do is insert at the head of the list:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;struct list {&lt;br /&gt;   int data; /* whatever payload our list is carrying */&lt;br /&gt;   struct list *next;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void list_insert(struct list **head, int payload) {&lt;br /&gt;   struct list *tmp;&lt;br /&gt;&lt;br /&gt;   tmp = malloc(sizeof (struct list));&lt;br /&gt;   tmp-&gt;data = payload;&lt;br /&gt;   tmp-&gt;next = *head;&lt;br /&gt;   *head = tmp;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;So, yeah. Go go brainiac me. Oh well, at least I was still awake enough to realize I needed the pointer to pointer to be able to change the list head.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Fun with Amtrak&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I quite possibly could have named this section &lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;Worst Train Ride in the History of Man&lt;/span&gt;, or possibly something a little less exaggerated, but less sarcastic. In that case, I'd simply modify the title to &lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;[I Did Not Have Any] Fun with Amtrak&lt;/span&gt;. Let me explain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The actual travel itself was not so bad. In fact, I rather enjoy trains. I used to hop on them all the time when living in Holland, and so it's nice to see this manner of public transportation still have viable use here in the States. No, the travel itself was fine. But Amtrak has absolutely GOT to do something about their schedules.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 18px; "&gt;Clocks, guys. Fix your Clocks&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Amtrak's clocks are broken. Before you tell me that my clocks are broken, I'd like to remind you that I'm a geek, and I'm nutty about time. I'm the kind of asshole that ignores pastes including timestamps if it's somehow obvious that the timestamp is incorrect. By any verifiable amount of time. Not only that: if the timestamp includes a seconds part (my client doesn't show seconds), I'll go run &lt;span class="Apple-style-span" style="font-style: italic;"&gt;date&lt;/span&gt; and determine whether that user actually is off by seconds.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So it should serve as no surprise for you to understand that when I walked into Amtrak at 4:55AM, and they said the 5:10 train had left, and their clock showed 5:12, I was pissed. Yeah, I can understand a car clock being off by a couple of minutes, since it's not the type of thing you look at fixing daily. But how the HELL do you get 15 minutes of drift?&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Changing Tickets&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Apparently when you change your tickets, any discounts applied to your old ticket doesn't apply to your new ticket. So the company interviewing me had purchased my ticket, and they put the AAA discount on the thing. Apparently they don't copy that over to any further transactions to make on your itinerary. So I paid $10 to change the couple tickets over to take the next train to NY Penn station, and then the train from there to Baltimore. And I took the next train, which was about an hour later, and got me in two hours later than I was originally going to be arriving.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Taxi Drivers in Baltimore are lol&lt;/span&gt;&lt;/div&gt;&lt;div&gt;They might know Baltimore, but ask them to go 10 miles out of it and they get lost. Having never been to the offices of this company, *I* had to guide the taxi driver. What a noob.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;FIX YOUR GODDAMN TRAINS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Yeah, so... Amtrak? You remember how I said to fix your clocks? Fix your trains too, while you're at it please.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I get to the BWI station, and I was going to need to change over one of my tickets to make the 4:23 train at BWI (instead of the 4:34 train at Baltimore Penn) so that I could interview a few minutes longer and make it to the station on time. I got to the station on time, and I go in to change my tickets. But I'm in line, and I notice it hits 4:23, and there's no train.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah. The 4:23 train was delayed an hour and a half. So instead of being able to take that train, I had to take the 5:33 train up to New York Penn. My connecting train up to Albany left at 8:34 or something. The 5:33 train would get me there at 8:37. (Seriously, what the fuck?) Oh, the best part: the next train to Albany after *that* left at 10:45 and didn't get to Albany until 1:15AM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, whatever. In the end, I ended up getting out at NY Penn, calling my girlfriend and she came and picked me up in the city. We got home at around 1:45AM, which was still sooner than we would have gotten home if I had taken the train up to Albany (though I suppose I should place that part of the blame on the fact that both of us live in the middle of nowhere.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-6382912559570337697?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/10/how-not-to-implement-linked-list-insert.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-6495158069058824843</guid><pubDate>Sun, 19 Oct 2008 16:40:00 +0000</pubDate><atom:updated>2008-10-19T13:25:58.356-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>npapi</category><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>real life</category><category domain='http://www.blogger.com/atom/ns#'>os x</category><category domain='http://www.blogger.com/atom/ns#'>windows</category><category domain='http://www.blogger.com/atom/ns#'>directshow</category><category domain='http://www.blogger.com/atom/ns#'>socialgamer</category><category domain='http://www.blogger.com/atom/ns#'>activex</category><title>I'm Awful At Updating My Blog.</title><description>&lt;span style="font-size:180%;"&gt;Intro&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;I've been super busy with everything recently and haven't had a chance to update my blog in forever. (That also might be because I haven't actually done much software / sysadmin related stuff in quite some time -- not entirely true, but we'll get into that later). Where've I been? Caught up in projects and real life. Between working on SocialGamer, attempting to pick up some random contracts here and there, and my recent real life adventures, there's not been much time left over for blogging or the Internet at all (outside of what I've been doing; read further).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;Real Life&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;So I finally got a life. This is partially attributed to me finally taking steps to doing fun real life stuff and partially due to having a girlfriend now who actually likes doing fun real life stuff. We've gone on more hiking / rock climbing / random drives around abandoned towns in the past two weeks than I've been on in the past three years. It's quite fun, and makes me realize how much I've missed in the past few years since I've been back in the US. This past weekend, we drove out to Sam's Point in Ellenville, but the trails were so packed (and you have to pay to get in) that we decided we'd try to find something else. On the way back down the mountain, we saw some random place marked for hiking, so we pulled over and walked down a bit, but it turned out there really wasn't any kind of trail.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;So we continued our drive out to the middle of nowhere, trying to find some house on the top of a mountain. We never found the house, but we found the weirdest community I've ever seen anywhere. There was this mix of Jewish communities (which were all fenced in and run down, which was odd to see, since it reminded me a lot of Nazi-style ghettos), (probably) million dollar estates (most were for sale, so perhaps they're no longer of such value) and trailer parks. There were burned down / abandoned community centers that had remnants of swimming pools, basketball courts, and tennis courts... and then half a mile down the road, there'd be this shoddy community with an outdoor basketball court that looked better maintained than any of the houses surrounding it. Crazy.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Down one of these roads, we found a `general purpose' nature area. Upon walking down the `trail' (or what may more aptly be described as `area that looked most walked over' since there was no trail to speak of), immediately apparent were an empty mini-keg of Heineken, a bucket and beer bottles, all shattered and riddled with bulletholes, as well as some empty 12 gauge shotgun cartridges. We walked farther into the woods, finding some spectacularly colored leaves on the ground. We found this stone wall running through the middle of the woods. Apparently these sorts of constructions exist all over the place in this area; I'd never really seen them before, and I still wonder the stories behind the walls. What were they marking? When were they built? Who built them?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;After walking for perhaps a quarter of a mile into the woods, we thought it best to continue back to the car since:&lt;br /&gt;&lt;/span&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;There was no trail and we'd probably get lost if we went too much further, and&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The area was so skeevy, we didn't really trust the car being left alone for too long.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;Back to the car we went, and to some general store that has local crafts and seasonal items. It was a pretty nifty shop, some of the local foods they had looked really good. Also, they had some local mega-gigantic Reese's cup-style candy, which I would have bought if it wasn't $2.15. For that price, I'll buy a bunch more Reese's, thank you very much.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;Projects&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;I've been working the last couple months pretty much non-stop on promoting a website I created called SocialGamer. The idea is to have a social networking community for gamers of all types, be they video gamers, board gamers, or active gamers (paintball, footbag (Hacky Sack), frisbee) or otherwise. This is difficult because I've run out of money to piddle around with a website for 80 hours a week. We're trying to get the site migrated over to Django, which would be cool, because that would make it much easier to maintain most of the content on the site, as well as to extend the site in the future. I'm pessimistic about the amount of time I'm going to be able to put into the site in the upcoming month or two (or even in the long term). This is disappointing, because many people love the site. I may hold a fundraiser for it starting in November, but I'm not sure that much is going to come out of that. Either way, that's not going to give me any more time to work on it given I have two upcoming job interviews, will likely have to move for both of the jobs if I get them, and I also have an upcoming contract.&lt;br /&gt;&lt;br /&gt;The contract is to develop a browser plugin for an x264 encoder that can stream via RTMP to a Flash Media Server. This plugin must work on FireFox, Internet Explorer, Safari, and Opera and must target Windows XP, Windows Vista, and Mac OS X (10.5). The funny thing about this is that the Mac port looks like the easiest. Quicktime can open cameras and capture devices and encode into x264 natively. So we looked at DirectShow. What a hassle that is!&lt;br /&gt;&lt;br /&gt;DirectShow requires you to open a DirectShow device, assemble a bunch of filters for it, and then do whatever with audio / video. In the end, it looks doable, but it's going to be a lot more work than the OS X version which gives you a single, encoded A/V stream. The DirectShow version, we're going to have to do our own A/V syncing! (Why it cannot do this for us is beyond my imagination).&lt;br /&gt;&lt;br /&gt;On top of that, it's going to be interesting to code up an NPAPI plugin for two different operating systems and STILL have to code up an ActiveX plugin for Windows. Why in the world did MS remove NPAPI support from MSIE? *Sigh*.&lt;br /&gt;&lt;br /&gt;I'll post more about DirectShow weirdness as I get past various issues, I'm sure.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;Outro&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;That's about it, but it's enough to keep anybody busy 168 hours per week. To put my case in point a little better, I set up some water to boil for some noodles midway through this blog entry. I then spent 15 minutes forgetting that it was boiling. Off to fix my noodles and continue on with my various stuff. Gotta prepare for that big interview tomorrow!    &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-6495158069058824843?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/10/im-awful-at-updating-my-blog.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-4929710235520721668</guid><pubDate>Wed, 23 Jul 2008 15:27:00 +0000</pubDate><atom:updated>2008-07-23T11:54:17.756-04:00</atom:updated><title>Random, shuffled, endless playlists with mplayer and sh</title><description>It's portable and easy. There's no need to do shell / environment specific stuff, mess with arrays in shell scripts or worry about spaces in filenames: this works in any semi-POSIX compliant environment that can run mplayer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;while `true`; do find "$1" -name \*.mp3 | while read filename; do echo $filename &gt;&gt; /tmp/pls.$$; done; mplayer -shuffle -playlist /tmp/pls.$$; rm /tmp/pls.$$; done&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I have this plopped in ~/bin/play and run &lt;span style="font-family:courier new;"&gt;play ~/mp3 &lt;/span&gt;which works well for me. You could also do &lt;span style="font-family:courier new;"&gt;2&gt;&amp;amp;1 &gt;/dev/null &amp;amp;&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;&gt;&amp;amp; /dev/null &amp;amp;&lt;/span&gt; (for sh/csh like shells respectively) to kill output and background the process if you want.&lt;br /&gt;&lt;br /&gt;Have fun :)&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-4929710235520721668?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/07/random-shuffled-endless-playlists-with.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-390721599752341942</guid><pubDate>Wed, 18 Jun 2008 15:26:00 +0000</pubDate><atom:updated>2008-06-18T12:54:37.428-04:00</atom:updated><title>A Better ROBOT9000</title><description>&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:180%;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Quite a while ago, XKCD posted an idea about an auto-moderating IRC bot to maintain some sense of order in his channel. The basis for the idea is that as social communities grow, they start to suck. In every online social network I've been involved in, this has been true -- it has also been true in part for some social activities I enjoy outside of the computer / internet realm. In this post, I'd like to touch both on the sociological as well as technical aspects of this subject.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sociological Aspects of Online Communities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's probably universally accepted that as a community becomes larger, some form of government should be set up to manage it (anarchists aside). This is evident in the smallest of groups to the largest: we see political order in everything from clubs to our jobs to the management of our society our own countries.&lt;br /&gt;&lt;br /&gt;Initially, a very small community consisting of only a few friends may function well without any intervention. After all, these are people who are familiar with each other and thus have experience interacting with each other socially. They know the quirks of the others; they are aware of the boundaries of what is found socially acceptable to each other. A community like this is self-governing: there is no need to instantiate regulations upon such a small community because there is little to no cause for social discord in their normal interaction.&lt;br /&gt;&lt;br /&gt;If the idea behind the community is a good one, others may be invited to join who are strangers to the others. As the community grows, more nuances and social quirks are introduced. People become less familiar with one another and we start to see social discord when people (perhaps unintentionally) overstep their boundaries. This becomes more prevalent as the community continues to grow. However, the group remains closed: everyone has a common interest (which is the centerpiece of interaction in the community), and it is assumed that everyone is a friend of someone else there. It is due to this closed nature that, though social boundaries may be traversed from time to time, there is no need for regulation: the group can function normally without moderation.&lt;br /&gt;&lt;br /&gt;Now let's examine an open group. Imagine that we have a public service: a swimming pool. In general, most of the attendants will not know each other and, while some bonds may form between them, each attendant is largely unaware (and even complacent) about the social boundaries and expectations of the others. In this case, rules for safety are instantiated with an active moderator (or more), who we see manifested as lifeguards. Frequently, these rules are not limited to physical safety: social safety is moderated as well! (Next time you are at a public swimming facility, look at the rules board: most of the time, there are rules forbidding screaming and profanity.) From personal experience, most people are aware that as the size of the group at such a facility grows, more intervention is needed to ensure the safety of all around.&lt;br /&gt;&lt;br /&gt;On to open anonymous groups. This is a fairly new concept (within the last several decades) made possible by advances in communication. BBSes and the Internet have made it possible for people to communicate without knowing anything about each other. It is in this form of communication that moderation is direly needed: as interpretation of communication is largely non-verbal (or, in this case, non-textual), we are making it in a sense more difficult to communicate our ideas. Additionally, due to the implied anonymity of an alias, people are more apt to extend their behavior to extremes as any consequence is fairly benign. Rules are placed and moderation is available, but this is frequently not enough, and largely due to the inconsistencies of moderators in these communities. As moderation is unpaid, their consistency suffers, both in the enforcement of their policies and the actual time they spend moderating. Additionally, what one moderator may consider socially acceptable, another may not, leading to inconsistency between moderators. Finally, since there are inconsistencies in the time they are willing and able to spend performing the moderation, times frequently arise in which no moderation is available, and anarchy ensues.&lt;br /&gt;&lt;br /&gt;A lot of what ends up being socially unacceptable in a situation turns out to be repeated conversation. If experience is any indication, most things that could be considered annoying, profane, or otherwise socially harmful are indeed repetitive. Internet memes are repeated to the point of not being any kind of funny; profanities and insults -- well, there are a finite combination of these. A solution proposed by XKCD for IRC chat communities is to create an auto-moderation bot that penalizes all violations in a well-defined and consistent manner.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://media.peeron.com/tmp/ROBOT9000.html"&gt;original implementation&lt;/a&gt; of &lt;a href="http://blag.xkcd.com/2008/01/14/robot9000-and-xkcd-signal-attacking-noise-in-chat/"&gt;ROBOT9000&lt;/a&gt; is in Perl with a MySQL back end. This implementation is extremely suboptimal: SQL is not good for text searching, and in test use, the bot proves itself to be rather unreliable. It is being run on a server for the ScoreHero community, connecting to the same MySQL database used for the site. The site has over 235,000 members at this time and with its score management and forum features, has a very heavily loaded MySQL database. Because of this, the bot seems to lose its socket to the database after short periods of inactivity, causing it to die and require restarting. Running the bot on a different server seems somewhat counterproductive since the channel is officially moderated by the ScoreHero staff and the bot should be run on assets belonging to the site.&lt;br /&gt;&lt;br /&gt;Hence, I'm working on a ROBOT9000 implementation in C. Its functionality is the same, but it uses a &lt;a href="http://en.wikipedia.org/wiki/Red_black_tree"&gt;red-black tree data structure&lt;/a&gt;, storing two 32-bit hashes for each unique line of text, penalizing if the hashes already exist in the list. There are a couple issues to hammer out regarding best practices, manual intervention, and collisions (which I'll probably leave alone). Right now, it's semi-usable. Source code is available at http://testbed.dh0.us/~dho/crobot/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-390721599752341942?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/06/better-robot9000.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4340896568676894885.post-3271656439267878623</guid><pubDate>Fri, 23 May 2008 16:03:00 +0000</pubDate><atom:updated>2008-05-23T12:57:51.408-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>syscalls</category><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>opensolaris</category><category domain='http://www.blogger.com/atom/ns#'>kernel</category><category domain='http://www.blogger.com/atom/ns#'>c</category><title>Getting back in the swing of things</title><description>&lt;span style="font-weight: bold;font-size:180%;" &gt;Intro&lt;br /&gt;&lt;/span&gt;It's been a while since I last blogged. A couple of years, in fact. I've been busy with work stuff and my own life, as happens with pretty much everybody. It has had its ups and its downs, but I suppose I'm in a pretty good place right now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Building Python Extensions on OpenSolaris&lt;/span&gt;&lt;br /&gt;I've got a &lt;a href="http://www.digitalvariant.com/"&gt;new job&lt;/a&gt;, doing web development stuff. It's not OS development, but it pays the bills (and the people here are pretty cool). Since I've recently been getting back into working on / using &lt;a href="http://www.opensolaris.org/"&gt;OpenSolaris&lt;/a&gt;, I thought I'd go ahead and set up an environment a new project of ours at work. We use &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; by-and-large (though we do have some &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; projects), and we use &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; for most of the things we do. So I was setting up a local server for our latest project, and I needed to install &lt;a href="http://www.initrd.org/"&gt;psycopg2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The install went well enough, but when I ran&lt;br /&gt;&lt;blockquote&gt;python manage.py syncdb&lt;/blockquote&gt;I was greeted with a traceback stating that libpq.so.5 could not be found. I had installed &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; from the &lt;a href="http://www.blastwave.org/"&gt;Blastwave&lt;/a&gt; package, so initially when building psycopg2, I ran into the problem of it not knowing where my Postgre headers were (I had forgotten to plop &lt;span style="font-style: italic;"&gt;/opt/csw/postgresql/bin&lt;/span&gt; into my &lt;span style="font-style: italic;"&gt;PATH&lt;/span&gt; for pg_config). But here, I was stumped.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt;, I've had to run &lt;span style="font-style: italic;"&gt;ldconfig(8)&lt;/span&gt; a few times, but ldconfig doesn't exist on OpenSolaris. I found out that the analogue to this is &lt;span style="font-style: italic;"&gt;crle(1)&lt;/span&gt;, but I was advised not to use it. Instead, it was suggested to rebuild psycopg2 with &lt;span style="font-style: italic;"&gt;LDFLAGS&lt;/span&gt; containing &lt;span style="font-style: italic;"&gt;-R /opt/csw/postgresql/lib&lt;/span&gt;. I clobbered the previous build and ran:&lt;br /&gt;&lt;blockquote&gt;LDFLAGS='-R /opt/csw/postgresql/lib' python setup.py build&lt;br /&gt;&lt;/blockquote&gt;Everything went smoothly after the installation -- the runtime linker's paths were updated and my syncdb worked like a charm. (Well, after I went into Postgres and created the database, which I hadn't done yet. My brilliance never ceases to astound me.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;OpenSolaris Syscalls&lt;/span&gt;&lt;br /&gt;I'm currently bashing my head against a brick wall trying to get cap-eye Install to work for me (I keep trashing my ability to boot the system) while I work on &lt;a href="http://bugs.opensolaris.org/view_bug.do?bug_id=4616466"&gt;RFE 4616466&lt;/a&gt;. I &lt;span style="font-weight: bold;"&gt;think&lt;/span&gt; I have a working syscall for it, but untill I get Install to work and actually get to boot the kernel to run a test program to use the syscall, I have no idea. It was a pretty interesting challenge: from the kernel, how do you go from a local / remote address:port tuple to find what PID is responsible for that TCP connection.&lt;br /&gt;&lt;br /&gt;It's kind of a tough answer, actually. Initially, I thought it was pretty straightforward. The &lt;span style="font-style: italic;"&gt;tcp_s&lt;/span&gt; structure contains a field called &lt;span style="font-style: italic;"&gt;tcp_cpid&lt;/span&gt;, which is the process that initially created the described TCP session. However, processes may hand off a socket to other processes (plenty of ways to do this), so the PID currently responsible for the socket may not be the one that created it. Indeed, the one that created it need not even be running, which not at all an unlikely possibility. Additionally, multiple processes may manage the socket in question, but I chose to not support this: It would require the caller to know beforehand how many processes use the socket as I would then have to &lt;span style="font-style: italic;"&gt;copyout&lt;/span&gt; all the PIDs. I could alternatively let the caller specify a maximum number of PIDs they are interested in, but this seems too arbitrary to need to support.&lt;br /&gt;&lt;br /&gt;My implementation goes something like this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First, we get a reference to the current IP netstack by calling &lt;span style="font-style: italic;"&gt;netstack_get_current()&lt;/span&gt; and dereferencing its &lt;span style="font-style: italic;"&gt;nu_ip&lt;/span&gt; member.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We get a connection record by looking in the list of connections for the IP stack, using a handy macro that turns the remote address and local/remote port tuple given the IP stack into an index into this array: &lt;span style="font-style: italic;"&gt;ipst-&gt;ips_ipcl_conn_fanout[IPCL_CONN_HASH(remote_addr, ports, ipst)];&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;We then loop over all matches looking specifically for TCP connections on the local/remote tuple, matching with:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;IPCL_CONN_MATCH(connp, IPPROTO_TCP, raddr, laddr, ports)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once we've found a matching connection, we dereference its &lt;span style="font-style: italic;"&gt;conn_tcp&lt;/span&gt; member to get our &lt;span style="font-style: italic;"&gt;tcp_cpid&lt;/span&gt; as a hint.&lt;/li&gt;&lt;li&gt;Now the fun part. We loop over all processes in the active zone.&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;If the process' PID matches the &lt;span style="font-style: italic;"&gt;tcp_cpid&lt;/span&gt; field, we return that value, as the process still exists and still has control over the socket (and this saves us from needing to do a bunch of lookups into the process' file table).&lt;/li&gt;&lt;li&gt;We loop over the process' file table looking for the socket holding the connection. This was a particular bitch to figure out, but I think I got it:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;The file table is accessible by using the &lt;span style="font-style: italic;"&gt;P_FINFO()&lt;/span&gt; macro on the struct proc.&lt;/li&gt;&lt;li&gt;Starting from 0 and looping while less than &lt;span style="font-style: italic;"&gt;filetable-&gt;fi_nfiles&lt;/span&gt;, we&lt;br /&gt;walk an ugly list of structures.&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;We get the desired &lt;span style="font-style: italic;"&gt;fp&lt;/span&gt; from &lt;span style="font-style: italic;"&gt;filetable-&gt;fi_list[i]-&gt;uf_file&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We access its associated vnode (as sockets are implemented using sockfs, we have a vnode for the socket) from &lt;span style="font-style: italic;"&gt;fp-&gt;f_vnode&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;The socket node (&lt;span style="font-style: italic;"&gt;struct sonode&lt;/span&gt;) is stored in the private &lt;span style="font-style: italic;"&gt;vn-&gt;v_data&lt;/span&gt; field.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-style: italic;"&gt;tcp_s&lt;/span&gt; struct for the socket is stored in the sonode's private &lt;span style="font-style: italic;"&gt;so-&gt;so_priv&lt;/span&gt; field.&lt;/li&gt;&lt;li&gt;If the pointer of the &lt;span style="font-style: italic;"&gt;tcp_s&lt;/span&gt; struct here matches that of the &lt;span style="font-style: italic;"&gt;tcp_s&lt;/span&gt; struct we grabbed from the connection, we've got a winner.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;li&gt;If we don't find anything, return &lt;span style="font-style: italic;"&gt;ESRCH&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;I got a good bit of help regarding implementation of syscalls from &lt;a href="http://blogs.sun.com/eschrock/date/20050614"&gt;Eric Schrock's blog entry on adding new syscalls to OpenSolaris&lt;/a&gt;. After reading this and doing my own poking around, I also found &lt;a href="http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/syscall/SYSCALL.README"&gt;SYSCALL.README&lt;/a&gt;, which has other useful information on the subject.&lt;br /&gt;&lt;br /&gt;Anyway, that's about all for this entry. Perhaps more later :)&lt;br /&gt;&lt;br /&gt;--dho&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340896568676894885-3271656439267878623?l=www.sitetronics.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.sitetronics.com/2008/05/getting-back-in-swing-of-things.html</link><author>devon.odell@gmail.com (dhobsd)</author><thr:total>0</thr:total></item></channel></rss>