Thursday, December 5, 2013

Vim in all it's awesomeness

I have tried many text editors (and various IDE's) over the years and I always come back to VIM for just about everything, especially anything programming related. Vim on it's own is great but with some plugins and some simple changes it's awesome. Everything from syntax highlighting (using Syntastic) to autocompletion of functions and variable names. Since I write a lot of code in Python and Puppet (Syntastic has checkers for both and much more) which has saved me an incredible amount of time since I started using it.

Do yourself a favor and take 5 minutes to go get the incredible Janus: Vim Distribution.
It's a quick and painless install.
From the Janus README:

    $ brew install macvim    (optional - requires Homebrew)
    $ curl -Lo- https://bit.ly/janus-bootstrap | bash

The above two commands are all you need, that second command will also backup your existing Vim files in your home directory so you don't lose anything you may already have setup.

Customization is fairly simple using ~/.vimrc.before and ~/.vimrc.after files in your home dir.
The only changes I make to the base Janus setup is shown below, put these changes in ~/.vimrc.after if you like.

    " Clear searches easily with ,/ after
    nmap <silent> ,/ :nohlsearch<CR>

    " Give a shortcut key to NERD Tree
    map <F2> :NERDTreeToggle<CR>

    " Disable F1 help crap, map to ESC instead
    map <F1> <Esc>
    imap <F1> <Esc>

One of my favorite commands once you have Janus installed is to reformat an entire file with a simple keystroke:
  • <leader>fef formats the entire file
The default <leader> character is \ so \fef reformats your current file.
Stop living in the dark ages, go install Janus right now!

Thursday, April 4, 2013

Git - Move subdirectory to new repo

I had a need to move/detach a subdirectory that was inside a larger Git repository into it's own smaller/standalone repository. After a few Google searches it turns out this is a fairly common and relatively easy thing to do.

Not required but I like to start with a fresh clone of the repo I'm working with into a temp directory.

  mkdir tmp
  cd tmp
  git clone my_original_repo_url

Now clone the repo again (this time it's a local only clone of the repo above):

  git clone --no-hardlinks my_original_repo new_repo_name
  cd new_repo_name

Extract just the subdirectory you want:

  git filter-branch --subdirectory-filter mysubdir

Now lets remove the old remotes, any unneeded history and repack the repo:

  git remote rm origin
  git update-ref -d refs/original/refs/heads/master
  git reflog expire --expire=now --all
  git repack -ad

Now you can add your new remote(s) in and push your changes up to the server:

  git remote add origin my_new_repo_url
  git push origin master

Note: If you are using Gitorious it may at this point complain about a 'invalid ref' when you push it to the server. As far as I can tell this does not cause any problems and only occurs on the first push.

So that covers making your new repo from a subdirectory now lets go remove the now old subdirectory from the original repo so we don't commit to it by accident. I'm using a simplified removal process, you could remove all references and commit info for the subdirectory if you like but for my case that was overkill.

  cd ../my_original_repo
  rm -rf mysubdir
  git rm -r mysubdir
  git commit -m "Removing subdir, it has been moved to its own repo now"
  git push origin master

All done!
Your subdirectory has now been moved from the original repository into a new repository with all your history and commits intact.

Tuesday, March 26, 2013

Gitorious/Redis installer updated

In regards to my last post gitorious-and-redis-service I have updated my clone of the ce-installer to include the changes up to v2.4.12 and rolled all my changes from that post into the latest version.

My CE-Installer clone:
 https://www.gitorious.org/~kholloway/gitorious/kholloways-ce-installer

I have requested a merge with the mainline ce-installer which is viewable at:
 https://www.gitorious.org/gitorious/ce-installer/merge_requests/2

Enjoy!

Monday, March 25, 2013

Gitorious and the Redis service

Gitorious has a very nice status command via /usr/bin/gitorious_status that quickly shows you if all your Gitorious services are up and running (see screenshot).











It's missing one very important service though, Redis!

Redis is now the default messaging service when you do a fresh install via the Gitorious CE-Installer but it's not included in the status check, it's missing from the /admin/diagnostics page and it's missing a Monit check file to restart it if it dies. Keeping it running is pretty important for a working Gitorious install because without it many of the web page operations like creating a new project or team will fail and it won't be very clear from the logs why it failed.

Lets fix some of those problems.

First off lets patch the gitorious_status script with the patch below which should work on any modern Linux variant.

Save the lines below as:
 /tmp/my.patch

*** gitorious_status 2013-03-25 16:11:04.475121039 -0500
--- gitorious_status_redis 2013-03-25 16:16:35.380135982 -0500
*************** unicorn_status() {
*** 26,31 ****
--- 26,35 ----
      check_process_and_report "ps -p $PID" "Unicorn"
  }

+ redis_status() {
+     check_process_and_report "/etc/init.d/redis status" "Redis"
+ }
+
  # Upstart's exit codes are a beast of its own
  resque_status() {
      check_process_and_report "/sbin/initctl status resque-worker" "Resque"
*************** sphinx_status
*** 80,82 ****
--- 84,87 ----
  memcached_status
  sshd_status
  mysqld_status
+ redis_status

Apply your patch to the status command:

     patch /usr/bin/gitorious_status < /tmp/my.patch

Your status command should now show the details of the Redis service as shown below.












Next lets create a Monit config file for Redis which will watch the process and restart if needed.
I use Puppet and a custom Monit module I wrote for this but it's not required.
For now lets just manually create the file and you can integrate it into your configuration management tool later if you like. Note that the Monit file below is specific to Redhat, change the pidfile and start/stop lines as needed to match your OS.

Copy the contents below into:
   /etc/monit.d/redis.monit

check process redis-server with pidfile /var/run/redis/redis.pid
  start program = "/sbin/service redis start"
  stop program = "/sbin/service redis stop"
  if does not exist for 1 cycles then restart
  if 5 restarts within 5 cycles then alert

Now lets restart Monit so it picks up the change.
On Redhat that's done like so:
   service monit restart

Check that it's setup correctly in Monit:
    monit summary

OR
    monit status

So now you have Redis monitored by Monit and the gitorious_status command shows you if it's up or down but your /admin/diagnostics page is still missing any status about it. That last bit is not too hard to fix but for now I'm leaving that up to the Gitorious folks to patch along with the incorrect status about the gitorious-poller service which is not in use any longer.

Saturday, March 16, 2013

My new RSS setup after the death of Google Reader


My setup for now, so far working very well.

FeedaFever on my server (I love owning my own data!)
Reeder iOS app on the iPhone and I'm hoping the Reeder dev adds FeedaFever support for Reeder on iPad and Mac soon.

Fever has a usable web interface on both iPad and iPhone if you don't have a native app but Reeder is the gold standard on iOS for an RSS reader.

Alternative iPhone app choice for FeedaFever: Sunstroke

Some alternatives I looked at and still might use down the road are NewsBlur and Feedly.
NewsBlur is hosted with free accounts or premium accounts and if you want it's open source so you can download and run your own server.

Feedly looks nice also but I'm not used to the layout/setup yet.


Monday, March 4, 2013

Git CE Installer for RHEL 6.X

My small modifications to the main Gitorious CE installer so it installs cleanly on Redhat/RHEL 6.X instead of just on CentOS 6.X. It also does not try to update Puppet when it's already installed.

I'm maintaining a Git repo of my changes at Gitorious:
  Custom Gitorious CE Installer for RHEL


SVN to Git

SVN -> Git:

 Good post by Makis about how to setup SVN to Git conversions.

Transferring-svn-repository-to-git