Friday, June 29, 2007

Wow. Just..... wow.

I was always a big fan of ReiserFS. It did a good job on filesystem recovery from sudden calamity, and was great with metadata over many small files. I moved to ext3 recently, despite being incredibly slower, mainly due to the more cautious journalling features.

I heard about Hans Reiser's wife, him being a suspect and his friend admitting to murder of eight other people. But Wired's article on the subject is an unbelievable piece of art. By juxtaposing code snippets of ReiserFS with the crescendoing story line (especially if you recognize the code), there is an amazing amount of suspense and revelation that works in tandem to the first-hand narrative. Reading
+ warning("nikita-3177", "Parent not found");

gave me absolute goosebumps.

Sunday, June 17, 2007

A Package On Your Doorstep

I first started working with CrystalSpace in 2003. Back then compatibility would change from version to version, building CS was a regular task and CEL was still an up-and-coming project.

Then this January the team announced the first stable release of CrystalSpace; one feature-complete and ready to be production ready. It's amazing how mature the project has become since then... documentation has flourished, CEL has become a fantastic development framework, titles can be developed with little to no coding and Blender integration is now ready for prime time and sponsored by the Blender project itself.

Not only that, CrystalSpace has finally hit the prime time: binary packages are now widely available on most Linux distros. Debian has been carrying packages for a while, but now native SuSE RPM's are available via PackMan.

No, you shut up.

Now people can develop entire titles while only focusing on content creation and scripting, allowing people to focus on what makes a game a game. Not only that, there are copious templates and examples for how to build projects. And you no longer have to build packages every night. And it's open source and readily available. It blows my mind.

Wednesday, June 13, 2007

I've Never Been So Excited for an Apricot

Blender has been the model editor of choice for CrystalSpace for a long, long time. Most of my CrystalSpace documentation has revolved around using Blender to create content for CrystalSpace code. The two together are like peanut butter and bananas. Fantastic.

Recently Jorrit made an exciting announcement on behalf of the CS team - Blender and CrystalSpace are partnering to build Apricot, an independently developed and completely open game title. To fully understand my unbridled enthusiasm you have to understand Elephants Dream, originally called Blender's project Orange. This was an open movie project - a full movie title with all content released under a flexible Creative Commons license. Textures, models, all production files are freely available. This did unbelievable things for Blender. Not only did this give users access to professionally generated content, new documentation and a whole new realm of tutorials it also pushed the envelope for Blender itself. Orange generated demand for whole new genres of features, and kept the Blender development team pushing point release after point release to keep up. If I recall correctly, Blender's hair generation system was largely built due to demands made by artists creating content for Elephants Dream. Not only did the movie promote Blender, it made Blender a production-quality product that could demonstrate it was ready for prime time.

The same envelope is getting ready to be pushed for CrystalSpace now. That's where my unbridled enthusiasm lies; CrystalSpace has been a commercial-quality 3D engine for a while now, but now every stage of the production process will be thoroughly tested and fleshed out. While I have no doubt that this project will result in enhanced functionality grown by the demands of the game developers, I'm most excited about the tool chain being completely fleshed out. In my mind while the Blender exporters for CS were fantastic, all the corner cases hadn't been completely covered. With Apricot, model exporters should be polished, skeletal animation should be more integrated into Blender armatures, physics should be more strictly related to Blender riggings and meshes should have attributes that more exactly equate to CrystalSpace equivalents. This should make the entire end-to-end content generation process as smooth as a polished stone.

Nothing like a real-life, production quality project will take the edges off of the various and sundry tools used for development. It's amazing how much one will forbear when it's not a "huge issue," but when you encounter the same "not a huge issue" twenty times a day it suddenly becomes something worth tackling. Ideas and features may be the result of inspiration, but the remaining 99% of time spent refining a project is sheer perspiration. I'm looking forward to both projects' continued trial by fire, and seeing what has been forged once the fires have quieted down.

What the NDS and iPhone Have In Common

This past weekend I saw a copy of Opera for the Nintendo DS just idly sitting on the store shelf. I picked up a copy and thought to myself "damn, I'm out of the loop. I didn't even realize this was out yet!" Evidentially I picked up an early copy - the release wasn't reported until the following Monday.

I'm surprised how much I'm using the browser. I didn't think I'd be the type to roam through my house checking random sites on the NDS. But in an age of ubiquitous WebMail and continuously streaming blogs, a device that allows you to quickly scroll through snippets of online text is actually pretty useful. There turns out to be plenty of opportunities where I "just want to check something," such as see if a webcomic has been posted for today or check if I've received new e-mail at work. Instances not exactly worth booting up a laptop, but perfect for just cracking open the NDS and hopping on wireless briefly.

The DS doesn't have an open third-party SDK, and no accessible means for running homebrew currently exists. Instead, Nintendo is hoping that Web applications will grant enough functionality to fill the gap. Sound familiar?

Steve Jobs' recent keynote hammered home the insistence that while 3rd party API exposure won't be available for the iPhone, Web applications will be more than enough to offer custom functionality. He suggests that a Web browser can be used in lieu of an ability to launch third-party applications.

The assertion that modern Web applications, what with their asynchronous JavaScript and XML, can replace standard applications is pretty ridiculous. Can JavaScript monitor what roaming tower your SIM card is using? Er... no. Can XML be used to play Doom? No. While you may be able to monitor a RSS mashup, no applications can leverage the hardware in your hand. Saying that any Web application is going to replace a device's native API is hella stupid.

But will the lack of third-party applications hurt the iPhone's success? Not likely. Lack of homebrew availability on the NDS hasn't exactly hurt sales all that much. If you do something and do it well, you're going to sell.

Sunday, June 10, 2007

Muted Games N Music

In the time that has passed since I first lamented the DS' limited ability to execute independent applications Nintendo DS development has become increasingly mainstream, and along with that a slew of affordable and easy-to-use NDS flash cards have become available that allows independently developed applications to be executed on the DS. There's even a retail flash card now - the "Games 'n' Music" cartridge. I'm not linking to it... it lacks the file system drivers that make it a useful device. But it's the first flash cartridge (that I know of) that's widely available in retail channels such as your local neighborhood BestBuy.
I picked one up, just to see what it was like. It lacks DLDI support, which means it can't interact with the filesystem. If it can't interact with the filesystem, that means no save games, no loading libraries, no loading maps, no user profiles. Blech.

But it's in retail, which makes it interesting. And it boots DS Linux, which is at least mildly intriguing. At it's cheap... only $35 for the flash card, 128 microSD card and a microSD USB reader. I might waste an equal amount on a craptastic NDS title... so I don't feel too entirely guilty about buying a flash cart that's missing a DLDI.

I think I understand why Datel didn't offer DLDI support. By disabling DLDI people can't execute pirated ROM's from commercial cartridges - instead people are stuck with pure homebrew that doesn't require local storage. This could possibly limit ROM execution of course... but this also wrecks a lot of homebrew.

Thus far I've booted Linux, tried a video and failed to play one homebrew title. Maybe this will eventually gain usefulness once the cart's filesystem is cracked, but until then it may just stay in the bag.

Thursday, June 07, 2007

Bluetooth Affinity

Now that I have my handy-dandy Bluetooth phone I'm a regular Bluetooth addict. I've always had an odd engineering respect for the specification (the true measure of a geek is how emotionally attached they can become to a tech spec). Bluetooth seems to have been designed by engineers for engineers, and done very well. The fact that it uses the Hayes Command Set gives me that odd sensation of nostalgia... like seeing a Pac-Man clone on a modern $600 cell phone.

I was pretty impressed with Linux Bluetooth support - a single KDE desktop applet allowed me to browse all Bluetooth devices within range and view their individual services. Within only a few seconds I was able to transfer files and view device status... very schwag.

One thing I didn't understand until now was the concept of Bluetooth "profiles." Just as TCP may be a conduit for HTTP or FTP, Bluetooth is a conduit for OBEX exchanges or headset commands. It makes sense in retrospect, but Bluetooth host devices offer up services such as HSP (headset communication), OPP (pushing files) or BPP (printing).

No OSS project I've run across so far has been able to do vCard or vCal retrieval or transmission. Most projects appear to perform vCard and vCal access via OBEX, which Linux supports. One thing I was hoping to do was send vCards and vCals to and from the phone, but thus far I've been unable to do so. My phone doesn't have the SYNCH profile used for PIM exchange, yet it supposedly transmits raw vCards over Bluetooth... but I haven't been able to get Linux to receive them. Something I can hopefully remedy.

This limitation seems to exist even in commercially available products. DataPilot evidentally supports syncing the phone book, but not the calendar or text messages. Mobile action is evidently C|Net's choice, but just does contacts also.

From what I can tell, my handset supports:


Headset Profile

Uses Hayes Command Set for headset operations


Hands-Free Profile

Used for car interop. Synchronous Connection Oriented link with mono, PCM audio


Dial-up Networking Profile

Networking dial-up abilities using SPP from laptop or other workstation


Object Push Profile

Transfers are always instigated by the sender (client), not the receiver (server) using the APIs of OBEX operations connect, disconnect, put, get and abort


File Transfer Profile

Uses OBEX as a transport and is based on GOEP for getting folder listings, changing to different folders, getting files, putting files and deleting files


Basic Printing Profile

Sends print jobs to printers without needing drivers


Advanced Audio Distribution Profile

Possible ALSA integration, used for headphones & media players


Audio/Video Remote Control Profile

Used in concert with A2DP or VDP to allow a single remote control (or other device) to control all of the A/V equipment to which a user has access

Tuesday, June 05, 2007

Requiescat In Pace

It has been a fantastically horrible month in my real life. I'll just leave it at that. All my current projects, including the portal I was hoping to launch, are pretty much indefinitely on hold.

In other news, I've been trying to find a better way of connecting to my home network while abroad. I've been using SSH to connect and locally forward ports to the home network, but that meant every service had to be hard-coded. Instead I've been evaluating OpenVPN on OpenWRT. Both are amazing projects, and both worthy of considerable attention.

I haven't evaluated OpenWRT in nearly four years now... they had just started using a package manager when I last tried to flash my WRT54Gv2. It's in an amazingly well-adjusted and highly advanced state now... it was hard to believe how flexible the OS & utilities were. Everything worked out of the box with a minimum of hacking. Especially for someone like myself who used to construct Linux home firewalls out of old workstations, this fit my schema perfectly. I was a HyperWRT guy, but as that firmware grew stale I moved an entire distro-in-RAM.

OpenVPN is further evidence of why IPSec tunnels just never gained proper adoption in the roadwarrior market segment. They work fantastic when joining disparate networks through concentrators, but they just don't offer the flexibility, interoperability and ease-of-use that SSL tunnels do. I was an IPSec advocate in the days of FreeS/WAN, but once opportunistic encryption adoption didn't reach ubiquity they supposedly just closed up shop. PPTP offers good interoperability and ease-of-use, but was ultimately PPP with some wrappers around it. OpenVPN has proven itself to be a secure and flexible compromise between the two while still maintaining ease of use behind firewalls, proxies and NAT's. It may lack a certain "purity" of IPSec, but for roadwarrior and ad-hoc connections OpenVPN is indispensable.

Juniper Networks has a pretty good "Instant Virtual Extranet" platform that incorporates an SSL-based VPN solution which does a great job - it even supports Linux. I have to give a big tip o' the hat to Juniper Networks on that one - the actually developed a VPN client that works properly in Linux. Launch a Java Applet, grant it rights to install a client stub on your machine, then an SSL tun0 interface automagically pops up on your Linux box. Bravo.

But I digress.

The NetworkManager GUI within both Gnome and KDE has support for OpenVPN tunnels, so I decided to give it a try. At first I attempted the most simple case using a static key. For the life of me I couldn't get static key support to work with NetworkManager... it wouldn't even establish a connection despite the fact that it worked manually on the console. I gave up on static keys and instead created a public key infrastructure, issuing client keys when needed. This allowed me to establish a connection just fine, but it brought one critical bug to the surface: DNS resolution was subsequently borked, since NetworkManager wiped out resolv.conf once the tunnel was initialized. Fooey.

So instead I created a manual script that initiates the tunnel. That appears to be working pretty well now... no big worries. For now it's a straight UDP tunnel, but I might change it to TCP down the road.

The configuration wasn't too bad - I followed the HOWTO Quickstart pretty much by the letter by creating the keys, issuing them to clients then using their sample server and client config files. On OpenWRT, all I had to do was create an /etc/init.d/S50openvpn script to start OpenVPN on startup, then add the following firewall rules:
### OpenVPN traffic
## -- Permit initial negotiation
iptables -t nat -A prerouting_wan -p udp --dport 1194 -j ACCEPT
iptables -A input_wan -p udp --dport 1194 -j ACCEPT
## -- Permit tun interfaces
iptables -A forwarding_rule -i tun+ -j ACCEPT

Now I'm able to connect and browse at will. Not too shabby!

Amazing that you can build a VPN concentrator, WAP, firewall and management station for a little more than $50. Ultimately you end up with more usability than you could get with a $200 cheapo desktop.