The essence of this process is very fundamental indeed. We may understand it best by comparing the work of a fifty-year-old carpenter with the work of a novice. The experienced carpenter keeps going. He doesn’t have to keep stopping, because every action he performs, is calculated in such a way that some later action can put it right to the extent that it is imperfect now. What is critical here, is the sequence of events. The carpenter never takes a step which he cannot correct later; so he can keep working, confidently, steadily.The novice by comparison, spends a great deal of his time trying to figure out what to do. He does this essentially because he knows that an action he takes now may cause unretractable problems a little further down the line; and if he is not careful, he will find himself with a joint that requires the shortening of some crucial member – at a stage when it is too late to shorten that member. The fear of these kinds of mistakes forces him to spend hours trying to figure ahead: and it forces him to work as far as possible to exact drawings because they will guarantee that he avoids these kinds of mistakes.
The difference between the novice and the master is simply that the novice has not learnt, yet, how to do things in such a way that he can afford to make small mistakes. The master knows that the sequence of his actions will always allow him to cover his mistakes a little further down the line. It is this simple but essential knowledge which gives the work of a master carpenter its wonderful, smooth, relaxed, and almost unconcerned simplicity.
Thursday, February 17, 2011
The experienced craftsman plans less
Mac App Store won't let me buy apps: solution
The solution turned out to be manually signing in using the Store menu (manually sign out if you are already signed in). At that point I was allowed to update/verify my billing information and subsequent purchase attempts worked.
In previous attempts, I had not signed in manually, but rather had the App Store do the sign-in after I attempted to purchase.
So needs a little more work...
Train wreck management
Tuesday, February 15, 2011
Only 1 GHz
Hmm
1 GHz actually seems like quite a lot to me. 1000 times an Apple ][, 40 times a NeXT, and the latter was driving a megapixel display. I guess we have gotten used to wasted cycles.
PhoneGeometry.h
One way to rectify this situation would be to start using CG* structs and functions on the desktop as well. However, this introduces a dependency on CoreGraphics that shouldn't be there for Foundation-based code.
My alternative is to standardize on NSPoint and friends, and map those to their CG alternatives on iOS. That way, I have minimized my dependencies, with only a small header file to pay for it: PhoneGeomtry.h
This is now part of MPWFoundation (on github).
// // PhoneGeometry.h // MPWFoundation // // Created by Marcel Weiher on 11/11/10. // Copyright 2010-2011 Marcel Weiher. All rights reserved. // #if TARGET_OS_IPHONE #ifndef PHONE_GEOMETRY #define PHONE_GEOMETRY #import <CoreGraphics/CoreGraphics.h> typedef CGRect NSRect; typedef CGPoint NSPoint; typedef CGSize NSSize; #define NSMakeRect CGRectMake #define NSMakePoint CGPointMake #define NSMakeSize CGSizeMake #define NSEqualPoints CGPointEqualToPoint #define NSEqualRects CGRectEqualToRect #define NSIntersectsRect CGRectIntersectsRect static inline NSString *NSStringFromRect( CGRect r ) { return [NSString stringWithFormat:@"(%g,%g - %g,%g)",r.origin.x,r.origin.y,r.size.width,r.size.height]; } static inline NSString *NSStringFromPoint( CGPoint p ) { return [NSString stringWithFormat:@"(%g,%g)",p.x,p.y]; } static inline NSString *NSStringFromSize( CGSize s ) { return [NSString stringWithFormat:@"(%g,%g)",s.width,s.height]; } #endif #endif
Tuesday, February 1, 2011
Objective-XML and MPWFoundation now available on github
Thanks to Todd Blanchard for providing the necessary impetus to learn git.