January 13, 2009
Family 2.3 released!
It's been a long time coming, but we now have Family 2.3 released! Take a gander, it's been a year in the making and I think it's a big change from 2.0.2.
Posted by Chris Forsythe at 08:56 AM | Comments (0)
September 28, 2008
MacCode Release 1
Just a heads up to everyone, we've put out MacCode. Check it out.
Posted by Chris Forsythe at 11:27 PM | Comments (0)
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 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
end tell
That's really all there is to this. The dmg shell script builds the rest and then the process is complete. No more need for Filestorm or other applications, plus this makes life a ton easier.
Auto Versioning
You can even automate versioning as well. The Adium MakeFile has this little tidbit:
PLIST_DIR=`pwd`/../Plists
ADIUM_PLIST=$(PLIST_DIR)/Adium_2
CRASH_REPORTER_PLIST=$(PLIST_DIR)/Adium\ Crash\ Reporter-Info
version:
@# update the plists
defaults write $(ADIUM_PLIST) CFBundleGetInfoString '$(VERSION), Copyright 2001-2007 The Adium Team'
defaults write $(ADIUM_PLIST) CFBundleVersion '$(VERSION)'
defaults write $(ADIUM_PLIST) CFBundleShortVersionString '$(VERSION)'
defaults write $(CRASH_REPORTER_PLIST) CFBundleGetInfoString '$(VERSION), Copyright 2001-2007 The Adium Team'
defaults write $(CRASH_REPORTER_PLIST) CFBundleVersion '$(VERSION)'
defaults write $(CRASH_REPORTER_PLIST) CFBundleShortVersionString '$(VERSION)'
plutil -convert xml1 $(ADIUM_PLIST).plist
plutil -convert xml1 $(CRASH_REPORTER_PLIST).plist
This writes the version out to to 2 plists, along with copyright information. So you'd set the version in the Makefile, hit Make, and this handles the rest.
openUp
Last and not least, before I go, I need to talk about a utility called openUp. The openUp utility won't exactly be required for this to all work, but it'll help (i.e. you want it). The scripts assume it is installed into /usr/local/bin, but you can modify that. I've included it in the Utilities folder on the zip file.
For what it does, I'll just copy and paste the comments from the .c file:
/*
* Shantonu Sen <<EMAIL REMOVED>>
* openUp.c - program to set the "first-open-window" field of a volume
*
* Get the directory ID for the first argument, and set it as word 2
* of the Finder Info fields for the volume it lives on
*
* cc -o openUp openUp.c
* Usage: openUp /Volumes/Foo/OpenMe/
*
*/
The end
Well, that's it. I hope this has been informative. Oh, here's the zip (2.4 mb).
Also, this is my first attempt at posting with the newer versions of Ecto. I rather like this, and will probably purchase it.
Posted by Chris Forsythe at 02:27 PM | Comments (1)
September 19, 2006
Old svn client == bad
If you ever update your or make a fresh repo with svnadmin, and then get the following errors:
svn ls file:///path/to/testrepo/
svn: Unable to open an ra_local session to URL svn: Unable to open repository 'file:///path/to/testrepo' svn: Expected format '3' of repository; found format '5'
Be sure to check your client version.
For instance, oooh.. running svn version 1.2.3 with a repo version 1.4.0 (which I did) would be bad.
Posted by Chris Forsythe at 04:45 AM | Comments (0)
July 15, 2006
Cocoaforge problems
Hey Folks,
So for a few years now, I've been helping to run Cocoaforge along with James Cox. This consisted of helping admin some forums, and some other stuff. This also involved hosting subversion+trac for a few projects.
Last week we saw a hardware failure on one of the systems. ETA on resolving the problem is at least Monday, if not longer.
So the big thing to note is who is affected:
Cocoaforge forums are down. This includes the Adium, OS X aMSN, Growl, skiTunes, Vienna, and Virtue forums. I may be missing one or two along with this, but this is what I remember.
Some portions of Adium, Growl and Colloquy hosting are down as well. Mostly this is static images for the Trac installs, along with a few other things. Trac is still functional, along with subversion for each project.
Posted by Chris Forsythe at 08:20 PM | Comments (1)
May 14, 2006
May 15th Bush Speech Drinking Game
Drinking games are fun, doubly so with televised national speeches. So I haven't found one yet for the speech tomorrow regarding immigration. Here is my list:
The People: 1 shot
Mexico/Mexicans: 1 shot
India: 2 shots
Border Control: 1 shot
The war (since this speech is not about the war): 3 shots
Outsourcing (it's related, but doubt it's brought up): 5 shots
Stephen Colbert's awesome closing speech: 15 shots
Nuclear/Nucular/Nuclar: 3 shots
Lost jobs: 1 shot
Jobs americans apparently don't want to do: 1 shot
Illegal immigrants already in the US: 1 shot
People immigrating right now: 1 shot
Increasing border control with national guard: 2 shots
Faith: 2 shots
Immigration Reform Control Act (IRCA) of 1986: 5 shots
And, to be fair, we'll have it both ways here:
Making every illegal immigrant fear for their lives: 5 shots
Making every illegal immigrant call their family and tell them to come on over: 5 shots
Length of speech time (estimates of 12-20 minutes were given):
12 minutes: 1 shot
13 minutes: 2 shots
14 minutes: 3 shots
15 minutes: 4 shots
16 minutes: 5 shots
17 minutes: 6 shots
18 minutes: 7 shots
19 minutes: 8 shots
20 minutes: 9 shots
If he goes over 20 minutes: 10 shots
If over 30 minutes: 15 shots.
If a group of immigrant extremists storm the capital building, and make it onto the camera while the speech is taking place: 250 shots.
Posted by Chris Forsythe at 04:08 PM | Comments (0)
April 23, 2006
Booze+food+respect
So the other day a friend was asking me if I was going to see Silent Hill when it came out friday, and if I wanted to do a double date thing with him+his girl and me+my wife. I figured that would be ok. Two days before he started picking theatres, and never hit upon the only one I would ever go to. Needless to say, we didn't double date (didn't even tell the wife about it, heh).
Why won't I go to a cineplex/stadium seating style theatre:
1) Respect from employees:
If I go to a resturant, it's for the experience. I can cook a lot of things better than a resturant can, and for a lot cheaper, but if the wife and I just don't want to stay in that night, we pick the resturant we liked. If the food is good and the service is horrid, we aren't coming back. The same thing happens at most theatres.
At a typical stadium seating theatre, the employees honestly just don't care. Most seem to have given up on their fellow human. And to be fair, they are right.
2) Cleanliness of the floors/seats:
If the floor is sticky, ugh.
3) No beer. No wine. No alcohol.
Seriously.
4) Precommercial commercials:
Ok, so some movie company wants to "preview" their movies to me. I can somewhat tolerate that, but then being shown in theatre commercials because the movie theatre chose to is excessive. Really, it's most of the reason why the wife and I stopped going to traditional theatres.
5) No good food:
Oh they have popcorn. And candies. But no pizza that has garlic on it, no burgers that taste decent, nothing.
Sometime during the beginning of last year the wife and I just stopped going to traditional movie theatres. It saved us on money when the experience was just kinda lame anyhow. Then a coworker talked to me about the Alamo Drafthouse.
Holy crap. Not only do they serve booze and food, but the staff there are superb. They're working on a sort of tip system somewhat, along with their hourly pay (at least that's my assumption), so they have somewhat of an incentive to actually be nice to you.
There's also a table in between each row. You don't have to worry about someone's big hair being in the way, and you don't have to worry about kicking your soda or it being on the chair arm the whole time.
They even play old favorites like the Godfather and they have a Anime night (looked like decent animes) and all sorts of other stuff.
If I had the funding I'd franchise this nation wide, and utterly destroy every other theatre chain. That's seriously how good this is.
Posted by Chris Forsythe at 10:22 PM | Comments (3)
April 17, 2006
The dictatorship of the Huw Federation
I have now taken over as the supreme ruler of the Huw Federation. I urge all citizens to remain calm as I take over as their supreme leader.
The latest news on this is from here: http://blog.evula.net/huwr/archives/002817.html
Posted by Chris Forsythe at 10:06 PM | Comments (0)
April 03, 2006
WWDC, the trip
So I kinda want to go to WWDC this year, but do not have the funds. If anyone has a ticket to WWDC they'd like to give me, please let me know.
Posted by Chris Forsythe at 11:07 PM | Comments (2)
January 24, 2006
Adsense and css
So I decided to throw an ad up on my site. I see no point in paying the fee for the domain and not getting something back on it I guess.
So I decided to go with Adsense. I can choose to only do text ads, and I can specify the size/location/whatever I want. I think it'll work out pretty well, we'll see.
The biggest problem with all of this, of course, is adding it to the site and making it work in a lot of browsers. Have I ever said I hate css?
Posted by Chris Forsythe at 04:16 PM | Comments (0)
January 20, 2006
Blogs, and when you should just email someone
Is it weird to google your name? I dunno, I do it every once in a while. Today I ended up on this post by Peter Saint-Andre, and realize that would have aggrivated me if I had read it right after I had posted on my blog.
I mean, of all the gall. Like I didn't know about the standards list? I mean, come on. I was working on something for Adium, and didn't want to deal with the enormous politics of the Jabber community.
But it's been a while, and I looked more closely at his post. Looks like he obviously hadn't read the post before that.
Had he emailed, I would have just told him what I was up to. But now it doesn't matter, I'm not working on that anymore, and I don't need to worry about it any longer. But their deferral system is quite silly, why not just say "it's deferred, here is a link with more information on what deferred means"? Bla, I don't really care I guess.
Oh, and I like how he didn't get the point here: in a rebuttal to my post regarding what I think jabber sucks in. Also, via email, I would have probably been able to respond. Especially since most people don't understand their email (like my mom).
Feels like high school on the internet sometimes, ya know?
Posted by Chris Forsythe at 12:44 AM | Comments (1)
January 16, 2006
I am not Australian, but I like the country. I promise
So for the last few months I've been working the night shift. But most of the jobs I have worked have been later in the evening/night shift, so this is nothing new. This, however, is the first job where I have worked past midnight.
Traffic is generally better at night. It doesn't take very long to get home. I always hated hurrying up to get out of the office only to sit in rush hour traffic. It was so silly to me. When I work day shifts I always ended up staying a few hours extra just to avoid it. The saddest part is that when I didn't stay that extra time, I'd get home about 10 minutes earlier than I would have if I had stayed at work.
The wife got a semi matching shift a while back, so now we get to spend more time together. It's great, we watch some tv and I get to study even. Life has never been better.
Except for one thing. I now hate most calendar systems. Why? Because I can't make them work how I want them to of course, hehe. Here is why:
Now, if you can't figure out why that aggrivates me, look in the middle. There is all that blank area. I will probably not be using the blank area ever. Most of my waking hours revolve around 2pm to 5 am. Most all of my schedules revolve around the same thing.
I can't even schedule it like this in Outlook. You can't tell outlook to display until 2 am the next day, so it doesn't want to make a calendar event that will go past the viewable area. iCal can do that part at least.
Here is what I want things to look like:
Notice the new problem here though. All my times are completely different. Some of you may have guessed, but if you haven't, here is how that is even possible. Enabling time zone support, in advanced. I'm not even sure why this is a pref, but it is.
To view it this way, there is a drop down in the top right of iCal, like so:

And to set it back, you change it to your original time zone

So basically I want to be able to view it like I can in Sydney time, but without actually being in Sydney time. I've been googling around for a bit, and just can't find a work around for that.
Also, if anyone knows how to make Outlook work in the same way, I'd be glad to give that a go.
Posted by Chris Forsythe at 04:43 PM | Comments (0)
December 20, 2005
Why does this make me laugh?
http://www.amazon.com/gp/product/076457874X is a book about WinFX Beta.
It's a book about a beta.
It has 4 authors.
It's just funny :D
Posted by Chris Forsythe at 01:36 AM | Comments (0)
Visual Studio is not Interface Builder
So I'm trying visual studio out, doing the c# thing, and the first thing I miss from Interface Builder on os x is the guides that get shown. They're the things that tell you that the item you are dragging on the pallette is this close to this one, and oh ya, this one too.
Visual studio has none of that, and it sucks.
Posted by Chris Forsythe at 01:17 AM | Comments (1)
December 01, 2005
Interviewed
I was interviewed by Victor over at MacNN
Here is a link to that podcast.
Posted by Chris Forsythe at 10:07 PM | Comments (0)
November 16, 2005
Boredom and a change
So I've gotten bored posting once every 6 months about stuff. I'm going to still do it, but in general my "rawr" will become more of a repository of cool Cocoa hacks, along with other things. I'm giving folks posting privelages, and multiple people are going to post to the "rawr".
I'll be changing the template to be more maclike, and so forth. If anyone wants in, they should whois my domain and then email me.
- Chris
Posted by Chris Forsythe at 01:18 PM | Comments (0)
October 23, 2005
Is this thing on?
So, what's new? I haven't posted in forever and a few months, so this one will be sort along, as always.
Coal is dead. Basically, the idea was good but there just wasn't enough time. Oh well, spotlight's interface still sucks, I still use quicksilver, so does Jerome.
Chatkit, on the other hand, is not. Ofri got some code in today (or was it yesterday?). It's not really tested, but it is a start. It's for rendezvous/bonjour, and gives us something to start on.
I've been move up to being called the Project Manager for Adium, officially. This doesn't change much, as I've been operating the same way for the last two years with Adium, this just makes it official. It's kinda neat, I manage two projects now, both with two different styles of management, and both with their own sets of problems. The good part here is that Adium depends on Growl, and as Project Lead on Growl, that helps Adium out quite a bit.
I was offered a position with DefaultMind, the owners of Proteus. The position was for two unrelated software titles. I eventually turned this down. Apparently some people got word of this before they were supposed to know, albeit I do not really know how. One person thought it was a huge deal and wanted to post about it, I said no, and now he's angry at me. Guess it turns out good for him.
Growl itself is in the middle of a large codebase refactorization (is that a word?). I say middle, because half of the related tickets are closed. We've gained two people who can help with this, so the process should speed up some. Growl .8 will have positioning, and hopefully close widgets for notifications, meaning that managing the notifications will be easier.
Posted by Chris Forsythe at 08:29 PM | Comments (0)
August 01, 2005
What I've been up to
So in the last couple of months, I haven't posted much. This has more to do with the fact that the server was changed (and I did not backup my database because I wanted to sorta start new) than anything else.
So with this in mind, this post is going to be long.
Growl
Growl is doing really well. We have had about 40,000 downloads of .7 now, so this gives a form of validation. I'll be pushing beta 5 out tomorrow, and hopefully .7.1 next week sometime.
Growl .8 is going to take a while. A lot of stuff is being refactored, so that in the long run Growl should hopefully be easier to code on. This is being done, and hopefully Growl .8 will be out by Christmas.
Chatkit
So in the long run, Adium, Fire, and Proteus (the 3 main chat clients on os x) are all reimplementing the same things over and over. If you add it up, we all probably fix the same problem different ways with over 100 man hours wasted a year.
My thoughts on this for a while had been that we could all work together on some things. My previous entries regarding emoticon standards (which I gave up on) show this to some extent. For about 3 months, Adam and I have been discussing this indirectly. We ended up naming the idea Chatkit, then getting ideas going on it, involving people from multiple projects. We just started the project last week actually, and so far it's been slow going but fun. I'll talk about this more later though.
Coal
About 3 weeks ago I started thinking of something new as well. Every time I was talking with someone over im for a one week period, I would continually need to open up log files/search something on google/find something on amazon/use spotlight.
Then I remembered dashboard (later became beagle), and thought we could use a splash of something like it on os x. jfro is going to investigate this further, and has a working way to get at the data we'd need to get to. The general idea is that this is data mining, hence the name Coal. If it doesn't work out, we can still have a nice gui to do spotlight+internet all at one time. That in itself would be convenient.
Adium
I've been working less and less on Adium. My initial goals were only known by the two team leads. Overall though, the idea is to help the project in the eventual case where developers drop out of wanting to work on it. Keeping people interested has been my thought process on a lot of it, and so far it's worked out pretty well. My need to work directly with developers in order for this goal to be achieved is pretty much gone now, so folks are probably seeing me less and less.
Myko Games
So apparently I started something called Myko Games inadvertently. Basically the idea is to have a game system that works with multiple clients on os x, in order to allow mac users to play games such as chess and tic-tac-toe. Long time Adium users might remember tic-tac-toe, which this evolved from (somewhat). Here is the real story though:
Skyler (otherwise known as freakman) decided he wanted to have an easter egg inside of Adium. Skyler finally landed on wanting to put a 10 mb movie file hidden inside the "About Adium" dialogue.
Yes, I said that. He wanted to put a 10 megabyte file in Adium. And he wanted it to only be activated when people went to the About panel, and only for some weird key combination. Guess what we said..
Anyhow, in order to keep him interested in it, I suggested that he put games into Adium instead. Eventually we landed on the idea that other clients would like to have this too, and hence IMGames started. Unfortunately the name IMGames is taken, so Myko was chosen (lord if I know what it means). And so, apparently I helped to start Myko Games and save Adium from the 10 movie monster.
Randomness
Oh, and to address this blog entry by Peter and why I revived my posting grounds. I was not worried. Rather, at the time I just was not going to use something that the folks who do jep wrangling did not recommend implementing. Also, dragging up one of my posts from last year wasn't such a great idea either. But since it's been brought up, the initial work I've done will probably make its way into Chatkit, in a much simpler format than described in that jep.
Posted by Chris Forsythe at 06:57 PM | Comments (0)




