PullMonkey Blog

26 Apr

Headers and Footers in ruby’s Spreadsheet gem


Have you ever needed to add a header or footer to your spreadsheets in ruby?
Yah, well, we have :(
Yes, you can do this with the Write Excel gem.
But we've already written years worth of spreadsheet code with the spreadsheet gem and don't want to rewrite it all.

Anyway, we thought we'd share our little trick to get page headers using the spreadsheet gem.

So what you see here (above) goes into a config/initializer, something like RAILS_ROOT/config/initializer/enable_headers_in_spreadsheet_gem.rb. Here's what's going on:

1) We know that the write_from_scratch method is called when everything is said and done and the data is ready to be written to the spreadsheet file. So we make use of this and alias that method to write_from_scratch_without_header. Which opens us up to call our write_header method inside our write_from_scratch method which, of course, will call the original write_from_scratch method.

2) Our write_header method makes use of the already existing opcode for Header in the spreadsheet gem. It's not being used, so my guess is the developers intend on solving this issue at some point. We have to send the opcode, the length info and the string we want to write out. This was the trickiest part to figure out.

3) We expose an add_header method that simply takes a string and stores it in the header accessor. This means, to set the header, you simply say sheet.add_header("foo header").

To implement the footer, you'd just do the same thing, create a footer accessor, add a method to update it. Then build the writer_footer method with opcode(:footer) and append write_footer at the end of write_from_scratch.

Well, that took us some time to figure out, so enjoy and let me know if you have any questions.


10 Mar

Ruby’s stacked conditionals - who knew?


puts "hello readers" if you_are_a_reader if you_can_read unless you_already_read_it

I was playing around with some project euler code I'm working on (anyone else figure out the Pencils of Rays with code that executes in less than a minute??). Anyway - I was going through my code and adding "if debug" to the end of all my puts statements b/c I didn't want to see them for the next run through. So by mistake, I blindly added "if debug" at the end of 'puts "odd" if odd', giving me 'puts "odd" if odd if debug'. Neat. Then, going through trying to find the bottlenecks, I noticed it. So jumped into irb to make sure it was legit and it was.

Interesting. Not sure where I'd ever use it, though.


17 Nov

Formgen 0.3.0 and some generated examples


Formgen generates views in erb and haml based on these keywords: has_many, belongs_to, accepts_nested_attributes_for, and has_attached_file. It follows best practice and standard patterns so you don't have to. Here is example of its usage:

Doing this

rails generate skizmo:form Foo

Generates this

app/helpers/foo_setup_helper.rb

app/views/foos/new.html.erb

app/views/foos/edit.html.erb

app/views/foos/_form.html.erb

app/views/foos/_bar_fields.html.erb

app/views/foos/_baz_fields.html.erb



That's it:

Ok, so I say that, but there are a few things to note. First, this probably only works with Rails 3, given some of the calls I make for figuring things out. Next, you'll want to yield :head, somewhere in your layout so that the content_for :head that loads the add and remove jQuery will be useful. Finally, you should note that the nested attributes are only processed from the first level, but that will soon change. Anyway, enjoy it and if you have any problems, just let me know.


No Response Filed under: Uncategorized
16 Nov

Form Gen - ruby on rails gem


I've always dreaded doing the view code for nested attributes, setting up the helpers, the javascript, partials etc. Just so tedious, so I thought, I'd try my hand at a form generator. This generator takes a class and then processes all the nested attributes of that class's has_many's and belongs_to's to generate the typical pattern of form partial and field partials you find here.

Yah I did ruby syntax-highlighting ... so not the best for something like that, but eh ... it'll do.

The formgen gem is a 0.1.0 starting point, but has worked for all the things I've needed. If you're feeling brave give it a shot:

# In your Gemfile -
gem 'formgen'
# then from your rails projects -
rails g skizmo:form SomeClass

That outta do it.


No Response Filed under: Uncategorized
15 Nov

Azilink is working again !


If the apk is not available for download yet, you can build it yourself with the fix from here.

Step 1 - Grab the source from svn -

svn checkout http://azilink.googlecode.com/svn/trunk/ azilink-read-only

Step 2 - Update the UdpDriver.java per this azilink issue.

Step 3 - Build and install the apk

# this will give you a build.xml file
android update project --target 2 --path /path/to/your/azilinkdownload/
# after plugging in your device and from your azilink project directory
ant debug install

Step 4 - Install Open VPN

sudo apt-get install openvpn

Step 5 - Grab the azilnk.ovpn file from the downloads section.
Place somewhere you won't lose it.

Step 6 - Copy this resolv.azilink file to the same place as the azilink.ovpn

Step 7 - Copy this azilink script to somewhere you can get to it

Step 8 - Start azilink on your phone.

Step 9 - Run the script from step 7.


That's it.


13 Nov

Hello Android - Pindah (with Mirah) Application


Did you install the Android SDK / JDK, etc?  If not, start here - http://developer.android.com/sdk/index.html.
If you're running 64-bit like me, make sure to install the ia32-libs, since the SDK is 32-bit.


This is completely based on the Hello Android tutorial - I didn't really do a whole lot, but the hope is that this will help get some more ruby devs into android development with a simple how-to.

Step 1 - Setup RVM with jruby


Note: RVM is awesome, if you don't use it or don't know about it - read more here.


rvm install jruby
cd /path/to/your/android/pindah/mirah/project/dir/
# using your .rvmrc will trigger `rvm use jruby` when you cd into your project dir.
echo "rvm use jruby" > .rvmrc
# this will make sure your .rvmrc is working, you should then be able
# to use rvm info and see jruby
cd .


Step 2 - Install the mirah and pindah gems


# too easy
gem install mirah pindah


Step 3 - Create your first pindah app


pindah create com.example.android.hello_world
cd hello_world


Step 4 - Create your activity - HelloAndroid.mirah


# from your project dir and inside your pindah app dir
<editor> src/com/example/android/hello_world/HelloWorld.mirah

This is the code I used:


Step 5 - Setup your AndroidManifest.xml file


This is where you define your app, version, name, etc, but more importantly for this example - what activity will handle your main intent.
Mine looks like this:


Step 6 - Install to your device


# make sure a device is recognized  ...
# and make sure adb is in your path (platform-tools in the SDK)
adb devices
rake install




10 Nov

Playing with Mirah


Mirah (formally duby) is pretty freaking cool.   Plans are to scrap java and use mirah for future android development, we'll see.  Here's a rough example of some pretty basic mirah.

To get started, you'll need jruby and the mirah gem:

rvm install jruby
rvm use jruby (or put in your .rvmrc)
gem install mirah


Then create an example:

puts "hello world!!"
500.times do |x|
  puts x
end


Time in ruby:

time ruby test.mirah

...
=> .457s

Compile to Java and time:

mirahc test.mirah
time java Test

....
=> .081s

Less than 1/5 the time and it compiles to Java ... neat :)

mirahc -j test.mirah

// Generated from test.mirah
public class Test extends java.lang.Object {
  public static void main(java.lang.String[] argv) {
    int __xform_tmp_1 = 0;
    int __xform_tmp_2 = 0;
    int x = 0;
    java.io.PrintStream temp$1 = java.lang.System.out;
    temp$1.println("hello world");
    __xform_tmp_1 = 0;
    __xform_tmp_2 = 500;
    label2:
    while ((__xform_tmp_1 < __xform_tmp_2)) {
      x = __xform_tmp_1;
      label3:
       {
        java.io.PrintStream temp$4 = java.lang.System.out;
        temp$4.println(x);
      }
      __xform_tmp_1 = (__xform_tmp_1 + 1);
    }
  }
}


09 Nov

Using ruby to consolidate a list of numbers by shortening with hyphens


Check it out -


No Response Filed under: development, ruby Tags: , ,
28 Oct

VIN API - ignore checksum validation


It's been mentioned a few times that there should be a way to skip the checksum validation. This means if the check digit calculation generally fails, VIN API will continue to process the VIN to see if there is a "like" VIN match. So here it is:


19 May

Ubuntu - The disk drive for X is not ready yet or not present


After an Ubuntu install go wrong my laptop started coming up with this error message:

The disk drive for X is not ready yet or not present

In my case, the laptop was having trouble with /dev/sda1, my root partition.

The Solution:

The error message above is met with two solutions, press S to skip or M to do a manual install. Press "M" for manual install.
Once you are the command prompt, your drive will have been mounted as read-only, change that like this:

mount /dev/sda1 -o rw,remount

Now that the drive is in read-write again (test with a simple touch /tmp/test), continue the installation with this:

dpkg --configure -a