2011年4月17日日曜日

Railsで簡易予約システムを考える(2)

前回に続いて、簡易予約システムを作成していきます。

予約状況がわかる画面を作成します。
予約情報はModel bookingに対応しますが、自動生成された画面をこのまま使うのはユーザビリティの面で少々難がありそうです。

まずは一週間の予約状況が一覧で確認できるような画面をイメージしてみます。
縦方向には、予約対象が並び、横方向(左から右へ)に今日から7日間分の予約状況が表示されるようにしてみたいと思います。

画面名(コントローラ名)はweekly_infoにしてみます。

$ ruby script/generate controller weekly_info index

最後のindexは、URLの指定をcontroller名まで指定した場合、デフォルトのアクションがindexとなっているため指定しておきました。
$ ruby script/generate controller weekly_info index
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/weekly_info
      exists  test/functional/
      exists  test/unit/helpers/
      create  app/controllers/weekly_info_controller.rb
      create  test/functional/weekly_info_controller_test.rb
      create  app/helpers/weekly_info_helper.rb
   identical  test/unit/helpers/weekly_info_helper_test.rb
      create  app/views/weekly_info/index.html.erb

最後に、Viewのindex(画面)が作成されています。対応しているモデルがないので、中身はこんな感じです。

WeeklyInfo#index

Find me in app/views/weekly_info/index.html.erb


さて、いままで、ジェネレータに大分助けていただきましたが、ここからは、コーディングが必要になってしまいます。

ここで、考えが変わって、このページの名称(Controller)をweekly_info から booking_info に変更しました。
自動生成されたファイルの名称を全て変更すれば、問題ないようです。また、サーバを起動中の場合は、再起動しないと反映されないかも知れません。

それから、データベースのカレンダーのViewを作成しておきたいと思います。
おそらくいずれ何かの役に立つと思いますので。

$ ruby script/generate migration create_utility_numbers 
を実行し、マイグレーションファイルを作成します。
これを次のように編集します。

class CreateUtilityNumbers < ActiveRecord::Migration
  def self.up
    create_table :utility_numbers do |t|
      t.integer :num
    end

    (1..100).each do |i|
      UtilityNumber.create(:num => i)
    end
  end

  def self.down
    drop_table :utility_numbers
  end
end
このテーブルは1〜100までを持っているだけのテーブルです。

いよいよVIEWの作成ですが、今回はPostgreSQLを使用しています。
RDBMSによって、方言があるので、ここはDBによってそれぞれ用意するしかないと思います。
良い方法があれば、ぜひご教示を。

class CreateWeeklyCalendarView < ActiveRecord::Migration
  def self.up
    execute %{
      CREATE OR REPLACE VIEW weekly_carender_view AS
      select date_val as sun,
        date_val + 1 as mon,
        date_val + 2 as tue,
        date_val + 3 as wed,
        date_val + 4 as thu,
        date_val + 5 as fry,
        date_val + 6 as sat
      from (
        select to_date(y_val || m_val || d_val, 'YYYYMMDD') as date_val from
          (select to_char(num, '00') as d_val
          from utility_numbers
          where num < 32) td,
          (select to_char(num, '00') as m_val
          from utility_numbers
          where num < 13) tm,
          (select to_char(num + 1970, '0000') as y_val
          from utility_numbers) ty
      ) t
      where date_part('dow', date_val) = '0'
      order by date_val;
    }
  end

  def self.down
    execute %{
      DROP VIEW weekly_carender_view;
    }
  end
end

2011年4月10日日曜日

Railsで簡易予約システムを考える

3.11の後、しばらく更新していませんでしたが、久々にメモがわりに書いています。

Railsで簡易予約システムを考えてみます。

エンティティ

• リソース系
予約対象:item

予約対象グループ:item_group
仕様:specification
仕様カテゴリ:spec_category

予約状況:booking_status

• イベント系

予約:booking

その他、基本的なユーザ、カレンダー、料金が発生する場合は、利用料などを管理するマスタ(対照表)、承認が必要なら・・・など、考えれば考えるほど出てきてしまうのですが、簡易予約システムという(言い訳)ことで・・・とりあえずここ辺からスタート。

リソース系(マスタ)が多いので、すべてscaffoldで一旦作成します。

その前にアプリケーション名はbookingとしてみます。

プロジェクトの作成

$ rails --database=postgresql booking

データベースの作成
今回、PostgreSQLを利用しています。

database.yml のユーザ、パスワード等を指定し、

$ rake db:create

を実行します。

続いてscaffoldでひと通りジェネレート
$ ruby script/generate scaffold item name:string item_group_id:integer spec_id01:integer spec_id02:integer description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold  item_group name:string spec_category_id01:integer spec_category_id02:integer description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold specification name:string spec_category_id:integer deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold spec_category name:string description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold booking_status name:string deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold booking user:string item_id:integer start_date:date end_date:date status:integer comment:text

デフォルトで作成されたModelにデータの関連を追加します。
主な関連は次のとおり

item [n] - [1]item_group
item_group[n] - [1]spec_category
spec_category[1] - [n]specification
item[n]-[1]specification

itemには仕様(specification)を2つまで指定でき、仕様の種類は、itemのグループによって決めたいと思います。そのため、
item[n]-[1]specification
としていても、条件で絞りこまなければならないのですが、そのへんは後で考えたいと思います。

続いて、使い勝手を少し改善しましょう。
画面にIDがそのまま出てしまうのは、人間が操作するのに厳しいので、名称が出るようにMode、View、Controllerを修正します。

Modelには、has_manyや、belongs_toを指定します。
また、itemのように1つのモデルに2つまで関連する項目を指定するときは、belongs_to にアソシエーション名をつけ、:class_name、:foreign_keyのオプションを指定します。
Viewはテキストフィールド(f.text_field)の箇所を、プルダウン(f.select)に変更します。

Model


class Item < ActiveRecord::Base
  
belongs_to :item_group
  
belongs_to :specification01,
  
  :class_name => 'Specification',
    
:foreign_key => 'spec_id01'
  ・・・

View
<=% f.select(:item_group_id, ItemGroupsController.item_group_list) %>

Controllerに追加するクラスメソッド(self. が付きます)
def self.item_group_list
    ItemGroup.find(:all).map do |item_group|
      [item_group.name, item_group.id]
    end
  end

item の一覧画面と、登録画面は次のような感じでできました。




次は予約画面の作成を行って見ます。

2011年3月9日水曜日

VMware ESXi 4.1 U1 を GB H55M-D2H(ゲストOSがWindowsのHTTP400エラー対策)

VMware ESXi 4.1 U1をGigabyte H55M-D2Hで動かしていますが、オンボードのNICはM/Bのマニュアルを見ると、Realtek製のRTL8111D/Eらしい。

最初にインストールしたOSはCentOS 5.5 これは特にネットワークの問題はなかったのですが、その後WindowsServer2008R2をインストール。
インストール後にWindows Updateを実行してもエラーが発生してしまい、ファイアウォールの設定やら、IEのESCの設定やらいろいろ試したのですがインターネットに接続することができませんでした。
ブラウザでWindows Updateや http://www.google.co.jp/ にアクセスしても HTTP 400エラー、Bad Request となってしまい・・・

WindowsServerのセキュリティが厳しいのか???
と思い、一度Windows7をインストールしてみることに・・・
ところがこれも同じエラーが発生。

Google先生に聞いても日本には答えてくれるところがなく・・・
英語のサイトをあさっていたところ、解決策にたどり着きました。

このあたりにヒントがありました。

http://www.vm-help.com/forum/viewtopic.php?f=17&t=1525
http://www.vm-help.com/forum/viewtopic.php?f=12&p=7412#p7412

ダウンロードした oem.tgzはこれです。
トライは念のため自己責任でお願いしますね。
http://www.vm-help.com/forum/download/file.php?id=400
私はダウンロードしたファイルをリネームし、USBの元のoem.tgzと差し替えました。

これは(名前から)RTL8169のドライバのようなのですが、Windows7(x64)、WindowsServer2008(x86)、WindowsServer2008R2 でインターネットに接続できることを確認できました。
ここにたどり着くまで、ハマって2日くらい棒に振りました・・・

前回紹介したドライバではゲストOSがCentOSでは問題なかった(機能していた)ものの、私の環境ではゲストOSがWindowsでは動かないということだったようです。

おかげさまで、IntelのNICを買い足さなくて済みました。
同じような境遇で悩まれた方の解決策になればと思います。

2011年2月19日土曜日

VMware ESXi 4.1 U1 を GB H55M-D2Hにインストール(結局USBメモリブート)

VMware ESXi 4.1 U1 を GIGABYTE H55M-D2Hへのインストールにトライしていましたが、インストール時にうまくインストールイメージを作成できなかったようで、諦めました。
こちらhttp://fukushimaya2.blog103.fc2.com/blog-entry-13.html のサイトをだいぶ参考にさせていただいたのですが・・・
ハマったのは、インストーラが起動しても、SATAのハードディスクを認識させることができず、BIOS設定でAHCIモードにする必要があったようです。

また、↓このサイトも参考になりそうだったのですが、今ひとつうまくいきませんでした。
http://www.jayakumar.org/esx/pxe-boot-vmware-esxi-4-1-and-manual-install/

結局以下のようなステップでUSBメモリブートにすることに。
そのほうがメリットも多いらしいので。
  1. https://www.vmware.com/jp/tryvmware/index.php?p=free-esxi&lp=1 から
    ESXi4.1 U1をダウンロード(ユーザ登録が必要)
  2. http://www.winimage.com/download.htm からWinImageをダウンロード
    NICが対応していないため、インストールイメージをカスタマイズします。
  3. http://www.si-linux.co.jp/wiki/silinux/index.php?DDforWindowsをダウンロード
    インストールイメージをUSBに導入するツールとなります。
  4. http://www.vm-help.com/esx40i/customize_oem_tgz.php から対象となる
    oem.tgzをダウンロードします。
    今回OnBoadのLANがRealtek8111なので、"Adds support for Realtek 8168 / 8111 NICs and the Intel P55 SATA (8086: 3b22) controller"の方を使用しました。

手順はいろいろなサイトに出ていると思いますので、そちらを参照ください。
USBブートディスクは約900MB利用するようなので、1GB程度のUSBメモリが必要。
私は数年前に購入したものがあったので、そちらを利用しました。


また、USBメモリに4つのパーティションが作成されますので、oem.tgzの差し替えの際はWindowsマシンでの編集はできない(私が知らないだけ?)ようです。
私はMacで編集しました。


一応起動まではこぎつけました。
次は仮想マシンの構築ですね。

2011年2月15日火曜日

CentOS 5.5 に Ruby 1.8.7をインストール(rpm作成編)

CentOS 5.5 に Ruby 1.8.7をインストールします。今回はrubyのrpmパッケージを作成します。

前回既に導入されているruby1.8.5関連のパッケージは削除しました。

参照させていただいたサイトはこちら

RPMforgeリポジトリ導入(RPMforge)
http://centossrv.com/rpmforge.shtml 
CentOS 5.2 上で Ruby の環境を整える
http://moimoitei.blogspot.com/2008/08/centos-52-ruby.html
CentOS本家のサイト
http://wiki.centos.org/AdditionalResources/Repositories/RPMForge?action=show&redirect=Repositories%2FRPMForge#head-5aabf02717d5b6b12d47edbc5811404998926a1b

では始めましょう。

yum-prioritiesプラグイン導入

# yum -y install yum-priorities
# vi /etc/yum.repos.d/CentOS-Base.repo (編集)
=========================================
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1

#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons
#baseurl=http://mirror.centos.org/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1
=========================================
(青字箇所 追加)

RPMForge導入

RPMforgeのGPGキーインストール
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

↓↓こちらの方法では何故かうまくいきませんでした。一旦ファイルをダウンロードしてから実行してもインストールできませんでした。
# wget http://dag.wiees.com/rpm/packages/RPM-GPG-KEY.dag.txt 
# rpm --import RPM-GPG-KEY.dag.txt

RPMforge packageのダウンロード
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

一応ベリファイ
# rpm -K rpmforge-release-0.5.2-2.el5.rf.i386.rpm
rpmforge-release-0.5.2-2.el5.rf.i386.rpm: (sha1) dsa sha1 md5 gpg OK
RPMforgeのインストール
# rpm -i rpmforge-release-0.5.2-2.el5.rf.i386.rpm

checkinstall のインストール

# yum --enablerepo=rpmforge install checkinstall
rpmbuildのインストール(後でない!と怒られた)
# yum install rpm-build 
 
ruby ダウンロード  $ make dir ~/src
 $ cd ~/src
 $ make dir ruby1.8.7
 $ cd ruby1.8.7
 $ wget wget http://core.ring.gr.jp/archives/lang/ruby/1.8/ruby-1.8.7-p330.tar.gz
 ※ ftpが利用できなかったので、ミラーサイトからダウンロード
インストール
 $ tar -xf ruby-1.8.7-p330.tar.gz
 $ cd ruby-1.8.7-p330
 $ ./configure --prefix=/usr
 $ make

checkinstall を実行しようとした際、
  /usr/sbin
がpathに設定されていないので・・・見つけるのに時間がかかった・・・# /usr/sbin/checkinstall --fstrans=no
# rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.8.7-p330-1.i386.rpm
ところが、今回は一度ruby1.8.7をインストールしてしまっているせいか、依存性の欠如なるエラーが発生。

# rpm -ivh /usr/src/redhat/RPMS/i386/ruby-1.8.7-p330-1.i386.rpm 
エラー: 依存性の欠如:
        /usr/bin/ruby は ruby-1.8.7-p330-1.i386 に必要とされています

# rpm -ih --nodeps /usr/src/redhat/RPMS/i386/ruby-1.8.7-p330-1.i386.rpm
########################################### [100%]
########################################### [100%]
 

以上でインストール完了。
いつもの
# ruby -v
ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-linux]
でバージョンを確認します。

ついでに  RubyGemsのインストール
$ mkdir ~/src/rubygems
 $ wget http://rubyforge.org/frs/download.php/74234/rubygems-1.5.2.tgz
 # /usr/sbin/checkinstall -R "ruby setup.rb"
 # rpm -ih /usr/src/redhat/RPMS/i386/rubygems-1.5.2-1.i386.rpm
########################################### [100%]
########################################### [100%]

わたしの場合、何故か error.rb がrpmパッケージでインストールされず、前回rubyをインストールした時のように、やり直ししました。
# make install
すると以下のように、ライブラリが増え、RubyGemsが無事インストールできました。
発生したエラーは loaderror で yaml/error が見付からないというものでした。

# ls /usr/lib/ruby/1.8/yaml
baseemitter.rb  dbm.rb       loader.rb     stream.rb    tag.rb       ypath.rb
basenode.rb     encoding.rb  rubytypes.rb  stringio.rb  types.rb
constants.rb    error.rb     store.rb      syck.rb      yamlnode.rb 

これでひとまずRubyの開発環境が整いました。

VMware ESXi 4.1 U1 を GB H55M-D2Hにインストールできない

GIGABYTE H55M−D2H に ESXi 4.1 Update1をインストールしてみたが、インストール途中でエラーとなります。

主な構成は
MB: GIGABYTE H55M−D2H
HDD: HITACHI製 SATA 1TB
光学ドライブ: PATA DVD-RW
CPU: Intel Corei5 650
メモリ:2GBx2
です。

CDを外付けUSBドライブにしてみたり、NICをPCIのIntel 100Mのカードに変えたりと試してみましたが、ダメでした。

有益な情報もなく(見つからない・・・)、どうもCDドライブがPATAでないとエラーがでるなどの記事を見かけるのですが。DVDドライブをどこかで調達して試してみようと思います。

しばらくはWindows Server2008 R2でもインストールして、勉強したいと思います。

また、進展があれば追記します。

[2011-02-19 追記]
結局USBブートにしました

2011年2月14日月曜日

CentOS 5.5 に Ruby 1.8.7をインストール

CentOS 5.5にはruby1.8.5がインストールされていますが、オープンソースのアプリケーションを実行する場合に、1.8.7を要求される場合が多いので、1.8.7をインストールしてみます。

Webサイトで検索するといろいろと出てきましたが、わたしはソースからコンパイルしてインストールしました。不具合等でたら、随時記載していこうと思います。

手順は以下のとおり。

ダウンロード
http://www.ruby-lang.org/ja/downloads/


ソースのディレクトリ作成
# cd /usr/src
# mkdir redhat
# cd redhat
# mkdir /SOURCES

ソースアーカイブのコピー
# cd SOURCES
# cp /ダウンロードディレクトリ/ruby-1.8.7-p330.tar.gz

インストール
# tar -xvf ruby-1.8.7-p330.tar.gz
# cd ruby-1.8.7-p330
# ./configure
# make
# make install
# ruby -v
ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-linux]

・・・とやってみたのですが、やはりrpmでの管理を行いたいので、
やり直します。

どっちにしても、ruby1.8.7は残すのでこのまま残し、既にインストールされてしまっているruby1.8.5を削除します。

# yum remove ruby ruby-devel ruby-libs ruby-mode

インストールの続きは別途。