Main

Ruby Archives

December 27, 2011

Ruby processing: making it snow

I re-found a fun holiday project I did a couple years ago making snow with Ruby processing.

snow-processing.jpg

November 16, 2011

ActiveRecord / Rails case insensitive ordering

It is pretty common to want to have the results of a query sorted by order. I wanted the results sorted by name on a user object. Oddly it is hard to find how to make a string based order case insensitive on google. So for other having the same issue, it is simple, just add lower(field) in the order clause and it will sort in a case insensitive manner. Now I don't care when a user doesn't capitalize the first letter of their name.


User.order('lower(name)').all

October 23, 2011

Simplifying new gemset creation for RVM

I found myself annoyed that each time I created a new project I had to go through the same steps to create and setup my gemset. I am also trying to be better about automating things I do over and over. I decided I should put something in my .bash_profile to simplify my frequent task of making a new gemset on a brand new project.

The manual way I ended up creating gemsets in the past, was:
* cd to project_directory
* rvm use ree (my preferred local ruby run time)
* rvm gemset create projectGemSet
* echo 'rvm use ree@projectGemSet' > .rvmrc
* cd ../
* cd project_directiory
* agree to trust the .rvmrc file

That is pretty simple, but gets a bit annoying to do over and over. I figured I could very quickly whip up a solution in my bash profile. Unfortunately, due to my shell scripting skills kind of sucking, I ended up using Ruby.

Basically after adding my new ruby script to my .bash_profile, I can now just type 'init_gemset newgemset', and I will be left in my project using my new gemset. The final script is below.

One thing to note is the time saved with automating a repetitive task vs. time spent to automate it. In the end because of spending a decent amount of time trying to write this as a shell script without using Ruby. I likely spent more time getting this script working, than it will ever save me. It also isn't even fully reusable for other people in it's current state (the .bash_profile function needs a full path to the ruby script in it, and my preferred RVM ruby is hard coded). It could be made more easily reusable / sharable (likely making it a gem, or sending a pull request to RVM itself with this as a feature). Doing this the fully 'right' way would just add more time spent, on something I initially did to save a few moments.

I wanted to get back to what I was originally working on, and I had something that would work for me. So I will leave it here as a simple gist. Working on this also made me think about what is worth spending time automating. In terms of savings this likely wasn't worth much, but there are many times that a repetitive task is really begging for automation.

July 4, 2011

Google Closure Compiler And Ruby

I have repeatedly needed to compress / minify a collection of javascript files. Which I had been doing by hand with Google's closure compiler. I started to get annoyed with this process and went looking for a better solution. If you are using Rails, there is a great solution using Jammit asset packager library for Rails. I was not using rails, and just needed something that could write the files on demand. A bit of quick searching came up withh this post Compressing Javascript Code With Google Closure Compiler And Ruby. It basically met my needs, but needed to be modified a bit to take a collection of files and write that collection of compresses files back to disk.

Here is the solution I ended up with:


October 13, 2010

Fix: Emacs/Aquamacs keeps adding encoding comments to my files

I had a problem, when I had files of weird encodings or unknown encodings emacs would add a stupid comment at the top # -*- coding: " coding-system " -*- where coding-system was the detected encoding, such as # -*- coding: utf-8 -*-

I found this a big problem because it would add it to my erb files, which in turn would actually display the comment on the HTML, because # isn't a valid html comment... Actually that it was trying to comment it was a hint of where this was occurring so I could disable it.

It turns out it was ruby-mode for emacs that was adding this stupid comment 'on my behalf' against my wishes...

So now that I knew what was causing it, it was time to fix the problem.

Just edit the ruby-mode emacs file, force it to recompile and use emacs without it screwing up your files...

On my system the files was here, but it will be in your emacs folder wherever you keep it.
`emacs /Users/danmayer/.emacs.d/elpa/ruby-mode-1.1/ruby-mode.el`

Then comment out this code (note that ;; is a comment for lisp):
;; (defun ruby-mode-set-encoding ()
;; "Insert a magic comment header with the proper encoding if necessary."
;; (save-excursion
;; (widen)
;; (goto-char (point-min))
;; (when (re-search-forward "[^\0-\177]" nil t)
;; (goto-char (point-min))
;; (let ((coding-system
;; (or coding-system-for-write
;; buffer-file-coding-system)))
;; (if coding-system
;; (setq coding-system
;; (or (coding-system-get coding-system 'mime-charset)
;; (coding-system-change-eol-conversion coding-system nil))))
;; (setq coding-system
;; (if coding-system
;; (symbol-name
;; (or (and ruby-use-encoding-map
;; (cdr (assq coding-system ruby-encoding-map)))
;; coding-system))
;; "ascii-8bit"))
;; (if (looking-at "^#![^\n]*ruby") (beginning-of-line 2))
;; (cond ((looking-at "\\s *#.*-\*-\\s *\\(en\\)?coding\\s *:\\s *\\([-a-z0-9_]*\\)\\s *\\(;\\|-\*-\\)")
;; (unless (string= (match-string 2) coding-system)
;; (goto-char (match-beginning 2))
;; (delete-region (point) (match-end 2))
;; (and (looking-at "-\*-")
;; (let ((n (skip-chars-backward " ")))
;; (cond ((= n 0) (insert " ") (backward-char))
;; ((= n -1) (insert " "))
;; ((forward-char)))))
;; (insert coding-system)))
;; ((looking-at "\\s *#.*coding\\s *[:=]"))
;; (t (when ruby-insert-encoding-magic-comment
;; (insert "# -*- coding: " coding-system " -*-\n")))
;; )))))

;; (add-hook
;; (cond ((boundp 'before-save-hook)
;; (make-local-variable 'before-save-hook)
;; 'before-save-hook)
;; ((boundp 'write-contents-functions) 'write-contents-functions)
;; ((boundp 'write-contents-hooks) 'write-contents-hooks))
;; 'ruby-mode-set-encoding)

Finally, delete the compiled file forcing it to recompile the plugin next time emacs is opened... on my system:
`rm /Users/danmayer/.emacs.d/elpa/ruby-mode-1.1/ruby-mode.elc`

That's it, no more encoding comments in your files... The rest of ruby-mode continues to work, and you will have less urges to throw your computer out of the window.

Don't worry, I still like you pretty well emacs, although it seems the whole world is moving to Vim, and if Textmate-2 is ever released, your cryptic ways may come to an end. Yes you can do anything, but I can't make you always do what I want.

August 7, 2010

Force all Sinatra traffic to https

I wanted to have all traffic on a site go through https. Since the site was on heroku. @env['rack.url_scheme'])=='https' wasn't a sufficient way of detecting if on https. You need to also check (@env['HTTP_X_FORWARDED_PROTO']. Below I wrote a simple before filter which you could place in the production configuration. After talking with the author of rack-ssl-enforcer I got that patched to work on heroku as well. So that is an even simpler option.

Anyways, I spent far to long googling sinatra https, sinatra ssl, sinatra over https, sinatra secure, and heroku https, and couldn't find good pages on this for awhile. So here is the info for anyone else wanted to host secure Sinatra pages on heroku.

July 6, 2010

Mobile Development and My Recommendation for PhoneGap

In the last month or so I have been exploring mobile development. I wrote basic native Android and iPhone apps. I also build cross platform apps using Rhodes, Titanium, and PhoneGap. I thought it would be good to share my thoughts and experiences on the mobile dev space.

If you want full control and are doing a lot of local heavy processing (CPU bound) native is the way to go. I program to the web data without access I don't do much interesting. When the whole app basically relies on live data I feel javascript, HTML, and CSS is the way to go. Not only am I already familiar with it, but basically the app can share code with the mobile site. Also, using JS, HTML, and CSS gives the most flexibility in terms of supporting multiple devices. Since I wasn't using anything specific to a single mobile device or really pushing the hardware, I quickly moved away from fully native apps. It wasn't worth the time and extra effort to write nearly the same app in Java, Objective C, and whatever else. Game developers, and those doing a bunch with video, photos, etc are probably most interested in native apps and probably won't be as interested in other options.

This lead me to explore Rhodes, Titanium, and PhoneGap as alternatives to purely native apps. All of which let you leverage HTML and CSS for building a UI.

Rhodes lets you write code in Ruby using a MVC framework. You leverage html (erb/haml) views using a Ruby back end to make remote requests, interact with a DB, and interact with native phone components. It is a cool framework, and obviously since it is Ruby, I enjoyed writing the code. However, it obscured the actual process of making an app for a device a bit much for my comfort. If something went wrong anywhere in the stack or if you wanted to break out of the Rhodes way to do something native on a platform it was difficult to do. It tries to manage the entire app development end to end hiding any per device customizations away from you. Since I wanted to be able to use some existing libraries for Android and iPhones, this limitation was a dealbreaker.

Titanium and PhoneGap use the same basic approach as each other providing a javascript library, which interfaces with native code for each device. You write an app in JS/HTML/CSS and make calls to the JS library to interact with native elements like the accelerometer, GPS, buttons, etc. I think it's a big win to be able to write most of the app in familiar web languages basically utilizing Ajax and local storage to give a nice mobile experience. Getting up and running on either Titanium or PhoneGap was painless. Again, in the end I wanted more control over some native components which caused me to choose PhoneGap over Titanium. While the concept is the same for both of these products, their approach is very different.

Titanium is a bit more all or nothing of an approach, you develop in Titanium's little world and it is best to not go out of
it. PhoneGap takes a extremely lightweight and minimalist approach to getting your project running on each device. It gives you basically the bare necessities and gets out of your way. PhoneGap doesn't try to configure the build environment and it doesn't manage simulators. To create a app with PhoneGap for any mobile platform you point to the same web directory (HTML, CSS, JS, and images), then generate a native app for the device. At that point you have the same native app project you would have if you were to start from scratch but you have a few nice libraries and code started for you. If you don't like the way PhoneGap does something, that is fine delete it, override it, extend it. You need to do something native PhoneGap doesn't support add your own JS handlers and interact with new or existing native code. I needed to allow for FaceBook connect login on Android, which PhoneGap doesn't support no problem. FaceBook maintains a Android SDK, which I imported into my PhoneGap project and added JS handlers which call to the FaceBook Android native code. There is a bug in Androids SSL cert verification for WebKit that was causing errors for HTTPS access, drop into java override the SSL Cert verification and fixed that. This would be difficult to do with Rhodes or Titanium because they don't allow you easily write and interact with your own native code. The project has to work only through the API provided to you to stay cross compatible. Which is great in some ways, but very limiting if you want to break out and just tweak a few little things.

I have been extremely happy working with PhoneGap, it rocks. It lets you build a native mobile app as a locally cached and privileged mobile website. You can leverage existing mobile site code for the native app. It will still be better than a pure website experience. It lets you piggyback on skill web developers already have. It is a great way to make use of HTML5 local DBs, local data, and HTML templates. It encourages you follow best practices for building a mobile site that works offline and requests only minimal JSON so it can fast over slow internet.

Before building an app with PhoneGap I recommend building a mobile site. Learn about best practices for the mobile web. If you are new to developing sites for mobile, I highly recommend following the recommendations from Yehuda Katz on building great mobile sites. He discusses some things specific to Rails 3, but mostly just good JS practices.

In many ways when building a PhoneGap app you are just building a mobile website. You have access to utilizing some native things that you can't with pure HTML/CSS. Local storage is a good example, it is supported by HTML5, but the earlier Android webkit didn't support it. Using PhoneGap you have local storage on old devices and it can use standard HTML5 local storage on newer devices.

Last but not least, PhoneGap has a great active community. Drop into #phonegap on freenode and people are always around to help out. The mailing list has a constant flow of questions and answers. While PhoneGap docs are a little out of date, there are people actively working on improving them. There are many example applications and open code on github to check out how to use PhoneGap. Also, the code is small and simple enough it is a great project to get involved in and give back. After working with it awhile, you will start to understand the internals and could help contribute patches, features, and plugins to the community.

July 3, 2010

The Ruby-fitbit API has been updated

More about it can be found on here, Ruby-fitbit api on github. Also, the original announcement can be found on my blog.

Basically there is now detailed access to any of the data types for any given day. This can be used to backup your fitbit or gather the data for your own charting purposes. Which I will likely start taking advantage of soon for my fitbit blog widget.

Example:

~/projects/ruby-fitbit(master) > ruby bin/ruby-fitbit MYEMAIL MYPASS steps 06/22/2010
Calories Burned 1012
Steps Taken 0
Milkes Walked .00
Activity Levels Durations:
Sedentary 16hrs 7min
Lightly 0min
Fairly # => {fitbit.fairly_active}
Very 0min
steps data for data Tue Jun 22 00:00:00 -0400 2010
+--------------------------------+-------+
| 0 | 1 |
+--------------------------------+-------+
| Tue Jun 22 21:50:00 -0400 2010 | 91.0 |
| Tue Jun 22 05:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:55:00 -0400 2010 | 69.0 |
| Tue Jun 22 14:20:00 -0400 2010 | 15.0 |
| Tue Jun 22 08:45:00 -0400 2010 | 1.0 |
| Tue Jun 22 03:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:40:00 -0400 2010 | 11.0 |
| Tue Jun 22 10:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:45:00 -0400 2010 | 543.0 |
| Tue Jun 22 14:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:35:00 -0400 2010 | 347.0 |
| Tue Jun 22 03:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:30:00 -0400 2010 | 25.0 |
| Tue Jun 22 10:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:35:00 -0400 2010 | 19.0 |
| Tue Jun 22 14:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:20:00 -0400 2010 | 23.0 |
| Tue Jun 22 15:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:25:00 -0400 2010 | 535.0 |
| Tue Jun 22 02:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:15:00 -0400 2010 | 595.0 |
| Tue Jun 22 08:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:05:00 -0400 2010 | 425.0 |
| Tue Jun 22 13:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:10:00 -0400 2010 | 22.0 |
| Tue Jun 22 11:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:55:00 -0400 2010 | 62.0 |
| Tue Jun 22 13:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:00:00 -0400 2010 | 35.0 |
| Tue Jun 22 11:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:00:00 -0400 2010 | 91.0 |
| Tue Jun 22 22:15:00 -0400 2010 | 445.0 |
| Tue Jun 22 16:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:35:00 -0400 2010 | 0.0 |
| Wed Jun 23 00:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:05:00 -0400 2010 | 80.0 |
| Tue Jun 22 16:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:00:00 -0400 2010 | 370.0 |
| Tue Jun 22 23:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:55:00 -0400 2010 | 69.0 |
| Tue Jun 22 16:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:50:00 -0400 2010 | 13.0 |
| Tue Jun 22 03:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:45:00 -0400 2010 | 17.0 |
| Tue Jun 22 05:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:50:00 -0400 2010 | 155.0 |
| Tue Jun 22 14:15:00 -0400 2010 | 40.0 |
| Tue Jun 22 08:40:00 -0400 2010 | 203.0 |
| Tue Jun 22 03:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:35:00 -0400 2010 | 53.0 |
| Tue Jun 22 10:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:40:00 -0400 2010 | 438.0 |
| Tue Jun 22 14:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:30:00 -0400 2010 | 12.0 |
| Tue Jun 22 02:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:25:00 -0400 2010 | 32.0 |
| Tue Jun 22 15:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:30:00 -0400 2010 | 499.0 |
| Tue Jun 22 02:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:15:00 -0400 2010 | 67.0 |
| Tue Jun 22 15:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:20:00 -0400 2010 | 604.0 |
| Tue Jun 22 08:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 23:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:50:00 -0400 2010 | 10.0 |
| Tue Jun 22 06:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 21:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:10:00 -0400 2010 | 291.0 |
| Tue Jun 22 13:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 06:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 19:00:00 -0400 2010 | 161.0 |
| Tue Jun 22 13:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 17:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 04:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 15:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 02:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:55:00 -0400 2010 | 37.0 |
| Tue Jun 22 11:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:35:00 -0400 2010 | 26.0 |
| Tue Jun 22 15:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 13:05:00 -0400 2010 | 75.0 |
| Tue Jun 22 07:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:20:00 -0400 2010 | 22.0 |
| Tue Jun 22 11:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 00:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:10:00 -0400 2010 | 268.0 |
| Tue Jun 22 16:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 11:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:30:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:40:00 -0400 2010 | 0.0 |
| Tue Jun 22 09:05:00 -0400 2010 | 74.0 |
| Tue Jun 22 23:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 22:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 16:25:00 -0400 2010 | 0.0 |
| Tue Jun 22 10:50:00 -0400 2010 | 0.0 |
| Tue Jun 22 05:15:00 -0400 2010 | 0.0 |
| Tue Jun 22 20:05:00 -0400 2010 | 0.0 |
| Tue Jun 22 08:55:00 -0400 2010 | 0.0 |
| Tue Jun 22 03:20:00 -0400 2010 | 0.0 |
| Tue Jun 22 14:30:00 -0400 2010 | 16.0 |
| Tue Jun 22 23:45:00 -0400 2010 | 0.0 |
| Tue Jun 22 18:10:00 -0400 2010 | 0.0 |
| Tue Jun 22 12:35:00 -0400 2010 | 0.0 |
| Tue Jun 22 07:00:00 -0400 2010 | 0.0 |
| Tue Jun 22 01:25:00 -0400 2010 | 0.0 |
+--------------------------------+-------+
289 rows in set
done

June 12, 2010

Ruby Dev Available for Contracting

Avdi a ex-Devver, developer, has just announced that ShipRise LLC is open for business. He is looking to do freelancing/contracting for Ruby and other hard development problems. I can attest to Avdi's skill in breaking down hard problems (like distributed test running) into elegant simple solutions. If you are looking for a great dev to work with you on a project, ping him.

Besides Ruby and general coding, Avdi is ready to help with "Dispersed team facilitation", which he has long term experience with. If you have a small distributed team of developers, he can help get everyone on the right path to work together, while being apart. He is gather a ton of information to help remote workers at his new blog Wide Teams.

May 26, 2010

Ruby Fitbit API

Fitbit has been slow to release an official API, so I started work on a screen scraping version. It will become a nice gem interface to the real API when it is released. It is pretty limited at the moment, only able to pull the most basic current days info.

You can check it out here ruby-fitbit on github.

Example output

~/projects/ruby-fitbit(master) > ruby bin/ruby-fitbit my@email.com MYPASS
Calories Burned 834
Steps Taken 552
Milkes Walked .23
Activity Levels Durations:
Sedentary 11hrs 28min
Lightly 19min
Fairly 16min
Very 0min

done

I also connected a quick sinatra app on Heroku to it so that I could embed the data in my personal blog as a widget. I will clean that up and release the code for it soon. Here is the widget at the moment. I need to add good CSS that is customizable by the user. It would also be good to make it easy for others to host their own widgets opposed to just my own data.

Reblog this post [with Zemanta]

May 23, 2010

Converting Movable Type to Tumblr

Continuing my work on converting this blog to be a dev blog, I moved over all non development and computer related posts to my personal blog. I just converted about 1,000 posts and 3,000 comments from MovableType to Tumblr and Disqus.

I decided I would host my personal blog on Tumblr, which has been interesting so far. Sucking the old posts and comments out of MovableType and pushing them to Tumblr wasn't as easy as I had hoped. Although it gave me a chance to enjoy on of my favorite parts of being a developer. If something doesn't exist and I want it, I can built it. So I set off to write a script that would take a Movable Type blog export and import all of the posts into Tumblr and push all of the comments to Disqus. While it wasn't the easiest thing to do, it wasn't that difficult either. I have slowly built up a collection of various utilities to help port from Movable Type to Wordpress, or from wordpress.org to wordpress.com. Things that help clean up formatting or remove javascript and replace it with something allowed on wordpress.org. I added my conversion script to the inconveniently named MT_WP_Converter git repo.

View MovableType to Tumblr Converter Script

Quick Gotchas:
* There are lots of older or bad example code on how to use the disqus API out there, I had a problem posting comments because all of the POST endpoints must end with a '/', which I didn't know. This forum post helped me fix an issue posting to disqus with rest client.
* Remember to turn off the facebook publishing for tumblr, before doing the import or testing it. I didn't remember this and published the same test post on facebook about 40 times. Oops!

May 14, 2010

Improving my Emacs Configurations

I have been using Emacs as my default editor for awhile now. My emacs setup was a hodge podge of various plugins, code from friends, blogs, etc... It wasn't organized and was hard to maintain and fine tune. I decided it was time to get my emacs config under control, and under git so it was portable and easy to revert update etc.

I looked at a couple options for existing Emacs configuration setups for Ruby.

Emacs Starter Kit
Topfunky's Emacs Starter Kit
Aquamacs Starter Kit

In the end I ended up going with Aquamacs Starter Kit, namely because I have been a fan of Aquamacs for awhile, and already new my way around it's system pretty well. The original Starter kit, from Technomancy, doesn't play nicely with Aquamacs and leads to some issues. Some people have forks that are supposed to work better with Aquamacs, but it seems the kit built from the ground up for Aquamacs works best. Topfunky's project is based on the original emacs starter kit, but has been customized to work well with Carbon Emacs, which is more cross compatible than Aquamacs, so your emacs config is more likely to be portable to all unix systems as well as OS X with Carbon emacs. This looks like a really interesting option, but I decided I liked some of the nice extra sugar that Aquamacs provides.

First install Aquamacs starter kit

There were a few things that I couldn't stand from the defaults in the Aquamacs Starter Kit and removed also some modifications that I added.

Disabling/Removing some Starter Kit features

You likely installed your starter kit to a location like, '/Users/danmayer/Library/Preferences/Aquamacs Emacs/aquamacs-emacs-starter-kit', go there to find the files for modification.

Disabling the emacs Twitter client, sorry I like my twitter to be entirely separate from my dev environment.
Then edit 'init.el':

;;(autoload 'twitter-get-friends-timeline "twitter" nil t)
;;(autoload 'twitter-status-edit "twitter" nil t)
;;(global-set-key "\C-xt" 'twitter-get-friends-timeline)
;;(add-hook 'twitter-status-edit-mode-hook 'longlines-mode)


Disable Ruby-electric, which tries to complete various matched chars and statements as you type like ', {}. (), begin/end, if/end, etc... It drives me nuts and breaks my thought process. Edit 'misc-mode-tweaks.el':

;;(require 'ruby-electric)
;;(add-hook 'ruby-mode-hook
;; (lambda nil
;; (require 'ruby-electric)
;; (ruby-electric-mode)
;; (flymake-mode-on)))

Additions to Starter Kit

I saw a Emacs package to add flog score inline to ruby method scores and thought that sounded like a great addition to help keep my methods concise, so I added that, to my .emacs:


;; ruby-complexity flog scores for methods http://github.com/topfunky/emacs-starter-kit/tree/master/vendor/ruby-complexity/
(add-to-list 'load-path "~/.emacs.d/vendor/ruby-complexity/")

(require 'linum)
(require 'ruby-complexity)
(add-hook 'ruby-mode-hook
(function (lambda ()
(flymake-mode)
(linum-mode)
(ruby-complexity-mode))))

I also liked some of the options from defunkt's Textmate minor mode. First 'cd ~/.emacs.d/vendor; git clone git://github.com/defunkt/textmate.el.git' Again added to my .emacs file:


;; textmate bindings for some nicer key combos for common actions
(add-to-list 'load-path "~/.emacs.d/vendor/textmate.el")
(require 'textmate)
(textmate-mode)

I am just starting to get going with improving my Emacs setup, so I am sure I will likely be making additional changes. The current changes above are checked into my fork of the project, feel free to pull the above changes if you'd like. If you have any great Emacs tips, tricks, or plugins I should add let me know as I am sure it can just keep getting better, but I am pretty happy for now.

Reblog this post [with Zemanta]

May 10, 2010

Introducing Ruby Resume, a project to create and host your resume

The Ruby Resume project, is a project I started to make it easier for Ruby developers to create, host, share their resume, and keep it up to date. It is an open source project, that anyone can use to help manage their resume online. It offers a variety of options and you can take or leave any part you wish. Basically, you fork the project, alter some things for your needs, and can contribute interesting additions back to the shared Ruby Resume project.

The project uses Sinatra, Markdown, and a collection of Rake tasks to get the job done.

What does the Ruby Resume project do?


  • Supports deploying your resume to Heroku in a variety of formats.

  • Easily deploy your app to any Sinatra compatible host

  • Allows simple publishing of your resume to your github personal page.

  • It makes it simple to publish your resume as a gem. I got the idea for a personal resume gem from Eric Davis.

  • It uses Markdown, which integrates well with Github Jobs

  • It currently suppots HTML, LaTeX, and Markdown. Soon it will support PDF, RTF, etc...

I built this because I had to publish and start updating my resume again after not dealing with it for 3 years. I wanted something that would simplify the whole process. I wanted my resume under git, and I wanted to be able to quickly deploy any changes online and support a large number of formats.

Anyways check out the source on Github and the Readme which gives simple instructions on how to use the project. Or what the video below which demonstrates how to use this project for your own resume.

Live Examples:

Ruby Resume Project from dan mayer on Vimeo.

Reblog this post [with Zemanta]

Web 2.0 craziness

View Dan Mayer's profile on LinkedIn


I Power Seekler
I Power Seekler

www.flickr.com
This is a Flickr badge showing public photos and videos from mayer_dan. Make your own badge here.

Creative Commons License
This weblog is licensed under a Creative Commons License.