Categories
Uncategorized

Managing Golang Workspace: My ZSH Configuration

One of the first thing beginners wonder in the Go userland is how to organize a project. Go expects to have a global workspace. A go workspace contains 3 directories: “src”, “pkg” and “bin”. The src directory contains the source codes for all your projects and their dependencies. When you try to import a package, go compiler will try to locate it under this “src” directory. The “pkg” directory is used to build cross OS packages out of your source code. Yes, you can build single compiled binaries for other platforms directly from your current OS. That is one of the awesome features of Golang. Finally, the “bin” directory holds all the executable binaries. When you’re building a command line app or trying to install one from 3rd parties using the “go install” command, the binary is placed in here. I have the central Go Workspace in ~/Projects/golang.

Go expects the path of the go workspace as the $GOPATH environment variable. So I added this to my ZSH profile:

My $GOPATH is set to ~/Projects/golang:

Now that we have a workspace, how do we lay out individual projects? We can choose any structure we like. As long as Go can find required packages in the workspace’s src directory tree, it will be okay. However, since we all love to push our codes to some code hosting service, we will try to match our project structure with our VCS url structure. How? Well, first, we know that Go has a fantastic tool – “go get” – it can download source codes from an array of VCS and install them for us. How does it work? When I type: “go get github.com/masnun/go-project”, it understands that it’s a git project. It would create the reflecting directory structure inside the “src” directory of the workspace so that we can import the project as “import github.com/masnun/go-project” in our local projects. So it’s better if we keep our own projects in a similar pattern whether we publish them or not in the future.

I created a directory named “github.com” under “src” and then created “masnun” under that. Now my projects would reside in: ~/Projects/golang/src/github.com/masnun directory. My newly created project path would be something like: ~/Projects/golang/src/github.com/masnun/go-project-name. I can now treat ~/Projects/golang/src/github.com/masnun directory as my personal workspace. So, I added these to my .zshrc for convenience:

After I have this mirrored up, I can actually do:

Then I added a handy alias to emulate Python’s virtualenvwrapper’s “workon” command:

So I can now just do:

I also added the ~/Projects/golang/bin (aka $GOPATH/bin) to my system path so that I can use the commands installed from “go install” or “go get”.

How do you organize your Go projects? What tools/techniques do you use in day to day Golang hacking?

Categories
PHP

HHVM & Hack: The painless way to get started

So we have heard about the new PHP Virtual Machine from Facebook – HHVM and the static typing flavoured new programming language called “Hack” that comes with HHVM. If you haven’t already, check out hhvm.com and hacklang.org for more details.

Now, if you are on a Linux box, setting up HHVM would seem a little less complicated. But if you are on Windows or Mac OS X, the hell breaks lose. HHVM doesn’t have any support for Windows yet. You can manually compile it on OS X or perhaps use a package manager like Homebrew (which would automate the compilation for you). However, because of some bugs in HHVM, the setup for HHVM 2.4.2 has been failing (as I found out from the homebrew repo pointing to the hhvm bugs) on homebrew. I did have an older version installed but I wanted to go cutting edge. So, I needed a Linux box. If you are on Windows, this is a solution for you as well. I setup a Ubuntu VM to install the latest HHVM. I could just download a 64 bit ISO and install inside VirtualBox but I preferred Vagrant since it’s just easier to setup and use. I am going to walk you through the setup now.

Step – 1: Get Vagrant

Head over to: http://www.vagrantup.com/ and follow the instructions for your OS. It is quite simple. You would need to have VirtualBox installed for Vagrant to work.

Step – 2: Installing and launching the Ubuntu VM

Create a directory somewhere and cd into it.

Let’s create a vagrant configuration file:

This would create a file named “Vagrantfile” which is a configuration file written in Ruby.

Let’s add a box, a box file is basically a VM image and configuration packed in one file. We shall download one of the default box, Ubuntu 12.04 64bit which we would call “precise64”. “Precise Pangolin” was the nickname of Ubuntu 12.04 if you didn’t know. And please note HHVM pre built packages are available for Ubuntu 12.04 64bit, so we can’t go for 32bit here.

(PS: If you have a bad internet connection, download the file using a download manager and then use relative path like: “vagrant box add precise64 ~/Downloads/precise64.box” – that would work as well 😀 )

Now let’s make sure that we told Vagrant to use the newly created “precise64” box as the base of our VM. My Vagrantfile roughly looks like this:

Now, let’s get the VM up:

This should setup the Ubuntu VM and we’re ready for installing the HHVM now 😀

Step – 3: Setting up HHVM

SSH into the box:

You shall be SSH’d into the linux terminal. So you can play around 🙂

Now, we are going to install HHVM from the official repo. Type the following commands one after one to install. Explanation of the commands are available in comments:

If everything goes right, we should have a working HHVM installation!

(The above instructions to setup HHVM on Ubuntu 12.04 were taken and very slightly modified from: https://github.com/facebook/hhvm/wiki/Prebuilt-packages-on-ubuntu-12.04)

Step – 4: Saying Hello!

First, let’s see if HHVM was installed correctly.

So it was installed correctly.

Let’s try some Hack:

Output:

Now, feel free to try out HHVM and Hack along with the many cool things they can do.

Some useful resources:

A sample site: https://github.com/hhvm/hack-example-site

The PHP Manual with Hack references: http://docs.hhvm.com/

Have something to say? Please leave your feedback in the comments section.

Categories
Uncategorized

Copying (duplicating) MongoDB Documents (Rows)

The use case is simple – I have one row (I mean document). I need to make multiple copies of it. Say, I am building a blog app and I need to quickly generate a few posts on the database. Scripting is one way to do it, but if I need to do this only once, automation is a waste of time.

Thanks to mongodb’s shell and JS-like APIs. This is actually simple.

Connect to mongodb:

Select the database:

Find an entry on the “posts” collection:

Now let’s change the “_id”:

X is now a whole new object/document (since we changed the “_id”). We can alter other fields as well. Let’s store it:

You just copied one document into a new document. Cool?

The command line mongo client has readline and history support. So you can actually use the up arrow to repeat the commands quite easily.