PS2 Multi-Player?


I used to be a die hard gamer. Collected all of the systems from the 2600 to the Colecovision to the Sega Saturn and more. Then Something awful happened. I’ll never forget. I got this cool game for my Playstion (the original psx), I think it was a Christmas gift. It was called Syphon Filter or something. I played it for hours but always got a headache during the game. The head ache would turn into a mild form of nausea until I gave up on the game during which time said headache became full blown nausea. This went on for several months as I almost completed the game. Eventually I put the video games away altogether, started a family and started my career in computer software design. I lived gameless for several years until I decided to take a part time job at the local Babbage’s (before they became Gamestop). I would occasionally toy with the next gen systems noticing that every game I played brought back that familiar feeling of playing Syphon Filter. I eventually learned, years later that I was getting motion sickness from video games! I can no longer enjoy video games the way I used to, well not the newer full 3D camera perspective swinging vomit inducing games that are all over the market today. Older games like Street Fighter II, Killer Instinct, Double Dragon, Mega Man, Metroid, and Legend Of Zelda are cool.

I’m saying all of that to explain this year the kids got a PS2 from Santa. Santa doesn’t know anything about current gen game consoles but he tried really really hard to find something the little ones wouldn’t fight over. Everything was supposed to be multi-player. Santa discovered something this year. It doesn’t seem like two player games exist on the PS2. Well they don’t seem to be as common. Maybe it’s me, maybe it’s just Santa. But in my day (that entire first paragraph exists exclusively to give me permission to stroke my facial hair and say “in my day”) you would by a game that advertised 2 players and there would always, ALWAYS be an option on the menu that said something like oh, let’s say “2 Players” or “VS Mode”. Not with these games. Take Wall-e for example. The box clearly says 1-4 players but in order for more that one pile of flesh sporting 10 phalanges to become involved you have to first play single player mode, complete some levels and unlock the mini games. Mini games???!!! Kim possible is the same however there is a single pre-unlocked mini game that works off the disc and allows two players to talk trash as they compete. Then there’s Cars, which I haven’t look at but doesn’t even appear to support two players. Finally we have a true two player Crash Bandicoot.

My question to you is what’s up with multi-player on PS2? Santa forgot the memory cards this year so there’s no chance for two players even if one does plow through the first couple of levels. Why are games even made this way? Who’s crummy idea was it to require some sort of status be established prior to inviting a friend or sibling? Am I alone in thinking this is an awful thing to do to a parent? To a couple of children? Are there any shortcuts to the mini games on Wall-e or Kim Possible? Can we get a split screen driving session happening in Cars? What games would a concerned dad on a razor thin budget (read cheapskate) consider for two little girls that are prone to grab the same controller while leaving the second identically shaped device floor-bound and neglected? Holla back y’all…

WTF??


I was in the middle of the first level in Shining Force (running on the Gens emulator running on Parallels running on a Mac and yes each of these minor details is relevant to the story that follows) when a 3.3 shook my house at around 12:05am. I’d never felt an earthquake before so my first reaction, the obvious reaction during such an event, was to run outside to see which car had managed to implant itself in the side of my house. No loose vehicles, and the propane tank belted to the outside of my chimney had figured out how not to explode at midnight so all was good. In all I suffered no damage or losses which is rather new considering what I’ve been dealing with lately.

My House
My House

Extract Audio from iMovie… well, sorta’


Right before I posted this tip I Google’d and found this answer. I’ll still put my solution out jst because, well because I spent so much time writing it.

I was talking to my buddy the yesterday and he was showing me his new Sprint Instinct. It’s kinda cool and compares feature wise pretty favorably to the iPhone. However in all-together elegance, it’s not quite there. Anyhow we get to talkin’ ’bout phones, I pul out the iPhone which leads to a discussion on Mac stuff. Somehow the conversation turns to iMovie, the topic of today’s post. I was explaining that I figured out how to pul the audio tracks out of iMovie. The catch is that there really isn’t any way to pull out audio from within iMovie itself, no way that I’ve been able to find.

The trick is to extract the audio before you fiddle around in iMovie. So far I’ve managed to do this with .mov files but it may work for other formats. I since I work primarily with Apple tools when I do video editing it has worked out.

Audacity
I used Audacity for the past couple of years and only recently got serious with it. I learned that you can open/import .mov files in audacity and work exclusively with the audio. After editing you can then spit the audio back out in multiple formats like mp3 or wav to be re-imported into iMovie. You can then delete the original audio track in Movie and line up the edited track accordingly.

There are many other nice features found in Audacity. You can use it to record any sound coming from your machine (set the Sound Flower driver for the input source in Audacity and set Sound Flower as the output source in Audio preferences), you can use it to record ad-hoc narrative from the built-in mic (Just hit record with the default settings), and you can add noise reduction, amplification and/or special effects to your audio. I’m still only scratching the surface on this tool.

Why would I want to do that?
Audacity, iMovie, audio extraction become important when you want to do a screen cast. Screencasts are a good way to introduce a programming concept, IDE feature, or a particular solution to a problem. However recording a screencast realtime exposes bloopers and blunders, like coughing, throat clearing, and other bodily noises that you would rather not entertain your audience with. You’d probably want to cut long boring sequences or re-narrate stuttering for clarity.

I’m drifting off topic so let me stop here. Look for more tips on video and image editing here in the future.

Subversion 1.5 and XCode 3.1.2


Why don’t somebody fix this already? I think I finally got the latest XCode 3.1.2 to work with the latest Subversion 1.5 release. This was after downloading the latest 2.2 iPhone SDK. I scoured the web and found the best tip here. There’s another possible more automated solution here but because I don’t feel comfortable running a bash script I copied off of some web page (try it and you’ll cuss. Then you’ll see what I mean!) I went with the other approach. I’ll shorthand the steps I followed below because following the first link above, I think, misses some important files and doesn’t work correctly. The general idea is to copy your Subversion installed libraries (assuming you used the Collab.net bundle) into the place where XCode binds to.

From your home directory:
mkdir svn-bkup
sudo cp /usr/lib/libsvn_* svn-bkup
sudo cp /usr/lib/libapr-1.dylib svn-bkup
sudo cp /usr/lib/libaprutil-1.dylib svn-bkup

sudo cp /opt/subversion/lib/libapr-1.dylib /usr/lib
sudo cp /opt/subversion/lib/libaprutil-1.dylib /usr/lib
sudo cp /opt/subversion/lib/libsvn_* /usr/lib

[restart xcode]

That’s what I did and now it no longer complains “error 155021 this Subversion client is too old and stoopid to work with your shiny new svn checkout that’s just bananas!” Your error message may vary but the concept is the same.

This message is brought to you, in part, by the proud sponsors listed in the Hall of Aim.

iChat vs. Adium?


So I’d been using Trillian, then Gaim (now Pidgin) then Kopete then Adium. Now I’m stuck on iChat. I can’t even remember why I started using Adium on my Mac. Probably peer pressure from the guy that taught me everything I still don’t know about OS X. (No not you, Apple Hat, I knew a Mac zealot before you, the same guy that got me hooked on Linux.) iChat is a really good app as is the majority of OSX built ins. You can not only do A/V chats but you can share documents,and do remote screen sharing. It’s proven a priceless tool on the geographically disparate team I’m assigned to. I’ve heard you can record iChat calls which is something I have yet to toy with. Now I’m seriously wondering which advantages Adium has over iChat. Really, I switched for a reason, only I’m too lazy to figure out. maybe you could remind me? I’ll start the comparison. Adium has more granular control over the event system. Leopard seems to have removed some of the controls in iChat. What else?

Looks different on Safari


I’d been doing this site for about 2-3 years now and nobody didn’t never told me that sometimes Safari tends to skew my content. The images I post, in particular, don’t render the right way. It’s only recently that I began using Safari more frequently and while I’m not yet replacing Firefox I am getting comfortable without it. For what it’s worth… to the twenty or so visitors I get each day… I’ve updated my theme. I’m not quite satisfied with my mug shot at the top but it’ll do. If you twenty visitor feel comfortable with the new look then maybe you can grab twenty other people and raise my hit count to the 40 or so daily hits that will promote my site from terrible to tolerable.

Groovy Mobile Development On Maven For Mac


[click here to for the Subversion link to the Groovy Maven Blackberry Tools]

*Update* You do need to download and install the JDE or the Eclipse JDE plugin to be able to build a dependency for my plugin. I incorrectly stated this is optional below because it had been over a year since I used the tool myself. I am writing a followup post to elaborate on the inaccuracies.

…Because I couldn’t think of a dumber name. I’ve been sitting on this code for quite a while now. I’ve also been very busy. Busy learning/reading/writing JQuery/Java/Javascript for the MapQuest Local and Gasprices pages (my official means of keeping my house warm), busy fiddling with RubyCocoa, Objective-C and regular Cocoa on the side as my after hours pet-project, and busy trying to keep two crappy cars on the road while my hot water heater explodes leaking rusty wetness from years of neglect all through my finished basement while I sip Bud Ice a flight above completely oblivious to the disaster. (I’ve also been busy trying to put together some demo stuff for the kids at school… Cliff loves the kids like Martin.) What I haven’t been busy with is following up on the cool Blackberry stuff I used to do earlier this year. I’ve been watching my hit counters and page statistics climb up from the thirteen people that originally knew about me to a whopping 15.5 and I’ve been watching as those extra 2 1/2 people like to hang around my Blackberry posts. I’ve been feeling sorry for these 2 1/2 persons… particularly the 1/2 guy because his legs and lower torso will probably never grow back as he claws his way through the internets using that one good arm in a desperate attempt to pull his head and chest up to my home page expecting to finally see something worthwhile. (Thank you dearly Mr. Half-man-half-missing! I couldn’t have made 15.5 without you!!!) As a result I bring you today’s half-assed attempt at sharing my work.

I just committed three, count them, three maven plugins each written in Groovy over a decade ago (in computer years which is roughly 6 human months). These plugins are intended to make your mobile development life easier and, if you prefer Mac OSX, possible. I haven’t actually looked at the source code since they’d been written I just thought it was finally time to throw them out in the wild.

Maven Gant
So far I have a gant plugin which is something we use internally to launch Gant from Maven. I caution that I’ve found issues with the Groovy Maven support in that not all of the Groovy goodness is available such as the RootLoader and other things that I can’t remember hitting my head on. However it works for basic Gant builds and I think it makes its way completely through our complicated Maven/ant build wrapped in a Gant coating after we take care to explicitly file system load some extra Ant task jars. (Something about Maven calling Gant calling Maven calling Ant to load the Maven Ant tasks just doesn’t work right.)

Midlet Maven
I threw together a MIDlet helper Maven plugin to do OTA uploads to a slightly modified version of the Antenna OTA server. It should work with the official OTA server as well and if it doesn’t drop me a line and I can point to the single line of code that needs to be changed. I think it should do a PUT instead of a POST for the upload, my modified OTA server accepts either and I should just fix the dang file or post the modified OTA or both instead of rambling about it but since it’s easier to ramble than to do any real work, there ya’ go.

Blackberry Maven
This is my latest committed version of the Blackberry plugin for Maven. It’s the very same tool I used for compiling .cod files on my Mac way back. Alls yuh haff tuh do is install this Blackberry tools bundle in a secret location on your hard drive… or even better install a Maven proxy repo then pull the bundle from their. It’s simple yuh see… alls yuh haff tuh do is download something like Artifactory, unzip it, oh yeah… you’ll need something like Jetty to run the war file that you unzip… oops better grab Tomcat because I remember a lingering problem with Artifactory on Jetty, so yeah, get Tomcat right? Then configure it as a Windows startup service. Then maybe enable the admin and manager console cuz you’ll need to admin and manage it. Then maybe fiddle with the server.xml to get it on port 80, then mebbe you wanna put Artifactory in the ROOT context b/c you wanna be able to just browse the machine with a simple URL. Now why were we configuring Tomcat again? Oh yeah, the Artifactory thing that will eventually hold the extra bundle that the dumb rapc compiler depends on… You know what? Keep it simple. Copy/paste the repository folder from the Groovy svn location over top of your repository under ~/.m2. (Be careful on OSX because this is a replace copy instead of an append copy. Mac users should just drag the net folder from within the repository folder into their ~/.m2/repository). From there you should be able to use Maven to compile cod files from Java source. If everything works well enough, you should also be able to upload to an Antenna OTA server hosted in the clouds and then install to your device. Unfortunately the USB loader doesn’t quite work under OSX so unless you have parallels installed (in which case all the OSX specifics is moot) you’ll need to do it this way.

DANGER!!!
The Blackberry plugin supports only Blackberry OS 4.3.0 and higher. While it will generate cods that run on earlier revisions of the OS you will be subject to the all too painful verification error. I was in the middle of making it compatible with earlier revisions when I hit a few snags, particularly with the rapc tools. To be perfectly honest I STRONGLY reccommend a different approach if you want to build for Blackberry OS < 4.3.0.

These tools are sitting on the Groovy Subversion repository. You DO NOT NEED TO INSTALL GROOVY. You also do not even need to download/install the JDE. The only tool you need to use are the tools and compile to rapc files is Maven. Download/install Maven, check out from the subversion link, move the repository from the checked out folder into your $HOME/.m2 folder, and run “mvn install” in each folder then you’re all set! If there are any Maven/Groovy people out there that wish to help me build these tools out feel free to jump in.

Lemme Upgrade


In just over two hours this site (as well as thousands of other WordPress blogs) are going to get an upgrade. I find this funny because a buddy of mine… lets call him Bob because that’s his real name… anyway Bob had gotten this song stuck in my head for the past two days. Even more funny because Bob is one of the last people I’d expect to find singing such a song. I mean I love Bob, he’s one of the coolest people I work with, no offense but man… Bob?? Beyonce??? Sorry for the off topic post. It’s another one of those you’d have to live it to feel it.

(It’s crazy how much of the crap I post sounds so crazy while most of it is either 100% true or 95% grounded in reality.)

The Leg Bone’s connected to the…???


No matter how many times I tell my four year old back, up she continues to play kiss the door knob. No matter how many times I warn my 9 year old to thumb-tack her book-bag to her spine in the morning, she continues to show up at school sans knapsack. I somehow believe my kids enjoy hard times, appreciate the torture of incinerating your appendages on the hot oven door, and outright live for the moment somebody will come crashing through the doorway embedding the door handle in a young forehead. Then I realize there are certain things that they won’t include in the text books… certain things they won’t teach in class or during an online tutorial. These are the things you have to find out by smashing your nose, breaking your arm, and making an absolute fool of yourself. It’s the first step in agile development is it not? It’s the red before the green-refactor, isn’t it? It is amazing to watch the test driven antics in somebody less than half your age.

Before I allow George Killian to seep deep enough into my blood stream to rip the original intention out of my cerebrum let me explain what I just learned. Apple’s Interface Builder != Springframework. Sure it tastes like apple pie but there are no apples in it. Here’s the deal. You would think (or you would if you wore an argyle sweater like me) that wiring a UIImageView to your controller would be sufficient enough to make that same UIImageView available when you loaded the controller from a nib file in the main bundle wouldn’t you? [Yes you would because you’re me in this hodge-podge example… just play along! I don’t care if you never heard of a nib file. Nod your head and say uh-huh…] Calling initFromNib on your controller will read in the nib file and eventually perform the internal connections/plumbing but your next statement will be in for a surprise if it attempts to inspect or dig values out of the controller that are connected to other things with Interface Builder’s connect the dots magic. Here’s what I mean. Create an arbitrary UIController named LegBone and give it a HipBone IBOutlet property. (Create a HipBone class in your project.) Create a nib file, open it in Interface Builder and set it’s FilesOwner to LegBone. Drag and drop an object from the library into the nib file’s main window and then connect the legbone to the hip bone. In your app delegate, instantiate the LegBone using the nib file and declare a local variable of type hip-bone while setting it equal to the property from LegBone on the following line. Run all of this in the debugger and watch as XCode reports 0x0 (or null, or is it nil? What’s the doggone difference and can we settle on a universal nomenclature for a value that doesn’t exist across all programming languages???!!!) when you step to and hover over the LegBone.hipbone property assignment. It should look roughly like this (not compiled or cross checked due to laziness):

LegBone.mm

@interface LegBone : UIViewController
   IBOutlet *HipBone hipbone;

@property (nonatomic, retain) IBOutlet *HipBone hipbone;
@end

MyAppDelegate.mm

@implementation MyAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	LegBone *myLeg  = [[LegBone alloc] 
								 initWithNibName:@"LegBone" bundle:[NSBundle mainBundle]];
        HipBone *hip = [myLeg.hipBone];
        NSLog(@"My hip is %@", hip);
}
@end

Of course after catching the problem the obvious thing to do here is to instantiate the hip in your delegate and set it on the legbone since Cocoa is too lazy/slow/unwilling to do it for you. That brings me to my next surprise. I caught this immediately afterwards but it could have easily been one of those 2 day investigations that check everything but the obvious. Setting the hip bone programmatically without clearing the connect-the-dots magic in InYourFace Buildher will only be undone by the runtime when it finally gets around to connecting your dots during runtime. In other words, say you have this:

@implementation MyAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	LegBone *myLeg  = [[LegBone alloc] 
								 initWithNibName:@"LegBone" bundle:[NSBundle mainBundle]];
        HipBone *hip = [[HipBone alloc] init];
        myLeg.hipBone = hip;
        NSLog(@"My hip is %@", hip);
}
@end

And pretend you forgot to remove the HipBone object in Innerplace Biller. You’ll fix the nil pointer in the app delegate but then inside LegBone you will be talking to a different hip. For a beginner like myself, trial and error will likely never show the core problem. You have to know what to look for. You have to know that wiring is performed at runtime and possibly at a later stage or in an entirely different method. It’s like Dr. House says, “When something doesn’t make sense, one of your assumptions is wrong.” In this case you would assume that initializing a controller from a pre-wired nib will instantiate all of your nib file’s internal objects and prime all of the setters. You would assume that these things happen before control returns to the next statement as it would if you were loading a Spring beand factory and asking for a bean. That’s all for now. I’m going night-night.