Saturday, December 27, 2008

Sunday, September 21, 2008

App store observations

Having a few apps on the store, and having closely followed rankings, popularity and pricing over the past couple of monthes, here are a couple observations:
  • There are still plenty of business issues (mktg, customer service, ip, taxes, etc) to deal with even though Apple takes care of some (distribution, payment, part of taxes). I think there's some opportunity there (publishing houses, co-ops?, consolidation?), but I'm not sure what yet.
  • 'mimic' apps are making there way on to the store...sometimes better, sometimes not, often stealing wording and sample data straight from other apps and cross-posting reviews to drive traffic to their apps
  • Not a lot of apps that access critical consumer data (i.e. - my bank, my frequent travler info, etc) -- slow-moving large corps [opportunity]
  • Surprise market for apps for 'little kids' (parents appear to gladly pay 99c-4.99 to keep a kid busy for some period of time)
  • Great market for taking something that's specialized and mechanical (sleep sounds, chess clock, specialized calculator) and making a cheap digital version.
  • Still lots of new game concepts that haven't been tapped . . .
  • When you have something that's selling all over the world, it's a challenge to keep up with what's going on in all the different country-based app stores, and partitioning feedback, marketing, and sales to drive prioritization.
Apple is starting a free program for universities and students: that will let them openly discuss and collaborate on iphone/touch development.

However, the NDA is still in effect for experienced developers and publishers, though the enforcement seems erratic (some developers are openly violating it in discussion forums, app descriptions, blogs, tweets, etc).

Sunday, July 27, 2008

New apps on the store RSS feeds

RSS feed for new apps on the app store:


- or -


Thursday, July 17, 2008

Environment Optimization: Marco Polo + Synergy

Wow.  Synergy + Marco Polo = Lots of automatic goodness.

I've got a laptop and a home computer which occasionally cross paths.  When I bring the laptop home, I like to use both it and my home computer in parallel -- sometimes compiling/linking software on one, while doing research on the other.   Synergy works great for sharing my keyboard/mouse between them.  Now, with Marco Polo though, life just got even lazier!

Rather than manually starting the synergy daemons on both machines, Marco Polo let me set up some network 'evidence' policies (available wifi ssid + bonjour services) which detect when my computers are at home, near each other, or at work and execute various 'actions' based on that 'evidence'.  Some of the 'actions' I have set up thus far are :
  1. [Both machines] Automatically launch the synergy daemons (on both machines) to share my desk's keyboard/mouse when laptop & desktop are both at home
  2. [laptop] Launch my work chat client (iChat) at work, and my home chat (Adium) client at home.
  3. [laptop] Set my iChat status to 'at work' when at work.    
  4. [laptop] Set the default printer appropriately based on location.

Sunday, June 22, 2008

Interacting with GIT

Git interactive rocks!

It's a quick and easy way to stage several files [for a subsequent commit], regardless of location and name, without an IDE or ninja master scripting skills . . .example follows: [my typing in bold]

machine1$ git add -i
staged unstaged path
1: unchanged +7/-2 Classes/AllViewController.m
2: unchanged +2/-0 Classes/AppDelegate.h

*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> 4

1: Classes/FilteredByGroupViewController.h
2: Classes/FilteredByGroupViewController.m
3: Classes/GroupsViewController.h
4: Classes/GroupsViewController.m
Add untracked>> 1-4
* 1: Classes/FilteredByGroupViewController.h
* 2: Classes/FilteredByGroupViewController.m
* 3: Classes/GroupsViewController.h
* 4: Classes/GroupsViewController.m
Add untracked>> [enter]
added 4 paths

*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> q


update (July 1): just for comparison, a co-worker sent me one of those wonderful scripting commands for subversion to add all unknown files:

svn stat -u | awk '/^[?]/ { print $NF }' | xargs svn add

Monday, June 16, 2008

Time to GIT you a quick update

I've either been living on an island, or I'm guilty of being a slowly boiled frog depending on how you look at it.  

Let's compare the default output for 'svn up' vs. 'git pull' shall we?  My annotations are in bold...

In this corner: 'svn up' . . .

$ svn up

U Classes/ClassA.m                <-- _awesome_ single letter indicator for

U Classes/AppDelegate.m           <--   what happened to the file during the update

U Classes/DynamicSheetDelegate.m       

U Classes/AlertDelegate.m                

U Classes/SalesTransaction.m             

U App.xcodeproj/user.pbxuser             

Updated to revision 1028.        <-- _short_ summary


and the challenger: 'git pull' . . . 

$ git pull                                

remote: Counting objects: 58, done.               <- Keeps you apprised of comm.

remote: Compressing objects: 100% (48/48), done.  <-  rather than pauses w/o info

remote: Total 48 (delta 37), reused 0 (delta 0)

Unpacking objects: 100% (48/48), done.

From git://machineB/projectA

   f355111..99258fb  master     -> origin/master    <- SHA-1's of from and to 

From git://machineB/projectA                        <-  versions on remote repo 

* [new tag]         aftermemfixes -> aftermemfixes  <- New tags on remote repo 

Updating f355111..99258fb                           <- SHA-1's of current to new ver

Fast forward                                        <-  on local repo + current op.

 Classes/ClassA.m                       |   25 +-   

 Classes/AppDelegate.m                  |   11 +-   <- Counters and visual (ascii :)

 Classes/DynamicSheetDelegate.m         |    2 +    <-  indicators show amount of

 Classes/AlertDelegate.m                |    2 +    <-  change on per-file basis

 Classes/SalesTransaction.m             |    5 +-   

 App.xcodeproj/user.pbxuser             | 2510 ++++++++++++++++++--------------

 7 files changed, 1604 insertions(+), 1176 deletions(-)  <- Summary totals 


Sunday, June 15, 2008

WWDC 2008 wrap-up

I just got back from WWDC 2008 . . .  Unfortunately there is a confidentiality agreement that prevents me from posting any technical details here, but if you hop around the rumors/news sites, you can find most of the juicy details.

In general, is was a very well produced conference.   For me, the best thing about it was the chance to talk one-on-one with some of the engineers behind key technologies on the platform.  The venue and location were great and I definitely got the impression that Apple values their development community tremendously.  If the conference was any indication, there will be some very cool and innovative Apps coming out on the iPhone.

Does it GIT any better than this?

Cool GIT feature of the moment:   Content based tracking of files.

I renamed a file in a project, and then did a 'git rm', and 'git add' to update the index and subsequently committed and pushed the changes.  Then, on the origin repo, I executed a 'git status' to see what changes were pending.  GIT displayed:

# renamed:    AllViewController.h -> RootViewController.h

# renamed:    AllViewController.m -> RootViewController.m

Huh?   It recognized that the content was renamed even though I had only communicated a 'delete' and 'add' operation for the file.   Apparently this is because GIT does sha-1 on all content -- allowing it to know when you move content around (even if you don't tell it).  Nice!

Saturday, June 14, 2008

The Pragmatics of Innovation

This guy is one hell of a speaker and he has a really great (pragmatic) perspective on innovation.   The idea that people sometimes tend to look back at innovations without considering any hard facts is something of an understatement.  Scott explains that true innovation comes from rigorous habits, not doing what you're told sometimes, and not letting past failures stop you.    It's also interesting how people sometimes think innovations come entirely from 'magic moments'/epiphanies.   Best example Scott uses:  How they teach you in school that Newton came up with the idea of gravity when an apple fell on his head.   HA!  Listen to Scott's talk to hear the real story.  Fascinating stuff.

Tuesday, June 10, 2008

It's GIT'ing better all the time.

  • I have some source code that I need to share between a desktop and laptop sporadically.
  • When I'm working on the code on the laptop (potentially disconnected from any network for several days), I want all the same scm style capabilities (tagging, branching, roll-backs) that I get when I'm working on the desktop.
  • I don't want the overhead of maintaining a server securely or paying for a hosted solution.
  • I'll only ever be actively developing on either the laptop or desktop at any given time, so merges are no concern [for now].
After watching the ever opinionated Linus, a few git casts, and reading Wincent's summary, I was gung-ho convinced GIT could do the job.

GIT Recipe #1. One-way pushes between two trusted peers.

Base dir

|-> Myproject dir

Step 1. Create a GIT repo and index on machine #1 for your project.
machine1$ cd /myproject
machine1$ git init
machine1$ git add .
machine1$ git commit

Step 2. Start the git server component on Machine #1. Warning this allows fully anonymous unauthenticated access, so only do this in a secured LAN environment -- and personally, I would only do it for short sporadic bursts of time even in that environment. For a more secure option (i.e. - apache/ssh/etc), see the git docs (it's a bit more work).
machine1$ git-daemon --verbose --export-all --enable=receive-pack --base-path=/parentof/myproject/dir

Step 3, clone the repo to machine 2.

machine2$ git clone git://machine1/myproject

To do work on machine 1, and send the updates to machine 2

On Machine 1 (origin repo), remove a file and commit the change.
machine1$ vi README.txt
machine1$ git add README.txt machine1
machine1$ git commit

On Machine 2, pull those changes across

machine2$ git pull

To do work on machine 2, and send the updates to machine 1

Make some change . . .
machine2$ vi README.txt
machine2$ git add README.txt
machine2$ git commit

Push those changes over to the origin repo

machine2$ git push

Then, on Machine A [be careful not to have any local changes], to get those changes into your working copy:
machine2$ git checkout -f

Bottom-line: The big benefit here is that I can commit, tag and branch at will on either machine without them being connected, and then sync them up when there is connectivity. There are git workflows which allow for that capability with larger groups, but I personally only need this one workflow (working while disconnected) to function at the moment.

Some of the better GIT Resources I've found:

Saturday, June 07, 2008

Eric Schmidt - What can others copy from Google, how does his style compare to other CEO's

Great video with CEO Eric Schmidt on a variety of mgmt topics, challenges he faces at google, and how he tries to facilitate the focusing of the energies of passionate engineers and founders.  He alludes to what he thinks would be hard for others to copy, and what wouldn't.

One thing in particular that Eric mentions is along the lines of:  When you have smart people, encourage debate on anything and everything, BUT you MUST set a dead-line and make decisions in order to ensure your organization doesn't devolve into a purely academic environment.   He also talks about keeping people involved, how to challenge people and evaluate innovation ideas.  On challenging and evaluating innovative ideas, he seems to embrace a model similiar to Bill Gate's -- rigorously challenging down to the details and requiring hard facts.  Good stuff.

Saturday, May 17, 2008

Attaining Agile Mastery -- Forget the word Agile!

Here's a thought that has been bouncing around my head:

To attain mastery of practicing Agile, try never again using the word itself to explain things you do or why you do them.   Oh, don't get me wrong, the word 'Agile' is valuable for a assigning a name to the umbrella over those wonderful principles.   But, if you don't know WHY those principles are important, when to make exceptions to the those guidelines, or how to explain them to someone else then you're missing a big opportunity!

You see, saying "It's Agile", is not a good explanation for WHY you are doing something.   Oh, it's an explanation to be sure, but what exactly does it say about you when your explanation for why you do something equates to 'It's policy'.   It's most definitely a good way to a) end the conversation or b) leave your listener with the impression that you are some sort reasonless zealot.

Personally, I'm going to test out this theory.   I'll post something here if it blows up in my face :)

p.s. - I imagine there is also value to the word in a sales context (given the current climate), but since I'm just attempting to be a successful practitioner, let's ignore that context for now.

Sunday, January 27, 2008

From Tiger to Leopard

Well, I finally bit the bullet and got Leopard at home (on a mac mini).    So far, the transition from Tiger has been relatively painless. 
Here's a breakdown of the highs/lows for me compared to Tiger:
  • Spotlight performance: +1;  (usable!)
  • General OS responsiveness:  +1;
  • Safari Speed: +1;
  • Safari Reliability: -1; (has crashed on two different web sites for me so far! -- guess I'll go back to my camino/firefox combo)
  • Quicklook: +1;
  • Dock improvements (grids and fans):  +1;  
  • Time machine: ?; I set it up, but for me the jury is out on any backup software until I actually need to restore something.
  • Haven't found any major app incompatibilities yet.

Don Brown is working on serious Maven 2 improvements

Stumbled on this interesting work going on around Maven 2.  Don claims to have reduced some maven build times significantly.

Thursday, January 24, 2008


Tutorial on writing a custom wicket accordion/outlook style menu component:

Options for showing an ajaxy 'wait' indicator in wicket: announced you can now stream full songs and albums (from all major labels) for free...

Tuesday, January 22, 2008

Wicked Fast Wicket

If you're familiar with Maven, I'd say you can have a wicket template project up and running with IDE support (if desired), in much less than 5 minutes. The magic is here:

It uses a maven archetype to generate the project structure, and then you can use the typical mvn eclipse:eclipse or idea:idea to get your project into an IDE. 2 methods for running jetty are automatically built in as well:
  2. mvn jetty:run.

It's soooo much better than piecing together your first wicket project by hand. Believe me! (These aren't the droids you're looking for)

Now, I'm generally of the opinion that template based code generation can only take an application so far... which is why it's exciting to see extensible code based approaches to sharing behaviors across pages in a web app --> Wicket Web Beans . Next time I build a data-entry app, I'll definitely consider WWB.

Tuesday, January 15, 2008

Wicket is taunting me.

After some vigorous hand wringing and what I thought was thorough forum searching, it turns out that no custom behavior/code is necessary to handle adding a browser-cache-stopping-but-not-totally-random-or-once-in-a-while-new-when-it-shouldn't-be url parameter onto JS and CSS links in Wicket.

The magic line of wicket code which eludes forums and wiki documentation follows...drum roll...

In your Application's init() method add the following. :


Hmph... method names don't get much clearer than that do they?

This causes a 'wicket:lm=######' (lm stands for lastModified) url parm to be appended to package resource url's that are rendered. Now the browser has a url based clue as to when it REALLY needs to refresh from the server.

It's nice that it can be turned on in one place for all generated package resource url's.

Monday, January 14, 2008

Environment Optimization: Eye-fi + Smugmug. One step wireless photo sharing and backup (at full resolution)

After recently acquiring an Eye-fi SD card for my camera, I decided to take the plunge and figure out a photo backup/sharing solution. I have relatives and friends that share photos using the various photo sharing sites (which inevitably try to make you pay for prints, shoot spam or advertising at you, and/or reduce the photos to a size that doesn't allow you to print a high-res version on your color printer).

Couple that with the fact that I've had 2 external hard drives die in the last 7 years, I'm tired of burning CD/DVD backups ad nauseam, I'm lazy when it comes to posting and sharing photos, and you can see my dilemma

In walks the solution . . .

As I'm setting up the Eye-fi, I see that they've done their homework and offered out-of-the-box integration with 15+ photo sharing sites. One of the sites they integrate with is phenomenal -- unlimited high-res photo sharing (SmugMug). I set my Eye-fi up to automatically create galleries on SmugMug. Here's how it works now:
  1. My wife and I take some pictures at some event (wedding/family get-together/etc)
  2. We come home, turn on the camera. The camera automatically, wirelessly (802.11 - no special camera usb cables!) transmits the high-resolution (8megapixel) photos to my computer. During transmission, a new SmugMug gallery is automatically created with a default name like "Photos taken on January 27th, 2007". The photos are automatically uploaded to that gallery.
  3. If the photos are ones I want to share, I only have to flip a switch on that gallery and give it a name. If they are photos I don't want to share, I simply leave the gallery as is.
I set up a memorable smugmug url that I share with friends and family (thus reducing the e-mailing step normally necessary for sharing photos). The url is set up to not be indexed by google, not be visible to other smugmug users, or any searches otherwise. You have to know the magic url to get there. It's your own private, spamless, no-login, photo sharing site.
Now inevitably, the people that I've explained this process to so far have responded in one of the following ways:
  1. I back my photos up to an external hard drive.
  2. I don't trust photo sites . . .they've disappeared on me . . . How do you know they won't go out of business?
  3. How do they make money?
  4. That's cool. But still a look a of skepticism -- as if you have to be some tech guru to set this all up.
  5. They store the full res photos????? (i.e. - How can they afford that?)
Here are my answers:
  1. Hard drives have a limited life span. It will die eventually. What happens if your house burns down?
  2. This is a profitable business focused on a discriminating user. They are a standalone company who's entire consumer base has bought into the specific services they offer. Go read about them and see what you think. Also, you can order a DVD backup of your photos at anytime (about $20). If you use the Eye-fi approach I'm describing, you'll have a backup on your computer anyway. For the more technical, you can mount your photo site as a virtual drive (WebDAV) and drag and drop backup photos to whatever other format you like at any time. They are not free. They are, however, fairly priced. $40/year for unlimited high-res photo storage and spam-free, login-free sharing. They claim the photos are backed up in three different states.
  3. You pay them $40/year.
  4. The Eye-fi makes it simple to get the photos there. You still have to learn a little SmugMug to get your sharing settings right, but it's quick once you get familiar.
  5. You pay them $40/year. Hard disk space is cheaper than it has ever been.
To be fair, of the people I've described this backup/sharing solution to, two of them did have a geographically redundant backup solution -- Backup CD's in safety deposit boxes/relatives' houses.

Maybe I'm just a sucker for shiny things, but the almost effortless instant wireless photo sharing and backup at full resolution, for the cost of an Eye-fi ($99) and SmugMug ($40/yr) feels like a heck of a deal.

Environment optimization: iCalViewer

I've been successfully using iCalViewer for a little while now. See those nice little bubbles that are semi-transperant over my desktop background in the video below? -- those are upcoming appointments/meetings. I've found that this nearly eliminates the need for me to manually check my calendar on any regular basis. There are features to toggle which iCal calendars' events are displayed and provide a global hotkey you can use to see upcoming calendar events (without kicking off iCal!).

Environment optimization: Single Hotkey to large Terminal

So I finally got around to checking out Visor. I'm already an avid user of Quicksilver which gives me speedy keyboard access to anything I can remember the name of. Since I use terminal so often though, it only makes sense to have a single hotkey which can summon and dismiss a large, visible terminal session. Here's what it looks like when you hit the hot-key (I choose Command-Tilde). Try to ignore the demo marker in the center of the screen.... I'm trying a tool called Screenflick, and other than that demo marker, so far so good. Video after the break (if you're getting this as rss)


after the post notes: hmmm..looks like blogger downsized my video. doh :)

Saturday, January 12, 2008

Here comes the Tardis

A recent post on Patrick Kua's blog about explaining rituals compelled me to go add a link to my personal development philosophy page on my wikispace. That compelled me to review my wikispace. After reviewing my booklist , meetings , interviewing , and presentations philsophy pages, I had a realization. I have not been doing a good job of updating those pages with things I have learned and resources I have found in the past year. Not only that, but the declining rate at which I seem to be consuming literature (and producing content) suggests that I might be getting dumber by the minute. This must be addressed! No more. Oh I could come up with a litany of excuses (new house, new job, WoW, TF2, Mario Galaxy, Guitar Hero 3, that hilarious youtube video), but they are just that -- excuses. This is my public commitment to myself to do a better job of learning and sharing useful development practices this year.

That's right, now you are on the hook. And by you, I mean me.