« 2008年1月 | トップページ | 2008年3月 »

2008年2月

2008年2月26日 (火)

はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-2(5章)

1. Databaseの中にTableを作成

> ruby script/generate  migration create_schedules
> vi [RAILSROOT]/db/migrate/001_create_schedules.rb
class CreateSchedules < ActiveRecord::Migration
  def self.up
    create_table(:schedules) do | table|
      table.column(:datetime, :timestamp)
      table.column(:title, :string)
      table.column(:content, :text)
    end
  end

  def self.down
    drop_table(:schedules)
  end
end

> rake db:migrate

> mysql scheduler_development -u rails -p
mysql> show tables;
+------------------------------------+
| Tables_in_scheduler_r2_development |
+------------------------------------+
| schedules                          |
| schema_info                        |
+------------------------------------+
2 rows in set (0.01 sec)

どうなったのかは、[RAILSROOT]/log/development.logを確認。

2. scaffold(Contoroler, View, Model雛形作成)
(Rails2.xから、scaffolding pluginとして分離されたという情報があったが、私の環境では何もいれなくても使えてしまった。)

Model名を指定(1文字目は大文字、Modelの元になるDB Tableの単数形)。

> ruby script/generate scaffold Schedule



Another migration is already named create_schedules: db/migrate/001_create_schedules.rb

さっそく、エラー…。
調べてみると、Rails2.xからは、migrationファイルが先に存在すると、scaffoldに失敗するようです。
"--skip-migration"オプションをつければ、scaffoldが最後まで行きます。

ex).
> ruby script/generate scaffold Schedule --skip-migration

3. Test

> rake

特に問題なし。

4. 動かしてみる

WEBrickを立ち上げて
http://localhost:3000/schedules/listにブラウザでアクセス。

今度は、
ActiveRecord::RecordNotFound in SchedulesController#show
って、エラーが…。

scaffoldが出すログをきちんと見てれば、わかりきったことなんですが、listはありません。
また、標準でアクセスされるのが、listではなく、indexに変わってます。

http://localhost:3000/schedules/にアクセスすると、本に近いものが出てきます。
この辺りも微妙な差異が…

しかも、Newをクリックしてもフィールドが何もありません。
rails1.xまでは、Tableの全てのフィールドがViewに含まれていたのが、rails2.xからは明示的に指定しないと反映されません。
後から、いじるので無駄ということでしょうか?
本と同じ感じにするには。

> ruby script/generate scaffold Schedule datetime:timestamp title:string content:text --skip-migration

これは、多分、migrationファイルをいじらなくても、

> ruby script/generate scaffold Schedule datetime:timestamp title:string content:text

みたいにやれば、migrationファイルも自動生成されるってことですね~。
多分…。

本では、ここから、scaffoldのカスタマイズとして、
[RAILSROOT]/app/contorollers/schedules_contoroller.rb
編集に入りますが、見事にlist関数なぞありません。

ここからは、listをindexに読み替える必要があるようです。
index関数を書き換え、本にあわせます。

今度は以下のエラーが…。
NoMethodError in SchedulesController#index
undefined method `paginate' for #<SchedulesController:0x8c3c99c>

rails2.xから、paginateもplugin化され、分離されています。
pluginを探すには、以下のようにする。

> script/plugin list

ここで、またエラー。

> script/plugin list
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27: command not found: svn ls svn://rubyforge.org/var/svn/expressica/plugins/

svnコマンドを使うには、subversionがいる。(これは別記)

> ruby script/plugin list | grep paginate
will_paginate                 http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/will_paginate/
will_paginate                 svn://errtheblog.com/svn/plugins/will_paginate/

> ruby script/plugin list | grep classic
classic_pagination            http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/classic_pagination/

classic_paginationはメンテされてないらしいので、will_paginateの方がいいということですが、差異が結構あるので本にあわせて進むなら、classic_paginationの方がいいでしょう。

ruby script/plugin install will_paginate

使い方は[RAILSROOT]/vendor/plugins/will_paginateのREADMEとかを見ます。

> vi [RAILSROOT]/app/contorollers/schedules_contoroller.rb
  def index
#    @schedules = Schedule.find(:all)
#
#    respond_to do |format|
#      format.html # index.html.erb
#      format.xml  { render :xml => @schedules }
#    end

# classic pagination & old paginate
#    @schedule_page, @schedules = paginate(:schedules, :per_page => 10)

# will_paginate
#     @schedules = Schedule.paginate(:page => params[:schedules], :per_page => 10)
     @schedules = Schedule.paginate(:page => params[:schedules], :per_page => 30, :order => 'datetime DESC')
  end

p75のテストデータは"schedule1:"、"schedule2:"、"schedule3:"
ではなく、"one:"、"two"、"three"で書かないと、
下記のようにテストデータにoneがないと怒られる。

$ rake
1) Error:
test_should_destroy_schedule(SchedulesControllerTest):
StandardError: No fixture with name 'one' found for table 'schedules'

p77のデザインのカスタマイズでapp/views/layout/schedules.rhtmlを
編集するよう書いてあるが、rails2.xのscaffoldが作るファイルは.rhtmlから.html.erbに変更され、各Viewの中身を表示する"<%= @content_for_layout %>"の部分は、"<%= yield %>"に変更されている。
意味は変わらないようだ。

追記: scaffoldの引数のところで、本来"datetime:timestamp"であるはずが"datetime:times tamp"になってました。orz

参考文献 : はじめようRub on Rails 高橋征義 監修 かずひこ、喜多川豪著 ASCII 刊

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

2008年2月25日 (月)

はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-1(4章)

※ railsはinstallする時にversionを指定できますので(gem install rails --version [VERSION NO]等)、それに従ったほうが学習は捗るかと思います。(本にはversionを指定するように書いてあります。)

環境
DB   : mysql 5.0
ruby : ruby-1.86
gem : ruby18-gems-1.0.1
rails : 2.0.2

1. Databaseの用意

mysqlを特にoptionをつけずにinstallしているので、"character set utf8"をoptionを付けてDatabaseを作成。(development、test、production用をそれぞれ作成)

ex).
> mysql -u root mysql -p
mysql> create database scheduler_development character set utf8;
mysql> grant all privileges on scheduler_development.* to 'rails'@'localhost' identified by 'PASSWORD';

2. Projectの作成

(Rails2.xから標準データベースがSQLite3に変わったので、database optionにmysqlを指定)

> rails scheduler --database=mysql
/usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:379:in `report_activate_error': Could not find RubyGem activeresource (= 2.0.2) (Gem::LoadError)

いきなりエラー…。
gemのactiveresourceVersionがあわないらしい。

# gem install activeresource
Successfully installed activeresource-2.0.2
1 gem installed
Installing ri documentation for activeresource-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...

> rails scheduler_r2 --database=mysql

今度は問題なし
Project作成に使ったDirectoryの下にProject名のDirectoryが出来て、そこがRAILSROOTになる。

Databaseのアクセス設定

> vi [RAILSROOT]/config/database.yml

user、password以外は、変更なし。
encodingまで、utf8が既に入ってる。

本では、[RAILSROOT]/config/environment.rbに、$KCODEの設定するよう書いてあるが、私の環境では、特に足さなくても問題はなかった。

参考文献 : はじめようRub on Rails 高橋征義 監修 かずひこ、喜多川豪著 ASCII 刊

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

2008年2月20日 (水)

Subversion

Subversionのインストールが意外にてこずったのでメモ
サーバーとして動かすには下調べが足りてない。

# portinstall subversion



buildconf: checking installation...
buildconf: python not found.
           You need python installed
           to build APR from SVN.
*** Error code 1

Stop in /usr/ports/devel/apr-svn.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall.1356.4 env make
** Fix the problem and try again.
--->  Skipping 'devel/subversion' because a requisite port 'devel/apr-svn' failed (specify -k to force)
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! devel/apr-svn (unknown build error)
        * devel/subversion

apr-svnでpythonが見つからないってことらしい。

# portversion -v | grep python
python25-2.5.1_1            =  up-to-date with port
# which python
python: Command not found.

# which python2.5
/usr/local/bin/python2.5

pythonないが、python2.5はある。
エラーを出している所を探してみる。

# cd /usr/ports/devel/apr-svn
# cd work
# grep "You need python installed" * -r
apr-1.2.8/build/buildcheck.sh:echo "           You need python installed"
# cd apr-1.2.8/build
# less buildcheck.sh

python=`build/PrintPath python`
if test -z "$python"; then
  echo "buildconf: python not found."
  echo "           You need python installed"
  echo "           to build APR from SVN."
  exit 1

ここで、pythonを置き換えてるから、ここで上手く引ければいい?
link張ってしまえばいいかな…。

# cd /usr/local/bin
# ln -s python2.5 python

# ls -la python2.5
-r-xr-x--x  1 root  wheel  944164  1 24 08:14 python2.5*
# ls -la python
lrwxr-xr-x  1 root  wheel       9  2 19 17:35 python@ -> python2.5
# cd /usr/ports/devel/apr-svn
# make install

今度は問題なし。

# cd /usr/ports/devel/subversion
# make install clean
Options for subversion 1.4.6_1
  [ ] PERL              Perl bindings
  [ ] PYTHON            Python bindings
  [X] RUBY              Ruby bindings
  [ ] JAVA              Java (JavaHL) bindings
  [ ] MOD_DAV_SVN       mod_dav_svn module for Apache 2.X
  [ ] APACHE2_APR       Use APR from Apache 2.X
  [X] NEON              WebDAV/Delta-V repository access module
  [X] BDB               db4 repository backend
  [ ] ASVN              Build and install Archive SVN (asvn)
  [ ] MAINTAINER_DEBUG  Build debug version
  [ ] SVNSERVE_WRAPPER  Enable svnserve wrapper
  [ ] BOOK              Install the Subversion Book

/usr/local/etc/pkgtools.confのMAKE_ARGSに追記

        'devel/subversion' => [
          'WITH_RUBY=yes',
        ],

今回は、railsのplugin listを動かす為なのでRubyのみチェック。
apache2、mod_dav、java辺りは事前にそっちを整えないとmakeがこけます。

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

2008年2月15日 (金)

gem update Memo

Railsを入れてから、だいぶ時間がたってしまった。
Gemまでは、Portsで管理できているが、Rails等のGEMSのパッケージは
gemコマンドで管理しなければならない。

といっても、実際には"--source"オプションを使ったもの以外は、下記コマンドで簡単にupdate可能。

# gem update [options]

上記の場合、defaultのserverから引ける、installされているgemをすべてupdate。
少し、変わってるのは、updateしてもold versionがuninstallされないこと。

古いversionで、GEMパッケージを動かすには

$ rake _[GEM VERSION]_
ex.)
$ rake _0.7.2_

互換性等で問題なければ。

# gem cleanup [GEMNAME]

で、old versionはunistallされる。

個別のupdateは

# gem update GEMNAME [options]
ex.)
# gem update rails

localに何がinstallされているかは

# gem list

最新versionを調べたい時は。

# gem list [GEMNAME] -r

先頭一致で検索できるみたい。

各コマンドのオプション等はリファレンスマニュアル(英語)を参照。

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

2008年2月13日 (水)

screen + TeraTermPro(UTF-8)

Makeしている間、loginしている端末の方を切りたいと思うことが何回かあって、screenを思い出した。

packageを使って入れたのだが、portsのconfigureの画面とかが崩れる。

TeraTerm側で、TrueTypeのフォントを使ってるので崩れるのか、設定文字数が不味いのかとか思ったのだが…。
screenを使わなければ、特に崩れない。

ScreenのUTF-8環境でのマルチバイト対応に問題があるらしく、CJKパッチ(Chinees/KoreanJapanese)をあててないとダメな模様。

<ports>でのScreenのOptionメモ

[X] CJK        Treat CJK ambiguous characters as full width
[X] INFO       Build and install info documentation
[X] MAN        Build and install man pages
[X] NETHACK    Enable nethack-style messages
[ ] XTERM_256  Enable support for 256 colour xterm

読めないほどではないが、上書時に前の文字がちょっと残る…。

これで、screenもpackageが使えないほうに仲間入り。

/usr/local/etc/pkgtools.conf のMAKE_ARGSに以下を追記

        'sysutils/screen*' => [
          'WITH_CJK=yes',
        ],

追記(20080218)
Koshianから、コメントでterminfoの内容をTeraTermに合わせよと、アドバイスを頂いた。

確認してみるとscreen起動前後で、環境変数TERMの内容に差異がある。

> echo $TERM
vt100

> screen
> echo $TERM
screen

> env | grep TERM
TERM=screen
TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\




で見てみると、TERMCAPという環境変数が足されている。

まず、TERMを設定することにし、~/.screenrcにterm vt100を設定してみたり

>  screen  -T [TERMNAME]

とかで、設定してみるとTERMは変わり、画面の挙動も変わる。

TeraTermの設定と同じvt100にすると、Portsの設定画面は妙な色で見難かったものが2色になり見易くなったが、Portsの設定画面のカーソルがずれたり、文字がずれたりする。
再描画時に文字が残るのも変わらない。

しかし、vimは妙な色のまま。

screenが環境変数TERMCAPに、ゴリゴリ設定を書き込んでて
それが、上手く行ってない模様。

manのtermcap(5)を参考に~/.screenrcにtermcapや、terminfoで設定を書き込んでみるも、envでみると設定は変わっていない…。

CJKオプションを外して、入れなおしたりしてみたが、TeraTermに関しては、今のところCJKオプションをつけて、TERM無指定が、文字残り以外の問題がでず、一番マシ。

でも、これだと、端末上でmltermや、xterm上のPorts設定で文字が消える…。
CJKオプションを切って、TERMをxtermに指定してやると色に多少問題あるもののマトモになるが、TeraTermの方はvt100を設定してもすごいことに…。

継続足掻き中。

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

Ports 覚書

最近はportinstallやら、portupgradeやらに頼りきりなので、portsの場所を探すとか、PortsのOption再設定のしかたとかが、あやふやに…。(核爆)
ということでメモ。

<Portsの探し方 name(名前で検索)、key(キーワードで検索)

# cd /usr/ports
# make search name="ports name"
# make search key="keyword"

<PortのOption再設定>

# cd /usr/ports/"Ports Category & Name"
# make config

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

2008年2月12日 (火)

KURE 556 CM

ここのところ、KURE 556のCMは面白いです。

いくつかのバリエーションがあるようですが、私がお気に入りなのは2つ

一つは、ねずみが錆で固着したナットの上で立ち往生してるところへ、556を一吹き。
すると、みるみるナットが回りだし、ねずみが、まるで回し車の使うハムスターみたいに必死に走る。

もう一つは、ジッパーが渋くて、動かないところへ、556を一吹き。
たちまち、ジッパーの取っ手が道路を走る車のように走り出します。
後ろからは、スピード違反を咎めるようなサイレンとともに、もう一つのジッパーの取っ手が…。

商品のコンセプトとかも、わかりやすくていいですね~。

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

2008年2月 5日 (火)

セキュリティ 覚書

最近、portまで打って固まる(爆)ので、覚書

○ Portsツリーの更新

# portsnap fetch && portsnap update

※ 上記はportsnap2回目以降の手順で、導入時は以下の操作が必要

# portsnap fetch && portsnap extract && portsnap update

設定File /etc/portsnap.conf


○ Portsセキュリティ確認

# portaudit -Fa

○ 更新されたPortsの確認

# portversion -vL=

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

« 2008年1月 | トップページ | 2008年3月 »