Sunday, May 18, 2008

"Skinny Controller, Fat Model" best practice

My first impression about reading about it ("Skinny Controller, Fat Model") was that it is a basic of Object-Oriented Programming. If you are familiar with Object-Oriented Programming practices such as small method, refactoring, Design Patterns, your code naturally becomes what this article is proposing. Especially, my impression is that if you are doing Test/Behaviour-Driven Development, it is even difficult NOT to become as proposed.

What I liked about "Skinny Controller, Fat Model" is that it is explaining the best practice from the different perspective and with the simpler expression. You can reach the same code either following the basic Object-Oriented Programming practices or following "Skinny Controller, Fat Model".

Ultrasphinx setup part2

Regarding what I wrote about test database in section "4. Build index" in my previous post "Ultrasphinx setup", RSpec code would become like below.

I put this under spec/models accessing database. But for controller spec under spec/controllers, I mocked Ultrasphinx::Search so that the controller spec is not accessing database.

(Note: The line with "system(..)" is one line.
It is shown to be multiple lines because of the space.)

require File.dirname(__FILE__) + '/../spec_helper'

describe "Ultrasphinx sample" do
fixtures :overviews

before(:each) do
system("cd #{RAILS_ROOT};
rake ultrasphinx:index RAILS_ENV=\"test\"")
system("cd #{RAILS_ROOT};
rake ultrasphinx:daemon:start RAILS_ENV=\"test\"
&> /dev/null")
end

after(:each) do
system("cd #{RAILS_ROOT};
rake ultrasphinx:daemon:stop RAILS_ENV=\"test\"
&> /dev/null")
end

it "should find text with 'test'" do

@search = Ultrasphinx::Search.new(:query => "test")
@search.run

@search.results.size.should == 2

end

end

Thursday, May 15, 2008

Ultrasphinx setup

It was more straightforward to figure it out than other things I have done in the past. But I just write the whole thing I did to set up Ultrasphinx.

1. Sphinx installation

$ wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz

$ tar xvfzp sphinx-0.9.8-rc2.tar.gz

$ cd sphinx-0.9.8-rc2/

$ ./configure --prefix=/usr/local

$ make

$ sudo make install

2. Install Chronic
(Chronic is a natural language date/time parser written
in pure Ruby.)

$ sudo gem install chronic

3. Install Ultrasphinx plugin

$ cd RAILS_ROOT

$ svn export svn://rubyforge.org/var/svn/fauna/ultrasphinx
/trunk/vendor/plugins/ultrasphinx
(if GIT or other version control system is used.)

(Or if Subversion is used,
$ script/plugin install -x svn://rubyforge.org/var/svn/fauna/ultrasphinx
/trunk/vendor/plugins/ultrasphinx)

$ cp RAILS_ROOT/examples/default.base RAILS_ROOT/config/ultrasphinx/

Add is_indexed to the model: e.g.

class Overview
is_indexed :fields => [ 'title', 'description' ]
end
4. Build index

$ rake ultrasphinx:configure <= Generates development.conf

($ rake ultrasphinx:configure RAILS_ENV="test" <= Generates test.conf)

$ sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql
(Because "rake ultrasphinx:index" has an incorrect path "/usr/local/mysql/lib/mysql".
Otherwise, "rake ultrasphinx:index" fails.)

$ rake ultrasphinx:index <= For development database

($ rake ultrasphinx:index RAILS_ENV="test" <= For test database)
(Of course, in the Test::Unit or RSpec, test database is cleaned up every time so this has to be put inside Test or Spec.
i.e.
system("cd #{RAILS_ROOT}; rake ultrasphinx:index RAILS_ENV=\"test\"") )

5. Start/Stop daemon

$ rake ultrasphinx:daemon:start <= For development database

($ rake ultrasphinx:daemon:start RAILS_ENV="test" <= For test database)

- How to stop Ultrasphinx

$ rake ultrasphinx:daemon:stop

Saturday, May 03, 2008

GIT

I have started using GIT recently. I like it very much.
In fact, within a day of starting using it, I switched all the current projects to it.

Friday, April 18, 2008

Tuesday, April 15, 2008

Nginx and Ruby on Rails ssl_requirement

ssl_requirement plugin was causing infinitive loop.
It was because request.ssl? was always returning false in ensure_proper_protocol method inside SslRequirement.
Actually, request.ssl? method is checking the value of X-FORWARDED_PROTO.

So it turned out that you have to set X-FORWARDED_PROTO in Nginx's configuation file.
i.e.
server {
location / {
proxy_set_header X-FORWARDED_PROTO https;
}
}

Thursday, April 10, 2008

Growth hormone release in pulsatile pattern

I've just learned that the effect of growth hormone is bigger with the existence of the periods when it is not released. In that case the hormone release has a pattern of pulse.

Also I learned that it is more intertwined with other hormones than I had known before. But it makes sense.

Human body or any mammal's body is amazing in how it's functioning. On the way back home, I was looking at other people on the bus and thought that at each moment, inside their body, hormones and other chemicals are highly balanced. Of course, it has been one of the reasons why I respect each individual human and creature. I was reminded of that feeling strongly again today. I just wish all the individuals can achieve the best they can achieve.

Sunday, March 30, 2008

Great Team Basketball

In NCAA Men's basketball tournament, Davidson University played great team basketball games. I just loved the way they played basketball.

Wednesday, March 26, 2008

Healthy snowboarding brand

After an "Event to build entrepreneurial software in 48 hours over a weekend", I got into a mindset to come up with a new brand a little bit.

That led me to come up with a way of snowboarding in a healthy athletic way.

Often times, many snowboarders are rude and aggressive and do stuff like smoking and drinking excessively.

But if you take snowboarding itself, it's a good sport requires whole body muscles. It has variety of movements - free riding, free styling in snow park, etc. It's challenging, which gives you positive attitude overcoming fear. It's outdoor, often breathing fresh air in the mountains. And on the top of the ski hills, you can see magnificent views, which refreshes your mind.

So I would package all these good features together and brand it as a healthy snowboarding. The image of that brand is like working out in the gym. You eat well with nutritious food and in the daily life, work out and tone up the muscles, in order to give you the best snowboarding performance. A friendly attitude toward other people has the high value. And you progressively improve various snowboarding skills, including free style moves.

Possibility of hydrogen production for hydrogen vehicle

After I wrote a blog entry, "Wind-powered generator on the top of the ski hills - Éoliennes sur le sommet des centres de ski", I was reminded that I live in a place with abundant electricity by hydroelectric energy production.

Then I thought of hydrogen vehicles. As far as I remember Iceland is the only country that can produce hydrogen from water by electrolysis using clean natural energy source, enough to support almost all the vehicles in the country. Maybe we can be next. With the combination with the electricity by wind-powered generator, maybe we have enough electricity needed to produce hydrogen.

Thursday, March 20, 2008

REST for various scenarios

The purpose of the article is different but I read it in such a way to learn more about REST.

"Addressing Doubts about REST"

Also the comments are interesting.
And one of them "Resource transformations" is what I'm concerned with most now.

Wednesday, March 05, 2008

How to set up to access LDAP from Ruby on Rails

Note: This is for Mac OS X 10.5 Leopard. For other system, change the directory path appropriately.

1. Install OpenLDAP.

1-1. Install Berkeley DB.
(OpenLDAP requires this.)

1-1-1. Download the source. db-4.5.20.tar.gz
(OpenLDAP only works with the version up to 4.5.
Don't download 4.6.)
("Berkeley DB 4.5.20.tar.gz, with AES encryption(8.9M)"
in
http://www.oracle.com/technology/software
/products/berkeley-db/db/index.html)

1-1-2. Unpack the tar.gz file. And build it.
$ cd build_unix
$ ../dist/make

1-1-3. Install it.
$ sudo make install

1-2. Install OpenLDAP

1-2-1. Set the environment variables.
(See the message with "configure --help")
$ export CPPFLAGS="-I/usr/local/include"
$ export LDFLAGS="-L/usr/local/lib"
$ export LDFLAGS="-L/usr/local/BerkeleyDB.4.5/lib/"
$ export CPPFLAGS="-I/usr/local/BerkeleyDB.4.5/include/"

1-2-2. Build it.
$ make depend
$ sudo make
(make has to be executed as root
otherwise a permission error occurs.)

1-2-3. Install it.
$ sudo make install

1-2-4. See doc/guide/admin/guide.html for how to use it.
Especially, "2. A Quick-Start Guide".

e.g How to start it.
$ su root -c /usr/local/libexec/slapd

2. Install ruby-activeldap Rails Plugin.
(http://code.google.com/p/ruby-activeldap/)
$ script/plugin install \
http://ruby-activeldap.googlecode.com \
/svn/trunk/rails/plugin/active_ldap

3. Install activeldap Ruby Gem.
(ruby-activeldap Rails Plugin only generates
scaffold model to access this gem.)

$ sudo gem install activeldap

4. Install Ruby/LDAP.
(activeldap is a wrapper for this.)

4-1. Download the source. ruby-ldap-0.9.7.tar.gz
(http://sourceforge.net/projects/ruby-ldap/)

4-2. Unpack the tar.gz file. And build it.
(See README file under the unpacked directory.)
$ ruby extconf.rb --with-openldap2
$ make

4-3. Install it.
$ sudo make install
(It's installed under /Library/Ruby/Site/1.8)

Event to build entrepreneurial software in 48 hours over a weekend

Over the last weekend, I participated in an event to build software product in two days and present it to investors at the end.

My goal of participating the event was to work on Ruby on Rails development and to get familiar with local start-up scene because they are the ones who are using Ruby on Rails most.

Our team lead was very professional in skills, knowledge and the manner he conducted business throughout the project. I was able to enjoy the development fully.

During the event, series of experts in business, entrepreneurship, and technology visited each team and gave us advices. It was very interesting to see how the project was being shaped as a result of this interaction and how the direction changed along the way.

The presentations by investors and accounting professional, etc. at the beginning of the event were very informative also. And I was able to meet various technical people during the event.

My goal was more than fulfilled.

Sunday, February 24, 2008

RSpec Stories resources

I just put it in here because I refer to it often.

RSpec Stories resources.

By the way, one comment in David Chelimsky's blog entry in there has a link to a Story Editor using Prototype.

Friday, February 22, 2008

Éoliennes sur le sommet des centres de ski

Since I'm learning French, I try to write a blog entry in French as well.
This is about the idea of Wind-powered generator on the top of the ski hills, which I wrote on February 5th. Please correct it if you are familiar with French. My French is not good yet:

J'ai une idée de mettre des vent générateurs sur le sommet des centres de ski parce que souvent il vente très fort là. L'électrcité générée est utilizé pour l'ascenseurs.
(Corrigez les erreurs, SVP. Ça ne fait pas longtemps que j'apprends français.)



Mon ami a corrigé les fautes (Merci!):

J'ai eu une idée d'installer des éoliennes sur le somment des centres de ski car il vente très fort a ces endroits. L'électricité générée serait utilisées pour les remonte pente.

Friday, February 15, 2008

RSpec Stories

I like RSpec's new feature, RSpec Stories.
In the past, I saw Acceptance Test Cases written in plain text and the approach worked very well.

By the way, RSpec Stories is in English. And of course, all the programming languages use English for their keywords as far as I know. But I'm learning French now. And French speaking customers writing Stories in English doesn't seem to work well. And developers translating French to English introduces one more layer of indirection, which we want to avoid. I wonder if there is a solution to this problem. Maybe we can make a translator. It will be simple because it contains only RSpec stories keywords.

Monday, February 11, 2008

Experiment on Evolution

I have attended very interesting lecture at a local university.
I wish I had enough time to write down the verbs the speaker used to describe what three key figures in the lecture did.
But using my words instead, it was about - Darwin provoked the idea, Dallinger attempted to verify it experimentally, and D'Herelle established the way to experiment it.
Of course, not to mention, that uses life form whose reproduction cycle is very short so that you can observe its evolution.

D'Herelle is the start of Evolutionary medicine.
Evolutionary medicine is very interesting. Bacteriophage therapy makes sense though I acknowledge the points the speaker mentioned - it's alive so you don't necessarily know what would happen after the treatment is completed.

Thursday, February 07, 2008

RSpec Rails screencast

"Story Runner top to bottom screencast"

It's very good and at the same time entertaining to follow as well.

Tuesday, February 05, 2008

Wind-powered generator on the top of the ski hills

Many times at the top of the ski hills and mountains, especially in the high mountains, wind blows very hard.

I have come up with the idea of putting a wind-powered generator on the top of a ski hill. It provides electricity for the lifts. And when the lifts are not used, the generated electricity can be put back to the power grid.