Git, GitHub and an open source .NET project – Part 5

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is the final part of my journey into learning Git, using GitHub and contributing to an open source project.

GitHub Workflow

As I discussed in an earlier post, the typical workflow of contributors to an open source project hosted on GitHub can be a bit intimidating. It involves the following steps:

  • Fork
  • Clone
  • Write and commit code
  • Push
  • Submit pull request

I have gone through forking a project and cloning the repository. Writing and committing code to your local repository. Pushing those changes up to your cloned repository on GitHub. Now all that is left is to submit a pull request to the master project.

Pull Request

A pull request wraps up a number of commits so that another interested party can review them and decide whether or not to include them in a master project. GitHub makes this incredibly easy.

GitHub - pull request

I navigated to my paulbouwer/SolrNet repository on GitHub and after confirming the commit details via the Commits tab clicked on the Pull Request button.

GitHub - pull request

I wrote a comment around the commits I was submitting in the pull request. GitHub always makes it clear as to what is going on. Note the You’re asking mausch to pull 1 commit into mausch/master from paulbouwer/master.

GitHub - pull request

GitHub allows you to verify the commits included in the pull request via the Commits tab.

GitHub - pull request

GitHub allows you to verify the files and diffs on those files included in the pull request via the Files Changed tab. I had a number of issues with line ending differences on my files vs the master project – so a great tip is to pay attention to these. Mauricio kindly resolved these for me.

GitHub - pull request

GitHub allows you to preview your pull request message via the Preview submenu on the Preview Discussion tab. I finally submitted the pull request by clicking on the Send pull request button.

GitHub - pull request

The pull request has now been added to the pull requests queue of the master project mausch/SolrNet. GitHub again makes it clear as to what is going on. Note the paulbouwer wants someone to pull 1 commit into mausch/master from paulbouwer/master.

GitHub - pull request

Clicking on the Pull Requests tab in the master project mausch/SolrNet shows the current pull request queue and confirms that my pull request is in it.

Acceptance

Commits accepted into master project

I was notified by GitHub via email that my commit had been accepted by into the master project mausch/SolrNet. I confirmed this by clicking on the Commits tab on the master project page.

Issue 83 closed

I also confirmed that the feature I had worked on was now closed in the SolrNet issues list. It felt good – my commit had been accepted into the master SolrNet project.

End of a journey

This has been an incredible journey and I can highly recommend dedicating some time and code to an open source project. The satisfaction of contributing to a project used by a community is something else. You also get a lot back – my knowledge of Git has improved and the insight into how other people code and their thought and design processes has been invaluable.

There’s nothing stopping you – find a project that you believe in and help out !

Git, GitHub and an open source .NET project – Part 4

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is part 4 of my journey into learning Git, using GitHub and contributing to an open source project.

The feature

The feature in SolrNet that I was interested in updating revolved around using the built in Service Locator to support multi-tenancy.

SolrNet Issue 83

No one had volunteered their time to implement this feature as can be seen by a thread in the SolrNet Google Group, so I decided to jump in and implement the feature.

SolrNet Google Group

Committing the implemented feature

After implementing the feature I was ready to commit my code to my local repository which was located in my C:\Projects\GitHub\SolrNet folder. I ran the git status command via the Git Bash shell. This will show any new files that I have created or any changes to existing files that I have made.

git status

git status

The Changed but not updated list refers to files that have been modified in the working directory but have not yet been staged. The Untracked files list refers to new files in the working directory that Git does not have in a previous snapshot (commit). All these files need to be added to the staging area in preparation for the commit.

The staging area is where changes can be grouped before being committed. This gives you a lot of flexibility in what actually goes into a commit. There is a nice explanation on the git ready site.

I ran the git add command via the Git Bash shell for each of the files that I needed to add to the staging area.

git add

git add

I then ran the git status command via the Git Bash shell again to confirm that the files were now all in the staging area of my local repository.

git status

I ran the git commit command via the Git Bash shell to commit the changes from the staging area. The -m switch allows you to specify the commit message. I used the issue details Issue 83: Support for multi core using ServiceLocator as my commit message.

git commit -m

git commit

I ran the git status command again via the Git Bash shell again to confirm that all staged changes had been committed in my local repository.

git status

Pushing commits to public repository

You may have noticed the following message in the last screenshot: Your branch is ahead of ‘origin/master’ by 1 commit. This is showing that my local repository now has a commit that is not in my public paulbouwer/SolrNet repository. To confirm that the name origin references my public paulbouwer/SolrNet repository I ran the git remote command via the Git Bash shell. The -v switch switches on verbose messages and the show -n action and switch specifies the name of the remote.

git remote -v show -n

git remote

I next ran the git push command via the Git Bash shell to push my commit to my public paulbouwer/SolrNet repository on GitHub. I am pushing my local changes to the master branch on my origin remote. Note that the password here is not your passphrase but your GitHub account password.

git push

git push

A final git status command via the Git Bash shell confirms that my local branch is no longer out of sync with my public paulbouwer/SolrNet repository on GitHub.

git status

Confirmation

The commit pushed up to my public paulbouwer/SolrNet repository on GitHub is clearly visible under the Commits tab. Clicking on the commit hyperlink for the commit will take you to the details of the commit.

GitHub Commits

Next is submitting a pull request and getting the code accepted into the master repository …

Git, GitHub and an open source .NET project – Part 3

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is part 3 of my journey into learning Git, using GitHub and contributing to an open source project.

Configure Git Options

Since I was about to fork a project and start dealing with code it seems like a good time to configure my identity within Git. Git uses your name and email address to sign your commits.

This can be achieved via the Git Bash shell by typing the following commands:

git config --global user.name "your_full_name" git config --global user.email "your_email_address"

The global switch applies this information to all of your projects. If you would like to override options for a particular project leave out the –global switch when in that project.

The following command will list out all your configured options:

git config --list

git config

GitHub Workflow

The typical workflow of contributors to an open source project hosted on GitHub can be a bit intimidating. It involves the following steps:

  • Fork
  • Clone
  • Write and commit code
  • Push
  • Submit pull request

I’ll discuss the first two steps (fork, clone) in this post and will cover the remainder in the next two posts.

Forking the SolrNet Project

The SolrNet project was created by Mauricio Scheffer and is hosted on GitHub at https://github.com/mausch/SolrNet.

To contribute code to a project on GitHub typically starts with you having to fork the project. Forking the project creates a copy of the master repository with a complete history under your GitHub account. This is great since it allows you to start contributing code and have the changes publically available to anyone who wants them – you don’t need commit access to the master project.

Fork project on GitHub

I navigated to the master project mausch/SolrNet page and clicked on the Fork button.

Forked project on GitHub

GitHub managed the forking of the master project and created a forked copy for me. It is now available at https://github.com/paulbouwer/SolrNet. GitHub also clearly shows that the project has been forked from the original project mausch/SolrNet.

Git is a distributed version control system which allows greater flexibility in how developers contribute and collaborate on projects. I don’t have commit access to the master repository mausch/SolrNet so GitHub helped me fork the repository to create a public repository paulbouwer/SolrNet to which I have read/commit access. So now I can commit changes into my paulbouwer/SolrNet repository and Mauricio can pull any of my commits into the master mausch/SolrNet repository (if he wants them).

Cloning your GitHub repository

A typical and common workflow in Git is to have a private local copy of your public repository. This allows you to have a working space that is under revision control. Once you are happy with the changes you have implemented you can roll them up into a single commit to your public repository and ask the maintainer of the master project to pull your commit into the master repository.

Obtaining a private local copy of your public repository is achieved using the git clone command. As the name suggests this is a clone of the repository (as opposed to a checkout in SVN). The cloned repository contains its own copy of the entire history of the project.

First we need the public repository URL from GitHub. I was having some firewall issues with SSH so decided to use my HTTP URL.

GitHub repository HTTPS URL

I ran the git clone command from the C:\Projects\GitHub folder via Git Bash shell. When prompted for a password enter the key passphrase for the SSH key registered with GitHub.

git clone https://paulbouwer@github.com/paulbouwer/SolrNet.git

Clone project

Confirm files

This successfully cloned my public paulbouwer/SolrNet repository into my C:\Projects\GitHub\SolrNet folder as can be seen above. You can also see that the master branch is the active branch at the moment.

You can also clone a repository via TortoiseGit by clicking on Git Clone … on the right click context menu in Windows Explorer in the C:\Projects\GitHub folder.

 TortoiseGit - Git Clone ...

After providing your SSH key passphrase TortoiseGit will begin the clone.

TortoiseGit - cloning

TortoiseGit - confirm files

TortoiseGit has successfully cloned my public paulbouwer/SolrNet repository into my C:\Projects\GitHub\SolrNet folder as can be seen above. This is missing some of the contextual information we saw in the Git Bash shell such as the current active branch. I prefer using the Git Bash shell as it gives me more information and finer grained control. I will continue purely with the Git Bash shell for the rest of this series of posts.

Adding remotes

Now that I have a local copy of my repository I need a mechanism to manage changes between it and my public repository paulbouwer/SolrNet. I also need to manage changes between my local repository and the master repository mausch/SolrNet. This is achieved using the remotes concept in Git.

From the Working with Remotes section of the Pro Git book:

Remote repositories are versions of your project that are hosted on the Internet or network somewhere. You can have several of them, each of which generally is either read-only or read/write for you. Collaborating with others involves managing these remote repositories and pushing and pulling data to and from them when you need to share work

Master repository on GitHub

I obtained the HTTP URL of the master repository mausch/SolrNet.

I added a link to the master repository using the git remote command via the Git Bash shell. I used the typical remote name of upstream to denote the master repository mausch/SolrNet. I used the git remote command to also verify that the remote was added correctly.

git remote add upstream https://github.com/mausch/SolrNet.git git remote –v

Add and verify remotes

The remote link to the master repository has been successfully added under the name upstream. But what is that remote named origin and how did it get added? When you clone a repository, Git automatically adds a remote to the repository you have cloned with the name of origin.

I then ran the git fetch command via the Git Bash shell. This fetches any changes from my upstream remote and pulls them down into my local repository. I did not do this for my origin remote since I know that I have just cloned my local repository from it.

git fetch upstream

Fetching upstream changes

The git fetch command fetches changes across all the available branches.

The final step is now to run the git merge command via the Git Bash shell. This will merge the fetched upstream changes into my local repository.

git merge upstream/master

Merge upstream changes

I was only concerned about the master branch changes and therefore that is all that I merged in from the upstream fetch. You can also see that since I had just forked my public repository and cloned my local repository from that there were no changes to merge in.

Now I have a public repository that I can use for pull requests and an up to date local repository that is ready for me to start coding in. Next is writing some code …

Git, GitHub and an open source .NET project – Part 2

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is part 2 of my journey into learning Git, using GitHub and contributing to an open source project.

What is GitHub ?

GitHub_LogoGitHub is the popular web-based hosting service for projects that use the Git revision control system. It has a large number of project management, code hosting and community based features.

Sign up for GitHub

GitHub offers a free account for open source projects. This account has an unlimited number of public repositories and public collaborators. There are also plans that cater for private repositories and collaborators.

Git_Part2_GitHubSignup

The source code for the SolrNet project is hosted on GitHub so I signed up for the free plan and created myself an account on GitHub.

Git_Part2_GitHubKeys

Once you have updated the Public Profile and Email Addresses sections of your account you will notice that you need to associate an SSH public key with your GitHub account.

Generate an SSH key

Fire up the PuTTY Key Generator executable puttygen.exe found in the PuTTY install folder.

Git_Part2_KeyGen1

Select the SSH-2 RSA radio button and ensure that the number of bits is set to 1024. Click the Generate button to generate the public/private key pair.

Git_Part2_KeyGen2

Cryptography calls for unpredictable random numbers. A simple way to obtain this randomness is to generate it from the user. The PuTTY Key Generator uses random mouse movements to generate randomness.

Git_Part2_KeyGen3

Give the generated key a comment and provide a passphrase. The passphrase provides an extra layer of security for your key. This is not my actual key but even if it was – all that is visible here is my public key which is meant for public distribution anyway …

Git_Part2_KeyGen4

Create a .ssh folder in your home folder. I created a C:\Users\paul\.ssh folder. Save your public key into this folder by clicking on the Save public key button.

Git_Part2_KeyGen5

Save the private key into your .ssh folder by clicking on the Save private key button.

Git_Part2_KeyGen6

You should now have a public/private SSH key pair for GitHub. My public key is github_rsa and my private key is github_rsa.ppk. Never let anyone have access to your private key !

Add public key to GitHub

Now we are ready to add our newly generated public SSH key to GitHub. Highlight the text in the Public key text box and copy it to the clipboard (CTRL-C).

 Git_Part2_AddKey1

If you have already closed the PuTTY Key Generator I’ll show you how to load the key back up. Fire up the PuTTY Key Generator executable again and click on the Load button.

Git_Part2_AddKey2

Select your GitHub private key file and click on the Open button.

Git_Part2_AddKey3

You’ll be required to provide your passphrase to load the private key.

 Git_Part2_AddKey1

Now highlight the text in the public key text box and copy it to the clipboard (CTRL-C).

Git_Part2_GitHubKeys

Go back to the SSH Public Key section in your GitHub account. Click on the Add another public key link.

Git_Part2_AddKey4

Paste (CTRL-V) the public key from your clipboard into the Key text box. Provide a Title for your key and click on the Add key button.

Git_Part2_AddKey5

GitHub is now set up with your SSH public key.

Next is forking the SolrNet project …

Git, GitHub and an open source .NET project – Part 1

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is part 1 of my journey into learning Git, using GitHub and contributing to an open source project.

What is Git ?

imageGit is a free and open source, distributed version control system initially designed and developed by Linus Torvalds of Linux fame. Even though there are fundamental differences from a revision control system such as Subversion, there are numerous books and documentation available to help you.

The major difference with Subversion is that every Git working directory is a full-fledged repository with complete history and full revision tracking capabilities, not dependent on network access or a central server. This takes some time to get used to but once the light comes on it is pretty cool.

Install PuTTY

If you want to use GitHub you’ll need an SSH key. Even though Git comes with an SSH client, I highly recommended that you install PuTTY on Windows. This is a free Telnet/SSH client that has a number of utilities that make dealing with SSH keys and passphrases more pleasant.

I downloaded and installed the PuTTY 0.60 Windows Installer.image4

Make sure that you associate .PPK (PuTTY Private Key) files with Pageant (SSH authentication agent) and PuTTYgen (SSH key generation utility).

Install Git

To install Git on Windows you need to download Git for Windows and install it. I downloaded and installed the full installer for official Git 1.7.3.1.

image11

I was only interested in using the Git Bash shell via the Windows Explorer context menu and so selected the Git Bash Here option. Since I was installing TortoiseGit for GUI based Git interactions I did not want my context menu cluttered with the Git GUI Here option.

image13

I selected the Use Git Bash only option here since I wanted my Git environment to work smoothly and remain contained. I was also only ever going to use command line Git from the Git Bash shell.

image14

Since I have PuTTY and TortoiseSVN already installed the Git installer has picked up the various Plink.exe executables. Plink is a command line interface to the PuTTY libraries that tools such as Git or TortoiseSVN/TortoiseGit use to provide SSH capabilities.

I selected the Use (Tortoise)Plink option and made sure that the file path pointed to the Plink executable in my PuTTY install folder. Now Git will use PuTTY to manage its SSH requirements.

image15

Git can translate line endings between Windows and Unix style line endings. I selected the Checkout as-is, commit as-is option as this would not perform any conversions. I figured that if I was working on a Windows project it should have Windows line endings.

image

Confirm that Git for Windows has been successfully installed by firing up the Git Bash shell. I fired mine up in my projects folder.

Install TortoiseGit

TortoiseGit provides an extension to Windows Explorer that works with a Git repository. Some people feel more comfortable using graphical tools. I prefer to have both since I can use whichever one helps me get a specific task done faster or easier.

I downloaded and installed the Tortoise Git 1.5.8.0 Windows installer.

image20

Like Git, TortoiseGit also can be made to use the PuTTY Plink executable.

image21

I selected all the features and completed the installation. That was easy !

Git enabled !

I now had Git installed and was equipped with both the command line Git Bash shell and GUI based TortoiseGit options.

Next is setting up GitHub …

Git, GitHub and an open source .NET project – Introduction

I have used the open source enterprise search platform Solr for a number of years now and on a recent project have been using the open source SolrNet .NET client library. The SolrNet library lacked a feature I required when used with the bundled Service Locator implementation. A number of people had been asking for the same feature so I decided to jump in and implement it.

This is my journey into learning Git, using GitHub and contributing to an open source project. I highly recommend the experience – you learn a great deal from reading and contributing to code that is so highly visible.

I have split my journey into the following 5 parts:

Updating multiple iPhones with a single iOS 4.2 download

After a number of years of roughly 200MB upgrades for my iPhone 3G and then iPhone 4 I was shocked when the latest iOS 4.2 update weighed in at just over 600MB. Added to the gut punch was the fact that I had to upgrade 2 iPhones now – yes, my wife has joined the cult.

What is iTunes actually downloading ?

iTunes makes it really easy to upgrade your iPhone but I wanted to be able to download the update once and use it to upgrade both phones.

01 - New version available

iTunes hides all the details from you – so how was I going to get at the iOS 4.2 firmware update file (.ipsw) ?

Use the proxy luke !

An HTTP proxy is a tool every developer should know how to use. I use Charles on Mac OS X. Fire up Charles to force all the HTTP traffic through a proxy and then click on the Update button in iTunes to start the download.

02 - iTunes

The other major factor in downloading this update only once is clearly visible in the status column. My ADSL router was on its way out and I just couldn’t get decent download speeds at the time. Thank goodness those days of darkness are behind me now – I’m very happy with my new LinkSys Dual-Band Wireless-N ADSL2+ Modem Gigabit Router. But I digress …

03 - Charles HTTP Proxy

The iOS 4.2 firmware update file (.ipsw) that iTunes was downloading is clearly visible in Charles:

We now have the complete URL for the file and can download it outside of iTunes. Stop the iTunes download as its purpose had now been served.

Download

I use curl when downloading large files and since it is bundled in Mac OS X there is no extra download or installation required.

04 - Curl download file

The "-C –" switch combination tells curl to automatically calculate where to resume the transfer. This ensures that if the connection drops or is reset you can resume the download where you left off.

The "-O" switch tells curl to save the download to a local file with the same name as the remote file.

Install

Fire up iTunes and hold down the option key while clicking on the Update button.

 01 - New version available

05 - Option update

The file selection dialog will open. Select the iOS 4.2 firmware update file (.ipsw) you have just downloaded.

06 - Select file

All the next steps will be familiar since they are all part of the standard steps for iOS updates.

07 - Update

Confirm that your iPhone has been updated.

08 - Updated

Now repeat the Install steps for each of your iPhones that you want to update.

The case of the annoying Tomcat 6 Monitor

Ever since installing Tomcat 6 on my Windows 7 machine at home I’ve had an annoying message box pop up every time I restart my machine: Access is denied. Unable to open the service ‘Tomcat6′. Since it takes less time and effort to click on OK than to sort out the problem that is exactly what I have been doing … but enough is enough.

Access is denied

Tomcat IS running – so what is causing this error?

I confirmed that the Tomcat 6 service was running even though I got this message box – so what was causing it ? It turns out that Tomcat 6 Monitor Application was causing this error. Tomcat 6 Monitor Application is a GUI for monitoring and configuring the Tomcat 6 Service. It needs to be executed by the Administrator user and the UAC is getting in the way at start up time.

Are you feeling brave ?

The only solution I have found to work so far is to remove the Tomcat 6 Monitor Application from the Windows startup. And the only way to do this is to remove a registry entry …

Fire up regedit (Start Menu > Search programs and files > regedit.exe) and remove the following key:

  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

567

Now you should not see this annoying message box every time Windows starts up. But it also means that Tomcat 6 Monitor will not be started on Windows startup.

Running Tomcat 6 Monitor manually

You may still want to run the Tomcat 6 Monitor since it does provide nice shortcuts for configuring and monitoring the state of your Tomcat 6 service. You can execute the Tomcat 6 Monitor via Run as administrator or you can configure the shortcut in the Start Menu to always execute the application as administrator.

Find the shortcut to the Tomcat 6 Monitor in the Start Menu (Start Menu > Apache Tomcat 6.0 > Monitor Tomcat) and right-click on it. Select Properties.

2

Click on the Shortcut tab in the Monitor Tomcat Properties window. Click on the Advanced button and check the Run as administrator checkbox.

3

Click Continue on the Dialog that pops up and now you should be able to start the Tomcat 6 Monitor by simply clicking the shortcut in the Start Menu. Windows will still flash the UAC though since you are running this application as administrator.

4

Update: 05 December 2010

The comment by Scot shows once again that there is always more than one way to skin a cat. Thanks Scot.

If you would still like to have the Apache Tomcat Monitor fired up on startup then replace the steps in this post with the following:

  • Leave the registry key ApacheTomcatMonitor at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run untouched. This will ensure that Windows starts up the Tomcat Monitor.
  • Right click on the tomcat6w.exe executable found at %CATALINA_HOME%\bin. Click on the Properties menu item and then select the Compatibility tab. Check the Run this program as an administrator checkbox under the Privilege Level section. Click the OK button.

Run as administrator

When Windows starts up now you will no longer get the Access is denied. Unable to open the service ‘Tomcat6′ message. The UAC will pop up and ask you to confirm the starting of the Apache Tomcat Monitor.

Tech-Ed Africa 2010 sessions I’m attending

I’ll be attending the following Tech-Ed Africa 2010 sessions in Durban next week:

Monday, 18 October 2010

  • Understanding the Microsoft Application Server: AppFabric, WF, WCF, and More (APS201)
  • What’s New in Windows Communication Foundation in .NET Framework 4 (APS306)
  • Using the MVVM Design Pattern with the Microsoft Visual Studio 2010 XAML Designer (DTL323)
  • Code Contracts and Pex: Power Charge Your Assertions and Unit Tests (DTL207)
  • Why functional programming matters – A look at F#, C#, and more (DTL304)
  • Building RESTful Applications with the Open Data Protocol (DTL310)
  • My Favourite Windows Presentation Foundation 4 Features (WCL206)
  • 10 Ways to Protect Users of Your Web Applications (WUX303)

Tuesday, 19 October 2010

  • LINQ, take two – realizing the LINQ to Everything dream (DTL414)
  • WCF: The Unified Services Programming Model for SOAP, REST, Data, and RIA Communication (WTB327)
  • Behaviour-Driven Development: Taking Unit Testing to the next level (DPR303)
  • RIA & Rich Client Applications: There is life beyond HTML (WUX311)
  • The Windows API Code Pack: Add Windows 7 Features to Your Application (DTL316)
  • Rx: your prescription to cure asynchronous programming blues (WTB324)
  • Designing and Developing a Windows Phone 7 Silverlight Application End-to-End – (part 1 of 2) (WPH202)
  • Designing and Developing a Windows Phone 7 Silverlight Application End-to-End – (part 2 of 2) (WPH303)
  • Windows Server AppFabric Caching: What It Is and When You Should Use It (APS309)

Wednesday, 20 October 2010

  • Best Practices: Building a Real-World Microsoft Silverlight Line-of-Business Application (WUX407)
  • Task Parallel Library: Design Principles and Best Practices (DTL424)
  • WCF Made Easy with Microsoft .NET Framework 4 and Windows Server AppFabric (APS310)

Happiness and Sadness

I’m really looking forward to the AppFabric and Windows Phone 7 sessions and am excited about both sets of technologies. I am bitterly disappointed though that the following two Tech-Ed North America 2010 sessions are not being presented given that Udi Dahan is in South Africa this week delivering his Advanced Distributed System Design with SOA & DDD (5 days) course:

  • Command Query Responsibility Segregation (ARC302)
  • High Availability: A Contrarian View (ARC308)

Upgrading a MacBook (13” Aluminum, Late 2008) – Part 1 (RAM)

I love my MacBook. It was the first 13” aluminum unibody notebook from Apple and although it was launched as part of the MacBook range it has since migrated to the MacBook Pro range.

I run my MacBook through a 24” Samsung SyncMaster T240 and use the wired keyboard and wired mouse. This gives me a nice desktop setup and when I need to be mobile the 13” form factor is perfect.

Lately I have begun to feel the limits of the stock 2GB RAM and the 160GB HDD. So it is time for an upgrade. I will be embarking on a 2 part project to upgrade both the RAM and the HDD of my MacBook.

RAM Specifications

Clicking on Apple > About This Mac showed that 2GB of RAM was installed and clicking on More Info … > Hardware > Memory showed that each of the 2 available memory slots had 1GB DIMMs.

About This MacMemory Slot information

According to the memory specifications at Apple Support my MacBook can take a max of 4GB RAM with the following specifications:

  • Double Data Rate Small Outline Dual Inline Memory Module (DDR SO-DIMM) format
  • 30mm
  • 1 Gigabyte (GB) or 2 Gigabyte (GB)
  • 204-pin
  • PC3-8500 DDR3 1066 MHz Type RAM

After looking at the price of Apple RAM I decided to rather purchase 2 x 2GB modules from Kingston (KTA-MB1066/2G). These are reasonably priced and are compatible with my MacBook.

Upgrading the RAM

Apple provide detailed instructions via their support site on how to upgrade your RAM. I shut down my MacBook and disconnected it from the power adapter. I had my new RAM, some precision screwdrivers and was ready to begin.

DSC_0122

Opening up the MacBook

Turn the MacBook over and push down on the door latch to release the access door. Remove the access door and the battery. The battery has a handy tab on it to make lifting it out of the bay easier.

Remove access door and battery

Next remove the eight screws that secure the bottom case of the MacBook. The screws at the top of the picture have slightly larger heads than those at the bottom and are easier to get out. I used a 1.4mm flat screwdriver on the top screws. I tried a #00 philips precision screwdriver on the bottom screws but my precision screwdriver was obviously not good enough. I finally resorted to a 1.2mm flat screwdriver to get the bottom screws out. You may notice that I only have 7 out of the 8 screws out. I couldn’t manage to get the final screw out and eventually gave up after stripping the head.

Removing the screws

Thank goodness the screw I couldn’t get out was a corner screw. I carefully pivoted the bottom case open around the remaining screw. Finally ! I was in.

Making a plan ...

Removing the old RAM

Touch a metal surface inside the MacBook to discharge any static electricity from your body. Then push the ejection levers on the sides of the memory modules outwards to release the first memory module from the memory slot. The memory should pop up at an angle. The first image in the sequence below shows the first memory module popped up at an angle with the second memory module still clearly visible below it. Remove the memory module from the slot remembering to hold the module by its notches and not the gold connectors.

Repeat the steps to release the second memory module.

Removing the old RAM

Installing the new RAM

Touch a metal surface inside the MacBook to discharge any static electricity from your body.  Align the notch on the gold edge of the module with the notch in the lower memory slot. Tilt the memory module and push it into the bottom memory slot. Use two fingers and push down the memory module with firm even pressure until it is level. The first two images in the sequence below show the first memory module tilted and then pushed level under the second (top) memory module.

Repeat with the second memory module. The last two images in the sequence below show the second memory module tilted and then pushed level above the first (bottom) memory module.

Installing the new RAM

Closing up the MacBook

Reverse all the steps from Opening up the Macbook. Replace the bottom case making sure it is sitting flush. Then replace and tighten the screws. Place the battery back into the bay and then replace the access door. Press it down gently until the latch moves to the closed position.

Confirmation

Switch on the MacBook and make sure it boots. Clicking on Apple > About This Mac now shows that 4GB of RAM is installed and clicking on More Info … > Hardware > Memory shows that each of the 2 available memory slots has correctly installed 2GB DIMMs.

About This Mac Memory Slot information