Content
You have to want it more than you're afraid of it
Wednesday 1 September 2010
-
Filed under
Life Outside Work
[Australia's] Telco leaders unite to pan NBN & lobby for ubiquitous wireless ‘NBN 3.0′ (iTWire, 31 August 2010):
Executives from seven of Australia’s telcos have united to lobby against the NBN, claiming Australia’s broadband future is best left to the market, and best served by ubiquitous wireless coverage.
They have formed the Alliance for Affordable Broadband and have issued a ‘Manifest’ proposing, under the moniker, NBN 3.0, an approach broadly in line with Coalition policy, saying: “We believe the argument for a national fibre-only NBN solution has failed to convince.
“For the short to medium term we see, globally, no demonstrated mass requirement for the ‘up to 1Gbps’ speeds to homes and SOHO. Instead, we see the greatest priority is giving broadband to those who don’t have any, not faster broadband to those that have.”
The alliance members are BigAir CEO, Jason Ashton; AAPT CEO, Paul Broad; EFTel CEO, John Lane; Pipe Networks founder, Bevan Slattery; Vocus CEO, James Spenceley’ Polyfone (a microwave network operator) CEO, Paul Wallace and Allegro Networks (a wireless network operator similar to BigAir) CEO David Waldie.
The have aimed the manifest squarely at the independent MPs saying “We believe that a well-informed Independent member of parliament might wisely favour an NBNv3 public/private model on a mix of technologies, with deliverables within a term, over a more costly and more risky 8+ year NBN 2.0 rollout.”
(…and on and on and on)
Precisely my thoughts. Putting aside the issue of a A$43bn price tag, only the market, not the government, will best respond to the pace of change in technology.
::
Share or discuss
::
2010-09-01 ::
JK
Sunday 29 August 2010
-
Filed under
Tech Notes
[This post applies to solutions developed for the Microsoft SharePoint 2010 platform.] Well, I’ll just go ahead and say it: SharePoint, as a product and a platform, is a bi*** when it comes to debugging.
…I could have ended the post right there, but I’ll carry on and elaborate a little. When creating or maintaining a custom-developed solution for SharePoint, one of the challenges is that many of the traditional debugging techniques simply don’t work full-stop, or don’t work as intended, or are prohibitively costly to carry out time- and resource-wise. One reason, in my view, is that when compared with ASP.NET applications, SharePoint tends to choose silent death instead of blowing up in your face. Sometimes it leaves a cryptic GUID reference (“a correlation ID”) and asks you to rummage through SharePoint trace logs, which may or may not contain useful information.
The other major reason is that while something may work perfectly in the development environment, there is no guarantee that it will still work when it is packaged up as a solution and deployed in another farm (a production farm, for example) possibly because of differences in site hierarchies, permissions, and other unknown quirks. And most of the time, it is neither possible nor desirable to install Visual Studio on a remote farm hoping to be able to debug the solution directly. That was the very reason for having a dedicated development environment in the first place, remember? So is there a good general strategy for debugging in SharePoint?
First option: Enable the SharePoint Developer Dashboard to get a grip of what’s really going on under the hood.
However, in situations where the Developer Dashboard cannot be turned on for administrative reasons, or where it is necessary to selectively and surgically target specific routines and objects to monitor, utilising the facilities around SharePoint trace logs may be the preferred answer.
In C, ‘printf’ is just about the most powerful debugging tool.
Back in 1998 when I was a first-year university student grappling with Computer Science 101, Professor Peter Kay gave some key lessons that still resonate to this day. One of them was that in C programming language, the seemingly rudimentary printf function is actually an amazingly powerful tool when it come to finding out what’s going on inside a program and hence locating bugs. The idea, of course, is that being able to “print” what’s going on and thereby exposing the state or progress of anything at any point in time is key to discovering and diagnosing a problem. The tool is there; we just need to know how to use it to our advantage. At the end of the day, it comes down to extracting the following information:
-
Exactly at what point did the execution of the program go pear-shaped? (In other words, “Did it even get to this point?”)
-
What did such and such variables and objects contain in them at the time of the error (or any of the checkpoints before that)?
-
Exactly how long or how many steps/iterations did the program take to achieve a task or before it failed a task?
If we can have a tool that gives us the above, the rest is just logical reasoning.
In SharePoint 2010, the Unified Logging Service (ULS) is just about the most powerful debugging tool.
Fast-forward to 2010: The “correlation ID” in SharePoint trace logs is touted by Microsoft as one of the major new features of SharePoint 2010 designed to make the IT pro/developer’s life easier. What is more important than the correlation ID itself, however, is the fact that anything that happens in SharePoint can be recorded in the trace logs. And we can use this to our advantage much the same way printf does in C. Again, the idea is to expose at will the state or progress of anything at any point in time as necessary. The results of our targeted monitoring will go in the usual SharePoint trace logs via the Unified Logging Service in a format that is meaningful to us the IT pros and developers. Since I felt I needed a name for this approach, I shall call it “logging the Paranoid Big Brother style.” Big Brother because everything (chosen) is watched and logged; and paranoid because the act of tracing can be as often and as detailed as one’s heart desires.
Now to the ‘how’ part: This is a generic how-to that applies to individual C# classes. First add the Microsoft.SharePoint.Administration namespace to the code. Then define a new “SharePoint diagnostics category” as a member variable that will identify the current class/feature in SharePoint trace logs.
SPDiagnosticsCategory _dCat=new SPDiagnosticsCategory(
"Name of class/feature to appear in logs",
TraceSeverity.Verbose,
EventSeverity.Verbose
);
Next, set up a local SharePoint diagnostics service as follows:
SPDiagnosticsService _dSvc=SPDiagnosticsService.Local;
Those are the basic building blocks, done and good to go. Now whenever and wherever something needs to be logged, insert a WriteTrace call like this:
_dSvc.WriteTrace(
1234,
_dCat,
TraceSeverity.Verbose,
"Message to go in log",
null
);
The first numeric argument is just a uint ID that further identifies the nature of the logged activity/information/exception together with the diagnostics category defined earlier. Establish your own numeric ranges that suit your convention – for example: 1000-1999 for business-as-usual activities or information; and 2000-2999 to indicate an exception, etc. The message can be anything: a hardcoded string, the content of a variable, the message extracted from an exception, or a combination of these. It can also be an empty string if the numeric identifier alone is sufficiently indicative of what that particular log entry is about, i.e. makes sense to the intended audience.
And that’s basically it. All activities, information, and exceptions captured will go in the SharePoint trace logs and be instantly findable by the custom diagnostics category name and/or numeric ID. The logs are available in the server’s 14\LOGS directory and also via a graphical interface if you use the SharePoint ULS Log Viewer.
Now for those who are really keen on adopting and adapting this approach for their real-world projects, here are a couple of tips for further tweaking:
Tip 1. Make the code more readable to Big Brother.
You may have noticed that three of the five arguments in the WriteTrace calls stay the same most of the time. This is of course redundant. So why not create a method that simplfies things? For example:
protected void LogThis(uint uid,string msg) {
if (uid==null) uid=9999;
if (msg==null) msg="";
_dSvc.WriteTrace(uid,_dCat,TraceSeverity.Verbose,msg,null);
}
Now the overall code becomes more concise and readable:
// (Do something that should be business-as-usual...)
LogThis(1001,""); // Meaning: "Check! It's done."
// (Do something else that should be business-as-usual...)
LogThis(1002,""); // Meaning: "Check! It's done."
// (Do something that may cause trouble...)
LogThis(1003,"It says: "+someVariable.ToString());
// (Process some branching logic...)
if (someThing==true) {
LogThis(1011,"Yes, it was true!");
// (Do something about it...)
} else {
LogThis(1012,"No, it was false!");
// (Do something about it...)
}
try {
// (Now try something that can really go pear-shaped...)
} catch (Exception ex) {
LogThis(2001,"RED ALERT: "+ex.Message);
// Yes, it's been logged, but you should still
// do something to remedy this; don't just swallow
// an exception.
}
// (Finish up...)
LogThis(1099,"OK, got to the end"); // Because it may not.
Tip 2. Plant a “kill” switch like any Big Brother does.
When debugging is done and everything works hunky-dory in both the development farm and the remote farm, it’s a good idea to delete the calls that log non-critical activities and information because of a simple reason: Until the next time the code is modified, logging every single non-critical activity/information is administrative overhead. As such, it is convenient to have a boolean check before the logging of non-critical activity/information.
// Set this in the beginning.
bool _paranoid=true;
Now the log calls will look like:
if (_paranoid) LogThis(1001,"");
if (_paranoid) LogThis(1002,"");
if (_paranoid) LogThis(1005,"Some information");
// An exception should always be logged.
LogThis(2010,"Oops! "+ex.Message);
// Some important non-exceptions may also need to be
// logged regardless.
LogThis(1101,"Task completed");
As illustrated above, calls that should always be logged should not have a boolean check in front of them. When everything is good to go, change the value of the boolean switch to false, rebuild the solution for one last time, and deploy that “production-ready” version.
Tip 2A. Be a picky Big Brother.
Here’s a simple adaptation of the above technique: If there are a large number of log calls that in turn produce many many entries in the trace logs and you want to focus your debugging effort only on a small (potentially problematic) portion of the code, then set the value of the “paranoid” boolean switch to false to begin with, then true just before that particular part, and set it back to false straight after it.
Conclusion: You don’t have to be a Crime Scene Investigator.
I used to hate having to ransack piles of mostly meaningless SharePoint trace logs in order to investigate problems with a custom-developed solution, grumbling “I’m no CSI, why oh why am I doing the job of a forensic expert?!” Now with custom logging, it’s a lot easier and quicker to find just what I want and make sense out of it.
::
Share or discuss
::
2010-08-29 ::
JK
Sunday 15 August 2010
-
Filed under
Life Outside Work
a.k.a. “Music that can’t be stopped until finished”
Lately I accidentally blew away all my music playlists (once again; I just don’t seem to learn) while updating software on my iPhone. Getting back my music isn’t at the top of my to-do list right now so recovery has been slow. It has, however, been an opportunity to review and re-organise my collection. And I thought I’d do a round-up of my all-time favourites under the “love songs” category which I don’t mind playing over and over again – and share the playlist. If I had to pick a selection of my all-time favourite love songs and squeeze them in a single audio CD, it would be this:
Now I can easily look up and re-compile the collection next time I lose my playlists…
::
Share or discuss
::
2010-08-15 ::
JK
Friday 6 August 2010
-
Filed under
Tech Notes

I just came back from the best technology training I have had in years: a world-first Microsoft SharePoint Elite Information Architecture course designed and delivered by Paul Culmsee. It has taught me a great deal across ALL facets of the day-to-day work that I do as a SharePoint architect. Among the more generic, philosophical takeaways is that there are no “best” practices that apply ubiquitously; there are only “good” practices, benefits arising from the good practices, and caveats.
Although I make a living out of everything Microsoft, people at work know me as an Apple fanboy because I do much of my SharePoint work on the Mac platform via VMware Fusion, which enables virtualisation of Windows inside Mac OS X. And I certainly enjoy having the best of both worlds. As time goes by, I come across various gotchas, caveats, workarounds, and what I consider to be good practices associated with having the best of both worlds. Things eventually build up to a point where they should be documented both for myself and for the wider audience who may seek to do productive things out of VMware Fusion. So here’s my two cents’ worth of contribution towards the Fusion community. (And no, stuff that follows has nothing to do with Microsoft SharePoint.)
Say No to litter and crazy fan noise
The one good practice in Fusion that rules them all in my opinion is to keep virtualised Windows applications strictly inside the Windows virtual machine. The much-touted feature of enabling virtualised Windows applications to get out of the virtual machine’s “window” and to run alongside Mac OS X applications as if they were native Mac applications is certainly a cool concept at first sight. But the gimmick creates more headache than benefits. First, VMware Fusion, without asking, creates an “application cache” folder under the folder where the virtual hard disk files are located. Inside the application cache folder are hundreds – if not thousands – of files, corresponding to every single program executable present in the Windows virtual machine. This is litter. Pure litter. More importantly, the computer’s fan kicks in like crazy and won’t stop until the virtual machine is shut down. Without forensic evidence, I suspect that is because keeping the application cache folder current consumes a LOT of processing power. Disabling the cache makes the virtual machine quiet and also free of litter. It has worked every time on my MacBook. Here’s a permanent fix that needs to be performed once for each virtual machine:
-
If switched on, shut down the virtual machine. In Finder, navigate to the folder containing the virtual machine files.
-
If there are subfolders named Applications, appListCache, or caches, blow them away. Completely.
-
Create threes empty files (of zero size, that is), called Applications, appListCache, and caches. Do NOT create them as folders (directories). These are just dummy empty files whose sole purpose is to prevent folders named as such from being created in the future.
-
Open the virtual machine configuration file (.vmx) in a text editor. Look for a line that begins with proxyApps.publishToHost. If it exists, set the value to “FALSE”. If it does not exist, add this line to the end of the file: proxyApps.publishToHost = “FALSE”
-
Save and close the configuration file. Make a backup of the entire sanitised virtual machine folder just in case.
Let Windows keyboard shortcuts behave like Windows
I want my Windows virtual machine to emulate the native Windows keyboard shortcuts as closely as possible. In Windows, I use Windows shortcuts. In Mac OS X, I use Mac OS shortcuts. Simple. To do this, open VMware Fusion’s Preferences and configure the following:
-
Key Mappings
-
Set: ⌘ to Alt
-
Set: “Option” key to “Windows” key
-
Add: ⌘-Delete to Forward Delete
-
Add: Shift-⌘-Delete to Shift-Forward Delete (Permanently Delete)
-
Add: ⌘-Left to Home
-
Add: Shift-⌘-Left to Shift-Home
-
Add: ⌘-Right to End
-
Add: Shift-⌘-Right to Shift-End
-
Add: Option-Left to Control-Left
-
Add: Shift-Option-Left to Shift-Control-Left
-
Add: Option-Right to Control-Right
-
Add: Shift-Option-Right to Shift-Control-Right
-
Mouse Shortcuts: Disable (uncheck) all
-
Mac OS Shortcuts: Disable (uncheck) all
-
Fusion Shortcuts: Disable (uncheck) all except Full Screen
Combine this with the Control key fix I mentioned in my earlier post and you get the complete keyboard optimisation in VMware Fusion. If left unmodified, the default keyboard and mouse settings are just too confusing and dysfunctional.
Have as many second chances as you want, the proper way
Like any Windows machine, your Windows virtual machine will grow in size and accumulate all kinds of garbage over time under normal use. It is vitally important to create a backup while things are all fresh and functional. When you have installed the applications you need, configured/activated them and everything just works, there’s your milestone. Clean up the virtual machine, shrink it, shut it down, and make a complete backup of it. Here’s a lower-level routine I go through for Windows 7 or Server 2008:
-
Perform Windows Update to keep all Microsoft software components in the virtual machine up to date.
-
Clean up temporary files in Internet Explorer and other Web browsers.
-
Clean up the C:\Windows\SoftwareDistribution\Downloads directory.
-
Clean up the logs in Event Viewer.
-
Back up any important/working documents and files stored in the virtual machine. Then delete non-permanent files in the My Documents folder and other locations.
-
Clean up file open history in certain applications. For Office applications, set the number of recent files to zero.
-
Run the Disk Cleanup utility on the C drive.
-
Defragment the C drive.
-
Launch VMware Tools and shrink the C drive.
-
Shut down the virtual machine. Make a backup of the entire virtual machine folder at another location. Add a text file that describes the state of the virtual machine for future reference.
By doing the due diligence, it is always possible to go back to the good/clean state of the virtual machine and start over should something screw up. Just blow away the current version of the virtual machine and duplicate the backup. And that is the beauty of virtual machines. I prefer taking complete backups outside Fusion to making snapshots from within Fusion because snapshots bloat the virtual machine and I don’t consider it a long-term solution.
Use a fast physical disk for the virtual machine
General performance and the speed of shrinking and duplicating a virtual machine hinge on the specs of the physical disk on which it sits. Invest in a setup that gives the virtual machine the best possible operating environment in terms of performance. Short answer: Get an SSD (refer to my earlier post). As a general guide, here are possible configurations for a development laptop, listed in order of performance:
-
[Slowest; lowest performance]
-
A single hard disk (regardless of the number of partitions) to run both the host operating system and the virtual machine
-
A second hard disk to run the virtual machine, connected to the host machine via USB 2.0
-
A second hard disk to run the virtual machine, connected to the host machine via USB 3.0
-
A second hard disk to run the virtual machine, connected to the host machine via eSATA
-
A single SSD to run both the host operating system and the virtual machine
-
A dedicated SSD to run the virtual machine
-
[Fastest; highest possible performance]
I can never stress enough that when it comes to virtual machines, the difference between a hard disk spindle and an SSD is simply phenomenal.
I am sure there are other good practices and caveats for getting the most out of VMware Fusion and virtual machines in general. More as they come.
3 comments ::
Share or discuss
::
2010-08-06 ::
JK
Friday 30 July 2010
-
Filed under
Tech Notes
Although this post is filed under the Tech Notes category, it really applies to everyone no matter how tech-savvy they may be.

I previously wrote about issues with modern keyboards: how to enable arrows on the keypad and also about the position of the Control key. I am ranting once again because: a) this is an important health & safety issue overlooked by most people; and b) I am now able to document a revised solution that will put the matter to rest once and for all.
Just to recap some of the background: some computer manufacturers, for their own unknown reasons, have fiddled with the position of the left Control key on their laptop keyboards. Choosing NOT to place the Control key to the lower left corner of the keyboard is the stupidest idea, one that annoys and slows down all touch-typists. But this time I’ll go further than that: the BEST place for the Control key is where the Caps Lock key is. Yes, that long key in the middle row that gets pressed like once every six months.
Legend has it that in the early days of computing (before the PC), the Control key WAS in the middle row, precisely where the Caps Lock key is now. Apple then invented its Command key for its Macintosh computers and placed it next to the spacebar, where it’s more thumb-friendly. Not sure whether it was IBM or Microsoft, but somebody later decided to bring the Control key for the PC right down to the bottom row of the keyboard… and a Caps Lock key filled the void, a position that I can only describe as prime real estate. That’s a piece of the history of computing as I roughly know it, but I am too tired to cite a reliable source. Feel free to go Google/Bing yourself.
For PC users: pretend for a moment that your Caps Lock key was Control. Place your left pinky on it, hold it down, and try some of the most common key combinations of 2010 – like opening (+T) and closing (+W) a tab in the Web browser. Or actions like save (+S), copy (+C), and paste (+V). Of course they won’t work because your keyboard has the Caps Lock key programmed to function as Caps Lock. But experience how intuitive and natural that feels with one hand.
Now find your REAL control key and perform the same key combinations with your left hand. I bet you can’t do that without moving your wrist down, actually looking at the keyboard, and stretching your fingers in an awkwardly un-ergonomic manner. Multiply that by hundreds of thousands of key strokes in a year and that is lost time, focus, and productivity right there.
Unfortunately, switching to an Apple Mac is not the right answer in this case as it has its own quirks:
-
Absence of Forward-delete (the key that deletes characters in the opposite direction to Backspace) on the portable keyboard;
-
Pressing Home, End, Page Up, and Page Down keys does NOT change the cursor position, which is a huge usability issue;
-
Pressing “Enter” does NOT move the cursor to the next line (What the hell is it for, then?);
-
Although Control is not the primary modifier key in Mac OS X, it is still found in the wrong position. Control is used extensively in some Mac OS X applications such as Terminal and also Windows applications via virtualisation or Bootcamp.
So how do you go about fixing all these quirks and inconveniences?
Solution for PC
Download the latest version of SharpKeys (free) and create a mapping from “Caps Lock” to “Left Control”. Save the change and give the computer a restart. And never look back. In a corporate environment where you cannot install unratified applications on your work computer, seek permission of your IT people and show them how cool it is to lose Caps Lock.
Solution for Mac
Because there are more key behaviours to tweak in Mac OS X, the process is more involved. First, download KeyRemap4MacBook (free) and install it. When it is registered in System Preferences, enable the following changes:
-
General > Enable CapsLock LED Hack
-
Change Enter Key > Enter to Return
-
Change FN Key > FN to Control_L
-
For PC Users > Use Keypad as Arrow > Enable KeyPad as Arrow (With PC Style Home/End/PageUp/PageDown)
Once that’s done, download PCKeyboardHack from the same Web site. Install it and enable the following:
-
Change Caps Lock: Keycode 59
Solution for PC on Mac
In addition to these changes, there are useful tweaks that can be made to VMware Fusion if you run Windows virtual machines on Mac OS X. [Details of this have been moved to another post.]
The moral of the story: Don’t just accept what they give you. Always seek ways to make things better, no matter how trivial they may seem.
There it is… I hope this helps me.
::
Share or discuss
::
2010-07-30 ::
JK
Tuesday 27 July 2010
-
Filed under
Life Outside Work
Here are a couple of jokes that made me chuckle and then gaze thoughtfully like a philosopher:
………………………………………………………
A man walked out to the street and caught a taxi just going by. He got into the taxi, and the cabbie said, “Perfect timing. You’re just like Brian!”
Passenger: “Who?”
Cabbie: “Brian Sullivan. He’s a guy who did everything right all the time. Like my coming along when you needed a cab, things happen like that to Brian Sullivan, every single time.”
Passenger: “There are always a few clouds over everybody.”
Cabbie: “Not Brian Sullivan. He was a terrific athlete. He could have won the Grand Slam at tennis. He could golf with the pros. He sang like an opera baritone and danced like a Broadway star and you should have heard him play the piano. He was an amazing guy.”
Passenger: “Sounds like he was something really special.”
Cabbie: “There’s more. He had a memory like a computer. He remembered everybody’s birthday. He knew all about wine, which foods to order and which fork to eat them with. He could fix anything. Not like me. I change a fuse, and the whole street blacks out. But Brian Sullivan, he could do everything right.”
Passenger: “Wow. Some guy then.”
Cabbie: “He always knew the quickest way to go in traffic and avoid traffic jams. Not like me, I always seem to get stuck in them. But Brian, he never made a mistake, and he really knew how to treat a woman and make her feel good. He would never answer her back even if she was in the wrong; and his clothing was always immaculate, shoes highly polished too. He was the perfect man! He never made a mistake. No one could ever measure up to Brian Sullivan.”
Passenger: “An amazing fellow. How did you meet him?”
Cabbie: “Well, I never actually met Brian. He died. I’m married to his f_____’ widow.”
………………………………………………………
Paddy was driving down the street in a sweat because he had an important meeting and couldn’t find a parking place. Looking up to heaven he said, “Lord, take pity on me. If you find me a parking place I will go to Mass every Sunday for the rest of me life and give up me Irish Whiskey!”
Miraculously, a parking place appeared.
Paddy looked up again and said, “Never mind, I found one.”
::
Share or discuss
::
2010-07-27 ::
JK
Tuesday 20 July 2010
-
Filed under
Life Outside Work
The version of Perhaps, Perhaps, Perhaps I like the most is that of The Pussycat Dolls [video], which I have listened to countless times since I bought the Doll Domination album. Fast, passionate, and no beating around the bush; perhaps, dare I say, the best song out of the entire album:
(Oh!)
You won’t admit you love me
And so how am I ever to know
You always tell me
Perhaps perhaps perhaps
A million times I’ve asked you
And then I ask you over
Again you only answer
Perhaps perhaps perhaps
If you can’t make your mind up
We’ll never get started
And I don’t wanna wind up
Being parted, broken-hearted
So if you really love me, say yes
But if you don’t, dear, confess
And please don’t tell me
Perhaps perhaps perhaps
Bitterness of the past suppresses action. Inaction costs love of the future.
Will I learn?
::
Share or discuss
::
2010-07-20 ::
JK
Friday 9 July 2010
-
Filed under
Tech Notes
When building things inside virtual machines becomes an integral part of one’s real-life job, most people are faced with two insatiably limiting factors: amount of memory (RAM) and disk speed. While disk *space* is cheap and plentiful, RAM and fast disks still remain much of a technical barrier when it comes to equipment not only for individual professionals but also for many software development businesses.
OK, enough preamble. After growing tired of suffering from the general performance issues inherent in virtual machines and wasting enough time copying, compacting, and backing up virtual machines as opposed to producing outcomes with them, I took a giant (kind of) step forward to transcend the one biggest bottleneck of all time: a transition from a hard disk spindle to a 256GB high-speed MLC solid state disk (SSD). I had always thought that SSD was some alien technology of the future, still very much out of reach of commoners. But no. That future is now. Let me put this in context for you geeks:
try {
timeToAct=TellBoss("We must get serious and buy new equipment.");
} catch (GotShotDownAsUsualException ex) {
timeToAct=DateTime.Now; // Can't do anything with ex anyway
} finally {
GetYourOwnDamnGear(keepDrooling=false,when=timeToAct);
}
Less time spent mucking around = increased productivity
Here’s a screenshot I took after replacing a 5,400rpm hard drive with an SSD:

A jaw-dropping 7.7-out-of-7.9 on my humble Dell Latitude E6400!! What’s more important than the Windows Experience Index, however, is actual benchmarks. Here are my observations across a variety of scenarios of copying a virtual machine that is approximately 30GB in size:
| Source |
Destination |
Scenario |
Average Speed |
| Primary hard disk (5,400rpm) |
Primary hard disk (5,400rpm) |
Same I/O controller doing both read and write (reduced performance) |
~8MB/s |
| Primary hard disk (5,400rpm) |
External hard disk (5,400rpm) |
One I/O controller doing read, the other doing write |
~18MB/s |
| External hard disk (5,400rpm) |
Primary hard disk (5,400rpm) |
One I/O controller doing read, the other doing write |
~24MB/s |
| Primary SSD |
Primary SSD |
Same I/O controller doing both read and write (reduced performance) |
~120MB/s |
| Primary SSD |
Secondary SSD |
One I/O controller doing read, the other doing write |
???MB/s (advertised read speed of up to 355MB/s) |
I could not test the last scenario because I only have one SSD at my disposal (these things are not cheap, you know). But even the single disk operation gives a whopping 120MB/s consistently, after an initial burst of 500+MB/s. That is a world of difference as I can do in less than five minutes what used to take me more than 40 minutes. Apart from copying of virtual machines, the running of a virtual machine also feels so much snappier; and that is, running the OS and the VM off the same physical drive, which is considered a no-no in the world of hard disk spindles. Tasks such as launching, debugging, deploying, and re-deploying programs are much less painful and the resultant saving of time amounts to a great deal of productivity – and coffee.
By the way, a colleague of mine who kind of got tricked into buying an SSD with me when I negligently said SSD would give 13x the speed, ran the Windows Experience Index from inside a Windows 7 VIRTUAL machine running off his SSD and got a 7.6 for the primary disk category. Bloody amazing.
Goodbye, Sluggish.
Apart from speed, SSD is also lightweight, more durable (no moving parts), and green (less power consumption). Now that I have tasted virtualisation on SSD, I want to go further and experiment SSD through-and-through, i.e. doing day-to-day work such as SharePoint configuration and development activities, directly on a physical SSD-equipped machine without the added layer of virtualisation. There are some challenges ahead such as having to install a different OS, finding the right device drivers, and the ability to take snapshots of milestones and to restore those milestones with ease. Still worth a try, I think.
::
Share or discuss
::
2010-07-09 ::
JK
Thursday 1 July 2010
-
Filed under
Undecided
First of July – a date that means a lot to me in more than one context.
I don’t quite have time for blogging right now as I have less than 100 hours left to prepare for a work-related exam. Still, I wanted to mark the second anniversary of the birth of my blog (and the beginning of a new financial year to some people), so I thought I’d whip up a quick and easy one as I often do: a translated excerpt of someone else’s blog post about “respect”.
15 characteristics of people who don’t respect themselves
-
They tend to be indecisive and ask for others’ opinions; yet, they don’t take heed of what they are told.
-
They always point at others’ faults and never their own.
-
They act in a defensive manner.
-
They are averse to change and refuse to try new ways/things.
-
They find it difficult to trust others.
-
They enjoy talking about things others don’t.
-
They tend to seek attention by exhibiting sudden, unexpected, often emotional behaviour.
-
They seek perfection; yet, they don’t pour effort into it.
-
They always try to win.
-
They deceive others even for things from which they have nothing to gain.
-
They lie and tend to bluff.
-
They say ‘sorry’ more often than necessary.
-
They find excuses to opt out instead of just getting on it.
-
They are over-conscious of others and become diffident as a result.
-
They are unable to say No to little things and instead keep agonising over them.
::
Share or discuss
::
2010-07-01 ::
JK
Wednesday 23 June 2010
-
Filed under
Tech Notes

I just had to do it. I took the plunge as soon as it came out. I audaciously went through the process of upgrading my iPhone software to the new iOS 4 first thing in the morning. The result: loss of mail, contacts, music, documents, apps, and all my content and settings, which in turn brought down my productivity for the better part of the day. Granted, a few hiccups here and there were expected considering millions of other people from all over the world were doing the exact same thing at the same time. But I didn’t expect a fresh start, that is, a real fresh start. Here’s what I did: I began the upgrade process on one computer where it automatically backed up the contents of the phone. It then started having problems (error code 1604 among others) and hung. Suspecting issues with network configurations, I unplugged the phone and hooked it up to another machine on another network. On that machine, iTunes said I had no choice but to “restore” the software because it was already in “recovery” mode. So I did a restore, which also incorporated an upgrade to the latest iOS 4 software. You guessed it… my backup was on ANOTHER machine, which meant that while the OS was upgraded successfully, the device was reset to factory settings. A real fresh start.
Then I was hit by an epiphany: This is exactly what I experienced when I did an upgrade from iPhone OS 2 to iPhone OS 3 a while back. Too late. If you don’t learn, you pay for the consequences. It was not, however, the end of the world. Even without a working backup, recovering the lost stuff was mostly a matter of reconfiguring and keying in things again albeit manually. My biggest concern was contacts: there were a few people whose contact details could not be found anywhere else. More on this later, but suffice to say this: Even if you are all for a fresh start, at least write down the names and phone numbers of people whose details cannot easily be found elsewhere before embarking on the upgrade process.
I haven’t had the time to discover, experience, and appreciate all of the 100+ new features packed inside iOS 4. I’m not sure if I ever will. All the pain and wasted time aside, here’s a run-down of what I found useful and interesting in iOS 4 on the first day:
-
Email improvements: A unified inbox that handles multiple email accounts saves a LOT of moving back and forth just to see what’s new. The threaded view is also a welcome addition (at last).
-
Folders: Being able to organise apps into folders cuts out a lot of clutter. I did, however, manage to create unwanted folders by accident while trying to just re-arrange some of the app icons. Finger precision is required.
-
Contacts: The process of entering and editing details of contacts has become much more intuitive. I surely could feel and appreciate the difference because I did about two hundred manual entries.
-
Internet tethering: To me, this is the killer feature that rules them all. It is now officially possible to share the iPhone’s data connection with a computer via USB and optionally Bluetooth. I have only tested tethering via USB and it works like a charm, apparently much speedier and more reliable than the flaky connection on my mobile broadband dongle. OK, it could be just that the two are on different carriers in my case. But still, if I could get a decent data allowance on the phone plan for a reasonable price, I would not think twice about ditching the mobile broadband dongle.
Multitasking? I don’t know, to be honest. I could always control music while in another app, and that’s just about the only multitasking I have cared out on the iPhone. To me, multitasking does not amount to a big difference… yet.
Localise. Realise. Anglicise.
One annoyance is that even though “British English” is one of the available languages, spellcheck doesn’t follow that setting. I still had to explicitly remove the “English” keyboard and activate the “English (UK)” keyboard instead to have International English spellcheck and autocorrect. What’s the point, Apple? It’s just not consistent with how things work in Mac OS X.
Dear friends, come back to life
So how did I salvage the lost contact numbers in the end? I went back to the computer that did the original (and only) backup of my phone. There I decrypted and extracted just the part that contained contact information using this tool and this set of instructions. For the sake of documentation, here’s a summary of what it takes to extract phone numbers of contacts from a previous iPhone backup:
-
Locate the backup files. In Windows 7, it’s in “(USERNAME)\AppData\Roaming\Apple Computer\MobileSync\Backup”; in Mac OS X, the location is “~/Library/Application Support/MobileSync/Backup/”. Verify that there are a bunch of big and small files in it, possibly thousands.
-
If the backup is on a Windows machine, copy the Backup folder onto a USB key. Then find a Mac. Copy the contents of Backup into “~/Library/Application Support/MobileSync/Backup/” of the Mac.
-
Download, install, and run the aforementioned tool. Select the latest backup if there are more than one. Then select “iPhone OS Files” from the list of individual packages.
-
Locate AddressBook.sqlitedb in the decrypted package. Open Terminal, navigate to that folder, and run this command to launch SQLite: sqlite3 AddressBook.sqlitedb
-
In SQLite, run the following query to display the names of contacts and their phone numbers: sqlite> select ABPerson.first, ABPerson.last, ABMultiValue.value from ABPerson, ABMultiValue where ABMultiValue.record_id = ABPerson.ROWID
-
Optionally drag-copy-paste the results into a text editor and save it as a text file.
The same technique can target other database files and be applied to extract other types of information. Use .tables and .schema <Table_Name> commands together with basic SQL skills to work out the correct query. It would have been jolly good if all of this could be done in iTunes.
1 comment ::
Share or discuss
::
2010-06-23 ::
JK