Jul 28 2011
System-wide Git Global Ignores
If you are like me and love using a Mac for your development tasks, and want a way to get Git to ignore any file (like those pesky .ds_store's) forever and for EVERY repository there is a very simple way to it.
Open Terminal and type:
git config --global core.excludesfile ~/.gitignore
and then:
echo .DS_Store >> ~/.gitignore
This will work for anything you want, just modify the second command as appropriate. And you can run the second command as many times as you need.
Jun 12 2011
Ruby Script to Import Google Contact Photos From Gravatar
Google Contact photos are a much neglected feature of the Google Stack. It really adds to the user experience when you see each of your contact photos when you make or receive a call. However, it can be a real pain (especially if you have hundreds of contacts).
But I had an idea recently, to try and match my Google Contact emails with Gravatar and try to auto-populate some of the dozens of contacts that didn't already have a photo (after all a Gravatar is better than nothing).
So I wrote a Ruby script to find my contacts missing a photo and try to update it with a Gravatar (wherever possible). NB: You may need to first install the GData (Google Data) gem by opening a Terminal window and issuing: sudo gem install gdata.
#!/usr/bin/env ruby # Google Contact Photos - Gravatar Importer # Written by Ashley Angell # http://ashleyangell.com # Licenced under Creative Commons with Attribution require "rubygems" require "gdata" require "rexml/document" require "digest/md5" require "net/http" include REXML none = 'd5fe5cbcc31cff5f8ac010db72eb000c' user = ARGV[0] pass = ARGV[1] client = GData::Client::Contacts.new client.clientlogin(user, pass) data = client.get("https://www.google.com/m8/feeds/contacts/#{user}/full?max-results=10000") myxml = Document.new data.body p "contacts" puts "-"*70 i = 0 myxml.each_element("feed/entry") do |e| begin gd = e.elements['gd:email'] if !gd.nil? email = gd.attributes['address'].downcase hash = Digest::MD5.hexdigest(email) image_src = "http://www.gravatar.com/avatar/#{hash}" nil_image = false image_element = e.get_elements("link[@rel='http://schemas.google.com/contacts/2008/rel#photo']")[0] if !image_element.nil? and image_element.attributes['gd:etag'].nil? data = nil md5 = nil Net::HTTP.start(URI.parse(image_src).host) do |http| resp = http.get(URI.parse(image_src).path) data = resp.body md5 = Digest::MD5.hexdigest(data) File.open("#{email}.png", 'w') do |f| f.puts data if md5 != none end end md5 = Digest::MD5.hexdigest(data) if md5 != none puts "#{email} > #{image_src}" client.put_file(image_element.attributes['href'], "#{email}.png", 'image/png') i = i + 1 else puts "#{email} > no match" end else puts "#{email} > skipped (already has photo)" end File.delete("#{email}.png") if File.exists?("#{email}.png") end rescue Exception => ex puts ex end end puts "Updated #{i} contact photos"
To execute it, simply copy and paste this into a text editor (or download it and unzip) and from Terminal (command) window and execute the following commands:
sudo chmod +x googlegravatarimporter.rb [Enter] ./googlegravatarer.rb your.address@gmail.com your_password [Enter]
It will cycle through your Google Contacts and indicate what action was taken. For me, surprisingly updated a few dozen contacts (even more than I expected).
I've posted this here for others that might want to do the same thing but cannot be bothered writing the script for it. Consider it posted here under Creative Commons with Attribution.
Jun 8 2011
Convert SQL Server Database to a SQLite Database
Recently, I wanted to resurrect an old project of mine I worked on in my spare time originally designed to work on .Net technologies. Naturally, I backed it against a SQL Server 2005 Database which turned out to be a bad idea because it made portability of that data a bit of a nightmare.
So it was with great happiness that I found this tool (mirrored here) by liron.levi who posted an article on CodeProject on how to accomplish this task. You still need a Windows machine and an install of SQL Server (Express Edition with Advanced Tools is alright) but it got the job done just fine for me.
If you want a no-fuss easy way to convert your databases into a format easier to deal with and a lot more portable to-boot.
Jun 7 2011
‘File not found: lib’ Error installing Rails Gem
I recently had a problem trying to install Rails 3 on my MacBook with a fresh OSX Snow Leopard:
sudo gem install rails
Password: {entered}
Successfully installed rails-3.0.7
1 gem installed
Installing ri documentation for rails-3.0.7...
File not found: lib
Turns out this is a somewhat common problem. But it seems that the solution is easy, just manually reinstall RDoc. To do this run these 3 commands:
sudo gem install rdoc-data
sudo rdoc-data --install
sudo gem rdoc --all --overwrite
The last line in particular will re-generate all the documentation for your installed gems (including Rails) and can take a while, but you should be able to confirm the fix by reissuing the Rails gem install command:
sudo gem install rails
shows that rails now installs properly and says that it has installed both ri and RDoc documentation without issue.
Oct 17 2010
Adding Wiki Style Functionality to Your Rails Site Using ‘acts_as_versioned’
If you need to add basic wiki style functionality to your Ruby on Rails models, there is a really easy way to get similar model versioning without having to resort to cutting the code yourself.
The acts_as_versioned 'plugin' has been available for quite some time, but its been made far better by it now becoming a gem instead of an old-school plugin. The authors have gone to considerable effort to make it as painless as possible to use.
This post, is designed to give you a brief over-view into how to get up and running with with models which 'acts_as_versioned'. Because its the current version (at time of posting) and because its awesome, this walk-though assumes that you are using Rails 3, not 2. The instructions for Rails 2 sites are similar, but you'll need to tweak this for it to work.
First, you need to grab the gem:
sudo gem install acts_as_versioned
Next, add the dependency to the 'Gemfile', it doesn't matter too much where it goes, I stuck it somewhere in the middle:
gem 'acts_as_versioned', '0.6.0'
Next, just under the 'ActiveRecord::Base' line in the model's class file, instruct the class that its to act as a versioned model.
class Article < ActiveRecord::Base acts_as_versioned end
Then, in the migration file you need to execute the model's method to create the version table. This is key because the acts_as_versioned gem actually creates an additional database table to house all the previous versions of a given record. Obviously, you need to delete the table is the schema is taken down. My migration now looks like:
class CreateArticles < ActiveRecord::Migration def self.up create_table :article do |t| t.string :title t.string :body t.integer :user_id t.timestamps end Article.create_versioned_table end def self.down drop_table :articles Article.drop_versioned_table end end
The key method is the
Article.create_versioned_table
which creates the version table of the model. Now, get rake to create the database:
rake db:migrate
Thats it! Its done. Using acts_as_versioned is simple. I'll provide some examples, where '@article' represents an instance of a model setup 'acts_as_versioned'. To find the current version of an article you can use the version property:
@article.version
But just performing a normal ActiveRecord lookup returns the most current version anyway, so to revert to a previous version use the revert_to method on an article instance:
@article.revert_to(version_number)
You can save (just like you've done a hundred times before) a previous version as the current on by using the save method. The save on a reverted articles will just create a new version.
To get the number of versions:
@article.versions.size
Since '@article.versions' returns an array of versions, you can do neat things like this:
<h2>History</h2> <% for version in @article.versions.reverse %> Version <%= version.version %> <%= link_to '(revert to this version)', :action => 'revert_to_version', :version => version.id, :id => @article %> <% end %>
Obviously for this to work, you'd need to create a 'revert_to_version' action in the appropriate controller, but you get the idea.
acts_as_versioned is an amazing piece of work, and aside from the wiki-like functionality it gives you for very little effort, I can imagine scenarios such as audit and trace logs and "undo" features which could really benefit from this little gem.
Oct 13 2010
Using Rails’ Flash Messages with AJAX Requests
Have you ever wondered how to get access to the Ruby on Rails' flash message when performing a AJAX or restful web request? You might hit yourself on the head when you discover how easy it is. Simply append the flash message to the Response headers. You could even wrap this in a helper, and using an after_filter to automatically add the header for you on every AJAX response.
class ApplicationController < ActionController::Base after_filter :flash_headers def flash_headers # This will discontinue execution if Rails detects that the request is not # from an AJAX request, i.e. the header wont be added for normal requests return unless request.xhr? # Add the appropriate flash messages to the header, add or remove as # needed, but I think you'll get the point response.headers['x-flash'] = flash[:error] unless flash[:error].blank? response.headers['x-flash'] = flash[:notice] unless flash[:notice].blank? response.headers['x-flash'] = flash[:warning] unless flash[:warning].blank? # Stops the flash appearing when you next refresh the page flash.discard end
And then you just read the header with whatever you happen to be reading it with. For completeness sake here is an example of how to read the header in JavaScript using Prototype:
new Ajax.Request('/your/url', { onSuccess: function(response) { var flash = response.getHeader('x-flash); if (flash) alert(flash); } });
Oct 13 2010
Forget the UML Module for NetBeans!
A while ago, I wrote a blog post on how, with considerable effort, you can get a native UML NetBeans module up and running despite the NetBeans UML module being removed from the standard distribution.
I managed to get mine working, but there is a huge cost - Once you close the project (or the IDE) housing the diagram, you can never reopen it. Out of pure determination desperation and perseverance I managed to get the diagram I needed, printed and done; but I can never open it and make adjustments.
Apparently, we're all supposed to use SDE for NetBeans by Visual Paradigm now as the "official" replacement, but I tried it, and it was simply fail. Proprietary and fail.
Fortunately, after taking a punt, I found a UML modelling tool which is not only more functional and better than the NetBean's module was, but looks better too. It even has the ability to create code from class diagrams (which you can obviously just cut and paste into your NetBeans IDE project of choice. Its called ArgoUML.
ArgoUML is the leading open source UML modeling tool and includes support for all standard UML 1.4 diagrams. It runs on any Java platform and is available in ten languages.
I've used it a bit now, and I just love it. I particularly like the way it can make recommendations on how to improve your diagram using its "critics" system.
It's features boast:
- All 9 UML 1.4 Diagrams supported
- Platform Independent: Java 5+
- Click and Go! with Java Web Start
- Standard UML 1.4 Metamodel
- UML Profile support with profiles provided
- XMI Support
- Export Diagrams as GIF, PNG, PS, EPS, PGML and SVG
- Available in ten languages - EN, EN-GB, DE, ES, IT, RU, FR, NB, PT, ZH
- Advanced diagram editing and Zoom
- OCL Support
- Forward Engineering
- Reverse Engineering / Jar/class file Import
- Cognitive Support
- Reflection-in-action
- Design Critics
- Corrective Automations (partially implemented)
- "To Do" List
- User model (partially implemented)
- Opportunistic Design
- "To Do" List
- Checklists
- Comprehension and Problem Solving
- Explorer Perspectives
- Multiple, Overlapping Views
- Reflection-in-action
I haven't yet worked out how to create object instances from my class diagrams yet, so I'm not sure if it just doesn't support this or it's user error, but in every other conceivable way, it seems to be an excellent UML modelling application for virtually every OS you can name.

Sep 30 2010
Ruby Code to Scrape Images from TwitPic URLs
I've been trying to find an easy way to re-grab my TwitPic images back off TwitPic to be re-syndicated on a communal family website I am trying to create. I found a great site which had some Rails code that scraped the image, so I took the code and modified it to make it compatible for pure Ruby (too be honest it didn't need much modifying at all) .
Here’s my modified snippet of code that I’ve been using to grab the image from Twitpic with the Hpricot gem:
require 'rubygems' require 'net/http' require 'hpricot' def rip_twitpic(url) begin code=url.match(/[\w]+$/).to_s unless code.empty? uri=URI.parse(url) resp=Net::HTTP.get_response(uri) html=Hpricot(resp.body) html.at("#photo-display")['src'] end rescue Exception => e puts "Error extracting twitpic: #{e}" url end end
Just as it appears, this method will return the URL of the image embedded on the page that the TwitPic URL points too.
This will form the core part of a little project which will allow you to scrape TwitPic images and send them to a server of your choosing. I'll try to release this ASAP but in the meantime, I thought a few of you might find this useful. I know I do.
Aug 9 2010
Download Microsoft .NET Framework 3.5 SP1 Standalone Full Redistributable Setup Installer
Many applications uses Microsoft .NET Framework 3.5 as development platform, and thus requires .NET Framework to be installed beforehand, else the installation will request to download and install .NET Framework from Internet. On offline system without Internet access or online server with slow downloading speed, the requirement to download setup files through web may hit the wall – a no go.
Microsoft initially just provides a minimal size dotnetfx35setup.exe download which is a bootstrapper that will still need to download more files via Internet. For users who prefer to perform offline installation or install .NET Framework 3.5 SP1 without waiting for download to complete will have to download and save a copy of full complete standalone or redistributable Microsoft .NET Framework 3.5 SP1 setup installer, which is finally published by Microsoft.
Microsoft .NET Framework 3.5 SP1 (Service Pack 1) is a full cumulative update that contains many new features building incrementally upon .NET Framework 2.0, 3.0, 3.5, and includes cumulative servicing updates to the .NET Framework 2.0 and .NET Framework 3.0 subcomponents. See KB951847 for list of changes and fixed issues in the .NET Framework 3.5 Service Pack 1.
Download full package of Microsoft .NET Framework 3.5 SP1: dotnetfx35.exe (231 MB)
For known issues and release notes, refer to Microsoft .NET Framework 3.5 SP1 Readme.


It's no secret that