Building a Development Environment: New Macbook Pro 2015, OS X Yosemite
The premise is simple: I have a new MBP 2015 (aka 2015 or ’15,) and it’s time to build my development environment.
My previous dev environment was a MBP 2009 (aka 2009 or ‘09,) running OS X Mavericks resulting from a series of upgrades starting with Snow Leopard. For various reasons, it’s time to build the dev environment from scratch. Primarily, I’m finding it nearly impossible to restore the Mavericks system onto Yosemite, even with Migration Assistant. The failure stems from moving my home folder to a second volume, which Migration Assistant ignores.
Another reason to build from scratch is, well, it’s time to build from scratch. The last time I built from scratch was several years and three OS versions ago, on Snow Leopard.
Finally, the SSD drive in the new 2015 MBP is smaller than the upgraded hybrid drive in the 2009. I’m not thrilled with this state of affairs; I got used to having almost 1TB available, so 500GB is feeling cramped. On the other hand, I’m sure there is some deadwood I’ve been dragging along that I really don’t need and won’t miss.
So, the rest of this post is a chronicle of app installations, dev environment configurations, and OS X customizations. I’m mostly interested in not losing track of how to do a build from scratch, but if this post helps anyone else, then so much the better.
Yosemite came installed on the ‘15. Not much else to report, here.
My normal MO is to create a recovery USB in case everything goes sideways. ‘Turns out, though, the new MBP won’t boot a ‘bootable’ USB installer — not even the currently-installed version of Yosemite. In fact, the App Store won’t allow the download at all, indicating that Yosemite is already installed. I had to use my ‘09 to download Yosemite and prepare the USB. Instructions on how to do this are on the other end of a Google search, of course. I tried two of the most common methods,
- using the createinstallmedia utility found in the Yosemite installer app package contents
- manually via Disk Utility, by restoring .dmg images and copying certain portions of the Yosemite installer individually
Now, the need for a bootable USB have apparently been superseded by the OS X Recovery Partition on the disk itself. If the Recovery Partition fails for any reason, then Internet Recovery can recover OS X over-the-wire from Apple’s servers.
Let’s hope the need never arises.
Finder — hidden files
Terminal command to make hidden files visible in Finder,
defaults write com.apple.finder AppleShowAllFiles TRUE
This can also be configured in the Onyx GUI.
(several of the remaining installations, especially dev tooling, will have specific updates for ~/.bash_profile)
An automator script to revert the system font back to Lucida Grande. Much more readable at Retina resolutions.
Put the keychain utility in the menu bar. It makes it easy to lock the screen without having to log off or start the screen saver.
- Show keychain status in menu bar (enabled)
A Note About App Store Installations
I initially had some difficulty getting previously-purchased App Store apps to install properly. Many of them claimed to have been installed, and the only option was to Open them.
It turns out this was a result of having restored my original Applications folder from Time Machine into a temporary folder on the ‘15. The App Store can find the app regardless of where it’s installed, so the restored copies looked like the real deal.
Solution: completely delete the restored app package, along with the ancillary file. My tool of choice for this is App Cleaner. Once deleted, re-launching the app store appears to have reset the status of the purchased apps, and the Install option showed once again.
The choice of browser is still easy, for me at least: Chrome.
The key to making this an easy install / configuration is syncing settings, bookmarks, etc. via Google Sync. Seeing all the extensions download and config automatically is especially nice.
Chrome gets some bad press of late on Yosemite, but I’m not experiencing any slowdown or other problems.
I’m choosing to ignore Firefox this time around.
One of two free Mac anti-virus utilities that balance coverage and speed. (the other is Sophos, although benchmarks in 2015 indicate Sophos has less coverage and is a little slower)
Use all defaults.
A minor annoyance: Avast! also installs their SecureLine VPN adware, which intercepts most attempts to connect to public WiFi with an offer to secure the line. I haven’t looked into removing this service from the OS startup, yet.
Total Spaces 2 ($)
Provides better control over multiple desktops than the native OS (since Mavericks)
- Enter license key
- Start TotalSpaces2 at Login (enable)
- Show notification graphic… (disable)
- Backgrounds in the overview grid (None)
- Set for 2 rows x 4 columns
- Enable circulation (Enable)
General system utilities for periodic maintenance, BSD script log viewer, system cleanup, etc.
Utility to manage file or folder permissions, including both POSIX chmod settings and ACL settings.
A Finder context menu service that makes creating symbolic links easier (from Finder).
Be sure to read the installation instructions: SnowLeopard and later need the .service, Leopard and earlier need the .plugin (but so what, right?)
Allows windows to be pinned to the top or sides of the desktop, a la Windows 7+
- May need to enable Accessibility, if prompted.
- Double-click on the license file to complete the registration.
- Start Cinch automatically at login (Enable)
Checksum Utility (AppStore)
Compare checksums for downloaded apps
A battery utility that helps monitor battery health and recommend full cycles.
- disable OS battery menu icon in Energy Saver Preferences
Utility to manage the menu bar. Primary purpose is to hide infrequently-used icons in a sub-menu. Another benefit is rearranging the order of the icons, including system icons.
- Launch Bartender at Login (enable)
Display Menu (AppStore)
Utility to select monitor resolutions from the menu bar.
- Start on Login (in the menu bar context) (Enabled)
A great utility that hunts down the ancillary files created by an application (e.g. .plist) and deletes them along with the main .app package.
Disk Inventory X
Utility to inspect the file distribution on a drive or folder as a tree-map.
EasyFind & FindAllFiles
Together these utilities will search the entire disk (including root permissions if necessary) for files based on file characteristics (FAF) or content (EasyFind). Both will find files in application bundles. Neither requires a separate index, but uses the file system directly.
Utility to enhance Finder. My purpose in using it is to automatically resize columns according the content.
LastPass (Safari / OS X helper)
LastPass is primarily a browser plugin. Under certain conditions I haven’t been able to isolate, LastPass prompts to install additional helpers in the Safari / OS X environment.
For certain kinds of logins, the installation will be prompted from within the browser. It runs quickly.
RemoteDesktop (MS v2.x)
This is NOT the Apple Remote Desktop. It is a Microsoft utility for Mac that allows you to sign into a Windows machine.
Restore the .rdc files from backup.
Silences the Mac startup sound during reboot, suspend, sleep operations.
Screen capture utility by Techsmith.
Lingon and LaunchControl
Both are plist editors and both are $10.
Lingon is a known quantity, having used it previously to set up the plist for svnserve. Only use the downloadable version (X2), not the AppStore version (3).
LaunchControl is worth a look, especially since it manages the appropriate launchctl registration from the GUI.
A utility that lets QT play .WMV files.
A sister utility from the same author is WM Components for streaming Windows Media assets.
QuickTime X PrefPane
A preference pane to help control QT options.
A preference pane to manage file associations via url, application, file extensions, etc.
OS X Server (AppStore)
Enables a large number of shared services. Several in particular are of interest, especially for local development,
- Mail (not sure if this is SMTP or not)
- Website hosting
- Enter license key.
- Keep in Dock
VM Fusion ($)
(optional, license should be renewed)
- Enter user credentials
- Show note counts in sidebar (enabled)
- Show Evernote Helper in the menu bar (disabled)
Office 365 ($)
Install from the Office365 download.
The Setup Assistant has a known problem with 1) server access, and 2) the Next button after entering your email address. To resolve,
- Use the Retry button. May take several attempts before you get the email screen.
- Hit Enter* instead of the button.
* If necessary, use the Tab key to focus on the Next button (light blue rectangle appears around the button) before hitting Enter.
You can expect an upgrade the first time you launch an Office program.
- Check for Updates: monthly
SimpleMind Pro ($)
Mind-mapping tool, with apps for mobile clients.
- Enter license key — put the license key on the clipboard and click OK in the license pane… SimpleMind does the rest.
- Setup Dropbox integration
- Import Basic.smmstyle from the SimpleMind dropbox folder
Current design / prototyping tool of choice.
- Enter the license key
- Keep in Dock
When creating a shared project, these are the recommended svn settings,
Team (Shared) Project Name:
Team (Shared) Project Directory:
~/Documents/Axure/Shared Projects/<client name>/[LOCAL | SERVER]_Repo
~/Documents/Axure/Prototypes/[LOCAL | SERVER]_Repo
Current sketch / concept tool of choice.
- Enter the license key, if necessary. Under some conditions, the license key is already known to the application following installation.
Development — IDE
JetBrains WebStorm ($)
Still my favorite, having used Eclipse over the years and Visual Studio most recently. The plug-in ecology is robust, and each major upgrade (from 7–10) rolls the most useful plugins into the product directly.
Plus, I find keeping this IDE configured and running to be much easier and transparent than Eclipse. And VS has an unmistakable Microsoft dev ecology focus.
Typical DMG installation.
- Drag to Applications/DEV
- Start up and Keep in Dock
- Import settings from previous installation. If necessary, specify the config folder location from a backup (~/Library/Preferences/WebstormX)
- Enter the license key information
Install plugins (see WebStorm Plugins section below)
JSCS support is now baked into version 10, although a plugin with a slightly different focus is still available. I’m trying the built-in support this time around.
JetBrains IntelliJ ($)
(see JetBrains Webstorm section for a description and rationale for JetBrains over Eclipse or VS)
So why both IntelliJ and Webstorm? While it’s possible to install all the same plugins in IntelliJ to acheive parity with Webstorm, IntelliJ project structure has a Java focus that adds some unnecessary complexity to pure Web front-end, or MEAN full-stack projects. Webstorm strips all the ‘module’ infrastructure from the project, which simplifies things quite a bit.
That said, Webstorm doesn’t “do” Java, nor PHP, nor Wordpress plugins (PHP-focused), etc. I’m happy having both IDEs available depending on the project.
Typical DMG installation.
- Drag to Applications/DEV
- Start up and Keep in Dock
- Import settings from previous installation. If necessary, specify the config folder location from a backup (~/Library/Preferences/IntelliJX)
- Enter the license key information
Install plugins (see IntelliJ Plugins section below)
Attaches to a Wordpress instance to ease plugin and theme development.
A fairly useful, multi-column text editor for quick edits to single files outside the context of a development project. It has IDE capabilities, but nothing like the full project support in the JetBrains IDEs.
That said, for simple edits, diffs, etc. without starting up a new project or polluting and existing one, Sublime fills in nicely.
- Enter license key
If you’re so inclined, these directions will make the SublimeText CLI available from the Terminal. If you also set the EDITOR env variable as shown, then ST will launch instead of vim for CLI utilities that would normally launch vim.
Text Wrangler (AppStore)
Another light-weight text editor.
Obviously necessary for any Coco or iOS native development. Beyond that, it’s how one gets a base installations of Ruby, Subversion, etc. It’s also required to get the Command-line Tools, when they’re required by other libraries and processes.
(see the note in git > Configuration for information about resolving conflicts between XCode git and the git installer)
XCode Command-line Tools
In Terminal, the following command will launch the installation dialog,
Development — VCS
The command-line client, and the underlying client for other GUIs and processes, like GitHub, SourceTree, npm, etc.
The mac os installer put git where it belongs, in /usr/local/bin.
The git installer puts its installation path, /usr/local/git/bin, in /etc/paths.d/git. Unfortunately, XCode installs a git command in /usr/bin which conflicts with the git installer path (see the following Aside.)
Once both XCode and git have been installed, verify the correct git installer path, /usr/local/git/bin, is in ~/.bash_profile.
Aside: /usr/bin and several other system-related paths are configured into the PATH by /etc/paths. Some other apps, the git installer among them, place their own system-wide path information in /etc/paths.d/git, for example. The problem in the case of git is /etc/paths will always appear before the series of paths in /etc/paths.d, so without additional intervention, the git at /usr/bin will be found before the one at /usr/local/git/bin.
A git add-on to manage branching according to git-flow practice.
brew install git-flow
Set SourceTree to use the new system git-flow instead of its built-in git-flow.
A git and mercurial GUI client of choice. From Atlassian, with integration to BitBucket (also Atlassian) and GitHub.
- On first launch, enter your BitBucket and/or GitHub account details.
- Keep in Dock
- Open SourceTree>Registration… and drag or import the license file (in the installation dir)
Set the system git-flow (Homebrew installation) as the git-flow provider.
Set DiffMerge as the diff tool.
The desktop GUI that connects to your GitHub account, and manages local clones of your cloud repositories.
On first launch, you’ll be asked for your GitHub account details.
TFS (Team Explorer Everywhere)
Only necessary for working in teams using TFS. Otherwise I’d avoid it completely.
Importantly, it’s the only way to deal with server-based shelvesets. Neither the JetBrains TFS plugin nor the built-in shelveset support works with server-side TFS shelvesets.
- Unzip the TEE-CLC-<version>.zip file
- Move the contents of the zip file to /usr/local/tfs
Add the following path to ~/.bash_profile,
and verify the installation,
The above ‘tf’ command may launch a Java Installer message. If it does, select the proper JDK (not JRE) for Mac OS X.
Add the following environment variable to ~/.bash_profile
Why do this? Two reasons.
One I have some legacy data and projects in a SVN repository. Frankly I haven’t looked into the git bridge or conversion process in any depth.
The other reason is Axure. Axure’s team-based projects use SVN for version control.
GUI client for SVN
Development — Agile
Web SAAS Kanban. Proly replacing Leankit for personal use.
Web SAAS Kanban. This will likely be replaced by KanbanTool.
Although, Kanbanerry is enabled in JetBrains via plugin, so that might be worth a second look as well.
Development — Libs
NodeJS / NPM
If you’re doing full-stack development these days, the back end is either Node or RoR, right?
Download the node installer from nodejs.org.
DO NOT install via Homebrew… too many configuration gotchas with npm moving forward.
DO NOT install any portion of node, npm, or npm modules using ‘sudo’. There is no need, and this will also cause later configuration issues.
Verify the installation.
Set permissions on the global npm folder.
To keep from using ‘sudo’ for npm operations (a Bad Thing,) get the global location of npm, and change the folder owner using the following command (note the back-ticks, `, not single-quotes, ‘)
sudo chown -R `whoami` `npm -g config get prefix`
Set the default depth of the package listings.
Normally, ‘npm list’ shows all packages, including sub-package dependencies. This can become a long, unwieldy listing. Add the following config to ‘/usr/local/node/.noderc’ to limit the list to just the top-level packages,
npm -g config set depth 0
npm -g update npm
Global NPM Packages
npm -g install n
Install whichever node versions you need using one of,
Set the current node version,
then select the version from the list.
Always been the choice for front-end libraries. Becoming a more succinct contender for back-end (NodeJS) libraries as well…?
npm -g install bower
Allows NodeJS modules (read: CommonJS modules) to be packaged up and used in the browser, with some occasional caveats around libraries expecting to be near the server OS.
A very reasonable attempt to write a JS module once, and decide on a per-project basis whether to deploy it client-side or browser-side. In my experience, easier than trying to write the boilerplate load wrappers to make it AMD (RequireJS) compatible.
Browserify also has the advantage of automatically extracting common dependencies among modules into a single, shared files.
npm -g install browserify
The world is moving to SASS. That said, there are some projects using LESS. And there are still some reasons to choose LESS on occasion:
- When you absolutely, positively must be able to transpile to CSS in the browser. Creating JSFiddles jumps to mind.
- SASS has some peculiarities around dependency management across files, and variable overrides and scoping that LESS solves in a different, more hands-off way.
npm -g install less
npm -g install node-sass
npm -g install grunt-cli
npm -g install gulp-cli
npm -g install jasmine
npm -g install jasmine-node
npm -g install mocha
npm -g install jscs
npm -g install sc5-styleguide
Mongo, Express, Angular, Node
Two useful possibilities for stand up the MEAN stack: mean.io, or MEANStack from bitnami.
If a MEAN stack is required, visit either of these sites for instructions,
Also check the entire bitnami stack set.
Full instructions for Homebrew, rbenv, Ruby and Ruby On Rails (RoR) are at this GoRails url,
A guide to setting up a Ruby on Rails development environment This will take about 30 minutes. We will be setting up a…gorails.com
Run this command in Terminal,
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Then, to verify the installation, run these commands,
Run this command to use Homebrew to install rbenv,
brew install rbenv ruby-build
Run this command to add the rbenv shim to ~/.bash_profile,
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
Also note: the rbenv formula makes these caveats,
To use Homebrew’s directories rather than ~/.rbenv add to your profile:
To enable shims and autocompletion add to your profile:
if which rbenv > /dev/null; then eval “$(rbenv init -)”; fi
Installation (upgrade via rbenv)
Run these commands to use rbenv to install parallel versions of Ruby,
rbenv install 2.2.2
rbenv global 2.2.2
Verify Ruby is installed and ready,
Ruby on Rails (RoR)
Run this command to install RoR,
gem install rails -v 4.2.1
Rehash rbenv to make rails command line available,
and verify rails is ready,
Run this command to install nginx via HomeBrew,
brew install nginx
Verify that nginx is ready,
If Java is not installed, follow the dialog to the Oracle download page and select the JDK (not JRE) for OS X.
Run the installer.