Friday, August 28, 2020

Homeschooling

Homeschool is possible. There are lots of resources out there. Here are my search keywords:

  • homeschool curriculum
  • catholic homeschool curriculum
  • classical homeschool curriculum

I am no expert on this but I want to share with other parents what I have learned so far.

I have found that offers fall into one of two categories:

Curriculum only. They sell you the curriculum, lesson plans and the material, and that's it. This is a great option because they are made easy to follow and are affordable. They are not schools so there's no way they can be accredited to the best of my knowledge. I have learned that in high school the student can take CLEP tests to earn college credits so the transition to college is possible.

Online school. They also offer online lessons with different degrees of flexibility and support. They also keep your child records and have accreditation from some association which makes the transition to a college with less friction.

I'm trying Seton Home Study School this year. Their information and video on their website convinced me, but this video and the others that come after it made me take the decision.

Here is the list I compiled of curricula and online schools I explored. They are presented in no special order. They all look good to me; it's just that there's always this little thing that make you prefer one over the other, and it is completely a matter of personal taste.

Religious curricula

     The Good and the Beautiful

    Home - Classical Conversations

    Easy Peasy All-in-One Homeschool – A complete, free online Christian homeschool curriculum for your family and mine

    Catholic

        Seton Home Study School - Catholic Homeschooling

        Catholic, Classical, Homeschool — Aquinas Learning

        Angelicum Academy – Celebrating Our 21st Year!

        Mother of Divine Grace School - Curriculum

        St. Thomas Aquinas Academy

        Home - Kolbe Academy

        CHC - Catholic Heritage Curricula

        Veritas Press | Classical Education from a Christian Worldview

Secular curricula

    Robinson Self-Teaching Curriculum – Robinson Curriculum

    RonPaulCurriculum.com

    Thomas Jefferson Education | TJED.org

    Charlotte Mason method homeschool curriculum and helps

    K12: Online Public School Programs | Online Learning Programs

    https://www.teachingtextbooks.com

    Robinson Self-Teaching Curriculum – Robinson Curriculum

    

        

Monday, September 12, 2016

Official binpatches!

The OpenBSD team is working on providing official binary patches!

More than 10 years ago I wrote the original binpatch subsystem that M:Tier (http://mtier.org) adopted and extended.

I'm very happy that it's finally making its way to be officially supported.

Monday, May 06, 2013

puppet-cleaner 0.3.0 released

This release adds a new option for ensuring that resource titles are quoted.

By the way, two transformations are done by default and are not optional: the use of ${} for variable interpolation in strings and the replacement of double with single quotes when possible.

The optional transformations are:
  • alignment of fat arrows (=>)
  • removal of unneeded quotes around boolean literals
  • reordering of ensure attribute to the first position
  • declaration of symbolic links by using ensure => link and target attributes
  • conversion of /* */ style comments to #
  • representation of file modes as a 4 digits string
  • use of quotes around resource titles
  • indentation by n spaces
  • removal of unneeded quotes around variables
  • removal of trailing white space
Installation: sudo gem install puppet-cleaner
Website: https://github.com/santana/puppet-cleaner

Monday, April 29, 2013

puppet 0.2.0 released

It happened that puppet 3 didn't introduced anything that could disturb the monkey patching of the lexer :) just some weird change in the require order of the parser.

puppet 0.2.0 is now available, tested successfully with puppet 3.

Friday, April 26, 2013

puppet 0.1.1 released

puppet-cleaner is a set of tools that helps you keep your manifests compliant with the style guide.

Website:
  https://github.com/santana/puppet-cleaner/

How to install:
  sudo gem install puppet-cleaner

This is a maintenance release that fixes a run-time error. Thanks to github user blindsey to bring it to my attention.

Tuesday, April 16, 2013

puppet-cleaner 0.1.0 released


I'm currently a puppet master for thousands of servers, for which thousands of lines of puppet DSL code have been written, and keep being written every day.

The Challenge


One of the immediate goals was to make those thousands of lines code to comply with the current Puppetlabs' style guide.

For this purpose I wrote a library for applying arbitrary transformations to a puppet DSL code source.

It was very interesting because I learned a lot about how puppet is built while looking for an economic way to do these transformations.

Object orientation and code reuse

Honestly, I considered a combination of sed, awk and perl the first time I tackled this challenge. puppet-lint for example uses regular expressions to tokenize the code and then warns you about violations to the style guide.

I didn't want to reinvent the wheel so I thought of tapping on puppet's lexical analyser to do the job for me.

It wasn't as easy to extend it as I expected it to be for an object oriented piece of software. My approach required some changes to the analyser in order to reuse it that were "impossible" due to some internal design decisions or shortcuts.

I ended up exploiting Ruby's dynamic typing by monkey patching Puppet::Parser::Lexer and finally get the BLANK and RETURN tokens I needed.

The design

The next challenge was to design the library, but hopefully it just presented to me: a production line (stream of tokens) where specialized workers (transformation algorithms) were waiting for the token they know how to work on and transform the set of tokens that matches the pattern they were taught to recognize.

Testing


The final challenge was to test the library output for correctness. The usefulness of puppet-cleaner depended on this. What use is a code cleaner if it modifies the behaviour of the original code?

Then I dug up a serialization method from puppet's source code that would help me prove that two different text files were actually the same puppet DSL code, and put it in puppet-diff and puppet-inspect.

The result


It was fun indeed. Lots of new stuff.

The goal was achieved: thousands of puppet DSL code were made to comply in a matter of minutes (I still had to be very cautious.)

Today I'm uploading the product of this effort to github for anyone to use. It's faster that puppet-lint although  not as complete, but it actually fixes your code, instead of just warning you about it.

Finally, here's an input and output example.

input:


/*
  multiline comment
  trailing white space here ->     
*/

class someclass($version = "5", $platform = "rhel6")
{
if ! ($version in ["4", "5"] or !($platform in ["rhel5", "rhel6"]))  {
     fail("Version $version on $platform is not supported")
}
       else {
    notice("Defining class for version \"$version\" on '$platform'")
  package {
    [
          "package-1",
"package-2",
  ]:
  }

     sysctl2::conf {"${something}":
  settings => [
     "set key1 'value1'",
     "set key2 'value2'",
 ]
  }
   file {
        "/file/a": # test
    source  =>    'puppet:///someclass/file/a',
       owner                  =>   'root',
     ensure               =>   ensure_a,
 group=>         "${group}";
        "/file/b":
    source  =>    'puppet:///someclass/file/b',
 mode=>755,
     ensure               =>   ensure_b,
       owner                  =>   'root',
 group=>         "${group}";
  }

   file {
        "/file/c":
    source  =>    'puppet:///someclass/file/c',
       owner                  =>   'root',
     ensure               =>   ensure_c,
 group=>         "${group}";
        "/file/d":
    source  =>    'puppet:///someclass/file/d',
 mode=>"755",
       owner                  =>   'root',
 group=>         "${group}"
  }
   file {
        "/file/e":
    source  =>    'puppet:///someclass/file/c',
       owner                  =>   'root',
      alias  => ["$hostname"],
 group=>         "${group}",
     ensure               =>   'absent';
        "/file/f":
     ensure               =>   'ensure_f';
  }

  user {
    "jdoe":
   managed_home => "true",
  }
}
}


output: 


#
#   multiline comment
#   trailing white space here ->


class someclass($version = '5', $platform = 'rhel6')
{
  if ! ($version in ['4', '5'] or !($platform in ['rhel5', 'rhel6']))  {
    fail("Version ${version} on ${platform} is not supported")
  }
  else {
    notice("Defining class for version \"${version}\" on '${platform}'")
    package {
      [
        'package-1',
        'package-2',
      ]:
    }

    sysctl2::conf {$something:
      settings => [
        'set key1 \'value1\'',
        'set key2 \'value2\'',
      ]
    }
    file {
      '/file/a':
        ensure => link, # test
        source => 'puppet:///someclass/file/a',
        owner  => 'root',
        target => ensure_a,
        group  => $group;
      '/file/b':
        ensure => link,
        source => 'puppet:///someclass/file/b',
        mode   => '0755',
        target => ensure_b,
        owner  => 'root',
        group  => $group;
    }

    file {
      '/file/c':
        ensure => link,
        source => 'puppet:///someclass/file/c',
        owner  => 'root',
        target => ensure_c,
        group  => $group;
      '/file/d':
        source => 'puppet:///someclass/file/d',
        mode   => '0755',
        owner  => 'root',
        group  => $group
    }
    file {
      '/file/e':
        ensure => 'absent',
        source => 'puppet:///someclass/file/c',
        owner  => 'root',
        alias  => [$hostname],
        group  => $group;
      '/file/f':
        ensure => link,
        target => 'ensure_f';
    }

    user {
      'jdoe':
        managed_home => true,
    }
  }
}

Sunday, April 07, 2013

Stating the obvious

My comments on this post: http://venturebeat.com/2013/04/06/developer-first-security/

Three are the sources for vulnerabilities:

• badly designed protocols
• badly written code
• badly administered systems

Too much focus has been given to the third point: security polocies (PCI DSS), security appliances (firewalls, IDS...), security software layers (SELinux).

However, must of the current security issues have their origin in the other two points.

Security is nothing you can buy or rent. It's as simple as the process of doing our jobs right.

That means quality, not as an added thing, but as a way of living.

This has been known to the OpenBSD Team since 1996, which has been pursuing correctness since then.

This must be obvious in 2013, don't you think?

Tuesday, April 17, 2012

Ruby/Informix 0.8.0 released

The point of this release is to make it compatible with Ruby 1.9.3. It's no longer compatible with Ruby 1.8 which is about to lose support.

Other changes include:

  • the tests now load the extension just built, instead of the one installed
  • adds a gemspec file, that replaces the old Rakefile, to build the gem
  • Rakefile is now used for running the tests, passing the name of the database to test against as a task argument
  • when installing the gem a warning is printed if INFORMIXDIR is not set and exits, instead of trying to guess and failing miserably
You'll need to have the test-unit gem installed in order to run the tests.

Wednesday, May 21, 2008

binpatch 1.1.0 released

binpatch is a ports-like framework for building binary patches for OpenBSD.

Thanks Mike Erdely (merdelly@) for contributing to this release.

Visit http://openbsdbinpatch.sourceforge.net to learn more about binpatch.


Monday, May 12, 2008

activerecord-informix-adapter available for Rails 2.1 RC

Ruby Inside is carrying the news of Rails 1.2 Release Candidate being tagged by David Heinemeier Hansson. Some of the new features are mentioned, along with instructions for getting Rails 1.2 RC.

I'm glad to see that the activerecord-informix-adapter gem was finally built and published in the Ruby on Rails' gems server, as can be seen by running


gem list --source http://gems.rubyonrails.com -r


The gem is listed as activerecord-informix-adapter (1.0.0.9216) and can be installed by running


sudo gem install activerecord-informix-adapter --source http://gems.rubyonrails.com/


Enjoy!

Saturday, April 26, 2008

From CVS to Git

There has been an exodus of Ruby developers recently, moving from Subversion to Git for SCM. Being a happy CVS user, I was curious about what Git could offer for a team of one developer.

After understanding the workflow used by experienced Git users and its benefits, I started to think the other way around: why use CVS when I can use Git.

Then I decided to move binpatch and Ruby/Informix repositories to github.com. Forking, contributing or just tracking the changes is now easier, through an easy to use interface, source code browser with history and RSS feeds.

The following links were especially useful to make the switch:


Binpatch and Ruby/Informix repositories can be found here.

Tuesday, April 01, 2008

Ruby/Informix 0.7.0 released

Yesterday night Ruby/Informix 0.7.0 escaped from my hands, after a vacational sprint that allowed Ruby/Informix to get new and important capabilities. The most obvious one is the support for the INTERVAL data type.

Actually, Ruby/Informix was able to handle insertion of INTERVAL data types already, because Informix accepts an ANSI SQL standard formatted string as an INTERVAL. Today, we can still use a String or use an Interval object for storing and also for retrieving INTERVAL data.

To create an Interval object you can write the following:


Interval = Informix::Interval # for short

ym = Interval.year_to_month(2, 5) #=> "2-05"
ds = Interval.day_to_second(1, 2,
3, 4) #=> "1 02:03:04.00000"


ym is an INTERVAL YEAR TO MONTH, while ds is an INTERVAL DAY TO FRACTION.

You don't need to specify all the fields of an INTERVAL.



# the rest of the fields are zero
Interval.year_to_month(2) #=> "2-00"
Interval.day_to_second(5) #=> "5 00:00:00.00000"

# using a hash
Interval.year_to_month(:months => 3) #=> "0-03"
Interval.day_to_second(:hours => 2,
:minutes => 5) #=> "0 02:05:00.00000"



You can even use fractions of years, days, hours, minutes or seconds:


Interval.year_to_month(1.5) #=> "1-06"
Interval.day_to_second(:hours => 1.5,
:minutes => 5) #=> "0 01:35:00.00000"


You can use Rationals instead of Floats for exactitud:


# a third of an hour?, not quite
Interval.year_to_month(0.3) #=> "0 00:18:00.00000"

# this is exact
Interval.year_to_month(Rational(1,3)) #=> "0 00:20:00.00000"


This is specially important when working with small fractions of seconds:



Interval.day_to_second(:days=>123456789,
:seconds=>1.2) #=> "123456789 00:00:01.19922"
Interval.day_to_second(:days=>123456789,
:seconds=>Rational(12,10)) #=> "123456789 00:00:01.20000"


Because when using Floats, there's a limit in the significant digits that can be stored that doesn't exist when using a Rational.

Interval objects have the ability to work with Date, DateTime and Time Ruby objects:


# YEAR TO MONTH an Date
ym = Interval.year_to_month(1, 5) #=> "1-05"
today = Date.today #=> "2008-04-01"
ym + today #=> "2009-09-01"


# DAY TO SECOND and Time
ds = Interval.day_to_second(:hours=>3,
:minutes=> 10) #=> "0 03:10:00.00000"
now = Time.now #=> "2008-04-01 19:58:04.856533"
ds + now #=> "2008-04-01 23:08:04.856533"


You can't mix INTERVAL YEAR TO MONTH with Time, or INTERVAL DAY TO FRACTION with Date, because are incompatible. If you still want to do something like that, you can use DateTime:



now = DateTime.now #=> "2008-04-01 20:21:42"
ym = Interval.year_to_month(1, 5) #=> "1-05"
ds = Interval.day_to_second(:hours=>3,
:minutes=> 10) #=> "0 03:10:00.00000"

ym + now #=> "2009-09-01 20:21:42"
ds + now #=> "2008-04-01 23:31:42"


But there's still more. What about if I want to know how many minutes are in 3 days and 4 hours?



ds = Interval.day_to_second(:days=> 3,
:hours=> 4) #=> "3 04:00:00.00000"
ds.to_minutes #=> 4560.0


What about seconds



ds.to_seconds #=> 273600




There are some things left to learn about Intervals, but this post has become too long. Don't forget to check the documentation, which has been enriched with more examples.

Thursday, March 27, 2008

Where is the activerecord-informix-adapter gem?

I was waiting for the next release of Ruby on Rails to say this, but it's taking more time than I expected.

Rails/Informix was already imported in the Ruby on Rails SVN repository back on October 14th, 2007, but the activerecord-informix-adapter gem was not available as expected when Ruby on Rails 2.0 was released.

Well, Jeremy Kemper was so kind to tell me on December 27th, 2007, that the activerecord-informix-adapter gem will be available in the next release of Ruby on Rails. It was not available before because it was not connected to the build system. It was already fixed.

Meanwhile, you can take advantage of the Informix adapter now, installing it by hand, following the installation instructions for Rails 1.x, except for the part of editing a file. Just copy the file informix_adapter.rb to the location mentioned, and enjoy!
 

Tuesday, February 12, 2008

ibm_db and Ruby/Informix interface comparison

Antonio Cangiano, a Software Engineer at IBM, recently posted in his blog an Essential guide to the Ruby driver for DB2, which included some samples of IBM's ibm_db Ruby driver. This driver supports not only DB2, but several IBM databases, Informix included.

As Antonio states in his guide, it was not meant to be thorough (that's what the API reference is for), but it certainly helped to get an idea of how ibm_db looks at work.

Antonio explains in a comment that ibm_db's interface was taken from PHP's DB2 driver, and that same interface was used for the IBM's Ruby and Python drivers.

That helps to explain why the code examples don't look Ruby-ish at all.

Here's one of the simplest examples:



require 'rubygems'
require 'ibm_db'

if conn = IBM_DB::connect("sample", "db2inst1", "mypassword")
sql = "SELECT * FROM EMPLOYEE"
begin
if stmt = IBM_DB::exec(conn, sql)
while row = IBM_DB::fetch_assoc(stmt)
puts "#{row['FIRSTNME']} #{row['LASTNAME']}: #{row['EMPNO']}"
end
IBM_DB::free_result(stmt)
else
puts "Statement execution failed: #{IBM_DB::stmt_errormsg}"
end
ensure
IBM_DB::close(conn)
end
else
puts "Connection failed: #{IBM_DB::conn_errormsg}"
end


And here's the equivalent, written with Ruby/Informix:



require 'informix'

Informix.connect("sample", "db2inst1", "mypassword") do |conn|
sql = "SELECT * FROM EMPLOYEE"
conn.cursor(sql) do |cur|
cur.open
cur.each_hash do |row|
puts "#{row['FIRSTNME']} #{row['LASTNAME']}: #{row['EMPNO']}"
end
end
end


The difference is obvious: blocks.

Blocks are one of the nicest features of Ruby. Matz, creator of Ruby, gave an attractive look to an old concept, which made it easy and desirable to use.

You can see blocks everywhere in Ruby as iterations, for resource management, event handling or as high order functions.

Blocks are a distinctive of Ruby. But still no blocks in ibm_db.

Fortunately Informix users have an alternative.




UPDATE: It will be even more succinct using the new features that will be included in the next release but that you can already try grabbing the code from the CVS tree.




require 'informix'

Informix.connect("sample", "db2inst1", "mypassword") do |conn|
sql = "SELECT * FROM EMPLOYEE"
conn.each_hash(sql) do |row|
puts "#{row['FIRSTNME']} #{row['LASTNAME']}: #{row['EMPNO']}"
end
end

Monday, February 11, 2008

Informix on Rails demo at IBM developerWorks

Some weeks ago, Akmal B. Chaudhri, Senior IT Specialist at IBM, completed a set of demos about working with Informix on Windows.

In part 6 of this set you can find an excellent guide, step by step, from scratch, about how to get Ruby on Rails working with Informix, using Ruby/Informix and Rails/Informix.

Thanks to Akmal for posting this demo and for giving (Ruby|Rails)/Informix a try.

Wednesday, December 05, 2007

Informix adapters for ActiveRecord and ruby-sequel

I have updated Rails/Informix to implement DECIMAL support and fix a pair of bugs that prevented the generation of db/schema.rb. I'm happy to say that on its 1.1.0 release, this adapter is mostly complete - indexes is still missing - and robust.

By the way, even though Rails 2.0 is out already, the ActiveRecord's Informix adapter gem was not published. I have tried to bring this issue to Jeremy Kemper's and Ruby on Rails Talk's attention without success yet. So, in the meantime, just donwload and manually install the distribution from Rails/Informix's project site.

Speaking of O/RM adapters, some weeks ago I found another Ruby O/RM called ruby-sequel which looks very nice to me. It has a nice interface that lets you write queries using Ruby and has just implemented an Informix adapter based on Ruby/Informix. You can take a look at some examples here.

Wednesday, January 24, 2007

One year later

Almost a year has passed since my last post and a lot of things have happened.

I didn't quit my job after all and that meant that I could still work on the Ruby extension and the Ruby on Rails adapter for Informix, which have become richer in features and more robust.


Ruby/Informix


Latest Ruby/Informix version is 0.6.2, and has gained the following features:

  • Use of BigDecimal for MONEY/DECIMAL columns
  • Resource management by means of blocks for statements, cursors and connnections
  • Support for SLOB status and storage characteristics information gathering
  • Thread safety
  • A test suite
  • Error, Warning, and AssertionFailure classes that replace RuntimeError when raising exceptions

Along with bug fixes, more documentation and new handy methods.

The last two features were contributed by Edwin Fine. He helped me to put together the resource management too. Thanks Ed.

In addition to the source distribution and the rubygem, a binary gem is provided for Microsoft Windows users.

There are still many things to do, for the sake of completeness. There's no rush to implement them right now, but if you have a especific request, I'd like to know about it.


Rails/Informix

Meanwhile, Rails/Informix reached 1.0.0, enabling migrations.

I'm glad to tell you that it was included in the Ruby on Rails repository and will be available as a rubygem when RoR hits 2.0. But you can use it now with RoR 1.x. Just follow the installation instructions from Rails/Informix's website.

To help you get started with Ruby on Rails and Informix, don't forget to visit the following links:



Have been useful to you?

Finally, I'm not making any money from Ruby/Informix or Rails/Informix, and never intended to do so. If not for them, I would be using Perl or Python at work. But my job wouldn't be as fun as it is right now.

But if any of them has been useful to you - like saving your sanity otherwise lost by using ESQL/C or SQR, or making your work more enjoyable and easier by using Ruby on Rails with your favorite DBMS, instead of, God forbid, Uniface! - and feel like giving something back, please consider making a donation, buying something from my Amazon wishlist, or sending a postcard of your country saying hi!

Sunday, December 17, 2006

Ruby/Informix 0.4.0 released

Ruby/Informix is almost full-featured and closer to 1.0.0. Don't hesitate to e-mail me if you have any suggestion, comment, criticism, feature request, bug report or question.

In this release there are two new major features added: multiple connections to databases and scroll cursors.

The interface to scroll cursors provided by Ruby/Informix resembles that of Array objects for accessing elements. Besides prev, next, first, last and current for traversing a scroll cursor, it counts with [] and slice methods that let you access a scroll cursor as an Array:



customers = db.cursor('select * from customers', :scroll=>true)
customers.open
customers[0] # => same as customers.first
customers[-1] # => same as customers.last
customers[2, 5] # => retrieves 5 records starting from the 3rd record
customers.drop


Just like Ruby Arrays, negative values for indices mean an offset from the end of the Array, being -1 the last element. Similarly, when using the [start, length] syntax, it retrieves an array of at most length elements starting from start. More details in the documentation.

Starting from this release, a Ruby gem will be provided for easily downloading, building and installing Ruby/Informix. Just type



gem install ruby-informix


from a command prompt on any platform supported.

Expect more exciting things to come for Ruby/Informix.



And just after releasing 0.4.0, there are news from IBM for officially supporting Ruby, according to Jerry Keesee, Director of the Informix Lab (read complete note here.) But this support won't be available until mid-2007.

Monday, November 27, 2006

Ruby/Informix 0.3.0 and Rails/Informix 0.1.0 released

Finally, the ActiveRecord adapter for IBM Informix Dynamic Server is ready for its first release. I have tested it succesfully on Solaris 9 and Windows XP with IDS 9.4 and IDS 10.

Eric Herber has been so kind as to cover Ruby/Informix at The Informix Zone as part of a review of database interfaces for popular scripting languages. The Informix Zone is an excellent resource for IBM's Secret Weapon, either if you're a long time Informix user or just curious about the exciting future that IBM is preparing for it.

Guy Bowerman also tested Rails/Informix succesfully and has posted a walkthrough, using Curt Hibb's "Rolling with Ruby on Rails" tutorial, using Informix 10 on Windows 2003. He explains
clearly how to get Ruby on Rails up an running with Informix. Don't forget to come back to Guy's blog for interesting articles about Informix development, among others.

Ruby/Informix 0.3.0 is released and this time includes initial support for Smart Large Objects (SLOB), you can create, read and write them.

Finally, it's sad that after getting the driver and the adapter working fine, it seems that I will be unable to rewrite that legacy, buggy, undocumented and insecure application (SIAPSEP) which started it all. I'm probably quitting my job in one month*.

Anyways, I hope everybody enjoys (Ruby|Rails)/Informix as much as I have. I'll try to keep adding features to them, while I still have access to Informix servers. After that I won't be able to maintain them any more. But the source is open, do whatever you want with them (it's BSD licensed after all!).

* I'll be free for hiring then, here's my résumé if you're interested.

Saturday, November 11, 2006

Ruby/Informix 0.2.1 released

This is a minor release after 0.2.0 that replaces calls to free() with xfree() to avoid crashes on Windows XP SP1.

I missed the announce of Ruby/Informix 0.2.0 which basically got new handy methods to fetch and iterate over records:

fetch_hash_many(n), fetch_hash_all
Fetch records as hashes. fetch_hash_many fetches n records at most, fetch_hash_all fetches all records as hashes. Both return an array.

each_by(n), each_hash_by(n)
Iterate by n records at a time.

fetch!, fetch_hash!, each!, each_hash!
Work the same as their counterparts without the "!" sign, except that these ones reduce the creation of objects, reusing the same ones in each call, which make them faster and memory savy.

I'm looking forward now to implement Smart Large Objects, which may help me with the ActiveRecord adapter.