404

Page not found.

Using iOS7? Then MoneyStats V2 is just for you!

MoneyStats v2 Screenshot

MoneyStats v2

Finally after a long time and having used iOS7 for a while getting a feeling for its new design approach for apps, MoneyStats V2 was just released in the AppStore bringing more than just a new design for iOS7.

Of course the new design was one of the major challenges, but I think that the app just got better by adapting the new design. I am eager to get your feedback.

But here is the complete list of changes:

  • Complete Redesign for iOS7
  • New Report Type: Stacked Barchart
  • New Report Type: Line Chart
  • Categories now can have custom colors for a better overview
  • MoneyStats now supports Landscape Mode
  • Improved transaction list overview

The update is free for all current users so go an grab MoneyStats in the AppStore. Due to my lack of time at the moment the app is updated, but the website found at – is still not yet refreshed. However there will be a small overhaul during the holidays, so stay tuned…

 

The all new version 1.2 of MoneyStats is here

 

MoneyStats ScreenshotAs of today, after a long while the new version of MoneyStats is available. It took a little longer than expected as my little daughter has a far higher priority :-D .

However, there are some cool, new features:

  • Greatly improved UI with a new sidebar navigation
  • More intuitive usage of favorite Transactions
  • Only future transactions based on a recurring Transaction can be deleted, therefore keeping all transactions to date
  • Import from various CSV Formats
  • Export to CSV to iTunes Documents and E-Mail

 
 
 

Of course some bugs were fixed, too:

  • Fixed a bug where it was sometimes not possible to enter a note for a Transaction
  • Fixed a bug when displaying Bar Charts
  • Minor translation improvements

I hope you enjoy the new version and I appretiate your feedback.

Working with favorite Transactions in MoneyStats

MoneyStats Icon The new version of MoneyStats will be released in a few days and besides the possibility to add glyphs to Categories for better recognition and a new transaction list design, the new version supports the use of favorite Transactions.

What are favorite transaction? The feature was actually missed by a user who wanted to have a set of Transactions which share the same data but which are not recurring in fixed periods of time.

A favorite Transaction fills this gap. You can mark a Transaction as being a Favorite when editing the Transaction. Afterwards you can tap the Star-Symbol in the Transactions-List so that only favorite Transactions are displayed. If you now tap one of the Transactions MoneyStats asks whether you want to create a new Transaction which has the same data as your favorite Transaction.

Deleting all Recurring Transactions in MoneyStats
 

MoneyStats IconAfter releasing MoneyStats, one interesting question was: How do I delete recurring Transactions after they were created?

Nothing easier than that. If you delete a recurring Transaction, MoneyStats asks, what to do with Transactions which are derived from the recurring Transaction which is about to be deleted.
You have the option to delete all derived Transactions or keep them. One feature, which will be added in one of the next versions is to delete only the derived Transaction which have a future date.

MoneyStats: Booking Date vs. Availability Date

MoneyStats IconMoneyStats supports adding two dates for every transaction. You can enter a booking date and an availability date.

While the app’s reporting system uses the booking date by default for reports, it will use the availability date if you configure to use the availability date in the app’s settings.

Now, what is the purpose of having the two dates?
As the app idea was originally born out of our own need, we have a specific use case, which I wanted to adress. In Germany we get our loans by the end of a month. However, although we get the money by the end of each month, we spend the money in the next calendar month. On on one hand, I want to track when the money was booked, but I also wanted my reports to take the money into account for the next month. In this scenario, I set the booking date to date when the money was received, but the availability date is set to the first day of the next month.

This feature is optional and if you do not want to use it, just ignore the availability date and keep the settings on using the booking date.

MoneyStats finally released on Apple’s AppStore

MoneyStats IconFinally, after one and a half years of spare time development, MoneyStats was finally approved by Apple and is available in Apple’s AppStore.
MoneyStats is a simple app which allows entering and analyzing your finances – you can even use it to track your budgets. The main focus of the app is on

  • Easy of Use
  • Fast addition of new transactions
  • Support for powerful recurring transactions
  • Support to generate your custom visual reports

Your data is stored on your device using Apples encryption mechanism where applicable. Your data is not stored on or downloaded to any server, so your data resides on your device.

If you use the password restoration feature, you will receive the password by mail. As no one can guarantee that the password is safe after being sent by mail, you should change your password in the app immediately after having received the password mail.

If would like to share your feedback or suggestions or questions, please feel free to contact me on the MoneyStats Website or on Twitter. I will try to answer every question in time.

During the next days i will post some infos and tips regarding MoneyStats features. So stay tuned…

What is most frustrating after have your App in Apple’s AppStore?

MoneyStats IconAfter a long time and getting a sweet little daughter, I will  continue writing this blog. I will share my latest thoughts on several topics regarding iOS and my App MoneyStats, which finally made it into Apple’s AppStore.

Please have a look in the AppStore.

However, even if the app was approved by Apple today (yay), another version was already approved by the beginning of January. Being happy about the approval and the release of the first app, I wanted to see how it looks in the AppStore. A quick search for the former name “MoneyTrails” caused frustration as another company registered a trademark with an extremely similar name just three weeks before approval… So finally I had to revamp the website and worst of all: find a new name. After doing some research, brain storming and much sparring with my wife (who is very critical :lol:), finally the name “MoneyStats” made it as it fits the intention of the app best. I like this name even more than the first one, as the focus of MoneyStats is much more on statistical analysis than “just” on tracking money.

So please, feel free to download the app and follow me on Twitter. I appreciate every feedback and will try to answer all question in time.

CoreData: How to revert a managed object to its original state

DatabaseIn my iPhone application I am using Apple’s database technology CoreData with TableViewControllers in a Master-Detail relationship. I am using Apple’s preferred way for iOS applications to set the managed object context and the managed object which is edited in the detail view as class members of my Detail Viewcontroller.

The fields of the managed object are displayed and edited in table cells. The viewcontroller displays two UIBarButtons named “Save” and “Cancel”. The save action is no problem as all values are stored as soon as the UITextField’s delegate method

- (void)textFieldDidEndEditing:(UITextField *)textField

 
is executed.

The cancel action was much more of a challenge. Many solutions propose to use

  1. a second managed object context which is discarded when cancel is touched or
  2. the NSUndoManager

Both are valid, but in my iPhone app where a single managed object is edited in one table view and all changed values in this single object should be reverted to the last committed values. Therefore is seems to me to be a much more light-weight approach to just overwrite all changed values with the respective values when the object was last committed.
The NSManagedObject class has two interesting properties to achieve this behaviour:

  1. changedValues and
  2. committedValuesForKeys

Having these two methods, it is quite easy to revert an object to its last commited state. I developed a Category for NSManagedObject

to have this feature which is absolutely convenient for 90% of all my requirements in my iPhone application.

Here is the code for NSManagedObject+RevertChanges.h:

  1. #import <foundation/Foundation.h>
  2. #import <coredata/CoreData.h>
  3.  
  4. @interface NSManagedObject (NSManagedObject_RevertChanges)
  5.  
  6. - (void) revertChanges;
  7.  
  8. @end

 
And this is the code for NSManagedObject+RevertChanges.m :

  1. #import "NSManagedObject+RevertChanges.h"
  2.  
  3. @implementation NSManagedObject (NSManagedObject_RevertChanges)
  4.  
  5. - (void) revertChanges {
  6.     // Revert to original Values
  7.     NSDictionary *changedValues = [self changedValues];
  8.     NSDictionary *committedValues = [self committedValuesForKeys:[changedValues allKeys]];
  9.     NSEnumerator *enumerator;
  10.     id key;
  11.     enumerator = [changedValues keyEnumerator];
  12.  
  13.     while ((key = [enumerator nextObject])) {
  14.         NSLog(@"Reverting field ""%@"" from ""%@"" to ""%@""", key, [changedValues objectForKey:key], [committedValues objectForKey:key]);
  15.         [self setValue:[committedValues objectForKey:key] forKey:key];
  16.     }
  17. }
  18.  
  19. @end

 
You just have to import the header file in your ViewController class with

#import "NSManagedObject+RevertChanges.h"

 
and you have the method at your fingertips.

Please, feel free to use the code, but any comment is welcome on this approach.

Unable to update to Xcode 4.0.2 from Mac AppStore

XcodeI am currently developing an iPhone App called MoneyStats and this one will be my first app to be submitted to the AppStore. Since I am developing for iOS in my free time, progress takes a while. Therefore I am waiting for the App to be in a state which makes sense to submit to the AppStore before I subscribe for the Apple Developer Program.

So my only way to get hands on Xcode 4 is to buy it from the Mac AppStore. That is where my problems started. When trying to update to Xcode 4.0.2, the AppStore always stated “Ihr Kauf konnte nicht abgeschlossen werden – Xcode is already installed on this computer. Choose Software Update from the Apple menu to check for available updates.” Yes actually this was a mixup of languages, basically the german part means “Your transaction could not be finished [...]“.

After deleting the “Install Xcode” Application from my mac and completely uninstalling Xcode by calling

$ sudo /Developer/Library/uninstall-devtools -mode=all

in the Console, the problem still persisted. As all my efforts could not solve the problem, I was not very eager to contact Apple’s support as of my earlier experience with the so-called “support” other companies offer. Well, however, as it is with support, you first have to do the basic stuff, even if you already did it many times. So the standard tasks had to be done againlike

  • read Apple’s support pages
  • delete the misfunctional app from the Programs folder
  • restart your computer (a classic one)

but none worked. Well, after almost giving up and waiting for a response from the support, I accidentally came across the solution when I set up my brand new QNap-NAS:

I found a backup copy of the Application “Install Xcode” in one of my document folders and then it struck me like thunder. Even though this files was not link either by a symbolic link or a hard link in the Applications folder, this was the reason why the update did not work. It seems as the AppStore does not only look in the Applications folder for installed apps at least when updating, but also on other folders – at least it found it in my personal folder.

After deleting the file everything worked fine. I could update, download and install the new version without issues!

I have to say one last word about Apple’s support. They actually did not really help me and I forgot to tell them that my problem was solved, but I appreciated it very much when one of the support staff asked about the status of my ticket and if it still persistet. I know support staff from other companies who do not even pretend to be interested in a solution to my problems.

Creating symbolic links in every folder of a folder structure

Tux IllustrationI had the following situation with this folder structure on a linux machine.

- /var
  | www_main
  | www_1
  | www_2
  | www_3

 
There were several DocumentRoots for an Apache server defined which served serveral virtual hosts. In every document root content was stored, which should be available in all virtual hosts. This is a hell of a maintenace if you have dozens of such virtual hosts and have to update the content. A solution is to work with dynamic links. The idea is that you save the content in one main  folder (here: /var/www_main) and create symbolic links in all others.
Even then you can save much time by an efficent use of the find command in linux. Just find all folders of the first directory level below /var which have a name starting with ‘www’ and create the symbolic links to the target in every returned folder.

This is achieved by

$ find /var/ -maxdepth 1 -type d -name 'www*' -exec ln -s /var/www_main/image.jpg {}/image.jpg \;

 
Et voila.
It is no problem that the folder ‘www_main’ is included in the result of the find command.  The original files already exist there and are therefore not overwritten.
The target of the symbolic link can be a folder or a file. If you use this approach on a webserver, make sure that your server is configured to follow symbolic links.

Take care of what you are doing – it is always a security threat to allow webserver to access files and content outside of your server’s Document Root! And this happens quite fast with symbolic links!

Of course you can take this approach and actually use it for every operation you want to execute on a folder structure.