May 07, 2008
I'm getting married! Plus other stuff
So I've been somewhat quiet after my last post, but I've been pretty busy. Working and stuff around the house have taken their toll, and I've been stepping away from oss projects that I feel I've contributed what I can to. I've already stepped down from Adium, and I'll be stepping down from Perian soon.
In general there's just not enough time in the day for everything I want, hence the stepping away. The Growl project itself hasn't been where I want it to be, and that's my fault due to the fact that I'm the one who's providing leadership for the project (along with the Lead Dev), so I'm going to work at getting that up to snuff.
So, that's what's happening with me and oss projects. I'm not totally gone from the others, but I'm only around when someone needs to ask me a question.
Now then, on to the subject. I'm getting married! She's pretty awesome (obviously, I'm marrying her), and funny too. Like last night, we registered for the wedding, and she just kinda took the gun and ran around scanning, I lost her for about 15 minutes in target, and 30 minutes in bed bath and beyond (you can see the Target bridal registry here and the Bed Bath and Beyond bridal registry here). Eventually I found her looking for me while I was looking for her, it was comical.
We've got most things planned out already. My cake is going to be pretty sweet, and hers is just plain awesome. The wedding is in the beginning of September, so if anyone happens to want to come, just shoot me an email and I'll get you the info.
Overall, I'm happier now than I have been in the last 3-4 years. People at work see a noticable difference that they comment on a lot. Life is great.
Posted by Chris Forsythe at 12:49 PM | Comments (5)
March 17, 2008
Considering switching away from os x
So for a while now I've been looking at the differences between different operating systems, and they all seem so similar now that it really just boils down to third party products and hardware for me.
I took my laptop in to the apple store on Saturday, the Galleria one. I got in line quick, but the "genius" was a complete jerk. This is not uncommon for the galleria store, but they were the closest. They quoted me at around 650 dollars to get the laptop fixed.
This was surprising to me. I had purchased applecare, and I have previously had an entire laptop just replaced. I was less than happy, but I decided to leave once the guy kept repeating the company line.
I went to the Woodlands Mall apple store yesterday. Previously I had gone to the woodlands mall, shown the guy a picture there, and they said they'd fix it for free so long as I didn't mention dropping it. Since I don't know how it broke, this was not any ethical question or anything, so I did what he said.
They said it was a tier 2 or 3 repair, which is still pretty high. Somewhere between 650 and 850 dollars. That's practically a new macbook, and definitely a new mac mini. The frustrating thing is that if this were an acer or a dell and I had purchased the warranties, it would have been covered.
The laptop itself is fine, but I messed up the file system and don't have an intel machine to restore a file system onto it with, and as the superdrive is inaccessable and I don't want to buy an external dvd drive, I'm sort of stuck.
There are a few reasons I stick with the mac. There's a thriving community here, and the software is easier to find than other platforms. I have invested a lot into the mac, but I did switch before, twice.
So I'm pretty much out the price of a new laptop to fix this laptop, basically I'm at the crossroads of where I'm going to go with computers for the next 10-15 years. Do I stick with macs, all of which have failed on me in some way (with the exception of the imac), or go with some more reliable hardware, or at least hardware that isn't going to put me into a bind long term?
If so, how do I replace my apps?
If only I had read the fine print of applecare instead of trusting Apple. I realize that it's all legalese and that I should have read it, but it's also implied with the way that applecare is marketted that it covers stuff.
I will have to say that the technicians at the woodlands mall were all very nice people, even with delivering bad news, and that Apple really needs to retrain the people at the Houston Galleria store for how to treat customers. Being a jerk isn't cool.
So ya, I don't know why I should stay on os x. I like working on Perian and Growl, but is that enough to keep me on the platform? Everything I need to use, with the exception of Growl and quicksilver, are on the other platforms. I'd only be missing out on itunes for my phone really.
*sigh*
Posted by Chris Forsythe at 04:12 PM | Comments (13)
December 19, 2007
Introducing Natuba AKA What I've been working on
So The recent interest in iPhones is possibly related to where I'm working now (I had one before). We just put out the app last night, I've finally been able to post about it today.
The app is called Natuba. It's a web application, different than the other apps I've worked on before, which to me is interesting in itself, I'm in new territory with it.
Basically the app is so that you can take pictures or text and post it to the web. I was actually starting to get interested in doing this when I met the guys here at Natuba, but it that interest just got more intense. With Natuba out there, I finally have a place that's easy to use to post my stuff online with, everything else was just frustrating while on the go. I found this utterly frustrating on other sites.
There is some text that we put up on the Natuba blog that I think is appropriate to put here as well, along with some screenshots, especially since I'm putting my name behind it (along with the other guys working on Natuba with me). Feel free to let me know what you think about it, and definitely give Natuba a try!
Here's that text:
Introducing Natuba
It’s the holiday season, so it’s fitting that Natuba gets to be unwrapped! Today we’re releasing Natuba to the world!
You may have found that uploading Photos and Shouts (text messages) from your iPhone to the web while on the go isn’t easy. That all changes today! Now, you can put all of your Photos and Shouts onto the web in an instant. Natuba allows you to easily post this stuff to the web for others to see, rate, comment on, and share with everyone else. Sharing your Photos and Shouts with the world is what Natuba is about.
Natuba and You
A picture is worth a thousand words, so let's take a look at a couple of screen shots of the site to introduce you to Natuba. Let’s start off with the meat of the site, the content page. Once you have a Photo or Shout posted, it’ll look a little bit like this:

Some of the features here include:
- #1 Titles - The title
- #2 Your Content - This example is a photo, but you can post either a photo or a shout.
- #3 Description - Here you can type a longer description than the title.
- #4 Rating - Ratings allow you to say how you really feel about some content.
- #5 Tagging - Tags are words used to help you organize your stuff and help other people find it.
- #6 Comments - Comments allow you to participate in conversations, or to share your opinion!

Using Natuba with your iPhone
The next thing I’m going to show you is how easy it is to post to Natuba from your iPhone. To begin, find a photo that you would like to post to Natuba, and then tap the little arrow in the bottom left:

After you tap that button, it’s pretty easy to upload the Photo. Check out this link for more information about how to get started.
Natuba is great for putting your stuff online, but it’s also pretty awesome for browsing other people’s stuff while on the go. Just point your iPhone at Natuba to begin. It’ll look a lot like this:

Everything else!
Here are some more features not shown in the above screen shots:
- Surprise Me! - Click on the “Surprise Me!” it’s fun and addictive!
- Related Items - If you like what you see, look to the right and you’ll see some Photos and Shouts in the Related Items area.
- Editing the Description and Title - The Title and Description of your Photo or Shout is important.
- Many more features, check the site out to find them!
Well, that's all. Let me know how you like Natuba!
Posted by Chris Forsythe at 07:15 PM | Comments (0) | TrackBack
December 03, 2007
Growl site redesign
For about a year now we've wanted the Growl site to be redone. )Probably longer than that actually, but I'm positive that at least for a year we've wanted it). The problem with a project like Growl is that you can't just commission someone to work on your design, since you can't pay them, but at the same time you want to get a high standard of quality out there.
Luckily we finally hit upon the right timing for a great guy, Dan Deming-Henes. He's come up with an awesome design that so far everyone loves. I'm posting here to get some feedback about the design itself, so make a comment if you love it, you hate it, or whatever.
Just for comparison, I'm posting two screenshots:
Posted by Chris Forsythe at 05:50 PM | Comments (7) | TrackBack
November 26, 2007
Interview with Jamie Hardt of calllog2ical (formerly iphonelogd)
Hi Folks,
Fresh on the heals of my interviews with Alex Schaefer and Rudy Richter is this interview with Jamie Hardt. Jamie is the author of a bit of Ruby magic which is rather useful, called calllog2ical (formerly iphonelogd). Read on for more on Jamie and his cool bit of software for the iPhone.
So who is Jamie Hardt anyhow?
I'm a sound designer and sound editor based in Los Angeles, California -- you can see my credits either on my website, soundepartment.com, or by searching for me in the IMDb.
I write software mainly just to scratch a particular itch I might have at a particular time. I wrote a cuesheet formatter called "Agent Orange" -- so named for its ability to kill tress -- a kind of program that turns CSV data into a sort of Gantt chart for audio playlists, because there were no good products on the market and I wanted to make sure any future products met a certain minimum standard of quality. It's also implemented in Ruby, and is distributed with a little Cocoa GUI to help people use it.
I'm completely self-taught as a developer; I never took any programming classes in school, and I only really got my start when I installed the Developer Tools CD from Mac OS X 10.3. My continuing education comes from K&R (the ANSI C version), developer.apple.com, cocoadev.com, and the Pickaxe Book. I had always done little projects in Filemaker, but as I was asked to build more and more complex databases, and I found myself using more and more complex processes in my work, I was frustrated with its limitations and started looking for something else.
How have you found that your workflow has changed since moving away from FileMaker?
Not really, it just makes the things I do easier; I don't have to tech support Filemaker databases anymore! I like being able to solve a problem for someone and doing it FINALLY, without having to come back and fix things for them, and leaving them happy, and Filemaker was kinda failing at that.
Filemaker is fine for applications you're doing yourself, but applications you do for another people is a different matter.
Are there any things that you miss from developing with FileMaker that you do not get with Ruby or Cocoa?
The speed of turning a simple project around, I guess, but I hesitate to call making a Filemaker database "developing."
What made you want to start working on calllog2ical?
I came to my iPhone from a Treo 650, and while my Treo was really beginning to wear on my patience, I really liked being able to download my call log from it at the end of the year, for tax purposes. There was a nice little shareware app on the Mac that would extract your Treo's call log and spit it out as CSV.
Apple, being who the are, made a very good phone but forgot to give us a way to extract a phone log. I'm a freelancer and do a lot of contract work, and I like to keep track of who I talk to on my phone and when so I can, as stated, properly document my cell phone as a business expense.
So I wrote the script to accomplish this task with the iPhone (I haven't written the iCal-to-spreadsheet script yet, but I don't think it'll take more than an hour or two). I was originally going to write a program that exports the call log to a text file, but there's a problem. When you clear the call log in Phone.app, the calls disappear from the database, and your iPhone will regularly expire old calls off the end of your call log. Thus, reading the call log at any one moment will not give you the call log for a long period (like a year).
What you need to do is have a program that you run regularly to extract phone calls from the backup and move into a database of some sort, that intelligently inserts only new events and won't drop events if they don't happen to appear in the call log today. The iCal Calendar Store just happened to be in the right place at the right time for me; I could've made up a little sqlite database to store the calls in, but the iCal database is suited specifically for this kind of time-dependent data, and the kind of presentation you get, on a calendar and in your agenda, is pretty appealing.
It's major weakness is that you have to run it regularly to move the calls across to iCal, and you might lose calls if you don't run the script as often as you clear your call log. You could go a long ways to fixing this by (for instance) detecting when an iTunes sync occurs, which I'm sure is possible by observing the iPhone backup files, though I haven't investigated this in depth. Another way to fix this is to write a script that runs on your *phone itself*, and backs up old calls every day before they get sweeped, but I personally am avoiding hacking my iPhone until Apple supports it.
Do you typically find that Apple leaves some things out that you need like with calllog2ical (or things like Perian or Growl)?
I think they accomplish everything they set out to do.
Is there anything you'd change about the iPhone (besides call logging), if you were given the chance?
Mostly calendar stuff, like showing which calendar an event is from and OTA subscribing to calendars (er syncing). Laptop tethering for the EDGE service would be nice too.
It's really an excellent phone for someone like me, that does most of his work on contract or freelance, and is responsible for keeping his own agenda and contacts. I think Phone.app and MobileSafari.app are the best programs of their kind on any phone.
Why Ruby over another language, such as Python?
In my process of getting frustrated with Filemaker, I went looking on the internet and found Ruby on Rails (it must have been at version 0.5 at the time or something like that). I was really inspired by some of the cool features in the Ruby language, went out and bought the Pickaxe Book to get a better handle on it. After dealing with Objective-C, I appreciated that Ruby has a very similar underlying mentality, and since I taught myself programming in ObjC I just found it more amenable to the way I like to work. Ruby gave me my first experience with things like lambdas and continuations and anonymous functions, and it has a way of doing these in a way that made me actually understand them for the first time.
I've played with Python as well, but I got the impression it's object-oriented features are kindof a bolt-on, and I have a serious psychological issue with syntactic whitespace (particularly tabs).
Did you need to go out and buy a book based on the fact that the documentation was lacking, or was there another reason?
Documentation of what? Ruby? I just like buying books, you can read the Pickaxe book on the web after all, I just liked having something on paper I could browse at leisure. I think documentation of the Ruby language itself is quite sufficient.
The Rails documentation has always been a little on the sketchy side, but this is a symptom of the fact that it's always getting new stuff put in it and the people who are on the edge of its development seem to get bored with doing things one way for too long :) The API docs are OK, but when you're trying to do something specific, Rails has this problem in that there may be five ways to do some things, and the Rails devs have been in love with each of them at one time or another and have done a blog entry about how their agile practice du jour is wicked cool. It can be difficult to find information on a particular rails mechanism without also getting advocacy for it.
Another related thing: When it comes to answering "How to do X?" type questions in Rails, you generally go thru the wiki or blog entries and see what other people did, and Rails makes awesome example code (I dare say one of its design objectives is to make code that reads well). Of course, on a language level, they get this kind of readability by hideously overloading and aliasing methods and functions, so a lot of the foundation Rails methods, like, say, ActiveRecord::Base::find(), just takes an anonymous hash for an argument, and this hash can contain string keys to values, symbol keys to values, or no hash at all, maybe a string, maybe an array of strings, maybe it need not be an array, merely an object that mixes in Enumerable. The method may take a proc as an argument, or it may yield values to a block (and the arity of the block might be 1 or 2 or none or any combination of those).
That ends my rant, but despite this, I really like the idea behind Rails, and it taught me a lot about programming, and maybe what not to do too ;)
Do you feel the documentation out there is now up to par?
see ibid.
How do you feel about things like RubyGems?
Without it using OSS libraries in Ruby would be inconvenient to say the least; it's a great way to distribute OSS libraries of code. I wouldn't use half the open-source software I do without tools like RubyGems and darwinports. My only gripe is that often my end users don't have them, so *I* have to resolve their dependencies for them.
Why did you choose to go with the GPL?
I was putting it up and the GPL v2 was the first one that came to mind? I honestly don't pay TOO much attention to these debates, but I tend to lean towards the GPL for anything that isn't published for strictly educational purposes.
I like the idea that the code is out in the open, and I wouldn't want someone to sell some kind of "Pro" version for 29.95 when all they did was slap a dialogue box on it. I also think the GPL strongly favors end-users by giving them the right to examine and extend the software they have.
Honestly it was really more of a whim than anything, I could just as well have made it BSD, and since Ruby is an interpreted-only language (for now), it's not really practical for people to add to the script without the changes being visible to all.
Why is calllog2ical important?
I suppose, aside from the fact that I can now do my taxes again, it shows how quickly you can write a little "mashup"-style script using the Cocoa Scripting bridge and your language of choice.
I also suppose, if you didn't value your privacy at all, you could publish your iCal to your website or whatever, and get some kind of twitter-style life-stream. That's not my thing, but some people might like it. Then there's variations on this, like employers keeping tabs on employees, etc.
What are your thoughts on the scripting bridges new to 10.5? (if you haven't messed with them, we can skip this one)
calllog2ical wouldn't have been coded in an hour without the scripting bridge; it's excellent for prototyping an application. For commercial software developers I don't think it's all that important, but for people who want to do a little hack every now and then it's excellent.
I'm curious what Apple's real "Development Roadmap" is for the scripting bridge. Will a RubyCocoa application I build today run in 10.6 without modification? Exactly how serious do they take the Scripting Bridge as a "platform" for development, particularly given that it's really not acceptable for commercial software?
Pies or Cakes?
French silk pie, please.
Posted by Chris Forsythe at 10:59 PM | Comments (0) | TrackBack
November 12, 2007
Interview with Ambrosia Software's Rudy Richter, co-programmer of iToner
Heya Folks,
Next in the series of interviews I'm doing with people who work on iPhone related projects is Rudy Richter. Rudy works on iToner, and works for Ambrosia Software Inc.. Click on through, and definitely check out both iToner and all of Ambrosia's products (personally I like SketchFighter)...
So who is Rudy Richter anyhow?
I'm a software developer with experience in Cocoa, Carbon and the evils of the CoreAudio HAL. I spent 7.5 years working for NASA, part of which I also worked for Rogue Amoeba on their Detour and SoundSource products. I currently work for Rogue Amoeba's competition in the audio space, Ambrosia Software. Some people consider me to be entirely evil, I'm not going to disagree with them.
What kind of Mac do you develop on? Do you have any other macs, or have you had any others previously?
At work I've got one of those 3.0GHz Mac Pro's with 5GB of ram and two 24 inch displays. At Home I've got a 2.66 GHz Mac Pro, a Dual 2.0GHz PowerMac G5, and a 1.5 GHz PowerBook G4 that I use for development. In all I've got in the neighborhood of 50 Macs from SE's to Mac Pro that all function, 2 Sun boxes, and just recently I was given the BeBox and NeXT Cube that Andrew Welch had bought in the 1990's.
What is your typical day like now that you work for Ambrosia Software?
I spend my day split between several support frameworks, publicly released products and unannounced products. A very different environment from both Rogue Amoeba and NASA, the projects range in their level of evilness which keeps things interesting. When someone needs a break from work we've got several video game systems hooked up to the big screen tv. We have a Wii and a PS3, so lunch time is usually accompanied by some Wii Sports. The PS3 has a thick layer of dust on it at this point. I've been here a year now, and you can count the number of times the PS3 has been used on two hands. It is definitely enjoyable to work here.
So you really like the Wii huh? Me too. What's your favorite Wii Sports game, and are you looking forward to any other games for the platform?
We play a lot of Golf and Tennis, but not much else. I don't have a Wii myself but I'm looking forward to Resident Evil: Umbrella Chronicles. PS3-wise I'm looking forward to God of War 3, Final Fantasy XIII and Resident Evil 5.
What led you to work on iToner?
In the period of time leading up to the release of the iPhone there were discussions internally at Ambrosia to include functionality in our Exporter framework for being able to export audio from WireTap Studio to the iPhone. I know quite a number of talented people in the mac development world and it turned out that one of them had written a program to do just that. Cedric Pansky had previously worked with Rogue Amoeba and written AirFoil 1.0, currently he's doing contract software development through his company, Azlance LLC. I suggested to him (at the urging of Michael Simmons) that he might want to talk to Andrew about releasing it as a product through Ambrosia. He agreed and 3 days later we started work on iToner. I was given the task of getting him up to speed with our frameworks and in about a week's time iToner was in its complete and shipping form. It has been a crazy roller coaster ever since then. Each Apple update to iTunes and the iPhone has been equally challenging and fun to work around. When Apple first broke us with iTunes 7.4's wiping of the Ringtones.plist. We had a plan of action before i even got to work, and within 1 hour we had a proof of concept workaround. The first test of my half of the solution with Cedric's half worked flawlessly. We spent the next 8 hours or so getting the solution polished and integrated into iToner and had a build out to testers that night. We shipped the update 24 hours after we started.
Why is iToner important?
Apple needs to realize that not everyone wants to use popular Music for their ringtones. Some people just want sound effects, others personalized ringtones (a lot of people we've heard from record their voices and use those as ringtones), others compose their own music and want to use that as ringtones. iToner allows these people to load their custom sounds onto their phone, audio that they have no other way to get onto their phone. Until Apple realizes this I expect we'll continue to have this back and forth battle with them. The battle has been fun so far, but I'd much rather see them adding features to the iPhone and fixing bugs than working against iToner.
So do you think that this cat and mouse game between Cedric, Ambrosia and yourself versus Apple is going to continue, or do you think they're done for now with changing things up?
I hope they're done breaking iToner, only time will tell. We all have iPhones ourselves and none of us are using music ringtones, we have a vested interest in wanting the product to continue working. We really like our iPhones but we want to customize them beyond the blessed sounds that the music industry is providing on the iTunes Music Store.
Do you think they are targeting iToner, or third party applications in general? Or do you think it's more that they are doing stuff that they need to do, and iToner is just collateral damage?
Some of the earlier updates appeared to whack us as collateral damage, but lately a lot of the updates seem to be directly targeting utilities that put custom ringtones in the user portion of the phone. iTunes 7.5 and iPhoneOS 1.1.2 seem to restore the rename a file to m4r trick, time will tell if that workaround will remain active.
You mean after Apple started selling ringtones through the online music store they seem to have started targeting iToner and applications like it, or prior to that?
Yup, it all started with iTunes 7.4. We weren't impacted by 7.4.1 or 7.4.2 since we weren't using any of the trickery that people had figured out regarding renaming files in the Finder and tricking iTunes into syncing them over. iPhone OS 1.1.1 was the next update that impacted us. We had a fix within a week of 1.1.1 shipping, it took another week and a half to perfect it.
What type of things do you guys have on your iPhones if it isn't music?
My test suite is the Wii sound effects, it constantly tricks people on the floor into thinking its time to play Wii Golf. The other Ambrosia employees mostly use sound effects or short audio clips from tv/movies. I think Cedric has sounds on his from the Final Fantasy games.
What do you think of the iPhone in general?
Its a great little phone. I will be glad when 3rd parties can officially develop apps for it, hopefully they won't limit it to dashboard widgets as their native app development platform. Having worked on EasyEnvelopes it becomes entirely apparent how limiting that will be. The vast majority of EasyEnvelopes is written in Cocoa.
Wait a second, so you're hoping for full fledged Cocoa applications are not something equivalent to desktop widgets? I'm slightly confused since dashboard widgets can use Cocoa, can you explain what the problems here are?
Correct, i'm hoping for full fledged Cocoa applications. Dashboard widgets can make use of cocoa through the use of a javascript-> cocoa bridge and a cocoa plugin. I can easily see Apple limiting the sdk to html/javascript widgets in an attempt to prevent people from getting direct access to the phone's OS.
EasyEnvelopes? What's that?
EasyEnvelopes is a dashboard widget that works on 10.4 and 10.5 that allows you to print addressed envelopes using your printer. Half javascript, half cocoa, all evil.
What do you like to do for fun?
I enjoy watching movies, rowing, programming and poking around inside iTunes. I recently took a trip to Las Vegas and went hiking in Red Rock Canyon, which was pretty enjoyable.
Addendum
I just spoke with Michael Simmons, Director of Marketing for Ambrosia. He says that iToner definitely works with 1.1.2, so happy toning. Here's what he had to say:
"In fact, it works better, as 1.1.2 now has a "Custom" ringtones section, keeping the iToner transferred ringtones separated nicely at the top of the overall iPhone ringtone list!"
Posted by Chris Forsythe at 04:52 PM | Comments (1) | TrackBack
November 08, 2007
Interview with Alex Schaefer of ApolloIM
Hey folks,
So here's the first in a series of interviews I'm going to be doing with people who work on iPhone related projects. This first one with with Alex Schaefer of ApolloIM. Click on through, and be sure to check the project out when you're done reading...
So who is Alex Schaefer anyhow?
Alex C. Schaefer is a one-man army whom just this morning won "Coffee Drinker of the Week" at his local Pete's Coffee. In addition to enjoying free coffee, Alex C. Schaefer enjoys problem solving, computer programming, poetry, Portal for the Xbox 360, drinking Guinness until the bar closes, and talking in the third person.
Ah, so you got the Orange Box? Are there any other games on that which you like to play, or did you get the box for just Portal?
I bought it for Team Fortress, I stayed for Portal. Portal is just such a wacky way of thinking of physics - it's brilliant, and it's only flaw is that it's begging for more levels.
Are there any other kinds of games that you like, or is Portal it?
Halo 3 has been sitting on top of my 360, waiting be unwrapped, but Orange Box has too many goodies to play with. It's five games in one, it's such a ridiculously great package. I'm knee deep into Half-Life 2, been doing some Team Fortress 2 online, and I plan on unlocking all achievements on Portal. I'm also a big fan of PC gaming - Supreme Commander is such a great game, I only wish my PC wasn't breaking down from old age so I could start playing it again.
What is it about Portal that's so fascinating? For those who have never heard of it, can you explain some of the game play?
It's just gameplay and problem solving that I've never seen before, and it's just got my attention right now. I keep wanting to play it over and over again to try and shave a portal off my total-portal-count, or seeing how fast I can complete the puzzle. It's very much a thinking man's game.
So no Wii or Playstation 3? How about DS Lite?
I have my WII, but i find I don't play it nearly as much alone as I do when I have company over. I can play wii all night with a few people, but alone I am more likely to play Starfox on my DS Lite or Marvel Ultimate Alliance on my 360. The Wii is great, but without buds, I'm just not that into it.
I guess that's enough of the gaming tangent, let's get back to you telling us more about yourself
In all seriousness, I'm a young developer. I'm more or less home grown, having dropped out of Compsci after my fourth semester in favor of a degree in Creative Writing, and as such since the end of "Data Structures 419" I've found a happy medium between computers and writing (be it Obj-C or something in trochaic hexameter). The logical explanation for that gig is that I enjoy finding structure where there seems to be none, and well, it's lead me to some interesting places
I just have to ask, what sort of interesting places?
I like breaking rules, and finding structure where I hadn't thought it existed. When you find structure where one would not expect there to be structure you're instantly confronted with sets of decisions that someone made and a board is revealed of purpose and direction, and to play with those forces in such a way as to elaborate either has provided me with great clarity. What started this entire thought dichotomy, and subsequent leaving Compsci for the English department, was Oscar Wilde and the poem "The Harlot's House" - an example of trochaic hexameter, actually - it's very carefully crafted, and up unto it I hadn't given books or poetry much of a chance, because I didn't see how deep the rabbit hole goes kind of.
Good poetry, like computer programming, becomes about a structure, and that's how you rise above "amateur" and into something with substance and function - not to say that I'm not amateur, I am, but I've produced my best work while being consciously aware of the rules in a system. With Wilde, he exercised grace & meter in a way that each word pushed forward feeling, and that's hard to do in poetry - so much of it is variable meaning, but he had a unified message that was evident throughout the poem and ends on such a crashing note that you are forced feel something. It's this unified structure that, for me, becomes about finding something that someone never intended to do or something that people assumed is useless and pushing it into a different light to see where it takes the bigger meaning of what you're trying to do.
What kind of Mac do you develop on? Do you have any other macs, or have you had any others previously?
I was a terrible mac basher until a lovely little day in 2004 when the University of Colorado hired me on as a OS X administrator based on my Linux experience, and I suppose that would make my first mac a PowerMac Dual Proc 1.6ghz. From there I bought a black MacBook the day it came out, and now the rest is history. The platform is elegant and makes sense, and while I still keep windows around for some reasons - those reasons dwindle each day. I'm now anxiously waiting for the next MacBookPro update (be it six months or more) to upgrade.
I've quickly come to love Xcode and the entire OS X development environment. It's fun to do - and that's the important part to me. I've never had a real coding gig in my life, and so it's all exploration for me - and if I'm going to explore and wander around, I need to enjoy doing it. It's a beautiful system for old coders and young programmers alike, and I encourage anyone to look into the platform, the system, the api what have you. While .NET is an incredible improvement over Microsoft's old development environments, it's got nothing on objective C in terms of simplicity to slip into a program and sheer joy of production of the code itself.
How did you get involved in the ApolloIM project?
I started ApolloIM in late July as an exercise to get me back into Cocoa, and because there was allure in working with an undocumented API. It was a bit of a wild goose chase - hunting down how apple did certain things within this class-dump'd mess of an API that the hacking team for the iPhone rigged up.
The aim of the program was originally just to get AIM, and so I found an Objective C wrapper for Firetalk from a program called Boombot (long dead, I believe - http://boombot.sourceforge.net), and using that as a base customized it into a client. After it was clear that TOC support wasn't enough and that we needed something with Oscar for .Mac support, buddy icons, etc we switched to libpurple. It took us three weeks to even compile libpurple, and it would not have been possible if it wasn't for the husband and wife team of PHD's from MIT and Harvard (respectively) to get it done (Core, Pogue, thanks again) - reason being that the hacked-together compiler for the iPhone (while impressive in it's own right) just wasn't ready yet, but they found a way to fit the square peg through the round hole.
Anyway, I'm involved with ApolloIM because it's the big feature that most phones have that iPhone does not. Who knows why exactly Apple didn't include a MobileiChat, but really I saw it as something that could be done and so I ran with it.
You mention TOC being the reason you switched to libpurple due to needing OSCAR. What exactly are these things?
TOC is this basic protocol for AIM that AOL develop, from my understanding (or it could be conjecture), to create an easier to use OSCAR. The difference between TOC and OSCAR is that TOC is old school and Oscar has all the neat stuff like buddy icons, status messages without being away, Direct IM (picture sharing, etc). The move to libPurple was done to move towards that full IM client feeling - TOC works, but it's really not full figured, and Apollo wants to be a full featured mobile client. libPurple also allows us to move towards the other protocols - I have never had an MSN account, and now I do - the library itself is incredibly flexible and allows us to extend our base infrastructure into something that is so much more.
What are the benefits of using libpurple for the ApolloIM backend?
Multiple protocols, stable connections, and one sane way to modularize and move from there. We built our own libPurple/Cocoa wrapper (With some inspiration from Adium), and it's allowed us to move towards having the full client that we want. We're not anticipating video confrencing or anything, but we know libPurple is moving in that direction - and as long as we focus on abstracting libPurple from our code while be conscious of implementing it's feature, I find we work out a paradigm to focus on our client implementation while leaving the IM protocol development to Sean Egan & co ( as well as the Adium contributors) over working hard on libPurple.
How do you and your team communicate/work together, and what have you learned from this experience?
Instant Messaging has been the way to do it. It's really been the three of us, and lately more or less just myself. We're a very small project right now and so we don't have the need for a big wiki or a bugtraq quite yet - we're happy with Google Code's "issues" system.
Given what you know now, would you work on ApolloIM all over again? If so, what would you change?
I would have delayed our release of 1.0 by two or more weeks. One thing I've learned is that competition can make you stronger, but it can also make you a little too insistent on releasing a product that was completely ready. We're up to 1.0.2 now, and I feel that's the version we should have released as 1.0. I know I've learned my lesson - don't
Why is ApolloIM important?
ApolloIM is important... I guess it’s because it's the one glaring omission from the iPhone. The iPhone was really designed to be a platform for universal communication, and they forgot this one piece - Instant Messaging. Just as Adium fills the role of the missing as the client for the missing protocols from iChat, ApolloIM becomes important because everybody uses one IM protocol or another and without it, a communications platform is incomplete. I can't tell you how many times someone hasn't picked up their phone, or missed a txt message - but somehow, they still respond on GChat.
We've been in a lull at the moment, I've been settling in to a new job, and since the announcement of Apple starting to officially sanction third party applications - we've been tidying up code in anticipation of an official compiler. We're taking our time now - for a while there in September and October we were releasing once a week, and certainly lacked some testing in rushing things out the door. For now, we're going to polish and try and get the missing protocols that people have been asking for, and also try to figure out what exactly a “Gadu Gadu" is.
FYI, GaduGadu is an im protocol used heavily in Poland
I know what GaduGadu is - but man, is it a funny name, so funny that that I sometimes say outloud as a pickmeup when Coffee is out of range.
So you're hoping that the SDK that was mentioned is in fact a full on Cocoa/Carbon SDK with a compiler and the whole kit and caboodle? What if the SDK is in fact just support for dashboard widgets, or something else that isn't Cocoa/Carbon with a compiler?
Yeah, we're betting an awful lot on a real compiler, but frankly you're not supporting third party app developers unless you have a real SDK with a compiler and documentation. The way I see it, we're preparing for the future - if the future is on an unsupported platform, then we have to make ourselves flexible enough to accommodate changes to it; the switch from iPhone firmware 1.0.2 to 1.1.1 hurt everyone's development efforts and has been a real reboot for the entire development scene, but it's coming back with a vengeance right now. If the future is on a supported platform, then we have to be ready to make the switch from clever little hacks (such as us relying on the host file instead of doing a real DNS lookup due to Apple's DNS resolver on the iphone being wonky) and get ready to support real solutions. We're looking to be legitimate, and regardless of the direction, we are in a position now to prepare for that direction when it becomes clear.
Right now, the system that's already established is little more than widgets. I think with 10.5, and the iPhone os (which is very similar in file system layout and has a lot of the same API), you can implement a jailed region for third party applications that would avoid OS integration. Really, just give me a socket and 20k of r/w space for configuration files and Apollo should work fine. I am sympathetic to Apple securing the iPhone - it's a phone first and foremost, but it's also a waste of potential if you let it just sit idly by waiting for someone to call you. I've done coding for J2ME and have played with .NET for mobile platforms, and I know it's more than possible to isolate part of the phone for third party development.
Apple has a great relationship with Cocoa developers, and I am eager to see their infrastructure expand to include this, one more, OS X platform. They can do it, we can code for it, and at the end of the day there's hundreds of iPhone apps out there that are being actively developed anyway - so why not bring them into the fold and make it a secure environment?
What do you like to do for fun?
I like doing new things constantly - if I'm not changing and going in a different direction constantly, then I'm really not having that much fun. I started taking up white water rafting this previous summer - and that was pretty fun, and I'm hoping to branch into Skydiving or something similarly death defying by this Summer.
Lately I've been browsing various open-source projects looking for bugs to fix or a feature to add, and I'm hoping they'll accept them. I'm also working really hard to get the Vanilla Crazy Cake achievement in Portal.
Anything else, Chris? :)
Ah, yes, one last thing. What's your favorite kind of pie and/or cake?
Frankly, I believe the cupcake to be a modern marvel of snack delivery and consistent quality. With one fell swoop, some baker somewhere out there (I'd wager a Frenchman, but it could have been a Belgian Baker) created the first truly portable and satisfying dessert delivery system. Jacques, as I imagine he was named - because if it was truly Belgian it'd either take the form of a waffle or chocolate and while Cupcakes can take on either quality, it is not mutually exclusive - woke up one day in what I'm sure was an epiphany from god himself. This beloved edict of passion for baking and appreciation of the divine will inside Jacques could only be what produced this modern marvel of dessert specification.
Now, to further justify my general classification that the cupcake is my favorite cake - I am including this line graph demonstrating the growth in the tastacity / delicousosity of the cupcake over the last 100 years.

The cupcake starts off steady with it's invention in 1900 with a steady 5% popularity amongst elitist French (but, once again, possibly Belgian) bakers. This steady growth was interrupted in 1932 in part due to the Great Depression in the United States, where the cupcake had contributed a total of 15-20% of the popularity growth in 1910 and 1920. In 1940 the Cupcake Deliciousness index only grew by 10% due to the popular distraction of "staying alive in WWII" and thus the inevitable "taking for granted" occurred - however by 1945 the Cupcake skyrocketed back into the public's hearts, minds, and mouths.
The cupcake continued amazing growth until 1970 when "The Cupcake Man" serial murderer struck, sending baskets of cupcakes to unsuspecting childhood idols such as Captain Kangaroo and bozo the clown with Ricin laced carrot cheesecake cupcakes. It quickly recovered on New Years Day 1980 when pop-culture icon Punky Brewster was sighted downing a bottle of Jack Daniel's and washing it down with a Vanilla Frosting / Chocolate Cupcake.
In conclusion, the cupcake has withstood "the test of time" with it's magical innovations in portable deliciousness, and it's continued deliciousness growth in the future both excites and scares me - but mostly excites, because the cupcake is my favorite kind of cake.
Ah, interesting. What flavor cupcake is your favorite though?
Chocolate. :)
Posted by Chris Forsythe at 04:02 PM | Comments (2) | TrackBack
November 07, 2007
iPhone obsessed
So I've had an iPhone since the first day it came out. At first it was just to try the thing out, but now I've truly become obsessed with it, much like I obsess over guitar hero or bioshock or sourdough bread.
It's very strange, so I'll be posting some iPhone related things on the blog until I figure things out with it. Yes, I realize that the web is full of iPhone stuff, so it won't be the normal stuff you're seeing out there. Or at least I'll pretend that it hasn't been done.
The strangest part of all of this is that I've grown to like the phone almost more than my mac, but in different ways. They're both products that are at their core very utilitarian, but pretty at the same time. I just find it easier sometimes to browser on my iPhone than on my mac. Neither are perfect machines, only my rice cooker is perfect, but they do indeed get the job done.
Posted by Chris Forsythe at 01:30 PM | Comments (1) | TrackBack
October 06, 2007
Logitech keyboard capslock notification window of doom
I was at the office the other day, and I plugged in my logitech keyboard. It's about 3 years old, but it still works great. However, it wasn't working. I had forgotten to install the support for the keyboard, basically it's just this addon, similar to a driver for windows.
So I spend 5 minutes finding it on the logitech website, download it, and reboot the machine since that's required. So far, so good.
The machine comes back up, I log in, and the keyboard works. Awesome!
Ten minutes later I started working on something with the keyboard. As you all know based on my previous post about my use of capslock, I'm pretty heavy on using that key.
It looked something like this screenshot
Every time I hit capslock this notification would come up. EVERY. TIME. It was god awful annoying. Then I remembered a recent discussion regarding the mouse plugin event for a logitech mouse (that screenshot is from the affected user).
Long story short, this is annoying. For instance, up until this point in this blog post, I've pressed the capslock key 23 times. That'd be an enormous amount of notifications, just for this short post.
The solution is actually quite simple, and very much what was suggested on the list. Basically, it's 2 steps:
1) open /Library/Application\ Support/Logitech/LCCDaemon.app/Contents/
2) Move NotificationSquareWindow.nib and NotificationSquareWindow.nib somewhere else. I moved them to my desktop to test with.
That's it, this annoyingness goes away.
This may be weird coming from the guy who started Growl, but holy wow, I have no control over this, there's not even a silly checkbox for this. Isn't that nutty?
Posted by Chris Forsythe at 07:28 PM | Comments (1) | TrackBack
October 05, 2007
Capslock is my friend
So I was reading this post from Wolf, and was.. flabergasted.
I can't watch the video right now, but the way he describes it, I simply cannot use this new keyboard. The reason being is that I utilize capslock, rather than shift, to type.
I actually find this to be superior. Instead of something awkward like holding down a key while pushing another key, I can just toggle a key, hit the other, and toggle back. This means that I can already be in midstrike for another key rather than have to move my hand. Maybe this isn't how people use shift, but it's how I end up using shift on the number row keys.
I've even tested this theory against a diehard dvorak guy once. He'd been using dvorak for years, claimed it was better than qwerty. I don't think I care about that. However, he did say he could type faster than I could. I certainly kept up.
I tell this fact to people from time to time, and most people get shocked by this. I'm shocked people still use shift to be honest, it just seems rather strange to type a capital I by holding down one key and contorting your hand to type the i, and then releasing.
Old unix hands are probably the people I get the most shock from. The guys who had ctrl and capslock switched on sun keyboards typically think the key is useless. Luckily they don't make my keyboards. :)
So if what Wolf says ends up being the defacto for apple keyboards, I won't be able to use any new apple keyboards. Luckily, I can just plug in another keyboard. Until they do this on a laptop, then I may have to rethink using a mac. *sigh*
Posted by Chris Forsythe at 10:21 AM | Comments (10)
September 24, 2007
My whole belief system is destroyed
Since I was the age of 5, I have always held 2 things to be completely and utterly the truth. Recently I found that, in fact, this was not the case.
It all came about one day while at work. It was a normal day in Houston. Hot, yet exciting. I quickly got dressed after waking, left to work, badged into the parking garage, walked to the elevators, badged in at the elevator, rode the elevator up to the floor, got out, badged into the doors, and got to my desk.
It was at this point that I realized that I was hungry. I discussed this with a coworker, as I typically did when hungry in the early morning in order to gather a large list of foodings to gather for the people there, in order to make a single trip.
However, on this occasion, I was shocked. The person I spoke with, we'll call him "Chad", because that's his name, Chad said to me "Why not try a plum?". He of course was referring to the fruit bowl located in the kitchen area. I retorted to him "My god man, that's purple fruit!".
This is when I revealed to him my dark past. For I, along with tens of others (my rough estimate, based on a poll in first grade) had decided long ago that...
Yellow and Purple Fruits and Vegetables are the Greatest Evil known to Man.
After this rebuttal to a seemingly innocent suggestion, Chad responded with "What about eggplant?" I responded with "Tried it, evil."
"Squash?" "Ugh" "No corn?" "No, corn is disgusting." "What about grapes?"
This was indeed a valid question. I quickly said "I love grapes. Green grapes. However, purple grapes taste different, and I tend to avoid them."
He then told me to "Just eat the damned plum." So I did.
My god.
The experience of trying the plum sent shock waves through me. The plum was sweet, but not too sweet. It had substance to it. In fact, it was as good as a kiwi fruit. Had my boyhood friends lied to me about the evils of yellow and purple fruits and vegetables?!
I expressed my disbelief for days after. Shortly after that, I came to realize this:
Yellow Fruits and Vegetables are the root of All Evil. Some Purple Fruits and Vegetables are the Armies of Darkness
I explained this to Chad. He responded that he had work to be done, and no time for such silliness, but I could see in his eyes that he, in fact, was in agreement. He knew the Yellow and Purple ones were listening.
Soon we will need to strike down all of the Yellow and Purple Fruits and Vegetables who oppose human kind. Will you join the struggle, or will you sit on the sidelines eating your yogurt?
Posted by Chris Forsythe at 05:33 AM | Comments (1) | TrackBack
September 09, 2007
Turning a dmg into an iso
I'm getting tired of repeating this on irc, and of people finding bad info on the web. Here is how you turn a dmg into an iso on OS X:
1) Open a terminal.
2) cd into the directory where the dmg is located
3) Type this in (where newfile is the name of the iso you want, and yourfilename.dmg is the dmg)
hdiutil makehybrid -iso -o newfile.iso yourfilename.dmg
(This was found by cbro and erasei on #macosx on efnet a long time ago).
If you are in #macosx on efnet and need this, type this command:
?? dmg2iso
Posted by Chris Forsythe at 01:48 AM | Comments (2)
August 29, 2007
How to use Family for non-genealogy type things
So lately I've been discovering that the more that I start trying to map things out, the more I get frustrated with what's out there. About a month or so ago I started trying to use Family, the software I work on, to do more than genealogy work without modifying the source.
I found that, for the most part, it really did what I needed. It was pretty simple to start adding stuff while ignoring the labels to get what I wanted. Here's a simple example I put together in under 2 minutes:
I've really been happy utilizing Family to do this too, so I'm starting to wonder if other folks would like something similar. Mapping stuff out on a white board at work to show how a network is setup and how it affects the application I support really helps there, this is the same theory. I'm thinking of modifying Family to change the labels and then working with Evan to polish it towards another target audience, and then rereleasing it as another application with a different name and with a different icon set, towards productivity minded users. Would anyone like to see something like this happen?
Posted by Chris Forsythe at 11:15 PM | Comments (2)
August 24, 2007
Barcamp Houston
Just a heads up, I'll be attending Barcamp Houston tomorrow. I don't know if I'll be there at 9 am, but I'll try to show up at a reasonable time.
Posted by Chris Forsythe at 07:35 PM | Comments (0)
August 14, 2007
Family+other stuff for sale
If you like Family, but have been shaky on buying it due to the price, take a look at this site:
We've included Family in a back to school special software bundle, but it's not limited to just students. There are some pretty cool apps on there too, I'm torn between Mori and WriteRoom personally, and Macaroni just looks useful. The others look great as well, I'm slowly getting to them all.
Anyhow, check it out.
Posted by Chris Forsythe at 11:09 AM | Comments (0)
August 04, 2007
Artwork and impressions
So since forever we've depended on Adam Betts to get our icons. He's a great guy, always early with our rather random demands, and a lot of hard work on his part really shows in the artwork within Adium itself.
Love it or hate it, people really notice the duck right off the bat.
I've had one dealing with Erik Barzenski, and it wasn't a dealing it was more just asking him to get Growl support into an application he had at the time. The experience was sour from the start. Albeit in the end after much cursing it got implemented.
I'm not sure who to believe, but based on reputation and on past dealings, I'm more apt to side with Adam. The two people are completely different in the way they've reacted towards myself and others. In the mac development world you are your reputation. A lot of the work these days is done via email or instant messenger, and if the two parties cannot trust each other, then what's left?
I also have interacted with Fernando quite a bit in the #macsb irc channel, and he's also a nice guy.
It's really just a bad situation for everyone. Adam is left without being paid for his (very good) work. Erik is seen as the villian in this situation.
Erik says that Adam didn't honor his side of the agreement. Adam is seen as the villian in this part of the situation.
Fernando made the new icon, which looks considerably like Adam's new icon. The question is, who is the villian here?
Did Erik hand Fernando Adam's previous work, and say "make something similar"? Seems reasonably likely, but we weren't there. Or was the description just similar? Any amount of posting by anyone at this point won't prove for or against Erik.
However, the fact that he's posted such a long blog post about it, so publicly, seems to me like he's trying to prove a point, and also drive hits to his website. He's got a startup, and it seems like a little controversy from the beginning is a great way to drive hits and google ratings. That's a thought, Erik is a smart cookie, if a bit hard to deal with. What if he hit upon an idea early on that in order to drive lots of hits fast to his website, he could start a controversy.
Or perhaps not. I guess we'll never know. The one thing I do know is that Adam and Fernando are both great artists, and I'm left with a bad impression from Erik. It's a quandry.
Posted by Chris Forsythe at 12:01 AM | Comments (6)
June 20, 2007
Interesting perspective on open source
My good friend (from the internets!) Graham has made a post about his experiences with users of open source software.
I can't say my experiences have been any different, but I do think there is a 4th motivational factor. I would have put the following:
4) The developer wants the functionality, but doesn't want to/doesn't have the time to code it all as required.
Posted by Chris Forsythe at 09:27 PM | Comments (1)
June 12, 2007
News site headaches, or MacUpdate sucks sometimes.
So for Perian 1.0 we're working on some screen casts. The guy who was working on the screen casts needed a build of Perian that had the 1.0 version number on it so he could show it with the right number. We set that up for him off of some really skank beta.
Today I got notified by multiple people about Perian 1.0 being out. This was certainly news to me. We had this problem on Adium before, someone would be overzealous and contact the update sites, and then they'd post a link to a beta, and we'd have to get them to pull it.
So I notified MacUpdate. I then found that VersionTracker also had posted it, I notified them as well.
Here's the response from VersionTracker:
Sorry, got an automated email about it's release and I assumed it was from the dev. Sorry for any trouble it caused.-Kurt
I considered that pretty nice.
Here's what I got from MacUpdate:
Chris, We post software that is released to the public. That is our policy, as we clearly state on our bylaws page. i can understand your frustration, but the simple fix is to simply not make releases public if you don't want them public.-Joel Mueller
www.macupdate.com
The problem is, this software wasn't public. The URL was posted nowhere publicly available with the exception of an index that's not publicly available unless you type it by accident. I.E. it's not linked anywhere.
It's not about the fact that it's posted though, it's about the tone that Joel took here. He's been like this for a while, and it's frustrating. He makes advertising money off of people posting updates to their software on his website, and he treats people very, well, rudely.
I'd boycot MacUpdate, but that'd be pointless. Users post updates and if they don't he goes and finds them, or at least that's my impression of it. It's just frustrating.
The worst part is that it would take 2 seconds to verify the download by going to, get this, http://perian.org/.
This is the first time I've had versiontracker post something that wasn't released, and this is not the first time MacUpdate has done it.
Posted by Chris Forsythe at 12:42 PM | Comments (7)
June 07, 2007
MacTech top 25
So I was in the MacTech top 25 most influential mac technical people list this year as an honoree. Neat I suppose.
For those who are unfamiliar with me, I work on Family, Adium, Growl and Perian.
Definitely check all of those out, I really enjoy working on them all. Perian is currently in a beta period, and Growl will start with a 1.1 beta shortly. I'll explain why Growl went from .7.x to 1.1 in another post.
I haven't posted a lot about myself in a while, so I'll also do that in some more posts.
Anyhow, welcome new people, subscribe to my blog with your rss reader of choice, I don't post very often on purpose so it won't be a huge amount of stuff to digest.
Posted by Chris Forsythe at 10:48 AM | Comments (0)
May 30, 2007
Try this
Give this a shot in a terminal on OS X:
open /System/Library/PrivateFrameworks/SyncLegacy.framework/Versions/A/Resources/SampleConduit.bundle/Contents/Resources/SampleConduit.icns
You may even laugh.
Posted by Chris Forsythe at 08:48 PM | Comments (3)
April 19, 2007
MacCode commits list
For those who are interested in the the mac code repo I recently got setup, check out the commits mailing list.
Posted by Chris Forsythe at 10:31 PM | Comments (0)
March 19, 2007
Neat stats about pay rates
This article explains that Houston rules in the moneys department. Even better, look at the data regarding the 50 biggest cities. At least half of the cities listed that are under 100 in the cost of living department are in Texas.
With this newfound age of remoteness, it makes you wonder if people will continue to live in places they cannot afford, or if they will all move to Texas.
Posted by Chris Forsythe at 08:21 AM | Comments (0)
March 16, 2007
Apple Bug Fri.. Feature Request Friday
I've grown tired of seeing Apple Bug Fridays, so I'm going to start doing an Apple Feature Request Friday.
Today:
Auto detect mail servers via dns records when configuring an account. Radar 5068676
Posted by Chris Forsythe at 12:08 PM | Comments (0)
January 08, 2007
Macworld irc channel
For those interested, there's a macworld channel setup on freenode for the rest of the week:
irc.freenode.net
#mwsf2007
or for those who need it
irc://irc.freenode.net/mwsf2007
Posted by Chris Forsythe at 08:05 AM | Comments (0)
November 27, 2006
How I got a Wii, or, why I'm about to enduringly aggrivate those in search of one right now
Some prerequisites. I indeed wanted to get a Wii, but didn't think I could until after Christmas. I also like looking at figures of how much stuff is in stock at places this time of year so I know which stores to avoid and which to stop at.
Anyhow, the Wii-non-story-story.
So from my previous post, you should have gathered that I have acquired a Wii. It's awesome, it's great, it beats any other console I've owned hands down.
I have a confession to make though. I bought it on launch day at a local Target, however:
I was not on my way to purchase the Wii
Seriously, I went out for Kolache's. At like 6 AM, I couldn't find any, so I happened to be bummed and just drove around a little bit. I drove by the local Best Buy and saw a whole line of folks and then it hit me like a log that it was indeed a launch day. I figured it was probably a PS/3 post-launch line or something waiting for another shipments or something. I then drove around some more and located a Target. I saw the line there too, but it wasn't as bad as the Best Buy one, so I got out and went up to talk to some folks. They said "this is the line for the Wii" and I said "Oh my god no way!" but with more curse words and less actual words. Something like that.
flash back to the night before
I had been perusing the list of stock that stores had at http://wii.clambert.org/. No, I hadn't actually looked at the sidebar or much of the text, I just entered my zip and off I went at it. One of the stores next to me had 51.
flash forward
I now remembered that this is the store with 51. And there was no way there was more than 35 people in line. So I sat in line for an hour and a half, and got a Wii.
I was number 30 of 51.
The Wii is the most awesome happenstance Festivus Miracle yet. At least in my household.
Posted by Chris Forsythe at 12:31 PM | Comments (0)
November 26, 2006
Need more batteries
Someone send batteries at once! My wiimote is down! The screen says it has lost connectivity with the wiimote, oh nooes!
In all seriousness, the Wii is an awesome console. If you get one, make sure to get a battery charger and rechargable batteries. Double A.
I've just beaten the third dungeon in Zelda. I also got some games off the wiistore, and have the Tony Hawk Downhill Jam. Overall, I love the console. I don't have one of those high-fallutin high def displaying televisionerators, so I can't comment on that, but everything else is golden. Or something.
Now to just get a HaloBox and I'll be good. And next time I need a new linux desktop, I'll get a playstation 3.
Posted by Chris Forsythe at 05:53 PM | Comments (0)
October 26, 2006
Dropping the addiction that is irc
So for about 8-10 years now, I've been on irc. I don't think I can count a full month where I've not been on irc. As of last night at 2 am I am attempting to drop my addiction. I've done this a few times privately with poor results at best, so I think if I blog about it some it may help me to keep with it.
So first, some background. I first started irc'ing back in the day, and latched onto #windows95 on dalnet at some point. I went by db-25 for about 2 months and idled a lot. My personality clashed with a lot of other people's personalities, and I eventually changed my nick to The_Tick. I've held that moniker for my stint on irc.
Eventually I switched to linux and started delving into linux channels. The most important thing I learned from a linux channel is that if someone doesn't know what they are talking about, they'll act like they do anyhow, and when asked for information they'll tell you to go find it. It seems to serve some people well.
About 4 years ago (5 maybe) I switched to OS X. I got an iBook and needed more information about OS X. Some people would have googled, I went straight to the source, people on irc.
In other words, every time I got a new system, irc had been an important part of my life when learning that system. There are countless people wasting their time on irc right now for all sorts of topics, and if you ask the question the right way you'll get the right answer.
I've used irc while at work, on the phone with customers. My theory is/was that everyone needs a distraction in order to get their job done in the help desk/IT area. When a user is trying to blame the vpn software you support when it's actually his stealing wireless from his neighbor, you kind of reach for anything you can to not yell at the guy and thus lose your job.
And that's not all. I had let irc enter my life, weave into my very soul for a very long time. It's scary when I wouldn't even realize I was using it, or that I'd say I'd go to sleep and 2 hours later there I was, still on irc.
About 1/10 of the time was actually useful. For instance, Growl would basically not exist without having had irc. We used irc for almost everything. I feel bad for people on the mailing list, they were so out of the loop.
But spending 3 days to argue about a check box (that's 3 days straight, no interruption. 72 hours of argument) can really just point out to you how bad it can be.
I've used an ungodly amount of irc clients. Every single one has it's own problems, it's own quirks, and it's own vehement userbase who thinks nothing else could be better.
IRC clients on the whole tend to suck. With the exception of about 2-3 per platform they all tend to really suck. On the mac it's even worse, there isn't a really good GUI client at all. They deliver 3/4 of the package, and none of them really get it completely. The closest you'll get is settling or going with a client like irssi.
Bearing all of this in mind, I still used irc happily until a day ago. A Growl user, Macskeeball, emailed me. Here's what he said:
Note: I know that we're supposed to post feature ideas, etc. on CocoaForge, but for the past four years (slightly over a fifth of my life) I had extremely strong addictions to forums (especially the MacAddict Forums), instant messaging, and video games. These three addictions had occupied an overwhelming majority of my waking and sleeping thoughts. To say that they *were* my life and my idols during those for years would not be much of an exaggeration. A couple of months ago I made the decision to drop video games cold turkey and succeeded with little trouble, and a few weeks ago I decided that it was time to do the same for the other two (much stronger) addictions. During the time when I was actively posting on CocoaForge, I really felt that it could become another MacAddict Forums (by far the strongest of all of these addicitons) for me if I let it, and as such I must stay away from it as well. I have nothing whatsoever against the community; quite the contrary, my love for it was exactly the problem. I don't plan on submitting Growl suggestions very often at all, but I have one now that I think I should share.
He subsequently made a decently good feature request. All of this got me thinking, and the result is that I've realized that I need to drop some addictions as well. No, the alcohol won't be going (I drink it sparingly), but some other things will be. IRC was just the low hanging fruit.
We'll see how this goes, I'll report back when I feel I should. I quit cigs cold turkey at 2 packs a day, I should be able to drop irc right?
Posted by Chris Forsythe at 08:17 PM | Comments (1)
September 28, 2006
DMG creation tips and tricks
Warning: This post is longer than my usual. You may want coffee. The focus of this post is how to make a DMG image with a background in an automated fashion.
About DMG
For those who are reading this who are not aware of it, DMG (Disk Image) is the format commonly used to distribute software on OS X. There are other formats, the more traditional like tar.gz/zip/.sit. For more information specifically about how to distribute software as a DMG, you'll want to read Peter Hosey's how to distribute your software (and his semi-in-depth overview of compression format usage on OS X).
Motivation/History
Quite a while back Adium and Growl both were shipped in dmgs created in a product called FileStorm. At the time, it was buggy and hard to use. It would crash a lot, and in the end was just a pain in the butt.
But we used it anyhow. For a while.
However, it's not automated. It also required that everyone have Filestorm installed and licensed, so for instance only one person could make the dmg on the Growl team (I had the Adium license file), and only one or two on the Adium team could use it.
Everyone jokes about replacing random things with a small shell script, but we pretty much did that. Except this uses Makefiles, Shell, and AppleScript.
So, before I begin writing about how to do this, I would like to state the process before and after the creation of this build system in order to release Growl.
This is the before:
- Change directories into the growlsourceco
- svn up to ensure there are no new changes
- Open Xcode and edit version numbers OR edit version numbers without opening Xcode
- Build Growl
- Open the GrowlTunes Project and build it
- Open the GrowlMail Project and build it
- Open the Beep-Cocoa Project and build it
- Open the Beep-Carbon Project and build it
- Open the GrowlDict Project and build it
- Open the growlnotify Project and build it
- Once Growl and the Extras are built, open Filestorm
- Go into Filestorm and ensure the paths are correct in the dmg project
- Make the dmg
- Test the dmg and upload
This is the process when making a dmg with the build system that was created:
- Change directories into the growlsourceco
- Open Xcode and edit version numbers OR edit version numbers without opening Xcode
- cd Release
- type make
- Test the dmg and upload
There's actually a lot more to the process we used when we used Filestorm, but as I felt that more bullet points would only lead to excessiveness. And besides, you get the point.
Anyhow, on to the nitty gritty. This is how to make your very own DMG Creation System. I am going to run down how the Growl system works, since it is more complicated, and then run through Adium's and Perian's systems. As each application has separate needs, I'll explain decisions behind each item along the way.
Getting Started or The Growl Release System
So with Growl we have a lot of different needs for anything that would build the dmg+projects:
- Something to build a specific target in Xcode
- Something to build multiple projects with multiple targets
- Something that can make a PKG file
- Something which can
- Something that can make a DMG (duh?)
- Something that can put a background on a DMG
- Something that can position icons in the DMG in specific ways.
Pretty early on a script or Makefile seems appropriate here, and we ended up with a Makefile+Applescript, so here's the long and short of the interesting bits. Here is a screenshot of the Growl disk image when mounted:
We can see from this image the requirements listed above., and more. It looks like a mess because it is, but that's more the fault of myself than anything else. For instance, let's look at the Perian DMG for the .5b4 release that I'm building now:
As you can see, the disk image can be made to be either randomized on disk or pretty strict. Let's move on to how to actually do all of this.
Top level Makefile
The first part you have to know about is that the top level directory of your source repo needs to have a file called Makefile in it. For a simple project you should plan ahead, and for a complex one you will appreciate this. At the very end of this blog post I will post the entire dmg making system, so if you'd like you can skip this for now. However, It will not be filled with comments, it will only have what is currently in the Adium/Growl/Perian build systems.
Basically the end result is to get a Makefile at the top level of the source tree that builds your project/targets how you like.
The release system also needs a folder called (unsurprisingly) Release, which will hold the rest of your release system items.
Here is the entire top level Makefile for the .7.4 release of Growl, with explanations along the way:
PREFIX?=
PREFERENCEPANES_DIR=$(PREFIX)/Library/PreferencePanes
Since Growl is a PrefPane, it lives in either ~/Library/PreferencePanes or /Librayr/PreferencePanes
FRAMEWORKS_DIR=$(PREFIX)/Library/Frameworks
GROWL_PREFPANE=Growl.prefPane
GROWL_FRAMEWORK=Growl.framework
This portion sets the framework directory and then the prefpane and framework names
BUILD_DIR=build
GROWL_HELPER_APP=$(PREFERENCEPANES_DIR)/$(GROWL_PREFPANE)/Contents/Resources/GrowlHelperApp.app
HEADERDOC_DIR=Docs/HeaderDoc
Setting some more stuff for use later in the script.
#DEFAULT_BUILDSTYLE=Deployment
DEFAULT_BUILDSTYLE=Development
BUILDSTYLE?=$(DEFAULT_BUILDSTYLE)
Here's where the fun stuff starts to happen. For those who don't follow this, basically this will allow you to change the build style by uncommenting one line and commenting another. If you happen to have 5 build styles, you could list 4 commented out and one uncommented, and easily switch between the whole lot of them.
CP=ditto --rsrc
RM=rm
This bit should be obvious based on the previous stuff.
.PHONY : all growl growlhelperapp growlapplicationbridge growlapplicationbridge-withinstaller frameworks clean install
all: frameworks
xcodebuild -alltargets -buildstyle $(BUILDSTYLE) build
growl:
xcodebuild -target Growl -buildstyle $(BUILDSTYLE) build
growlhelperapp:
xcodebuild -target GrowlHelperApp -buildstyle $(BUILDSTYLE) build
frameworks: growlapplicationbridge growlapplicationbridge-withinstaller
growlapplicationbridge:
xcodebuild -target Growl.framework -buildstyle $(BUILDSTYLE) build
growlapplicationbridge-withinstaller:
xcodebuild -target Growl-WithInstaller.framework -buildstyle $(BUILDSTYLE) build
clean:
xcodebuild -alltargets clean
All of this builds Growl and the frameworks or cleans it. Note the use of $(BUILDSTYLE) here.
install:
killall GrowlHelperApp || true
-$(RM) -rf $(PREFERENCEPANES_DIR)/$(GROWL_PREFPANE) $(FRAMEWORKS_DIR)/$(GROWL_FRAMEWORK)
$(CP) $(BUILD_DIR)/$(GROWL_PREFPANE) $(PREFERENCEPANES_DIR)/$(GROWL_PREFPANE)
open $(GROWL_HELPER_APP)
install-growl:
killall GrowlHelperApp || true
-$(RM) -rf $(PREFERENCEPANES_DIR)/$(GROWL_PREFPANE)
$(CP) $(BUILD_DIR)/$(GROWL_PREFPANE) $(PREFERENCEPANES_DIR)/$(GROWL_PREFPANE)
open $(GROWL_HELPER_APP)
headerdoc:
rm -rf $(HEADERDOC_DIR)
headerdoc2html -C -o $(HEADERDOC_DIR) Common/Source/GrowlDefines.h Common/Source/GrowlDefinesInternal.h Framework/Source/*.h Common/Source/GrowlPathUtil.h Display\ Plugins/GrowlDisplayProtocol.h Framework/Source/Growl.hdoc
gatherheaderdoc $(HEADERDOC_DIR)
uninstall:
killall GrowlHelperApp || true
@if [ -d "/Library/PreferencePanes/Growl.prefPane" ]; then \
echo mv "/Library/PreferencePanes/Growl.prefPane" "$(HOME)/.Trash"; \
mv "/Library/PreferencePanes/Growl.prefPane" "$(HOME)/.Trash"; \
elif [ -d "$(HOME)/Library/PreferencePanes/Growl.prefPane" ]; then \
echo mv "$(HOME)/Library/PreferencePanes/Growl.prefPane" "$(HOME)/.Trash"; \
mv "$(HOME)/Library/PreferencePanes/Growl.prefPane" "$(HOME)/.Trash"; \
fi
@if [ -d "/Library/Frameworks/GrowlAppBridge.framework" ]; then \
echo mv "/Library/Frameworks/GrowlAppBridge.framework" "$(HOME)/.Trash"; \
mv "/Library/Frameworks/GrowlAppBridge.framework" "$(HOME)/.Trash"; \
elif [ -d "$(HOME)/Library/Frameworks/GrowlAppBridge.framework" ]; then \
echo mv "$(HOME)/Library/Frameworks/GrowlAppBridge.framework" "$(HOME)/.Trash"; \
mv "$(HOME)/Library/Frameworks/GrowlAppBridge.framework" "$(HOME)/.Trash"; \
fi
The rest of this should be decently self explanatory. But, basically, the rest covers how to install and uninstall Growl. It's more convenience than anything else for developers, and is not required by any means to make this work.
This Makefile should be different for every project, but overall it should be pretty easy to modify this one for your needs. Besides, the fun bit is inside the Release directory anyhow. Let's move on to that.
The Release Directory, of Doom
Heh, DOOM. So ya, the release directory is what controls everything else here. Let's take a look inside:
growl-0.7/Release chris$ ls -1
Artwork
Get more styles.webloc
Growl Developer Documentation.webloc
Growl Documentation.webloc
Growl version history for developers.webloc
Growl version history.webloc
GrowlMail
GrowlSafari
Makefile
Uninstall Growl.app
dmg_growl.scpt
dmg_sdk.scpt
make-diskimage.sh
Specifically, what's required here to build a dmg with artwork is:
Artwork
Makefile
dmg_growl.scpt
make-diskimage.sh
This system only requires these 4 items and the top level to work. So let's get to the main Makefile, and then cover the other bits after that.
Release Makefile
SRC_DIR=..
BUILD_DIR=build
GROWL_DIR=$(BUILD_DIR)/Growl
SDK_DIR=$(BUILD_DIR)/SDK
RELEASE_NAME=Growl-0.7.5
RELEASE_DIRNAME=$(RELEASE_NAME)
RELEASE_DIR=$(BUILD_DIR)/$(RELEASE_DIRNAME)
CONFIGURATION=Deployment
BUILDFLAGS="CONFIGURATION=$(CONFIGURATION)"
PRODUCT_DIR=$(shell defaults read com.apple.Xcode PBXProductDirectory 2> /dev/null)
This bit here is where you start changing things. Specially, only 2 items, the CONFIGURATION and RELEASE_NAME. There's not much more to it here, as with before we have some settings that tell the script what things are. Some stuff is dynamically set, etc.
ifeq ($(strip $(PRODUCT_DIR)),)
GROWL_BUILD_DIR=$(SRC_DIR)/build/$(CONFIGURATION)
GROWLCTL_BUILD_DIR=$(SRC_DIR)/Extras/growlctl/build/$(CONFIGURATION)
GROWLDICT_BUILD_DIR=$(SRC_DIR)/Extras/GrowlDict/build/$(CONFIGURATION)
GROWLNOTIFY_BUILD_DIR=$(SRC_DIR)/Extras/growlnotify/build/$(CONFIGURATION)
GROWLTUNES_BUILD_DIR=$(SRC_DIR)/Extras/GrowlTunes/build/$(CONFIGURATION)
HARDWAREGROWLER_BUILD_DIR=$(SRC_DIR)/Extras/HardwareGrowler/build/$(CONFIGURATION)
GROWLMAIL_BUILD_DIR=$(SRC_DIR)/Extras/GrowlMail/build/$(CONFIGURATION)
GROWLSAFARI_BUILD_DIR=$(SRC_DIR)/Extras/GrowlSafari/build/$(CONFIGURATION)
RAWRJOUR_BUILD_DIR=$(SRC_DIR)/Extras/Rawr-jour/build/$(BUILDSTYLE)
else
TARGET_BUILD_DIR=$(PRODUCT_DIR)/$(CONFIGURATION)
GROWL_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLCTL_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLDICT_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLNOTIFY_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLTUNES_BUILD_DIR=$(TARGET_BUILD_DIR)
HARDWAREGROWLER_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLMAIL_BUILD_DIR=$(TARGET_BUILD_DIR)
RAWRJOUR_BUILD_DIR=$(TARGET_BUILD_DIR)
GROWLSAFARI_BUILD_DIR=$(TARGET_BUILD_DIR)
endif
Growl has a whole list of Extras that we ship (growlctl, GrowlDict, growlnotify, GrowlTunes, HardwareGrowler, GrowlMail, RawrJour, GrowlSafari) along with Growl, so we have to take that into consideration. The build system packages all of them up as well. So here we're telling Xcode (gcc and company) how to build it based on the style setup in Xcode.
# What to do before running this script:
# - Set version number in GHA. You can do this in GrowlController.m. Look for the "static struct Version version" line.
# - Set RELEASE_NAME
# - Edit the following two plist keys
# - Core/Resources/Info.plist
# - Core/Resources/GrowlHelperApp-Info.plist
Just some comments about what to do really.
.PHONY: all compile clean release source
all: compile release source
compile:
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlMail
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlSafari
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlDict
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/growlnotify
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/HardwareGrowler
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/growlctl
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlWidget
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlTunes
$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/Rawr-jour
It rubs the lotion on the skin.
clean:
rm -rf $(BUILD_DIR)
Or else it gets the hose again.
source:
rm -rf $(RELEASE_DIR)
mkdir -p $(RELEASE_DIR)
cp -R $(SRC_DIR)/Bindings $(RELEASE_DIR)
cp -R $(SRC_DIR)/Common $(RELEASE_DIR)
cp -R $(SRC_DIR)/Core $(RELEASE_DIR)
cp -R $(SRC_DIR)/Display\ Plugins $(RELEASE_DIR)
cp -R $(SRC_DIR)/Docs $(RELEASE_DIR)
cp -R $(SRC_DIR)/Examples $(RELEASE_DIR)
cp -R $(SRC_DIR)/Extras $(RELEASE_DIR)
cp -R $(SRC_DIR)/Framework $(RELEASE_DIR)
cp -R $(SRC_DIR)/Growl\ Readme.rtfd $(RELEASE_DIR)
cp -R $(SRC_DIR)/Growl.xcodeproj $(RELEASE_DIR)
cp -R $(SRC_DIR)/Prefpane\ TestHarness $(RELEASE_DIR)
cp -R $(SRC_DIR)/Scripts $(RELEASE_DIR)
cp -R $(SRC_DIR)/images $(RELEASE_DIR)
cp $(SRC_DIR)/HACKING.txt $(RELEASE_DIR)
cp $(SRC_DIR)/License.txt $(RELEASE_DIR)
cp $(SRC_DIR)/Makefile $(RELEASE_DIR)
cp $(SRC_DIR)/README.rtf $(RELEASE_DIR)
cp $(SRC_DIR)/build.sh $(RELEASE_DIR)
cp $(SRC_DIR)/changes.txt $(RELEASE_DIR)
cp $(SRC_DIR)/generateSVNRevision.sh $(RELEASE_DIR)
cp $(SRC_DIR)/headerDoc2HTML.config $(RELEASE_DIR)
We really do copy all of this into the 2 dmgs that are produced, the SDK dmg and the Growl.dmg.
find $(RELEASE_DIR) \( -name build -or -name .svn \) -type d -exec rm -rf {} \; -prune
find $(RELEASE_DIR) \( -name "*~" -or -name .DS_Store \) -type f -delete
tar -cj -C $(BUILD_DIR)/ -f $(RELEASE_DIR)-src.tar.bz2 $(RELEASE_DIRNAME)
This is the bit I keep think I'll remove. It doesn't work right. But it's supposed to make a source bzball. The rest is decently commented, so if there's something I think is confusing just email me ( the_tick at this domain).
release:
@# clean build directory
rm -rf $(BUILD_DIR)
mkdir $(BUILD_DIR)
mkdir $(GROWL_DIR)
@#
@# copy uninstaller
@#
cp -R "Uninstall Growl.app" $(GROWL_DIR)
/Developer/Tools/SetFile -a E $(GROWL_DIR)/Uninstall\ Growl.app
@#
@# copy webloc files
@#
cp "Growl Documentation.webloc" "Growl version history.webloc" "Get more styles.webloc" $(GROWL_DIR)
@#
@# hide extensions of webloc files
@#
/Developer/Tools/SetFile -a E $(GROWL_DIR)/*.webloc
@#
@# copy the prefpane
@#
cp -R $(GROWL_BUILD_DIR)/Growl.prefPane $(GROWL_DIR)
@#
@# copy the extras
@#
These bits were all pretty well documented.
mkdir $(GROWL_DIR)/Extras
mkdir $(GROWL_DIR)/Extras/growlctl
cp $(GROWLCTL_BUILD_DIR)/growlctl $(GROWL_DIR)/Extras/growlctl
cp $(SRC_DIR)/Extras/growlctl/growlctl.1 $(GROWL_DIR)/Extras/growlctl
cp $(SRC_DIR)/Extras/growlctl/install.sh $(GROWL_DIR)/Extras/growlctl
Copy in growlctl
mkdir $(GROWL_DIR)/Extras/GrowlDict
cp -R $(GROWLDICT_BUILD_DIR)/GrowlDict.app $(GROWL_DIR)/Extras/GrowlDict
cp $(SRC_DIR)/Extras/GrowlDict/README.txt $(GROWL_DIR)/Extras/GrowlDict
Copy in GrowlDict
mkdir $(GROWL_DIR)/Extras/growlnotify
cp $(GROWLNOTIFY_BUILD_DIR)/growlnotify $(GROWL_DIR)/Extras/growlnotify
cp $(SRC_DIR)/Extras/growlnotify/growlnotify.1 $(GROWL_DIR)/Extras/growlnotify
cp $(SRC_DIR)/Extras/growlnotify/install.sh $(GROWL_DIR)/Extras/growlnotify
cp $(SRC_DIR)/Extras/growlnotify/README.txt $(GROWL_DIR)/Extras/growlnotify
Copy in growlnotify, the cli notification util for Growl.
mkdir $(GROWL_DIR)/Extras/GrowlTunes
cp -R $(GROWLTUNES_BUILD_DIR)/GrowlTunes.app $(GROWL_DIR)/Extras/GrowlTunes
cp -R $(SRC_DIR)/Extras/GrowlTunes/ReadMe.rtfd $(GROWL_DIR)/Extras/GrowlTunes
mkdir $(GROWL_DIR)/Extras/HardwareGrowler
cp -R $(HARDWAREGROWLER_BUILD_DIR)/HardwareGrowler.app $(GROWL_DIR)/Extras/HardwareGrowler
cp $(SRC_DIR)/Extras/HardwareGrowler/readme.txt $(GROWL_DIR)/Extras/HardwareGrowler
mkdir $(GROWL_DIR)/Extras/Rawr-jour
cp -R $(RAWRJOUR_BUILD_DIR)/Rawr-jour.app $(GROWL_DIR)/Extras/Rawr-jour
cp $(SRC_DIR)/Extras/Rawr-jour/Icon\ and\ Readme/Readme.rtf $(GROWL_DIR)/Extras/Rawr-jour
Rawr-Jour, GrowlTunes and HardwareGrowler all get copied in.
@#
@# build GrowlMail package
@#
mkdir $(GROWL_DIR)/Extras/GrowlMail
mkdir $(BUILD_DIR)/GrowlMail
mkdir $(BUILD_DIR)/GrowlMail-Resources
cp -R $(GROWLMAIL_BUILD_DIR)/GrowlMail.mailbundle $(BUILD_DIR)/GrowlMail
cp GrowlMail/InstallationCheck $(BUILD_DIR)/GrowlMail-Resources
cp GrowlMail/postflight $(BUILD_DIR)/GrowlMail-Resources
cp -R GrowlMail/English.lproj $(BUILD_DIR)/GrowlMail-Resources
cp -R GrowlMail/German.lproj $(BUILD_DIR)/GrowlMail-Resources
Copy in GrowlMail stuff to prepare it to be built into a PKG.
say enter your password
sudo chown -Rh root:admin $(BUILD_DIR)/GrowlMail
sudo chmod -R g+w $(BUILD_DIR)/GrowlMail
With PKG's, you have to set some permissions.
/Developer/Tools/packagemaker -build -p $(GROWL_DIR)/Extras/GrowlMail/GrowlMail.pkg -f $(BUILD_DIR)/GrowlMail -ds -v -i GrowlMail/Info.plist -d GrowlMail/Description.plist -r $(BUILD_DIR)/GrowlMail-Resources
Here we build the PKG.
sudo rm -rf $(BUILD_DIR)/GrowlMail
rm -rf $(BUILD_DIR)/GrowlMail-Resources
Some cleanup
cp $(SRC_DIR)/Extras/GrowlMail/GrowlMail\ Installation.rtf $(GROWL_DIR)/Extras/GrowlMail
And we copy in the final bit for GrowlMail, the Installation rtf.
@#
@# build GrowlSafari package
@#
mkdir $(GROWL_DIR)/Extras/GrowlSafari
mkdir $(BUILD_DIR)/GrowlSafari
mkdir $(BUILD_DIR)/GrowlSafari-Resources
cp -R $(GROWLSAFARI_BUILD_DIR)/GrowlSafari $(BUILD_DIR)/GrowlSafari
cp GrowlSafari/postupgrade $(BUILD_DIR)/GrowlSafari-Resources
sudo chown -Rh root:admin $(BUILD_DIR)/GrowlSafari
sudo chmod -R g+w $(BUILD_DIR)/GrowlSafari
/Developer/Tools/packagemaker -build -p $(GROWL_DIR)/Extras/GrowlSafari/GrowlSafari.pkg -f $(BUILD_DIR)/GrowlSafari -ds -v -i GrowlSafari/Info.plist -d GrowlSafari/Description.plist -r $(BUILD_DIR)/GrowlSafari-Resources
sudo rm -rf $(BUILD_DIR)/GrowlSafari
rm -rf $(BUILD_DIR)/GrowlSafari-Resources
cp -R $(SRC_DIR)/Extras/GrowlSafari/README.txt $(GROWL_DIR)/Extras/GrowlSafari
GrowlSafari is also a PKG installer, and is built the same way that GrowlMail is built. The next bit is for building the SDK that contains the Growl.framework, Growl-Withinstaller.framework, and Bindings. It's commented, so I won't go over it. But here it is:
@#
@# build the SDK
@#
mkdir $(SDK_DIR)
@#
@# copy the webloc files
@#
cp "Growl Developer Documentation.webloc" "Growl version history for developers.webloc" $(SDK_DIR)
@#
@# hide extensions of webloc files
@#
/Developer/Tools/SetFile -a E $(SDK_DIR)/*.webloc
@#
@# copy the scripts
@#
cp -R $(SRC_DIR)/Scripts $(GROWL_DIR)
@#
@# copy the frameworks
@#
mkdir $(SDK_DIR)/Frameworks
cp -R $(GROWL_BUILD_DIR)/Growl.framework $(GROWL_BUILD_DIR)/Growl-WithInstaller.framework $(SDK_DIR)/Frameworks
@#
@# copy the bindings
@#
cp -R $(SRC_DIR)/Bindings $(SDK_DIR)
@#
@# remove the AppleScript binding
@#
rm -rf $(SDK_DIR)/Bindings/applescript
Note here, we build the Applescript Bindings right into Growl, so there's no need to ship them on the SDK DMG.
@#
@# remove some symlinks
@#
rm $(SDK_DIR)/Bindings/realbasic/GrowlDefines.h
rm $(SDK_DIR)/Bindings/tcl/GrowlDefines.h
rm $(SDK_DIR)/Bindings/tcl/GrowlApplicationBridge.h
rm $(SDK_DIR)/Bindings/tcl/GrowlApplicationBridge.m
Wheeee, symlinks bad!
@#
@# delete svn and backup files
@#
find $(BUILD_DIR) -name ".svn" -type d -exec rm -rf {} \; -prune
find $(BUILD_DIR) \( -name "*~" -or -name .DS_Store -or -name classes.nib -or -name info.nib \) -type f -delete
This bit is always fun. Removing these should be part of your build system no matter what you end up doing. Or at least I would remove them :)
@#
@# make Growl disk image
@#
mkdir $(GROWL_DIR)/.background
cp $(SRC_DIR)/images/dmg/growl075DMGBackground.png $(GROWL_DIR)/.background
./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_NAME).dmg $(GROWL_DIR) Growl dmg_growl.scpt
Here's the important bits. Basically in order for this to work you have to make a folder called .background and copy the image you want into it. Then you run the disk image shell script and it's done.
@#
@# make SDK disk image
@#
mkdir $(SDK_DIR)/.background
cp $(SRC_DIR)/images/dmg/growlSDK.png $(SDK_DIR)/.background
./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_NAME)-SDK.dmg $(SDK_DIR) Growl-SDK dmg_sdk.scpt
@echo Build finished
The AppleScript
That's it for the Makefile. but what about the AppleScript and Shell script? I'll be including those in the zip file at the end of this post, but would like to review the AppleScript here. The shell script will not be gone through, it's pretty self explanatory.
tell application "Finder"
tell disk "Growl" open
tell container window
set current view to icon view set toolbar visible to false
set statusbar visible to false set the bounds to {30, 50, 485, 350}
end tell
This portion tells the finder how big to make the dmg. You're specifically interested in the second 2 numbers. This basically sets the width and height of the window.
close set opts to the icon view options of container window
tell opts
set icon size to 56
Here we can set the icon size of all of the items on the dmg.
set arrangement to not arranged
end tell
set background picture of opts to file ".background:growl075DMGBackground.png"
This is where you enter the name of the background artwork you are going to be using.
set position of item "Growl.prefPane" to {45, 41}
set position of item "Extras" to {162, 33}
set position of item "Scripts" to {36, 153}
set position of item "Growl Documentation.webloc" to {128, 123}
set position of item "Growl version history.webloc" to {265, 41}
set position of item "Get more styles.webloc" to {383, 41}
set position of item "Uninstall Growl.app" to {383, 123}
This sets the location of each of the icons on the DMG.
update without registering applications
tell container window
set the bounds to {31, 50, 480, 350}
set the bounds to {30, 50, 480, 350}
end tell
I believe this portion also tells the finder how to set the size of the window when mounted, albeit I'm not 100% on that. You'll need to play around with it.
update without registering applications
end tell
--give the finder some time to write the .DS_Store file
delay 5
This bit is important. The .DS_Store stores a lot of this info, so we


