Tuesday 19 May 2015

Some experience of releasing a Unity3D game using Google Ads plugin for iOS

Porting Unity3D game with Google Ads from Android to iOS.

Lately I've got the following scenario. There is a simple game created for Android platform with Unity3D on Windows. I wanted to help releasing the app for iOS with minimal effort, provided I have no knowledge about Android and Unity3D.

Step 1: Installing Unity3D for Mac OS X.

I downloaded and installed free Personal Edition from the Unity3D website. The latest version that I've got was 5.0.1.

Step 2: Creating an Xcode project from existing Unity3D project.

I've got a package containing the Unity3D project created on Windows and built for Android. After unpacking, I've pointed Unity Mac app to the root project folder (there was no single project file to select - all files were greyed out, which was a bit confusing). Unity have imported all the assets and opened the project window.

To target Unity to iOS platform, I went to File -> Build Settings menu. In the opened window I first tried Player Settings button, that showed me various settings for iOS project, like app icons, supported resolutions and orientations, target iOS version (it was set to iOS 6 which is quite uncommon now, so I changed to 7.1) and so on.

Then I selected iOS and clicked Switch Platform button. Unity opened the dialog saying that it is importing the assets. Then I clicked Build. In the dialog, selected destination where the Xcode project for iOS will be stored.

After successful build Unity app generated the Xcode project for iOS in the folder I've chosen. So we can leave Unity app for now and switch to Xcode. My Xcode version was 6.3.

Step 3: Building Xcode project.

The project didn't build right after opening. The reason is missing Google Ads iOS SDK library. I've downloaded the latest (7.1.0) version and added it to the project.

According to this page I made the following changes:

  1. Added the following frameworks: CoreTelephony, EventKit, EventKitUI, MessageUI, StoreKit.
  2. Set Enable Modules (C and Objective-C) to Yes in Build Settings.
  3. Added the -ObjC linker flag to Other Linker Flags in Build Settings

After that I was still having build errors due to the fact that classes under Libraries/Plugins/iOS are targeting an older version of Google Ads iOS SDK library. I've also had to remove some explicit calls of dealloc and autorelease since I'm using ARC. The code is on Github.

And here's the link to the app (U.S. App Store):

Monday 15 December 2014

Setting keyboard shortcuts for AnkhSVN

If (for any odd reason) you use Subversion as source control for .NET development, most probably you do it via AnkhSVN plug-in for Visual Studio. Most Subversion commands are accessible via Pending changes window:

or document context menu:

By default, these commands do not have keyboard shortcuts bound. The standard way to bind keyboard shortcuts to Visual Studio commands is Tools -> Options -> Environment -> Keyboard menu:

Then you need to search for the appropriate command, which is not always easy thing to do.

So here are mappings for AnkhSVN commands pictured above:

Command Location Visual Studio definition
Show Changes Pending Changes context menu ClassViewContextMenus.ClassViewProject.SourceControl.Svn.Compare
Commit... Pending Changes context menu File.CommitItem
Revert Local Changes Pending Changes toolbar Revert
Update To Latest Version Pending Changes toolbar UpdatePendingChanges
Annotate Opened document context menu EditorContextMenus.CodeWindow.Subversion.DocumentAnnotate
View History Opened document context menu EditorContextMenus.CodeWindow.Subversion.DocumentHistory

Wednesday 3 December 2014

On egg/glass_balls dropping puzzle

There is a nice logical puzzle which was mentioned as one from the technical interviews for IT people. Basically it refers to a well-known egg dropping puzzle which I first time met in slightly different formulation:

Given a 100-storey building and 2 equal glass balls. Every ball breaks when it is dropped starting from certain storey, and does not break when dropped from any storey below (this storey is equal for both balls). Find the optimal algorithm of drop attempts (i.e. algorithm with minimal number of attempts) for which it is guaranteed that this storey is determined. (Of course, we assume that a ball can be reused, but not if it’s broken.)

The way I solved it does not require any extensive calculations, that is - “pure maths” :)

We can approach the problem from the other side, and let’s consider it for arbitrary number of balls and storeys. 

For every number of balls B available and number of attempts N there exists a building with S storeys so that for N attempts we can determine the target storey, but we can’t determine it for (S+1)-storey building ("can" or "can’t" means determine it for sure, that is for the worst case using optimal algorithm). That is, we have a function of two positive integers S(B, N).

Consider the first attempt in our optimal algorithm for some B and N. There are two cases:
  1. The ball breaks at the storey. We have (B-1) balls left and the target storey is lower. That means, we may have maximum S(B-1, N-1) storeys lower.
  2. The ball does not break. We still have B balls left and the target storey is higher. That is, we may have maximum S(B, N-1) storeys.
Therefore, we’ve got S(B, N) = S(B-1, N-1) + S(B, N-1) + 1 (adding the storey from which we threw the ball).

Setting B = 1 in the formula we get S(1, N) = S(0, N-1) + S(1, N-1) + 1. Clearly, S(0, N-1) = 0 (we can’t determine any storey without balls), so S(1, N) = S(1, N-1) + 1. Since S(1, 1) = 1, we have S(1, N) = N. (This is actually quite clear without speculations provided above: having one ball we don’t have any choice other than throwing balls starting from the very first storey - otherwise, if we skip one or more and the balls breaks, we can’t know if it was that one or below).

Now set B = 2: S(2, N) = S(1, N-1) + S(2, N-1) + 1 = S(2, N-1) + N.
That is:
S(2, 1) = 1;
S(2, 2) = 1+2 = 3;
S(2, 3) = 1+2+3 = 6;
S(2, N) = 1+2+…+N = N*(N+1)/2.

Getting back to the original problem, we know that S(2, N) >= 100, but S(2, N-1) < 100, because we assume that the algorithm is optimal. From this we obtain N = 14 as the minimum required number of attempts for 2 balls and 100 storey building.

And here’s the algorithm, which can be concluded from the obtained formula S(N) = N*(N+1)/2: 
First throw should be done from the 14th storey; second - from 14+13 = 27th storey, then from 27+12 = 39th e.t.c. until the first ball breaks. If it breaks after Xth attempt, we have the target storey between the previous and the current attempt’s storeys, and the difference between those two would always be 14-X. That is, we are left with the problem for 1 ball and (14-X)-storey building, and for such case we know that we determine the target storey for not more than 14-X attempts, so adding X attempts that we already used, we always determine the target storey for not more than 14 attempts.

Using our formula we can, of course, obtain formula for B=3 balls and more.

Monday 27 October 2014

Time Machine Local Snapshots

So, I decided to install Windows 8.1 on my MacBook using Boot Camp.

First off, I had to make some cleanup on my hard drive, so I went to Finder and ditched movies and other junk to external HDD. In half an hour my internal storage looked very promising (I am going to use only Visual Studio under Windows, so 100+ Gb is more than enough):



I went to Bootcamp Assistant tool, and… it showed me that I have just 41 Gb left! What the heck?!..

Disk utility showed same figures as Bootcamp.

"About this Mac" storage view finally showed me where my space is (not my picture, but looked similar):



It turned out that those backups are local snapshots made by Time Machine. I do my backups regularly to an external drive, but turns out that Time Machine also silently saves local snapshots as long as there’s enough space for that, provided that the slider in its Preferences is in the On position:



I figured that I shouldn’t trust sliders and used the terminal:
$ sudo tmutil disablelocal

It turns out that the command does not only disables local snapshots but also conveniently removes all local snapshots. 

Monday 9 June 2014

Mundial 2014 TV Guide app got released

The app is based on "Euro 2012 on TV" app (it's not in the App Store anymore) that I developed with Oleksii Temekunidi.

Now we applied the shiny iOS 7 UI and added more supported countries. Many thanks to Szymon KataƄski for development of the server side.

Here is the link (for U.S. app store):