Blog

  • Rails 2.0: Gmail SMTP With ActionMailer

    Marc just checked in a nifty little Rails 2.0 plugin to the OpenRain public subversion repository which encapsulates the voodoo required to use a Gmail SMTP server with an otherwise ordinary ActionMailer configuration. Gmail requires TLS security, which is why this is useful. Grab the plugin for your Gmail-mooching Rails 2.0 site, here.

    Note: I previously wrote about how to do this for Rails 1.2.x here.

    Update (2008.06.25): Broken download link fixed!

     

  • Small Office VoIP: Skype Pros/Cons

    skype_logo.pngBefore the 2007 tax year ended, OpenRain decided to finally solidify a telephony strategy for the next year or so. Key requirements were..

    • Easy ad-hoc and scheduled conferences.
    • Mobile flexibility and continuity across physical locations.
    • Scalability for the next couple years.
    • Voice mail
    • Call forwarding.
    • Little to no management overhead. (I don’t want to run a dedicated PBX.)
    • Usable hardware.
    • Practical prices for worldwide incoming/outgoing calls.
    • Less than ~$2K initial investment.

    It came down to one of two primary directions..

    1. Hosted VoIP (such as with Vonage or Qwest) with SIP phones such as from Cisco or Avaya.
    2. Skype with 3rd-party hardware and Mac soft-phone.

    After some debate, we chose to use Skype exclusively for services, and have been fairly satisfied. I have a few beefs, but at less than $100 per year per person, I can’t complain too much.

    Skype Pros:

    • Instant gratification. Easy to set yourself up for calls to/from landlines.
    • Good soft-client with videoconferencing support; Address Book.app integration is present in the latest Mac beta client.
    • Inexpensive. Less than $100 per seat per year for SkypePro and SkypeIn (an incoming number).
    • Awesome value when bundled with an IPEVO SOLO.
    • Extremely simple web interface for distributing company credits.
    • Concurrent logins from multiple locations. I leave my SOLO on 24/7 and use the soft-client on the road.
    • Great quality on Skype-to-Skype calls. Good quality to landlines.

    Skype Cons:

    • My biggest gripe: In the U.S., outgoing calls do NOT show your SkypeIn number on the recipients phone.
    • Vendor lock-in, since Skype uses a proprietary protocol. Since cost of entry for services is so low, however, it may not be a huge deal if your want to switch to a SIP-based provider.
    • The WiFi-Phones all suck. The IPEVO SOLO is the only desktop model I like.
    • Possible future screwage of SkypeIn numbers if they ever change.
    • No 911, which is a general issue with VoIP services.
  • Ruby Troubleshooting: Hpricot On OS X Leopard

    If you upgraded to Leopard, you may be getting this nasty error when trying to install Hpricot, which is required by other popular gems such as mechanize..

    preston$ sudo gem install mechanize
    Password: ********

    Bulk updating Gem source index for: http://gems.rubyforge.org
    Install required dependency hpricot? [Yn]
    Select which gem to install for your platform (i686-darwin8.10.3)
    1. hpricot 0.6 (mswin32)
    2. hpricot 0.6 (jruby)
    3. hpricot 0.6 (ruby)
    4. hpricot 0.5 (ruby)
    5. hpricot 0.5 (mswin32)
    6. Skip this gem
    7. Cancel installation
    > 3
    Building native extensions. This could take a while…
    ERROR: While executing gem … (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

    ruby extconf.rb install mechanize
    checking for main() in -lc… no
    creating Makefile

    make
    gcc -I. -I. -I/opt/local/lib/ruby/1.8/i686-darwin8.10.3 -I. -I/opt/local/include -fno-common -O2 -fno-common -pipe -fno-common -c hpricot_scan.c
    cc -dynamic -bundle -undefined suppress -flat_namespace -L/opt/local/lib -L”/opt/local/lib” -o hpricot_scan.bundle hpricot_scan.o -lruby -lpthread -ldl -lobjc
    /usr/bin/ld: /usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib unknown flags (type) of section 6 (__TEXT,__dof_plockstat) in load command 0
    /usr/bin/ld: /usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libdl.dylib unknown flags (type) of section 6 (__TEXT,__dof_plockstat) in load command 0
    /usr/bin/ld: /usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libobjc.dylib load command 9 unknown cmd field
    /usr/bin/ld: /usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libSystem.dylib unknown flags (type) of section 6 (__TEXT,__dof_plockstat) in load command 0
    /usr/bin/ld: /usr/lib/libSystem.B.dylib unknown flags (type) of section 6 (__TEXT,__dof_plockstat) in load command 0
    collect2: ld returned 1 exit status
    make: *** [hpricot_scan.bundle] Error 1

    Gem files will remain installed in /opt/local/lib/ruby/gems/1.8/gems/hpricot-0.6 for inspection.
    Results logged to /opt/local/lib/ruby/gems/1.8/gems/hpricot-0.6/ext/hpricot_scan/gem_make.out

    The issue is that Xcode 3 must be upgraded as well; Hpricot’s native components cannot be built with the older Tiger development tools on Leopard. After installing Xcode 3 from either your Leopard DVD or Apple Developer Connection, run the install again…

    preston$ sudo gem install mechanize

    Install required dependency hpricot? [Yn] Y
    Select which gem to install for your platform (i686-darwin8.10.3)
    1. hpricot 0.6 (mswin32)
    2. hpricot 0.6 (jruby)
    3. hpricot 0.6 (ruby)
    4. hpricot 0.5 (ruby)
    5. hpricot 0.5 (mswin32)
    6. Skip this gem
    7. Cancel installation
    > 3
    Building native extensions. This could take a while…
    Successfully installed mechanize-0.6.11
    Successfully installed hpricot-0.6
    Installing ri documentation for mechanize-0.6.11…
    Installing ri documentation for hpricot-0.6…
    Installing RDoc documentation for mechanize-0.6.11…
    Installing RDoc documentation for hpricot-0.6…

    Success!

  • Rails 2.0: Validations Without Extending ActiveRecord::Base

    In more “enterprisey” web stacks (such as Java with Hibernate and Spring MVC), it’s straightforward to design a validatable form whose contents do not correspond directly — if at all — to a persistent OR/M class: such as may happen in an ecommerce site where you’re collecting payment information but can only store some of it in the database for legal reasons. Just create a MVC-level view object using your framework-specific validation mechanism, and translate to/from the relevant OR/M classes as necessary in the controller.

    This scenario isn’t always straightforward to handle in Rails since the stack layers are smooshed together. In Rails 1.2.x, you could use (some) validations in your non-persistent PORO objects by extending ActiveRecord::Base and overriding the initializer to skip the databases-related stuff. Alas, this hack does not seem to work in Rails 2.0, but I have a solution which, in my brief testing, seems to work better than the aforementioned Rails 1.2 hack.

    Here’s how I used ActiveRecord::Validations in one of my view-only classes in a Rails 2.0.2 application without needing a dummy table in the database or ActiveRecord::Base.


    require 'active_record/validations'

    class Card

    # Define your arbitrary PORO attributes.
    attr_accessor :number
    attr_accessor :expiration_month
    attr_accessor :expiration_year
    attr_accessor :verification_value

    # For the ActiveRecord::Errors object.
    attr_accessor :errors

    def initialize(opts = {})

    # Create an Errors object, which is required by validations and to use some view methods.
    @errors = ActiveRecord::Errors.new(self)

    end

    # Dummy stub to make validtions happy.
    def save
    end

    # Dummy stub to make validtions happy.
    def save!
    end

    # Dummy stub to make validtions happy.
    def new_record?

    false

    end

    # Dummy stub to make validtions happy.
    def update_attribute
    end

    # Mix in that validation goodness!
    include ActiveRecord::Validations

    # Use validations.
    validates_presence_of :number
    validates_presence_of :expiration_month
    validates_presence_of :expiration_year
    validates_presence_of :verification_value

    end

  • Rails 2.0: HTTP Basic Authentication

    lock.pngHTTP Basic authentication support comes bundled with Rails 2.0, alleviating the need for external plugins we used with Rails 1.x. Here’s how you can use (and test) this new Rails 2.0 feature. (more…)

  • Mass Effect: Holy Freaking Crap

    picture-7.pngI figured I’d have some “me” time this weekend, so I picked up a copy of the highly praised Mass Effect. Saying it’s good is obvious; awesome is an understatement. Groin-grabbingly enthralling, genre-shattering entertainment is somewhere in the neighborhood. We’re talking a contender for best video game ever here. So if you’re last minute Christmas shopping for a 360 owner (possibly yourself), I can’t recommend Mass Effect highly enough.

    The gameplay itself is difficult to describe. Take the fun parts of leveling, storyline, voice acting and small squad combat RPG elements from Baldur’s Gate, the pace, feel and vehicle action of a FPS squad combat shooter, and drop that into an incredibly rich sci-fi backdrop of a Star Trek episode. Awesome sauce!

  • Penguin Pimp

    picture-5.pngI Celebrated my friend Gilraen’s birthday by molding figurines out of Sculpey, which turned out to be an excellent party activity. Karen started off with a cute penguin body, but somehow we ended up with a pimp: complete with hat, cane and technicolor dream coat. There are.. hmm.. “other” complementary figurines, but I’ll refrain from sharing those pictures in the name of cleanliness. Maybe the wine had something to do with it? Whatever.. good times 🙂

  • Rails 2.0: Testing For Well-Formed XML With assert_well_formed

    Here’s an easy way to validate that you’re always rendering well-formed HTML in an ordinary Rails application. I’ve written and verified this on Rails 2.0.1…

    (more…)

  • Xserve w/Leopard Server (Mac OS X 10.5), First Impressions

    picture-4.pngWe just picked up a refurbished 2.66GHz quad-core Xeon from Apple, which we’ll be using for internal infrastructure. (We’re in the process of migrating from a mix of Solaris and Linux). After about 8 hours of learning the ins and outs of Leopard Server over the weekend, we had the box running Open Directory (Kerberos and OpenLDAP), DNS, AFP, SMB, FTP, domain account and machine management, mobile home directories, MySQL, Software Update, Xgrid controller, Wikis, Blogs, iCal and VPN services, all tightly integrated with single sign-on (via Kerberos) into a sexy 1U package.

    • Xserve (refurbished discount, direct from Apple): ~$3K
    • 3 x 750GB Disks (Newegg): ~$450
    • 2 x Apple Drive Module (direct from Apple): ~$380
    • 2 x 2GB FB-DIMM RAM (Crucial): ~$300
    • Infrastructural sanity: priceless. (…or ~$4.5K after tax and random small stuff)

    That’s some serious value considering how much of a PITA setting all this up can be in Linux (or whatever) without vendor support, and far cheaper than paying a Systems Administrator in the long run. The Server Admin and Workgroup Manager tools are pretty freakin’ usable, too, relative to the internal complexity of the system. I’m a happy camper for now… let’s see if it lasts.

  • Invited To The Pentagon

    tides.png
    Mugr.com was recently invited to the Pentagon to demo our facial recognition voodoo as a potential biometric component to TIDES: Transportable Infrastructures for Development and Emergency Support. It was a very last minute trip with very little instruction and direction regarding what to prepare, so we packed up our Mactops and hopped on a plane.

    The subway ride at 5-something AM local time (3AM at home) after an all-nighter came cold and early, and shuttled a variety of more well-rested military types, who periodically would share a silent glance as if to say “OMG U N00B.” (Yes, in all capital letters with no exclamation point.) The guest check-in process was straightforward, and we soon found ourselves inside a small tent-like shelter booting our Macs if for no other reason than to warm our hands.

    The event itself brought in a diverse mix of (mostly) military, many of whom were happy to engage in our biometrics demo and subsequent discussion. I had many wonderful conversations with Dr. John Francis of the U.N. and many DoD personnel over at least a half pot of coffee. A fabulous experience, this goes to show how huge opportunities can spring up whenever, wherever.

    Would you risk your time, reputation and money for the opportunity? I know I’m game.