23 Dec 2012

Ruby Off The Rails - Ep. 1 -- Zero to Ruby -- Pt. 1

Ruby Off The Rails is a new series of screencasts that I will be publishing. The first cluster of videos will address the problem of getting started with Ruby development by using a virtual installation of Ubuntu Linux running inside Virtualbox. It’s simpler than it sounds and it preserves the integrity of your everyday system. Here’s the first installment, enjoy! (I recommend opening the video for fullscreen display to better view the text)

Ruby Off the Rails - Ep. 1 - Zero to Ruby - Part 1 from ZPH on Vimeo.

Commands from Ep. 1

22 Dec 2012

JDBC, MsSQL, and JRuby, Oh My!

I was recently in a position of needing to access information from a legacy database on a Microsoft SQL Server ( 2005 ). Since I’d prefer that the contact came from a *NIX system (probably Ubuntu), I checked out ODBC and JDBC as options. Based on a couple of blog entries by fellow Rubyists and ODBC users, the ODBC configuration files add an extra layer of complexity for the database connection. I chose to do it with JDBC because it allows those settings to be configured in the script/config itself. Also, with the sqljdbc*.jar running on the JVM we have platform independence. Now, on to the implementation:

  • On the SQL Server box
  • Allow mixed authentication (it appears that JDBC does not interface with Windows User credentials based on cursory research)
  • Setup a unique SQL Server Auth User who has the appropriate degree of authorization on the database. Consider read-only if your application is limited to querying the DB rather than writing to it. This will limit the risk of inadvertent writes.
  • Depending on setup, you may need to open ports 1433 and 1434 on the SQL Server’s firewall. If possible, only do this step on an internally facing instance of the SQL Server. (Less attack surface to the internet is a good idea).
  • Test the connection by using SQL User authentication when connecting with the builtin Microsoft SQL Server Management program. If all goes well, this tells you that it’s configured correctly when accessing from the same system. Next to connect from a remote system. You’ll need the following pieces of information: the database’s name, the database ip address, the database instance name (ie defaults to SQLEXPRESS when using SQL Express), the Sql username and password
  • On the remote system (the Linux box)
  • Download and extract the following file from Microsoft, this is the JDBC adapter file that they provide http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=21599 OR the direct link at the time of this article: http://download.microsoft.com/download/D/6/A/D6A241AC-433E-4CD2-A1CE-50177E8428F0/1033/sqljdbc_3.0.1301.101_enu.tar.gz Extract that into a convenient place in near where your connection code exists. I chose to use a standard Ruby project layout as follows: |-- Gemfile |-- Gemfile.lock |-- Guardfile |-- README.md |-- bin |-- features |-- jars | |-- sqljdbc.jar | |-- sqljdbc4.jar |– sqljdbc_3.0.1301.101_enu.tar.gz |– lib | |– README | |– jruby_demo.rb | |– tds_demo.rb |-- demo.rb |-- spec – spec_helper.rb 7 directories, 16 files Notice that the sqljdbc\*.jar files are inside jars which is on the same level of nesting as the lib directory. This is important when referencing their location in the code. Then install JRuby if not currently installed. I use [RVM](www.rvm.io) for easy Ruby switching. (Thanks to Keith Burnett for posting a comment indicating that this portion was out of order... silly me!) Once the JARs are extracted, runbundle install` to request that Bundler install the required dependencies. Next modify the following script to help you get started. Note that you’ll need to replace the values of the CONSTANTS as appropriate for your IP addresses, username, passwords, etc.Of further note is that a class will need to be defined for each table in the database that you wish to access. I briefly outline this in the comments of the code. This is fairly standard ActiveRecord use. Questions, comments, post them here or to me on Twitter @_ZPH.

18 Dec 2012

Refactoring... a Weighty Question

I’ve been working on a library for easily exporting Trello information to CSV, TSV, and XLSX. It’s currently working well for all three formats although the code itself is first or second draft quality. (Not that XLSX has some issues of its own when done from Ruby. I’d like to solve it eventually but it’s on the back seat since the files still open.) I took the time to import it into CodeClimate’s automated test system to see where potential issues are. It revealed that one particular set of methods was far too complex. These were the methods that generate the CSV or XLSX file. I sat down to refactor them while under the weather this weekend and here’s what I accomplished: -Extracted code out into methods (needs more of this as methods don’t have single responsibilities) -Abstracted the process into a single uber method that calls sub methods (could be private methods later in development) -In order to abstract the process to be identical for CSV and XLSX, I found one spot that needed an eval(content) statement. ( Perhaps in the future I can adapt a lambda to better suit this purpose?? ) Here are the different versions of it: Before-After-Diff-Looking at it again I want to extract the different classes into their own files for better compartmentalizing the code. Let me know in the comments what code smells are present or what refactorings are still advised.

16 Dec 2012

Easy SSH Tunnel on OSX

I recently found myself working from a restaurant with open WIFI. After having someone on open WIFI snatch my Facebook credentials back in 2009, I’ve become understandably paranoid about security on unsafe connections. I spent a few minutes setting up a Squid Proxy on my VPS, when I came upon a better solution: set a SOCKS Proxy in OSX and create an SSH tunnel.

How it works

The SSH tunnel connects to the VPS using an encrypted channel. This is open for use on a localport such as 8080 (or a randomly assigned one w/ script). The SOCKS Proxy passes network requests to the localport instead of sending them to the web/email-server/etc.

How to do it

On OSX it consists of the two following steps: sudo networksetup -setsocksfirewallproxy Wi-Fi 127.0.0.1 $localport off ssh -f -p $remoteport -D $localport $remoteuser@$remoteproxy sleep 1d This is all well and good, but someone went to the trouble of wrapping this in a script: OSX-PROXY. I took a little bit of time this weekend and refactored the code to extract functions, utilize a case statement, and add extra commandline arguments.   My revised script also toggles the state of the proxy if no arguments are given.

Update

The aforementioned code works very well but I’m not sure if it re-routes all DNS requests which could divulge personal information. So I switched to this python library that re-routes all activity and is more established: SShuttle. Add an alias to the shell for quick starting with default settings: [code]alias sshuttle_start=’sshuttle --dns -vvr user@vps 0/0' [/code](Replace user and vps placeholders with the appropriate info). PS - Never ever trust public or semi-public Wifi.  Using a proxy like this is the minimum security that you should consider.

15 Dec 2012

rcodetools and VIM

I’ve been listening to RubyRogues which introduced me to Avdi Grimm from the Ruby community. I’ve also been subscribed to his RubyTapas screencast series which is a 2x a week Ruby show.

He uses a neat tool called rcodetools to execute Ruby code from within an Emacs buffer. Unfortunately, it wasn’t working when I tried to use the VIM counterpart, with segfault codes showing up. Here’s the fix: ( I’m using RVM to manage my Ruby Versions ) *Install Tim Pope’s excellent rvm extension for VIM cd ~/.vim/bundle git clone git://github.com/tpope/vim-rvm.git

*Install rcodetools using RVM gem install rcodetools

*Remove keybindings in other programs (ie Dashboard & Expose) for F10, F11, F12 or rebind the keys per README.vim

Now enter a VIM file and type F12 on any lines that you want the output from followed by F11 to evaluate the whole file. If you want to only re-evaluate the current line use F10 instead of F11.

It’s a great tool for terminal screencasting! Thanks Avdi for letting me know that this tool is available.

26 Nov 2012

Script to Update Sandy Knolls Metes and Bounds Software on OSX

After frequently finding myself not using the current version of Metes and Bounds, I wrote a Ruby script to automagically do that very thing.  It checks current version, downloads the current version, and installs it into /Applications (BEWARNED, it nukes your current version of Metes and Bounds.app, use at your own risk):Thanks to this random blog for the hint on mounting DMGs from commandline!

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-1.6.3.3150-pro-ubuntu-amd64.deb sudo dpkg -i nrclient-1.6.3.3150-pro-ubuntu-amd64.deb 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!

@_zph

22 Aug 2012

CodeRetreat @SteelCityRuby - Things I learned

I attended the CodeRetreat at @SteelCityRuby 2012 and this post is an abbreviated recap of my experience.

It was great! I had fun. There, I’ve thoroughly explained it. Go forth and try it out when CodeRetreat comes to a city near you.

Oh, you wanted more of an explanation? It was an event lasting from 8am to 5pm and it involved turning programming on its head. Corey Haines led the event with the space donated by 4Moms (thanks!!!).

We ran through a series of 45 min pair programming sessions interspersed with lecture sessions and short breaks. Each session was with a new random programming partner and had its own evil (but useful) coding constraints. Think of the constraints as a way to shake free many coding habits and relearn more maintainable patterns.

So what did I and others learn from this day of intense and fun coding? 1. Re-usable and easily modified code is worth its weight in rubies. 2. Think of the ways that constraints may change in the future, code to allow this (ie is true/false sufficient or should it be more than a binary choice?). 3. Tests are more than tests, they’re a roadmap for talking with fellow programmers on your team. 4. Communication is very important, sometimes more than programming skill when working as a pair. I found myself spending time and effort working on communicating well and understanding what my pair partner was envisioning. 5. Contemplate why you’re passing primitives as output from methods. Consider where passing an object could be better. 6. Short methods are maintainable methods, also helps with easier testing. 6b. The idea of a ‘screen-full of code’ being the max for a method came from our elder days when very few lines fit on a screen …. not from now with a 1080p screen with 9 pt font. 7. Possibly the most important learning of the day: Rubyists are very fun and supportive, even of newer programmers.

So think of a CodeRetreat as a sassy, challenging, sometimes infuriating exploration of ’the code less written’, with apologies to Robert Frost.

Give CodeRetreat a try when its in your area. I’ll be hitting up the next one that comes this way.

19 Aug 2012

Swap out BAD line endings for Unix standard

:setlocal ff=Unix :w

Converts and saves current buffer as Unix standard line endings. n FTW!

Update

brew install dos2unix Then use dos2unix to easily swap line endings into Unix format dos2unix \*.rb