You know this guy?
grep needle haystack |grep special_needle
or his inverted cousin:
grep needle haystack |grep -v unspecial_needle
These are common staples of searching through text files.
You should stop using them. Now.
You can do much better by writing more consice regular expressions
and using ack or one of its relatives
(ack-grep, or rak).
The primary virtue of these commands is that they use the Perl regular expression engine. Most programmers with experience in any of the major scripting languages will find this more comfortable than grep’s use of the GNU regex syntax.
I recently encountered a need to search through many files based on a complex regular expression that required lookahead and lookbehind asserions. I have no idea how that would work in GNU regex land where, honestly, I still have a hard time getting simple capture and alternation. After learning look around syntax, I was glad to know that ack could directly implement it.
Given haystack, a text file:
tin needle
silver needle
lead needle
ocelot
monkey
Find the needles (this is where most grep users get to and never leave):
$ ack needle haystack
tin needle
silver needle
lead needle
Look at that one character shorter than grep and just as easy. Now if you want the silver needle, the unsophisticated, greppy way of doing this would be:
$ grep needle haystack|grep silver
silver needle
This sucks. Try:
$ ack '(?=silver).*needle' haystack
silver needle
Or, “all things in the haystack that are needles, but not the lead one”
$ ack '^(?!^lead).*needle.*$' haystack
tin needle
silver needle
I know there’s a lot more to the power of the lookaround assertion, but if I can re-train myself out of this habit I think it’ll be a big win. Granted, for smaller searches the “double-grep” method is probably fine, but any time you’re doing a recursive descent and are looking for true needles in the haystack, ack’s is the superior approach.
The case that I was working on was where I needed to search all my Rails models
for all named scopes that did not use the lambda form and I wanted five
lines of context around the matches so that I could be understand the behavior.
ack -C5 'scope(?!.*lambda)' app/models
That’s gold worth searching for.
There is one response to “Use ack instead of grep to parse text files”
I heard about this at Golden Gate Ruby Conf this past year from Ron Evans (@deadprogram). It’s a low-power, low cost computer that can be used for lightweight media centers or “learn to program” desktops.
I love the idea of these little machines lurking about hte house doing all sorts of automated stuff for us behind our back. While it’s clearly underpowered to do advanced photo editing, most of our requirements for household computing (yet) are fairly low power with frequent gap time.
Introduction
The Vim editor has a built-in function for preserving your editor state —
which files you had open, which tabs they were in, etc. — called
“Sessions.” In my experience, few Vim users, even experienced / advanced
users, take advantage of this feature and that is a shame. Sessions allow you
to get you back into the working context of a given problem immediately .
If you’ve avoided a needed reboot for software update or wished you could save
the context of your editing as related to a specific problem, you should take
the time to learn a little bit about sessions.
Curating an Editor State
As developers, we generally start with a single file (“QA says there’s a bug in this view”) and then realize it has a relationship with another file (“Hm, but I need this as the data source / dependency / etc.”). Over time we come to recognize that there are several files whose relationship and interaction creates a “feature” we want to work on. I call this collection of files that represents the means to the solution the “curated list.” We groom our curated list into a user interface that helps us address the problem:
The curated list for this blog post
Finding yourself needing to reboot, where you would wipe away this solution context like some Tibetan sand mandala might put you into a panic routine:
“Which files do I have open? Which directories am I in, which server processes are running?”
The Oatmeal comic hits home:
To save your state all you need to do is run :mksession. By default this will
create a file called Session.vim in your working directory. Its contents are
a full list of Vimscript commands that will be issued when you launch Vim with a
reference to that file with vim -S session_file_name at a later date. Reading
this file is also a great way to learn some powerful Vimscript commands.
The commands it requires to re-build your Vim session as it is right now
Standard Vim file-write semantics still apply To overwrite the old session it’s
:mksession! and :mksession session-from-after-lunch.vim It is this latter
usage which allows you to create ‘topic based sessions.’
Topic-Based Vim Sessions
The average Vim session is very small (kilobytes) and they can be made cheaply (less than a second) therefore, as I work on problems I’ve taken to creating multiple Vim sessions so that I can address a feature and come back to it painlessly.
Presently I’m experimenting on creating sessions based on bug-tracker stories.
The session files (ending in .vim) are included in my global .gitignore
file. Given that a certain feature may be revisited at any point, it seems a
good idea to keep each in its own session so that I can pick it back up again
for subsequent bugs / improvements. AND should a refactor add a new file or
drop one, all that’s required is a simple mkession! to write a new session.
Gotchas
By default mksession saves blank, buffers, curdir, folds, help, options,
tabpages, winsize. Depending on how heavily customized your Vim configuration
is, you may find these session commands clashing with your default options. For
a heavily customized Vim installation (like Janus
Vim) this can create some erratic results.
To prevent any clashes, I have modified the default sessionoptions
configuration in my .vimrc to be the following:
” Sessions in Janus are overwrought set sessionoptions=blank,buffers,curdir,folds,help,tabpages,winsize
Reference
As sessionoptions seems to suggest, there are a wide variety of things that
can be preserved. :help sessionoptions and :help mksession in the on-line
Vim help guide should help you tweak your configuration to perfection.
I can even seen an argument for adding a :mksession! as an autocommand, so
that your session is written on every file-write or buffer-change event. I
don’t (yet) see a need for that, but it’s great to know that Vim has that
capability.
Conclusion
With OSX Lion now preserving open application state, browswers now allowing you to save tab state, and Vim now allowing you to preserve buffer state, you can live in less fear of a power outage, an accidental reboot, or a gray screen of death.
There are no responses to “Use Vim’s Sessions to Defray Context-Switching Costs”
Leave a Reply
Last weeekend Lauren and a few other friends went up to Yosemite to do some late winter camping. In our three days there we saw rain, big fluffy snowflakes, and spent a bit of time hiding out in our tent-cabin. It was a great, albeit chilly and, at times, wet experience. But for vistas like this, it’s definitely worth going.
Ryan wrote a thoughful post about catching a 35mm print of Lynch’s “Dune”) at the Alamo Drafthouse. He notes that despite arriving “DOA” in 1984, it was, today, “a bit of a cult movie.” I thought I would take a few moments to write down why I am a member of the “Dune” cult following. In short, the reason I love “Dune” is because it is an artistically rich disaster.
The Critical Response
For a standard opinion on the movie, I refer to Roger Ebert’s review of January 1, 1984:
This movie is a real mess, an incomprehensible, ugly, unstructured, pointless excursion into the murkier realms of one of the most confusing screenplays of all time. Even the color is no good; …David Lean solved that problem in LAWRENCE OF ARABIA, where he made the desert look beautiful and mysterious, not shabby and drab.
The Financial Response
“Dune” cost its production company, de Laurentiis Productions, approximately $40M to make. It grossed ~$30M. A $10M loss before DVD, resale, and licensing agreements was a staggering loss.
So I can make neither the argument that “Dune” was misunderstood by audiences: they voted no with their dollars. Nor can I say this was an artist’s movie, a beautiful avant garde that only the critics grasped. Yet nevertheless I admire and respect this movie. Why?
Why I love “Dune” anyway
Filming the Dune Universe is a Grand Dream
The Dune universe is so expansive and thoroughly-concieved that it is like the vast desert of Arrakis itself. When your imagination finally collapses, dehydrated, cooked and lost in the middle of a sand sea, you realize just how engulfing Frank Herbert’s vision was, and that you’re nowhere close to any respite from its expansivenes.
There are no responses to “Thoughts about “Dune””
-
Your comment is awaiting moderation
Yarbrough said »:
A huge reason why the theater version was confusing is because They took 3 1/2 of footage and edited it down to something like 144 minutes. An extended version is out on DVD I believe. I am a Dune cult fan also, what stays with me, as you have mentioned, the sets are beautiful and wild, the casting is excellent, the central actor Kyle is perfectly cast, cool and engaging, Frank Herbert's Universe, even though we see just a slice of it here, is rare and richly conceived, all these things make this a better movie than a bad one, even though people who haven't read the book are left largely adrift, if you look at it with an archeologist's eye, who digs up the odds and ends of pottery, spear heads and wheat seed, then tries to imagine the people's it came from, the film works very well.
Leave a Reply
As a person who took Trigonometry as an adult (at 29!), I was amazed by how much more fascinating the relationship between π and radii became. I even spent some time building squares of golden sections with a compass, just like the ancients used to. In this post below, Vi Hart makes a compelling argument that we should move on from π and move to τ. It’s a fascinating concept, but what I like most about it is that it still preserves some of the aesthetic mysteries that fundamental trigonometry provides.
There are no responses to “Fascinating: Why we should let go of π in favor of τ”
Leave a Reply
I love usig the mutt mail reader to turn through my
mail. I recently set it up to make use of my MacVim installation by adding the
following configuration to the .muttrc.
set editor="mvim --remote-tab-wait-silent "
This is pretty neat. When I go to reply or compose, I’m thrown into a new tab
in MacVim and I can compose / reply there. After hitting ZZ or :wq!, mutt
properly handled the signal, but didn’t change OSX’s focus back to the
terminal window where Mutt was running. By changing the editor to the
following configuration:
set editor="osascript $HOME/bin/mutt_edit.sh"
I was able to tell Mutt to send my temp file (for the edit) to osascript, a
utility that runs Applscript. In mutt_edit.sh I provided a bit of a wrapper
around the mvim command such that it told OSX to re-activate my terminal
session after the editing activity finished. Here’s the code:
on run argv
tell application "Finder"
do shell script "mvim --remote-tab-wait-silent " & item 1 of argv
end tell
tell application "iTerm (1.0.0.20111020)"
activate
end tell
end run
And that’s all it took.
One of the organizations that I’m most proud of helping out is Railsbridge. It aims to increase the diversity within open source software development, particularly women. Twice now I have worked with wonderful and amazing people in these sessions.

Typical scene of getting laptops set up (source)
In these activities I have encountered a powerful enemy to successful teaching that we, as organizers and teachers, should remain vigilant against: negative confirmation bias.
Negative confirmation bias is when a student walks into a situation expecting
that s/he is not going to succeed and then proceeds to look for data to back up
that negative view. Why students have this negative view is a subject for
another post, but it is my belief that it is at the heart of why there is such
poor diversity in high tech.* At development workshops / boot
camps, students encounter a dangerous confirmant of their negative bias in
one the earliest steps: “Bootstrap the setup using git.”
Facilitators must take an active role in reminding students that the installation / bootstrap step bears no inherent reflection upon their ability to enjoy, learn from, and perform well in the class.
There are no responses to “Technical Outreach Workshops: Needlessly Frightening at the Beginning”
Leave a Reply
As I mentioned elsewhere, my friend Daniel Miessler said that he would be ready to give up Textmate for Vim but were it for the level of blogging support. I have, hopefully, made it easier to do so. In fact, I’m writing this blog post and using my fork of Vimblog to manage it.
Here’s how this post was made:
:Blog npcreated a new post- Moved down to the
Categsline and then::Blog cl - /Techno to match the right line. Hit enter.
- Vimblog just copied the category name to the yank clipboard for me and then…
- p to paste it in
- G to the end of the file
- o to start typing
- Typed
Daniel Miessler v2b\gifl did a Google I’m feeling Lucky to his site and wrapped it in a markdown link- More editing
- :Blog draft (because it’s still alpha-grade code) so I could check it out in WordPress
- Took a screen-shot of vim to put in the post
- :Blog um ~/Desk
/vimb - Vimblog pasted the url link to the image that makes this work:

- Published this post with
:Blog publish - Damn it feels good to be a gangsta
I have been wanting to get the Vim Editor working as a tool for blogging. I’d discussed this a time or two with my friend Daniel Miessler, and he brought up a critical thing that was missing for him in migrating away from Textmate: the ability to do an “I’m feeling lucky” hotlink onto a word as one is composing.
I had to admit, this was a pretty compelling feature provided by Textmate’s “Hyperlink Helper” bundle. Its lack definitely hindered my drive to blog in vim.
To that end, I have created my first Vim plugin and port this sexy capability to Vim.
The port is called GIFL which is not some sort of obscure term for attractive septugenarians, but rather is Google I’m Feeling Lucky.
With this installed you can do things like:
Imagine you have the following text, with your cursor at ‘*’:
*lindsay lohan
Now enter:
\gifl2e
You now have:
[lindsay lohan](http://www.myspace.com/lindsaylohan*)
That is, the Markdown code for a URL. That’s pretty handy. This loads up in the global namespace, so you can use it anywhere and everywhere. I’ve found it suprpisingly handy in places other than a blogging context. It’s still very, very, very alpha, but it gets the job done.

I must say that coding in vimscript is a bit of a challenge, but I have been greatly helped by Steve Losh’s Learn Vimscript the Hard Way.
By the way, thanks to Pedro MG’s vimblog project, I was able to write this post in Vim, with GIFL doing nearly all the linking.
I think that both GIFL and Vimblog need to be polished a bit before I can say that, together, they make it as easy as it was in Textmate to be a blogger, but it’s definitely closer. Thanks to Macvim + Janus as platform, this is close.
Ruby
These days I do a lot of programming in Ruby. I have been fascinated by this language for a few years now. Here are posts relating to it. Here the most recent posts on this topic:
Top ten posts shown. For more, visit the archives.
Technology and Computers
These are topics on technology in general.
Top ten posts shown. For more, visit the archives.
Latin
Beginning in 2008, I decdided to learn Latin. It had always been an interest of mine. Perhaps the most interesting take on it as that I fused my previous knowledge of programming and tool building to assist in this endeavor. Read more for my unusual take on mater linguarum.
Top ten posts shown. For more, visit the archives.
Search for a Topic
Archives by Month:
Archives by Subject:
Personal Statement
I love learning and experimentation. I draw on a background that includes philosophy, business, classics, code, and eleven years of industry experience. I seek to apply this background in a startup environment where I can work with the newest technologies (Rails, NodeJS).
Work Experience
Carbon Five: Ruby on Rails / Javascript Developer
2011-10-2012-02
- Re-designed client's internal sales tool using Rails and Backbone.js
- Launched a minimal viable product for an entrant into the medical information / consultation niche using Rails
- Streamlined the interface for a report generation solution so that PDF output (using CSS3) matched a new screen-based look and feel
- Provided upgrades to the user interface for the second iteration of a job search site
Cisco Systems : Senior I.T. Engineer: Integrated Workforce Experience
2009-07–2011-10
- Created standard development kit for Java developers using a Java Container / JSR-168 / JSR-286 (Portlet) stack. Standardized deployment and installation of the stack to three OS platforms using Ant. Reduced developer time to first code contribution from 4–8 business days to 30 minutes thanks to automation, documentation, and video. Estimated cost savings was 250,000USD
- Evangelized standardized SDK (see above) and have on-boarded over 100 developers to date. Provided estimated savings nearing 750,000USD
- Ran bi-monthly technology session and moderated the developer peer support forum
- Maintained CI environment (Hudson), artifact repository (Maven), and SCM branches (Subversion)
- Was loaned to Cisco Quad product business unit to migrate builds from a single, monolithic, Ant-run build to Maven while having no impact on development timelines
- Delivered the first release of the Cisco Quad-powered social collaboration solution (Integrated Workforce Experience) to 90,000+ person organization. This is the first and largest reference implementation of the Cisco Quad product as a platform. Wrote automation to permit operations track to deploy, rollback and re-install at scale (68 VMs). Wrote hot-fix tooling to allow for deployment of patches, updates, and configuration changes as part of a stability tiger team
- Completed Scrum Master training and lead the largest scrum track within the program. Delivered two major releases of the Integrated Workforce Experience powered by Cisco Quad solution. Led team in delivery of 4 new applications, 2 major rewrites, 500+ feature requests, user stories, and bug fixes
- Continued SDK standardization and tooling activities across multiple platforms with a focus on accelerating developer time to market. Further details under NDA
Cisco Systems : Senior I.T. Engineer: Mail and Messaging Platform
2005-04–2009-07
- Authored 5–point, 2–year legacy systems migration strategy to move all backbone mail services to a standardized, turnkey environment. Implementation completed 2008
- Led technical team responsible forum and blogging framework deployment
- Created business requirements document and RESTful API specification for new generic list-abstraction repository and interface: allows disparate downstream systems (including mail) to access and utilize the same list structures for mail, calendar, voice mail, meeting invite, etc. Implemented 2009-05
- Created standard specification for all applications environments with respect to standard, accepted mail routing behavior: policy document, Sendmail.mc for Solaris, Linux
- Created registry process and web tool for application host systems that use e-mail as transport layer. This should help identify / remediate non-compliant systems that are using our data through unsupported interfaces so that we can help them come into compliance
- Wrote script to deploy core mailing list host data repository, web interface, mail interface, and build scripts from M4 macro definitions + Bash + Perl. This allows an entire environment to be built and deployed into a segregated space by configuring a single macro specification file
- Collaborated with University of Texas Information, Risk, and Operations Management Management Information Systems steering committee to specify next generation of skill-set foci
- Through efforts in the previous 6 years, reduced head-count to 1 full time employee and a vendor team. Realized net savings in excess of 320,000USD
Cisco Systems : Systems Administrator / I.T. Developer: I.T. Engineer
2001-04–2005-04
- Member of 5-person team changed with backbone mail systems upon which 1bn/month mail flow. Build anti-spam, anti-malware solution
- Managed fleet of 10 HP servers, a dozen Mirapoint appliances
- Designed Out of Office scanner / handler to prevent MS Exchange from feeding spam engines / spamming external mailing lists / causing infinite mail storm loops due to its “everyone gets a bounce” design
- Established messaging team standard Perl module set / CVS repository / Subversion repository
- Built common framework for Sendmail-based processing, filtration, and re-routing. Built 3 special-use appliances using single polymorphic code base (Google Code CMailguard Project)
- Built software solutions for turnkey rebuild of core infrastructure components to increase resiliency in event of attrition or disaster. Build entire deploy suite in M4 which allowed customization to disaster environment by changing fewer than 10 values
- Migrated primary web interface for list data repository from non–validating HTML 4 Frameset specification to XHTML–compliant, CSS–based, Template::Toolkit design. User interface performed six times faster
Cisco Systems : I.T. Analyst: Engineering Support Analyst
2000-06–2001-04
- Tracked top 5 issues quarter to quarter. After 3 quarters of implementation, support calls dropped, on average, 100 cases per quarter
- Moved client satisfaction rating from 74 to 95 percent, the highest seen to that date
- Developed lead + application owner support relationship still in use today. After performing liaison role, messaging team requested my transition to their team
- Designed web-based Web-vacation mail tool. Tool reduced support calls from 500 per quarter to 25. Net savings of 30,000 USD estimated savings per annum realized
Code Samples
For latest activity, consult: http://github.com/sgharms
Halbert
Category:Developer Utility / Productivity
Homepage: https://github.com/sgharms/Halbert
For students learning SASS / CoffeeScript / Javascript there is considerable frustration around the bootstrapping of a development environment. To allow developers to 'get-up-and-go', I have created Halbert. Simply git clone, run a rake task, and be productive.
LatinVerb
Category: Linguists, Classicists
Homepage: https://github.com/sgharms/LatinVerb
A library that fully conjugates Classical Latin verbs in each of their 133 forms × 5 standard paradigms.
VerbaLatina
Category: Linguistics Language: Ruby Audience: Linguists and Latin Students
Homepage: https://github.com/sgharms/verbalatina/tree/master
A Rails application that wraps a library set that programmatically conjugates regular Latin Verbs from 4 principal parts into all verbal parts, moods, persons, etc.
Linguistics Package
Category: Linguistics Language: Ruby Audience: Linguists and Latin Students
Homepage: http://github.com/bruce/linguistics/tree/master
Linguistics is a framework for building linguistic utilities for Ruby objects in any language. It includes a generic language-independent front end, a module for mapping language codes into language names, and a module which contains various English-language utilities.
CMailguard
Category: Sysadmin Language: Perl Audience: Mail systems administrators
Homepage: http://code.google.com/p/cmailguard/
For mail architectures that are highly distributed, consolidating mails and running eligibility-to-send to yertain addresses is difficult and problematic. Mailguard is designed such that addresses can be routed to a central server. Upon reaching the server, the data is sent via STDOUT into the mailguard application. The application then classifies the sender and based on configuration parameters decides whether the mail should be silently discarded, forwarded on, or put into a holding pen until the message can be validated by a moderator.
M4Resume
Category: Productivity Language: M4 Audience: Geeky job-seekers
Homepage: https://github.com/sgharms/m4resume/tree
Tool for writing résumés in M4, and then having it flexibly build them into a variety of formats: LATEX, XHTML, and XHTML+RDFa.
latintools
Category: Linguistics Language: Ruby Audience: Classicists
Homepage: https://github.com/sgharms/latintools/tree/master
Tools for entering LATEX; useful for Latin writing quickly through Textmate; also has code for converting LATEX-glyphs at CLI to HTML or UTF-8 codes.
Education
University of Texas at Austin : Management Information Systems
1995-2000 Bachelor of Business Administration
A multi-disciplinary approach that blends a base in business administration with a focus in building enterprise IT systems. Attention is paid to programming basics, project management, and consulting. The program culminates with a real-world project delivered to an Austin community organization.
University of Texas at Austin : Philosophy
1995-2000 Bachelor of Arts
A classic liberal arts program in philosophy with focus on pre-Socratic Greek philosophy, German Idealism (Hegel), and Philosophy of science.
Rijksuniversiteit te Leiden, Leiden, The Netherlands : Dutch
1997-1998
During a one-year study abroad term I studied advanced classes in Dutch speaking, writing, grammar, and composition. I also took 3 classes in the faculty of Philosophy: Rise of Scientific Europe, Seminar on Scientific Revolutions, and Rationality of Emotions.
Courses
Beginning Cocoa Bootcamp : 2005-02
http://bignerdranch.com/classes/beginning_cocoa.shtml
Intensive 5-day training course covering the basics of Cocoa / Objective-C programming on Mac OSX.
Ruby on Rails Bootcamp : 2006-02
http://bignerdranch.com/classes/beginning_ruby_on_rails.shtml
Intensive 5-day training course covering the basics of Ruby on Rails development.
Red Hat Certified Engineer Bootcamp : 2003-05
http://bignerdranch.com/classes/beginning_ruby_on_rails.shtml
Intensive 5-day training course covering Linux administration
Speaking Engagements
Lone Star Ruby Conf V:
“Modeling Thought: Practical Metaprogramming” (August 12, 2011)
From the Abstract: I have completed a second major release of a library that fully conjugates Classical Latin verbs in each of their 133 forms × 5 standard paradigms. Owing to the irregularity of human communication, modeling the provision of unambiguous answers (return values) to ambiguously asked things (flexible / incomplete method calls) might have required hundreds, if not thousands, of method definitions or static values entered in a database. But what if heuristics could be given to a Ruby class such that it “thought” as language learners are taught to think? What if it could be taught to be flexible in respecting the ambiguous calls given and to still give precise, correct answers back - as human language learners are capable of doing? By adopting this design paradigm, code could become leaner and more reflective of human cognitive process. Thankfully for Rubyists, this is not a dream, this is reality. Our programs can operate more intelligently, more heuristically, and more insightfully. We can save ourselves days of development time by integrating the next tier of metaprogramming patterns I seek to demonstrate. This is perhaps what makes Ruby so unique, so mysterious, so enticing and so special.
RailsBridge: Rails Outreach for Women (September 10, 2011)
Session: Ruby for Novices A session designed to increase the diversity of the Ruby community by
introducing the Ruby community, Rails, and the ecosystem of supporting technologies (RVM, git, et al.) in a friendly, learning-oriented environment.
Rubyconf XI: “Modeling Thought: Practical Metaprogramming” New Orleans
(September 30, 2011)
“Modeling Thought” as per above, delivered to international audience
RailsBridge: Rails Outreach for Women (February 25, 2012)
Session: CSS and Javascript Introduction
Introducing the Ruby community, Rails, and the ecosystem of supporting technologies (RVM, git, et al.) in a friendly, learning-oriented environment.
Skills
I speak Dutch near-fluently, have a great grasp of classical Latin (I will recite the opening to the Æneid, in meter, if asked), and can get directions to the Metro in French.
Technical Skills Statement
I am extremely proficient with the current Ruby and Rails “ecosystem”: gem, bundler, Rails (3.0), Ruby, Ruby’s metaprogrammatic model, rvm, MiniTest, Test::Unit, and, to a lesser degree, RSpec and Cucumber. I have solid grounding in modern web front-end creation and have done an extensive study of semantic web technologies (RDF, RDFa) and am familiar with entwining (X)HTML + CSS + RDF. I have moderate familiarity with font-end Javascript.
I have a background in systems administration (RHCE, Linux, Solaris). This work duty necessitated the mastery of Perl and high proficiency with bash scripting. Further, since my systems are mail systems I am yroficient in the M4 macro language and sendmail.cf manufacture. I have also done build engineering which permitted a cursory exploration of the Java stack and build tooling (maven, ant) in a J2EE container context (Tomcat).
I am familiar with the git and svn SCM systems. I am a vim user, but also used emacs for a while and even wrote some eLisp functions. I have had light levels of exposure to MySQL, PHP, and Postgres. My next learning target is the Javascript renaissance: NodeJS, backbone.js, knockout.js and noSQL (MongoDB and Redis).





Those are some great examples. I've created a section on http://betterthangrep.com/documentation/ for articles about ack, and this blog article is the inaugural entry.
Thanks!
Leave a Reply