3G (1) 8600GT (1) AI (4) amazon (1) API (1) apple (3) apple mail (1) atlassian (1) audio (1) bambo (1) Bamboo (1) bloat (1) boost (1) bugbear (1) C++ (5) calling conventions (1) cdecl (1) chromecast (1) CI (1) compiler (1) continuous integration (1) coursera (1) custom domain (1) debugging (1) deltanine (1) diagnosis (1) diy (5) DLL (1) dns (1) don't be evil (1) ec2 (1) education (1) electronics (1) express checkout (1) fail (6) fink (1) firewire (1) free hosting (1) GAE (1) google (1) Google App Engine (4) H170 (1) hackerx (1) hackintosh (1) Haskell (3) homebrew (2) i1394 (1) icloud (2) iOS 9 (1) ipad2 (2) jobhunting (2) lag (1) letsencrypt (2) libjpeg (1) linux (1) mac (2) mbcs (1) mechanic (1) memory (1) MFC (3) Microsoft (1) migration (1) ML (1) mobile (1) movi (1) MSBuild (1) music (1) naked domain (1) NLP (2) o2 sensor (1) obd (1) Optiplex960 (1) osx (1) outlook express (1) payments (1) paypal (1) photos (2) PIL (1) Project Euler (1) projectmix (1) python (2) raspberrypi (3) recruitment (1) renwal (1) skylake (1) soundcloud (1) ssl (2) stdcall (1) stripe (1) subaru (2) supermemo (1) supermemo anki java (1) sync (2) Telstra (1) tests (1) thunderbird (1) udacity (1) unicode (1) Uniform Cost Search (1) university (1) upgrade (2) vodafail (1) vodafone (1) VS2010 (1) vs2013 (1) VS6.0 (1) weather (1) win (1) Win32 (1) Z170 (1)

Friday, 11 November 2011

iPad 2 glass digitizer replacement...

My iPad2 had an unfortunate encounter with the pavement recently resulting in a broken glass digitizer.

Replacements are readily obtainable off ebay for around $50 so I thought I would have a crack at fixing it, which is not as easy as you would hope. That's because Apple have made their best efforts in the name of built-in obsolesence and glued the screen on. This means that in a few years when your perfectly functional iPad's battery starts to fade, you'll probably have to throw it away and buy a new one because removing the screen to access the battery is a major ordeal.

I was lucky in that I did not have to worry about keeping the screen intact, since I had a brand new replacement.

I used the iFixit teardown guide, as well as some hands on support from my friend Spoonie, who had already done his own teardown -without him I'm sure it would have taken much longer.

Anyway, I discovered a few things on the way...

iFixit recommends you use a heat gun to loosen the adhesive, which helps a great deal. However, make sure it is not too hot, as the screen sits on a thermoplastic bezel, which melts and deforms if it gets too hot. I discovered this the hard way, and as a result the new screen doesn't sit flush like it should. I managed to crack my brand new screen trying to reseat it with a little too much force.

So, I have bought another screen, a replacement bezel and some proper adhesive to glue the new screen on.

Hopefully the job will be much easier the next time around!

Friday, 21 October 2011

Installing an SSD without reinstalling windows


Congratulations on receiving your new SSD disk! The best way to make use of it is to use it as your system disk and local subversion cache for lightening fast boots and builds.
It is possible to do without reinstalling windows and all your software using windows inbuilt tools such as Windows Backup and Disk Manager. This guide applies to Win2k8r2 but it might work for other OS versions

Step 1 - Install your SSD

You may need to tweak the BIOS to enable the SATA port if windows can't see the disk. Also make sure the SSD is higher in the boot priority than your existing system disk

Step 2 - Shrink your OS disk

Windows backup will only restore to a disk that is at least the same size the original volume. Delete any unnecessary files and shrink the volume using Disk Management. If you are lucky it will be small enough to restore to your new SSD. If you are unlucky there will be some unmovable files such as page files, or indexing files that prevent the disk being shrunk.
To remove the page file, disable virtual memory and reboot the computer
I found I had to disable indexing as well. Select "Indexing Options" in the control panel, remove all the folders or disks under "Included Locations". Then rebuild the index using the "Advanced" button.
Now try shrinking again. If its still to big you are out of luck, you will need to reinstall windows and all your favourite software.

Step 3 - Backup your OS Disk

Use Windows Backup or Windows Server Backup. Select Backup once and choose a custom backup - you want to select "Bare metal recovery", "System State" and your system disk (C: drive). I also has an additional partition called "System Reserved" that I backed up as well just in case. Choose a destination for the backup, either an external disk or your other internal disk and wait for the backup to complete.

Step 4 - Restore your backup

To restore a bootable system you will need to reboot with the OS install disk. I also disconnected the original windows disk just in case.
Choose restore your backup. Now at this point it failed with a cryptic message about a data disk having an active partition. This apparently was because my SSD had some stuff on it. I went to the commandline and ran diskpart clean - which deleted everything from the SSD. After that the restore proceeded successfully.

Step 6 - Reboot and enlarge your system disk

You system should reboot successfully and super quick thanks to the new SSD, but because you shrunk the windows partition in step 2 there may be some unallocated space on the disk. Use diskmanager to enlarge your c: partition and reclaim this unused space.

Step 7 - Enjoy your fast booting computer and lightning quick build times

I hope this guide was useful.


I initially had a problem when I reconnected my original HDD with the OS on it. My dell optiplex 755 didn't remember that i changed the boot order, booted off the old disk and screwed the startup for the SSD. I suggest reformatting your original HDD to remove all trace of the OS before restarting with it connected to your computer.

Alternatively you may prefer to use the free disk migration utility from Intel

However, this will not work with server grade OSes like Win2k8

Thursday, 1 September 2011

Project Euler Problem 2

Due to my upcoming redundancy, I thought it is about time I learned  some new skills, so naturally I have chosen to learn a language with virtually zero commercial application - Haskell.

If you don't know what Haskell is, it's a functional programming language, which means that is it it deals with what to do, rather than how to do it, as most people are used to with typical procedural languages such as C.

Anyway, a good way to learn a new language is to try it out on some classic problems, such as those on the Project Euler page.

Problem 2 states:

The fibonacci sequence starts with 0, 1.. then subsequent entries are constructed by summing the previous two entries. This conveniently recursive definition can be specified in Haskell recursively, ie:

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)

So the first step in solving this problem is to generate a list of fibonacci numbers... which is very easy to do using Haskell's list comprehension feature:

[ fib x | x <- [0..] ]
This basically says construct a list by calling the function fib x, where x is bound to the range of numbers from 0 to infinity. Infinite lists are a quirky feature of Haskell made possible by its use of lazy evaluation,  which means Haskell will defer actually calculating a result until it absolutely has to. The above expression will keep printing the list until the cows come home, but you will notice that after around 30 elements it gets slower and slower...

This is because it is fiendishly inefficient, having to recalculate each entry in the list from scratch, rather than re-using the previous two entries calculation. Clearly, this approach will not satisfy the Project Euler criteria that the solution should take less than a minute to run.

A new approach to calculate the fibonacci sequence using the results of the previous calculation is shown below:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs )
Note that it is recursively defined also. By way of explanation, zipWith is a function which takes two lists and applies a function to the elements in the same corresponding positions in the list and tail is a function which returns a list minus the first element.

So in this case the effect of zipWith is to add the nth element of fibs with the n-1th element of fibs. This function will generate an infinite fibonacci sequence.

We can use a list comprehension to filter out the odd valued terms using the predicate x `mod` 2 == 0.
mod is actually a prefix function (ie: called before its arguments, eg: mod x 2 ), but using `backticks` allows us to call it using infix notation, which is more natural for mathematical functions.
[ x | x <- fibs, x `mod` 2 == 0 ]
Note that the predicate x <= 4000000 will also filter out all values less than 4000000, but the list comprehension will never terminate.

Instead, we can use the takeWhile function which takes values from a list whilst as a boolean criterion is satisfied, eg:

takeWhile ( <= 4000000 ) [ x | x <- fibs, x `mod` 2 == 0 ]
Now all that is left if to sum the list to get our answer

sum (takeWhile ( <= 4000000 ) [ x | x <- fibs, x `mod` 2 == 0 ])

Which makes me the 139646th person to solve that problem on the Project Euler page. Only 342 left to solve!

Thursday, 4 August 2011

SuperMemo to Anki database converter...

My girlfriend recently decided to move her study materials from SuperMemo to Anki, due to Anki's better support for Mac and a superior iPhone app that allows study cards to contain media such as images and sound.

However, she faced the prospect of losing all her learning history on thousands of cards, which would have meant unnecessary repetitions as Anki rebuilt her learning database.

Thankfully I found this useful project on GitHub:

It's a java program that converts the SuperMemo UX course data into Anki format. It seems to have been written to work on courses published from the SuperMemo website - but when I tried it on her data and it failed :(

It parses the supermemo SMPAK file, which is akin to the MS compound document file, ie: a single file which contains multiple streams of data. The course data is found in the course.xml and item####.xml streams in the SMPAK file. However, it seems that self created supermemo courses actually store the course data as XML files in a subdirectory called "override"- with the same names as the streams in the SMPAK file.

Grzegorz Godlewski's code did all the heavy lifting of parsing the course data and repetitions and then writing the data in Anki format. All I had to do was make a small change to first look on the filesystem for the courses xml files.

The only problem was I'm not a java programmer - C++ and C# are my areas of expertise, so I was forced to download the JDK, Eclipse and Maven and see what I could do. It was suprisingly not too painful... and I managed to knock up something that worked.

You can find my efforts here on GitHub:

Thanks to Gregorz for his hard work and sharing his code with the world!


Welcome to my first ever blog post.

I finally decided to create this blog as a way to keep track of all those annoying issues that get in your way whilst programming and their resolutions, and also other computer and tech related stuff.

I hope that someone else may find some of this information useful...