February 16, 2010
Betas, Twitter and WTF

I've seen some complains from people about us seeding betas on Twitter and how it is inconvenient for some of you.

Why are we bothering with the whole Twitter thing? Mostly because… it saves us time. With the recent addition of @haxiesbeta Twitter account it's now easier to seed these betas — you sign up, we approve your request, and then you instantly see the links to all the current versions of stuff in testing. With e-mail lists it was fairly tedious to manage, prepare and send notifications. So yes, I guess we're just using the opportunity to save the time to do something more productive.

We don't expect the beta period to be long. We also don't urge everyone to jump on the beta train. Pre-release versions of the software tend to be buggy and may cause instability of your system (we try really hard to not allow that, but it's software, and it's fairly complex). After all, in 2-3 weeks we will release everything publically (hopefully) and it will be a much more polished experience - thanks to our testers.

Meanwhile, Xounds for 10.6 is preparing to enter the beta stage, and we've seeded FruitMenu and Labels X updates, with WindowShade X beta update to be out later tonight.

Thanks for sticking with us!

 Posted by slava at 08:47 AM | Comments (52) | TrackBack (0)
June 02, 2009
Mighty Mouse with Some Theme Sauce

Cursors! At long last, here's a version of Mighty Mouse that works on Leopard. It's also got a few new UI wrinkles, and you can now easily move your cursors back and forth between Mighty Mouse and Adobe Photoshop™. Enjoy it, and report bugs!

Wait, what did you say?
"AAAAHHHHRRGG! What about ShapeShifter!!??"
Ahh, right...

ShapeShifter will never be updated for Leopard, and here's why: The way that Apple has internally implemented skinning of the UI for Leopard is very obviously a stopgap measure on the way to something new that they'll unveil in the future. To explain this, I need to go into theming history and future extrapolation a bit, so please bear with me.

ResEdit.png
themeing as old as this icon

Until Leopard was released, theming on OS X was mostly done via a single monolithic file named Extras.rsrc. Internally, this file was a Resource Manager file. The Resource Manager is a leftover from Apple System 1 (yes, seriously) and has been officially deprecated by Apple since the original release of Mac OS X. And yet, this is how theming has been implemented. Obviously, this situation couldn't last forever.

With Leopard, there's something new and spiffy — CoreUI. In the old Extras.rsrc system, the themer modified a bunch of chopped up bits of buttons and sliders and the operating system assembled them all together onscreen. CoreUI changes this idea dramatically - instead, the themer describes what should be rendered onscreen and the operating system assembles the graphics from the themer's recipe. Cabel has an old but good blog post describing this here.

Sounds great. The problem is that it wasn't ready in time for Leopard. So Apple pulled a quickie. Leopard still uses the old, late '90s era vintage Extras.rsrc system. Leopard also uses the snazarrific late '00s era CoreUI. And Leopard uses the stopgap measure called ArtFile. And all three of these completely different systems get used in different places and under different conditions, sometimes even within the same application.


coreui, straight from apple's patent filing

So, what's this ArtFile thing, then? Basically, it's two single files (with two unique file formats, of course) that contain the various images used to composite the operating system. They're both binary files, and neither one uses any sort of a documented file format. And unfortunately, the majority of theming on Leopard uses this particular subsystem out of the three that are available.

So why not convert ShapeShifter to use this system? Basically, because it would take an entire rewrite of ShapeShifter, and I know that I'd be required to do another complete rewrite as soon as the transition to CoreUI is complete. If I'm going to do a complete rewrite, I'm only going to do it a single time.

So basically, ShapeShifter is sitting out Leopard. Once we get a good look at Snow Leopard at this year's WWDC, we'll see how Apple's transition to CoreUI is doing and I'll be able to evaluate ShapeShifter for Snow Leopard more seriously.

In the meantime, themers haven't had many options under Leopard. I personally apologize for this. I haven't been following the theme world closely during the Leopard era, and when something called ArtTools came out a year ago, I thought that themers had what they needed to create themes. Façade was originally slated for release last fall and I thought it would fill the gaps.

I didn't realize until a couple of months ago when Magnifique was released that themers really hadn't had any good options, and that the situation still wasn't ideal.

So here's something to help: a new build of ThemePark that has full support for the two different types of ArtFile used in Leopard. Themers can use this to build Leopard themes. And something really new is that you can also apply these themes from within ThemePark.

This ThemePark build is basic as hell, and the themes you can create and use with it are a far cry from what you could do with ShapeShifter. There's no Unsanity APE module involved, which drastically limits what can be done.

Caution.png

It's also alpha software, meaning that there are known bugs and it isn't feature complete. In the event of an emergency, you can revert to Aqua via the command line by entering the following command:

/Library/PrivilegedHelperTools/com.geekspiff.themepark --revert

Anyway, a picture is worth at least thirty-six words, so here's a fun lil' screencast showing how you can create and apply a theme that will turn your Mac OS X from blue to green in under five minutes.

Enjoy!

 Posted by jason at 12:45 AM | Comments (88) | TrackBack (0)
April 17, 2009
Welcome back.
unsanity-logo-white.jpg

It's been a while since this blog was updated… the same stands for our products. I believe it's about time to change that — drastically.

Today, we're releasing the Leopard-compatible version of our haxie Xounds (a public beta) as well as a public beta of WindowShade X that fixes the most annoying bugs.

In the coming days, you will see the Leopard-compatible Mighty Mouse and the final releases of Xounds 2.5 and WindowShade X. Then we will focus on ironing the remaining bugs out as well as doing further R&D work.

You may notice that our site and products branding changes over time — we are doing the rebranding and the new website is half-way ready, but it's on the low priority as we'd like to focus on products first. Above is our new logo, and all of our haxie updates will have new icons to match the updated, simpler look.

We are already doing some research on the Mac OS X 10.6 Snow Leopard to make our most popular haxies supported, as well as bring you something new.

Either way, thanks for staying around with us through all these years — it's your support that helps us going and motivates us to do the work. Despite the recent silence, we're full of energy and do our best to not let you down.

Yarr!

Download Xounds 2.5b1
Download WindowShade X 4.3b1

 Posted by slava at 12:04 PM | Comments (49) | TrackBack (0)
September 20, 2008
Spectacular Catastrophe: WindowShade 4.2b2

And thus, it is thrust upon this world.

If there are no humungous (rada rada) issues with this beta 2 of WindowShade X 4.2, then it will be cleaned up a little and released sometime next week. I strongly suggest everyone changing the update check to daily as 4.2b2 won't be around that long.

There is one small change to this update. The donate panel in the preference pane has been removed. It has been replaced with a voluntary upgrade fee (vuf) panel. This is mostly because WSX is like totally 7 years old.

Seven Freakin' Years

Anywho, here's what's new in beta 2:

  • The price of WindowShade X has increased from $10 to $13.50.
  • MIP windows no longer appear below the bottom of the screen in 10.5.
  • MIP windows now respect the Dock size in 10.5.
  • No longer uses CGSUniqueCString().
  • Addressed a bug that caused a MIP window to expand into an invisible window when clicking on the Dock icon when all windows in the application are MIPped.
  • Now allows windowshading of the iTunes 8 window when double clicking on the title bar.
  • Fixed a crash that could occur when closing all windows (option click close widget) in Cocoa applications.
  • Addressed an issue that rendered WindowShade useless in Firefox 3.x.

Some of these changes should please some people.

Download WindowShade X 4.2b2

Not much to say other than happy window shading!

 Posted by rosyna at 07:50 PM | Comments (49) | TrackBack (0)
September 15, 2008
Feel the Heat That's All Around You; Flashing Lights and Ecstasy Surround You: The Silly Effect and John Gruber

When we first put the "Silly Effect" effect in Menu Master, a lot of users complained about it, as you can see by looking at the comments for Menu Master on JesusUpdate. I mean a lot of users. I had never seen such angry comments about a feature before. (We got more angry comments via email too).

So the Silly Effect was removed from Menu Master 1.4.3. And then we started getting emails from people that were sad it was removed. OMGWTFBBQ?!, ya know? But first I wish to discuss something else.


That Darned Adobe Bug

We've seen more than a couple of reports that MeMa 1.4.3 doesn't like Adobe applications on Mac OS X 10.4.11. Something to do with the Help menu and the mouse cursor position. While we could reproduce it in the beta builds, we fixed MeMa to do the right thing, or so we thought.

Please Help! If anyone is experiencing odd problems with Menu Master 1.4.3 and Adobe applications, please email us a System Profiler report (Apple Menu ☞ About This Mac ☞ More Info…) and a screenshot of your screen immediately after the problem (Command-Shift-3, a new file named Picture N.png (where N is a number) will appear on your desktop, send us that).

The Silly Effect is Back; It Wants Blood

The Silly Effect is a cheesy animation option developed over the course of a few weekends on May 26th, 2006 (over two years ago). It has been in hibernation since then.

Silly Effects puts a Quartz Composer document animation in the background of a menu. By default, these documents are culled from Library/Application Support/Unsanity/Menu Master/ in both your user folder and the main Library folder (Local Domain and User Domain). There are also a number of quartz composer documents included in the Menu Master.ape application enhancer bundle. These included quartz composer documents are from Futurismo Zugakousaku's excellent Quartz Composer Lab study, used with permission.

If you wish to create your own snazzy animation and are familiar with Quartz Composer, Quartz Composer documents can use two inputs that Menu Master makes available to them. "SelectedMenuItem", which is the name of the currently selected menu item (you may want to filter out "-", the separator), and "MenuItems", which is an array structure containing the names of all the menu items in a menu.


More information on Quartz Composer can be found at:

Apple's Quartz Composer Documentation
Apple's Quartz Composer mailing list

Futurismo Zugakousaku's excellent Quartz Composer Lab study (contains a lot of excellent Quartz Composer documents, some are included with Menu Master).

What's new in this version of Menu Master 1.4.8b1? Control is what's new.



Note that this beta has the Silly Effects on by default. Also, these things are new:

  • Re-enabled the Silly Effect.
  • If you have a Safari 4.0 beta installed, do NOT use any Quartz Composer documents containing JavaScript, due to a bug in JavaScriptCore in Safari 4.0.
  • The Silly Effect is on by default for this version as it needs testing.
  • The Silly Effect will be off by the time MeMa 1.4.8 is final (3+5=8).
  • Added support for the garbage collector in Silly Effect.
  • Removed Support for garbage collected applications in Silly Effect. QC itself isn't very compatible with GC.
  • There is now a prefpane tab dedicated to the Silly Effect. It allows you to disable or enable Quartz Composer Documents individually. All Screen Savers are disable by default as most are not suited for menus. If you disagree, turn it on.
  • Got permission to include Mamoru Kano's (www.zugakousaku.com) excellent Quartz Composer documents. They are just astoundingly beautiful and awe inspiring. There is no adequate way to express how grateful we are for this.

There are a few known issues with this release, but they are mostly minor aside from the Safari 4.0 bug (which is a bug in JavaScriptCore).

Download Menu Master 1.4.8b1 (after installing this, you'll get notices of new Menu Master betas until 1.4.8 is released)


Other Important Stuff

Despite our much publicized interactions with the programmers at Barebones, we highly recommend BBEdit. It is a highly useful text editor that we at Unsanity could not do without. (In fact this post was made with the help of BBEdit). Neither SlickEdit 2008 nor Notepad++ can hold a candle to BBEdit (although I've yet to personally check out the new BBEdit 9).

 Posted by rosyna at 08:20 AM | Comments (8) | TrackBack (0)
August 25, 2008
Purified Chicken Embryo Cell, The VUF, and Menu Master Beta

The response to the voluntary upgrade fee for FruitMenu was freakin' amazing. It far, far exceeded our hopes and we give our gratitude to everyone that did the VUF.

Now, there's a question that needs to be asked. Shall we request VUFs for future Leopard compatible releases? Like this here Menu Master voluntary upgrade fee. Does Menu Master have enough of a following to warrant a VUF?

Once again, I want to give thanks to all those that participated in the VUF and to all those that plan to participate.

Let's have a chat about Menu Master

For the last year and a half (18 months), every Menu Master beta has included a "Silly Effect". Most people never noticed this because it would only appear in one or two applications (TextEdit and Safari). The Silly Effect itself was created over the span of two weeks way back when, and polished so it could be shown off to users. It looks something like this (but animated):

Anywho, that's how it was in Menu Master one point four point three beta three. And then there was the anger. So much anger and so much ire. Some people claimed it was a bug. Some people tried repairing permissions, being unable to tie the new behaviour to the software they just installed that mentioned "silly". Some people went completely "psycho". (For what it's worth, he was told not to share the key because it had already been changed to something else in the codebase for beta four).

If anyone has seen any other public forums with posts that complain about b3, please email the links to us or put the URL in the comments.

Before releasing the third beta, we were a little worried that not that many people use Menu Master (MeMa from now on). Well, putting in that "new" feature and defaulting it to on with so many animations (some very hard to read) definitely taught us something. People that love MeMa... really love it.

We'd also like to apologize to anyone that lost work or had a drop in productivity while the animations were showing.

What's new in 1.4.3b4?

In 1.4.3b4, animations are still on by default. However, it's not any of the animations you've seen before. It's just one animation by default.

Here are the release notes:

  • Note: The price of Menu Master has increase from $10 to $12.
  • This is a free update.
  • Addressed some comments made about the something "special and silly". So many angry comments....
  • Included a sample of something silly in Libary/Application Support/Unsanity/Menu Master/1. MenuEvil.qtz. I have no skills of an artist, so this is just an example of what can be done with the something special and silly (and it publishes "MenuItems" and "SelectedMenuItem" inputs).
  • Added documentation to the read me about how to use the silliness and resources on how to get more information on the silliness.
  • Added some roundish rectangular (squircle) things to the second tab of the Menu Master preference pane.

Here is what has been added to the read me:

Silly Effects

Silly Effects is a cheesy animation option developed over the course of a few weekends over a year ago. There was no work needed to make it compatible with Mac OS X 10.5.

Silly Effects puts a Quartz Composer document animation in the background of a menu. By default, these documents are culled from Library/Application Support/Unsanity/Menu Master/ in both your user folder and the main Library folder (Local Domain and User Domain). There are also a number of quartz composer documents included in the Menu Master.ape application enhancer bundle. However, these are not loaded by default. If you wish to load these bundled animations, check "Include Bundled Animations" in the Menu Master preference pane.

If you wish to create your own snazzy animation and are familiar with Quartz Composer, Quartz Composer documents can use two inputs that Menu Master makes available to them. "SelectedMenuItem", which is the name of the currently selected menu item (you may want to filter out "-", the separator), and "MenuItems", which is an array structure containing the names of all the menu items in a menu.

More information on Quartz Composer can be found at:

Apple's Quartz Composer Documentation
Apple's Quartz Composer mailing list

Futurismo Zugakousaku's excellent Quartz Composer Lab study (contains a lot of excellent Quartz Composer documents)

Do we remove it or keep it in?

Now that people have seen the silly effects, should we keep them in MeMa (but disabled by default) or should we just remove the entire thing, so no one can enable them?

Of course, if we decide to keep it in for the final, we would really like some better looking animations than that MenuEvil.qtz thing I made. I do not have the skills of an artist. If anyone does have the skills, and is willing to let us use your work in MeMa, we would greatly appreciate it.

Download Menu Master 1.4.3b4

Other Stuff

Well, there's been two betas of MeMa released and still no new fansubbed episode of Detective Conan has been released. I weep.

Also, please do respond in the comments here on the "keep or trash issue" and the Menu Master voluntary upgrade fee. Please state your reasons if you don't mind.

Important Note: the final version of MeMa will be released super quickly fast depending on the results of this post. So I'd like to see some responses to this post by the time I wake up tomorrow. I've already been awake for 24+ hours. Although, there might be a reprieve if a new Detective Conan fansub is released.

 Posted by rosyna at 03:28 PM | Comments (25) | TrackBack (0)
August 06, 2008
Dear APE, I want you inside me. Love, Leopard #2: APE 2.5b2

Uhm... Well, I didn't have this post very well thought out. Usually I dwell on blog posts for weeks while in the shower, but all I had for this post was the title and the photo.

We have not been posting new entries to this blogosplat, but have been working on updates to the various haxie betas. As soon as a new beta is released, all the old beta links in the previous post point to the brand new beta so we didn't have to update the post or anything. And since all the released products include an updater, there was no reason to notify people of new betas through a blog post (the updater would notificate them).

Of course, there are some exceptions. For example, Smart Crash Reports 1.5b3 was released a few weeks ago (it's also a part of FruitMenu 3.7b3 and higher). SCR does not include an updater (there's no need... yet) so I will state what's new on this post (ugh, that's not creative writing!)

  • Addressed an issue that could cause Apple-only crash reports to be sent to a third party if the user clicked the cancel button.
  • Made some UI improvements when cancelling a send.
  • Now properly shows which company it is sending a crash report to when sending to company and Apple.
  • The Installer plugin now checks to make sure SCR has the correct permissions on 10.5.

Download Smart Crash Reports 1.5b3

The really big news of course is Application Enhancer 2.5b2.

We really, really didn't want a repeat of what happened with older versions of APE (re: previous post). I mean, we really didn't want it. To that end, we've added an updater to APE itself. By default, it checks for updates weekly (or when the system version changes). If you install APE 2.5b2, I'd like you to change update checking (in the Application Enhancer preference pane) to daily.

Some third-party APE module developers asked if they could disable the update check when the user installed their software. We have decided against allowing it to be changed on install by anyone other than the computer user. I mean, "the problem" only occurred because some third parties were shipping very old versions of APE with their products (re: previous post again). It'd kind of defeat the purpose of the updater if it could so easily be controlled by third-party software.

  • Added an updater to APE, set to automatically check weekly, by default.
  • Reduced the number of unpatchables on PowerPC (includes APELite).
  • Addressed some cosmetic issues in the preference pane.
  • The APE preference pane will now state why it is disabled on Mac OS X 10.6.

Download APE 2.5b2
Download APE SDK 2.5b2

Finally, there is a new beta of FruitMenu that includes APE 2.5b2 and SCR 1.5b3. However, you'd have to use the updater to get the new beta. We are desperately trying to get people to use the updaters.

Once again, I'd like to repeat the warning stated on previous posts in this category. I'm sorry if it seems harsh, but it has to be said.

Note: Please do not post comments and/or send emails asking about the present and/or future of things not mentioned in this post. Such comments will be moderated, deleted, or edited. When we have something to say about other products, it will be posted, and not a moment before then. Asking us about ETAs just ends up wasting both of our time. Apologies for taking such a harsh stance, but the only thing we would tell you is "it'll be done when it's done" and we're trying to prevent a repeat of the tens of thousands of comments/emails we've received asking for an ETA. Any kind of timeframe or ETA we could possibly give will be wrong and users get very disappointed when ETAs are missed. That's the nature of ETAs, they are always wrong. And due to the fact we won't release something before we feel it is ready, any ETA is even more likely to be missed.

On a happier note, I would like to state that SCR 1.5b3, FM 3.7b5, and APE 2.5b2 are nearly the final versions before actually being released in non-beta form. Except for the logging in FruitMenu, assume everything to be final and do not treat the software as beta quality in your mind.

Speaking of the logging in FruitMenu, we are looking for any large values attached to "CreateMenuItem:" as listed in the console. We especially want to know if any operation takes longer than 200ms. This information will be used to increase FruitMenu's loading speed in the future.

Price Increases Abound

On a final note, the prices of the haxies are going up as the Leopard-compatible versions are released. FruitMenu, for example, is increasing from $10 to $12. The reason for this price increase is the sad state the US economy is in (seriously, Canadian funny money is worth more than the US dollar, OMGWTFBBQ?!). The price increases of other products have not been decided on yet.

 Posted by rosyna at 10:47 PM | Comments (30) | TrackBack (0)
February 24, 2008
Enthusiastic Trepidation

(Yes, Betas). While my previous post talked only about the past, this post talks about the present. Some of the previous post is intentionally wildly out of context if you don't read this post. And some of this post may be out of context if you don't first read the previous post.

Note: Please do not post comments and/or send emails asking about the present and/or future of things not mentioned in this post. Such comments will be moderated, deleted, or edited. When we have something to say about other products, it will be posted, and not a moment before then. Asking us about ETAs just ends up wasting both of our time. Apologies for taking such a harsh stance, but the only thing we would tell you is "it'll be done when it's done" and we're trying to prevent a repeat of the tens of thousands of comments/emails we've received asking for an ETA. Any kind of timeframe or ETA we could possibly give will be wrong and users get very disappointed when ETAs are missed. That's the nature of ETAs, they are always wrong. And due to the fact we won't release something before we feel it is ready, any ETA is even more likely to be missed.

Standard Goldfish Disclaimer Applies

Remember, these are betas. They have not had the test coverage released software has. But we do have confidence they won't completely make your computer explode. Even so, please open each product's preference pane and make sure automatic updates are checked Daily. Just in case something bad happens, so it'll be no more than a day before you get notified of the update.

These betas also have some significant user interface issues that will be resolved by the time their final release approaches.

With that said, I wanted to talk about the current public betas for Mac OS X 10.5 we are releasing now. But, I'll do it in no specific order.

APE 2.5 (and SDK)

First, let's talk about the situation behind what happened with APE 2.0.1 and Mac OS X 10.5.0 (note that APE 2.0.2 was released on 2006-11-01, a year before Leopard's release, and APE 2.0.3 is the current version). Namely, specifically what caused the issue and what the issue actually was. I am hoping discussing this issue at length will restore any confidence in APE that may have been lost or at least prevent people from pointing to this issue as an argument against APE.

Background

APE is "burdened" by a number of restrictions placed on it. Some are the usual restrictions others are restrictions we've placed on APE from our knowledge and years of experience. Still other restrictions we've placed on APE just because it seems like a good idea to restrict APE to certain boxes beyond empirical evidence (hypothetico-deductive?). For example, "if doing something X is a bad idea, then certainly related action Y is just as bad." We also keep enforcing restrictions that were true on previous versions of Mac OS X, even if those restrictions have long since been lifted by the system itself. We try to respect the legacy. Also, whenever it is decided APE has to call a new API it's never called before, we evaluate who else uses the API on the system (especially if Adobe, Microsoft, and/or Apple applications uses the API) and the chances of a system update changing the previously documented behaviour of said API. We try to choose functions that, if they ever change due to a system update, they will fail in a spectacular and catastrophic manner. So spectacularly catastrophic that Apple cannot release the system update without breaking hoards of Mac OS X's most important applications (this is known as maintaining backwards compatibility).

All of our code contains metric assloads (imperial assloads, too) of error checking and state checking code. If a function returns anything but void, an error check is made (and sometimes even if a function returns void. If something calls into a different API, a state check is made. APE contains about four point three times (if not more) state and error checks than most developers (including developers for embedded devices) would find necessary. With the result of every check being that APE stops doing what it is doing and disables itself if the check is not exactly what we expect it to be or if APE suspects the state of anything has changed. There is absolutely no room for "kind of" in APE.

As an extremely abbreviated example, "this is a green tree". APE would first check to make sure the state is correct. The state being that APE is currently in an environment that can support something that lives, then something that grows (most developers would just assume their application is running above ground on the planet Sol 3, APE makes no such assumptions). APE would then error check to make sure green is a color and that a tree is organic. It would then check the state and make sure the environment has the nutrients to support organic life, then to make sure it supports the combined object "green tree" (that the wavelength of incoming light supports the chloroplasts for a tree and that the wavelength reflected is perceived as green). It would then do a bunch of other error and state checks. Of course, "this" could be a purple tree but APE has never seen a purple tree before. Therefore, APE will disable itself if it sees a purple tree. APE actually does a lot more checks and changes the order of the checks a bit, but this was just an abbreviated example.

That may have been a somewhat tortured example, but it correctly describes the nature and amount of paranoia gone into the state and error checks in APE in a manner that may be understandable to most people. It's also all of I could think of at the time. Sadly, I will continue using this analogy.

The Issue
The higher the level an API is (contrasted with "low-level"), the more leeway Apple has in changing the innards of the API in a system update without breaking documentation. A real-world example of this is the very high-level Cocoa class NSFont. The innards of NSFont on Mac OS X 10.2 and Mac OS X 10.5 have virtually nothing in common. Their implementations might not even share a single line of code, even though all the documented methods for NSFont on Mac OS X 10.2 still work on Mac OS X 10.5.

The problem in Mac OS X 10.5 with APE 2.0.1 is that one of the state checks APE used is rather high-level. In Mac OS X 10.5, Apple made a change so that this particular state check initializes a lot of unrelated subsystems and caches the states of those subsystems. To use the above analogy, it'd be similar to APE querying Mac OS X to determine if the tree was on Sol 3. However, instead of just loading the state of the current planet like Mac OS X 10.4 and earlier did, Mac OS X 10.5 also asks the USGS for the count of the items on the list of named lineae on Europa and then asks the IAU for the list of named minor planets around Ceres.

This became an issue in that the component of APE 2.0.1 that asks for this state check happens to also be a client of one of the unrelated subsystems (configd in this case, used for synchronous notifications of specific state changes). Since configd cannot respond to a query indirectly made to itself at very specific times, this created a race condition that could result in the login process deadlocking. This problem was not caused by a failure or bug in APE's code. (configd accidently and indirectly asked a question of itself and refused to answer until the question was answered by itself.) Due to it being a deadlock, the login process would never continue on Mac OS X 10.5 with APE 2.0.1 installed, no matter how long the user waited. Note: This particular state check is explicitly documented by Apple as being thread-safe, but we do not call it from multiple threads anywho.

I wish to remind everyone at this point that APE 2.0.2 was released on 2006-11-01 and that APE 2.0.3 is the current non-beta version.

This problem should be reproducible in a stand alone application. I've spent a few hours on it here an there, but could never get the threads to align with the moon in just the right way to reproduce the race condition. After a few hours with no results, I stopped trying to reproduce it as I realized I had better things to do than try to make a new project, reproduce the deadlock, and send a bug to Apple. Especially since I knew Apple wouldn't be able to reproduce it due to the nature of race conditions and immediately close the bug as "cannot reproduce".

Sadly, no amount of error checking or state validation on our part could have prevented this issue. It was not a situation we could have tested for as the fact it occurred at all was happenstance.

So you found this problem and fixed it for APE 2.0.2, right?

Yes and no. No and yes. Since the problem only occurred on Mac OS X 10.5 with APE 2.0.1 and not later versions, we looked at what changed in APE 2.0.2 and later that prevented ("fixed") the problem. Turns out that while we were trying to find a workaround to include in APE 2.0.2 for the horrible Rosetta bug, we had realized that if this particular state check (the one in the above section) was ever false, many of the other state checks before it and after it would also be false. Therefore, we could move this state check to a much, much, much earlier place in the code as it was a type of "master control" for other state/error checks. Moving the state check to such a location made the initialization of the completely unrelated subsystems that happens on Mac OS X 10.5 occur at a time at which no race condition could occur.

Furthermore, by the time we moved the state check for APE 2.0.2 (which was around September or early October 2006), the Mac OS X 10.5 seed that developers had was virtually unusable. It would either kernel panic often or couldn't be installed on our development machines due to bugs in the seed. And if we happened to find a machine that it could run on for a while, applications crashed often. And this is all on a completely clean install, with no third-party software installed on it. So we never got chance to find out about this problem before APE 2.0.2 was released. Then again, I'm not sure the problem would have occurred on that seed of Mac OS X even if APE 2.0.1 would have gotten that far. The changes to all the various subsystems in Mac OS X 10.5 between October 2006 and October 2007 (when Mac OS X 10.5 was finally released) were very significant. Some components were completely removed from Mac OS X 10.5 in that time and some brand new components were added.

Basically, we were not aware of the problem when we implemented the workaround. So it was a coincidence that the problem is addressed with APE 2.0.2. It is important to mention this now before I discuss some other things.

Important Note: If, for whatever reason, you want to stick with APE 2.0.1 (and don't want to install APE 2.0.3 or APE 2.5b1) and you are running Mac OS X 10.5.0, then install the Mac OS X 10.5.1 update or the Mac OS X 10.5.2 update to address this issue. After installing Mac OS X 10.5.1, you will no longer have this issue if you have APE 2.0.1 installed.

Despite the fact that the issue was completely addressed by APE 2.0.2 (released on 2006-11-01), for APE 2.5, we decided to look for an alternative API to get the same state information; one that was not as high-level as the one we used previously (read above for low-level vs high-level discussion). Luckily, such an alternative API exists in Mac OS X 10.4 and Mac OS X 10.5. (You may notice that APE 2.5b1 and all the betas listed in this post now require Mac OS X 10.4 or later). This alternative API fits within all the requirements and restrictions I mentioned APE has above, especially the catastrophic requirement. This new API is also what the higher-level state check we used to use eventually calls to actually get the information we requested. This new API also has a super bonus failure check built directly into it, automatically adding more error and state checking. So it matches our design philosophy quite well. Yay!

Why didn't you test APE 2.0.1 with Mac OS X 10.5 before Leopard was released?

This is a question we've gotten from a few people, but I've never understood why it would be asked since APE 2.0.2 was released on 2006-11-01 and APE 2.0.3 is the current version. Note that the question is phrased here exactly as it was asked by these people. The question was not edited to be more APE friendly.

First, assuming we could have tested it, why would we? APE 2.0.1 was replaced a year before Mac OS X 10.5 was released. If we would have tested it and found a problem, what would our recourse have been? To release an update to APE 2.0.1...? We already did that a year beforehand. All of our haxies have built in software updaters. If the user didn't choose to install any updates that include APE 2.0.2 or later in that year, they wouldn't have installed an update that was released with nothing but a bumped version number (as a form of lip-service). Well, they wouldn't have seen it since our software update has no method of ignoring updates and they would have had to have turned off the updater.

And there are, of course, third party APE Modules and third party utilities that install APE. If these products were updated since APE 2.0.2 was released (since 2006-11-01), they should have made sure their products included the latest version of APE available at the time. Actually most, if not all, of these third party softwares do make sure to include the latest version of APE with their new releases. It's the primary reason why the APE installer is packaged into such an easy to use and easy to distribute file. This single file has all the logic to install, remove, validate, repair, and update APE built right into it. It also allows us to work around bizarre bugs in the system that are necessary to workaround for APE's sake. This is also why we do not permit third parties to modify the single file APE installer itself.

If a third party wishes to make sure they have the latest APE installer in their product, they just install the latest APE SDK. Then they drag and drop the single file installer into their project/installer. The APE SDK also installs the latest version of the non-SDK APE installer to /Library/Frameworks/ApplicationEnhancer.framework/Tools/, so a lot of developers just make copying that file into their installer part of the build process (via Xcode's run script build phase). Doing this means they always make sure they have the latest installer included with their products.

Secondly, even if we wanted to test APE 2.0.1 (as opposed to APE 2.0.3) on Mac OS X 10.5 before it was released to users, we couldn't have. Developers got the ability to download the final build (~6 gigs) of Mac OS X 10.5 at around 3pm on 2007-10-26 and the final developer documentation was not available until around 2007-10-31. Before that, developers weren't allowed to discuss Leopard, even if they had a purchased copy of Mac OS X 10.5 from a store (read that thread, if you have the time or the interest). And the two seeds released to developers before the final (9A559 on 2007-09-21 and 9A527 on 2007-08-24) had a very significant bug that prevented APE (any version) from working. Those versions of Mac OS X 10.5 refused to respect the security restrictions APE was asking for. Because this was a very significant bug, and involved security, we had no reason to believe it wouldn't be fixed in the final Mac OS X 10.5 release. (Yes, it was fixed by the final 9A581 build of Mac OS X).

Due to the nature of this bug, APE versions earlier than the custom build for Mac OS X 10.5 we were using wouldn't have been able to get anywhere. Thus, there was no way to test APE 2.0.1 (or 2.0.2, for that matter) as the bug guaranteed they would not load. If, for some bizarre reason, this bug was not fixed in the final build of Mac OS X 10.5, then at that time we would have figured out a way to work around it and make Mac OS X respect the security restrictions we wanted. We would have done it then, and only then, because when Apple ships a bug in a major version of Mac OS X 10.y.0, it usually stays there until NMOS or NMOS+1 for backwards compatibility reasons. (Also, because it can be hard to convince the manager at Apple in charge of the component with the bug to let an Apple engineer work on fixing the bug and then ship the updated component in a Mac OS X 10.y.x>0 update).

Luckily, because this bug (the one in 9A559 and 9A527, possibly earlier seeds) created an impossible state in Mac OS X (one that violated documentation, common sense, and a few standards), we were able to add even more error checking to APE. As discussed above, we like to add error checking code. There's no reason for us not to test for theoretical cases of failure; you should never test for theoretical success, only success you can verify in practice.

Finally, who's to say we didn't test APE 2.0.1 (as opposed to just APE 2.0.3 or just APE 2.0.3 and APE 2.0.2) on every seed of Mac OS X 10.5.0 that we were capable of testing against? This state check subsystem initialization behaviour may have only been introduced in the later seeds of Mac OS X 10.5.0, preventing any kind of testing by us from finding it. Please do not assume we did not do as much as possible.

I'm sorry if this section sounded overly harsh, but the question is it attempting to answer is a great example of a loaded question. The person asking the question is generally asking it in a rhetorical manner and does often not actually want or care for an answer. Alternatively, they ask it as fully knowing there's no way we can answer it without looking bad or as if we did something wrong, they've already decided what the conclusion is. Thus, it is a loaded question. If the situation was reversed and we asked the questioner a similar question, but one that fits their situation, they would also be at a loss to answer it as we are.

The saddest thing about all of this is that we didn't even know there was an issue until consumers started getting Mac OS X 10.5 in their hands. By that time, it was all over the internets. And there was so much conflicting information that we were unable to understand the situation for a very long time, let alone reproduce it. However, we did update our website to show that APE 2.0.3 did not have the issue as soon as we were told about it (before we could confirm the issue in older versions) and we sent out a notice to everyone subscribed to our mailing list as soon as we could (which was again, before we could reproduce the issue or fully understood it). Due to the huge number of people subscribed to our mailing list, it took two to five days for some people to get the email and by then the story had spread all over the place.

Why do y'all keep repeatedly saying APE 2.0.2 was released on 2006-11-01 (a year before Leopard was released) and that APE 2.0.3 is the current version?

We mostly keep repeatedly saying that APE 2.0.2 was released on 2006-11-01 (a year before Leopard was released) and that APE 2.0.3 is the current version to drive home the fact that APE versions released in the past 16 months do not have this issue. Furthermore, anyone that's updated APE in the past 16 months would not have this issue.

We also really want to convey to people that this issue was addressed long before we knew about it or could know about it (see above and below). A tangential reason for the repetition is that we really want to stress the importance of keeping software up to date. This applies to all software, not only APE. End users can use software tracking sites such as MacUpdate.com or VersionTracker.com. Developers should attempt to add software update checking into their own applications. They can either use a custom rolled solution (such as we do, since our requirements may be "unique") or use an extremely easy to integrate, open source updating framework, such as Sparkle. Yes, our custom updater does need a bit of work and polish, but that work will be done when we have more time to allocate to the task.

I upgraded to APE 2.0.3 and I'm still having this issue || I completely deleted all traces of APE from my computer, yet APE is still causing this issue

No, you aren't still having an issue related to APE 2.0.1. There are a few changes to Mac OS X 10.5 that make it seem like something is failing, a blue screen appears for too long, or that login time is taking excessively long.

I'll list some of the issues that could be confused with this one, but are unrelated to the problem APE 2.0.1 people experienced (note that APE 2.0.2 was released on 2006-11-01, a year before Leopard's release, and APE 2.0.3 is the current version).

Mac OS X 10.5.x no longer shows a progress bar when booting. I think this is the biggest thing people attribute to a problem with APE. When people booted their computer box and it was running Mac OS X 10.4, the user would see a progress bar after the gray screen with the Apple logo. After the progress bar window disappeared, it would show the login window after a very short time of sitting at a blue screen. This progress bar was fake. It had nothing to do with how long Mac OS X 10.4 would actually take to boot. It was simply a program, /usr/libexec/WaitingForLoginWindow, that appeared for the amount of time the previous boot took to complete (this time value was stored in /var/db/loginwindow.boottime). It was absolutely nothing but a placebo there to make the user think progress was occurring.

In Mac OS X 10.5, the boot process has changed a bit. WaitingForLoginWindow and /var/db/loginwindow.boottime are gone. Since launcd on Mac OS X 10.5 no longer supports explicitly listing dependencies and has no StartupItems, there is no reason for the fake progress bar during boot. All launch daemons are launched on demand and in an asynchronous manner. If a launch daemon has an implicit dependency (say it requires a service that another daemon provides) then the launch daemon will block ("pause") until that service is available. As soon as the service is available, the daemon will continue. This allows for multiple daemons to be launched simultaneously and to do as much work as they can before they need another service to be available. All of this leads to a significantly decreased boot time, further obliterating the need for a fake progress bar.

The BootCache. Because loading multiple simultaneous daemons for startup can be slow, Mac OS X has an extensive boot caching mechanism. This caching mechanism is stored in a file, /var/db/BootCache.playlist. This cache significantly decreases the boot time of Mac OS X. This caching mechanism is surprisingly well documented in the BootCache.kext source code. If the BootCache.playlist file is outdated, old, or unavailable, the time a user sees the blue screen on Mac OS X can more than double.

You can actually reproduce this yourself, if you so desire. At least, you can reproduce the longer blue screens display to prove to yourself that it's one reason you may see a longer blue screen irregardless of whether APE is installed. Simply reboot twice and measure the time the blue screen appears for. Then, open the terminal (/Applications/Utilities/Terminal) and run the following command:

sudo rm /var/db/BootCache.playlist

and reboot a final, third time. Time how long the blue screen appears for. It should appear for about 170% to 200% longer than it used to. The /var/db/BootCache.playlist is automatically regenerated on boot. If Mac OS X ever determines the BootCache.playlist is being a lying liar or isn't decreasing the boot time at all, it will ignore it and regenerate a new one. This is also why you see longer blue screens after installing an update to Mac OS X 10.5.x.

If you wanted to reproduce a no progress bar, extremely long blue screen on Mac OS X 10.4, you can open the terminal (/Applications/Utilities/Terminal) and run the following commands (they are on two lines, they are two commands):

sudo rm /var/db/BootCache.playlist
cd /usr/libexec/; sudo mv WaitingForLoginWindow WaitingForLoginWindow.ignore

Then reboot. When you are done playing around and want to restore the original behaviour, type:

cd /usr/libexec/; sudo mv WaitingForLoginWindow.ignore WaitingForLoginWindow

DiskArbitration. As I mentioned above, Mac OS X 10.5 has a lot of implicit service dependencies. Before the loginwindow can appear, and the blue screen can disappear, anything the loginwindow depends on must be up and providing its service.

The loginwindow depends on DiskArbitration (diskarb) to be working before the blue screen will disappear. The problem is, diskarb freezes a lot. Especially if you have external FireWire or USB hard drives connected and their bridge boards are particularly shoddy. Diskarb will completely deadlock the machine until those disks are disconnected from the computer or the disk requests time out (whichever is shorter). This may explain why some people will reboot Mac OS X 10.5 once, see a blue screen forever, reboot, then no longer have a blue screen. Disks usually start responded when they are disconnected or the system has to requery them (which happens on a reboot).

In fact, I have a SATA to USB bridgeboard that thrusts Mac OS X 10.5 into a blue screen 90% of the time, regardless of which computer I test it on. Perhaps I should send this bridgeboard to Apple so they can make diskarb handle this situation better.

Bad Network Devices. One or more of the loginwindow dependencies also query the network to see if it is up. If DHCP is on, it may also query DNS in order to see if your computer has a hostname (to display in the loginwindow, syslogd, in terminal prompts, and some other places. However, the default connection establishment timeout on Mac OS X is somewhere between 10 and 15 minutes. This means that, on shoddy networks, borked routers, or in otherwise weird networking situations, Mac OS X 10.5 may show a blue screen for up to 15 minutes if the network cannot be traversed. After the timeout is hit, an error is returned to the API and the Mac OS X 10.5 booting resumes normally. This would explain some of the reports of Mac OS X 10.5 taking 10 to 15 minutes to boot.

I've personally seen this in a lot of hotels and conferences when the network was down or overwhelmed with requests. This is especially annoying when trying to compile code using xcodebuild as it uses NSHost to try to resolve the current domain name of your computer box even if distcc is disabled (which is considered a bug). It's extremely annoying when you want to compile something but have to wait for the 10-15 minute timeout to expire before anything will start compiling.

Application Enhancer 2.5b1 and APE SDK 2.5b1

As I was trying to explain in my previous post, APE 2.5 will not load any APE module that has not been explicitly marked as compatible with Mac OS X 10.5. See my previous post for reasons on why. We discussed the issue with some other APE Module developers and they agreed that old modules should be disabled. Especially since it's been over 2 and a half years since Mac OS X 10.4 was released and some of these APE Modules haven't been updated since then.

If an APE module cannot be loaded, for whatever reason, the APE Preference Pane will now show the listing why it cannot be loaded. The APE Prefpane now uses the same logic to determine why something won't load as APE itself. Previously, APE itself would have a bunch of undocumented checks and there would be no way for a user to determine why their APE Module wasn't working.

The SDK documentation has also been clarified to mention the APEBundleMessage callback is not called on the main thread. If you need to call functions that are not thread-safe, call them on the main thread using something like MPRemoteCall. Not doing so can lead to unexpected behaviours. It's been an issue in the past, which is why it is now explicitly documented.

Also, the SDK documentation now has a listing of all the Info.plist keys available to APE Module developers as they were never documented before and some are required for an APE Module to be loaded.

  • Added compatibility for Mac OS X 10.5.
  • APE now requires Mac OS X 10.4 or later and will not install on older versions of Mac OS X.
  • Application Enhancer will now refuse to load any APE module that is not marked as compatible with 10.5 on Mac OS X 10.5.
  • Addressed some problems with some unpatchables due to the wonkiness of the x86 ABI (Includes APELite).
  • The APE prefpane now shows why some APE modules cannot be loaded.
  • Removed all references to the Rosetta workaround as Apple fixed that bug in Mac OS X 10.4.9 and the workaround no longer has any beneficial results.
  • Worked around a prebinding bug in Mac OS X 10.4.10 and earlier that made APE treat some applications as if they were on the exclude list.

So here are the download URLs for the betas, finally.

Download APE 2.5b1
Download APE SDK 2.5b1

Smart Crash Reports 1.5b2
The biggest change with this SCR 1.5b2 beta is that it now supports SCR entries in the Info.plist of bundles/frameworks (just like applications always could). This was designed specifically for things like Perian, Growl, third party QuickTime plugins, and various SIMBL plugins so they could get crash reports without having to include more code into their products. Such developers should read the Read me in the SCR SDK (installed on the desktop).

I am repeating this as I find it to be very important. Important Note: On Mac OS X 10.5.x, InputManagers must not be installed in the user's home folder (~/Library/InputManagers/) as it will prevent the InputManager from loading even if the InputManager is installed globally in /Library/InputManagers/ and meets all the requirements to load. If you are a developer installing an InputManager, make sure your InputManager is not in the user's home folder on Mac OS X 10.5.x and move it to the trash (FSMoveObjectToTrashSync()) if possible.

  • Updated to support Mac OS X 10.5
  • Now supports registering for SCR in Info.plist entries of bundles (Frameworks, QuickTime plugins, Photoshop plugins, Safari plugins, et cetera). Developers no longer need to call UnsanitySCR_RegisterMatchSpecifier() bundles (in most cases).
  • SDK: UnsanitySCR_Install now installs Smart Crash Reports with the correct permissions required to work on Mac OS X 10.5.
  • SDK: UnsanitySCR_Install now pretends as if SCR is not installed if it is installed inside the user's home folder on Mac OS X 10.5.x as Mac OS X 10.5 will not load SCR from the user's home folder. Behaves as before on Mac OS X 10.4.x.
  • SDK: Worked around a problem on Mac OS X that led to repeated calls UnsanitySCR_RegisterMatchSpecifier creating new entries in SCR's preferences when Mac OS X thought that two equal CFTypeRefs were not equal.
  • SDK: On Mac OS X 10.5.x, UnsanitySCR_Install no longer allows you to install in a non-global manner due to the new restrictions in Mac OS X 10.5.x. Behaviour on Mac OS X 10.4.x is unchanged.
  • Important Note: On Mac OS X 10.5.x, Smart Crash Reports must not be installed in the user's home folder (~/) as it will prevent SCR from loading even if SCR is installed globally. If you are a developer installing SCR, make sure SCR is not in the user's home folder on Mac OS X 10.5.x and move it to the trash (FSMoveObjectToTrashSync()) if possible.

Download Smart Crash Reports 1.5b2


FontCard 1.5.1b1

As I alluded to in my previous post. There wasn't much to do for compatibility with FontCard for 10.5, except the font panel. On Mac OS X 10.5, it's like they gutted the internals of the font panel without increasing (or decreasing) its functionality, which is normally quite a feat.

Please Note: FontCard 1.5.1b1 has not been "certified" for use with Adobe CS3 products (it should work, the worst that will happen is that it won't work). Furthermore, it does not work with Microsoft Office 2008 (the worst that could happen is explosive projectile vomiting). We have not yet acquired these products, therefore we have not tested them with FontCard. FontCard 1.5.x currently has a lot of code for Word v.X and Word 2004 to work around various "quirks" in Microsoft Office. I would not expect FontCard 1.5.1b1 to work with Microsoft Office 2008.

  • Added support for Mac OS X 10.5 Leopard v10.5 and later.
  • No longer loads Objective-C dynamically.
  • Updated to SQLite 3.5.4.
  • Now attempts to open third party font sets in read-only mode (possible thanks to SQLite 3.5.0). FontCard never intended to write to third party font sets, only read them.
  • Now sorts third party font sets in the font panel (10.5 only).
  • FontExplorer stores its database in a different location if your user home folder path does not begin with "/Users/". FontCard now loads FEX sets in these situations.
  • Installs a busy handler for FontExplorer sets. This should fix a race condition leading to an error if the FontExplorer application is in the user's login items.

Download FontCard 1.5.1b1

Menu Master 1.4.3b1
Getting Menu Master to work was slightly interesting. Mostly because cocoa's menu manager wrappers now insert a menu item with a NULL title. They then set some attributes on it and finally set the correct title. This was causing Menu Master to misidentify a lot of menus in Mac OS X 10.5. This has been fixed.

Also, Menu Master had to work around a lot of bugs in Mac OS X 10.4 with certain types of windows. Either the bugs were fixed for those certain types, or the bugs remain. Either way, Menu Master still does what is correct for all types of windows.

  • Added support for Mac OS X 10.5 Leopard v10.5 and later.
  • Dropped support for Mac OS X 10.3 Panther. Menu Master now requires Mac OS X 10.4 Tiger v10.4.11 or later.
  • No longer loads Objective-C dynamically.
  • Removed calls to many deprecated APIs.
  • No longer scans menu items if their titles are NULL or zero length due to an issue cause by the inefficiency of Cocoa menus.
  • Potentially addressed an issue with Adobe applications losing custom menu shortcuts when switching documents or not listing all their menu items in the Menu Accelerator window. This required a lot more work than it should have.

Download Menu Master 1.4.3b1

Silk 2.1.4b1
Really nothing special about this Silk other than the pointless new feature to re-enable the Sub-Pixel antialiasing on the translucent menu bar in Mac OS X 10.5 without being required to modify system files.
  • Silk now runs on Mac OS X 10.5.
  • Dropped Mac OS X 10.3 support. Silk now requires Mac OS X 10.4.11 or later.
  • No longer dynamically loads Objective-C.
  • Moved a lot of code to the awesomely awesome CoreText APIs (10.5 only).
  • Adjusted some code so it can be moved to CoreText in the future.
  • Attempted to make Cocoa applications respect the baseline of a font when a custom theme font is used.
  • Note: Classic is not supported in Mac OS X 10.5 and the fonts in the Classic fonts folder will not be loaded by Mac OS X. You may have to adjust your Silk settings to address any missing fonts.

Download Silk 2.1.4b1


FruitMenu 3.7b1

  • Added support for Mac OS X 10.5 Leopard v10.5 and later.
  • Dropped support for Mac OS X 10.3 Panther. FruitMenu now requires Mac OS X 10.4 Tiger v10.4.11 or later.

Download FruitMenu 3.7b1

WindowShade X 4.2b1
  • Added support for Mac OS X 10.5 Leopard v10.5 and later.
  • Dropped support for Mac OS X 10.3 Panther. Windowshade X now requires Mac OS X 10.4 Tiger v10.4.11 or later.

Download WindowShade X 4.2b1


Final Thoughts

Remember, these are beta. All of these betas include SCR 1.5b2 and APE 2.5b1, so they do not have to be downloaded separately. APE 2.5b1 may also have some fixes for APE not enhancing some applications on Mac OS X 10.4.x in some cases.

Note: We are currently evaluating raising the prices to some of our products. A number of factors contribute to this, including the weakness of the US dollar (I mean, seriously, funny money from Canadia is worth more than the USD). But if this happens, it'll only start to apply when these things go out of beta. The prices for these betas are the same as they have always been. The only change would occur when these things come out of beta and are at a final release. But seriously, Canadian funny money worth more?

Sorry it took so dang long to post these, I've just been various amounts of "not well" for the last few weeks. Sigh, I wish I could ask various doctors on the internets for samples of the sweet blue pill known as Lunesta.

Alternative title to this post was, "Dear APE, I want you inside me. Love, Leopard"

 Posted by rosyna at 10:24 PM | Comments (143) | TrackBack (4)