Archive for the ‘Software Development’ Category

I’ve been struggling with carrying a Mac and PC for Xamarin development for a couple years now. Wouldn’t it be nice to just run OS X in a VM so I could use my Surface Book and not mess with the Apple ecosystem more than necessary? Well, I finally got it working, thanks in large part to the work that’s been done by many people, links of which I’ll credit in this article. Thanks, all!



  • macOS X Sierra Installer, or a machine with Sierra installed – extraction details below
  • Intel powered machine, preferably i5 or higher
  • 16GB or larger thumb drive, preferably USB 3
  • VirtualBox 5.x
  • Visual Studio 2015 or higher
  • If on a laptop, you’re plugged in

Create the OS X Installer USB Drive

First things first – you’ll need a Mac running Sierra and at least a 16 GB USB thumb drive. We’ll be using Unibeast, Multibeast, and the Clover bootloader. I imagine you own both Mac OS and the drive. I’d go the USB 3.0 or higher route so things run a bit faster. We’ll be extracting a Sierra installer in a moment. If you’re all set with the above, follow the instructions at the awesome Tony Mac x86 website. Special thanks to the Hackintosh website. When asked whether to use UEFI or Legacy boot mode, choose Legacy. Here is a marked-up PDF of the article in case the link doesn’t work.

In a nutshell, here’s what you’ll be doing in this step:

  1. Insert the thumb drive into the Mac. Launch Disk Utility and format the USB drive with the name USB and the format of GUID Partition Map.
  2. Download the macOS Sierra installer via the App Store. The installer will be saved in your Applications folder. Make a copy of it somewhere, just in case it gets deleted and you need it again. Don’t move the installer.
  3. Download and Run Unibeast and follow the prompts. Use Legacy boot mode. You’ll need a [free] account on the Tony Mac x86 site to download, fyi.
  4. Let Unibeast create the thumb drive. This will take about 10 minutes on a USB 3 drive.
  5. Download and Copy Multibeast to the newly created Unibeast drive.
  6. You’re now ready to start configuring VirtualBox.

Create the VirtualBox USB Drive Shim

You have a USB thumb drive, but VirtualBox doesn’t make it easy to boot from such a device. You’ll need to create a fake virtual disk that points to the USB drive. This tutorial walks you through it. Here’s a PDF if that link doesn’t work.

In a nutshell, here’s what you’ll be doing in this step:

  1. Open Disk Management and get the Disk Number of the thumb drive, as shown below
  2. Open command prompt as an administrator
  3. Navigate to %programfiles%\oracle\virtualbox
  4. Run the command
    VBoxManage internalcommands createrawvmdk -filename C:\usb.vmdk -rawdisk \\.\PhysicalDrive#

    to create the virtual drive pointer

  5. You’re now ready to create the VirtualBox virtual machine.


Create the VM

Windows won’t allow VirtualBox to use the USB shim you just created unless you launch with administrator privileges. Right-click VirtualBox and select Run as Administrator. VirtualBox should open. Then, follow the instructions on this page. Ignore the download portion – you already have an install thumb drive, and you just want the VM configuration steps. If that link doesn’t work, here’s a PDF.

In a nutshell, here’s what you’ll be doing in this step:

  1. Create a new Virtual Machine, name it Sierra – although that’s not a requirement – and choose OS X 64-bit as the guest OS. VirtualBox’s settings aren’t fully correct, but we’ll get there.
  2. Choose 4 GB of RAM. I didn’t test with any other memory configs. So, YMMV if you go another route.
  3. When asked which drive to use, choose an existing drive, and select the USB shim you created in the previous section. The example above saved the file as usb.vmdk at the root of C:
  4. You should now have a VM, like every other time you’ve used VirtualBox 🙂
  5. Add another Virtual Disk to stand in as your Mac’s hard drive. I suggest VDI format, dynamically sized, and 60 GB in size. Ignore that my screen shot shoes 40 GB <grin> In future steps you’ll need to install XCode and Xamarin Studio. Don’t skimp on size here or you’ll be reinstalling later. Much sad.

Note: XCode uses a lot of space when it updates. Don’t skimp on virtual disk size. If that’s a big deal, save the VM’s drive to a location that will have enough space.

Once you’ve added the hard drive, you’ll need to finish configuring the VM. You already have an installer on the thumb drive.

Aside from the defaults, confirm the settings you have match settings below. I’ve also included some screen shots a little further down.

  1. After performing the steps above, you’ll be using the following settings in your VM:
    • System, Motherboard, Base Memory: 4096 MB
    • System, Motherboard, Boot Order: Only Optical and Hard Disk checked
    • System, Motherboard, Pointing Device: USB Tablet
    • System, Motherboard, Chipset: ICH9
    • System, Motherboard, Extended Features: Enable I/O APIC, Enable EFI, Hardware Clock in UTC Time, all checked
    • System, Processor, Processors: 2 CPUs
    • System, Processor, Execution Cap: 100%
    • System, Processor, Enable PAE/NX: Checked
    • Display, Screen, Video Memory: 128 MB
    • Display, Screen, Monitor Count: 1
    • Display, Screen, Scale Factor: 100% (you can change this later if you’re on a high-res display)
    • Display, Screen, Accelerator: 3D and 2D both unchecked
    • Storage: One controller, first item is USB shim, then the hard drive and “Empty” optical drive. The order of those two don’t matter.

After configuring the VM in the UI, close VirtualBox and run the following commands, of which I’ve created a convenient all-in-one script here. You may need to edit it depending on what you named your VM.

These make the appropriate settings to fool OS X to thinking you’re on a real Mac.

cd "C:\Program Files\Oracle\VirtualBox\"

VBoxManage modifyvm "Your VM Name" --cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff

VBoxManage setextradata "Your VM Name" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "iMac11,3"

VBoxManage setextradata "Your VM Name" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"

VBoxManage setextradata "Your VM Name" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"

VBoxManage setextradata "Your VM Name" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"

VBoxManage setextradata "Your VM Name" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1

Boot the VM and Install Sierra

Alright, we’re ready to boot! Re-launch VirtualBox as an administrator and start up. After a bunch of Unix style text scrolling, you should see the Apple logo appear and begin to load macOS. If not, something’s configured wrong.  Read through the above steps and see what you missed. Of course, things may have changed over time, and this tutorial may no longer be valid. Bummer if that’s the case! Much sad. I want you to be much happy.

NOTE: If things appear frozen during boot, wait a minute. In sanity checking this on another machine with a friend, his seemed to be frozen, and then resumed. A watched installer never boils… [terrible joke]

The instructions for installing Sierra are pretty straightforward:

  1. When the installer appears, select the Utilities menu on top, then Disk Utility.
  2. Format the Virtual Hard Disk. I named mine VBox, but that doesn’t matter. Make sure the format is GUID Partition Map and Mac OS Journaled. Do not select the case sensitive option.
  3. When formatting is complete, quit Disk Utility and you’ll be back at the installer.
  4. Select the freshly formatted hard drive and start the install process.
  5. Wait. It took about 20 minutes to install on my 6th Gen Core i7 SSD Surface Book. YMMV.
  6. Keep an eye on the installer. When it’s done, remove the thumb drive. Otherwise, it’ll boot back into the installer. If that happens, wait for the installer to boot so you don’t corrupt anything, then remove the thumb drive, and restart the VM.
  7. When the Mac boots back up, follow the prompts. Do *not* use an Apple account – it won’t let you. Make note of the username – it will be in lowercase – you’ll need that when you enter a username and password for Visual Studio later. Don’t worry about the Apple Account issue, though – this won’t affect your ability to install XCode or use the App Store.
  8. Once setup is complete, shut down the Mac.
  9. In the VM’s settings, remove the USB shim.
  10. OS X is now installed.

From this point forward, you no longer need to run VirtualBox as an administrator. Yay!

NOTE: After configuring OS X, you may be presented with a dialog stating the keyboard cannot be identified. Don’t worry – just follow the prompts and you’ll be all set.

Install Xcode

For OS X to act as a build server, you must have Xcode and Xamarin Studio installed. Let’s install and configure Xcode first.

To complete this step, do the following:

  1. Open the App Store on the Mac
  2. Search for Xcode
  3. Click Get to install it. You’ll need to enter your Apple account credentials.
  4. Wait a while – it’s big and takes a while to install. About 30 minutes on my machine.
  5. Once installed, Launch Xcode, agree to any terms, and let it finish installing components.
  6. When Xcode is finished configuring, open the Xcode menu, select Preferences, then Accounts, and click the + symbol. Enter your Apple Developer Account details.
  7. Great! Xcode is configured! Time to get Xamarin set up.


Install Xamarin Studio

Xamarin Studio handles installing the OS X build agent so you can debug apps with Visual Studio, while performing the necessary build and simulation tasks on the Mac. This is required for licensing reasons, and Apple being a closed system for iOS developers. Boo.

Note: Xamarin Studio may be called Visual Studio for Mac by the time you read this.

  1. First, open Safari – unless you installed something else on the Mac already – and download Xamarin Studio for Mac. This is simple – go to, and download the installer.
  2. Open the installer on your Mac from the Downloads folder, and click Open when it warns you that it’s an application downloaded from the Internet.
  3. Install everything except Android. You can do Android dev on your PC, so I feel there’s no reason to install it again here. Again, YMMV – do as you wish 🙂 This process can take a while due to downloading and installing many items.
    • Note: I’m not sure if you need Profiler or Workbooks, so I kept them in there. I’m thinking it’s an insignificant difference.
    • Another Note: The installer will say it’s installing Android SDK anyway, not sure why! 🙂 I complained to Microsoft about this – it didn’t make sense to me.
  4. Once Xamarin Studio is installed, start it and make sure it comes up.
  5. Under the Xamarin Studio menu item – which may be Visual Studio by the time you read this – select Check for Updates and make sure everything’s up to date.
  6. Note to Visual Studio 2017 Release Candidate Users: If you’re running Visual Studio 2017 Release Candidate, it [annoyingly] installs and targets the alpha channel of Xamarin. You’ll need to switch to the Alpha channel in Xamarin Studio to match this, otherwise Visual Studio will refuse to compile/build/debug through the Mac instance. A channel switching option is available in the Check for Updates menu to address this issue.


Configure the Mac for Remote Login

In order to connect to the Mac from Visual Studio, we’ll need to open a port on the Mac side. The process is described in this article.

In a nutshell, here’s what you’ll be doing in this step:

  1. Press Windows-Space, which translates to Apple-Space, and type remote login to open the Sharing control panel.
  2. Check the box for Remote Login, and select All Users, or at least ensure your user account is in there. You’re on a private network only accessible by your machine, so I see few security issues here. Behind the scenes, this is opening Port 22 for SSH access to your Mac.


Alright, we should be all configured! Let’s switch back to Windows!

Configure VirtualBox Networking and Port Forwarding for Remote Debugging

Now that the Mac is configured, we have to tell VirtualBox how to allow your computer to talk with it. We do this by configuring Port Forwarding in VirtualBox.

  1. Open command prompt and type ipconfig.
  2. Take note of the Ethernet adapter VirtualBox Host-Only Network, which may be #2, #3 etc. You want the one with an IP address. Copy that IP address to the clipboard.
  3. In VirtualBox, open the Settings of your VM, and select Network, then Advanced, then Port Forwarding.
  4. Add a new rule. I named mine Remote Access.
  5. For Protocol, choose TCP.
  6. For Host IP, paste in your host adapter IP.
  7. For Host Port, enter 22.
  8. For Guest Port, enter 22.
  9. For Guest IP, go to your Mac, use Windows-Space to search for Network Utility, and type in the IP that appears there.




Note: It’s possible the Guest IP will change from time to time. This is especially true if the Mac isn’t the only virtual machine you run. If you can no longer connect, check whether you need to update the Guest IP.

VirtualBox is now configured! If you want to verify this, you can launch bash shell on your Windows 10 machine and type ssh username@ipaddress, accept the certificate, and enter your password when prompted. If you can type ls and see your Mac’s files, all is good in the world.

Link Visual Studio to macOS

Alright, hard part’s over. Now we need to configure Visual Studio. The steps for accomplishing this can be found at the same link above, or you can just click here if you don’t want to scroll. There’s also a tutorial in Visual Studio.

In a nutshell, here’s what you’ll be doing in this step:

  1. Launch Visual Studio.
  2. Type Control-Q to access the Quick Access Menu, and type iOS Settings. This will take you to the Xamarin iOS settings pane.
  3. Choose Find Xamarin Mac Agent, follow the prompts to ensure you’ve configured everything properly.
  4. In Enter Mac name or IP address enter your VirtualBox host adapter’s IP. If everything’s configured properly, you should be prompted to enter your Mac’s username and password.
  5. If all went well, a lock-like icon should appear next to the IP address, as shown below. If not, make sure the version of Xamarin installed in Visual Studio is the same as that on the Mac. See my note above about Visual Studio 2017 and its Xamarin Alpha Channel issue.

And, Go!

If everything went well, you should now be able to do all your Windows and Xamarin / Mac development on one machine!

Please provide feedback in the comments. Enjoy!

Tips / Updates

  • If you’d like to tweak the video resolution, you can follow this article. The command is:
VBoxManage setextradata "VM name" VBoxInternal2/EfiGopMode N

Where N can be one of 0,1,2,3,4,5 referring to the 640x480, 800x600, 1024x768, 1280x1024, 1440x900, 1920x1200 screen resolution respectively
  • My goal with this article is to build a machine for building a build/test VM. I am not trying to replace a Mac environment for doing lots of work on the Mac side of things.



I recently penned a blog post for Eleven Fifty Academy about how the Crime Watch app came to be. I meet aspiring developers all the time, many with great ideas they want to bring to life through code.

I’ve been using this example for a couple years now – explaining Object Oriented Programming with a cute example based on the book Everybody Poops. It’s fun, and much less bland than the other OOP examples I’ve seen 🙂

Here’s the link:

In case you missed the first video on Inversion of Control and Dependency Injection:

This is the second video in my Real World Programmer series. I hope you enjoy!


The built-in Facebook OWIN provider in ASP.NET MVC can open your website to the benefits of logging in via the social networking behemoth. Still, it’s limited when it comes to pulling in profile details such as photo, birthdate, gender, and so forth. I recently implemented retrieval of those profile properties, and will explain how you can do it, too! I feel the obvious benefit is your users don’t need to manually type in their profile details, should you have similar fields in your system.

I’m assuming you’ve created and configured a Facebook app via Facebook’s Dev center, and won’t be going into that process in this article.

Determine Which Profile Fields You Need

Before we write any code, you need to know to which profile details you desire access. Facebook used to be relatively open. Not anymore! Now you need to ask permission for a ton of items, and many are no longer available. Make sure you check permissions at least every 3 months, otherwise you may find your granted permissions are no longer, well, granted, or even accessible.

Here’s a link to everything you can get:

In my case, to access the Profile photo, name information, and some other basic items, I chose:

  • public_profile
  • email
  • user_photos
  • user_about_me

I probably don’t need all these right now, but I may in the future. I figured I’d ask ahead of time.

Once you have your list, continue to the fun coding part…

Enable the Facebook Provider in Startup.Auth.cs

If you haven’t already, you’ll need to enable the Facebook provider via Startup.Auth.cs. Make sure you do this *after* any cookie authentication, so “normal” username/password logins are serviced before Facebook takes over. This should already be the case, as the default ASP.NET MVC template includes the many optional providers afterwards by default.

I suggest keeping the App ID and Secret in your config file – or at least out of code – so you can swap for differing environments as necessary. The code snippet below enables Facebook authentication, and specifies the profile fields for which we’ll be asking read permission:

You don’t have to use what I chose – it’s just what I needed for my particular case. Facebook *does* change allowed permissions and profile item visibility somewhat often. Stay on top of their developer changes – otherwise your site login may unexpectedly break.

// Enable Facebook authentication with permission grant request.
// Otherwise, you just get the user's name.
var options = new FacebookAuthenticationOptions();
options.AppId = ConfigurationManager.AppSettings["Facebook.AppId"];
options.AppSecret = ConfigurationManager.AppSettings["Facebook.AppSecret"];

Install the Facebook NuGet Package

In order to easily get access to the Facebook data, I used the Facebook.NET library. It’s easy enough to install:

Install-Package Facebook

Note: I used version 7.0.6 in this example. You should be able to find the latest version and changelog at

Handle the Facebook External Login Callback in AccountController.cs

Once Facebook has been configured, all requests from your website will direct to Facebook, where it will ask permission, and, if granted, will redirect back to the ExternalLoginCallback action in the Account controller. It is here that I suggest you retrieve the data you’ve requested from Facebook. You’ll then modify the associated ExternalLoginConfirmation View with fields to correct or remove any information from Facebook, then continue with the account creation process on your website. That’s the part where you’ll populate the ApplicationUser entity, or whatever you decided to call it.

It’s relatively simple, as shown in the code below. The steps are as follows:

  1. Get the Facebook OAuth token with a simple HttpClient call
  2. Make the request for Profile details using the Facebook.NET library
  3. Optionally, download the Profile photo and save it somewhere

Yes, I could split this out – refactor as you see fit, and feel free to share any optimizations.

Below is the change to ExternalLoginCallback to grab the data from Facebook after the redirect:

ExternalLoginCallback Code

If you’d like to get the profile image, below is an example:

GetProfileImage Code


Moving Forward

I hope this article has helped answer your Facebook integration questions. If you would like additional details, please post in the comments, or message me on Twitter: @Auri

Thank you!

I was recently included on a thread with a high school student considering programming as a career. Fellow developers at Eleven Fifty were sharing their insight. I liked my pre-caffeinated contribution. I hope you enjoy as well.

I echo Tiffany’s sentiment. I’d be delighted to be more interactive with you on questions. Funny – I think I went to school with a Rickleff.
Anyway… I *loved* computers growing up. Still, until I was in high school, I didn’t want to be a programmer, which I later learned was really a “software engineer.” I thought they were just unhealthy, unsocial slobs that worked long, grueling hours, with pizza their only food group. Well, that was television and movies, at least. I found programming and problem solving came easily, and I liked making the computer do whatever it was I wanted, if I only spent the time. I didn’t start out with programming as a career – I started with technology, being an analyst and writer at a consumer electronics research firm. It wasn’t until my friend [and employer] challenged me to write a program for the company, and I accomplished it by putting my hobby to good use, that I started thinking programming could be a career. I learned I could make a living with my favorite hobby. That’s fun, and freeing. It’s like not working, even when it feels like work.
So what will your career look like? Software engineering makes you somewhat of a white collar worker – the pay is higher, and you’re always working with intelligent people – not that you’ll always admit that. It’s more of a “white collar t-shirt” job, because you’re required to be both a thinker and a creator at once, which can be messy. Ask yourself if you like to make things better, and if you think about how to actually do it. Even if you don’t have the skill yet – that will grow over time, and you’ll have to fail… a lot – that two-punch thinking combination is what will get things done, and make you enjoy your job. Did I mention failing? It happens all the time. You’re always building things that don’t exist, based on ideas written in a few sentences by people who don’t know how to do what you’ll be able to do. Like the beautiful buildings you see when walking, to paintings at shows, to jokes you hear for the first time – all those are the final result after all the failures to make them reality before. Building designs start with an idea out of thin air, go through a billion revisions, and finally get built. Jokes usually start from trying variations that don’t get a blink, to the final one that makes an audience laugh. But the comic started the line of thought, from thin air, from inspiration, and from thinking about how people think. The same goes with programming.
The lesson: Fail quickly, then move on to the next approach.
That being said, I’ve found the best parts of programming are the community, and what it leads to.
First, Community. Software engineering is like medicine. You’re not going to know all the practices. You’ll be good at one, or a few, but can never be good at all. Yet, you’ll meet brilliant people that can fill in the gaps in your knowledge, and you feel even better when you do the same. As engineers, we inspire other engineers. Look at Steve Wozniak, Steve Jobs, Nicholai Tesla, Sergei Brin, Larry Page – all their bios mention influencers. Nobody did it on their own. They all had help.
Second, What it Leads To. Coming up with ideas all the time has its side effects. The most prevalent? A constant stream of ideas on how to make those cool computers, whether they have a keyboard or not – phones for example – do more stuff. You’ll have ideas. Lots of them. And you have the power to make your ideas real. You’ll fail in bringing them to reality, often. Like medicine, or any career really, you’ll get better over time, tuning your craft. You’ll release your ideas, maybe as apps, maybe as web sites, maybe just making your own projects millions of people use – like Apple, Google, Microsoft, and countless others you think of having the best and brightest. Those companies are full of people who aspired, as you do, to become software engineers at some point in their lives. Those companies were also started by software and hardware engineers. Heck, Apple practically invented the personal computer, and the software engineer that wanted to program it.
Gosh, that’s a lot, and I need another refill of coffee. I hope to discuss further, if you’d like.
Thanks and Best,
Appending what a fellow developer and instructor answered to the same student:
What your career looks like in 5 or 10 years is a very personal choice.  If you are a guy looking for a desk job with great benefits in a big company, that’s going to look very different than if you have an entrepreneurial spark that leads you to develop your own products or freelance.  I can tell you that you need to talk to all types of software professionals to get this knowledge and find out what excites you most.  The best way to do so is to attend networking events.  Verge is a fun one for entrepreneurs.  I believe Auri can refer you to a few great .NET networking groups.
After 5 years of MY career, I found myself climbing a technical corporate ladder inside of Motorola and being very content with that.  But after 10 years (still at the same company), I grew restless and started my own freelance firm on the side while also transitioning from test to architecture within the big company.  And after 15 years, I found myself appreciating the big picture of software (sales / pm / business dev) more than I did the nitty gritty code and new technologies.
As far as highs and lows in a coding career… that’s a bit more finite.  There’s a huge high when you can point at something and say, “I did that! And it’s AWESOME!”  And an ever bigger high when your peers and mentors do the same.  And for every coder, there’s a dark dark low when you run into a problem that you just CAN’T figure out.  You feel alone, you feel stupid, and you feel like a failure.  As a coder, you’re going to need to expect those situations, not fear them, just grow and learn from them.
Hope this helps.  Feel free to find me & Auri at Eleven Fifty and chat about this stuff during the time you’re here.
Tiffany Trusty

I recently ran into a need to use the LAME MP3 encoder in a customer’s website. Problem was, once I deployed to Azure, I received an error of “Unable to load DLL libmp3lame.32.dll”. Uh oh! “But it’s in the bin folder!” I screamed silently at Starbucks. So, I binged the issue and found a good answer on StackOverflow. I’m sharing here because it helped unstick me, and I imagine others may be running to this issue with libraries other than LAME.

I ended up adding the function to my Global.asax, in addition to importing namespaces System.IO and System.Linq:

/// <summary>
/// Updates PATH variable in hosting instance to allow referring to items in this project's /bin folder.
/// Very helpful with Azure.
/// </summary>
public static void CheckAddBinPath()
    // find path to 'bin' folder
    var binPath = Path.Combine(new string[] { AppDomain.CurrentDomain.BaseDirectory, "bin" });
    // get current search path from environment
    var path = Environment.GetEnvironmentVariable("PATH") ?? "";
    // add 'bin' folder to search path if not already present
    if (!path.Split(Path.PathSeparator).Contains(binPath, StringComparer.CurrentCultureIgnoreCase))
        path = string.Join(Path.PathSeparator.ToString(), new string[] { path, binPath });
        Environment.SetEnvironmentVariable("PATH", path);

Then in Application start I simply added:

// Sometimes files aren't loaded properly from bin. Hint to the app to load from /bin, too.

I hope that helps!

Many developers have had that “labor of love” project – the kind that keeps them up nights trying to get everything right, figuring out how to pass that one last hurdle. Woz was no different, and the recently open-sourced code – for non-commercial use, of course – brought back memories of the days he worked on it so long ago, finishing in Vegas no less.

Some of you know I used to work for Steve, so I reached out to him with a link to the his code

Here’s his response:

On Nov 13, 2013, at 8:04 PM, ʞɐıuzoʍ ǝʌǝʇs wrote:

The MOST AMAZING code of my life…I could never do anything close to this much ‘out of any box’ stuff ever again…it was as amazing to come up with it as it seems to be reading my code. In some places I put numbers like (5) meaning that 5 cycles would be taken by that instruction – I had to count them all so the loops always sent a byte to the controller every 32 microseconds exactly. And there is no way to explain the 5-bit and 7-bit stuff but it extended the data from 13 sectors to 16 sectors. The 13-sector version was running in Las Vegas. The improvement to this 16-sector code is the part that I worked on every night for a month, nearly finishing each night around 2 AM (Denny’s milkshake) but repeating the whole process the next day because I had to keep getting the entire huge framework in my head each day. Finally I stayed one night until 6:30 AM and got it totally done. Jobs had been asking me every day when it would be done and that morning I told him that it was! This part of the low-level disk code was not Randy’s but I am so thankful for the parts he did so well too that made higher level sense out of this. I consider this code to be more like hardware than software.