Great method to_json

A very nice method to convert a Ruby array to Javascript.

print { 'key1' =>  'value1', 'key2' => [ 1,  2, 3 ] }.to_json
outputs:  { key1: 'value1', key1: [ 1, 2, 3 ] }

RSync Hangs when rsyncing via SSH

I've got an automatic backup script that makes a daily copy of my server to an offsite location. I use rsync for this. I've noticed last week that nothing the sync never completed...

Btw. The offsite location (a SuSE Linux 9.3 server) initiates and rsync over SSH with my FreeBSD 6.2 server.

After some debugging I noticed rsync is hanging in the middle of the backup!?
I found several articles on the internet about this problem. But I'm still searching for a solutions for my problem... :(

Well every time it hangs on:

/somepath/wordpress/xmlrpc.php is uptodate

WordPress.. Coincidence?!? ;-)

---

11 august 2007 - Well it was a false alarm. Rsync is just extremely slow... :-(

Prototype automatic Spinner

I found the following code on the internet. By using this code, a spinner is showed automaticly if an Ajax request is running. Very nice!

// registreer een algemene spinner
Ajax.Responders.register({
  onCreate: function() {
  if (Ajax.activeRequestCount > 0)
    Element.show('spinner');
  },
  onComplete: function() {
  if (Ajax.activeRequestCount == 0)
    Element.hide('spinner');
  }
});

Didn't know prototype had this global register method. I should take a better look at the API!

Adding Ansi/Integer Date Support to Javascript

A very common way to store and work with dates is the usages of Integers as dates. In the integer the date is stored as YYYYMMDD. Converting from an between the different date formats is not nice if you are using normal functions. Also the Dutch date end user date format is "dd/mm/YYYY"

Well javascript prototypes to the rescue!
Inspired by the "Prototype Library" and Ruby ( on Rails ), I've managed to add nicer conversion support between different types.

Some examples of usages

20070212.to_date().to_s()  // Results in  12-02-2006
"24-02-2006".to_date()  // Results in a normal date object

var d = Date.create( 20060102 )   // Creates a Date object with the given
d.add( { months: 5, days: 2 } ).to_s() // Results in 04-06-2006

// add custom formatters with
Date.FORMATS[ 'period' ]  = function(d) {  return d.getFullYear() + "-" + d.getMonth(); }
( new Date() ).to_s( "period" )     // Results in  2007-08

var date1 = Date.create( 20070101 )
date1.diff( Date.now(), 'months')    // 8
... etc ...

Adding extra methods to the Date, String and Number objects can be done like this:

// for example the "to_s" method
Date.prototype.to_s = function( format ) {
if( !format ) format = 'default'
if( !Date.FORMATS[ format ] ) throw "Date format niet gevonden!";
return Date.FORMATS[ format ]( this );
}

// method for converting a number to a date
Number.prototype.to_date = function() {
var v = this.valueOf();
if( v == 0 ) return null;
return Date.new( v );
}

Some problems and frustrations I've encountered:

  • Stupid IE, doesn't allow to define setter en getter properties. The ECMA standard defines the following method for defining setters. The code below works in Mozilla Firefox. You can get the 'integer' date by using ( new Date() ).ansidate
    Date.prototype.ansidate getter function() { return this.getFullYear() * 10000 + (this.getMonth()+1) * 100 + this.getDate() } ;
    

    Firefox also supports the following legacy method for defining getters. This support has been there for quite a long time.

    Date.prototype.__defineGetter__( "ansidate", function() { return this.getFullYear() * 10000 + (this.getMonth()+1) * 100 + this.getDate() } )
    
  • null isn't an object so I cannot define a "to_date()" method for this object.

On request I will send you the code of the Date library. Maybe I will release it, but I needs a LOT of refinement!

Rails: unit test fixture_path NameError.

Last day of my Holiday :(
Trying to write a unit test for my Rails application, I constantly got the error message below:


NameError: undefined local variable or method `fixture_path' for #<LessonTest:0x9a611f8>
/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/test_process.rb:452:in `method_missing'
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/fixtures.rb:593:in `load_fixtures'
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/fixtures.rb:538:in `setup_with_fixtures'
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/fixtures.rb:575:in `setup'

Very strange: the Unit Test I've written was generated and exactly the same as shown in the example in the "Agile Web Development with Rails 2nd Edition" book.


require File.dirname(__FILE__) + '/../test_helper'
class LessonTest < Test::Unit::TestCase
def test_truth
assert true
end
end

Well I found a solution, but I still haven't found the reason WHY this is happening. You can see this is as a temporary hack.

In your: "/test/test_helper.rb" add the following method:


def fixture_path
File.dirname(__FILE__) + "/fixtures/"
end