Find the length of the loop

One of the popular interivew tasks…

You are given a head of a linked list. Its known list contains cycle. The goal is to determine the length of the loop.

Here is straghtforward solution in haskell

{-
data Node a
instance Eq a => Eq (Node a)

next :: Node a -> Node a
-}

data Phase = TryFindLoop | FindLength deriving (Eq)

loopSize :: Eq a => Node a -> Int
loopSize a = slowAndFast a a 0 TryFindLoop
  where slowAndFast :: (Eq node) =>
                       Node node -> Node node -> Int -> Phase -> Int
        slowAndFast slow fast len phase =
          let nextSlow = next slow
              nextPreFast = next fast
              nextFast = next nextPreFast in
          if (slow == nextPreFast || slow == nextFast) then
            if (phase == FindLength) then
              if (nextPreFast == nextFast) then 1
              else
                2*(len+1) - len - (if slow == nextFast then 0 else 1)
            else slowAndFast nextSlow nextSlow 0 FindLength
          else
            slowAndFast nextSlow nextFast (len + 1) phase

Complexity: time o(n), memory o(1)

Run automation instruments script from the command line

To run ui test from command line you can use instruments app as described here.

  instruments -w deviceID -t defaultTemplateFilePath targetAppName \
  -e UIASCRIPT scriptFilePath -e UIARESULTSPATH resultsFolderPath

The problem is defaultTemplateFilePath depends on xcode version. Documentation says Automation.tracetemplate is located here :

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate

Since xcode 6 Automation.tracetemplate can be found:

/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate

Multi-queue replacement algorithm for second level buffer caches

I have read a nice article written by Yuanyian Zhou and James F. Philbin “Multi-queue replacement algorithm for second level buffer caches”. Authors compares well known implementations LRU, MRU, LFU etc and introduces new, more efficient method based on multiple queues, which performs better than other described implementations.
I highly recommend to read it.

List non latin file names in git

Imagine you have commited file which name contain non latin letters.

git init test-repo
cd test-repo

echo "test" > тест.тэхэтэ
git add .
git commit -m "initial commit"

Ok, lets list files changed at revision

git log -p

Here you can see escaped file name, and obvious its hard to read.

diff --git "a/\321\202\320\265\321\201\321\202.\321\202\321\215\321\205\321\215\
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ "b/\321\202\320\265\321\201\321\202.\321\202\321\215\321\205\321\215\321\202
@@ -0,0 +1 @@
+test

To handle this case there is config options ‘core.quotepath’ The documentations (man git-config 1) says:

Export files changed at revision from mercurial

Sometimes (more precisely - rarely) you need to export files changed at given revision as directory tree instead of patch file.

Mercurial vcs has archive command which let you to export selected files at given revision:

hg archive --type files --rev $REVISION -I list_of_files

To list files changed at revision:

hg log -r $REVISION --template '{files}\n' | sed 's/\n / -I /g'

Here end of line character is used to handle the case of using space character in filename.