Ira Glass: On Good Taste

In this excerpt from a longer series on story telling Ira Glass talks about having good taste and growing as a creator. If you are a software developer, podcaster, if you create stuff, watch at least the first three minutes.

http://www.youtube.com/watch?v=-hidvElQ0xE

Posted on: February 5, 2010 – 9:24 PM | Comments (0)

ProfitTrain updates

The open beta for ProfitTrain continues this week with the latest 2.0b21 release. My hope is to finish up the 2.0 for official release by the end of the month so if you have some time to give it a quick beta test please do.

The help book for ProfitTrain is coming along as well. The Help Book is offered via the built-in Apple Help Book application as well as online.

Mirroring the help book online will be so nice for support emails. So many times I would have to give a blind reference to check out article X in the built-in help. It’s going to be so nice to have some real links to send people too. Not to mention how people will find answers via Google.

The latest article in the help book is Recording Expenses.

This article will give an overview of how expenses work in ProfitTrain. Using the expense record system in ProfitTrain enables you to keep track of business expenses. There are many reasons you want to do this but the main two are keeping track of the profitability of your business and recording tax deductible business expenses for your end of year tax filing.

Expenses was something I had to cut for time in the introduction screencast but I hope to do a separate screencast of it soon. Until then, this article is a nice overview.

Quick note though, there is a bug in the current build. Expense Categories you create don’t show up in the pulldowns for line items or blueprints right away. If you close and restart ProfitTrain they will show up properly so for now, please use the work around. Hope to have this one fixed soon.

Thanks again for you help and support.

Posted on: February 5, 2010 – 2:40 PM | Comments (0)

ProfitTrain tag line

In the spirit of the last post I want to talk about why I need to change the current ProfitTrain tag line. Currently on the product page it says “An invoice & accounting application for client-based businesses.” I wrote that tag line in a hurry when I was writing up the HTML. I remember showing a preview of the site to Daniel Jalkut and he commented how I should take it out. I never really followed up on that feedback but it’s clear to me now thats it’s not the right tag line.

ProfitTrain is not and will never be a proper accounting application and to call it such is disrespectful to the real accounting applications out there. This isn’t to say a small businesses couldn’t generate all the totals they need from ProfitTrain’s reporting system or exports but I think it’s only fair that we set expectations accordingly.

ProfitTrain is at its heart an invoice application. It provides various workflows to create them, to customize them, and to record their payment status.

I’m not sure what I’ll end up going with. If you have a suggestion let me know!

Posted on: February 1, 2010 – 8:52 PM | Comments (1)

Feedback wanted for Tax Report

Today I’ve been working on adding a report to ProfitTrain that would allow users to easily tally up the taxes they have collected from clients. Sadly I’ve come up with a few edge cases that make the whole thing a mess and am debating how I should move forward.

To explain, the report system asks the user for an optional date range; if none is given we process all the the objects in the system. The first question when it comes to taxes is which objects should we consider, invoices or payment transactions?

In ProfitTrain’s other reports we calculate using the cash method of accounting, which in short means we don’t consider something income until we have gotten paid. Simply sending an invoice to a client does not affect your income.

With that understood the natural progression is to base this tax report on payment transactions. We haven’t “collected” any taxes until we actually got paid. For example, you invoice a client in December but he doesn’t pay it till January; when did you collect the taxes? In January.

This works well but falls apart when an invoice isn’t paid in full and/or involves more than one payment transaction. Let’s say you invoiced a client in November, he sends a very small payment in December which might not even cover all the taxes of the original invoice. He eventually pays the rest in January but when you did your end of year totals did you consider the taxes collected? When were they collected?

For a little while I considered the idea that if we received X percent of the total due we should match that percentage of the taxes. However this is even made more complicated since not every line item in a invoice is taxable.

Yikes. The whole thing is a bit of a mess and I’m curious how other people handle it. I myself never had to charge taxes when I was consulting and while I do collect some sales tax for web-purchased software it happens all at once and at the same time of the transaction.

My gut says I’m going to have to limit my reporting to tax totals requested on invoices send in a date range but I want to hear your thoughts. If you want to keep it private please send me an email.

Posted on: February 1, 2010 – 8:21 PM | Comments (0)

Estimates & Line Item Blueprints

The ProfitTrain Open Beta started a few weeks ago. To the handful of people who have given the beta a test drive and sent in feedback, I thank you very much. Today I’m releasing another update that addresses two long standing requests I get a lot.

Estimates — There is a new invoice status called “Estimate”. When an invoice has a status of “Estimate” it will use the word “Estimate” instead of “Invoice” on the PDF in addition to hiding the invoice number.

Line Item Blueprints — Introduced a new feature called Line Item Blueprints which enable users to construct invoices from frequently occurring services and products.

Other changes and bug fixes can be found on the development release notes.

For the Line Item Blueprint feature I though it would be helpful to do a short screencast:

Line Item Blueprints Screencast (1:07)

Thanks again for your help.

Posted on: January 26, 2010 – 3:52 PM | Comments (0)

Indie+Relief Thanks

Indie+Relief

Thanks to all the developers and donators who participated in Indie+Relief yesterday.

Clickable Bliss via Billable helped raise $350 for the American Red Cross.

The project in total grossed over $143,000 for charity!

Posted on: January 21, 2010 – 4:26 PM | Comments (0)

Indie+Relief

Indie+Relief

Indie+Relief is a gathering of Mac & iPhone developers who are pledging to donate their sales on Wednesday January 20, 2010 to Haitian relief charities. Last I checked there was about 135 companies and 200 products participating. Special thanks to Second Gear / Justin Williams & Garrett Murray for putting this together

Clickable Bliss is participating and our donation will be made to the Red Cross. If you want to buy a license to Billable today and still count toward the charity please just note so on the order form comment field. I’ll post a copy of my donation to the blog after the event.

If you want to donate directly to the Red Cross you can use use their site or iTunes.

Posted on: January 19, 2010 – 2:12 PM | Comments (1)

Finding colliding category methods

So that bug I was hunting the other day turned out to be a colliding category method. It wasn’t even an obvious one, it only showed up when my app was running under 10.6 and wasn’t reproducible using a demo project that used the same code base. Apparently one of the frameworks I link against in my project (WebKit I suspect) decided to bring the MobileMe framework along for the ride. Inside of it they also have a category method called appendString: on the NSMutableData class.

objc[205]: REPLACED: -[NSMutableData appendString:] by category MobileMeNSMutableDataAdditions (IMP was 0x8ac32 (/Users/zorn/Builds/Debug/ProfitTrain.app/Contents/MacOS/ProfitTrain), now 0x92ce23bd (/System/Library/PrivateFrameworks/DotMacSyncManager.framework/Versions/A/DotMacSyncManager))

How did I find this out? Well thanks go to Dave Dribin. He suggested I run with OBJC_PRINT_REPLACED_METHODS=YES. This is an environment variable. To set it in Xcode go down the right source list and right click on your executable and Get Info.

Right click your executable, Get Info

Under the Arguments tab you’ll see a table at the bottom that will let you set environment variables.

Environment Variables

There are other useful environment variables such as NSDebugEnabled to turn on extra debug information in Foundation as well as NSZombieEnabled which will notify you when messages are incorrectly sent to deallocated objects. For more debugging environment variables, check the Technical Note TN2124: Mac OS X Debugging Magic page from Apple as well as Hidden Xcode build, debug and template settings from Cocoa with Love.

So as far as category methods go, the question remains, should you name your category methods with a namespace? I know a few Cocoa programmers who will do so. For me its something I was never excited about. It results in some pretty ugly code IMO. You end up with a list of built-in doSomething:, doSomethingElse: methods and then my own cb_doTheOtherThing:. It just looks stupid. Might have to live with the ugly for the sake of stability until they add a way to namespace these things properly.

Posted on: January 19, 2010 – 1:58 PM | Comments (3)

The glorious life of a bug killer

So there are a lot of things to enjoy while you are developing software. There are also the things that will frustrate you. The last 24 hours has leaned a bit heavy on the frustration side. A story to illustrate what us programmers go through.

So I got a crash report email about the feedback window. I needed to test and this required me to spend some time jumping from my main development system (10.5) to 10.6 (where the crash happened).

Aside: Since coming back I haven’t spent a lot of time in 10.6. I didn’t want to spend my first weeks back migrating all my stuff, I wanted to spend my time working on features and other polish.

So first things first, I test it on 10.6.0 (which shows you how long ago I’ve been here). Hit send, no crash. Upgrade the system to 10.6.2, hit send, no crash. Jump back to 10.5.8, hit send, no crash. Check email but only see a few reports and none from 10.6.

First thought is JRFeedbackController probably needs to be upgraded for 10.6. Go to the project website, see lots of changes but nothing about SL compatibility. Figure I’m going to upgrade anyways. Do the upgrade, rebuild my app, jump to 10.6, hit send, no crash. Try to check my email account for the report via my site’s webmail front end (which I rarely use) and it doesn’t work because of the tricks I play with DNS. So ok, back to 10.5.8 and Entourage to check the email. Still no report.

To recap the feedback window works fine in 10.5.8, no crash, report is sent properly via the PHP form it POSTs to. In 10.6 no crash, but no report either. I need to step through the app to see what is going on. Download and install the Snow Leopard developer tools. Make a copy of the app source try to build, lots of xib warnings about image cropping and a BIG error about a plugin I use, RBSplitView.

Basically my xib uses the class RBSplitView and the Xcode complier requires that Interface Builder on SL know about the plugin. I go into IB, tell it where the plugin is located, try to recompile, still doesn’t work. Go to the project website and grab the latest update (again, maybe there were SL changes that I need to update for). Still doesn’t work. Then find this little jewel in the support forums for the open source project:

Just to clarify with using older nib/xib files with the new plugin, it appears the difference is that the old plugin used the identifier “net.brockerhoff.RBsplitView.IBPlugin”, whereas the new one uses “net.brockerhoff.RBSplitView.IBPlugin” (notice the change in case), so IB treats them as different plugins. To get your old xib file to work, open it up in a text editor, find the “IBDocument.PluginDependencies” object, and change the plugin identifier there to an uppercase “S”, so it matches the new plugin.

Lovely. So I open up the xibs in BBEdit, do the find/replace I need and finally I get the app to build!

Aside: To be clear, I’m not trying to bash JRFeedback or RBSplitView. I love both of these open source projects. Just trying to illustrate the process I’m going through to get my stuff to work.

Over the next hour or so I debug the app, stepping through, trying to get it to output the exact POST request it is pushing out onto the web. Every time I log the post to console it’s way too short. I go a bit deeper in the rabbit hole to the requestWithURL:postForm: class method that is added via a JRFeedback category. This is the method that takes the dictionary of values of the report and encodes them for web transit. I step through this method and honestly the code looks fine. I start adding log statements to see how it progresses and what I find is that when I decode the data into a string to see how the post is looking the string will increase in length as the method processes the dictionary but when I post the string to console via NSLog its always truncated. Like it’s length will be 900 and yet on the console I’m only getting 70 characters.

The demo app for JRFeedback works fine on 10.6.2. The end result is something in my project (a build setting, a colliding category method, ???) is breaking this for me and only on Snow Leopard. I have never seen this strange NSString behavior. I really don’t know where to go next. For now I need to put it away cause it’s killing my brain.

It just really sucks though. Since I pushed out the open beta I know (via log files) that a good number of people have sent in feedback this way. Most on Snow Leopard, with no sign I didn’t get the feedback and of course no reply since I really didn’t get it.

If you have any suggestions please let me know. Thanks.

Posted on: January 15, 2010 – 9:11 PM | Comments (3)

ProfitTrain open beta is live!

The ProfitTrain open beta is live. Please go to the forums for all the information and download links. Thanks again for you help in testing.

Posted on: January 13, 2010 – 4:53 PM | Comments (0)

« Older posts /