Philly iPhone Conference

Voices that Matter is holding an iPhone conference here in Philly this coming October. I plan to be in attendance. If you are interested in coming there is a coupon code you can use for an extra $100 off, plus some prize drawing if you register by the end of this month (August).

http://twitter.com/VTM_iphone/status/22273907958

Reg now:Early Bird saves you $200, August reggies in drawing for $100 AppleGiftCards & $100 Twitter discount: PHNTWIT http://bit.ly/VTM_Fall

Should be a fun two days.

Also, if you are just getting started with iOS programming you might want to also attending the Big Nerd Ranch course the day before.

http://www.bignerdranch.com/classes/ios_seminar

I did one of these way back when when I was first starting out in Cocoa (it was the day before a Mac Hack) and it was incredibly helpful.

Posted on: August 27, 2010 – 12:19 PM | Comments (0)

Dex, a pokémon browser for iPhone now available.

Dex Icon

Last week my first little iPhone app hit the store. It’s a pokémon browser that let’s users:

  • Browse pokémon via the national or regional dexes.
  • View a pokémon’s type including its dynamic defensive type effectiveness.
  • Play pokémon cries.
  • Jump to popular online pokédexes including Bulbapedia, Serebii and Smogon.
  • Browse types to see their attack and defensive effectiveness.

This is a free app that is currently supported via iAds.

Download on the App Store

Visit product page on Clickable Bliss

The next few blog posts will share some thoughts on the whole development process but I thought it would be best to get this blurb out first. If you have some time to check out I’d love to get some feedback.

Posted on: August 27, 2010 – 10:50 AM | Comments (0)

Thoughts on the free WWDC videos

If you are active on twitter you probably have seen this news already but I had to take a moment to publicly thank Apple for posting the 2010 WWDC videos online for free.

Long ago these WWDC videos were done on DVD and took months and months to get out. If you attended WWDC you got them for free but could also buy them for a few hundred dollars. Over the past few years Apple has moved on to the iTunes Store for deployment, speeding up delivery and lowering the cost for non-attendees. This year they raised the bar yet again getting the majority of the videos online mere weeks after the conference and now lets anyone with an Apple Developer Account (even the free one) have access to them. This is a huge help to those of us who couldn’t make it to WWDC due to the sellout, short notice of dates (thus high airfare and hotel costs) or personal conflicts.

I’ve heard some WWDC attendees express bitterness that they paid to go to WWDC when they could have stayed home and gotten the sessions for free. While I can understand part of that frustration I have to say knowing that the sessions would always be available after the fact I would tend to spend at least half my WWDC time in the labs working with people from Apple to answer some of the more niche technical questions that pile up on my bug list. This kind of access can really pay for conference by itself. Furthermore, making the videos available for free is a huge benefit to the platform at large. Better educated developers make better apps, better apps make for a better platform.

Looking ahead I do wonder though how this will impact WWDC. Knowing that the sessions will be posted online shortly after the conference, is WWDC still worth the $1600 ticket price? One of the major issues I heard this year (not able to actually attend myself) was how crowded the conference and particularly the labs were. Perhaps knowing that the sessions are going to be published to the masses Apple could spend some resources and really flip WWDC upside down. Make the labs the star of the show and the reason you should come to WWDC. Historically the labs have been done in a pretty adhoc format (3-4 Apple developers that know technology X promise to be in lab Y for 2-4 hours) but from what I hear the crowds are really putting a strain the lack of lab organization — allowing some developers to eat up 45m of a Apple Engineer’s time while others wait in long lines and sadly sometimes leave without any help. I dunno, just brainstorming on the fly here — but I do think this is a question Apple needs to address as they make plans for WWDC 2011.

Posted on: June 18, 2010 – 3:42 PM | Comments (2)

Hiring CSS Designers for Invoice Templates

Some background: ProfitTrain is a desktop application for Mac OS X that helps freelancers and small businesses create and manage invoices. These invoices are generated via HTML and CSS that is fed through the print system via WebKit (ie: Safari) to produce PDFs. Currently ProfitTrain ships with two invoice templates, both plain looking, one setup to utilize windowed envelopes.

In the next update I’d like to ship ProfitTrain with some more invoice template options and am currently looking to commission a few designers to help me out. My goal is to commission 2-4 designers and have them come up with 2-3 templates each.

As a designer this is a unique opportunity to fully take advantage of the CSS declarations only seen in WebKit without a need to worry about working in other browsers. It also brings an air of complexity as invoice templates need to be flexible in showing/hiding various bits of data depending on the state of the invoice as well as the type of the line items.

For more information on the current template bundle format please check out the help book article Creating an Invoice Template.

I also get requests time to time from customers who want a custom invoice template but do not have the HTML/CSS knowledge to make it themselves. If you are a designer who does freelance work this could be an opportunity to get a some small focused projects.

If you are interested in working on some templates please send an email to mike@clickablebliss.com with a link to a portfolio of your work and a price quote. Due to the small scope of this project I would prefer fixed price quotes.

Posted on: May 10, 2010 – 11:35 AM | Comments (0)

MarsEdit 3.0 and Acorn 2.3

Grats to developer friends Daniel and Gus on the releases of MarsEdit 3.0 (blog editor) and Acorn 2.3 (image editor). I use both apps in my own workflow and if you haven’t checked them out yet, I highly recommend giving them a try.

Posted on: May 10, 2010 – 11:27 AM | Comments (0)

Walkthrough of a recent Core Data bug

As I mentioned in the March recap I’ve starting to migrate ProfitTrain over to Core Data. Lots of things have been going well but there was a problem I ran into. That being, I wasn’t seeing inverse relationships update properly.

I would tell a client its business was X, and then ask X for a list of his clients and not see the client. Calling -processPendingChanges on the context had no effect.

I spent days on this issue, posting a StackOverflow question, building sample projects; all to no avail. Most object creation in my app was in one place (the model controller) and I was fine with manually setting up both ends of the relationship manually and moving on to work on other things for the time being. That same day I decided to move on from this first bug I experienced my second.

I was refactoring my source list code and noticed a problem. I couldn’t NSLog an instance of PTClient. Doing so resulted in no logging from that NSLog statement and no logging from any NSLog statement henceforth. The app didn’t crash or hang. I could even use breakpoints to step through things — just no logging was happening. Really strange.

Later in the week I came back to the problem and with the help of a few IRC friends attempted to narrow down what was happening. For a while it felt like maybe I had a corrupt model file but considering I was getting no complier warnings or runtime errors and the app functioned well as long as I didn’t attempt to log out this instance it didn’t make much sense.

I eventually came to attempt to create and NSLog each entity type I had in my model file. The only one that didn’t work was PTClient. I then discovered if I removed the clients<->>business relationship between Business and Client entities things logged fine. If I re-added the relationship it would break. If I renamed the relationship on the Client from business to ofBusiness things worked fine. Getting close.

Someone asked me if I was overriding business in someway. PTClient is a pretty small class, didn’t see anything directly for business but I have this one method called isBusiness.

Why did I had a method called isBusiness in my PTClient subclass? We’ll in a previous version of my app I just used a simple CBCompany class and a little toggle to mark the company as a business or a client. Moving the model over to Core Data I’ve since created a PTCompany abstract entity and let PTBusiness and PTClient inherit from it. The isBusiness method was carried over as a compatibility method as there were iterators out in my code that would ask onto a group of companies, isBusiness.

If I removed the isBusiness method from PTClient everything worked, even the inverse relationship bug from earlier. Wow.

So the big questions here is why. Why is it that if I have a relationship called business and a method called isBusiness everything fucks up like this? The short answer is Key Value Coding. To quote the documentation:

For properties that are an attribute or a to-one relationship, this requires that your class:

  • Implement a method named -<key>, -is<Key>, or have an instance variable or _<key>.
  • If the property is mutable, then it should also implement -set<Key>:.
  • Your implementation of the -set<Key>: method should not perform validation.
  • Your class should implement -validate<Key>:error: if validation is appropriate for the key.

I’m fine in that Core Data lives a world of Cocoa and KVC, and there are certain names I should avoid (like naming an attribute of an Entity “description” or what not). What I would like however is some kind of warning that the method I’m implementing or the name I have chosen is a bad idea. The lack of feedback from the system (no complier errors were generated, no exceptions were thrown, no runtime errors logged to console) was really frustrating for me.

I’ve post a bug in radar (#7848360) and have a sample project if you want to see the carnage for yourself.

Here’s to hopping the rest of my Core Data conversion goes smoothly. :)

Posted on: April 9, 2010 – 8:32 PM | Comments (1)

Still missing: App Store Refunds

With the iPad, application functionality and prices are increasing. Sadly however the App Store program still has no concept of a demo period or a refund. Swallowing $1.99 on a bad buy isn’t too bad for a user but when apps start costing $50 there is a huge leap of faith that this app will work for them.

Officially the App Store is a no refund zone, all sales are final. You can however fight through a few layers of the iTunes customer support system and eventually get a refund. I recently did so for a $9 game I bought and found unplayable 5 minutes in. They did say in the email however:

Please note that this is a one-time exception, as the App Store Terms and Conditions state that all sales are final.

Related is the recent news that OmniGroup is now extending their previous 30-day refund policy of desktop software to iPad/iPhone software.

Starting today, we are offering the same 30-day money back guarantee on all of our iPhone and iPad apps as we do with our other software. This applies to OmniFocus for iPhone, OmniGraffle for iPad, and OmniGraphSketcher for iPad. If you find that you’re unsatisfied with your purchase, email sales@omnigroup.com with a copy of your App Store receipt and the reason for return, and we’ll refund your money.

Keep in mind if you bought a $50 app from Omni and they give you $50 back they are losing the $15 that Apple got from the sale and still has. Since Omni wouldn’t have access to the credit card transaction there is also a lot of manual labor involved in cutting checks or issuing PayPal payments.

All in all, the lack of proper demos and refunds in the App Store sucks. I was really hoping to see some news on this at yesterday’s Apple event but no luck.

Posted on: April 9, 2010 – 2:35 PM | Comments (0)

March 2010 Recap

In the spirit of sharing the ups and downs of running a small “indie” software company, this is the first in a series of recaps of what Clickable Bliss did last month (March 2010) and the goals for next month (April 2010). It’s a bit long but on the bright side that means I did a lot of stuff. :)

Events

ProfitTrain 2.0 Released!

March started off with a bang as we had the official release of ProfitTrain 2.0 on March 1st. Throughout the month we issued a few dot releases to kill some bugs but overall the release went smooth. The shipping version currently stands at 2.0.7. To see what’s been fixed check out the release notes.

Marketing

Press Releases

When you have a new application, or a significant upgrade, one of the most basic things you can do to help promote the launch is to write a press release. This is the press release I used for the 2.0 release. Overall it’s pretty standard stuff but a few things to note:

  • I included a custom NFR serial number right at the top that is made specifically for the press outlet I am sending it to. Some people write in their press release that NFR serials are “granted on request”. I figure if I can eliminate that step all the better. Perhaps if you are posting a generic version of the PR on your site (and you should, I don’t yet) you can put that in.
  • I don’t use a bulk PR house like PR Mac but instead go through my collective bookmarks of news sites and blogs doing individual emails. The total count for this release was about 40, so it’s not too time consuming. Lots of sites are very specific about how they want you to send in press releases so pay attention.
  • For this release I actually sent the press release a week before the launch hoping to give people some lead-time and perhaps improve my chances at getting coverage. Sadly I don’t think it helped much and in a few cases caused confusion and accidental early publication. I don’t think this is something I would recommend to others.

So of the 40 or so sites I contacted how many did I get coverage from, well sadly only a few. Macsimum News, MacInTouch, Mac360 and The Loop come to mind. MacNN did news coverage of the release and then a full on review later (4.5 of 5 stars!).

Part of the issue I think is that many of these “Mac” sites just don’t cover desktop software releases like they used to. These are sites that were 100% dedicated to the Mac a few years ago and now focus on the broader “Apple Inc.”; dividing coverage between iPhone, iPad and then when there is room or something special, the Mac.

Lots of sites also forgo release news and instead like to bunch up coverage for a class of application into “collection articles” that compare similar apps that solve similar problems. I’ve seen Billable get coverage on some of the bigger sites through articles like this so hopefully in time ProfitTrain can get some too. It’s not the end of the world if the big sites don’t cover the release of your app as much as you know they know it exists.

TidBITS

If you don’t know what TidBITS is, shame on you. TidBITS is a great Mac-focused newsletter that has been running since 1990. I’ve been an avid reader since I can’t remember when. Anyways, TidBITS has a number of advertising options but one that I used for Billable a while back and now again for ProfitTrain this past month is DealBITS. DealBITS is basically a contest where you get a little write up in a TidBITS issue, a drawing is held, you give out some free copies of your software and when the winners are announced in the next issue you get to offer a coupon code to the readership at large. There is a flat fee of $250 to run a DealBITS contest and I suspect Adam and company will want to bless your app as worthy too.

For me the ProfitTrain DealBITS response did not match the response I got for Billable’s DealBITS back in January 2007. Perhaps the TidBITS readership isn’t as active as much as they use to be, or perhaps it’s part of that attention split between the iPhone/iPad vs Mac that I talked about earlier. That said, sales via the coupon code more than covered the cost of the contest so really I’m getting paid to advertise my product. Nothing wrong with that.

Apple’s Third Party Promotions (aka The Source)

For those not in-the-know, if you are an employee of Apple Inc. (including international and retail employees) you have access to an employee-only intranet site called The Source. This is a place where third parties can promote their products and services to Apple employees usually offering them at a heavy discount if not for free.

If you are a developer you want your software to be listed here — hopefully the reasons are obvious. I don’t have any personal knowledge of the ratio of discounted vs. free listings on the site but considering it cost me $0.00 to make a serial I go the free route and offer a complimentary license to ProfitTrain for all Apple employees.

To get you own product listed send an email to thirdpartypromos@apple.com. They will send back a list of questions to answer including details about your product and how you want the discount to work. For me, I made a special page in my store software and allow the employees to use their email as the verification of employment. I generate the complimentary serial info and send if off to the email they provided.

It will take some time for the listing to actually show up so be patient. You’ll know it’s up when you see the wall of order emails flood in.

Newletters

So far I’m keeping good on my goal to send out monthly newsletters. This month’s newsletter was sent out on March 3rd and was mostly promotional of the ProfitTrain upgrade that was now available. It was very exciting to see a wave of upgrade orders minutes after I hit the send button. I also continue to play with the format and in this issue included some recommendations for other software subscribers might also enjoy.

Development and Education

The move to 10.6

ProfitTrain development was started before the release of 10.6. When 10.6 did come out I installed it on a partition for testing but actually continued to live and develop ProfitTrain on 10.5. To date all shipping copies of ProfitTrain have come from a 10.5 system.

Well with some extra time after the big release I finally took the plunge this month and moved all my tools over to 10.6. The current trunk of ProfitTrain is now building under the new version of Xcode w/ gcc 4.2 (though it did take a little bit of coaxing). I still link against the 10.5 SDK so I can’t take advantage of all the new 10.6 APIs but still some of the tool improvements are nice to have.

The other benefit of the move is the ability to run some of the newest apps like Acorn 2, LadyBugz and other super secret apps that only run in 10.6.

The only negative thing I will say about 10.6 is the QuickTime player. Wow, do I hate the new QuickTime player. Thankfully the old style player was an optional install or I’d be really frustrated.

iPhone Classes

While most of my “code time” is focused on the 2.1 release of ProfitTrain I am trying to take some time and catch up with the iPhone SDK. Part of this has been watching and doing some of the homework assignments of the the Stanford iPhone course on iTunes U. I think I have about 6 videos left to watch to finish the course and it has really been informative. Of course the long term goal is to possibly offer a companion app for ProfitTrain on the iPhone/iPad and while that is still a long ways away watching the classes now is helping me make decisions that will help in the long term.

Core Data

In early February I posted some thoughts on the blog about why ProfitTrain doesn’t use Core Data. The short summery goes like this: I felt a little burned by Core Data from my 10.4 days. When I started working on ProfitTrain there was no Core Data on the iPhone. Long term I knew I wanted to do stuff on the iPhone so I wanted to be more comfortable with dealing with SQLite directly and thus ProfitTrain does this.

Today is a new day, Core Data is now prevalent on all Apple platforms, what to do? Well the first step was to purchase and read the Core Data book from the Pragmatic Programmers. Overall I liked the book. It has for now made me more hopeful that the the migration tools of Core Data will let me do what I want.

Second, do some experiments. To help test Core Data I created a mirror of the ProfitTrain model tree using Core Data and made a bunch of unit tests against it. Overall the tests are working well though I have had some issues pop up.

Third, make it clean. Back in my Billable days I used Core Data and ended up with lots of repetitive code to do things like fetches and build up the core data stack to do migrations, unit tests, etc.. It was ugly code. I don’t want to do it that way again. I was very thankful to find this post from Martin Pilkington that goes over a design patter that uses a ModelController. I love this idea. It fits right in with what we see a lot in the iPhone SDK. Very specific, reusable controllers. I’ve built on Martin’s implementation in my own code to help with some things like unit testing that should use in-memory stores but overall my model controller is similar to that example.

So with all this said, do I migrate ProfitTrain to use Core Data? Right now it seems like the answer is yes but this is more for future proofing than a real benefit to the desktop app today. Long term moving the models over to Core Data will help with the iPhone and iPad as Core Data has nice tools for faulting objects and relationships only when they are needed. The ability to load and unload as memory constrains dictate will be very helpful.

The other reason for making the move now rather than later is AppleScript. I really want to implement AppleScript in ProfitTrain and if I were to make my non-core data models scriptable and then eventually move them over to core data I would have to rewrite a significant chunk of that code.

I’m sure I’ll have more to say about this next month but this is where I stand today.

Goals for April

Marketing Goals

  • I’m in the brainstorming phases of a rather big marketing idea. I’ve started to seed the idea out to other developers as this is a group project not just me. For April I’d really like to solidify my idea and maybe pull together a prototype website to demonstrate it.
  • I’d like to start to spend a little money advertising ProfitTrain on networks like Fusion but before I so I’d really like to add some code to the store that would help me track if ad activity actually results in a sale.
  • I would also like to put together a RFP (Request for Proposal) to hire some designers to work on some new invoices templates.

Development Goals

  • I want to finish the migration of ProfitTrain over to Core Data. This is already in progress and is actually in tandem with some other refactoring I’m doing trying to simplify my AppController and clean up the MainMenu.xib (which houses windows which need to move to their own independent window controllers).
  • Once the Core Data migration is complete I want to get started on the AppleScript implementation and related scripts that will help ProfitTrain interoperate with others applications.
  • One of the long term goals for Clickable Bliss this year is to launch a second product. I have the spark of an idea but still am not sure how it will materialize. This month I’d like to do a few experiments to see how certain features could be implemented.

Education Goals

  • Finish the Stanford iPhone Class (already in progress).
  • I still use Subversion for my projects. It actually works great for me, but I keep getting the feeling that I really need to start to become comfortable with the distributed systems long term. This month I hope to catch up with Mercurial and read the Git book.
  • In coordination with my plans to prototype a web app I also hope to use the time to catch up with the changes in Rails 3 as well as some of the UI tools in Cappuccino.

I hope you enjoyed this recap post. I write it as much for my future self as I do for the blog.

Hopefully doing these recaps will help to keep myself personally focused on how I spend my time. I also hope these recaps help the community understand that gears are turning behind the scenes even though they might not see a new release in any given month.

Posted on: April 1, 2010 – 11:28 AM | Comments (0)

ProfitTrain now listed in Bodega

For those who might not be aware, Bodega is an application that acts as a store front for other Mac software. It’s not a controlled system like Apple’s iPhone App Store, but more of an open white pages that catalogs desktop applications.

Bodega

You browse applications via categorized listings or collections such as the staff picks. If you buy the software the transaction goes through the developer’s online store and then Bodega helps the user keep track of receipts, downloads and versions.

I’m very happy to get ProfitTrain listed in Bodega. If you are interested in Bodega I encourage you to check it out. It is a free download at appbodega.com.

Posted on: March 9, 2010 – 2:25 PM | Comments (2)

iTunes U iPhone Classes

This is probably old news for most people but I personally started watching the latest videos and wanted to share.

On the iTunes Store there is a section called iTunes U. Inside you’ll find lots of channels hosting free educational content. One of the more popular channels since iTunes U was introduced has been the Stanford iPhone course.

This course has been ran for a few semesters now. It assumes basic knowledge of OOP. The first few classes get you up to speed with the Objective-C language and the rest jump right into the iPhone SDK. It’s a very well done course and if you are looking to get started a terrific resource to check out.

Huge note here: they seem to remove the files once the class is done. So if you are interested be sure to stay subscribed and download all the files before the class is over. The public class website talks of final projects being reviews on Thurs 3/18, so if you are interested in this class get those downloads started before they disappear.

Posted on: March 6, 2010 – 6:55 PM | Comments (0)

« Older posts /