14 Feb 2013

Getting Started Configuring Bash/Zsh

I saw a post this afternoon by a member of Ruby Rogue’s Parley list asking how to write Ruby code to help them create a shorthand word for a longer commandline command. It takes moxy to ask questions on a list filled with many experienced developers. I was happy to see that positive responses flowed in. The immediate response was that the individual should perform the action by writing commandline aliases using the shell ‘alias’ command. But that only points the developer in the right direction. Instead of just pointing in the direction, the rest of this post will be walking a new developer through setting up helpful customizations in the shell environment. (Note, the generic information will be fairly compatible whether using the BASH environment or ZShell environment. Moving past general configurations into advanced configurations are where the two start to diverge, particularly with the environmental settings used in .bashrc or .zshrc files. I’ve found that the best remedy for this is reading through and gradually adopting a few lines here and there from well commented .bashrc/.zshrc files). Many of the customizations in the shell relate to minimizing repetitive keystrokes. Imagine the difference between typing

bundle exec rails server


be r s

If you’re typing this more than occasionally, it’s a large savings of keystrokes over a period of months. So how is it done? Aliases! Simply put, include the following code in your config file (a generic term that I’ll use for either .bashrc or .zshrc, depending on your shell): alias j="jobs" Or to help avoid dumb mistakes (it makes the remove command verbose and interactive =D. Even astute geeks fat finger the occasional keys ) alias rm="rm -iv".

I’ve taken to heart the adage, which I can’t attribute precisely, that anything typed more than a couple times on the commandline should be shortened to save future keystrokes. To prove this point, I currently have greater than 100 aliases and growing. Note that the following is from dumping all of my aliases to STDOUT via alias > jist -p -c and is not representative of one of my alias files. (For that, see the second inset codeblock).Here’s an example of one of my alias files… appropriately called ‘aliases.conf.zsh’:(Original code is at: https://github.com/zph/zph/blob/master/home/.zsh.d/aliases.conf.zsh) So that’s ‘aliases’. I find that they’re easier to keep organized if I setup a dedicated ‘.zsh.d’ folder. By which I mean that I created a folder called ‘.zsh.d’ in the base of my home directory with the following layout:

This folder contains all of the ‘zsh’ configuration files on my system other than ‘.zshrc’. Each general category of config files gets its own file, ie git.zsh, ruby.zsh, homebrew.zsh, etc. Helps me keep everything organized =D. I set the following lines in my ‘~/.zshrc’ to source each file within the ‘.zsh.d’ directory that has the extension of ‘.zsh’

# Finally, source all the files in zsh.d (ALPHA order)
  for zshd in $(find ~/.zsh.d/*.zsh | sort );
    do source "${zshd}"

This isn’t necessary, but it helps me keep the individual configurations nicely ordered. To recap, use aliases. Use the daylights out of them. Make your shell a finely honed tool that’s nicely crafted to your needs. Oh yeah… do the same with ‘functions’ which I can cover in a future blog post. And look into FASD because it’s awesome like Narwhals! Questions, thoughts, jeers, feedback… catch me on ‘ye ol Twitters’ @_ZPH

14 Feb 2013

Make the Shell Your $HOME

Let’s talk about how to use the shell. It’s a dirty secret that many of the repetitive commands used in the day-to-day world of developers are rudimentary shell commands.

Think of the activity of making a new folder and moving into that folder to start writing code, it looks something like this: mkdir new_project; cd new_project; vim new_project_code_file.rb.

Tighten it up and pay attention to simple improvements in the shell environment. ( My experiences are with BASH and ZSH ). That command becomes the following command with a little bit of improved shell configs: mkdircd new_project (makes dir and cds in the same command); e !!1_code_file.rb.

What’s in this shorter series of commands? Let’s break it down to parts:

  • mkdir and cd are replaced by a single new command mkdircd. We save the repetition of typing the folder name twice by compressing the command into a single request. It’s accomplished by setting up an alias in the shell configs.
  • vim new_project_code_file.rb is replaced with e !!1_code_file.rb. The e command is another shell tweak of mine. e is a shell function that steps in for the vim command and opens files for editing in a more intelligent way. See the source here: e (Note that it also depends upon the wonderful FASD utility available on Github.com).
  • !!1 becomes the first argument from the prior line, i.e. the first item after the command itself. Using !!1, !!2, !!3 has saved me countless seconds of retyping the same long folder/file names.

So, make the shell work for you! If you’re spending time in a new envionrment like the Linux Terminal or OSX’s Terminal, learn to configure that BASH or ZSH environment.

It will pay off nicely!

If you liked the article, follow me on Twitter at @_ZPH.

01 Nov 2012

Migrating NeoRouter Server to new VPS

Migrating from a flaky VPS to a more reliable one has generally been a hassle. But one easy part was migrating NeoRouter Server to a new Xen VPS. tar -zcvpf OUTPUT\_FILENAME.tar.gz /usr/local/ZebraNetworks/NeoRouter Rsync or scp that file over to new VPS wget http://download.neorouter.com/Downloads/NRPro/Update\_1.6.3.3150/Linux/Ubuntu/nrclient- sudo dpkg -i nrclient- Decompress file into place in /usr/local… etc Log into NeoRouter dashboard and redirect domain to new IP address (as found by running ifconfig on NeoRouter Server VPS) Save dashboard settings, click ‘Domain Status’ tab, and gloat in your success!

12 Sep 2012

OSX and Linux Tools I can't live without

I’ll keep it short and sweet but here’s the top list of tools that I’m using in various tech areas of my life.

FASD - Making me more of a speed daemon on cd’ing around terminal along with instant vimming from anywhere. PEW PEW!

Alfred - Speed daemon in graphical environment with starting new programs, running terminal commands, etc. Akin to Launchy, Gnome-Do, Quicksilver (which I wish worked better on my Mac). [This one is Mac specific but see other programs for different OSes]

iTerm2 - Customizable and nicely integrates with tmux. [Mac specific, but on Linux I’ve been super happy with Terminator]

tmux - Terminal multiplexer. Like screen, but much more easily customized. Feels like a VIM take on screen control once it’s tweaked.

VIM - My favorite editor. Mainly used in the terminal but occasionally I use MacVim for the glitz.

Vimium - Bring the powers of VIM into the Chrome Browser. Very very slick interface, especially for opening links, scrolling … just go install it.

VimRepress - Blog with Wordpress from the safety confines of VIM (as I am now)… in MARKDOWN!

GoogleCl - Commandline access to Google features such as Contacts and Calendars. Great for adding events from the commandline. Python tool IIRC.

QuickCursor - Lets me use VIM to edit just about anything. It opens a new VIM instance/buffer with the highlighted text, say from an email and pushes it back into that spot after editing w/ Vim.

BetterTouchTool - Nice easy way to assign keystrokes to open a program, move window to specific region of screen, etc. Also complemented by BetterSnapTool.

TaskWarrior - Task manager on the commandline. Like Todo.sh but with more commandline power and no Android/iOS app. Worthwhile trade at the moment after 3 weeks use. Does have a Sinatra app with TaskWarrior integration… and I’m tempted to scrape together a Ruby tool to have commandline Pomodoro tracker that integrates with Growl and TaskWarrior (as an annotate function)

And in no specific order:

-Dropbox, Evernote, DashExpander, Pomodairo, TweetDeck, Sparrow/Thunderbird (Sparrow for slick integration, Thunderbird for extensions and power), and last but certainly not least Z-Shell.

Let me know in the comments or on Twitter if I’m missing any good tools!


31 Jul 2012

FASD - The Commandline Shortcuts I always wanted

FASD is a shell script that follows in the concept and footsteps of Autojump and Z. It extends the functionality of both of those systems to better differentiate between files and directories. FASD also allows for tacking on different commands to the beginning of a fasd reference such as using vim in an alias, ie: alias v='fasd -e vim'. This VIM alias calls up the most active file matching that pattern and opens it in Vim. Or a simple z searchterm will find the most often and recently used folder and ‘cd’ into it! This is amazing for nested folders. It’s like Vim’s Ctrl-P or Ctrl-T but on the commandline and with more flexibility.

It’s magic and I’ll post back if I keep having good success. Try it out with a brew install fasd or check the install instructions on their github page for more options - FASD.

Update: Still having very good success.  Moving from ~/ to deeply nested folders is a breeze with ‘z SOMEPARTOFPATH’ and likewise using vim to edit a deeply nested file with ‘v SOMEPARTOFNAME’.  It’s nothing short of magical after 2 months of use.

Update Jan 2013: Can’t imagine living in the shell without FASD. This is now included in my environmental setup script.

19 Jul 2012

X11 Forwarding: Or How to use my favorite Calculator in OSX

I switched to a Macbook Air a few months ago and I’ve been generally quite happy with the setup.

One thing I’m unhappy with is the availability of my two favorite calculator programs. On Linux distos I’m accustomed to installing ‘qalculate’ and on Windows it’s been GraphCalc. I tried to find equivalent programs under OSX, giving it all of 15 min of effort, but couldn’t find a robust solution with good history, nice data entry, etc.

So, I decided to stick with my favorite (‘Qalculate’). I then tried installing it from source under OSX which didn’t succeed. I then tried to do the same with graphcalc’s Linux source, with the same result.

At this point I remembered toying around with X-forwarding over SSH. Since I had already installed the X11 environment for running GIMP (GNU Image Manipulation Program), it was trivial to que up a virtual instance of Debian Linux under Parallels. I installed Qalculate in that virtual instance and used the ssh command for X-forwarding: ssh -X username@server\_name 'qalculate-gtk &'

The result is that I have a virtual instance of Debian running in the background, my normal OSX interface, and my favorite calculate ready to go (as if it were a native OSX application).

Thanks SSH!

06 Jul 2012

File under 'Commands I should Know'

#shutdown now -h Pretty important but didn’t know about the ‘-h’ flag until today. When run as root this will shutdown system (Linux specific) now and send it to a init-level 0, ie a full halt. Good to know =D. As pointed out in comments ‘shutdown -p now’ is the BSD equivalent.

05 Jul 2012

Awesome tool for recovering ecryptfs from Ubuntu/Canonical

During the process of recovering an encrypted filesystem from an old server of mine, I found that I couldn’t access any of the data. It appears that I encrypted my home folder on the server using Ubuntu’s default ecryptfs.

I ‘Googled’ my way through locating the encrypted ‘.Private’ folder and tried unsuccessfully to mount the folder. I then used ecryptfs-unwrap-passphrase to unwrap my unique passphrase using the old login password.

Armed with that and a tool from Dustin Kirkland over at Canonical (ecrypt-recover-private) I succeeded in using the following command to recover my data sudo ecryptfs-recover-private .Private(at appropriate location) (Note - replace .Private with whichever location it’s at) Then type in the login password, which yields the passphrase, which leads to mounting the data as a read-only directory in /tmp.

Thanks Canonical!

05 Jul 2012

Linux Command of the Day

No fancy commands today, just good ol’ functional admin action. I was setting up a couple of new Virtual Private Servers (ala EC2 or DamnVPS) and came across the following helpful command ssh-copy-id -i ~/.ssh/id\_rsa.pub username@remote\_server\_ip\_or\_domain What it does is copies (appends) your ssh key to the list of permissible keys on the remote server.

Need to make an SSH key for this purpose? ssh-keygen -t rsa -b 4096

Need to install ssh-copy-id on OSX? brew install ssh-copy-id

04 Jul 2012

Installing JungleDisk on Mint 13 (12.04)

I’m setting up a home server (which will be a blog post for a later date).

But in the process of setting up Amazon S3 backups, I was installing JungleDisk. This allows mounting of a remote S3 bucket as if it were a local drive.

After installing, I received the following error stating that it could not find ‘libnotify.so.1’. I used the locate command to find libnotify (currently libnotify.so.4) and used symlinked it into place. sudo ln -s /usr/lib/x86\_64-linux-gnu/libnotify.so.4 /usr/lib/x86\_64-linux-gnu/libnotify.so.1

After the symlink everything started up correctly :).

Btw, server is a quad core AMD (Phenom), 12 GB RAM, plenty of storage, SSD for boot drive, spinner platters for storage… and ZFS =D.