richard t. brant

rbrant@gmail.com | 215.645.2282


Profile

Richard Brant

Software Developer
Computer Software | Greater Philadelphia Area, US

Summary

12 years experience designing, developing, integrating, and supporting corporate tools and commercial applications, including content management, database architecture, and e-commerce

A great combination of binary and creative thinking; proven technical and creative abilities. Significant experience guiding vision for product development and managing its implementation as well as bridging the gap between business goals and technical feasibility

Excellent communication, analytical, and interpersonal skills; expert at managing multiple projects simultaneously; exceptional problem solving skills
Specialties: Almost exclusive focus on Ruby on Rails for the past five years. Expertise includes: EC2, TDD (RSpec/Test::Unit, Cucumber), RESTful design, AJAX, Capistrano deployment, jQuery, Scriptaculous, HAML, web services, Google Maps, Quickbooks integration, Facebook/Twitter API integration.

Experience

  • 1998 - Present

    Owner / Brant Interactive

    Custom software development. Current and past clients include:

    Democracy Engine, Washington, DC
    Kaplan Test Prep, New York, NY
    Advanta, Springhouse, PA
    OPAL Interactive, FL
    Future Now, Inc, New York, NY
    Gulfstream Aerospace Corporation, Savannah, GA
    The Patent Box, Philadelphia, PA
    The Paper Concierge, Philadelphia, PA
  • May 2008 - Jan 2010

    CTO / The Paper Concierge

    The Paper Concierge is an online retailer of fine stationery, invitations & gifts, owned by parent company Leap Frog Paper (http://leapfrogpaper.com). The Paper Concierge has a network of sales representatives ('paper concierges') throughout the country. My role is handling the technology that supports this network of concierges and paperconcierge.com. The Paper Concierge was acquired by the Whitney English company in January 2010.
  • Dec 2006 - May 2008

    Senior Developer / Mediagistics

    Lead the development of two products: a sales lead generation platform and a social group messaging application.

Education

  • 1990 - 1994

    Dickinson College

Additional information

Websites:

Posts

  • July 16, 11:20 AM

    ActsAsCachola – simple caching for AR models (everyone could use a little cachola)

    And you thought all the clever caching names were taken.

    What is it

    ActsAsCachola is a plugin that lets you cache any class method by simply prepending ‘cachola_’ to the method name when calling it. Here’s how it works:

    Given the following model:

    class Internet < ActiveRecord::Base
      acts_as_cachola
     
      def self.get_a_million_numbers
        1.upto(1_000_000).inject([]){ |numbers, x| numbers << x }
      end
    end
    

    Now you can call the method, ‘cachola_get_a_million_numbers,’ and the return value of ‘get_a_million_numbers’ will be cached automatically.

    Note that if the method accepts arguments, each unique call will have its own key in the cache. For example:

    class Internet < ActiveRecord::Base
      acts_as_cachola
     
      def self.get_numbers(to_number)
        1.upto(to_number).inject([]){ |numbers, x| numbers << x }
      end
    end
    

    Calling Internet.cachola_get_numbers(100) and Internet.cachola_get_numbers(500) will result in two keys (with different values) stored in the cache.

    The cached method is then expired automatically when the class in which the plugin has been included is saved or destroyed. It’s restored to the cache the next time it’s called.

    Now, what if your Internet class method ‘get_a_million_numbers’ depends on other objects getting saved or destroyed? That’s the other thing I wanted to make easier. Rather than setting up observers or sweepers, you can add the following to the other model:

    class WhereAmI < ActiveRecord::Base
      acts_as_cachola_notifier => [:internet]
    end
    

    Now when your WhereAmI model is ether saved or destroyed, the cached methods in the Internet model will be deleted.

    Installation

    script/plugin install git://github.com/rbrant/acts_as_cachola.git

    Where is this going from here?

    Not sure. It does what I need it to do right now. It’s something I’ve found myself doing on two different projects that I thought would just make my life easier.

    Project Info

    ActsAsCachola is hosted on Github: http://github.com/rbrant/acts_as_cachola, where your contributions, forkings, comments and feedback are greatly appreciated. Please do add tests if you want me to pull in any changes.

  • March 12, 01:11 PM

    I want to show you some SAX.

    I had to process some pretty big xml docs recently from the USPTO. Each doc is about 60mb and (oddly enough) contains several thousand individual documents all concatenated. So the document isn’t valid xml..but that’s a different story.

    The reason for writing this was to show a quick demo of how to use SAX to process a large XML file. You can read about SAX here, but basically, SAX (Simple API for XML) is an event-driven model that solves the problem of having to read an entire tree structure into memory which can be realllly sloooow, and instead reads the stream of data and raises events along the way.

    The code below uses the Nokogiri library (which as a side note has this odd, albeit entertaining tagline: “XML is like violence – if it doesn’t solve your problems, you are not using enough of it.”). Most other XML parsing libraries also have SAX implementations.

    What the code does below is looks for the root node of each doc and builds a string for each individual document. After the doc has been assembled, the doc can be processed via the more pleasant:

    doc = Nokogiri::HTML(xml)
    serial = doc.css("application-reference document-id doc-number").inner_text
    

    So this ends up being sort of a hybrid and much, much faster than loading the entire doc at once. It would be faster not parsing the doc again at all but the docs have too much nested complexity that requires the ability to use xpath to get at what I need.

  • February 17, 04:36 PM
  • December 15, 09:18 AM
  • December 06, 08:09 PM

    Project review: ifwinsight.com

    It’s easy to forget what you’ve learned and what tools you used from project to project. I thought it might be worthwhile to sort of sum up these things either on a weekly basis or project basis. I had a lot of fun on a recent project and thought it would be a good place to start. I recently built what is described as a ‘tool for intelligently searching US patent application Image File Wrappers (IFWs).’

    Technically, the system allows users to upload PDF documents and have their content indexed and made searchable. The documents are reasonably sized, averaging 25 megs each with several hundred pages. So once uploaded to the server, they are handed to delayed job to be processed in the background. I’m using collective idea’s fork after watching Ryan Bates’ screencast on delayed job that points out this fork has a few generators and rake tasks not part of the original.

    In order to index the document, the PDF needs to be examined by OCR (optical character recognition) software. But before the OCR software can do its OCR-ing, it needs to have an image to examine. So we need to convert the individual PDF pages into images. To accomplish that, I used ghostscript. It’s really easy to use and fast. You can hand ghostscript the document, and it will churn out a an image of each PDF page, in the resolution of your choice. I’m using 300×300, which seems to be a nice balance between processing time, space, and readability/ocr results.

    Once the document has been converted into images the OCR software, tesseract-ocr, will iterate through each image and produce a text file with the contents of the page. Now, with a directory full of text files, it’s time to store the contents of each page in the database. That’s where sphinx and thinking sphinx come into play. Sphinx is the full text search engine and thinking sphinx is a ‘concise and easy-to-use Ruby library that connects ActiveRecord to the Sphinx search daemon, managing configuration and searching.’ I actually started the project with ferret/acts_as_ferret, but after reading so many good reviews of sphinx, and my own problems with ferret, I switched. The only downside is that setup is a little trickier and thinking sphinx doesn’t automatically update the index the way acts_as_ferret does, so there’s a cron job that handles that. The indexer is super fast though, so frequent indexing isn’t a problem.

    The site also offers multiple file download, and I used the rubyzip library which makes it simple to zip up a bunch of docs into one.

    As for design, we used a theme from themeforest.net. I was impressed by the quality of generic templates they have. They aren’t free, but are dirt cheap – $5 or $10  for most. I’ve used

    It’s a Rails application, so as for gems/plugins, the usual suspects are there: acts_as_commentable, exception_notification, restful_authentication, role_requirement, mislav-will_paginate, attachment_fu, and a few others: slicehost, thinking-sphinx, delayed_job, and rubyzip.

    The real jewel in the list is ‘slicehost‘ which gives you a bunch of rake tasks for setting up your slice at slicehost, which is my favorite hosting provider.

    One other thing worth mentioning was an issue with the delayed_job process not stopping properly during deploys, so I kept getting multiple instances of delayed job running because the one running during the deploy never stopped. It was noted on github (with the solution below) in the issues section but I can’t find it now. Basically, the restart task looks like this:

    desc "Restart the delayed_job process"
      task :restart, :roles => :app do
      stop
      wait_for_process_to_end('delayed_job')
      start
      end
    end
     
    def wait_for_process_to_end(process_name)
      run "COUNT=1; until [ $COUNT -eq 0 ]; do COUNT=`ps -ef | grep -v 'ps -ef' | grep -v 'grep' | grep -i '#{process_name}'|wc -l` ; echo 'waiting for #{process_name} to end' ; sleep 2 ; done"
    end
    

    As a final note, all the software used in this project is open source. I’m constantly reminded of that and impressed by it. My thanks to all who have contributed to the software used in this project!

Bookmarks

Posts

Recent tracks

Top tracks

Posts

  • August 12, 11:00 AM

    i(Pad) of the Tiger


    This is great! Photographer Jordan Hollender and musician Scott Harris put together this music video that covers Survivor's classic anthem and uses only iPad apps as instruments. The video itself was recorded with a couple of Canon HDSLR video cameras, but as you can see in the embedded version above, all of the music is created with iPad apps. Unfortunately, they don't identify the apps used, but that sounds like a great job for you TUAW commenters. I think I saw Pianolo HD being played on the floor there, and Pocket Drums is being used as percussion, but I couldn't find the guitar app or the DJ app that they are using.

    Of course, what I really want to know is where he got that sweet lightning bolt iPad strap. The video's great, though. Apparently it was all lit in one day and shot in another. There's no word on how long it took to make the song, but with the iPad involved, it was probably both magical and revolutionary.

    (Thanks, Rachel!)

    TUAWi(Pad) of the Tiger originally appeared on The Unofficial Apple Weblog (TUAW) on Thu, 12 Aug 2010 10:00:00 EST. Please see our terms for use of feeds.

    Read | Permalink | Email this | Comments
  • July 25, 12:00 AM

    We’re Gonna Be Sorry

    Congress’s failure to pass an energy/climate bill is bad news for all of us.
  • July 20, 05:06 PM

    Serenity Now: Seinfeld as an action thriller [video]

      Posted by Annie Colbert

    Classic sitcom “Seinfeld” gets sliced, diced, and set to eerie music for an action thriller movie trailer. Who ever doubted Newman harbored a psychotic streak?

    Previously on TV-comedies-turned-action-flicks: Arrested Development.

    Via TheHighDefinite.

    Tune in to the top TV news.

    Permalink

    Leave a comment  »

  • June 28, 12:27 PM

    Silly Putty ingredient found in McNuggets

    A recent CNN investigation found that the same chemicals found in Silly Putty can be found in McNuggets:
    American McNuggets (190 calories, 12 grams of fat, 2 grams of saturated fat for 4 pieces) contain the chemical preservative tBHQ, tertiary butylhydroquinone, a petroleum-based product. They also contain dimethylpolysiloxane, "an anti-foaming agent" also used in Silly Putty.
    Yummy.

    All McNuggets not created equal [CNN's The Chart]

  • July 09, 11:57 AM

    Cavs Owner Brings Comic Sans Back


    While LeBron James might have made sports history last night when he decided to leave the Cleveland Cavaliers and join forces with the Miami Heat — after a long, dramatic buildup that included King James joining Twitter — he may have made an even more important contribution to the cultural canon: The return of comic sans.

    A lot of people were naturally PO’d at James for turning coat and leaving his hometown team, but the most peeved was Cavaliers owner Dan Gilbert, who penned a long epistle on the team website tearing into James. The contents of the letter were certainly worthy of going viral — there were a lot of all-caps sentiments and more than a little ill will — but the font Gilbert chose was, for lack of a better word, awesome. Comic-freaking-sans. You know, that font we all thought was rad when we were, like, 12 years old.

    The use of said font has sparked discussions across the web — it was a trending topic this morning on Twitter and The Washington Post even made mention of it — which leads us to wonder if it will make a true comeback sometime soon.

    Since its inception in 1994 — it was created Vincent Connare — people have had mixed feelings about the child-like font. Apparently, there’s even been a “Ban Comic Sans” campaign going since 1999.

    Still, we’ve seen the font coming back into the public eye rather whimsically of late — Timothy McSweeney’s Internet Tendency even recently featured a short, imagined monologue titled “I’m Comic Sans, A**hole.”

    I’ll admit that I’m a bit biased here, as I have a strange predilection for the goofy typeface — call it “I love the ugly puppy” syndrome — but it’s interesting to see it thrust into the public eye hand-in-hand with a sports-related incident. What do you think? They may have lost the King, but can the Cavs save Sans?

    [img credit: keith allison]


    Reviews: Twitter

    More About: font, humor, popular-culture, social media, sports

    For more Entertainment coverage:

  • June 01, 02:10 PM

    #133 The World Cup

    Every four years the planet comes together to celebrate the World Cup and since white people make up a portion the world, they are not immune to the excitement.

    However, before you start planning out long watching sessions with white people you should be aware of exactly why white people get so excited about the World Cup. Though you may be waiting on bated breath for your favorite sport on a global scale, white people like the World Cup because it allows them to pretend they are European for a few weeks, and more importantly, it allows them to get drunk at odd hours.

    Virtually every white person you speak to about the World Cup is incapable of remembering any actual event that took place during a game but can, with near total recall, remember how they got very drunk on Sangria during a Spain-Paraguay match at five in the morning.

    From reading the above paragraph, the sharper ones among you have likely noticed that clever white people also adore the World Cup because it allows them to pair countries with their respective alcoholic drink.

    “England is playing Argentina? Dude we gotta get some Newcastle then like, I don’t know, like some wine I guess?”

    This plan will be consummated with a high five, a trip to Trader Joes, and the purchase of a soccer jersey that will be worn, on average, twice a decade.

    It’s also worth noting the amazing interest shown by white women in the World Cup. While they generally find most professional sporting events to be boring, the atmosphere at a World Cup match is much more amenable. Mostly because they don’t have to drink light beer and there is a good chance that they might meet a European man, or, at least someone who might be planning a trip there. This is far superior to a hockey game where, at best, they might meet a Canadian. It goes without saying that for white women, the World Cup can’t come soon enough.

    Of course, hosting a themed party around one of the games is a sure fire way to increase your popularity with white people, but at the end of the day it does not increase your bottom line. No, during the World Cup, the most profit to be made will come from betting on the games with white people. Not only will they have plenty of disposable income, they will follow the following betting patterns:

    • England is good
    • Brazil is good
    • Italy is good
    • Teams from Africa are cute underdogs and thus always worth a bet.

    When it comes to talking about the event, it goes without saying that you should probably avoid trying to talk to white people about any of the actual players in the World Cup aside from the biggest stars. Most white people cobble their soccer knowledge together from UK celebrity gossip and a few games of FIFA on the Wii.

    But if you do find yourself talking to a white person who actually knows a lot about soccer you are probably talking to a European, or worse, a white guy who tries too hard.

    The latter is especially dangerous, as they have likely been waiting for years to meet someone to converse with about “football” and with soccer’s year round schedule, they will never leave you alone.

    Photo Credit: LisaLouise


  • June 08, 05:18 AM

    There Are No Famous Programmers

    I frequently meet a friend for lunch and we talk. Usually I'll blab on and on about music, or some weirdo project I have going on. He'll tell me about jobs he's had or trips he might take now that he's sold a company and can chill out for a while. After one such meeting he said, "It's so refreshing to meet up with a geek who doesn't talk about VCs and term sheets the whole time."

    VCs and term sheets? Really? Well shit, tomorrow I get a x0xb0x and tonight I was hacking on a cool new web server now that I'm done with MulletDB. And these guys just think about VCs and term sheets? That's kind of sad really.

    Let me tell you about this cool new web server. I figured out how to merge the ZeroMQ event polling system with the libtask coroutine library so that you can use libtask to handle tons of TCP/UDP and ZeroMQ sockets in a single thread. I then took this very cool hack, and started building a web server using my Mongrel HTTP parser, but I modified the parser so that the same server on the same port can handle HTTP or Flash XMLSockets transparently. The next step is to get this server to route HTTP and XMLSocket JSON messages to arbitrary ZeroMQ backends. I was inspired by this so much that I registered utu.im and may try to bring it back. Not sure how or when though.

    Sounds cool right? Totally doesn't matter one bit. I could hack on projects like this and nobody would care at all because I'm a famous programmer, and there is no such thing as famous programmers. I don't exist. I'm an enigma.

  • May 30, 08:27 AM

    QUOTE: Many people with jobs have a fantasy about

    Many people with jobs have a fantasy about all the amazing things they would do if they didn’t need to work. In reality, if they had the drive and commitment to do actually do those things, they wouldn’t let a job get in the way.

    —Paul Buchheit of Gmail fame on What to do with your millions.

  • May 23, 03:58 AM

    Ruby on Rails 2.3.6 Released

    We’ve released Ruby on Rails 2.3.6: six months of bug fixes, a handful of new features, and a strong bridge to Rails 3.

    We deprecated some obscure and ancient features in Rails 2.3.6 so we could cut them entirely from Rails 3. If your app runs on Rails 2.3.6 without deprecation warnings, you’re in good shape for a smooth sail onward.

    This slow-cooked dish is brought to you some 87 committers from our all-volunteer kitchen.

    Now, let’s open the goodie bag!

    Action Pack

    • Upgrade Rack from 1.0.1 to 1.1.0.
    • XSS prevention: update to match Rails 3 and move to the official plugin at http://github.com/rails/rails_xss.
    • Cookies: convenient cookie jar add-ons to set permanent or signed cookies, or both at once: cookies.permanent.signed[:remember_me] = current_user.id. Read more.
    • Flash: promote alert and notice, the most common flash keys in many apps, to self.alert = '...' and self.notice = '...'. Add redirect_to url, :alert => '...' and :notice => '...'. Read more.
    • i18n: localize the label helper.

    Active Record

    • Namespacing: support optional table name prefixes on modules by defining self.table_name_prefix. Read more.
    • Destroy uses optimistic locking.
    • Counter cache: use Post.reset_counters(1234, :comments) to count the number of comments for post 1234 and reset its comments_count cache.
    • PostgreSQL: always use standard-conforming strings, if supported.
    • MySQL: add index length support. Read more.
    • MySQL: add_ and change_column support column positioning using :first => true and :after => :other_column.

    Active Support

    • Upgrade i18n from 1.3.3 to 1.3.7.
    • Upgrade TZInfo from 0.3.12 to 0.3.16.
    • Multibyte: speed up string verification and cleaning.
    • JSON: use YAJL for JSON decoding, if available. gem install yajl-ruby
    • Testing: add assert_blank and assert_present. Read more.
    • Core: backport Object#singleton_class from Ruby 1.8.8, deprecating our Object#metaclass.
    • Core: add Object#presence that returns the object if it’s #present? otherwise returns nil. Example: region = params[:state].presence || params[:country].presence || 'US'
    • Core: add Enumerable#exclude? to match include?.
    • Core: rename Array#rand to Array#random_element to avoid collision with Kernel#rand.
    • Core: rename Date# and Time#last_(month|year) to #prev_(month|year) for Ruby 1.9 forward compatibility.

    Active Resource

    • JSON: set ActiveResource::Base.include_root_in_json = true to serialize as a hash of model name -> attributes instead of a bare attributes hash. Defaults to false.

    Action Mailer

    • Upgrade TMail from 1.2.3 to 1.2.7.

    Railties

    • Silence RubyGems 1.3.6 deprecation warnings.

    Peruse the commit log for the full story.

  • May 11, 11:21 AM

    Funny history of programming languages

    James Iry's "A Brief, Incomplete, and Mostly Wrong History of Programming Languages" had me snorting liquid out of my nose with delight at the contrafactual, geeky, in-jokey whimsy.
  • May 05, 07:07 PM

    RDropbox: A Ruby Client Library for Dropbox

    Dropbox is a popular file hosting service (4m+ users) that provides synced backup and file hosting to OS X, Windows, and Linux users. You get up to 2GB of space for free. RDropbox is a library by Tim Morgan (of Autumn fame) that takes advantage of the official Dropbox API from Ruby.

    With RDropbox you can log into a Dropbox account using OAuth and then upload and download files. A requirement, however, is that you apply for Dropbox API access and are approved, as the API is not fully open to the public without going through the approval process (this appears to be in order to avoid overloading their service). The API was, notably, worked on by notable Ruby alumnus, Zed Shaw.

    Once you've made it into the Dropbox API program, RDropbox gives you the benefit of writing code as simple as:

    # STEP 1: Authorize the user
    session = Dropbox::Session.new('your_consumer_key', 'your_consumer_secret')
    puts "Visit #{session.authorize_url} to log in to Dropbox. Hit enter when you have done this."
    gets
    session.authorize
    session.sandbox = true
    
    # STEP 2: Play!
    session.upload('testfile.txt')
    uploaded_file = session.file('testfile.txt')
    puts uploaded_file.metadata.size
    
    uploaded_file.move 'new_name.txt'
    uploaded_file.delete

    An alternative, unofficial route: tvongaza's DropBox

    If you want to be using Dropbox from Ruby right now, there's an alternative: tvongaza/DropBox. This alternative library predates the official Dropbox API and uses the same techniques as the official Dropbox clients instead. For this you'll need to use your Dropbox e-mail username and password to log in (this could be a problem if you want to use third party Dropbox accounts!) and you can then create, delete and rename folders and files, as well as check usage statistics.

  • May 09, 12:00 AM

    Root Canal Politics

    Baby boomers must accept deep cuts today so their kids can have jobs and not be saddled with debts tomorrow.
  • April 28, 01:07 PM

    Everything You Need to Know About the New ActiveRecord API

    Carl Lerche hosts Week 4 at Rails Dispatch: blog post and screencast on ActiveRelation, the new ActiveRecord API. Check it out! Also, be sure to take a peek at the new Q&A feature.
  • March 04, 12:00 AM

    Obama’s Ball and Chain

    I fear that President Obama’s first term could be eaten by Citigroup, A.I.G., Bank of America, Merrill Lynch, and the whole housing/subprime credit bubble.
  • March 03, 11:04 AM

    Daily Show Discovers Twitter

    What do you do when you're late to a trend? Mock yourself! Watch Jon Stewart's Daily Show writers, one of whom only started using the banal messaging service on Oscars night, try to catch up.

    The subtext of the opening clip, which sets up the media's relentless fascination with Twitter: Every other media outlet in the world picked up on Twitter before the Daily Show did. Welcome to Twitteronia, kids.

    Here's the full segment:

  • February 22, 12:00 AM

    Start Up the Risk-Takers

    Precious public money should focus on investing in a new generation of innovative companies, not on bailing out the losers.
  • February 01, 12:00 AM

    Elvis Has Left the Mountain

    There is no magic bullet for this economic crisis. We are going to have to learn to live with a lot more uncertainty for a lot longer than our generation has ever experienced.