photography portfolio
projects
A more detailed section is in the works. For now, here are a few to look at.
Upcoming projects..
Learning Japanese Aug 28

Learning Japanese.. the Rosetta Stone way.

I’m jumping on the Rosetta Stone bandwagon after ignoring the kiosk guy a hundred times in the mall. I took a class in college but forgot everything so this should be an interesting way to learn it.

I’ll post updates on my progress and welcome any advice.

Updated Photo Portfolio Aug 27

Updated my Photo Portfolio with a new design. It’s real basic and easier/faster to navigate.

Also added a few new photos.

The Best of Junkparty. RIP junkparty.com 2007-2009 with 1,400 photos.

PDFKit and wkhtmltopdf without X Server, using qt Jul 15

If your PDFKit and wkhtmltopdf is working on your development server, probably in OSX, but not working on your production server, which is probably running linux, it’s because you’re missing X Server.

There are a few ways around this, some emulate X Server, but that seems hacky. I read through the wkhtmltopdf docs and read that a patched qt framework will allow you to use wkhtmltopdf without using X Server.

Here’s what I did on my Ubuntu Box to get this to work (note: the compile time for qt was almost 2 hours, and you’ll also need to have git installed):


sudo apt-get build-dep libqt4-gui libqt4-network libqt4-webkit
sudo apt-get install openssl build-essential xorg git-core git-doc libssl-dev

mkdir ~/sources
cd ~/sources
git clone git://gitorious.org/+wkhtml2pdf/qt/wkhtmltopdf-qt.git wkhtmltopdf-qt
cd wkhtmltopdf-qt
./configure -nomake tools,examples,demos,docs,translations -opensource -prefix ../wkqt
make -j3
make install
cd ..

Next install wkhtmltopdf:


git clone git://github.com/antialize/wkhtmltopdf.git wkhtmltopdf
cd wkhtmltopdf
../wkqt/bin/qmake
make -j3
make install

Run ‘wkhtmltopdf’ in shell and you should see it load correctly instead of seeing the x server error. Running ‘wkhtmltopdf-proxy’ should do the same, which is what PDFKit uses.

Ruby Hash to Class Object and OpenStruct Jul 12

I’ve been working on a class that’s pulling information from an API and wanted to create dynamic attributes from a hash(json).

I came across this link:

http://pullmonkey.com/2008/01/06/convert-a-ruby-hash-into-a-class-object

It works pretty well, but I haven’t done much benchmarking. I’ve read in the past that define_method can be slow and has memory leaks.

Following that post, I read the comments and came across OpenStruct:

http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/ostruct/rdoc/classes/OpenStruct.html

I have it working with what I need but there’s still more testing to be done. Just thought I would share.

iPad Sync with Google Calendar, GMail, Contacts Apr 08

I followed these directions:
http://www.google.com/support/mobile/bin/answer.py?hl=en&answer=138740

It’s made for the iPhone but it works perfectly!

It syncs all of my mail, with push, my contacts, and my calendar.
I also have iCal on my MacBook synced with google, as well as my phone. I’m pretty much connected in every way possible. Thx google.

Ruby Array to Javascript Array Mar 10

Need to pass a Ruby Array to a Javascript Array?
Here’s a little gem I found a while ago that I’m reusing in my current project.


>> a_ruby_array = ["one", "two", "three"]
=> ["one", "two", "three"]
>> "['#{a_ruby_array.join('\',\'')}']"
=> "['one','two','three']"

Validations For Multiple Nested Model Forms Mar 06

Here’s a little trick I found when handling multiple nested models in a form that require validations for each model.

Spec time. For example, we have a model, Author, which has_many Books and has_many Magazines. Book and Magazine has validations. On a single page, we create a three forms for Book, Magazine, and Author. There is also an option select that a user can choose if the Author has a Book or a Magazine.

Pretty straight forward. Let’s do some code.


#models/author.rb
class Author < ActiveRecord::Base
  has_many :books
  has_many :magazines

  accepts_nested_attributes_for :books
  accepts_nested_attributes_for :magazines

  validates_presence_of :name
end


#models/book.rb
class Book < ActiveRecord::Base
  belongs_to :author
  validates_presence_of :title, 
                        :genre
end


#models/magazine.rb
class Magazine < ActiveRecord::Base
  belongs_to :author
  validates_presence_of :title, 
                        :genre
end

Basic model setup with validations and accepts_nested_attributes_for. More info on that can be found in the Ruby on Rails API – Nested Attributes.

Moving on to the form setup..


#views/authors/new.html.erb
<% form_for @author do |f| %>
<%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.radio_button("media_type", "book" %><%= f.label :media_type_book, 'Book' %> [?]
    <%= f.radio_button("media_type", "magazine" %><%= f.label :media_type_magazine, 'Magazine' %> [?]
  </p>
  <% f.fields_for :books do |book| %>
    <p>
      <%= book.label :title %><br />
      <%= book.text_field :title %>
    </p>
    <p>
      <%= book.label :genre %><br />
      <%= book.text_field :genre %>
    </p>
  <% end %>

  <% f.fields_for :magazines do |magazine| %>
    <p>
      <%= magazine.label :title %><br />
      <%= magazine.text_field :title %>
    </p>
    <p>
      <%= magazine.label :genre %><br />
      <%= magazine.text_field :genre %>
    </p>
  <% end %>
  <%= f.submit 'Submit' %>
<% end %>
  

That sets up the form with the nested model, now for the controller code.


#controllers/authors_controller.rb
class AuthorsController < ApplicationController
  def new
    @author = Author.new
    books = @author.books.build #this builds the nested form in the view
    magazines = @author.magazines.build #this builds the nested form in the view
  end

  def create
    param_hash = params[:author]
    if params[:author][:media_type] == "book"
      param_hash.delete("books_attributes")
    elsif params[:author][:media_type] == "magazine"
      param_hash.delete("magazines_attributes")
    end
    @author = Author.new(param_hash)
    @author.save
  end
end

Instead of passing the params straight to Author.new, it’s put into a hash variable. Then the params get checked for a title and genre, if empty delete the key from the hash and pass to Author.new. Activerecord wont see the book param and will skip the validations for it.

Android Apps Mar 05

Is it me or do 90% of the Android apps look similar to Windows 3.1 software?

I’ve been developing an Android app over the past few weeks and I noticed that the GUI quality for Android apps is lacking. I’m pretty sure this is do to the lack of filtering that Google does, which Apple requires.

While looking through dozens and dozens of apps, I came across comments such as, “if this looked better, i’d give it a 5 star.”

That got me thinking about this app I’m currently working on. If I make this app beautiful, I could probably sell it for a $1 more!

I believe that a majority of app users, iPhone or Android, really want pretty interfaces over anything else.

Google Buzz Feb 12

I’m actually pretty surprised that I would be this excited about Google Buzz. I guess it could be the fact that it’s integrated into a system I already use that makes it appealing. Or perhaps I’m tired of limiting what I have to say and read to 140 characters. If the idea behind 140 characters was based on SMS, and SMS is now outdated because we’re all sending emails from our phone, shouldn’t the next step in technology evolution be limitless character status updates? With photos and video attachments too!

I remember a service around the same time Twitter gained it’s popularity called Pownce. They tried to accomplish a social network based around status updates with no limits, and failed, while everyone jumped on the 140 character limit text only status update bandwagon. Maybe people are tired of this limit and Buzz will pull people away from Twitter? Or will Buzz be too complicated to use and the 140 character limit and it’s simplicity will keep their users separated for now?

For myself, I love Twitter and I love Google. So I’ll keep both. For now. I’m making an app that will sync my tweets with my buzzes and my buzzes with my tweets.(not really)

Radiant CMS and some Feb 03

I’ve been pretty busy working on my current project and needed a break to let my mind rest and decided to try out Radiant CMS.

A few hours and I fully converted my website over, with a little hacking to get my URLs to match. I was very impressed on how easy it was to setup. I actually thought there would be more to do.

Anyways, I’m definitely excited to play with some of the extensions for Radiant CMS. For now, comments are gone, but they’ll be back soon I hope.

Also would like to mention that my site feels faster by at least 50%. Loving the built in caching.

Update: Comments are back, took all of 5 minutes to setup Disqus!