iPhone Push Notifications with JavaPNS on Google App Engine

There have been several issues with getting JavaPNS working on Google App Engine. These included:
1) GAE didn’t support sockets or SSL
2) GAE doesn’t support signed jars, the BouncyCastle cryptography library is signed
3) GAE is transitioning to Java 7, and Java 7 has issues reading .p12 certificates

These instructions are for JavaPNS 2.2 and GAE 1.7.7, things may change on both fronts to make things either easier or harder.

1) GAE didn’t support sockets or SSL

With the arrival of GAE 1.7.7 sockets and SSL are now fully supported:
http://googleappengine.blogspot.com/2013/04/app-engine-177-released.html

2) GAE doesn’t support signed jars

Remove META-INF/MANIFEST.MF from the latest BouncyCastle jar or download my modified jar of BouncyCastle 1.48

3) Java 7 has issues reading .p12 certificates

a) Generate your .p12 certificate as per Apple’s instructions

b) Install Java 6 JDK

c) Use Java 6’s keytool to convert the .p12 to a .jks

keytool -importkeystore -destkeystore CERTIFICATES.jks -srckeystore CERTIFICATES.p12 -srcstoretype PKCS12

d) Configure JavaPNS to use the .jks format instead of .p12

boolean production = false;
String device = "DEVICE_ID";
String keystore = "CERTIFICATES.jks";
String password = "PASSWORD";
String message = "Hello JKS";

AppleNotificationServer jksServer = new AppleNotificationServerBasicImpl(keystore, password, ConnectionToAppleServer.KEYSTORE_TYPE_JKS, production);
PushNotificationPayload payload = PushNotificationPayload.alert(message);
PushNotificationManager pushManager = new PushNotificationManager();
pushManager.initializeConnection(jksServer);
List<PushedNotification> notifications = pushManager.sendNotifications(payload, Devices.asDevices(device));

Thanks to Palomino Labs Blog for the hints about Java and .p12 files:
http://blog.palominolabs.com/2011/10/18/java-2-way-tlsssl-client-certificates-and-pkcs12-vs-jks-keystores/

List Apps To Update After Moving iTunes App Store Countries

I moved my iTunes account from one country to another recently as I am about to move. An annoying thing is iTunes doesn’t know how to update apps that you’ve downloaded from a different country, even though if you download it manually again you get the app for free. It works on the iPhone/iPad, so its really something they should fix in iTunes.

If you have OCD like me it can be very annoying to constantly have a (1) or something by the Apps, meaning you have Apps to update. I recently worked out where this information was stored, and came up with a relatively quick way to update these apps.

1) Open Terminal.app

2) Run the following command:

grep --binary-files=text -A 1 "<key>title" ~/Library/Preferences/*.iTunes.plist

3) Find those apps in iTunes and right click them -> “Show in iTunes Store”

4) Download the app again, if you bought it before it will say something like “This update is free because you have already purchases this app”.

5) After you’ve updated it once, it remembers that you’ve downloaded it from the new country and it can automatically find the update as per usual.

Note: Be careful because if an app has been removed from the App Store altogether, iTunes will sometimes redirect you to another app from the same publisher. This happened to me, I was redirected from the free (discontinued) app to the paid version, and thinking it was the same app I bought an app I didn’t mean to.

DynDNS via curl on Apple TV 2

1) Copy this script to /var/root/dyndns.sh

#!/bin/sh
if [ ${ip=$(curl -s ifconfig.me)} != ""$(cat ~/.dyndns.ip) ]; then
curl "http://USERNAME:[email protected]/nic/update?hostname=HOSTNAME&myip=$ip&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
fi
echo $ip > ~/.dyndns.ip

2) Edit USERNAME, PASSWORD and HOSTNAME for your DynDNS account

3) Check it runs /var/root/dyndns.sh

4) Copy this script to /Library/LaunchDaemons/dyndns.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>dyndns</string>
<key>ProgramArguments</key>
<array>
<string>/var/root/dyndns.sh</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
</dict>
</plist>

5) Run launchctl load dyndns.plist

6) Run launchctl start dyndns

Notes:
– You can adjust the interval so that the script runs more frequently than every hour by modifying the 3600 seconds
– If you want to update multiple hostnames you can put them in a comma separated list
– For more information on DynDNS see:
http://dyn.com/support/developers/api/perform-update/

Google DFP with Appcelerator Titanium

I’ve been using Appcelerator’s Titanium to streamline mobile development for Android and iPhone. They have a module for doing Admob ads but there Double Click for Publishers (DFP) module is only available to enterprise customers.

However, as long as you don’t need the DFP’s multiple sizes and just want custom campaigns with Admob backfill, you can use their current free Admob module.

Initial set up
1) Get Titanium’s Admob module here:
https://marketplace.appcelerator.com/apps/795?1803788439

2) In DFP go to your inventory and create mobile ad units for each size of ad you want to server in your app.

3) In your app set the publisherId to the id of your DFP adunit (normally it’s the publisher id from Admob)

var Admob = require('ti.admob');
var adunit = '/123/App320'; //Get this from your inventory in (2)
var adview = Admob.createView({
adBackgroundColor:'black',
primaryTextColor:'blue',
secondaryTextColor:'green',
publisherId:adunit,
width:320,
height:50,
bottom:0
});

Admob backfill
4) If you haven’t already set up an Admob account at http://www.admob.com and create your app to backfill DFP with.

5) Go to your orders and create a new order and line item:
– Enter the inventory sizes you want to use in your apps
– Since you probably just want to back fill almost always, set an end time far in the future
– Likewise set the quantity of your impressions to really high
– Set a low non-zero CPM value so that your ads actually show up
– When you click save, if you need to check “overbook” then do, it just means no one is viewing your ads yet

6) Add the inventory items you created in DFP previously (2)

7) For each ad size add an Admob creative entering the publisher id you created in (4)

Custom campaigns (optional)
If you want to put your own ads in or run custom campaigns for clients

8) Create a new line item in DFP. This can be under the same order you created before since you can use a different CPM value, or you can create a new order to keep things separate.

9) Again select the ad sizes and and adunits you want to use

10) Set the CPM, impressions and time period that your client is paying for

11) Add a new creative with the images or HTML that you want to display

* Note, unlike backfill with Adsense, in backfill with Admob DFP doesn’t know how much advertisers are bidding, so if you run custom campaigns you’re competing with the manual price you entered in (5), not the price that Admob advertisers are paying. However normally this isn’t an issue since if you’re doing custom campaigns they are hopefully bidding quite a bit higher than Admob for it to be with it. See the link below:

https://support.google.com/dfp_premium/bin/answer.py?hl=en&answer=2549435

Alternatives to Google Apps

Google recently announced the very sad news that they were suspending the free version Google Apps for businesses. Here are some alternatives:

1) Microsoft’s outlook.com

Using domains.live.com you can map your domain and get up to 500 free email addresses.

2) Zoho mail

Zoho mail have a free version avaliable

3) Google Apps for Education / US Non-Profits

If you are an educational institution of US based Non-profit you can still get Google Apps for free

4) Google App Engine + Google Apps

Google App Engine still requires Google Apps to map domains. They’ve still kept a free version with which you can get a single account. You can probably still use multiple email addresses using catch-alls or with Google App’s “groups” feature, enabling anybody on the internet to post. You can sign up for that at the following link, but they check that your referrer is https://appengine.google.com

https://www.google.com/a/cpanel/standard/new3?refererName=AppEngine

The case for wired keyboards

A lot of things are moving to being wireless, and Apple even discontinued their compact wired keyboard all the way back in 2010. But I’m still using mine.

Sure it does make the desk setup neater if everything is wireless, but I still need a wire to charge my phone and sync it fast (wireless syncing in iTunes is still quirky) and you have the hassle of constantly changing batteries. I’ve been using rechargeables for a while, which save money and the environment, but its still a pain. USB keyboards also help when trying to access boot options to have a wired keyboard.

I’ve been using a wired keyboard for a while, plugging my phone in to one of the USB ports to charge and sync it. That still left my magic trackpad needing to have batteries. I tried to build my own USB power similar to this one, but after failing bought a Mobee Power Bar and leave it plugged in the other USB port all the time, and now have a really neat setup with no batteries:

Cornerstone vs. Versions vs. SmartSVN

There are a few different reviews/forums comparing Cornerstone and Versions, but some are out of date, and I really had to try them to really see, so I thought I’d chime in with my opinions. I’ve been using SmartSVN for a while, a cross platform Java SVN client. I started to think about switching though because I now deal with 20+ repositories and it was annoying having so many windows open, since SmartSVN needs a separate window for every repository cannot organise different projects in folders in a single window. I thought it might also be nice to have a native Mac client.

UI
Versions has the better UI, it looks better, and overall has more consistent buttons. Cornerstone is inconsistent with some commands on the toolbar, some on the bottom bar, and some accessible by right clicking. SmartSVN has a more old fashioned UI with simple list like tables and layout rather than

While versions has the better UI overall, it has no built in diff and has a weird feature that when you remove a working copy from the app it prompts to remove the files, which is a bit dangerous and unnatural in my view. It also nests working copies inside the repository tree, which means the overview of all repositories isn’t as good as Cornerstone.

Log/timeline
They all have a log built in, but Versions with its more thought out UI displays this information clearer, and shows changed files. Cornerstone folds up the changed files so you have to click to reveal, and SmartSVN as I said before is less modern and just has a table with all log messages, and another panel to display details.

Recursive Commits
This is actually the main thing I will miss from SmartSVN. SmartSVN had a much smarter recursive commit mode than either Cornerstone or Versions. SmartSVN would:
1) Add unversioned files / delete missing ones
2) Allow you to select which changes you want to commit
3) Only mark the files you select as added and deleted
4) Show a separate diff panel that requires only a single click to show (Cornerstone requires you to click back after each diff preview)

Of these (3) is the key. While Cornerstone prompts you if you want to add unversioned files, it adds all the files first and then prompts to select if you want to commit them, as I mentioned SmartSVN will only add them after you select them. This means you then have the laborious step of going back and reverting the local adds that it did. But still this is better than Versions that has no recursive commits.

Summary
I think I will switch to Cornerstone since having a single window helps so much, and being able to see an overview of all repositories has already showed me missed files that I thought I had previously committed. But there will be more clicking while committing, because SmartSVN is the best there. I wish I could use Versions because its prettier, but just doesn’t cut it for me functionally.

Cornerstone Versions SmartSVN
Native Native
+2 Single Window + Folders +2 Single Window + Folders +1 Single Window
+1 Recursive Commit +2 Recursive Commit
+2 Overview all respositories +1 Overview all respositories
(More items in tree)
+1 Pretty log +2 Beautiful timeline
+1 UI +2 UI
Built in diff Built in diff
-1 Bad remove working copy UI
Mac Mac Mac/Window/Linux
$59 $59 $79