Rubyの魔法に惑わされる日々。

Ruby on RailsのActiveResource & Restfulなコーディングをマスターするぜ!と泥沼にハマるなど。

問題としては、世間がRails 3.1の時代にあってやっとRails2.xを見始めたところにあるような気がしないでもないのだけど。だってメンテしてるアプリRails1.xなんだもん!Rails3.xはOS自体が受け付けないんだもん!!

もとい。

ざっくり世の中の資料によるとAcitveResourceにお任せ設計したRailsでのレコード更新は、

<% form_for @record % do |f| %>...<% end %>

としておけば、@recordにidがあったらPUTでupdateメソッドを叩きに行き、@recordにidが無かったらPOSTでcreateメソッドを叩きに行く…らしいのだけど。

今使っているRails2.3.14でこの書き方をやると、PUTでupdateを叩くのまでは良いのだけど、params[:id]が無くなってしまった。色々試行錯誤した結果として、

<% form_for @record :url => {:action => :update, :id => @record.id} do |f| %>

とするとようやくまともな動きをするように。ちなみに:actionをさぼるとPUTでeditを叩きに行く気配。

editメソッドを叩くURLの生成も

<%= link_to( 'Edit', edit_record_url( @record ) ) %>

では駄目で、

<%= link_to( 'Edit', edit_record_url( :id => @record ) ) %>

としないといけない。

どうも過渡期のRailsを使い始めてしまった気がしないでも無いけど、ここらへんの差異は資料が見つかりにくいというか魔法が効きすぎてかえって解除に手間取る気がする。

てか、form_forに至っては開発環境でri form_for して出てくる説明と実動作が合っていないので、あたしの環境はドキュメントとコードがずれているような気もする…。

| | コメント (0) | トラックバック (0)

本日の教訓。

郷にいる間は郷に従え。

…RonRで3画面作るだけなのに「何キロステップ?」と申されましても…っ

| | コメント (0) | トラックバック (0)

Radiant CMSで構築しているサイトをgit管理しようとしてハマる。

ダウンロードしてきたextensionを自分のgitリポジトリに追加して別の場所でcloneしようとしたらディレクトリしか届いてこなかった顛末。

元の場所に戻って状況確認していったところ、extensionの開発元gitのログが出てきてはふーんな感じに。えぇと、他のリポジトリ管理下のソースを自分のところに関連づけるにはどうするんだ…?

…それとも「導入するextension一覧」的なものを作れたっけ?そっちのほうが前向きか?

あとで調べよう。

あと、同パターンでさくらのVPSで構築していたRadiant CMSサイトをMacbook Airにgit cloneしてきてよぉしこれでローカルでも作業できるZEと思ったら、Macbook AirにMySQLが入っていなかったというオチが。はぅぅ。

| | コメント (0) | トラックバック (0)

Ruby on Railsアプリで2つめのDBを使う。

具体的にはRadiant CMSで、Radiant自身のコンテンツ管理に使うDB以外にコンテンツ上に表示するDBを使いたい、など。ただしハードコーディングになってしまうので、たぶんYAMLとか使ってもう一工夫することになるかな。

class OuterDbRecord  < ActiveRecord::Base
  ActiveRecord::Base.establish_connection(
    :adapter => 'sqlite3', :database => 'db/outer_db.db' )
end

---

record = OuterDbRecord.new record.value = 'Homu Homu Homu' record.save!

こんな感じで。

| | コメント (0) | トラックバック (0)

Ruby on Railsでコンソールアプリを作る。

MVCだって言うのなら、GUI以外のViewだって使えないとおかしいと思うのさね。

RonRはWeb GUIが前提になっているけど、アクセスログ管理アプリとか一括データ登録機能とかを作るとWebではなくコンソールから操作したいことが多々ある。

wgetとかw3mでWeb GUIにアクセスする方法もあるけど、今ひとつイケてないので。Rubyコードで済ませる方法をメモっておく。

  • config/bootをrequireする。
  • config/environmentをrequireする。
  • rubygemsをrequireする。
  • active_record、および使用するmodelをrequireする。
  • -I $RAILS_ROOT/app/modelsを指定してrubyを実行。

以上でRuby on Railsとして”普通に”DBアクセスする環境は整う。

DB環境の切り替えは、RAILS_ENV環境変数で指定する。ActiveRecord::Base.established_connectionに直接指定する方法もあるけど、ハードコーディングになって扱いが面倒なので試しておらず、故によくわからん。

例:

#!/usr/bin/ruby -I app/models

require 'config/boot'
require 'config/environment'
require 'rubygems'
require 'active_record'
require 'apache_log'

STDIN.read.each do |line|
  line.chomp!
  record = ApacheLog.new
  record.log_text = line
  raise 'DB access error!' if not record.save
end

なお、アクセスログみたいに巨大なファイルをSTDIN.read.eachでさばこうとすると最初に全部メモリに乗っけてしまうようなので、巨大な敵を撃つときはSTDIN.getsでnil判定した方が良いようです。

    

| | コメント (0) | トラックバック (0)

specにp埋め込むなら! 出力をみんなspecに書けばいいじゃない!

割と自虐的に。

モデルのテストやってるとついつい生成した結果を目視確認したくてspecの随所に

p homuhomu

とかやっちゃうのだけど、だったらその目視で「正しい」とみなす値をspecに書いておけば済む話だろー、という。

なんとゆーか、テスト仕様書片手に目視確認してマトリックスシートを塗りつぶしていた癖の悪影響かしらね(汗)

ま、spec書くよりpでちょっと出してみたほうが早い、というか出してみないとよくわからん、という時も確かにあるのだけど。

んー、でも確かにRSpec+FactoryGirlは慣れると楽だわ。utestの味気ないドットが並んでいくより、specdocの一覧が出てくるほうが、どこで失敗しているかもわかりやすいしね。

| | コメント (0) | トラックバック (0)

Radiant CMS 0.9.1のExtension開発でFactoryGirlを使う。

RADIANT_ROOT(radiantコマンドで生成するディレクトリ)にspec/factories/を置くべし! ←結論

問題:

  • FactoryGirlは通常spec/factories/以下にテストデータの定義を置く
  • Extensionの場合、vendor/extensions/<エクステ名>/spec/が該当(するはず)
  • だがしかし、ここに定義を置いても読み込んでいる気配が無いんだなこれが
  • あ、FactoryGirlのバージョンは1.2.4 (Rails2なので)

原因:

  • FactoryGirlの検索パスは、初期状態でRAILS_ROOT/test/factories/とRAILS_ROOT/spec/factories/ (factory_girl-1.2.4/lib/factory_girl.rb)
  • Radiant CMSの場合、みょんな小細工がいろいろ入っていてRAILS_ROOT = RADIANT_ROOTになる
  • エクステのディレクトリ内でrake specしても、同様。一度RADIANT_ROOTまで上がって、そこからspecとかを呼び出している
  • なので、FactoryGirlも一生懸命RADIANT_ROOT/spec/factories/を探していたようで。

対策:

取り敢えずの逃げとしては、RADIANT_ROOTにvendor/extensions/<エクステ名>/spec/のシンボリックリンクを作ればOK。

しかしこの方法では複数のextension開発に対応できず、あとRADIANT_ROOTからvendor/extensions/<エクステ名>/spec/へのパスが2種類になってしまうので、何かの拍子に予期せぬ誤動作がでそうで怖い。

しかしextension開発中にいちいち上のほうの階層にテストデータを置きに行くのもたるい。

やり方をまだ確認していないけど、たぶんspec_helperあたりでextensionごとにfactories/の位置をFactoryGirlに教えることができると思うので、それを確立するのが一番良い気がする。

共通で使うテストデータ(たとえばRadiantCMS本体に元からあるテーブル類とか)はRADIANT_ROOT/spec/factories/に置き、extension固有データは各spec/に置く、とかが一番スマートか?

| | コメント (0) | トラックバック (0)

gitのソースコード配布が復活しておる。

よく考えたらGit無いとRadiant CMSのエクステ入れられないぢゃんダメぢゃん仕方ないからEPEL使おう…と思いつつもふと魔がさしてGit本家を見に行ったところ、ソースコードのtar.gzがcode.google.comからの配布に切り替わって復活してる!!

どうやら過去のリリースも一式code.google.comに移住した模様??

ということで早速。

configureは特に指定なし。/usr/local/に入るけどまぁ良いか。パス通せば済むことだし。

粛々とmakeしてmake test。

結果。

fixed   0
success 7146
failed  0
broken  32
total   7278

…なんだbrokenって(汗)

まぁいいか(おぃ)

checkinstallでRPM化をば。

1 -  Summary: [ GIT - Fast Version Control System. ]
2 -  Name:    [ git ]
3 -  Version: [ 1.7.6.4 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ x86_64 ]
8 -  Source location: [ git-1.7.6.4 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ git ]

こんな感じでいいかな。

出来上がったRPMをインストール。

$ sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/git-1.7.6.4-1.x86_64.rpm
error: Failed dependencies:
        perl(SVN::Core) is needed by git-1.7.6.4-1.x86_64

ぬぐぐぐぐ。

# yum install subversion-devel
Installed:
  subversion-devel.i386 0:1.6.11-7.el5_6.4
  subversion-devel.x86_64 0:1.6.11-7.el5_6.4

Complete!

…が、しかしcpanでうまく入らん…。

こっちか!

# yum install subversion-perl

Installed:
  subversion-perl.x86_64 0:1.6.11-7.el5_6.4

Complete!

なんぞいつか来た道だなぁ、って。

りとらい。

$ sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/git-1.7.6.4-1.x86_64.rpm
[sudo] password for kmamiya:
Preparing...                ########################################### [100%]
   1:git                    ########################################### [100%]

よし入ったらしい。

試しに適当なテストアプリを用意してエクステを拾ってきてみる。

$ script/extension install language_redirect
$ ls vendor/extensions/
language_redirect

大丈夫そう。

| | コメント (0) | トラックバック (0)

さくらのVPSにRadiant CMSをセットアップ

さくらのVPS を導入してRadiant CMSの運用環境を構築するまでのメモ。なお、バージョンが指定された物は、依存関係を解決する過程で特定した物です。2011年9月現在の結果なので、OSや各モジュールの依存状況によって変動が出る可能性があります。最新状況の確認は各自にて。

また、バージョン指定物については「可能な限り最新版、ダメだったら少しずつバージョンダウンしてみる」という手法で解決を図っていますので、例えばrspecとrspec-railsはバージョンがずれており、合わせたほうがキモチ良いなーと思いつつそのままになっていたりします。

ちなみに、あたしはクリーンインストールに成功したこの記録に到達するまで、2回のOSリセットと概ね2回のごり押しをやっていまする。だいたい、1回目で破綻しつつ勘をつかんで、2回目+ごり押しでなんとか押し込むことに成功して、3回目できれいに納める、といった感じ。

記事全体としては、大まかな作業手順導入するRPM導入するgem具体的な手順、となっています。RPMやgemは、実際には導入手順の中で数回に分けて導入作業を行っています。大抵は最初に一括インストールして問題ないはずですが、確認はしていません(4回目をやるのが面倒)。RPMとgemの関係性とかもあるので、一括作業する人は注意。

大まかな作業手順

  1. rubyのインストール(1.8系)
  2. gemsのインストール
  3. railsのインストール(2系)
  4. DB関係のインストール
  5. radiant CMSのインストール
  6. 開発環境構築
  7. Passengerのインストール
  8. 運用環境構築

導入するRPMパッケージ

rubyのコンパイルで使うものたち。ext/の内容物をコンパイルするためのライブラリ類です。あとでアレが無いコレが足りないとやるのが面倒なので、後々必要になりそうなものをあらかじめ選び、導入要件を調べた結果こうなりました。
ncurses ncurses-devel gdbm gdbm-devel openssl openssl-devel zlib zlib-devel readline readline-devel
Rails運用に使うものたち。DB2種。ほかに使いたい人はそれを。sqliteは概ね最初から入っているはず。
mysql mysql-server mysql-devel sqlite-devel
Radiant CMS運用/開発に使うものたち。基本的には開発方面で必要になった気がします。ざっくりXML系ですな。
libxml2 libxml2-devel libxslt libxslt-devel
Passenger運用に使うものたち。
httpd-devel apr apr-devel httpd-devel curl-devel

導入するgem

Ruby on Rails本体。Rails3はあたしが慣れていないせいかそもそも一般流通しているgemが追従しきれていないのか、色々要らぬトラブルが発生するので当面Rails2でいきます。
rails -v 2.3.14
SQLite。これも、最新版(1.3.3)ではエラーになるので。まぁ基本テストで使うものなので多少いい加減でも良いかと。
sqlite3-ruby -v 1.2.5
MySQLについては特にひねりはありません。
mysql
Radiant CMSの開発環境まわり。運用だけならば不要だったように思います。
cucumber cucumber-rails database_cleaner webrat
おなじく、Radiant CMSのうちバージョン指定が必要な物。ちなみに、specぢゃなくてutest使うんだい!という人には不要です。
        
  • rspec -v 1.3.0
  •     
  • rspec-rails -v 1.3.2
Radiant CMS本体。Rails2系です。Rails3系は、radiant3だったかと。
radiant
Passenger。
passenger

手順

多少端折っていますが、実際に打ち込んだコマンドのログ。

まずはRubyとRubyGemsのインストール。前提条件として、RPM化するためにcheckinstallが導入済みとなっています。

rubyについてはインストール先のみ、/usr/に変更しています。単なる趣味というか職場環境がそうなっているからというか、まぁそのあたりが理由。

$ sudo yum install ncurses ncurses-devel gdbm gdbm-devel openssl openssl-devel zlib zlib-devel readline readline-devel

Installed:
  gdbm.i386 0:1.8.0-26.2.1.el5_6.1
  gdbm-devel.i386 0:1.8.0-26.2.1.el5_6.1
  gdbm-devel.x86_64 0:1.8.0-26.2.1.el5_6.1
  ncurses-devel.i386 0:5.5-24.20060715
  ncurses-devel.x86_64 0:5.5-24.20060715
  openssl-devel.i386 0:0.9.8e-20.el5
  openssl-devel.x86_64 0:0.9.8e-20.el5
  readline-devel.i386 0:5.1-3.el5
  readline-devel.x86_64 0:5.1-3.el5
  zlib-devel.i386 0:1.2.3-4.el5
  zlib-devel.x86_64 0:1.2.3-4.el5

Dependency Installed:
  e2fsprogs-devel.x86_64 0:1.39-33.el5 keyutils-libs-devel.x86_64 0:1.2-1.el5
  krb5-devel.x86_64 0:1.6.1-62.el5     libselinux-devel.x86_64 0:1.33.4-5.7.el5
  libsepol-devel.x86_64 0:1.15.2-3.el5 libtermcap-devel.x86_64 0:2.0.8-46.1

Complete!

$ cd ruby-1.8.7-p352
$ ./configure --prefix=/usr/
$ make ; make test

test succeeded

checkinstallでRPM化するにあたり、説明文はyum infoで得られるものをそのまま使います。どうせ個人使用なんで何でも良いといえばそれまでなんですが。

また、checkinstallでは1~4までの項だけを再設定します。Summaryについては同じくyum infoの内容をコピペ。2~3もyumで取ってこれるRPMに合わせることで、あとで入れ替えるときなどに要らぬトラブルが出ないようにします(したつもり)。

$ yum info ruby >description-pak
$ vi description-pak
★Description: の項だけ残して後は削除しておく。

$ sudo /usr/local/sbin/checkinstall
★1~4まで再設定。
1 -  Summary: [ An interpreter of object-oriented scripting language ]
2 -  Name:    [ ruby ]
3 -  Version: [ 1.8.7 ]
4 -  Release: [ p352 ]

**********************************************************************

Done. The new package has been saved to

/usr/src/redhat/RPMS/x86_64/ruby-1.8.7-p352.x86_64.rpm
You can install it in your system anytime using:

      rpm -i ruby-1.8.7-p352.x86_64.rpm

**********************************************************************

$ sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.8.7-p352.x86_64.rpm
Preparing...                ########################################### [100%]
   1:ruby                   ########################################### [100%]

gemについては何のひねりもありません。

$ cd rubygems-1.7.2/
$ sudo ruby setup.rb
RubyGems 1.7.2 installed

Ruby on Railsについては、バージョン指定しているところだけが特殊です。何も指定しないと、Rails3が入ってきます。

$ sudo gem install rails -v 2.3.14

ここで、うっかり忘れていたDB関係を入れることに。sqlite3-rubyのみバージョン指定が入ります。

$ sudo yum install sqlite-devel
$ sudo gem install sqlite3-ruby -v 1.2.5

$ sudo yum install mysql mysql-server mysql-devel

Installed:
  mysql.i386 0:5.0.77-4.el5_6.6           mysql.x86_64 0:5.0.77-4.el5_6.6
  mysql-devel.i386 0:5.0.77-4.el5_6.6     mysql-devel.x86_64 0:5.0.77-4.el5_6.6
  mysql-server.x86_64 0:5.0.77-4.el5_6.6

Dependency Installed:
  perl-DBD-MySQL.x86_64 0:3.0007-2.el5       perl-DBI.x86_64 0:1.52-2.el5

Complete!


$ sudo gem install mysql
Successfully installed mysql-2.8.1

ここで、Ruby on Railsのテストアプリを作ってみて、welcomeページ程度まで表示できることを確認しておきます。

$ rails testapp
$ cd testapp
$ script/server
★http://<IPアドレス>:3000/にアクセス

Radiant CMS関係。試行錯誤の結果、特に開発環境についてはあらかじめ相性問題を解決したgemを導入しておかないと、勝手気ままに依存関係を解消しようとした結果訳の分からない状態に突入する、という結論になりました。

$ sudo yum install libxml2 libxml2-devel libxslt libxslt-devel

Installed:
  libxml2.i386 0:2.6.26-2.1.12          libxml2-devel.i386 0:2.6.26-2.1.12
  libxml2-devel.x86_64 0:2.6.26-2.1.12  libxslt.i386 0:1.1.17-2.el5_2.2
  libxslt-devel.i386 0:1.1.17-2.el5_2.2 libxslt-devel.x86_64 0:1.1.17-2.el5_2.2

Dependency Installed:
  libgcrypt-devel.x86_64 0:1.4.4-5.el5     libgpg-error-devel.x86_64 0:1.4-2

Complete!

$ sudo gem install cucumber cucumber-rails database_cleaner webrat

Successfully installed json-1.6.1
Successfully installed gherkin-2.5.1
Successfully installed term-ansicolor-1.0.6
Successfully installed builder-3.0.0
Successfully installed diff-lcs-1.1.3
Successfully installed cucumber-1.1.0
Successfully installed gherkin-2.4.21
Successfully installed cucumber-1.0.6
Successfully installed nokogiri-1.5.0
Successfully installed mime-types-1.16
Successfully installed json_pure-1.6.1
Successfully installed rubyzip-0.9.4
Successfully installed ffi-1.0.9
Successfully installed childprocess-0.2.2
Successfully installed selenium-webdriver-2.7.0
Successfully installed rack-test-0.6.1
Successfully installed xpath-0.1.4
Successfully installed capybara-1.1.1
Successfully installed cucumber-rails-1.0.5
Successfully installed database_cleaner-0.6.7
Successfully installed webrat-0.7.3
21 gems installed

ここで以下のエラー発生。ただしどうやらドキュメント類が破損したような気配だったので放置。だがしかし、その後のgemも軒並みドキュメント類で「Could not find main page README.rdoc」というエラーが出たようなので、対処したほうがよかったのかも…。

ERROR:  While generating documentation for builder-3.0.0
... MESSAGE:   Unhandled special: Special: type=17, text=""
... RDOC args: --ri --op /usr/lib/ruby/gems/1.8/doc/builder-3.0.0/ri --title Builder -- Easy XML Building --main README.rdoc --line-numbers lib CHANGES Rakefile README README.rdoc TAGS doc/releases/builder-1.2.4.rdoc doc/releases/builder-2.0.0.rdoc doc/releases/builder-2.1.1.rdoc --title builder-3.0.0 Documentation --quiet

この時点で、「Invalid gemspec in [...]: invalid date format in specification: "2011-09-18 00:00:00.000000000Z"」というエラーが大量に出始めて非常にウザくなります。調べたところどうもgemspecの日付フォーマットが実動作にあっていないものがいくつかあるようです。仕様がDateTimeからDateに変わったか、その逆なのでしょうたぶん。

取り敢えず、一通り入れます。

$ sudo gem install rspec -v 1.3.0
Successfully installed rspec-1.3.0
1 gem installed

$ sudo gem install rspec-rails -v 1.3.2
Successfully installed rspec-rails-1.3.2
Successfully installed rspec-core-2.6.4
Successfully installed rspec-expectations-2.6.0
Successfully installed rspec-mocks-2.6.0
4 gems installed

$ sudo gem install radiant
Successfully installed will_paginate-2.3.16
Successfully installed RedCloth-4.2.8
Successfully installed radiant-0.9.1
3 gems installed

先のInvalid gemspec in …を回復させます。 gem list 等を実行するとエラーがどどっと出るので、それらのgemspecファイルを開き、s.dateに代入されている日付の文字列表現を修正します。具体的には後半の時刻部分を削除。

前:"2011-09-18 00:00:00.000000000Z" →後:"2011-09-18"

もう一度 gem list 等を実行してみて、エラーが無くなればOK…だと思います。今のところ障害は無し。

今回構築した環境では、Radiant CMS関連を実行する際にMutex (NameError)というエラーが出ます。これもたぶん標準ライブラリか何かの構成が変わった…用なのですが、対処療法としては require "thread" を追記してやることでエラーが解消します。

今回は、書き換えるファイルが最も少なくて済む方法を検討した結果として次の2ファイルに追記しました。どちらも先頭(RAILS_ROOT =の直後行)に追記しています。

  • /usr/lib/ruby/gems/1.8/gems/radiant-0.9.1/config/boot.rb
  • /usr/lib/ruby/gems/1.8/gems/radiant-0.9.1/lib/generators/instance/templates/instance_boot.rb

テストアプリを作ってみて、Radiant CMSとその開発環境(取り敢えずあたしはextensionを自作したい)が正常動作することを確認します。

$ radiant -d sqlite3 testapp
$ cd testapp
$ env RAILS_ENV=production rake db:bootstrap
$ script/server -e production

★http://<IPアドレス>:3000/にアクセス。
adminログインし、ページ作ったりレイアウト作ったりしてみてDB書き込み含めて稼働することを確認。
$ script/generate extension test_ex
$ script/generate extension_model test_ex xxx
$ pushd vendor/extensions/test_ex/
$ rake spec
★app/models/xxx.rbをちょこっといじってみる
$ rake spec
★xxx.rbをいじった結果が反映されればOK。

$ pushd

| | コメント (1) | トラックバック (0)

Radiant CMS 0.9.1でextensionをgenerateしようとするとgitを要求された顛末。

コトはさくらのVPSにRadiant CMS環境を、開発環境込みで構築しようとして起こりましたさ。

まずRadiant CMSが動くところまでで四苦八苦し(ハックなだけに)。

なんとか動いたぜー次はexntesion開発環境だぜーと思い、おもむろに script/generate extension xxx としたとき、こんなエラーなぞ。

$ script/generate extension page_category
NOTE: SourceIndex.new(hash) is deprecated; From /usr/lib/ruby/gems/1.8/gems/radiant-0.9.1/vendor/rails/railties/lib/rails/vendor_gem_source_index.rb:100:in `new'.
git version   2>&1:sh: git: command not found

まー、この"NOTE: SourceIndex.new(hash) is deprecated"もなんとかしたいのですけどね…。

で、問題はgit様。まぁこの機会に使い方を覚えるぜ?とインストを試みたところ、

  • CentOSの標準yumではRPMが無い。
  • Git本家に行ってソースコードを落とそうとしたところ、ソースのtar.bz2に何度やっても日を改めてもアクセスできない。
  • しかし「gitがダウンロードできない」的なキーワードでGoogleっても何も出てこない。

今日ようやく適切なキーワードを見つけ、真実に行き当たることができましたさ。

曰く、kernel.orgがクラックされた→gitのソースコードはkernel.org配下にある→ミラーは…無いの?(汗)

で、git無しでRadiant CMSのextensionを開発するための回避方法。つまりgit入れない。

radiant-0.9.1/lib/generators/extension/extension_generator.rb を読んだところ、どうもgit.gemが無かったり、Gitの呼び出しに失敗したときはスルーするように実装してある様子。また、件のgit: command not foundエラーは、require "git"した時点で発生します。

なんでgit.gem入れちゃったんだろう…と思っていたのですが、どうもRadiantをインストールしているどこかの段階で要求されたjewelerが依存していたことが判明。で、jewelerとは何ぞや?と調べなおすと、ソウルジェムもといrubygemの作成支援ツールのご様子。まぁ当面は要らないでしょう。

ということでgem uninstall jeweler gitなう。

結果として、

  1. script/generate extension xxxは成功。
  2. rake spec:extensionも成功。
  3. vendor/extensions/xxx/に移動し、rake specももちろん成功。
  4. spec/models/にtest_spec.rbを作成、中に適当な出力命令を仕込んでrake specしたところ、ちゃんと仕込んだ出力命令が実行されて終了。

ここまで動いたので、たぶん一安心かと。

この後もう一度さくらのVPSを初期化、Rubyのインストールから始めてみて、トラブルなく環境構築までできれば運用フェイズに移行しても良いかな、的な。

だがしかし、よく考えると運用環境に開発環境まで持ち込むのは色々危険だぜ?という真実のコトバは割と早い段階から聞こえてはいたのだけど、そこは取り敢えずスルーいたしたく。

| | コメント (0) | トラックバック (0)

gitのソースがダウンロードできないなーと思っていたら。

kernel.orgがクラックされていたのね。そのニュース全然気づかなかったよ。最近、会社命令で情報から遠ざけられているからなぁ…さすがIT系大会社。ま、そもそもgithubがブロックされているしな。

てか、目的はgitを使うことではなく、Radiant CMSをセットアップしていたらgitが無いと怒りだしたご様子なので対処していたところなのですがね。

さぁて、どうしたものかな。

| | コメント (0) | トラックバック (0)

Macbook Air。

…ちなみに旧版(Core2 Duo)ですにょ?

我慢できなくなってポチったのが先々週

届いたのが18日

新作発表されたらしいのが20日

ある意味完璧な死亡フラグの立て方というか、ほとんど最終生産ラインだったんぢゃなかろーか、とか。

そしてこのレビューは意味があるのか(笑)

もとい。

購入したのは11インチのApple Storeカスタマイズモデル。SSDは128GBで。容量的には64GBでも十分かなと思っていたのですが、CPUを1.6GHzにできるのが128GBのほうだけだったので。

CPUは1.6GHz Core2 Duoに、メモリは4GBに変更しています。Airは購入後のカスタマイズが効かないので、最初で積めるだけ積み込まないといけませぬ。

外付けアクセサリー類は全部無し。この辺りは家電量販店やAmazonで売っているのを確認したので、必要になったら順次購入。Apple careも、1年以内に購入すれば良いのでとりあえず後回し。

到着後手持ちの機材を試したところ、USB LANはBUFFALOのLUA3-U2-ATX がさっくりと認識。

キーボードはESCが小さく、Windowsの全角/半角があるところに1キーがある都合上、気がつくと画面上に"1"が乱舞していることが(汗)

あと、カーソルキーが小さいとか、deleteの上にある電源キーをなぜかBackspaceと誤認しそうになるとか問題は多少発生していますが、まぁこのあたりは慣れるしかないよね。

キーのサイズとか打鍵感覚はなかなかよろしい感じ。

マウスパッドはマルチタッチということを失念していて、スクロールを思い出すのに一苦労というか。ホームポジションのままスクロールさせようとすると、2本指を合わせるのにちょっと辛い感が。やり方が悪いのでしょうか…。

あとPCと違ってきっちりクリックしないといけないのが少し戸惑う感じ。PCだと軽くタップすれば反応するからねぇ。

モニタを閉じた瞬間即時静かにスリープしてくれるのは便利。使い方がPCよりPDAとかスマートフォン系になる。やー、WindowsでもSSD化してきっちり割り切って使えばこの程度にはできるとは思うんだけどさ。

あと、この薄さだと鞄の書類エリアに放り込めるってのは素晴らしいねぇ。本体も金属で剛性があるし、SSDで衝撃にも強いし、この「手軽に扱う」ためにもこいつはクッション入りケースではなく、バリアジャケット式で保護すべきだと思うさ。

しかし、買ったのがMacなのに常時展開しているのはターミナルだっていうのはどうなんだ?すっかりRuby on Rails開発環境になってますさ?

プログラミング環境としては中々良いので、今度ちゃんとSubversionなりGitなりのリポジトリを確保しないといけないなぁ、とか。

導入したソフト:

  • Evernote
  • Sugarsync
  • Firefox
  • Thunderbird

ThunderbirdについてはIMAP4接続で、ローカルデータとかSPAMフィルタとかをSugarSyncでWindows PCと共有。今のところ、特に支障は感じていない。

Firefoxもいい加減Syncを設定すべきか、うぅむ。

そういえばVAIO Zを常備しなくなったので、Eye-fiのデータ行先を考えないといけない。アレってMac使えたっけ??

購入した機材:

エアージャケットを取り付けてみたところ、非常にしっくり収まる上に透明度も高く、取り外しも可能という優れもの。ここは一つ、ジャケットの裏側にデコるしかないのではと画策中。

しかしこいつの背面はいただけませぬ。Macbook本体のゴム足込みでジャケット入りしてしまうのですが、ゴム足の代わりとしてシール式のゴムが付属しています。これをゴム足部の頂上に貼れ、という指示。
シールの接着剤はそこそこ粘度が高いのですが、それでも丸みを帯びた突起部に貼ったシールなんぞあっという間に剥がれるのです。鞄に放り込んで1日を待たずして既に2枚脱落。

しょーもないので全部剥がしてしまったけど、やっぱり滑るので何か手を打たないと。案としては、ジャケットのゴム足部分を開口して、本体のゴム足を露出させようか…とか検討中。この厚みのポリカーボネートとなると、ドリルで開口+糸鋸で切断…でもなんか苦労しそうでちょっとアレだけど。

しかしまぁ、アレだ。新型Airはポートのレイアウトとか変わったようなので、ジャケットもちゃんと新型を待ったほうが良いと思うよ?

| | コメント (3) | トラックバック (1)

Mockとガチャピン(ちげーよ)

Radiant CMSをいぢる過程でRspecの使い方を勉強中なわけだが。

ここでモデルのテストをするにあたって関連モデルのインスタンスを作るにはfixturesをつかうのが良いのかMock/Stub(Mockかな?)を使うのが良いのか。

ナウなヤングとしてはMockっぽい気もするけど、よく考えたらActiveRecord実装があるのにそいつをわざわざ作りこむのは本末転倒な気もする。

てことは素直にfixturesを使うのが良いのか。しかしRadiantのextensionジェネレータはfixtures置き場を作ってくれていないのだがいったいどこに置けと?ぬぐぐ。

あと、Rspecは確かに自然言語っぽくて読みやすくはなるのですが、英語上等的な色が強くて一種のイジメだと思います、はい。

普段 "should" なんて読みも書きもしないからスペルミス連発ですがな…。

| | コメント (0) | トラックバック (0)

Radiant CMS 0.9.1でextensionのrake specがエラーになる場合の対策。

もっと良い方法ないのかなぁ…。Radiant自体のほうに覚え込ませたいんだが。

環境は ServersMan@VPS。

対策:

$ radiant <application_name> として環境構築した場合、 <application_name>/vendor/plugins/ に必要なgemを入れる。ln -s でもOK。

調査過程:

確認した環境では rake spec とすると次のようにエラーが出る。

Missing these required gems:
  rspec-rails  >= 1.3.2

rspec-railsのバージョンチェックをしているのは、 <application_name>/config/environments/test.rbの末尾。ここでは「"#{Rails.root}/vendor/plugins/rspec-rails"というディレクトリが存在したらバージョンチェックを省略という実装になっている。

で、Rails.rootは環境変数などで制御しないと <application_name> となる。これはextension用のRakefileに出力コードを書き込んで確認。

なので、<application_name>/vendor/plugins/ にrspec-rails/を置いてやれば良い。

gemをインストールする過程で色々できた気もするけど、今回はすでにrspec-rails-1.3.2をインストールしてしまっていたので、ln -s で rspec-rails-1.3.2/ を rspec-rails、rspec-1.3.2/ を rspec として配置。

取り敢えず先のエラーが出ず、spec自体のエラー(だってまだ実装していないモン)が出るようになったので、良しとしたい。

ここに毎回gem入れるのは面倒だし、複数環境構築すると個々に同じファイル群ができてしまうのは嫌だなぁ…。RAILS_ROOTあたりを適当に設定すれば対応できそうな気がしないでもないが…。

| | コメント (0) | トラックバック (0)

もう少しなんだが。

Twitterを契約したので、そっちで喚いた妄言をまとめてBlogに放り込もうとRubyでスクリプトを書いていたのですが、TwitterのRSSから当日分だけを取り出してHTML化、メールで送信…まではできたものの、なぜかそれをココログが受け付けてくれず。

テスト用と保存用を兼ね、サーバに専用のアカウントをつくってそこへRubyで送信、メール転送でココログへ…とやっているのですが、

  • Fromがよろしくないのかと試しにmailコマンドで送り出した時の自動設定なFrom:のアドレスをココログに登録してもNG。
  • もっと単純化しようと、Rubyで直にココログアドレスを送ると、「Please receive your mail before sending」でエラーに。
    うぅむ、本番プログラムは同一サーバ上なので、SMTP通っていないんだな、たぶん。
    しかし、RubyでPOP before SMTPまで書くのは面倒だ…。

まぁ、とりあえずPCや携帯のメール宛にはログを持っていけるようになったので、当面これでcron稼働させておいても良いのだけど。

ちなみに、おなじよーな”車輪”が既にいくつも存在しているだろうということは承知してまする。とりあえず自作してみようかと。

| | コメント (0) | トラックバック (0)

ServersMan@VPSの環境構築#3。

rubyの状態を確認したところ、どうもビルド時点で色々とライブラリが足りていなかったことが判明。要るモノをチェックして、ビルドし直し(や、個別にビルドできるのは調べてわかったんだけど、面倒なので)。

rubyビルド環境のext/にあるモノを調べる。以下のスクリプトでライブラリを叩いてみて、LoadErrorになったら足りないぞ、ということで。

$ cat Setup |perl -ne 'next if $_ =~ /#option /;next if $_ =~ /#Win32API/;next if $_ =~ /^$/;$name = substr($_, 1);print $name."\n";system( "ruby -r $name" );'|grep LoadError

この時点でzlib-devel、openssl-develまでは入れていたので、足りないとわかったのは以下。各々内容を確認して、入れるかどうか決める。

  • curses
    …端末操作ライブラリらしい。面白そうだから入れる。yumで指定するときは、ncursesになるので注意。
  • dbm
  • gdbm
    …dbmかgdbmのどちらか片方あれば良さ気。gdbmを入れる。
  • readline
    …入れる。
  • tcltklib
  • tk
    この2つはGUI系なので、入れない。
  • あとWin系のが1つ混じってたけどそれは見なかった方向で。

yumで各々の実行ランタイム(?)の有無をチェック後、develをインストール。

Dependencies Resolved

==========================================================================================
Package                    Arch           Version                   Repository      Size
==========================================================================================
Installing:
gdbm-devel                 i386           1.8.0-26.2.1              base            36 k
ncurses-devel              i386           5.5-24.20060715           base           1.6 M
readline-devel             i386           5.1-3.el5                 base           146 k
Installing for dependencies:
libtermcap-devel           i386           2.0.8-46.1                base            56 k

Transaction Summary
==========================================================================================
Install      4 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

で、rubyをもう一度configureしてmakeしてmake test。

そしてrubyのパッケージづくりとインストール。

$ sudo /usr/local/sbin/checkinstall --fstrans=no

なんか、ファイルコピーがみょんに時間かかるわね…。

念のため、できたRPMの内容をチェック。

$ rpm -qp --list /usr/src/redhat/RPMS/i386/ruby-1.8.7_p249-1.i386.rpm

大丈夫そうなので、インストール。

$ sudo rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.8.7_p249-1.i386.rpm

確認。
$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]
$ which ruby
/usr/bin/ruby

あと、省略するけどライブラリ類の有無も、必要分を調べたときと同じスクリプトでチェック。

よしよし。次はgemsを入れて、いよいよRuby on Railsの導入へ。

RubyForgeでRubyGemsの最新版を取得。

$ sudo ruby setup.rb
RubyGems installed the following executables:
        /usr/bin/gem

$ which gem
/usr/bin/gem
$ gem -v
1.3.6
$ gem list

*** LOCAL GEMS ***

で、Railsをいよいよ入れるですよ。

$ sudo gem install rails

Successfully installed rake-0.8.7
Successfully installed activesupport-2.3.5
Successfully installed activerecord-2.3.5
Successfully installed rack-1.0.1
Successfully installed actionpack-2.3.5
Successfully installed actionmailer-2.3.5
Successfully installed activeresource-2.3.5
Successfully installed rails-2.3.5
8 gems installed

$ rails -v
Rails 2.3.5

$ rails testapp
$ cd testapp/
$ script/server --port=2222
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:2222
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-04-20 23:57:02] INFO  WEBrick 1.3.1
[2010-04-20 23:57:02] INFO  ruby 1.8.7 (2010-01-10) [i686-linux]
[2010-04-20 23:57:02] INFO  WEBrick::HTTPServer#start: pid=9320 port=2222

動いた…かな?

http://183.181.170.141:2222/へアクセス。

画面は出たんだけど…"About your application’s environment"クリックしたら、sqlite3アダプタが入っていなくてエラーに。ま、これは仕方ないやね。

調べてみるとそもそもyumでsqlite-develが入っていないと言うオチがつき、面倒なので一応終わったことにする。

あ、21日の2:00からメンテやるみたい。一応screenは落としておこう。

| | コメント (0) | トラックバック (0)

ServersMan@VPS の環境構築#2。

Rubyはまぁmake test通っているからいいだろう、という結論にしてみる。

一応checkinstallでRPM化しておこう。ということで1.6.2をコンパイル。

Checkinstall 1.6.2

すわっ!?makeに失敗。「msgfmtが無い」とか言ってるし。…gettextパッケージに入っているらしい。

出典:パッケージリビルド時に msgfmt: command not found というエラーがでる。

日付がやたら古いけど、まぁ定番アイテムってことだろう。

$ sudo yum install gettext

Dependencies Resolved

==========================================================================================
Package              Arch              Version                   Repository         Size
==========================================================================================
Installing:
gettext              i386              0.14.6-4.el5              base              1.4 M

Transaction Summary
==========================================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 1.4 M

Installed:
  gettext.i386 0:0.14.6-4.el5

Complete!

うむ、入れたさ。

$ make
$ sudo make install

で、まずは自分自身をRPM化する。…っと、rpmbuildが無いわ。

$ sudo yum install rpm-build

Dependencies Resolved

==========================================================================================
Package              Arch            Version                       Repository       Size
==========================================================================================
Installing:
rpm-build            i386            4.4.2.3-18.el5                base            301 k
Installing for dependencies:
patch                i386            2.5.4-29.2.3.el5              base             64 k

Transaction Summary
==========================================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 366 k

Installed:
  rpm-build.i386 0:4.4.2.3-18.el5

Dependency Installed:
  patch.i386 0:2.5.4-29.2.3.el5

Complete!

$ sudo /usr/local/sbin/checkinstall

/usr/src/redhat/RPMS/i386/checkinstall-1.6.2-1.i386.rpmができた。--force付きで上書きインストール、rpmが認識できるようにしてやりませぅ。

$ sudo rpm -i --force  /usr/src/redhat/RPMS/i386/checkinstall-1.6.2-1.i386.rpm

とりあえずここまで。

| | コメント (0) | トラックバック (0)

ServersMan@VPSの環境構築#1。

まずはscreen -Rしておこう。

そういえば、 sudo時のaudit_log_user_command(): Connection refusedについてはGoogleるとこんな記事が。

http://d.hatena.ne.jp/tullio/20080930/1222788803

見なかったことにする、もしくは最新のsudoを使うらしい。

sudo新しいのがyumで取れるみたい。
Installed Packages
Name       : sudo
Arch       : i386
Version    : 1.6.9p17
Release    : 5.el5

Available Packages
Name       : sudo
Arch       : i386
Version    : 1.6.9p17
Release    : 6.el5_4

なので更新。
$ sudo yum update sudo

Updated:
  sudo.i386 0:1.6.9p17-6.el5_4

Complete!

どれ、
$ sudo ls /root
audit_log_user_command(): Connection refused

ち、だめか。

さてもさてもコンパイラを。
Name       : gcc-c++
Arch       : i386
Version    : 4.1.2
Release    : 46.el5_4.2

$ sudo yum install gcc-c++

Installed:
  gcc-c++.i386 0:4.1.2-46.el5_4.2

Dependency Installed:
  cpp.i386 0:4.1.2-46.el5_4.2                    gcc.i386 0:4.1.2-46.el5_4.2
  glibc-devel.i386 0:2.5-42.el5_4.3              glibc-headers.i386 0:2.5-42.el5_4.3
  kernel-headers.i386 0:2.6.18-164.15.1.el5      libgomp.i386 0:4.4.0-6.el5
  libstdc++-devel.i386 0:4.1.2-46.el5_4.2

Complete!

入れた。次はRuby。

Rubyのソースを取得。1.9は職場でえらい目にあったので、学習して1.8最新版で。
ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.bz2

rubyは/usr/local/が初期状態だけど、職場の環境(というかRHELの環境)に合わせて/usr/に入れる。
$ ./configure --prefix=/usr

まぁアレだ。並列コンパイルとかはやめておこうか。一応時間を計測。
$ time make

real    2m17.749s
user    0m51.361s
sys     0m3.532s

これも(むしろこれが)長いよね。
$ time make check

screen使っておけば切断してしまっても処理とかログとか残るので、こういう長い処理のときは有効やね。
てか、今WILLCOMで繋いでいるし! (In 横須賀線グリーン車<疲れたんだよ今日…)

1950 tests, 1343768 assertions, 2 failures, 52 errors
make: *** [test-all] Error 1

real    15m8.793s
user    5m50.252s
sys     0m9.370s

なんかエラー出てるけど、ざっと見ると

53) Error:
test_soapbodyparts(WSDL::SOAP::TestSOAPBodyParts):
Errno::EADDRINUSE: Address already in use - bind(2)

こんなのがいくつか出てるんで、たぶんhttpdが上がっている状態でport 80を奪い合った結果…かしら?
まぁそろそろいったん終了。

自宅にたどり着いたので、続きを。エラーの内容をちゃんと見る。

  1) Failure:
test_too_big_to_s(TestBignum) [./test/ruby/test_bignum.rb:103]:
<RangeError> exception expected but was
Class: <NoMemoryError>
Message: <"failed to allocate memory">
---Backtrace---
./test/ruby/test_bignum.rb:103:in `<<'
./test/ruby/test_bignum.rb:103:in `test_too_big_to_s'
./test/ruby/test_bignum.rb:103:in `test_too_big_to_s'
---------------


これはメモリ不足か。あきらめるしかないね。
あとは案の定、port 80関連。

Apache2を止める。
$ sudo /sbin/service httpd stop
Password:
audit_log_user_command(): Connection refused
Stopping httpd:                                            [  OK  ]


で、再びテスト。
$ time make check

test_soapbodyparts(WSDL::SOAP::TestSOAPBodyParts):
Errno::EADDRINUSE: Address already in use - bind(2)


エラー再び。Googleで回避策を漁る。

…!そうか、port 80はrootでないと確保できないか?

$sudo bash -c "time make check"

…改善しない。

仕方ないのでいったんrootに降りて、別の環境で.configureからやり直してみる。

今make check中だけど…エラー出てるな…。これで同じモノが出るようなら、もっときちんと状況確認すべきですな。ライブラリとか、足りてないかも知れないしね。

(や、素直にyum install rubyしろ、という噂も…)

…寝るか。明日から二人に分離しないといけないし!

…とか言っていたら、make check終わった。エラー変わらず。SOAPとか使うつもりないし、吐いているのWebrickだし、もうこのままで良いかなぁ…。

あー。エラーログ見直してみたら、なんかインストールする前から「/usr/bin/rubyが無ぇっ」とかやってるのね。
てか、READMEによるとrubyはmake testまで通れば良いんだったか…。make checkがあるとついそっちまで通したくなってしまうのだけど…。面倒だからこのままイクかー。

リモートゆえ、何かトラブった時のリカバリが面倒なので、危ない橋は渡りたくないんだけどなー<ならばyumで1.8.5を入れろよ

| | コメント (1) | トラックバック (0)

ServersMan@VPS開通デス。

うーん、やっぱり本格的にいじれるのは週末やね。

取敢えず

  • 初回ログイン
  • rootパスワード変更
  • 環境チェック
  • 作業用アカウント作成

…あたりまでやっておこう。

dfの結果:

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/simfs            10485760    527652   9958108   6% /
none                    131072         4    131068   1% /dev

うーん、予想通り、HDD容量10GB=OS込で10GBですね。とはいってもこの時点で残り9.5GB余っているので、まぁそんなに困るモノではなさそうだけど。

ところでこれ、思いっきり単一パーティションなのですが、本格的運用サーバ用途で考えると問題出たりしないんでしょうかねぇ…?

yum listの結果:

…貼り付けるとえらいことになるので省略。しかしこれ、OpenOfficeとかFirefoxとか、X-Window関連も入っているような…。
インストール済みパッケージについては、ダイエットが必要かもしれませんな…。

「デスクトップ」とかで入れたのかなぁ…。

開発環境:

あー。しかし開発環境類は入っていない感じ。java、rubyのほか、C/C++コンパイラ系も見当たらず。まずはこの辺からか…。

unameの出力とかlib64/がないあたりとか、32bit版かこれは…。まぁ上位プランでもメモリそんなに多くないし、どうでもいい問題ではあるわね。

要調査:

作業用ユーザ作って、sudoerに指定してログインし直したのだけど、sudo実行すると出てくる以下のエラーは何?sudo自体は結局成功しているみたいだけど。

$ sudo ls /root
audit_log_user_command(): Connection refused

まぁこのあたりで寝るか。今しがたFirefoxも落ちた(むしろWin7が落ちた)ことだし。

| | コメント (0) | トラックバック (0)

ServersMan@VPSの開通予告が来ました。

…危なかったよ…。

メール振り分け設定の優先順位の都合から、アダルトサイトなDTIのほうに入っちゃってたよ…(笑)

もとい。
ServersMan@VPSから開通予告が届きました。

2010年4月14日(水) 13:00~

だそうデス。なんで時間まで指定しているんだろう…。まるで怪盗予告のようだ(笑)

ま、あたし平日は普通に仕事なので、接続できるのは夜…か、気が向いたときにモバイルで忍び込んでみる程度が関の山かと思いますがっ。

明後日なので、作業手順くらいは練っておいてもいいかもね…。

あと、残り2つのプランについても案内が。

※キャンペーンとして、現在、 最大3ヵ月無料を適用させていただいておりますが、7月末までのプラン変更であれば、最大3カ月無料を引き続き適用させていただきます

とのこと。

これで、当初申し込みを躊躇っていた「すぐ使ってみたいけど対象プランがまだ開始していなくて、しかも無料キャンペーンは1回限り」という悩みは解消です。

あー。となるとプラン変更時データの移行はどんなふうになるんだろ。

解約+契約なら普通データ消えるわね。仮想サーバ機器/OSの設定が同じなら、rsyncかなにかでガッ、と逝くのが楽そうではあるけどね。

ま、今は趣味でつついてみるだけなので、最初のEntryプランで好き放題いじり倒して、その記録を元に次のプランできっちり構築し直す、なんて行動計画でも良さ気だけど。

FAQに「Q.ディスクの容量変更はできますか?」「A.プラン変更をしてください。」とあるのを見ると、もしかするとプラン変更ではディスクとメモリの割り当てだけ設定変更して、環境はそのまま残る…という可能性もありそう?

あ、そういえばこのディスク容量、「OS込で10GB」なのか「OS除いて10GB」なのか、どっちだろうね。今ざっと見なおしたところでは、説明 が無いような気がするけど。後者はOSバージョンによって微妙な増減が面倒だろうから、やっぱり前者かなぁ。

だとすると、Entryプランの実空き容量って多くても7GBとか、そんなんだったり?ま、明後日にははっきりするので、今更問い合わせてみること もないけどね。

さてさて、まずは何からしてやりましょうかね。

仕事柄「弾幕はCPUパワー(違)」的にマシンをぶん回すことが多いので、そっち系のベンチマークも回してみたい気もするけど。まずはBLASTでもつっこんでみようか。

| | コメント (0) | トラックバック (0)

や、別にいいんだけどさ…。

Snapshot

「メディア掲載情報」としてカウントするなら、とりあえずサーバー割り振ってよ、とか思った。ちょっとだけ。

Googleの検索結果と比較すると、自動収集というわけでもないみたい。プロの広報+申し込んだ人…かなぁ…。

しかし割り当てが来るのは何時の事やら。

| | コメント (1) | トラックバック (0)

ServersMan@VPSに申し込んでみました。

プランはEntryで。現在「2週間以内に提供」らしいです。

こーいうのに限って、「2週間のうちに残り2プランが開始した」か、「2週間は来ないだろうと思っていたら翌日開通してあたふた」の2択になったりするんですよね(笑)

| | コメント (0) | トラックバック (0)

save_beforeはFswiki だ>あたし

正しくはbefore_save。

仕事で使ってるRails 1.2.6にもちゃんとある。

ちゃんぽんで使うと、たまーにこう言う事態に陥る…。

| | コメント (0) | トラックバック (0)

Ruby on Railsでデータの抽象化をしてみる。

まー、仕事で必要だったので。あと、何度か挑戦してはハマっていたので、後々のために考え方を記録。

だいたい実現できそうな感触にはなったのだけど、はたしてこれは規約違反なのかどうかのか…。コードに無理はないと感じているので、たぶん許容範囲とは思うけど…。

しかしRonRはつくづく複合キーに弱いな。

目的:

異なるModelで表現すべきデータを、相互に関連付ける。つまりはハイパーリンクというか、RDBの構造そのものというか。

作っているものとしては、研究プロジェクトとその成果と報告書をかきあつめて関連を示す、というようなモノ(どこでみょんな問題に巻き込まれるかわからんのでソノモノは書かないけど、これだけ書けば十分な気も)。

問題:

  • 同種Model同士なら2点の関係を示すリストを作り、belongs_toで各々を示してやれば終了…なのだけど、異種Modelになると:class_nameに指定する内容がデータ依存で変わってしまい、コードベースで定義できない。
  • 同種Model同士のリストをModel数作ればいいのだけど、関係を示す部分のコードがほとんど同じになることが確実で、非常にうざい。てか、RonRの原則にも反していると思うし。
  • 同種Model同士のリストを作っていくと、テーブルもその分増えていくので嫌。
    なので、共通のテーブルを1つ作り、そこに「どのModelのデータか」を記録することにした。

駄目だったこと:

  1. Moduleでベース部分作って、その中にbelongs_to書いてやれば、includeした先のクラスで展開されないかな…。
    →C/C++の#include的に動いてもらえればベストだったのですが、Moduleでもコード自体は解釈されてからincludeが発動するのですね…。
  2. ベースクラス作って、そこにbelongs_to書いて、
    :class_name => self.name
    みたいにすれば継承先のサブクラスでselfの部分を動的に解釈してもらえないかな…。
    →selfはベースクラスになっちゃいますな…。

今試していること:

  • belongs_toはサブクラス(実際にModel同士を連結するクラス)に記述する。その代り、コピペで済むように書式は全部統一し、:class_nameは
    :class_name => self.name
    にする。これで、車輪の再生産も最低限の労力で済む。
  • ベースクラスは、共通使用するテーブルの名前定義と、コーディング支援用の共通処理を書く場所にする。
  • テーブルに「どのMolelのデータか」を示す情報を書くところは、ベースクラスでダミーのメソッドを用意し、ベースクラスに実装したbefore_save()で呼び出す。
    あと、今使っているRailsがsave_before/afterが無い時代のもの(汗)なので、save()をオーバーライドしてこいつらを呼びだすところもベースに実装。これで、Railsをアップデートしたときに修正するところも少なくて済む。
    [2010.01.18 更新; よくよく見たらbefore/after_save()だった。動かないわけだよ…]
    (Railsもアップデートしないといけないんだけど、それやると動かなくなるコードがちらほらあって…(汗))

で、ざっくり以下のような感じ。手元には当然ソースなんて持ってきていないので、記憶から再コーディングですがー。なので細かいところははしょっているし、多少のミスは見なかったことで。

class Relation < ActionRecord::Base

  # 同一Modelごとに順序を保ちたいので、連番をつけてます。その最大値をとる。
  def max_relation_order
    max_rec = Relations.find( :first :condition => {
        :source_id => self.sorce_id,
        :related_id => self.related_id,
        :relation_class => self.relation_class    # これが格納しているデータのModelを示す
      }, :order => "relation_order desc" )
    return max_rec.relation_order
  end

  # Javaだとabstractの代わりに例外を投げるメソッドを書くのは普通だと思っているの
 # だけど、RonR的にはどうなんだろうね…。
  # 「コード読めばわかるだろ」的な思想は、コードを読まない/書かない/仕事しないを
  # モットーにしているサラリーマンプログラマがいる世界では通用しないので、却下。
  #
  # ユニットテストコードのほうで「set_relation_class()が存在すること」を強制すれば良い
  # 気もしてきた…。
  def set_relation_class
    raise "Please set relation_class!"
  end

  def before_save
    set_relation_class
    @relation_order = max_relation_order + 1
  end
end

class ProductRelations < Relations
  belongs_to :relation_source, :class_name => 'Product', :foreign_key => 'source_id'
  belongs_to :related, :class_name => 'Product', :foreign_key => 'related_id'
  # …conditionsでrelated_classを指定しないとダメかなぁ…。

  def set_relation_class
    @relation_class = 'Product'
  end
end

こんな感じだったかなぁ…。で、今ユニットテストで検証中、save()周りがちと怪しかった気がした…。

ProductRelationは、ほかにProjectRelationとかArchiveRelationとか色々…。リンク先レコードの実在証明はbelongs_toがしてくれたと思うし、その他の検査要素は値の範囲とかになるはずなので、validate()もベースクラスで共通化できるかも。

本当はRelationのユニークキーを複合キーにしたかったのだけど、複合キーのサポートはベータ版の機能を導入する必要があるのと、それが使っているRailsで動くのか不安があるのと、そもそもrelation_order以外全部キーにしないとレコードを一意にできない、という可能性に気付いて止めた。

#2010.01.19 更新

save_before/after→before/after_saveの間違い。ちなみにsave_before/afterはFSFikiあたりと誤認した可能性がちらほら。

| | コメント (0) | トラックバック (1)

Ruby on Railsのテーブル名とモデル名(モデルクラス名)を相互に変換。

Rails環境外でやりたいとき(や、挙動確認したかったので):

  • active_supportをrequire。具体的には、ライブラリの位置をgemから探し出してruby -Iに指定、その後require。
  • テーブル名→クラス名は、"table_name".classify。
    さらに、ここからインスタンスまで作りたいときは、model_obj = eval( "table_name".classify" ).new。
  • クラス名→テーブル名は、"class_name".tableize。
    たぶん、たいていはmodel_obj.class.name.tableize、とやることになりそう。
  • 詳細はActiveSupport::Inflectorのドキュメントを参照。ほかにも色々。

| | コメント (0) | トラックバック (0)

Rubyでオーバーライドしたメソッドを呼び出したい場合。

モジュールの場合は、上書きされる側をaliasで別名作って、別名で呼び出す。

クラスの場合は、super()で呼び出す。

…そう言えば、mix-inの結果として複数モジュールから同名メソッドを持ち込んでしまった場合は、どうなるのだらぅ?

| | コメント (0) | トラックバック (0)

RubyのMix-inにハマる。

えぇー、解決はしたんですがなんか有り得ないハマり方をしたので、記録。

Rubyでログ解析ツールを作るにあたり、Mix-inのやりかたを実践しようとして、まずは簡単なコードを書いたのです。

module TestModule1
  def test_method1()
    p "hoehoe"
  end
end

この程度。本当に誰でもできる簡単なお仕事。

で、まずは軽ーく実行してみようと思い、ruby -eでちゃちゃっとテストコードを書いてみた。

$ ruby -e 'include TestModule1; test_method1();'

…みたいな感じ。ちなみに、どのコードもうろ覚えなので、些細なことは気にせずに。

ハイ動きません。当然ですが。不可解なエラーが出まくりでした。

正しくは、こんな感じにしないといけなかったのです。

$ ruby -e 'require "testmodule1"
class TestClass1
  include TestModule1

  def initialize
    p "hogehoge"
  end
end

# main.
tester1 = TestClass1.new
tester1.test_method1()'

で、何が一番問題だったかと言うと、requireを忘れているとかそういうことではなくて。

「Mix-inっていうのはモジュールで定義したコードをクラスに導入することを言うんだ」

という事実に思い当らなかったこと(requireも最初意味がわからなかったけどさ)。

まぁRubyのリファレンスもちゃんと読まずに拾い読みだったのだけど、このあたりのことは、あまりに当然すぎるのか、モジュールの説明を全部読んでも載っていなくて。

なんというか、もう10年近くもC++とJavaをやってきたんだから、気付いて当然だろうという感じだったのですが…。なんで気付かなかったのかを思い返してみると、

「Rubyがオブジェクト指向言語ということをすっかり忘れていた」

これなんです。で、なんで忘れていたかと言うと、どうもあたしがRuby on RailsからRubyを始めており、さらに

「Ruby on Railsで手続き的なコードしか書いていなかった」

というのが根本にあった気がします。

RonRは本当に良くできているので、書くべきコードなんて個々のアクションだけ。

しかも担当しているWebアプリは、あらかじめ条件付けされたページごとに、表示すべきデータをDBから読む、といった程度の仕様なので、なおさら手続きに没頭することになるのです。まー、せいぜい文字列加工したり文字列加工したり文字列加工したりだね。

結果、スタンドアロンのツールを作るまでクラスやモジュールなんて作ろうとも思わなかったので。Mix-inなんてとんでもない感じだったので。

なにしろ、あたしが機能を追加するたびにコード量が半減していくようなありさまなので(改造の合間にコード整理をしているのです)。

ちなみに、今はそのツールも完成して、以後Mix-inやりまくっていますが。RonR上でも。

これはこれで、本当にこんなやり方して規約違反になっていないのか、という不安はあるのだけど…。いや、ApplicationHelperが肥大化しすぎたので、役割ごとにモジュール化しているのだけど。

思うに。

Ruby on Railsを手掛ける人は、まずRubyを一取りやるべきだねー、と<普通はそうだよ

てか、JSPに手を染めた時も、「なーんかバッチ処理書いているなー」という印象は強く持ったなぁ…ということを思い出したこの一瞬。

ちなみに参考書はこれらです。

さて試験は何時受けようか…。

てか、コードも後半分くらいにはなるんだよなー。今9割方コピペ状態が1組、というところまで抽象化を済ませたのだけど、最後の一手がめっさ面倒で…。

テスト?いやいやいや。はなっからわけのわからん状態になってるので、もはや手がつけられませんよ…。新規分ですらっ!

| | コメント (0) | トラックバック (0)

空気を読むのに1日、コーディングに10分。

Ruby on Railsは確かに便利な孫の手が数多く準備されているけど、その内部仕様理解に引っ掛かると、回復にめっさ手間取る。

今日は、has_belongs_to_manyで自動生成されるテーブルの名前が、あたしが作ったテーブル名と違うことに気付かず、1日のたうち回ってしまったとさ。

原因は、productsとprojectsの多対多関係を表現させるテーブル。

RonR的にはproducts_projects、あたし的にはprojects_products。

よくよく見ればアルファベット順に並べてあるだけで、あたしの命名も単に「そのときprojectsに注目していただけ」で特に理由もないのだけど。

問題は、エラーの原因がテーブル名にあることに気付けないエラーメッセージかと。
結局、エラー箇所だったSQLite3のアダプタにデバッグコード仕込んで、テーブル名を引きずり出して気付いたという…。
エラーメッセージにエラー原因を含めておいてよ…。

テーブル名を直して、10分コードを書けば、問題箇所はあっさり稼働状態に。
元々がテーブルレイアウトされてるアプリなので表示がめっさずれてるけど、まぁこんなのは後でもいいか。

| | コメント (0) | トラックバック (0)