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):