I have been steadily taking photos at a slow trickle. A few gigs every month really adds up over time. Right now I easily have 90+ GB of RAW files. However, using Aperture to manage this on my first-generation intel iMac has been... painful. Exporting photos takes forever is one major problem. I can't really afford a 45 minute photo export just for 200 photos. It becomes difficult to imagine exporting 4000 photos at that point.
So I (legally) obtained a copy of Lightroom just recently. I've heard it has better RAW algorithms, both in the quality and speed department. Combined with Adobe's more-open approach towards managing metadata, this might be the choice for me. Not to mention, Lightroom is significantly faster so far.
Aperture kind of plays along - it will allow you to export Master files with XMP sidecar files that contain metadata. That way I shouldn't lose the ratings and keywords. Only problem with that approach is I have to export masters that I've already relocated out of the Aperture library. The Lightbox XMP export plug-in has this annoying crashing ability.
One last thing about Lightroom - it has a distressingly simple view of copyright - you are either copyrighted or in the public domain. Alas I really want to tag some of my photos with CC licenses, and have that exported in to JPEG and picked up by Flickr. Does anyone know how to do this?
EDIT: I already figured out my own problem. The problem is the mini-metadata dropdown is not the only copyright related metadata. By selecting a large number of photos and clicking on 'Sync Metadata' a dialog with additional copyright fields appears. I was using the Attribution-Noncommercial-ShareAlike 3.0 license, so I entered:
IPTC Copyright checked off
Copyright: Creative Commons Attribution-Noncommercial-ShareAlike 3.0 Unported
Copyright Status: Copyrighted (thats the 3 optioned selection list)
Rights Usage Terms: http://creativecommons.org/licenses/by-nc-sa/3.0/
Copyright Info URL: http://creativecommons.org/licenses/by-nc-sa/3.0/
And when I hit synchronize Lightroom helpfully asked if I wanted to save these as a new preset. That way when I import new photos I can apply all these 4 metadata fields trivially.
PS: Thanks (to whomever you were) for the Bic retractable fountain pen. Alas it is available in Europe only, but, if someone wanted to make me a happy holiday person... I think you know what to do.
Thursday, December 06, 2007
Saturday, October 27, 2007
Leopard
Yep, I upgraded. It's a nice visual upgrade, and has a bunch of new features to boot.
I was unable to at first get to my Linux-based afpd server. It turns out that by default Ubuntu doesn't ship netatalk with OpenSSL linked in. Tiger would warn you, but Leopard just chokes. So to enable it, follow these instructions.
I was unable to at first get to my Linux-based afpd server. It turns out that by default Ubuntu doesn't ship netatalk with OpenSSL linked in. Tiger would warn you, but Leopard just chokes. So to enable it, follow these instructions.
Monday, October 22, 2007
Unlocking the iPhone
Due to a ... ahem... billing disagreement with AT&T, I have need to unlock my iPhone.
Simply put, I was charged for data roaming to the tune of $800. AT&T was unwilling to help me out here, I was unwilling to stay as a customer. Strangely enough they were uninterested in keeping me as a customer when I informed them I wanted to leave.
So I signed up with T-Mobile. Number portability is really really great. Here are my plan details:
Bottom line is my bill pre-taxes will be $51.
The iPhone plan:
Bottom line is $90 pre-taxes.
Another major difference is the roaming charges. T-Mobile charges me .49/minute in Canada, and another .20 if I'm calling "Long Distance" - eg: calling the US from Canada. Calling locally and incoming is .49. AT&T was charging me (on paper) .79 then an additional .12 cents of "tax" for a grand total of .91/minute.
I estimate it will take me about 3.5 months to earn back my $175 early termination fee (sadly T-Mobile's is $200).
Basically the bottom line is that T-Mobile is much much cheaper than AT&T. T-Mobile's customer service is better, and here in Seattle they have better coverage.
Ok, so how did I do it? Basically these steps:
Now after all of that, you are free and nearly everything works. Things still broken for me: Visual Voicemail (of course) - the voicemail tab in the Phone app calls the T-Mobile Voicemail line. Youtube - I hear there are hack to make this work, but I don't really use Youtube. I'll fix it one day.
Interestingly enough, EDGE data on T-Mobile seems a bit faster - I think because of the proxy.
However, sending EDGE data is slower right now for me. On AT&T it normally takes about 10 seconds to send a plain email, and about 1 minute to send a picture email. But on T-Mobile (at home and at work) it takes 30 seconds and 3-5 minutes for the same activities respectively. An email to T-Mobile indicated that they had nothing on their side.
One experiment is to try the total internet package (for $19.99/month) to see if that's a difference, but I'd rather not. Maybe I'll borrow someone's SIM that has total internet.
And that's a wrap. 4 months after waiting in line for the iPhone, paying the higher $600 price, getting my $100 rebate, dealing with AT&T's excessive roaming charges, I am back to T-Mobile like I was before.
I still like the iPhone, and now that Gmail does IMAP it's even better (previously Gmail POP was a very weak experience). I'm just glad I can pay much much much less.
Not to mention sticking it to AT&T for refusing to forgive my stupid high data roaming rates. They really suck, not to mention double suck for being unwilling to retain my business.
Simply put, I was charged for data roaming to the tune of $800. AT&T was unwilling to help me out here, I was unwilling to stay as a customer. Strangely enough they were uninterested in keeping me as a customer when I informed them I wanted to leave.
So I signed up with T-Mobile. Number portability is really really great. Here are my plan details:
- $40 for 300 minutes, unlimited to top 5 callers (statically chosen by me), unlimited nights/weekends after 9pm.
- $5 for 400 text messages. International texts (sending and receiving) are on-plan (included in the 400). It's $10 for 1000, and $15 for unlimited.
- $6 for T-Zones, which gives me unlimited "web data".
Bottom line is my bill pre-taxes will be $51.
The iPhone plan:
- $60 for 900 minutes, unlimited mobile 2 mobile (on AT&T), unlimited evenings/weekends, and rollover.
- $20 for unlimited data
- International texts are .20-.25 each. Texts sent while in Canada - .10.
- $10 for 1000 texts.
Bottom line is $90 pre-taxes.
Another major difference is the roaming charges. T-Mobile charges me .49/minute in Canada, and another .20 if I'm calling "Long Distance" - eg: calling the US from Canada. Calling locally and incoming is .49. AT&T was charging me (on paper) .79 then an additional .12 cents of "tax" for a grand total of .91/minute.
I estimate it will take me about 3.5 months to earn back my $175 early termination fee (sadly T-Mobile's is $200).
Basically the bottom line is that T-Mobile is much much cheaper than AT&T. T-Mobile's customer service is better, and here in Seattle they have better coverage.
Ok, so how did I do it? Basically these steps:
- Tiff exploit to remount / and do other magic
- Custom iphuc to read the / disk image, replace fstab then write it back
- iNependence to put SSH on - note that this is the top hit for the search "independence"
- SCP to put BSD binaries on (ls, cat, rm, ln, etc)
- Renamed Mediaold -> Media and Media -> Mediaold (something that the TIFF exploit breaks)
- SCP anySIM 1.1 on
- Pop in the new T-Mobile sim
- Run anySIM via SSH, since springboard (app launcher/main screen) is hardcoded now (before it scanned /Applications)
- anySIM finishes - you're simunlocked!
- Rebooting the iPhone says 'SIM changed, connect to iTunes to activate'. Quit iTunes, kill iTunesHelper.
- Use iNdependence to activate phone.
- You're free!
- Ok, wait you need to configure the proxy to make web work.
Now after all of that, you are free and nearly everything works. Things still broken for me: Visual Voicemail (of course) - the voicemail tab in the Phone app calls the T-Mobile Voicemail line. Youtube - I hear there are hack to make this work, but I don't really use Youtube. I'll fix it one day.
Interestingly enough, EDGE data on T-Mobile seems a bit faster - I think because of the proxy.
However, sending EDGE data is slower right now for me. On AT&T it normally takes about 10 seconds to send a plain email, and about 1 minute to send a picture email. But on T-Mobile (at home and at work) it takes 30 seconds and 3-5 minutes for the same activities respectively. An email to T-Mobile indicated that they had nothing on their side.
One experiment is to try the total internet package (for $19.99/month) to see if that's a difference, but I'd rather not. Maybe I'll borrow someone's SIM that has total internet.
And that's a wrap. 4 months after waiting in line for the iPhone, paying the higher $600 price, getting my $100 rebate, dealing with AT&T's excessive roaming charges, I am back to T-Mobile like I was before.
I still like the iPhone, and now that Gmail does IMAP it's even better (previously Gmail POP was a very weak experience). I'm just glad I can pay much much much less.
Not to mention sticking it to AT&T for refusing to forgive my stupid high data roaming rates. They really suck, not to mention double suck for being unwilling to retain my business.
Sunday, September 16, 2007
Cocoa, Custom View scrolling
I spent a few hours banging against custom views and scrolling thereof, and learned a number of useful things.
The scenario is a custom view wrapped in a scroll view. Instead of doing the drawing in drawRect: what I'll do instead is manage the layout of my sub-views, specifically a number of NSImageViews. That way I get the drawing for free, all drawRect: needs to do is draw the background (trivial). When my view changes size I can automatically re-layout the images, arranging them into columns and rows.
Handling the resize is a bit tricky. The problem is the frame size of this custom view is semi-independent of the enclosing clip view. When the custom view frame size is larger than the clip view port, you get scrollbars (desired behaviour). When the scroll view grows, you want your custom view to fill up the entire area so you don't end up with weird background drawing.
I played with a bunch of the auto-resizing toggles, but I wasn't able to get things working - for some reason my frame always ended up too tall. So instead, the solution is to ask the enclosing scroll view what the size of their content area is, and size yourself to that. The logic is "make myself the same width, but if I need to be higher to accommodate my images, then be higher, otherwise be the same height as well".
So the first thing is you need to post frame change notifications and register to get view frame notifications... do something like this in initWithFrame: (or maybe awakeFromNib? Apple's docs indicate that initFromFrame: doesn't get called for objects from nibs, but mine got initWithFrame:)
The problem is you get notifications for nearly every change in the system, but you really only care about if your enclosing scroll view and it's clip view changed, so what you do is:
The key here is comparing the object the notification is for against your enclosing scroll view, AND it's clip view. If you don't have the second comparison your frame won't handle the start-up quite right.
Now, in your resize handler, you need to figure out the height and width you should set yourself too. Since my goal is to layout images, the minimum you can be is a single column. That way you get horizontal scrollbars when you get too small. Also since I want to display all the images, the view frame height has to be at least as tall as all the images and padding. But, if that isn't quite tall enough, I need to be the same height as my enclosing scrollview or else you get the scrollview background instead of your own (my background is 0.5 white, so problem).
So you need to call:
and the later on call
Since I re-layout each re-size the behaviour is I end up with flowing columns of pictures responding to a window resize.
One of the problems I had was the internal bounds origin was at the bottom left corner. The upper right corner would have been more handy, but I adjusted my math accordingly.
Then I had a problem with scroll behaviour - for some reason when the app started it would start scrolled to the bottom. When I stretched the window big then small again, the scroll bar was always at the bottom.
Google solved my problem for me - it turns out that the scrollbar always starts out displaying the origin. To solve both problems just do:
and both problems are solved. Now image 0 at row,col 0,0 has a origin of (padding,padding).
The basic problem with this approach is the custom view must be the full size of the content area of your scroll-view. If you needed to coexist with other elements inside your scroll view, you would have to adjust accordingly. For example, you might have to not be as wide for a vertical strip, or you might have to adjust your origin of your frame point. Some of the auto-resizing might help here, but I haven't experimented with it.
The view documentation is not the most complete, and there are lots of tips and tricks. There are several approaches too, currently I am using sub-NSImageView instances, but other code I've seen does the drawing straight from NSImage instances instead. That code is more complex, but it may be more efficient since you don't need to instantiate view objects (which can kill performance if there are too many). However it is harder, since NSImageView can draw cool frames for you.
The scenario is a custom view wrapped in a scroll view. Instead of doing the drawing in drawRect: what I'll do instead is manage the layout of my sub-views, specifically a number of NSImageViews. That way I get the drawing for free, all drawRect: needs to do is draw the background (trivial). When my view changes size I can automatically re-layout the images, arranging them into columns and rows.
Handling the resize is a bit tricky. The problem is the frame size of this custom view is semi-independent of the enclosing clip view. When the custom view frame size is larger than the clip view port, you get scrollbars (desired behaviour). When the scroll view grows, you want your custom view to fill up the entire area so you don't end up with weird background drawing.
I played with a bunch of the auto-resizing toggles, but I wasn't able to get things working - for some reason my frame always ended up too tall. So instead, the solution is to ask the enclosing scroll view what the size of their content area is, and size yourself to that. The logic is "make myself the same width, but if I need to be higher to accommodate my images, then be higher, otherwise be the same height as well".
So the first thing is you need to post frame change notifications and register to get view frame notifications... do something like this in initWithFrame: (or maybe awakeFromNib? Apple's docs indicate that initFromFrame: doesn't get called for objects from nibs, but mine got initWithFrame:)
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector: @selector( frameSizeChanged: )
name: NSViewFrameDidChangeNotification
object: nil];
The problem is you get notifications for nearly every change in the system, but you really only care about if your enclosing scroll view and it's clip view changed, so what you do is:
- (void)frameSizeChanged:(NSNotification*) note
{
id obj = [note object];
if (obj == [self enclosingScrollView] ||
obj == [[self enclosingScrollView] contentView]) {
// change the layout of my subviews
// (accessible via [self subviews])
}
}
The key here is comparing the object the notification is for against your enclosing scroll view, AND it's clip view. If you don't have the second comparison your frame won't handle the start-up quite right.
Now, in your resize handler, you need to figure out the height and width you should set yourself too. Since my goal is to layout images, the minimum you can be is a single column. That way you get horizontal scrollbars when you get too small. Also since I want to display all the images, the view frame height has to be at least as tall as all the images and padding. But, if that isn't quite tall enough, I need to be the same height as my enclosing scrollview or else you get the scrollview background instead of your own (my background is 0.5 white, so problem).
So you need to call:
NSSize newSize = [[self enclosingScrollView] contentSize];and the later on call
[self setFrameSize: newSize]; to set your new height in response to the resizing. Since I re-layout each re-size the behaviour is I end up with flowing columns of pictures responding to a window resize.
One of the problems I had was the internal bounds origin was at the bottom left corner. The upper right corner would have been more handy, but I adjusted my math accordingly.
Then I had a problem with scroll behaviour - for some reason when the app started it would start scrolled to the bottom. When I stretched the window big then small again, the scroll bar was always at the bottom.
Google solved my problem for me - it turns out that the scrollbar always starts out displaying the origin. To solve both problems just do:
- (BOOL) isFlipped
{
return YES;
}
and both problems are solved. Now image 0 at row,col 0,0 has a origin of (padding,padding).
The basic problem with this approach is the custom view must be the full size of the content area of your scroll-view. If you needed to coexist with other elements inside your scroll view, you would have to adjust accordingly. For example, you might have to not be as wide for a vertical strip, or you might have to adjust your origin of your frame point. Some of the auto-resizing might help here, but I haven't experimented with it.
The view documentation is not the most complete, and there are lots of tips and tricks. There are several approaches too, currently I am using sub-NSImageView instances, but other code I've seen does the drawing straight from NSImage instances instead. That code is more complex, but it may be more efficient since you don't need to instantiate view objects (which can kill performance if there are too many). However it is harder, since NSImageView can draw cool frames for you.
Tuesday, September 11, 2007
Lunch 2.0 At Adobe
Later this month on Friday September the 21st, Adobe is hosting Seattle Lunch 2.0. You may RSVP online.
I'll see you there!
I'll see you there!
Monday, September 03, 2007
A year later Lego still sucks
What a difference a year doesn't make. I complained last year that Lego Mindstorms software didn't work properly on Intel Macs. Specifically bluetooth doesn't work, due to the non-universal binary. This was pretty sad and pathetic of Lego, seeing how the Mindstorms was released in early 2006, and we knew since early 2005 that Intel Macs were the new hotness. Alas, they weren't paying attention, and anyone on an Intel Mac has a fairly crippled NXT platform. I can tell you, that bluetooth program upload is the super-hotness.
So, a year later, and Lego finally decided to release a point release which also includes Universal binary support. But, wait for it, you have to pay for the privileged of using all the features of your very expensive robotics platform. Furthermore it's very difficult to find even this fact out. It took me about 10 minutes to think to look in the "Need some help" link and be rewarded with the unsavory news.
Lego gets some pretty seriously disses from me for this continuing situation. To be so oblivious to the new millennium and willfully ignorant of a large and growing segment of would be users is not impressive.
So, a year later, and Lego finally decided to release a point release which also includes Universal binary support. But, wait for it, you have to pay for the privileged of using all the features of your very expensive robotics platform. Furthermore it's very difficult to find even this fact out. It took me about 10 minutes to think to look in the "Need some help" link and be rewarded with the unsavory news.
Lego gets some pretty seriously disses from me for this continuing situation. To be so oblivious to the new millennium and willfully ignorant of a large and growing segment of would be users is not impressive.
Tuesday, August 28, 2007
SFO Follow up
So Alaska was 2 hours late all told. Apparently we were lucky since the president was in Seattle from 1-5pm, screwing up rush hour. Am I the only one who think it's unacceptable to screw up major freeways just for a single person?
I complained on SFO's website, and I in fact got an answer today - totally unexpected! They noted that SFO has a different arrangement, making it difficult to pay for improvements, thus they contracted t-mobile to install and run the wifi network. Interestingly enough, t-mobile paid for all the capital costs. Apparently SFO is working so that airlines can provide wireless to customers if they so want.
And lastly, the vendors are only allowed to charge 10% more than local street cost. The customer service folks at SFO are sending my complaint to their concessions office, since I'm pretty sure that $2.69 for a 500 ml bottle of soda is more than 10% above street price.
So, SFO get a bump up for responding to complaints.
I complained on SFO's website, and I in fact got an answer today - totally unexpected! They noted that SFO has a different arrangement, making it difficult to pay for improvements, thus they contracted t-mobile to install and run the wifi network. Interestingly enough, t-mobile paid for all the capital costs. Apparently SFO is working so that airlines can provide wireless to customers if they so want.
And lastly, the vendors are only allowed to charge 10% more than local street cost. The customer service folks at SFO are sending my complaint to their concessions office, since I'm pretty sure that $2.69 for a 500 ml bottle of soda is more than 10% above street price.
So, SFO get a bump up for responding to complaints.
Subscribe to:
Posts (Atom)