« July 2004 | Main | September 2004 »
August 30, 2004
Good Weekend
I had meant to work on the Io DBI interface this weekend, but never got around to it because I spent so much time being pissed off at Emacs and not knowing how to make it work like it should. It would up being the difference between (require 'ruby-mode) and (auto-load 'ruby-mode "ruby-mode"). Sigh… I love Emacs now, but sometimes I'm really befuddled at the amount of work that one can put into it before getting to where they want to get. In case I forgot to mention it, I'm supposed to be writing the database abstraction layer for Io. But I'm not sure when I'll be doing that. I don't exactly have hours and hours to put into coding these days.
I saw a couple good movies this weekend, Pushing Tin, which I had avoided for no reason I can put into words, which turned out to be quite good. It's got all the awesome of a John Cusack movie and it also makes one respect air traffic controllers to some extent. We also got Aguirre—Wrath of God based on a recommendation on Plastic. I liked it a lot, Alex didn't, what else is new. :) The visuals were really good, and the lead actor had some incredibly chilling moments. We also re-watched The Butterfly Effect and it wasn't as good the second time around. It was like taking all the gut-wrenching moments of your standard drama, and then playing them over and over again, while having a Llama fuck you in the ear. Or something else distasteful. I don't know…I love time travel as a theme, and I liked that movie in particular because the time travel was by will rather than technology or magic or whatever, but it was just too heavy I guess.
Eric told me to start reading his LiveJournal account, and to get in on the action between Major and Paul and so forth. I told him I think LiveJournal is the trailer park of the internet, he liked that. I don't want to say I'm all high-and-mighty with my Bloxsom-based blog out here on a real server somewhere that I maintain, but, hey! Look at that, I am. So fuck off. Nobody reads my blog, and that's really something wonderful about blogs that aren't on LiveJournal. I'm not really doing this because I don't have enough drama in my life, and though I enjoyed Jerry Springer, I didn't really want to participate in it. 90% of blogging is drivel about what a blog is about. The other 10% is drama. I have enough of both I think.
That said, I guess I've been feeling a little lonely for my gang. I'm sure they've moved on for the most part, because even when I chat with Bill he wanders off and doesn't respond so much, I figure everyone (as usual) has enough to do without me. This must be how Nick felt, and probably why he hasn't contacted me since I emailed him about going down to Tech. An outsider can't really take another outsider somewhere. So I think I'm going to email him with a different proposal. I dunno. I miss the guys. People ask me, “dontcha feel weird not going back to school?” Yes—I feel very weird, thank you very much. But it was killing me. I couldn't take another year of it, let alone two. At Matterform I'm learning lots of things that aren't really teachable, either because they change too fast or because it wouldn't make for an interesting research area. GUI design is fascinating, but coding them is tedious. Making a brilliant GUI is to make a GUI that's effortless to use. A lot of coding goes into that.
This morning, I was feeling ill, and Lllama came and sat on me, and was affectionate with me. I hope it was a glimmer of what's to come. She hasn't been a very friendly cat, but I always make sure to torment her. She also clawed me in the foot today when we were playing.
I am (once again) rewriting the random 5 bot for Alex's LiveJournal community. She wants me to help her make some “memes” which is apparently what they call the trite little quizes that all the LJ people take. She thinks it's a burden to me, but I love to code and I love to do little simple projects. it's always interesting to me to see how complex even a little program can be. Picasso once said something about, whenever you feel you can't paint anymore, stop what you're working on and paint a flower. Put all of your love into that flower. When you're done, your powers will return. I think this is very true.
I convinced Pablo that IRV was a bad idea, and brought him over to the right-thinking people who like approval voting. If only we could do this in the real world, too.
Life is truly good now. I seldom miss my old life, but it does come up from time to time. But I am very happy where I am now, who I am now, and who I am with. Everything feels very, very genuine and good. I've also had Andrew WK's “Really In Love” stuck in my head for about a week, and that can't be helping. :)
Posted by FusionGyro at 06:17 AM
August 26, 2004
AppleScript, ECPG, and QuickTime
It is certainly a varied life, working for Matterform Media. Today, when I showed up, I figured I would be presenting my case for why we need to migrate away from REALbasic to this cool system called ECPG or Embedded SQL. ECPG is a way of putting your damn SQL into C directly. I think it looks pretty cool, it looks like this:
void show_people() { EXEC SQL BEGIN DECLARE SECTION; VARCHAR name[255]; int age; int name_ind, age_ind; EXEC SQL END DECLARE SECTION; // get the people EXEC SQL DECLARE show_people_people_cursor CURSOR FOR SELECT name, age FROM people ORDER BY name; EXEC SQL WHENEVER NOT FOUND DO BREAK; EXEC SQL OPEN show_people_people_cursor; while(1) { EXEC SQL FETCH NEXT FROM show_people_people_cursor INTO :name:name_ind, :age:age_ind; printf("found %s (age %d)\n", (name_ind ? "(null)" : name.arr), (age_ind ? 0 : age)); } }
So, natually, Michael hates it (and he should: it's C, after all) and I want to write our massive spam crime analyzer bot in it. The existing implementation takes about 2 days per 2/3rds of a percent (0.66%) for dealing with the spamspace, and that's not including the spam from the past two weeks which has been reflected to our other database. So, I'm looking at C and thinking it's the ticket, and Michael wants to poke at our RB until it's sorta fast.
I don't think we're going to get there.
Anyway, what I wound up working on today instead was an AppleScript evaluation library for the first half, until we hit the weird irresolvable problems, and then a little QuickTime-based sound recorder demo app which will be used in iAnswer. Neither of them work very well, but they both seem to sort of do some stuff in a way kind of from time to time when they feel like it. But at least it wasn't scanning more damned beads, so I'm happy.
Since I got home, I've been reading Jarrod's excellent journal. I told him I would read it and I haven't had time until now that he's finally back home.
In reference to yesterday's post, I'm downloading the CIA World Factbook and I'm going to see how bad parsing it is, and I'm going to make a little database here to hold the stats for each country so I can generate my little table in it's entirety, and then perhaps graph it. But then again we know that Sealand is going to have the best representation ratio, and it's a kingdom… :)
It's only midnight and I'm already tired. It's like I graduated into a goddamn retirement home. I have an airport extreme, which is connected to the internet over a modem. A few things around here seem, at times, to be somewhat weird.
Posted by FusionGyro at 06:03 AM
Alex and Io
So, today we discovered Alex has mono. I am a carrier so I guess it's no surprise. I guess it's better that it happened now than once she got into college, but she's probably not going to be very energetic for a few months.
I asked Steve Dekorte about the DBI module for Io, and apparently it is incomplete due to inability to test on Steve's part. So I've been asked to take up the slack and make it happen. We'll see.
In a related note, the next release of Io is going to feature some pretty high-powered syntactic sugar. {}'s, ()'s and []'s will be recast into function calls with names like “brackets” and “parens.” Of course, due to Io's fantastically awesome scoping system, you can overload these methods in some object and put that object in your object's parent or proto slot, and presto! different syntax is available down a particular inheritance tree! I think this shit is pretty wild…
For my birthday, I got a quantity of CDs. One of the ones I hadn't heard yet, Saxon's “Wheels of Steel” is just awesome. On a scale from AC/DC to Sikth in terms of complexity, they're hovering about an inch above AC/DC, but it's impossible not to speed while listening to it. Alex said “It was like dog crapping on lawn,” and though I couldn't agree more, I absolutely love it. :)
We're going to go watch Aqua Teen Hunger Force Season 1, which my brother kindly gave to me for my birthday. I'll bring it down to Tech next time I visit, too.
Posted by FusionGyro at 03:02 AM | Comments (0) | TrackBack
August 24, 2004
Implementation Thoughts for SOULTRAIN
Last week I posted my ERD for Project SOULTRAIN (Sound Of Unreasonably Lossless Truly Ridiculous Audio (Array) In a Network). The original goal of Project SOULTRAIN few recall, so I'll reproduce it here.
I hate RIAA. I hate record labels. I hate promoters. On the other hand, I love music. I want to have a single copy of whatever CD I want to own, and I want to use that copy exactly once. That one time that I use it, the following need to take place:
A perfect disc image must be made.
By this I mean, I want an image which is indistinguishable from the original when burned to CD. Near as I can tell, there is a way to do this with the command cdrdao read-cd.
An Ogg/Vorbis or Mp3 cached copy of each track is made.
This is because morons seem to like lossy music, because that way they can cram more of it on their cheap iPod ripoff.
All metadata is stored in my massive and friendly database.
I want to be able to search the database against any criteria I can imagine. Former band members, instruments used, “double-axe attack,” anything. Cover art, liner notes and lyrics count.
Then I want to have two other little bits laying around: a CD regenerator, and a plugin for whatever music player I'm using.
So today my thoughts drifted back to this. I want to pick my implementation language and answer a few other questions. Namely, whether or not I should couple tightly to PostgreSQL (I think I probably should) and whether or not I should make use of triggers and stored procedures. I have mixed feelings about triggers and stored procedures, because I don't want to use Pl/PgSQL, and using anything else would make it even more unlikely that this software will be reused. I'm looking at putting many man-months into this (not to mention my own specific database) and I think other people may wish to use it, so it's probably in my best interest not to couple it too tightly to any “weird” technology. But I also don't want to do this if it's going to be a drag.
Here's the language break-down:
Language | Pro | Con |
---|---|---|
Ruby | Most fun, probably, second-best glue coding language, C extensions are probably easiest | Tendancy for sloppiness, low possibility of 0D, PostgreSQL module sucks |
Io | Second most fun, worst glue coding language, C extensions are impossible but a fork of the code or embedding Io in a greater system with primitives for dealing with everything else is possible and might be easy | Seals the casket with respect to reuse, would wind up writing a lot of C ultimately, language is far from stable |
Python | Best libraries, great portability, likelihood of reuse very good, probability of 0D very high | Least fun (now that I want to try other languages), probably slowest (if it matters) |
My urge is toward the first two, because they're more fun. If you can use a fun language in your own projects, when can you use one? But the other concerns may wind up weighing it down.
The other possibility is to build different portions of it in different languages. This is probably the most compelling. I wrote a demo in ECPG the other day, just to see how bad it was, and it wasn't that bad (though it looks like handling large objects is quite a chore). So there is the possibility of writing some sort of “Objecty-C” wrapper for the database in ECPG and then building on that for both Ruby and Io support, and doing the actual work there. I might even bother to learn about extending Python at that point, assuming I have a fleshed-out and fully tested C library to drive the thing. But then we lose on the flexibility angle with respect to homebrew queries. Perhaps the best thing to do is to do that and then provide a way of speaking directly to the database. I have serious doubts about object-relational interfacing, because it seems to miss out on the flexibility of the database which is it's fundamental merit. But maintainability being the other concern, one doesn't want to expose the database to too much fiddling.
What a quandry…
Update: I've discovered that Io includes something called libdbi, a C-based database abstraction layer, which comes with PostgreSQL support. Making it happen in the build automatically may be quite a trick, but it seems like it's definitely doable. Additionally, I worked on Ruby's PostgreSQL module and I can get it to compile in Linux but not on the Mac. Further investigations are necessary as to the reason why this is, but I suspect very strongly that I'll be able to get it to work too.
Posted by FusionGyro at 03:22 AM | Comments (0) | TrackBack
August 20, 2004
The Real Red vs. Blue
I've made up my mind: this year I'm going to vote my conscience. I'm voting Socialist. I've had it with the red/blue bullshit conspiracy. “If you don't help Kerry, you're helping Bush!” they scream. If you can't see through the thin veneer that is Kerry, you deserve him. He's as bad as Bush, he's probably worse.
Politics here have been fucked up for a long time. If it makes you feel better, I don't think I can change things. Nor do I think that my vote is going to make a difference. But you know what? That's not the fucking point— voting is sharing your voice and nobody is hearing the Socialist voice, or the Libertarian voice, or whatever because Americans do not vote the way they feel. We vote the way that we think will “matter.” Well, that's bullshit, because it makes us give up on our ideals when we shouldn't, and would reduce us to a the current shat two-party system regardless of how many parties we started with. Fuck it!!
Now, because I believe it is fraudulent to call America a representative system, let's see some pretty charts. The “representation ratio” is the percentage of the population of the country who are representatives in the federal government. Observe:
Country | Population | Reps | Representation Ratio |
---|---|---|---|
USA | 293,027,571 | 536 (house + senate + pres) | 1.82e-6 or 0.000001829 |
United Kingdom | 60,270,708 | 1277 | 2.11e-5 or 0.00002119 |
Spain | 40,280,780 | 609 | 1.51e-5 or 0.00001512 |
New Zealand | 3,993,817 | 120 | 3.00e-5 or 0.00003005 |
Vanuatu | 202,609 | 52 | 0.0002567 |
Look at this! America's representation ratio is an order of magnitude worse than that of the New Standard Democracy. European nations, it seems, maintain about an order of magnitude more representatives per their own population. New Zealand is doing better than average for a European nation. And then look at Vanuatu, with a paltry 52 seats, yet it beats all the rest hands down. All of my raw numbers are from our very own CIA factbook, so you can just go fuck yourself if you don't like my numbers.
The reason why I like this examination is because it points out our own hypocrisy so effectively. We claim to be bringing democracy to all of these nations—and most of them are sitting next to nations that looked at our model and said, “This would be good if only it had more representation in it.”
Nor should I be taken as saying that our system can't work. It can work, but it needs to be calibrated. The formula we work from, 2 senators per state and 1 legislator per N people, works great until states are populated the way California is. Hell, New Mexico is a po-dunk little back-water state (or so it is thought) and our population is far, far greater than what was anticipated by the authors of the Constitution. Fairness in goverment is only achievable at a certain scale, and adjustments must be made or a better formula created.
Why I Hate Red and Blue
I hate Red and Blue both, for various reasons. I hate that Red tries to guilt me away from the platform I truly want to vote for. I hate that Blue insinuates that monogamy is an important characteristic of a politician. Blue voters would vote for a sociopathic serial killer (and some would say they have) over a Red with a divorce in his past, when this issue is both irrelevent and far less of a sin than destroying the environment for personal gain and warring for no better reason than to plunder and take revenge. But I hate that Red says “Our statistics say you'll vote for this rotting piece of meat if we stamp it non-Blue. plop Here you go. Vote. Good boy.” The Blues are at least deluded into believing they have some kind of cause. The Reds are a deeper kind of self-loathing scum; they know they have nothing to offer except an alternative and they always find the loser of the losers to push. “Oh, we can't have Dean!” they scoff, ”he has been known to occassionally get excited, even going so far as to vocalize his emotions!” He's not stiff enough, we need a staler one.
So I'm going to vote green, or purple, or red-and-black. Not because I have no regard for your suffering, but because I think we have to put this system out of its misery. I can't vote my mind because it doesn't work with our numbers. I can't vote my mind because my platform is “extreme” (read: not tepid or scripted). Then fine, I'm doing it, and I'm doing it to say “fuck you” to Red and Blue, and all their weak-spined supporters. They think I can't live without them, well, they're in for a surprise. I'm onto their little game, and I know I have nothing to lose by not voting for them, so I'm going to tell them “do your worst, fucksack, I can take it.”
How to Make a Difference
Now, this is how we could use this line of thinking to actually make a difference. Granted, that's not why I'm doing this—I'm doing this because I hate our system and I hate the morons on TV and I hate not speaking and voting my mind. But you could think about it this way, and if it gets your ass to the voting parlor, that would be nice too.
Right now, we get what, 25% voter turn-out? Not much, at any rate, and it's the 18 to 26 age bracket (us, mostly) who are not voting. Jarrod and I are the only people I know who are my age and who make it a point to vote. Anyway, most of us aren't voting, and there's a fuckload of us out there.
What if we all went in there and voted randomly? If you and I go and vote, say, Constitution Party and Socialist Party, instead of Red or Blue, what happens? Well, firstly, we feel gratified, because we've voted how we feel and we've said “fuck you” to Red and Blue. That's all we wanted to get out of it anyway, so we can't really be disappointed (plus, we don't have to stay up late to see the election results on TV). But suppose an extra 20% of us turned out and did this? Some Red or Blue fuck would still win, but this time it wouldn't be Red winning 52% of the vote, it would be Red winning 23% of the vote. Suddenly, the fact that most Americans don't fundamentally agree with the platform of Red or Blue more than anyone else, becomes very, very clear. It would demonstrate what a complete fallacy it is to say that half of us prefer Red and the other half prefer Blue. Plus, in the next election, you can bet your ass Red and Blue are going to be shopping for those Constitution and Socialist votes. You'll be able to chart the transition of Red to socialist and Blue to libertarian on an egg timer. Of course, at that point, we just hold out on them because we're cocks and we want them to beg for it. We like the look on Blue's face when they get all pouty and say “Please come back to me libertarian lover! Living without your minimalism is a lie!”
So, to sum up: fuck Red and Blue. Let's move to Vanuatu. :)
Posted by FusionGyro at 05:13 AM | Comments (0) | TrackBack
August 19, 2004
Back Online at Home
It's been what, six weeks?
Today at work we found a really awesome program: TeleCrapper 2000. The intent of the program is to behave sort of like Eliza for your phone: you record a bunch of waves of you talking to nothing and it plays them back for telemarketers over the phone whenever they pause for input. The example stacks are pretty hilarious.
The Yahoo! transport was down on Jabber for a few weeks there. I am apologetic to those who use the Clan Spum Jabber server. They rotated back to sms.msg.yahoo.com from sms.msg.yahoo.com (or whatever).
Dialup is true pain. I love having internet access again, but at what cost? It seems like a lot to put up with. At least I'll have a chance to perfect my synchronized Clan Spum Sites folder AppleScript magic. I'll post it after I get it to work.
For my birthday, Alex got me a couple of CDs yesterday: the new Evergrey album, “The Inner Circle” and the second Avantasia album. Unfortunately, I don't have much to say about the second Avantasia album. It just isn't as good as the prior one (“Metal Opera Part 1”). The new Evergrey, on the other hand, kicks all kinds of ass. :) They are starting to sound like themselves in places, but they still turn it up to eleven; it has some of the most beautiful passages I've heard in metal, while retaining all class and not falling to cheese. It also has some really fast, hard, heavy stuff. Everyone who liked their older stuff should get it, definitely.
SpamCrime Analysis
At work, we've been doing a lot of Spam Crime Analysis lately. We picked one domain semi-randomly from the top 30 spamming domains for our analysis, cutprice12.com. We traced the IP and and bubbled back up to find other domains of theirs we had seen. We had seen, in total, about 12 different domains of these assholes. Then we did a WHOIS query and found 68 other domains of theirs, of which 67 were aliases for their internet pharmacy. The other was for an online casino, bay-casino.com, or Phoenician Casino as they like to think of themselves. I thought this was pretty amusing.
I did a bit more digging and found that they were using casino software written by a particular company (I can't recall the name, BogCasino or something). Looked up that company and found links to about 50 online casinos. One of them even looked somewhat legitimate, based in Canada. Apparently, Canadian law dictates that gambling is illegal, but leaves prosecution up to the provinces. Some provinces choose not to enforce the law, and these guys were apparently based out of one of those. I called their 800 number, it was very open and professional sounding.
Other Languages
I have found that I miss Ruby and Python. My boss asked me to write a little script for him the other day, just to take a file that looks like this:
2398238 foo bar other fields here 9838388 other foo other bar other fields here . . .
And make a bunch of files with names like “2398238” with all that record's data in it. I found myself taking a little longer than I should have, because I missed dicking around in these other, more expressive languages. You never write something like “x = [x.strip().split(",")[1:] for x in stdin if x.split(",")[0] = "keep" ” in REALbasic. You also never see anything like “bar = (files.each {|f| file.read.split("\n").collect(",") }).strip.” After a while you come to see why these languages are so popular in the hacker community and so reviled in the business world. Yet I have to wonder how Perl got to be so popular when it's much worse than Ruby or Python could ever be. These are the things I worry about…
Project SOULTRAIN
I am working on an ERD for Project SOULTRAIN. I have decided I want to store as much data as possible. I don't care if entering the data for a CD takes 30 minutes and ripping and encoding it only takes 5. I want to be able to do bad-ass queries like these:
- Give me all the songs performed by this artist (regardless of band).
- Give me all guitar music without synths.
- Give me all additional tracks off remastered albums.
- Give me all tracks performed exclusively by musicians older than 40 at the time of the performance.
- Give me all bands that this musician was in.
- Give me all bands who have had more than three genres on one album.
It's incomplete, and I know where most of the bugs are, but here's the image:
Here are the problems I've noted:
- Every release is the same album exactly, just on either a different medium or with differing release-specific information. This is wrong. Maybe tracks should be associated with the release rather than the album? Or maybe there should be some kind of track diff thing with releases.
- What to do about lyrical/melodic/timing differences between compositions and tracks?
- Is it possible that other artists will re-release the same album as another artist? If so, we will need to permit more than one artist to release the same album. Perhaps this should be a three-way relationship?
- Should we differentiate between brands of instrument? Personalized instrument? What about keeping track of which instrument is used on a per-track basis? Maybe that should be considered a player in the track/composition/musician relationship?
- How should we account for lineup changes?
- What constitutes a genre? Should genre modifiers be just genres or do we need a heirarchical tree type deal?
- Should genres be done at the artist, album, and track levels? At which level should we stop? Should compositions have a genre? Should upper levels simply aggregate the genre of lower-level items or should they have their own, separate genre?
- Where should lyrics and artwork be stored?
These sorts of things always work out better when there's a second pair of eyes looking at them.
New Mac Software
Most of this stuff is butt, incomplete, and poorly-documented. Nevertheless, I am working on it and I intend to see this shit through 1.0 at least. Anyway, here it is:
Password Generator
It generates secure passwords using /dev/random or /dev/urandom, your choice. Actually you can put whatever you want in for the device, but you probably shouldn't put in /dev/zero or it'll probably lock up your machine.
The algorithm is deceptively simple: I read blocks out of the device and keep all the typeable characters. Look at that! Anyway, the disk image is available. Let me know if you can think of a device one would want to use other than /dev/[u]?random or if you find a bug or anything. Generic bitching will be accepted.
SSH Options
Right now, it pretty much works as long as you don't want to do one of those ulta-obscure things with more than one local-to-remote or remote-to-local or application port forward, though all of the drop boxes don't work yet because I don't see how to do them with Cocoa Bindings. I'll be making that work pretty soon. Also, my AppleScript needs a little work since it seems to open more than one window when you click on Connect. Otherwise, it's my most-complete app and I had a lot of fun writing it (it was also basically my first app). Let me know what you think, and download it here.
I still have lots of other dormant software which I intend to release as soon as I'm good and ready. It is, however, almost ten and I have lots of housework type chores I need to do. Uploading all this shit is probably going to take forever and goddamn software update is wanting to download something like 30 MB of software, which will probably take two or three hours at this rate.
Here's hoping the posting keeps going this time. :)
Posted by FusionGyro at 03:58 AM