Saturday, December 31, 2011
Retro Review: Mass Effect 2. Why Can't I Play Like Captain Kirk?
Friday, December 23, 2011
How I Came to Loathe the Nintendo Wii, and it's Microsoft's Fault!
I loved the Nintendo Wii when I got it back in 2007. When I looked up my review, I couldn't believe it had been over 4 years already. LIke pretty much everyone, I played Super Mario Galaxy & thought that was great too. My family had a lot of fun with Wii Sports and Wii Sports Resort over the years. Slowly but surely, my initial love for Nintendo's console grew to dislike, then outright loathing. There wasn't a moment of clarity when I realized I never wanted to use the Wii again. It was a gradual process and it was Microsoft's fault!
After a few years with thr Wii, I was completely over the four part Wii controllers: remote, nun-chuck, rubber bumper, and motion plus. The batteries for the remotes were never charged. The nun-chuck wire always got tangled. The rubber bumpers to make sure you didn't kill someone flailing around we're never in the configuration you needed to play what you wanted to. Worse, no one but me, not the kids and not the wife, could untangle the whole mess. The fact that Nintendo didn't ship the controllers as rechargeable became a deal breaker, even though I was using rechargeable batteries.
I couldn't pin down what i didnt like about thr Wii until I first heard about the Kinect. A bit flipped in my head right then that I was done with the Wii if Microsoft didn't mess it up. I didnt want to use a controller for motion controls ever again. Amazingly, Microsoft got it right, not perfect, but good enough from all the stuff I read. I didn't rush out to buy Kinect. I waited for a while to get some more life out of the replacement Xbox 360 I got from the Red Ring of Death fiasco. That I even considered giving Microsoft more money was amazing, they were all but dead to me before Kinect was announced. Going back to Microsoft was also given a boost by Sony announcing their Wii competitor, Move, packing its own fleet or wand/remote controllers.
The announcement of the Nintendo Wii U and Sony's PlayStation Network security breach happened within a few weeks of each other in May/June 2011. Those events were the tipping point to Kinect for me. Wii U looks ridiculous. I normally hold out on judging a product until release, but I couldn't suppress an immediate reaction of disappointment. Wii U looks like an iPad and Apple TV using AirPlay, but without a good digital download store. Sony's ridiculous lack of network penetration testing and basic security controls were inexcusable.
By August I had sold my Wii and replacement Xbox 360 at a yard sale to finance the purchase of a new Xbox with Kinect. I was going to sell the PlayStation 3 as well, but Uncharted 3 and a few unripped Blu-rays have caused a delay.
As for the Kinect itself, pretty awesome. Demonstrably better than the Wii for exercise games, which I've used but my wife really enjoys. And in extended Kinect Adventures sessions, no Wii remote like cramping or fatigue, just normal exercise pains. Having the ability to video chat is nice too, though it is odd that it isn't in HD. With Christmas days away, a bunch more Kinect titles are coming home, I'm sure the whole family is going to be having a lot of fun.
Wednesday, November 09, 2011
There Must Be A Glitch In The Matrix Because I Just Perfectly Experienced Programming Serendipity
Sunk a lot of time researching and then trying to implement Mac OS X application sandboxing today, only to strike out. While watching one of the WWDC 2011 sandboxing videos for the third time, I saw Apple Events mentioned in the presentation. Slowly realized I was looking at the clue I needed to unravel a feature for SleepMute that I've poured many man-days of research into. With that clue, the rough version of this new feature was done in 40 minutes!
If that's not programming serendipity, I don't know what it is.
Tuesday, October 18, 2011
Implementing Objective-C Protocol Inheritance, Usually For Delegates
In a previous post, I explained why an Objective-C protocol might not implement respondToSelector:. Prior to Xcode 4.x, Apple's protocol template code didn't include the <NSObject> protocol in custom protocol definitions. This let to believe that you couldn't setup inheritance chains for protocols, but but you can!
This is usually important where you have a UIView subclass that's the base class for a bunch of subclasses. All instances must support the same message back to a delegate pattern, but subclasses might need to add more delegate callbacks than the base class should define.
Consider this class & protocol definition & class implementation:
@class VehicleView; @protocol VehicleViewDelegate <NSObject> - (void)vehicleView:(VehicleView *)vehicleView didTapToStartEngine:(Engine *)engine; @optional - (void)vehicleView:(VehicleView *)vehicleView didTapToOpenWindow:(VehicleWindow *)vehicleWindow; @end @interface VehicleView : NSObject { id<VehicleViewDelegate> _delegate; NSArray *_engines; NSArray *_vehicleWindows; } @property (non atomic, assign) id<VehicleViewDelegate> delegate; @property (nonatomic, retain) NSArray *engines; @property (nonatomic, retain) NSArray *vehiclesWindows; @end
Now the implementation
@implementation VehicleView @synthesize delegate = _delegate, engines = _engines, vehicleWindows = _vehicleWindows; //Lots of other stuff to implement! @end
What you can see there is a pretty typical class implementing a protocol then declaring a delegate instance variable and property pattern. But what does this look like when we want to subclass?
@class TruckView; @protocol TruckViewDelegate <VehicleViewDelegate> @optional - (void)trunkView:(TruckView *)truckView didTapUseFourByFourMode; @end @interface TruckView: VehicleVIew { } //Subclass specific implementation @end
Notice there's no delegate definition, what gives? That's true, but we are going to reuse our base class' instance variable for this:
@implementation TruckView #pragma mark - Properties - (id<TruckViewDelegate>)delegate { return _delegate; } - (void)setDelegate:(id<TruckViewDelegate>)delegate { if(_delegate != delegate) { _delegate = delegate; } } @end
So what's going on? The TruckView subclass overrode VehicleView's syntactic sugar property method declarations for delegate with the protocol definition that it wanted, but reused the base class instance variable. This allows TruckView to verify it has a pointer which implements the protocol, eliminates any dual-protocol declarations and management in TruckView, and maximizes protocol definition reuse.
Next time, I'll show how to optimize detection of @optional protocol methods so setting up @protocol inheritance hierarchies don't slow down performance.
Monday, October 10, 2011
A Tale of Computing Misery: How To Fix Seagate GoFlex External Drives Randomly Ejecting in Mac OS X 10.7 Lion
I don't know if I'll ever buy another Seagate drive. This is a tale of 3 months of computing misery.
Rewind
When I saw the news back in early July that Mac OS X 10.7 Lion had hit Gold Master (GM), the expected release to paying customers, I immediately downloaded and installed on my main machine, an iMac.
A few days later, I filed Radar 9727925 (OpenRadar link). Lion was randomly automatically ejecting my external Seagate HD. This had never happened under any version of OS X 10.6 Snow Leopard. I had all my code on this drive, the iMac's internal drive was near full, as well as a ton of media files I keep the Apple TV feed with. Also, all my photos were on this drive. I figured it was an obvious bug, some bizarre oversight, and should definitely get fixed. I thought it was bad enough that 10.7.0 would get the dubious distinction of needing GM2.
That didn't happen. 10.7.0 shipped as expected, and my external disk keep ejecting with a scary modal error dialog like clockwork. I was frustrated. My excitement for Lion was high coming back from WWDC 2011, but I had staid my hand on the primary machine until the OS reached GM. Of course, I had installed to a different external drive to do testing, and it was great on my iMac, I thought I was home free.
But I couldn't have been more wrong about Lion, or at least I thought for three months…
The Long Wait
After filing my bug, Apple responded before 10.7.0 shipping asking me to run a disk-debug command and capture the trace of what happened during the random ejection. I collected the information and supplied it to Apple. I eagerly awaited a response, but none came.
I installed 10.7.1 as soon as it came out, hopeful my bug would be stealth resolved. It wasn't and I grew despondent. How could Apple leave this bug unfixed? I searched the Apple Support Communities. Clearly other people were affected by this. This was the worst Mac OS X bug I had experienced since I started using it with 10.3.x.
As soon as the first 10.7.2 builds started arriving in the Mac developer center, I deployed it. The iMac I am putting this on is the whole house iTunes media server, I was risking wife and kid wrath making this move. They do not tolerate beta. Early 10.7.2 betas didn't resolve the bug. I started to panic. Could 10.7.2 make it through development without this issue getting fixed?
Desperation
If you've ever been to an Apple developer event, you know they say if you have any questions just email them. I've always admired that, and wouldn't know if I would feel comfortable if I were in those shoes encouraging public emails for help.
On August 30, 2011, I emailed Michael Jurewitz out of desperation:
Hi Mike, Can you figure out what the real status is of Radar 9727925? In short, the external drive where I keep a huge chunk of my files, including my code, keeps randomly ejecting a dozen or more times a day. Never happened in Snow Leopard. I hated to even think to ask you, but I filed this bug close to 3 months ago and it's driving me crazy. If anything it's gotten worse in the latest 10.7.2 seed. Yes I am on the bleeding edge hoping this one bug gets fixed. Thanks so much, Dave
I couldn't stand sending that email. I just about cried when I got the automated Out of Office reply. What was I going to do now? I remembered that I could email Apple and ask for a status update on the bug. I did that and hoped for the best, but I couldn't take it anymore, time to start deep debugging to prove whether it was anything specific to my environment.
Taking Matters Into My Own Hands
Deep Debugging OS X is really not that complicated. Here's the rough outline:
- Verify your System disk for any corruption
- Repair Disk Permissions
- Create a new user account and see if you can reproduce the bug
- Install a new copy of the current OS on an internal disk partition and see if you can reproduce the bug
- Remove anything 3rd party that starts up with the OS one at a time until the bug stops such as:
- StartupItems
- LoginItems
- LaunchAgents
- LaunchDaemons
- Kernel Extensions (.kexts)
- File a Radar or GTFO
But I started going through the whole debugging sequence just to be extra double sure this wasn't specific to my environment. I executed steps 1-4 and reproduced the bug. I was even more certain this had to be a Lion bug. With a bare OS X install, the external disk was randomly ejecting. This is the smoking gun right? Wrong!
I went through all the 3rd party code in step 5 that was loading on my system. Something interesting caught my eye. Lion wasn't loading some Seagate kernel extensions since they didn't include 64-bit versions. I went out to Seagate's site, and found GoFlex for Mac 1.1.2, but I didn't install it. Normally when debugging something, you try and remove 3rd party stuff to fix a problem, you don't add it back in. Besides, when I skimmed the description of this software, the usefulness of the package seemed limited to Drive Settings and Diagnostics, the only capitalized words in the summary that weren't MacOS or GoFlex. I'm sure I was trying to figure this out one night bleary eyed well past midnight, so I was probably in a hurry due to exhaustion and didn't feel like reading the paragraph, my mistake! I put the problem on hold for a few more days.
The Workaround
A few days go by, I install the latest 10.7.2 beta without it resolving the bug, I brainstorm on what it could be. During one of these sessions, it dawned on me that it looks like the drive is getting ejected if it's not being used. There is some kind of sleep timer being fired! I check the Energy Saver System Preference, but Put the hard disk(s) to sleep when possible is unchecked. This must be where the bug is, Lion is always sleeping the drive when possible but there is some incompatibility, thus the modal error dialog I reasoned.
I hadn't really done much with Automator, but I figured this was the kind of thing it might be good at. I whipped up a quick workflow app that did a search for a string in file names on the external drive, and had it open as a LoginItem. Voila! The external drive stopped ejecting! It was a sleep timer. The relief was immediate, it was like I just scored a touchdown, or for the non-sports inclined, like I had just solved an incredibly difficult puzzle. I could wait as long as it took for Apple to fix this Lion bug now, I wasn't really impacted anymore and I stopped thinking about it. Only it wasn't a Lion bug at all, not really.
Finally, The Solution
On October 3, 2011, Apple responds to my request for more information on the bug. I don't know if Michael Jurewitz was the invisible hand that got this moving, or it was just my place in the request for info queue, but I was excited when I received the mail. I paraphrase because of NDA restrictions. The message thanks me for my patience and told me that to fix the issue I must install GoFlex for Mac 1.1.2! How is it possible that to use a USB or FireWire (the GoFlex does both, reason I bought it) in OS X Lion you need 3rd party software? I then went back to the Seagate site and read the description of this software again, and it hit me like a shot of vodka:
drivers to disable the built-in sleep timer on the drive
Friday, September 30, 2011
SPOILER ALERT: Astoundingly, I got a bit choked up by Gears of War 3
I haven't finished what a lot of people are calling a big & dumb shooter, the Transformers movie franchise of video game series, but I just got past a moment I think Gears of War 3 deserves some recognition as…artistic. Sure the games' loaded with ridiculous one liners among other sins, but the following single moment means this game and the whole series has more emotional depth and artistic merit than the Shia Labeouf Running and Shouting Optimus series.
Spoiler Alert
At the end of Act III, lead character Dom sacrifices himself to save lead character, his brother to the end, Marcus Fenix. This follows soon after Dom has said his peace to his dead wife and kids, so you think Dom's OK, he's going to be there to the end. But when you see what's going to happen, when it's clear Dom is going to sacrifice himself, the sequence really catches your attention because it's atypical for this kind of thing, and it's all because of the music. The game pulls the usual cacophony to barely audible levels and plays this:
You might remember that (with lyrics) from this Gears of War 2 ad which was mighty attention getting for being atypical for video game ads
Maybe I'm just a sucker for anyone willingly giving up their life to save their buddies, but I couldn't help but get a bit choked up playing to and then watched the cutscene where Dom sacrifices himself.
Thursday, September 29, 2011
A Personal Note About Why I'm Excited To Teach At CodeLesson.com
My younger brother used to call me Doctor Murdock or "Doc" Murdock. Seems like another life know, but I was a baseball pitcher until the end of high school. I always had a pretty mean fastball and wicked curve ball. I struck out a lot of batters. Dwight "Doc" Gooden was the NY Mets ace when I was in little league and he struck a lot of people out. Since I was a huge fan, my brother liked using Gooden's nickname for me and it stuck. That wasn't the only reason he coined that nickname for me. Since I was always trying to teach people around me the stuff I was learning, the name fit both ways. To be fair, my brother also in his best Han Solo impersonation yelling at C-3PO called me "The Professor" too. I loved both nick names.
I liked the sound of "Doc" Murdock so much in and out of baseball that I seriously considered becoming a medical doctor. I enrolled in AP Biology in high school but couldn't make it past frog dissection!
I still thought about becoming Doctor Murdock for real. Since I was heavily into computers through high school, I started thinking about becoming an actual professor. When I got to college for my bachelor's degree in computer science, I enrolled in the Honors program to try and position myself for moving on to higher education. I graduated with honors in comp sci, but I never went back to school for a masters degree. Building apps and life were just to much fun to go back into the ivory tower! I thought the door to becoming Doctor Murdock was closed forever.
When CodeLesson founder Jeffrey McManus asked me who would be good to teach iOS development, I really wanted to do it, but didn't have time in my schedule. Once my schedule freed up, I consider myself lucky that Jeff hadn't found an instructor yet. Sorry Jeff! He graciously accepted my offer to teach Introduction to iOS Programming.
The door to becoming "Doc" Murdock feels like it just cracked open, and it feels great to finally pursue this dream, even a little bit.
I'm Teaching Introduction to iOS Programming at CodeLesson.com Starting Monday October 3rd
If you or someone you know is interested in learning iOS programming, then head on over to Introduction to iOS Programming at CodeLesson.com to sign up. I'll be teaching this course starting Monday October 3rd, 2011. What's CodeLesson?
CodeLesson provides hands-on, practical, online instruction. Our instructors are real people with real-world experience. Because our courses are given online, you have flexibility. You can access your course 24 hours a day while your course is in session. This means that you can participate fully even if you've got a busy daytime schedule or if you're located in another time zone.
You can read the course description, prerequisites, and outline at CodeLesson to see if the course is for. I'm using iOS Programming: The Big Nerd Ranch Guide as the textbook for the course. The week to week work goes like this:
- I assign unit(s)s to complete for each week. Units contain reading chapters or articles on the web, typing code into Xcode, or environment setup
- Students complete each unit and turn in their work for grading
- There are occasionally quizzes
- Repeat!
I've always enjoyed teaching, and now I get to do it in a structured format using my favorite development tool stack ever! I'm really looking forward to it
Friday, September 16, 2011
5 Reasons Why Windows 8 Tablets Are Going To Have a Tough Time Competing Against iPad
- Users have to choose between two completely incompatible CPU architectures to buy a Windows 8 tablet.
I can think of no examples where a consumer facing device had two incompatible CPU formats for normal people to choose from that did well. Even when Windows NT was shipping for Intel, DEC Alpha, and a few others for enterprise customers, getting supported apps was a challenge. I remember because I was trying to run an Exchange Server on Windows NT for Alpha, it was always like punching yourself in the face.
Consumers will have to understand that "Metro style apps" (is that final marketing?) will work across CPU architectures, but all existing Windows apps do not. That's a terrible choice for regular people to have to make. By contrast, you get an iPad and you can run iPhone and iPad apps. - If Windows is in the final tablet product name, then where have the fraking Windows gone?
Windows tablets have been around for close to 10 years and never sold well. I had one of the early Compaq tablets, it ran hot with poor battery life using an Intel CPU. The name of the OS used to be Windows XP Tablet PC Edition. Since Windows 8 is going to run on notebooks, desktops, servers, and tablets just like Windows XP and its various editions, how are Windows 8 tablets going to be easily distinguished from other Windows 8 based computers? Dell Tablet 2012 with Microsoft Windows 8 for ARM Tablets? HP QZY12 with Windows 8 Intel? Compare again to iPad, iPad 2 with iOS 5, and the sure to come iPad 3 with iOS 5.2 (numbers just a guess, but a pretty good one). Obviously Metro on Windows 8 looks nothing like previous versions of Windows, except when it inevitably will, but when it doesn't it won't have any Windows on something named Windows.
You can just imagine the commercials where Apple or even Google if their still shipping tablets shows a Dell Streak 2012 with Windows 8 for ARM CPUs and the Desktop environment.
Hindsight is as they say 20/20, but I'd take your bet that Windows Phones would have sold better without Windows in the name. For a lot of people, when people sit down daily to work and see Windows XP, that's what they think of as Windows. They don't want that on their tablet!
Even Apple has had this problem to a small degree with a simple two word name! How many times have you heard the iPod touch called iTouch? If Microsoft can't simplify the naming, they're going to lose sales because complexity is not a winning formula.
- There will be very few "Metro style apps" for Windows 8 for a long time.
There are 0 Metro apps in existence. Windows 8 won't ship for a year. Make no mistake though, WinRT, the Metro app runtime is Microsoft once again trying to build an entirely new platform. The closest developers are right now to shipping Metro style apps, not even using WinRT, just the Metro visual design, are on Windows Phone 7.x, and the phones aren't selling well. Where's the evidence that consumers will actually buy Metro style apps?
Developers have 1 year to build Metro apps for Windows 8. There will certainly be Metro apps when Windows 8 ships because hundreds of millions of copies will be sold. How many copies are going to be on tablet devices instead of Microsoft's traditional PCs? No one knows. The only data currently available on consumers preference for the Metro UI are Zune and Windows Phone sales, both doing poorly. There isn't going to be a halo effect for Metro apps for a long time if ever. There are going to be a lot of developers on the sidelines until Microsoft can actually sell, not ship, sell tablets in volume.
Microsoft has previewed Windows features early for years from a position of strength because they were the only game in town. But the game has changed. They have zero tablet apps and must get as many developers on board now or the Windows 8 launch or the game is over.
- Windows 8 and PC tablets aren't competing against iPad 2 and iOS 5, there competing against iPad 3 and iOS 6
iOS 5 ships in weeks for all existing iPads and 2-3 years worth of iPhones. Very few people outside of Apple know what iPad 3 will be. Most likely only Apple knows what's going to be in iOS 6. Sure, it may not be iOS 6 that ships around the same time as Windows 8, could be a 5.x, but I bet it will be iOS 6. Will Windows 8 with Metro look fresh against iOS 6? Google will ship a bunch of new Android releases between now and then too. The ship in Redmond is too big to seriously change course and still ship Windows 8 in time for Fall 2012.
Fall 2012 will be one of those historical inflection points, like the launch of Windows 95 and iPhone, that technologist will remember as long as they live. Microsoft is either going to flame out or curtail Apple's incredible tablet growth. I seriously believe this is Microsoft's last chance to remain relevant. The mobile train has left the station and is accelerating, but Microsoft hasn't even finished their travel plans!
- Apple could have an App wildcard up it's sleeve
I believe iOS and OS X will stay merged at the lowest layers, but at the UI layer they stay separated. There are certainly ways Apple could make OS X post-Lion even more like iOS without them truly merging. One thing I think Apple could do is merge the iOS and OS X apps stores and make iPhone, iPad, and Mac binaries in one app package the new Universal format. Forget legacy vs. Metro style apps in Windows 8, with the App Store, you could buy an app for use on all your Apple devices. Apple's put multiple binary images in one app bundle for years and OS X apps are getting more structured like iOS apps with sandboxing this year. I've actually been surprised this hasn't happened all ready. This would be fairly easy to do and makes whether an app runs an on any Apple device an implementation detail user's don't have to worry about. Or Apple could allow Cooca Touch apps to run directly on OS X by consumers since they already do in the iOS Simulator, but I think this is the wrong thing to do since iOS apps usually can't handle the multitude of screen sizes on Macs.
Tuesday, September 06, 2011
QuickTime X on OS X Lion 10.7 Been Acting Like It's Possessed By A Mischievous Spirit? Here's The Fix.
Have:
- QuickTime Player window titles been unclickable?
- Control HUD unmovable?
- Creating screen recordings all but impossible?
Then call the QuickTime X Busters! We're ready to believe you!
The ectoplasmic residue that's been haunting your Lion install is the QuickTime Player X Preference Pane and the preferences it created. Back in the OS X 10.6 Snow Leopard days, this handy utility gave you the ability to configure certain hidden preferences that you might like, such as automatically playing a video once the file is opened.
This utility, as developer Megabyte Computing Solutions says is 10.6 only, but that doesn't help when doing an inlace upgrade. To fix QuickTime Player in Lion then, you need to trash the preference pane and any old preference files in ~/Library/Preferences. Quit and open QuickTime Player if it was running and BOOM, no more busted QuickTime Player.
I'd chalked up this behavior to simple beta and then 10.7.0 bugs. But it finally occurred to me today that there is no way ships QuickTime Player in Lion that busted, then I figured this out.
Tuesday, August 30, 2011
Feature Requests For All Twitter Clients: Automatically Block & Report Obvious Spammers
Twitter itself seems unable or unwilling to stop obvious spammers.
Everyone using Twitter has seen this, mention a hot product like the iPad or iPhone, and BOOM your timeline fills up with spam from bots that have zero followers and follow zero accounts.
Tonight it hit me, why not have the Twitter client filter out and automatically report spammers? Even if Twitter eventually starts catching spam at the server where it should be caught, no reason why clients can't iterate quickly to stomp out this scourge now.
I envision this feature being like a muting feature, but instead of muting on keywords, muting happens based on account metrics. Then the client could delete obvious spam tweets out of the main timeline or put them into a spam timeline.
The user should be able to take it one step further and set the client to automatically report as spam the obvious 0/0 accounts.
Monday, August 29, 2011
Blog Update: Why I'm Pulling Ads
I can't believe I've been writing this blog for 7 years! I had no intention when I started writing of showing ads. Most ads are crap & I hate crap ads. But I figured I would give it a try and see what kind of revenue I brought in. I wrote about my first results in this piece $100.39 in only 1,307 Days. That was on March 28, 2008. I've been writing less on the blog since Twitter came out, like a lot of people, and I've been slowly climbing back to the magic $100 USD payment threshold. I'm currently inching up $89 USD.
I've been thinking about it for a while, but Dave Winers' post Indirect business models FTW really got me moving on doing it with this quote:
I say don't put ads on your blog, they just pull attention away from the ideas you're writing about.
As soon as I read that, I knew I had to pull the ads soon. It just rings true for my kind of blog. But I held back, I wanted to replace Google Adsense ads with banners for my company Tangerine Element and my apps iTimeZone for iOS & SleepMute for Mac OS X. I figured if anyone wants to say "thanks" for something they read, just click through to an app & buy it.
Then while re-reading some of my older posts to write something new, I saw this:
Of course I knew this was going to happen, but I'm not advertising for Dell! WTF!?! I in no way endorse using Dell computers any more than I would endorse getting a hammer and banging on your skull to cure a headache.
I'm done, the ads are gone. When I get some time, I'll put up my own banners, but better to stop the damage first.
Wednesday, July 06, 2011
Easier Screen Shots In OS X: Make the keyboard shortcuts F5 & F6
I don't know why I didn't think of this sooner.
It's kind of an open secret that taking screenshots by default in OS X Snow Leopard and now OS X Lion is not as obvious as it should be. All iOS devices have an easier screenshot gesture (tap the home + lock button for a second) than OS X does. Take a look at the screenshot below:
3 or 4 keys to trigger a screenshot! It's always been a tricky combination to remember for experienced OS X users, and when you tell Windows converts that their precious Print Screen key has been replaced by 3 & 4 button combos, they almost always say how is this easier
The answer of course is that it's not and never has been. It's more powerful, in OS X you get to draw a box around the part of the screen you want, but it's a hard sell. I usually just tell somehow to launch Grab.
After I installed the OS X Lion GM tonight, I was looking through System Preferences to see what had changed, and I was disappointed to see the default keyboard shortcuts for screen shots hadn't changed. So I started wondering what keys I could map screenshots to, and then it hit me:
F5 and F6 are unmapped to critical operating system functionally, they're blank guys on my Apple Wireless Keyboad!!!
I couldn't believe I hadn't thought of this before, or that Apple hadn't already done it. Maybe they just don't think taking screenshots is a common user activity in OS X, but it seems like everybody needs to take screenshots at some point, why not make it easy? So I changed my keyboard shortcuts to this:
One caveat, F5 was already mapped to VoiceOver, so I put that on ⌥⌘F5 since I never use it.
I'll file a bug with Apple to propose getting these made the default keyboard shortcuts for screenshots, and put some kind of icon on the actual keyboard keys.
Tuesday, July 05, 2011
The Reason Why an Objective-C Protocol Doesn't Implement respondsToSelector:
- (void)notifyDelegateOfButtonTapThe protocol definition would typically look like this when implementing this pattern:
{
if (self.delegate &&
[self.delegate respondsToSelector:@selector(protocolSampleViewController:didTapButton:)])
{
[self.delegate protocolSampleViewController:self didTapButton:self.button];
}
}
@protocol ProtocolSampleViewControllerDelegateThis is a typical protocol definition as code completed in Xcode 3.x, with the addition of @optional just to maintain pattern correctness for the example. In Xcode 4.x, the code completed @protocol definition template looks like this:
@optional
- (void)protocolSampleViewController:(ProtocolSampleViewController *)protocolSampleViewController didTapButton:(UIButton *)button; @end
@protocol protocol name <NSObject>As you might have guessed by now, the <NSObject> added behind the protocol name is the key. That's because it's actually the NSObject protocol that defines most of the core methods that the NSObject class implements, including respondsToSelector:
methods
@end
Once you make sure all your protocol definitions adopt the <NSObject> protocol, then calling respondsToSelector: on your delegate or datasource variables won't result in compiler warnings.
One more thing...you could cast your delegate or data source variable to id like this:
...That is an ugly solution and doesn't help you understand another key feature of protocols, inheritance, which I plan to cover in an upcoming post.
[(id)self.delegate respondsToSelector:@selector(protocolSampleViewController:didTapButton:)]
...
Tuesday, June 28, 2011
Adopting an Objective-C Protocol Privately in the Implementation File
I continue to be surprised by the syntactic constructions allowed in Objective-C and the Coca/Cocoa Touch frameworks for iOS and Mac OS X.
iTimeZone for iOS, my world clock calculator app, has relied on the UIDatePicker control since it first shipped on July 15, 2008. The results haven't always been optimal. I've filed any number of bugs with Apple documenting how the control can get confused and show the wrong date & time. Sometimes they've been fixed, other times, like now, it takes such a long time it really reflects negatively on my app.
I've finally had it with this control. I've started reimplementing UIDatePicker as TGDatePicker. My goal is to be API compatible and eventually release this as an open source project so others can benefit.
So of course I started by looking at the UIDatePicker.h header in the iOS 4.3 SDK. The docs state and the header shows UIDatePicker manages a private UIPickerView to show its UI. But UIPickerView uses delegate and data source protocols to configure itself, but they're not adopted in the public header!
UIKIT_CLASS_AVAILABLE(2_0) @interface UIDatePicker : UIControl <NSCoding>
{
...
}
...
@end
I've never adopted a protocol outside of the header before, and I wanted to be as close in my implementation as possible to UIDatePicker, so the only other thing I could thing of is to adopt the protocols in the implementation file, like this:
#import "TGDatePicker.h"
@interface TGDatePicker () <UIPickerViewDataSource>
@end
@implementation TGDatePicker
...
@end
And it works! I can't think of a reason why Apple wanted to do this. It doesn't seem like adopted protocols are top secret information. I probably won't ever use this outside of this special case, but now I know just in case.
Sunday, June 05, 2011
WWDC 2011 App Doesn't Save Favorites Offline
Friday, May 27, 2011
Icon & App Name Evolution of SleepMute for Mac OS X
SleepMute for Mac OS X, the utility that automatically mutes and unmutes your Macs sound, is nearly two months old now, and I've finally got some time to write about it. One of the big differences for Tangerine Element on this project was hiring a professional icon designer. I had done all the icon work on iTimeZone for iOS, and it didn't turn out to bad. My graphics skills hit the wall early on that part of the project and it was a hard slow climb up the hill to ship what I did.
Get It Started
I find that to keep motivated when working on my own apps, I have to have a good idea of what the icon will be. I started with the following image that I cobbled together from desktop wallpaper and my take on the Mac OS X speaker icon on the menu bar:
Since this is a Mac app, having good quality icons at 16x16 all the way up to 1024x1024 (I'm future proofing) was more than a match for my feeble skills with a bitmap editor.
Having this temp image though was like writing an application definition statement. I had a very clear idea and intentionally limited the scope for 1.0. The only problem was I had the wrong name!
Google-Fu Failure
When I started work on SleepMute, the app was actually named IdleMute. Before I wrote a line of code, I bought the freely available idlemute.com. Who ships an app today without buying the domain?!? Once I owned idlemute.com, I wrote code and tested willy nilly and didn't think about it again. I was seconds from sending the first email to the icon designer (more on him in a second) detailing what IdleMute 1.0 was and what I wanted in the icon when I did another search for the name and boom, similar functionality apps on other platforms came falling out of the woodwork. Clearly my googling skills failed to reveal these apps when I first started the project. In the end, I am much happier with SleepMute than IdleMute. IdleMute was what I defaulted to as a developer, and really matched Windows terminology, which still depressingly pops out of my head sometimes. SleepMute more nicely aligns with Apple's terminology shown to users.
The Professional
I was on a real tight timeline to ship SleepMute before work on another project got crazy, so finding an icon designer that could start immediately was a key factor. After looking around for a while, I found Andrea Austoni.
Andrea was great to work with. I gave him my prototype logo and provided the following direction:
What I was going for what something in what appears to be Apple's new template for Mac apps as shown with the Mac App Store icon. rounded circle border, minimal 3D, easily convertible into pure 2D if needed. For the SleepMute icon, I was trying to take the muted speaker in the Mac OS X menubar to draw that visual connection to muted sound in OS X. Then having Zs coming out of the speaker, common iconography for something sleeping, was supposed to show you know a sleeping speaker. My plan was to scale up or down the Zs, at 32, I had 2. I put them on a night sky background because I didn't want just a black background.Armed with that information, he created this sketch:
I loved that Andrea created concepts I hadn't even thought of before. We narrowed the sketches down to 3 to take to the next level:
My wife, Andrea, and I all agreed that number 2 was the way to go. It solved the problem of having a natural circle border which follows Apple's latest Mac OS X icons, and it has more graphical punch, especially once we started putting colors on it:
I selected the lighter orange one which matched the Tangerine Element company colors better, then we made design tweaks.
Final
The main change from the earlier concept was the switch of the far outer and riveted rings for better contrast in a number of situations throughout Mac OS X.
Conclusion
Andrea has his own blog post about our experience working together, with a hint to showing icons correctly in Mac OS X 10.6 Snow Leopard. I enjoyed the process so much and the results, Andrea is working on an icon redesign for iTimeZone for iOS
Wednesday, May 25, 2011
How Not To Advertise Fake iPads By Staples
My wife recently decided she needed a new hobby, so she started couponing. This means quickly acquiring these things called "newspapers" on Sunday made from dead tree parts and butchering them with sharp tools into tiny squares that you hand over to someone at a physical store. For this ritual sacrifice, they take money off the price of their goods. I know right, sounds so archaic, but at least it wasn't knitting!
Anyway, in the stack of coupon leaflets there was an ad created by Staples to sell fake iPads. Here is it in all it's "glory":
Let's take this apart:
- Adobe Flash enabled for a true Web experience...of frustratingly choppy video, browser crashes, and unplayable games.
- Run multiple programs for true multi-tasking...Tablets run Apps, this isn't Windows. How do I download programs for my Tablet?!?
- Front- and rear-facing cameras let you stay connected...When did Front gain a trailing dash? So the WiFi doesn't get us "connected"? How does a connection over a camera work?
- Play movies, music and games on the go...Isn't this like when advertising a new car saying "comes with tires".
Other observations & questions from a regular buyer's perspective:
- Why is 7" Playbook more expensive then the Acer 10.1"?
- Who at Motorola thought putting WiFi in the XOOM logo was a good idea?
- Playbook doesn't have Dual-core or Google?
- Is Acer's tablet called the Acer or the fine print Acer Iconia Tab? Is there a soft drink tie-in?
- Where's the weight and thickness of any of these tablets?
- Does wirelessly syncing the Playbook with a Blackberry phone cost something?
All TOO easy!
Monday, May 23, 2011
From Snarky Truth to Reasoned Explanation: Gender Discrimination in the Tech Industry
I haven't followed all the reference links, but Faruk AteÅŸ' From Snarky Truth to Reasoned Explanation is well worth the read about discrimination against women in technology in particular, but really in general. An excerpt:
"What we ultimately want is Formal equality: a world in which race, gender, ethnicity, orientation and religious beliefs do not affect the opportunities and treatment of any individual. Unfortunately, the only people who think we live in such a world (or work in an industry that enjoys Formal equality) are a certain class of people who have enjoyed privileges their entire lives. Many women, if you care to respectfully listen to them, will readily assure you that we do not live in such a world—or industry—at all."
One of the small things men in tech do, and probably everywhere, is refer to a group of their co-workers as guys when it includes women. I've been guilty of this in the past, a bad habit I finally broke a few years ago, and I've always believed in Formal equality for women. To any women that experienced my use of this term, please accept my apology. If you find yourself doing this, figure out how to eradicate this verbal tic from your speech.
Sunday, May 22, 2011
From the Grocery Store Line: Irony Lost
Flash Hangs PS3 3.61
I updated to PS3 system software version 3.61, the first available after the massive data breach Sony suffered nearly a month ago.
Since the Playstation Network was still down for maintenance right after I updated, changed my password, and deleted my billing information (luckily, the credit card on file was already closed and expired, hackers lose!), I ended up using the embedded browser to read about the content of the 3.61 update on the PS3.
I agreed to run the plugin, which of course is Flash, and then clicked on the video for Ratchet & Clank: All 4 One. My son wanted to see it and we've played every Ratchet & Clank game on PS3. It started to play, but since I am watching on an HDTV, I clicked the HD button on the video toolbar and then this:
HUNG! Seriously, does Adobe Flash work flawlessly on any OS?
Wednesday, May 11, 2011
Goodbye Stargate!
We've been together a long time & I'm sad to see you go. Like a star athlete that plays past their prime, it was your time to end. To many recycled plots and underdeveloped characters slowly leached the fun out of the franchise. Also, the easy humor on display in SG-1 was in short supply as Atlantis and Universe took over the reins.
We both know this isn't the end, what death in Hollywood & sci-fi is? Even as I type this, I'm sure an executive somewhere is figuring out how to squeeze more milk from the cash cow. Perhaps you'll get a grand rebirth ala the Star Trek movie? More likely, you'll be put on ice to let wounded fans recover and a new creative team take over for an eventual episodic rebirth.
I can't promise I'll be there for you, but I probably will. Your brand of showing humanity move into the stars while explaining all our myths as aliens with "...sufficiently advanced technology is indistinguishable from magic" has undeniable appeal to me.
Enjoy the R&R!
How Moving Brands created the Showyou brand
Best quote ever about the iPad
Anyone who believes this thing is a game changer is a tool. I'm sorry, but that's just the way it is.LOL! I can't stop laughing, made my day.
Saturday, April 16, 2011
Where's the data on how little sleep I can get away with?
Yesterday when I saw this NY Times article titled "How little sleep can you get away with?" I thought it was great, made me think I maybe should change my ways:
http://www.nytimes.com/2011/04/17/magazine/mag-17Sleep-t.html
I re-read it this morning because I wanted to know where the sleep deprivation to productivity inflection point was. How long can I go with sleep deprivation before the increased amount of awake but impaired time becomes counter productive? Frustratingly it's not in the article. This is the kind of bad reporting I can't stand anymore. I don't want paragraphs of "story", I want a short description and then tables of data. This is the kind of thing Mythbusters would easily and clearly have nailed in a simple table.
How much sleep to get is particularly tough because with kids, wake up time is totally out of your hands. I wrote SleepMute for Mac (available on the Mac App Store) mostly to guarantee uninterrupted sleep from my always on Mac's sound alerts when I do hit the sack.
http://www.tangerineelement.com/main/sleepmute.html
Ironic I developed the app to help with uninterrupted sleep using a lot of sleep deprivation.
Monday, April 04, 2011
Monday Morning Inspiration
Wil Shipley with some good inspirational words for my Monday morning...
Tuesday, March 29, 2011
Stopping iWeb From Turning Text Links Into Images
Back in September 2010, Rage Software's blog published the provocatively titled post Are You Making The Biggest Search Engine Blunder with iWeb? Well it was provocative to me since I'd been publishing the Tangerine Element web site using iWeb since July 2008 when iTimeZone came out on the App Store. I immediately consumed the article. If you haven't read it, please do so you're up to speed. As soon as I had a chance, I enabled Show text imaging indicator in iWeb. I was horrified, the main navigation for Tangerine Element, as well as other bits of seemingly innocent text, was being converted to images. I burned numerous hours trying to tweak the right combination of settings to solve this problem without success. Eventually I gave up, but I finally cracked it tonight! Here's what to do.
There is a very nice inspector in iWeb that allows you to set properties on hyperlinks. Your hyperlinks are going to be text in text boxes, and this is where you can make all your links into images. If you click your text box and set the hyperlink properties, iWeb will immediately change your text into an image on publish. To get a text hyperlink, you have to double-click so that just the text is selected, not the box, then set the hyperlink properties. This also allows you to set the Format tab properties for rollovers.
Monday, March 28, 2011
Recommendation: Use FaceTime on Mac OS X for Video Chat Instead of iChat
I've been using iChat to video chat with my family for at least 6 years. With each Mac OS X release, Apple's made nice improvements to the video calls in iChat. This app is what sealed the deal for getting my parents off Windows years ago, and more recently prompted me to upgrade my mother-in-laws iMac to Mac OS X 10.6 Snow Leopard. It's been one of my favorite Mac-only apps. Of course Skype has been an option too in recent years and I've used it plenty especially to people on Windows. In my experience though, iChat's video quality has always been better. But it is time to say goodbye to iChat for video calls and use FaceTime, it's just better for most people.
Yes FaceTime costs a couple bucks, but video quality is definitely improved because FaceTime uses a widescreen aspect ratio to send & receive video. This has always been on my iChat wish list since iChat 5.0.3 on Snow Leopard captures video using a VGA (640x480) aspect ratio (i.e. 4:3) and then stretches it for widescreen viewing. FaceTime for Mac has the ability to send & receive video calls in 720p HD, but only the new early 2011 MacBook Pros have a built-in FaceTime cameras capable of sending 720p HD, as does the iPhone 4. Older Macs with iSight camera's top out at VGA resolution, but the widescreen aspect ratio only in FaceTime helps.
The other big reason to switch the family over to FaceTime is so they can receive FaceTime calls from iPhone 4, iPod touch, or iPad 2. This came in very handy today since I had taken the time to get my parents to buy FaceTime on their iMac a few days ago. This allowed me to FaceTime to my parents from the hospital room of my wife's father. It sounds like a commercial, but it happened & was great. Thanks Pocono Medial Center for the open WiFi.
About the only gripe I have for FaceTime is that when calling Mac to Mac, the app starts the video call in portrait orientation instead of landscape. A widescreen device that can't have it's orientation changed should of course start in landscape.
Tuesday, March 22, 2011
Be cautious about using Xcode 4.0 with LLVM 2.0 to deploy apps to iPhone 3G & below devices, apps crash
Update
Looks like this was resolved in Xcode 4.0.2 since I can't reproduce it anymore.
Original
On two separate iOS apps compiled with LLVM 2.0, user's whose iOS device could only run arm6 binaries crash at launch. Recompiling with LLVM 1.7 in Xcode 3.2.6 produces a fat binary that works for both armv6 & armv7 based devices.
It's certainly possible that there is some build setting I tweaked to expose a bug in LLVM 2.0. If that is true, I haven't found which one yet.
I filed a bug with Apple on this of course, # 9141747. If you are seeing the same issue, please dupe my bug.
Here are some build settings that might be relevant:
Setting | Selection |
---|---|
Architectures | Standard (armv6 armv7) |
Build Active Architectures Only | No |
C/C++ Compiler Version | LLVM 2.0 or LLVM 1.7 |
iOS Deployment Target | iOS 4.0 or iOS 3.1.3 |
C Language Dialect | C99 [-std=c99] |
Saturday, March 19, 2011
Friday, March 18, 2011
Batman (1989)'s Alfred Has Departed
Sad to hear the actor responsible for one of my favorite Alfred performances has left the building.
Ain't it Cool News: Hammer & Tim Burton fave, Michael Gough passes on...
Monday, March 07, 2011
Greed Is Good in NFL Labor Talks
Greed Is Good in NFL Labor Talks
Great piece by Bill Simmons on the NFL labor dispute.
Wednesday, February 09, 2011
Flash Player 10.2 vs. iTunes 10.1.2 CPU Utilization Playing a Song
Flash Player 10.2 was released today. The big claimed improvement is better, i.e. lower, CPU utilization playing H.264 encoded HD video. This tweet claims a big drop in CPU usage for Pandora.com's Flash app.
Curious, I installed Flash Player 10.2 on my main iMac even with the rare Safari pseudo-hang I had on the work laptop after installing Flash Player 10.2
Here's the audio playback performance I see in Mac OS X 10.6.6:
- Pandora.com playing a song with Flash Player 10.2 uses ~ 10% of CPU
- iTunes 10.1.2 playing a 256 kbps AAC file ~ 5% of CPU
- Pandora.com's Flash app paused, ~ 6.6% CPU
Yeah, Flash is totally not going to use more CPU cycles than native Mac OS X audio/video playback Real Soon Now™
Wednesday, February 02, 2011
How To Compare NSDecimalNumbers in Objective-C
I was working on some code today where I had to compare two NSDecimalNumbers. This was my first attempt at comparing them:
NSDecimalNumber *number1 = [NSDecimalNumber one]; NSDecimalNumber *zero = [NSDecimalNumber zero]; if (number1 > zero) { //1 is always greater than 0 right? }
This code will compile without errors or even warnings, but it doesn't work. It works, but it doesn't do what you expect. Turns out you aren't comparing the values of the two NSDecimalNumbers, your comparing pointer addresses.
Even more shocking, Objective-C does not have operator overloading! I've been developing in Objective-C for 3+ years now and I had no idea, it just never came up in iTimeZone. Assuming that Objective-C had operator overloads that did the expected evaluation on the value cost me about 4 hours today, especially since the compiler was no help.
I switched over to this implementation and thought I was done:
NSDecimalNumber *number1 = [NSDecimalNumber one]; NSDecimalNumber *zero = [NSDecimalNumber zero]; if ([number1 floatValue] > [zero floatValue]) { //1 is always greater than 0 right? }
Looks good right? Wrong! While this works for short fractional numbers, numbers that have more precisions will lose them with that syntax. I could have also used:
... if ([number1 doubleValue] > [zero doubleValue]) { //1 is always greater than 0 right? }
That increases the precision from 6 digits to 15, quite a leap, but some digits could still get cutoff.
The absolutely correct way?
... if ([number1 compare:zero] == NSOrderedDescending) { //Hey number1 is greater after all }
I don't think I am going out on a limb here saying that isn't the easiest to understand syntax. A comment surely would have to go above the if statement to rewrite that in plain english, or even using an operator. While I have only written a few operator overload methods in C++ and none in .NET, I sure did use them in .NET all the time. I hope Objectice-C gets them in a future release.