Sunday 26 January 2014

Triple boot MacBook Pro late 2013

Install Ubuntu

Follow instructions here.
How to solve some issues.

Install Windows 7

Making USB ports work

The main challenge of installing Windows 7 on a MacBook Pro with only USB 3.0 ports is that the Windows 7 installer does not have USB 3.0 drivers. Initially I tried to bypass using Bootcamp to install Windows because I've already partitioned the disk and the Bootcamp doesn't work with partitioned hard disk. I tried several methods, including slip streaming USB 3.0 drivers to the Windows installer, but it didn't work. The mouse and keyboard wouldn't work so I couldn't progress in the installation process. Finally as the last resort, I deleted all the partitions including the Recovery HD, so that Bootcamp can work again.

Before deleting the Recovery partition though, I tried to copy it to a USB stick (just to be safe). However, I had a lot of trouble backing up the Recovery HD partition to a USB stick. It turned out that the main reason was that the size of my USB stick was not big enough. It requires a USB of 2GB+ memory.

After restoring the hard disk to 1 partition, Bootcamp works again and the keyboard and mouse works during the Windows installation process. However, after I booted into Windows 7, the USB ports still didn't work so I couldn't access all the Windows support drivers (network adapters, graphic card drivers etc) downloaded in the USB stick. As the network was not working either, I couldn't access the Internet either. Finally, I solved the problem by install VMware Fusion and created a virtual machine from the BootCamp partition. Then I did the following:

  1. Share the driver folders from the host OS to the guest OS (BootCamp and $WinPEDriver$ folders) and copied these folders into the Windows partition.  
  2. Reboot into Windows and install the drivers using the "setup.exe" file in the BootCamp folder (Note that you can't do the setup in the virtual machine because the setup program will report that the computer is not compatible with the drivers).

Other standard steps

  1. If haven't already done son, install rEFInd boot manager. After downloading the program, just go to its folder and run
    $ ./install.sh
    Every time after a major OS update, the program seems to be affected and you need to install the program again.

Resources:
http://clc.its.psu.edu/UnivServices/itadmins/mac/blastimageconfig/createasrrecoveryhdimage10.7
http://lifehacker.com/5823096/how-to-burn-your-own-lion-install-dvd-or-flash-drive
http://www.iclarified.com/entry/?enid=2672
Add triple boot OSes to virtual machines: https://www.youtube.com/watch?v=zNYXWEdVivo

Friday 24 January 2014

Accessing a server running in VirtualBox

I ran Ubuntu in VirtualBox on a Windows 7 host. When I started a Unicorn HTTP server in the guest Ubuntu OS, it reported as listening on address 0.0.0.0. To access this web server in the Windows host browser, you can check the IP address of the virtual machine using ifconfig and use that IP address in the host browser.

Events and delegates in C#

Delegates

A delegate is a reference type, but instead of referring to an object, a delegate refers to a method. In other words, a delegate is a type that represents references to methods with a particular parameter list and return type.  This is called encapsulating the method. When you create the delegate, you specify a method signature and return type; you can encapsulate any matching method with that delegate. It is like a function pointer in C++ but are type safe (the method passed needs to conform to the method signature).
You create a delegate with the delegate keyword, followed by a return type and the signature of the methods that can be delegated to it, as in the following:
public delegate int FindResult(object obj1, object obj2);
class MediaStorage {
  public delegate int PlayMedia();
  public void ReportResult(PlayMedia playerDelegate)
  {
    if (playerDelegate( ) == 0)
    {
        Console.WriteLine("Media played successfully.");
    }
    else
    {
        Console.WriteLine("Media did not play successfully.");
    }
  }
}
public class AudioPlayer
{
    private int audioPlayerStatus;

    public int PlayAudioFile( )
    {
        Console.WriteLine("Simulating playing an audio file here.");
        audioPlayerStatus = 0;
        return audioPlayerStatus;
    }
}

MediaStorage myMediaStorage = new MediaStorage( );
// instantiate the delegates
// PlayAudioFile conforms to the PlayMedia delegate signature
MediaStorage.PlayMedia audioPlayerDelegate = new
                   MediaStorage.PlayMedia(myAudioPlayer.PlayAudioFile);
myMediaStorage.ReportResult(audioPlayerDelegate);
Events and Delegates
class Clock {
// Define the SecondChangedHandler delegate type. This delegate will encapsulate any method that
// returns void and that takes two parameters. 
public delegate void SecondChangeHandler(
    object clock, TimeInfoEventArgs timeInformation);
// Create an instance of the delegate
public SecondChangeHandler SecondChanged;
}
class DisplayClock {
public void Subscribe(Clock theClock)
{
  theClock.SecondChanged +=
    new Clock.SecondChangeHandler(WriteLogEntry);
}
}
The problem with the above code snippet is that other methods can call SecondChanged directly and this is not normally the original class intends..  For example:
Console.WriteLine("Calling the method directly!");
System.DateTime dt = System.DateTime.Now.AddHours(2);
TimeInfoEventArgs timeInformation =
    new TimeInfoEventArgs(  dt.Hour,dt.Minute,dt.Second);
theClock.SecondChanged(theClock, timeInformation);
To prevent external calls to the delegated method directly, one can make the delegate private, but then this will prevent clients from registering with the delegate at all. What's needed is a way to say, "This delegate is designed for event handling: you may subscribe and unsubscribe, but you may not invoke it directly."


To fix your program, change your definition of SecondChanged from:
public SecondChangeHandler SecondChanged;
to the following:
public event SecondChangeHandler SecondChanged;
Adding the event keyword fixes both problems. Classes can no longer attempt to subscribe to the event using the assignment operator (=), as they could previously, nor can they invoke the event directly, as was done in the preceding example. Either of these attempts will now generate a compile error.

There are two ways of looking at SecondChanged now that you've modified it. In one sense, it is simply a delegate instance to which you've restricted access using the keyword event. In another, more important sense,SecondChanged is an event, implemented by a delegate of type SecondChangeHandler. These two statements mean the same thing, but the latter is a more object-oriented way of looking at it, and better reflects the intent of this keyword: to create an event that your object can raise, and to which other objects can respond.
You can also assign this delegate by writing the shortened version:
theClock.SecondChanged += TimeHasChanged;
Reference:
http://msdn.microsoft.com/en-us/library/orm-9780596521066-01-17.aspx
http://msdn.microsoft.com/en-us/library/ms173171.aspx

Tuesday 14 January 2014

Linux

X Window System (X11) is the windowing system for bitmap display, common on UNIX-like OSes. X provides the basic framework for a GUI environment. It does not mandate the user interface - this is handled by individual programs, such as window managers. A window manager controls the placement and appearance of application windows. Examples of window managers include GNOME 2, KDE and Awesome.

Friday 10 January 2014

Installing OpenAFS on MacOS X 10.9

The latest OpenAFS for MacOS is only for 10.8. If you try to install this version on 10.9, the installer will say the required version is 10.8 and you can't continue. However you can still install it through the command line and it works.

I followed the instructions on this website. No restart was needed. I wasn't able to configure the default cell through the OpenAFS preference setting. It may be due to the permission issue. So I manually edited ThisCell file in /var/db/openafs/etc with sudo privilege.

Thursday 9 January 2014

TeXlipse pdf viewer syncing

On Windows, SumatraPDF works well with TeXlipse pdf viewer syncing. On a 64-bit Windows 7, we need 64-bit SumatraPDF for the inverse search to work. The following website gives details on how to configure both TeXlipse and SumatraPDF:
http://joerglenhard.wordpress.com/2011/12/29/texlipse-and-sumatrapdf/

For the pdflatex.exe setting, the following works:
-synctex=1 -interaction=nonstopmode --src-specials %input
-synctex=1 means zipping the synctex file. The synctex file enables synchronization between the source file and the pdf output file.