2011年7月13日水曜日

Ruby Mix-inのタイミング(覚書)

Railsのプラグインを作成中に遭遇した問題を覚書にしておきます。

t.timestampsのような、任意の複数のカラムをまとめて作成する
処理を書いてしていました。

テーブルの新規作成時は
ActiveRecord::ConnectionAdapters::TableDefinition クラスに
独自のメソッドを追加すれば、db:migrate するときにカラムが追加されます。
これは問題ありません。

テーブル定義を変更する場合、例えばtimestampsは
ActiveRecord::ConnectionAdapters::SchemaStatements モジュールに実装されている
add_timestamps メソッドを呼び出しています。

ただし、この時のレシーバのクラスは
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
でした。(DBはPostgreSQLを使用しているので)

これと同じ処理(メソッド)を、上記のSchemaStatementsに追加したのですが、
メソッドがない・・・method_missing とおこられてしまった・・・

継承関係は下記の通り
>> ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.ancestors
=> [ActiveRecord::ConnectionAdapters::PostgreSQLAdapter, ActiveRecord::ConnectionAdapters::AbstractAdapter, ActiveSupport::Callbacks, ActiveRecord::ConnectionAdapters::QueryCache, ActiveRecord::ConnectionAdapters::DatabaseLimits, ActiveRecord::ConnectionAdapters::Quoting, ActiveRecord::ConnectionAdapters::DatabaseStatements, ActiveRecord::ConnectionAdapters::SchemaStatements, Object, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Dependencies::Loadable, Base64::Deprecated, Base64, Kernel]



試しに以下のようなプログラムを書いてみると・・・

#モジュールを2つ用意
>> module A
>> def a
>>  p "a"
>> end
>> end
=> nil
>> module B
>> def b
>>  p "b"
>> end
>> end
=> nil

#クラスを1つ用意 モジュールAをインクルード
>> class C
>> include A
>> end

>> c = C.new
=> #
>> c.a
"a"
=> nil
>> c.b
NoMethodError: undefined method `b' for #
 from (irb):39

#ここまでは特に問題なし

# モジュールAにモジュールBをインクルード
>> A.class_eval do
?> include B
>> end
=> A
>> A.instance_methods
=> ["b", "a"]

#Aのインスタンスメソッドに b が追加されました。


>> C.instance_methods.grep /^a/
=> ["a", "acts_like?", "as_json"]
>> C.instance_methods.grep /^b/
=> ["blank?", "breakpoint", "b64encode"]
#ところが、既にモジュールAをMix-inしてしまっていた クラスCには
メソッドb がありません・・・

>> class C
>> include A
>> end
=> C
>> C.instance_methods.grep /^b/
=> ["b", "blank?", "breakpoint", "b64encode"]

#あらためてモジュールAをMix-inすると、メソッドbが追加されました。
#Mix-inはインクルードするタイミングによって、期待したメソッドが追加されない
可能性があるようです。

ちなみに、Rubyのバージョンは 1.8.7 です。
・・・さて、どうしたものか・・・

2011年6月9日木曜日

Rails:ファイルの添付の覚書(DBへではなく、ファイルを保存)その2

前回はプラグインを使わず、ファイルアップロードを行いました。

今回は、carrierwave を利用した場合の例です。

まず、carrierwave をインストールします。
尚、Railsのバージョンは2.3.11です。
現時点のcarrierwaveの最新バージョンは 0.5.4 ですが、こちらはRails3用のようです。
以下の処理でインストールされたのは 0.4.10 でした。

#{RAILS_ROOT}/Gemfile
source :rubygems

gem 'carrierwave', '~>0.4.0'

$ bundle
Fetching source index for http://rubygems.org/
Installing carrierwave (0.4.10) 
Using bundler (1.0.10) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

少々待ちましたが、インストールされました。

$ ruby script/generate uploader attachment

app/uploaders/attachment_uploader.rb
が作成されます。

store_dirメソッドが自動生成されています。
こちらがファイルのアップロード先になります。
今回修正しました。

ちなみにSettingsは共通パラメータを設定するのに便利なsettingslogicをプラグインを導入し、外部のyamlファイルの設定を読み込めるようにしたものです。

 attr_accessor :sub_dir # 追加

  storage :file

  def store_dir
    #"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    Settings.upload_dir + "/#{sub_dir}"  # 追加
  end

Controller

私の場合、AttachmentUploaderクラスを利用するファイルで
carrierwaveをrequireする必要がありました。

require 'carrierwave'

  :

  uploader = AttachmentUploader.new
  uploader.sub_dir = @message.id.to_s
  uploader.store!(upload_file)

  :

Rails:ファイルの添付の覚書(DBへではなく、ファイルを保存)その1

Railsでファイルのアップロードの覚書

プラグイン(attacument_fu,paperclipedなど)を使わない方法

下記のコード例は、1画面で複数ファイルをアップロードする場合の例です。

VIEW

_from.html.erb



<% form_for @message , :url => { :action => action }, :html => {  :multipart => true, :id => 'message_form', :name => :message_form } do |f| %>
     :
      <% @message.attachments.each do |attach| %>
        <% if attach.id %>
          <% f.fields_for :attachments, attach do |attachment_form| %>
            <%= attachment_form.hidden_field :id %>
            <%= attachment_form.text_field :name %>
            Delete:<%= attachment_form.check_box :_destroy %><br />
          <% end %>
        <% else %>
          <% f.fields_for :attachments, attach do |attachment_form| %>
            <p>
            <%= attachment_form.hidden_field :id %>
            <%= attachment_form.label :path %>
            <%= attachment_form.file_field(:upload_data) %>
            </p>
          <% end %>
        <% end %>
      <% end %>
      :


Controller

    upload_files ||= []
    params[:message][:attachments_attributes].values.each do |attach|
      upload_file = attach[:upload_data]

      if upload_file
        upload_files << upload_file
      end

    end if params[:message][:attachments_attributes]

    respond_to do |format|
      if @message.save

        Dir.mkdir("#{Settings.upload_dir}#{@message.id}") if upload_files.count > 0
        upload_files.each do |upload_file|
          File.open("#{Settings.upload_dir}#{@message.id}/#{upload_file.original_filename}", "w+") { |f| f.write upload_file.read }
      end

2011年5月14日土曜日

herokuを使ってみる(覚書)

herokuとgit 初トライです。

Mackportsのアップデート
$ sudo port -d selfupdate

gitのインストール(Macの場合です)

$ sudo port install git-core

バージョン確認
$ git --version

Railsアプリのディレクトリに移動
$ cd

$ git init
カレントディレクトリに .git ディレクトリが作成される

ソースをコミット
$ git add .
$ git commit -am "first commit"

herokuのサイトでサインアップ
届いたメールでアクティベーション実施

heroku のインストール
$ sudo gem install heroku

heroku 上にアプリ作成
$ heroku create
※ちなみにアプリケーション名にアンダーバー _ は使えないようです

既に秘密鍵を持っていれば
$ heroku keys:add
で鍵を登録

なければ事前に
$ ssh-keygen -t ras
を実行しておく

git に remote を登録
$ git remote add heroku git@heroku.com:.git

これで、次のコマンドで heroku に push できるようになるはず

$ git push heroku masuter

$ heroku db:migrate
$ heroku open

本家のここを見ればほぼ分かると思います
http://devcenter.heroku.com/articles/quickstart

以上

2011年5月5日木曜日

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

今回はセッションをDBで管理するための設定を行います。

$ rake db:sessions:create

      exists  db/migrate
      create  db/migrate/20110505041507_create_sessions.rb

いくつか設定を変更する必要があります。今回Railsのバージョン 2.3.11 で行っていますので、古いバージョンの場合とファイル名などが一部異なる可能性があります。

config/enviroment.rbのRAILS_GEM_VERSIONパラメータが指定のバージョンになっているか。
(いくつかの古いバージョンの場合、バグなのか設定方法の違いなのかわかりませんが、
 CSRFの対策がされている箇所でエラーが発生することがあります。)

RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION

app/contorollers/application_controller.rbのprotect_from_forgery に
コメントがあれば外します。(私の環境では、はじめからコメントされていませんでした)
protect_from_forgery # See ActionController::RequestForgeryProtection for details

続いて、config/initializers/session_store.rbの以下の箇所のコメントを外します。

ActionController::Base.session_store = :active_record_store

では、はじめに実行したコマンドで、sessionsテーブルのマイグレーションファイルができていますので、rakeタスクを実行します。

$ rake db:migrate

PostgreSQLの場合、session_id列がstring型で作成されますが、デフォルトだと255byteとなるため、セッションのレコード作成時に、長さが足らず、エラーとなることがあるようです。
私の場合、手っ取り早くstring型をtextにしてしまいました。
(※その後、string型で、 :limit => 1024 に変更しました)

これで、セッション情報をデータベースで管理するようになるそうです。

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

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

2011年2月13日日曜日

VirtualBox メモ:CentOSの解像度変更

Oracle VirtualBoxをMacOSX上にインストールして、ゲストOSとしてCentOS5.4をインストール

以前も画面解像度の設定はしたつもりですが、800x640と640x480しか選択できなくなってしまっていました。

VirtualBox VM のメニューデバイス>Guest Additionsのインストールを選択します。
とくに何も起こらないのですが、おそらく /media/VBOXADDITIONS_3.2.12_68302というディレクトリがあるので、こちらに移動し、対象のシェルを実行します。

そこで
$ sudo sh ./VBoxLinuxAdditions-x86.run

わたしの場合、shを付けないと実行できませんでした。

再起動したら、一応解像度をいろいろ選択できるようにはなりましたが、ワイド画面には対応していないような・・・

2011年2月8日火曜日

iPhoneのタイマー機能でオフタイマー

最近、情報収集に海外のWebサイトを見ることが多い。
英語が苦手なので、正しく理解できているかがとても不安だし、ネイティブの情報源の豊富さがうらやましいかぎり。

少しでも英語に接する機会を増やそうと、iPhoneのアプリケーションで無料のNHK WORLDをインストール。
朝の通勤時に聞いたりしてます。このアプリで視聴できる番組と、できない番組とがあり、
放送が視聴できないなら、自動でオフにしてくれるといいのだけど。

そこで、ふとしたきっかけだったのですが、便利ツールの時計にタイマー機能があって、これをオフタイマーがわりにできることを発見。
ご存知の方も多いとは思いますが。

初めは、目覚ましがわりに、たとえば睡眠のレム睡眠とノンレム睡眠の周期は90分だから4時間半後とか、6時間後とかに設定して使っていました。
タイマー終了時は通常サウンドを指定すると思います。サウンドはいくつか用意されていますが、その一覧表の下、一番下ですね、ここに iPodをスリープ というのがあるんです。なぜiPodなのか?というのはここでは触れませんが。
これがオフタイマーになるんです。

2011年1月30日日曜日

写真:街灯(横浜 山下公園近く)

昨日は久々に知人と会い、みなとみらい周辺を散策しました。
山下公園の通り(名称があるのかな?)に横浜らしい、以前はこんなガス灯だったのかな・・・と思わせる街灯があったので、iPhoneでパチリ。

山下公園横の街灯

ちなみに上の写真は、背景が空(薄曇り)で、いわゆる逆光の状態になってしまっていたのですが、iPhoneの画面の暗めの所をタッチ(タップ)すると、そこに露出をあわせてくれるようです。ちょっと空が明るすぎてしまいまいたが。

山下公園近くの歩道に埋めてあるタイル

それから、足元を見ると、以前こんな街灯だったのかと思われるタイル(左下)を発見。
右下の子どもが書いたようなタイルは、明治〜昭和の時代にかけて走っていた市電でしょうか。

横浜大さん橋に寄港中の飛鳥II
 大きなクルーズ船も1枚。iPhoneは夜景もなかなか綺麗に撮影できます。

おなじみ赤レンガ倉庫

2011年1月27日木曜日

NetBeansでのRakeタスク db:create 実行について

NetBeansではどうもRakeタスクのdb:createがうまくいかないようですね。
私の環境は今回、WindowsXP、MySQL5、NetBeans6.9.1、Rails2.3.8、アダプタはjdbcmysqlを使用していました。

NetBeans上で実行して、コンソールにはエラーが出ませんがデータベースは作成されていません。
以前書いたRails:簡易辞書システムを作成しよう2ではMac環境でのコマンドラインでの実行方法を記載していますが、このあたりは色々と問題があるのかも知れません。
やはりRailsはIDEよりコマンドラインで!・・・ということでしょうか。

結局データベースは
>create database <db_name> default character set utf8;
と、コマンドで作成することになりました。

2011年1月25日火曜日

Rails:覚書 レイアウト(テンプレート)を適用する

Railsでページにレイアウトを追加する
例えば、オンラインストアのカタログページshopにテンプレートのレイアウトを適用したい場合、

/project名/app/views/layouts/shop.html.erb

を作成します。
shop は事前に controller と view が作成されているものとします。

ちなみにコントローラを作成する場合は scaffold ではなく、script/generate controller shop index で作成します。ここで index はアクションが指定されていない場合に index が呼び出される仕組みになっているからだそうです。
また、controller の作成を実行しても、view は作成されないので、例えば

/project名/app/views/shop/index.html.erb

<h1>手作り家具カタログ</h1>

<% for product in @products -%>
  <div class="entry">
    <%= image_tag(product.image_url) %>
    <h3><%=h product.title %></h3>
    <%= product.description %>
    <div class="price-line">
    <span class="price"><%= product.price %></span>
  </div>
<% end %>

を前もって作成しておかなければなりません。

shop.html.erb は例えばこんな感じです。


<html>
<head>
  <title>手作り家具工房 オンラインストア</title>
  <%= stylesheet_link_tag "depot", :media => "all" %>
</head>
<body id="shop">
  <div id="banner">
    <%= image_tag("logo.jpg") %>
    <%= @page_title || "手作り家具工房 商品" %>
  </div>
  <div id="columns">
    <div id="side">
      <a href="http://www.evanista.com">ホーム</a><br />
      <a href="http://www.evanista.com/faq">よくある質問</a><br />
    </div>
    <div id="main">
      <%= yield :layout %> #<=ここにindex.html.erbの内容が出力されます
    </div>
  </div>
</body>
</html>


スタイルシートを作成していないので、これではまだ不十分ですが、
http://localhost:3000/アプリケーション名/shop
にアクセスすると、テンプレートが適用されたページが表示されます。

2011年1月21日金曜日

Ruby:覚書(最大公約数を求めるメソッド)

Rubyを勉強しているので、最大公約数を求めるメソッドを作成したいと思います。
まずは約数を求めるメソッドを考えました。
単に余りが0となった値を取得してもいいのですが、計算回数をなるべく少なくしたいと思い、自分なりにアルゴリズムを考えました。(年なので頭を使うと疲れる・・・でもちょっとたのしいですね。自分で考えるというのは。)

整数の場合、必ず2で割り切れます。奇数の場合は2で割りきれませんが、2で割った商より大きい約数はないわけですね・・・。
ということで、

  • 対象は自然数なので、1は必ず約数となります。
  • 約数は2から確認を始めればOK
以下のメソッドdivisor_allを考案しました。 引数valが約数を求める対象です。


def divisor_all val
  result = [1] #1は必ず約数
  divisor = 2 #2で割って商を求める
  quotient = val/divisor
  while divisor < quotient #割る数と商を比較し商が割る数を下回った時点で終了
    if val % divisor == 0
      quotient = val/divisor
      result << divisor
      result << quotient
      p [result, divisor] #計算状況をとりあえずプリント
    end
    divisor += 1
  end
  result
end

こんな感じでいかがでしょうか。約数のみループさせるのではなく、余りが0のときは、商の方も約数になりますのでそれを取得しているのがポイントですね。

続いてこの約数を求めるメソッドを利用し、最大公約数を求めるメソッドです。


#最大公約数を求める
def common_divisor_max arr
  arr2 = []
  arr.each_with_index{|val, i| arr2 << (divisor_all arr[i])}
  p arr2 # 約数を確認するためプリント
  common_div = arr2.inject{|a1, a2| a1 & a2}
  common_div_max = common_div.sort.pop
end
ここで
p common_divisor_max [9, 12, 15]
を試せば、3が求められると思います。 Array#inject って一体どこで使うのだろうと思っていたけれど、こんなところで意外と使える・・・inject 

ユークリッドの互除法(2つの値の場合)

その後、ネットで調べてみると、ユークリッドの互除法というのがあるそうで・・・。

def gcd(n, m)

  n, m = m, n if m > n
  #p [n, m]

   loop {
    r = n % m
    break if r == 0
    n, m = m, r
  }
  m
end
2つの数値の最大公約数は上記のような処理で求められるらしい。

複数の(3つ以上の)自然数の最大公約数を求める

 配列に複数の自然数があった場合、やはりArray#injectが使えるようです。

arr = [30,120,15,60]
p arr.inject{|a, b| gcd(a, b)}

たったこれだけで済んでしまいます。

また、先に考えたものはいったんすべての公約数を求めているので、
その解を利用するなら使えそうです。

久々に勉強になりました。

2011年1月20日木曜日

Rails:簡易辞書システムを作成しよう2

今回想定しているエンティティは
  • ドメイン
  • 辞書
2つです。
辞書の名称(論理名)と物理名にはとりあえず一意制約を付けておきます。
class Dictionary < ActiveRecord::Base
  validates_uniqueness_of :logical_name
  validates_uniqueness_of :physical_name
end


次に、1つのドメインに対し、辞書の項目が複数対応する一対多の関係を持ちますので、その関連をModelに設定します。

#辞書
class Dictionary < ActiveRecord::Base
  belongs_to :domain
  
  validates_uniqueness_of :logical_name
  validates_uniqueness_of :physical_name
end

#ドメイン
class Domain < ActiveRecord::Base
  has_many :dictionaries
end
辞書にはドメイン1つが設定されます。
また、ドメインは複数の辞書項目が対応します。

 belongs_to :domain

のシンボル:domainは単数形ですが、

 has_many :dictionaries

の辞書は複数レコードとなるため、複数形のシンボル:dictionariesを指定します。

続いてViewを修正します。・・・がここでハマってしまいました。
WebでRailsのドキュメントhttp://api.rubyonrails.org/を参照していたのですが、Rails 3.0.3(当時)だったのです。
collection_selectメソッドの引数がどうもRails 2.3.xと異なっているようですね。

ドキュメントを見ながらnew.html.erb修正すると、以下のような感じ・・・

<p>
    <%= f.label :domain_id %><br />
    <%= collection_select(:dictionary, :domain_id, Domain.all, :id, :domain_name, :prompt => true) %>
  </p>


サーバログを見ると、プルダウンから値が取得できていない・・・。登録処理でNULLがインサートされてしまいました。

[4;36;1mSQL (0.0ms) [0m    [0;1mINSERT INTO `dictionaries` (`logical_name`, `physical_name`, `domain_id`, `data_type`, `data_digit`, `remark`, `created_at`, `updated_at`) VALUES('aaa', 'a', NULL, 'string', '', 'aaa', '2011-01-20 11:40:10', '2011-01-20 11:40:10') [0m

次に
f.collection_select(.....

に修正したら今度は

undefined method `merge' for :domain_name:Symbol

しばらく考え、Railsレシピブックを見直したところ、出ていました。引数が違う・・・
実は第1引数の :dictionary が不要でした。

<p>
    <%= f.label :domain_id %><br />
    <%= f.collection_select(:domain_id, Domain.all, :id, :domain_name, :prompt => true) %>

が正解だったようです。

テーブルの正規化など、他のテーブル(Model)の値をプルダウンで表示させたいことは多々あると思います。
頻繁に利用する機会も出てくるでしょう。

2011年1月17日月曜日

タイトルを整理

  • 2011-01-24 Rhodes関連の記事は「オープンソースを活用したい」に移動しました。
  • ブログを初めて1週間ですが、計画性もなく始めたので、タイトルを見直しします。まだ投稿件数も20件以下なので。

2011年1月16日日曜日

Rails:簡易辞書システムを作成しよう

システム開発において、やはりデータ設計がしっかりできていないと、後々仕様変更などで苦労するものです。また、技術者の異動や、ユーザ(お客様)も人事異動により業務やシステムを知らない人がシステムのユーザになることも頻繁にあると思います。

データ中心アプローチ(DOA)の専門家ではありませんので、それは専門の書籍などで理解していただきたいと思いますが、やはりユーザと技術者とで認識のズレ(齟齬)がないように辞書があったほうが良いですね。

開発工程が進むにつれて、技術者も増えるので、情報共有という点でもはやり辞書(データのリファレンス的な物)は必要ですね。

気が向いたので、JRuby on Railsの環境で構築することにしました。

まずはJRubyをダウンロード。環境はWindows XP。(この環境はいずれ変えてしまうかも知れません)

http://jruby.org/download からJRuby1.5.6をダウンロードしました。Rubyの1.8.7相当になります。(>JRuby  -v で確認)
JRuby1.6.0.RC1もリリースされているようですが、Ruby1.8.7相当の方でとりあえず十分だと思うのでまずはこのバージョンを選択。

またWindows環境なので、JRuby 1.5.6 Windows Executable (md5, sha1) をダウンロード。
exe形式の実行ファイルなので、インストールすると、Pathにインストール先のbinディレクトリ(Windowsの場合フォルダと言いますが、ディレクトリという文言を使用させてもらいます)が追加されます。

次に Rails をインストール。バージョンを指定しないと Rails 3.0 以上がインストールされてしまうようで、2.3.xを指定します。
今回はバージョン2.3.xで現時点で最新の 2.3.8 を指定しました。

NetBeansもインストールされている環境なので、NetBeans上でRailsの開発もできるのですが、今回敢えてコマンドラインから環境を作ることにしました。

>gem install rails --version 2.3.8
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Successfully installed activesupport-2.3.8
Successfully installed activerecord-2.3.8
Successfully installed rack-1.1.0
Successfully installed actionpack-2.3.8
Successfully installed actionmailer-2.3.8
Successfully installed activeresource-2.3.8
Successfully installed rails-2.3.8
7 gems installed
Installing ri documentation for activesupport-2.3.8...
Installing ri documentation for activerecord-2.3.8...
Installing ri documentation for rack-1.1.0...
Installing ri documentation for actionpack-2.3.8...
Installing ri documentation for actionmailer-2.3.8...
Installing ri documentation for activeresource-2.3.8...
Installing ri documentation for rails-2.3.8...
Installing RDoc documentation for activesupport-2.3.8...
Installing RDoc documentation for activerecord-2.3.8...
Installing RDoc documentation for rack-1.1.0...
Installing RDoc documentation for actionpack-2.3.8...
Installing RDoc documentation for actionmailer-2.3.8...
Installing RDoc documentation for activeresource-2.3.8...
Installing RDoc documentation for rails-2.3.8...

続いてデータベースはMySQLを使用するので、アダプタをインストールします。

>gem install activerecord-jdbcmysql-adapter
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Successfully installed activerecord-jdbc-adapter-1.1.1
Successfully installed jdbc-mysql-5.1.13
Successfully installed activerecord-jdbcmysql-adapter-1.1.1
3 gems installed
Installing ri documentation for activerecord-jdbc-adapter-1.1.1...

いよいよプロジェクトを作成します。
今回プロジェクト名はnew_windとしました。データベースはデフォルトだとSQLiteが指定されるようなので、mysqlを指定します。
でも、作成されるconfig/database.ymlのadapterにmysqlと指定されてしますので、これを生成後にjdbcmysqlに変更する必要があります。

>rails new_wind --database=mysql
      exists
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      create  config/locales
      create  db
      create  doc
      create  lib
      create  lib/tasks
      exists  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance
      create  test/unit
      create  vendor
      create  vendor/plugins
     途中省略
      create  log/development.log
      create  log/test.log

プロジェクトが作成できたら、カレントディレクトリをプロジェクトに移動します。
>cd new_wind

続いてデータベース作成です。
JRubyではなく、Rubyであれば >rake db:create で良いのですが、JRubyの場合、
>jruby -S db:create のように作成するようです。
ですが、このコマンドでデータベースを作成した場合、エンコーディングがutf8にならないようなので、mysqlのコマンドで作成しました。

mysql> create database new_wind_development default character set utf8;

あまり真面目に考えていないので、まず作成するテーブルは”ドメイン”と”辞書”の二つ。
ドメインはその項目が紐づく業務をしていします。例えば、販売管理、会計など。
辞書は項目、つまりデータです。名称(論理名)と、物理名、型、桁数、説明(備考)、ドメイン等を登録したいと思います。

では早速scaffoldで作成。(以下は辞書のテーブルの足場(scaffold)を作成)

>jruby -S script/generate scaffold dictionary logical_name:string physical_name:string dom
ain_id:integer data_type:string data_digit:string remark:text
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/dictionaries
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  test/unit/helpers/
      create  public/stylesheets/
      create  app/views/dictionaries/index.html.erb
      create  app/views/dictionaries/show.html.erb
      create  app/views/dictionaries/new.html.erb
      create  app/views/dictionaries/edit.html.erb
      create  app/views/layouts/dictionaries.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/dictionaries_controller.rb
      create  test/functional/dictionaries_controller_test.rb
      create  app/helpers/dictionaries_helper.rb
      create  test/unit/helpers/dictionaries_helper_test.rb
       route  map.resources :dictionaries
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/dictionary.rb
      create    test/unit/dictionary_test.rb
      create    test/fixtures/dictionaries.yml
      exists    db/migrate
      create    db/migrate/20110115075258_create_dictionaries.rb

続いてテーブルの作成。

>jruby -S rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
rake aborted!
The driver encountered an unknown error: com.mysql.jdbc.exceptions.jdbc4.MySQLSy
ntaxErrorException: Unknown database 'new_wind_development'

ここで、database.ymlのadapterにjdbcmysqlを指定したのに、jdbcドライバな無いと怒られてしまいました。
(実はデータベースも名前を間違えて作成してしまったので、その点も指摘されたメッセージが表示されています)

lib/jarディレクトリの下にJDBCドライバを配置しなければなりません。
jarディレクトリは存在しないと思いますので、jarディレクトリを作成し、その中にMySQLのドライバの含まれたjarファイルを置いてください。
気をとりなおして再度テーブルを作成。

>jruby -S rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
==  CreateDictionaries: migrating =============================================
-- create_table(:dictionaries)
   -> 0.0310s
   -> 0 rows
==  CreateDictionaries: migrated (0.0310s) ====================================

今度は成功。

続いてテスト用初期データ登録のためのmigrationを作成します。

>jruby -S
script/generate migration add_dictionary_data
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
      exists  db/migrate
      create  db/migrate/20110115075505_add_dictionary_data.rb

TODO:あとで、ここにテストデータのdb/migrate/20110115075505_add_dictionary_data.rbファイルの内容を追加します。

データ登録はmigrateの実行で行います。

>jruby -S
rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
==  AddDictionaryData: migrating ==============================================
==  AddDictionaryData: migrated (0.2970s) =====================================

これで、データが登録されました。
次は、ドメインを選択(プルダウン)で指定できるようにしましょう。

手作り家具:子供椅子 さまさまチェア

正月休みを利用して、嫁と娘(1歳)が実家に帰省していたのですが、戻ってきてしまいました・・・。
しばらく、家ではRubyを勉強することが難しいかも。
ということで、手作り家具の写真を・・・
(RubyやRailsの記事は少し進みが遅くなるかな)

これもEvanistaのこども椅子です。今までは小物の紹介でしたが、一応家具らしきものをこの度紹介。

やはり直接触れたりする家具は無垢がいいですね。
しっかりした作りで娘が成長したあとも、長く使えそうなので、椅子の役目が終わったら、植物を飾ろうかと思います。
Evanistaの無垢の子供椅子

違う角度から

2011年1月15日土曜日

手作り家具:小物の紹介2

今回も家具ではなく、小物たちの仲間になってしまいますが、「キーサス」と「ハイパーぼよよん」です。
いずれはEvanistaでダイニングテーブルを購入したいと思っているのですが・・・
キーサスとハイパーぼよよん
と 鎌倉みやげのくまちゃん
この写真もiPhone4で撮影してます。
もちろんキーサスとハイパーぼよよんはEvanistaの商品です。

2011年1月13日木曜日

写真:FinePix F100fd ズームエラーの対処

コンパクトデジカメを3年ほど前に購入しました。
10倍ズームが気に入って、富士フィルムのFinePix F100fdを購入することに。

画質は良い方だと思いますが、感度、スピードといった面ではやはりコンパクトデジカメ標準といった感じでしょうか。でも現在も活躍中です。

ところが、先日突然電源をいれたところ ズームエラー!が・・・
症状としてはレンズが飛び出したままになってしまい、電源をオフにしても、レンズが戻らずケースに収納できなくなってしまいました。

Webで同様の現象で対処できた人がいるか検索してみると、同じ症状に遭遇した方が・・・
  • レンズの先を少しこじるように(軽く)回してみる。(回りませんが)
  • 電源をオン・オフする。
で治ったとか・・・。
何度か繰り返したが全く治らず、諦めかけていましたが10分程度繰り返した頃でしょうか・・・
なんとレンズがちゃんとボディに収納され、復活。\(^o^)/
その後数ヶ月問題なく動作しています。

同様の症状に遭遇した方がいれば、修理の前にトライしてみてください。
個体差はあると思いますので、力を入れすぎて更に壊さないないように、くれぐれもご注意を・・・。

Rails:Ruby on Railsを始めよう

Railsの生産性は高いことは認めているのですが、Railsの哲学であるConvention over Configuration(設定より規約)の規約を多く覚えなければならない点がRails習得の壁でしょうか。

昔Javaのオブジェクト指向を理解するまでに時間がかかったことを思い出します。今となっては不思議なくらい苦しんでいましたが・・・。

Railsもなかなか苦労しています。絶対的にプログラミングに携わる時間も少なくなっているので・・・。

それでも A journey of a thousand miles begins with a single step 千里の道も一歩からですね。

Railsの入門(インストールなど)は他のサイトに任せて、実際にRuby on Railsでアプリケーションを作成する際のポイントを覚書として、綴っていこうと思います。

  • バリデーションはmodelに書く

Productモデルにtitle,description,image_urlは必須入力を指定します。

validates_presence_of
は宣言と呼ばれますが、実はメソッド。

class Product < ActiveRecord::Base
 validates_presence_of :title, :description, :image_url
end
上記設定で、入力しなければならない項目を、未入力のまま登録しようとすると下のようなエラーが表示されます。


  • テストデータはmigrationで。
モデルproductのテストデータを作成します。Productsテーブルには名称、説明、画像URL、価格の4つの項目があるとします。
まず、
> ruby script/generate migration add_test_data

   exists  db/migrate
   create  db/migrate/20110113140008_add_test_data.rb

続いてdb/migrate/20110113140008_add_test_data.rb を編集します。

self.upメソッドに登録するデータを、self.downに登録したデータを戻す処理を記載します。
この場合upメソッドで一度Productテーブルのデータを削除してから、テストデータを登録しています。


class AddTestData < ActiveRecord::Migration
  def self.up
    Product.delete_all
    Product.create(:title => 'Cycoron', 
                    :description =>
                    %{<p>Wooden dice with bell.</p>},
                    :image_url =>'/image/Cycoron.jpg',
                    :price => 28.5)
                    
    Product.create(:title => 'Moguzilla',
                    :description =>
                    %{<p>Wooden pen stand.
                      It looks like a whale.</p>},
                    :image_url => '/image/Moguzilla.jpg',
                    :price => 168.0)
  end

  def self.down
    Product.delete_all
  end
end

データを削除する場合、マイグレーションのバージョンを指定しますので、
> rake db:migrate:down VERSION=20110113140008
を実行すれば、テストデータが削除されます。
また、データベースを最新の状態に戻すには
> rake db:migrate
を実行すればOK。

試したコンソールは次のような感じです。(削除も試し、再度マイグレーションを実行)

*****-no-MacBook-Pro:depot *****$ rake db:migrate:down VERSION=20110113140008
(in /Users/*****/NetBeansProjects/depot)
==  AddTestData: reverting ====================================================
==  AddTestData: reverted (0.0037s) ===========================================

*****-no-MacBook-Pro:depot *****$ rake db:migrate(in /Users/*****/NetBeansProjects/depot)
==  AddTestData: migrating ====================================================
==  AddTestData: migrated (0.0217s) ===========================================

一覧画面

2011年1月11日火曜日

手作り家具:小物の紹介

今回は創作工房 Evanistaのアイテムを2つ紹介。

1つ目「もグジラ」
鯨のような形をしているからとのこと・・・

今度知人が社長に就任することになったので、個人的なお祝いの品としての候補の1つです。

続いて、「鈴入りサイコロ」
うちの1歳の娘のお気に入りです。目の数を一生懸命教えているのですが、まだわからないようです・・・

この写真はiPhone4で撮影しましたが、室内で白熱電球(電球色の電球型蛍光灯)の下、暗めの部屋でもまあまあ撮影できます。

2011年1月10日月曜日

Ruby:エディタについて

Rubyの学習は、お気に入りのテキストエディタとRubyの実行環境があれば良いようです。
今のところNetBeansを中心に、なるべくSmultronというテキストエディタを併用して、rubyのコマンドを覚えることにも注力しています。

私の場合はJavaの経験が長かったため、はじめはEclipse+Rubyのプラグイン(RadRails)を使っていました。
しかし、最近Eclipseの重さが気になっていたことと、書籍「JRuby on Railsシステム構築入門」でNetBeansが紹介されていたこともあり、NetBeansも試してみることにしました。
これが意外と軽く、Eclipseと多少メニューの違いはあるものの使い勝手もわるくないので、最近はこちらをメインに使用しています。

また、書籍「RailsによるアジャイルWebアプリケーション開発第3版」ではMac用エディタとしてTextMateが紹介されていましたが、有償版であったためパス。
そうこう調べてみるとSmultron(スムルトロン?)というエディタがあるとのことで、「RailsによるアジャイルWebアプリケーション開発第3版」のサンプルアプリ作成はSmultron(バージョン3.5)でトライしたいと思います。

どうやらバージョン3.8からはフリーではなく、有償になってしまったようです。
Smultronでerbファイルを編集
Smultronでrbファイルを編集

NetBeansに話を戻すと、NetBeansには組込みJRuby1.5.1があり、デフォルトではこれがRubyプラットフォームとして指定されています。
Railsのアプリケーションを作成する場合、ターミナル(Windowsのコマンドプロンプト)からscriptを実行する必要がでてくることも多く、パスにこのNetBeansのJRubyの実行ファイルを指定すれば問題ないと思います。
JRubyでもRubyでもどちらでも構わない方は、Rubyをプラットフォームに指定したほうがいいと思います。
プロジェクト毎にRubyプロジェクトなら、
プロパティ>実行>Rubyプラットフォーム
Railsプロジェクトなら
プロパティ>Rubyプラットフォーム
で指定できます。

ThinkPad X40のSSD化

6年ほど前になるでしょうか・・・B5サイズのX40を購入し使い続けていましたが、MacBook Pro MC374J/Aに移行しました。Windowsも必要なときがあるので、こちらは仮想マシンを使用して対応しています。

でも最近SSDも安価になってきたので、X40をSSD化できなかと思い、ウェブで検索してみるといくつか事例が。HDDが1.8インチで、44pinと特殊?なのか、SSDも種類は限られており、金額も高め。新しいPC(MacBook Airとか・・・)、を買ったほうが良いか迷いましたが、エコにもなるし・・・とSSD化することにしました。

購入したSSDは株式会社アスク販売元のHANA Micron社製。型番はH4PM064G-10。インタフェースはIDE(パラレルATA)。容量は64GBです。

これは取り出したあとのHDD。HITACHI製。



X40の左手前にあるHDDを取り外し、SSD換装しました。私の場合、何の問題もなく換装は完了。これまでOSはWindows XPでしたが、Windows7をインストールすることに。
ただ、CPUがPentiumMのため、64ビット版は対応していないようで(メモリも積めないし)、32ビット版をインストール。事前にウェブで同じことにトライされている方のHP http://blogs.itmedia.co.jp/satohiroshi/2010/01/855gm-video-dri.html を参考にビデオのドライバもインストール。
こちらのかたもInstall 8XXGM Series Video Driver on Windows 7 - Tutorial (英語)を参考にされたようです。
ここからビデオドライバをダウンロードし、記載の手順通りに行うのですが、Intel(R) Graphics Controller 6.14.10.3732 (Windows)(Sleep Mode Fixed)(Thx to pc84) ではない方のドライバをインストールしたら、スリープモードが利用できず・・・対応していると思われるドライバをインストールしたら、休止、スリープ共に利用できるようになりました。

はじめは起動時間の速さに驚きましたが、徐々にドライバを追加していくと、それなりに時間もかかるようになりました。それでもHDDの時と比べものにならないくらい早く起動できます。
起動から、ログインしてカーソル横のくるくるが消えるまで約2分程度。

起動後の画面

私はスピードマニアではないので、ベンチマークなどは行っていませんが、Windows7のコントロールパネルに「パフォーマンスの情報とツール」というメニューがあり、こちらでマシンのパフォーマンスがわかるようです。(見づらくてすみません)
グラフィックスは1.0と表示されています。きっと遅いということですね。
X40 SSD換装後
ただ、古いPCは画面解像度や、CPUパワーも数世代前・・・。
デスクトップ上で右クリックしてプロパティを表示させるのにCPU負荷が100%になり、少々もたつきを感じます。
メモリも1.2G程度しか積めないので、使用用途を検討中です。しばらくWindows7の使い方を勉強したらその後は、Linuxにでもしてサーバ勉強用マシンとするか・・・。

多少延命はできますが、X40など古いPCのSSD化を検討されている方は用途を良く考えてからどうぞ。私の場合、最近のPCを購入したほうがよかったかも知れません・・・。

ちなみにデスクトップでビデオカードHD5670(ATI)を乗せたi5 760のマシンはこんな感じです。


ディスクアクセスについてはSSD(ATA)とSATAのHDD(HITACHI 7200rpm 1TB)がいい勝負でした。
SSDはかなり頑張ってくれているようです。

そういえばWindows Vistaにはほとんど触れることなくWindows7になってしまいましたが、同じような方も多くいらっしゃることでしょう。

[2011-02-19 追記]
その後、タワー型のPCにVMware ESXi4.1 U1をインストールしたので、そのクライアントとして利用る予定です。

2011年1月9日日曜日

写真:iPhoneフォトコレクション(1)

2010年10月に遅ればせながらスマートフォンデビューをしました。
一眼レフも持っていますが、重いので相当気合が入らないと持ち歩かなくなってしまって・・・

一方携帯電話は常に持ち歩いているので、手軽にブログ用の写真を撮影できますし、iPhone4の写真の画質もなかなかなので、iPhone4の標準ののカメラ機能で撮影した写真を中心に、時折 Nikon D300 と、コンパクトデジカメ 富士フィルム FinePix F100fd も混ぜながら掲載していきたいと思います。

ところでiPhoneの写真をPCのブログに載せるには、iPhoneでブログを編集すればと思いましたが、iPhoneのSafariからは撮影した写真をBloggerのエディタでアップロードすることができず(ファイルを選択できなかった・・・方法を知らないだけか・・・)、PCで行うことに。
PCはRubyの勉強用にもいいかなと思い購入したMacBook Pro。これで本記事を編集してますが、PC版のSafariは何の問題もなく写真をアップロードできました。
ただ、そう単純ではなく、iPhoneから写真をPCに取り込むにはiPnoneとiTunesで同期を行う必要があるようです。
iTunesのデバイスで接続したiPhoneを選択し、メインの画面の右上の「写真」のボタンが表示されているので、それをクリック。
さらに表示された画面の「写真の共有元」にチェックを入れると、同期が動き出しました。

まずは1つ目を

昨年秋に江ノ島の近辺で撮影した夕焼けです。iPhone4で撮影。




こちらは一眼レフ(Nikkon D300)で撮影

Ruby:勉強のために購入した書籍

Rubyを勉強しようと思ったきっかけは、最近Ruby on Railsを採用しているオープンソースのアプリケーションが増えてきている点。実際にサンプルアプリの作成を通じて、Railsの生産性の高さ、拡張性(プラグイン化)から、今後必ず企業向けアプリケーションのプラットフォームとしても「伸びる」と感じたからです。

ここ4ヶ月くらいで、次の書籍を購入しました。
これからRubyの習得を始めようとする方の参考になればと思います。

  • たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
  • JRuby on Railsシステム構築入門
  • メタプログラミングRuby
  • Railsレシピブック 183の技
  • RailsによるアジャイルWebアプリケーション開発第3版(読書中 '11/1月)
入門書は特に何でも良いかも知れませんが・・・2冊目はDB Magazineのシリーズで、私のお気に入りのため選びました・・・と言いたいところですが、たまたま立ち寄った書店にあったのを手にとったことも。
この「JRuby on Railsシステム構築入門」は参考書籍が詳しく書かれていて、そのなかで「メタプログラミングRuby」や「RailsによるアジャイルWebアプリケーション開発第3版」が頻繁に出てきたため、気になり書店で手に取りました。
Railsに携わる人は、「メタプログラミングRuby」でRubyの魔術を勉強しましょう。
この本が最も疲れる・・・けど為になると思いました。

[2011-02-15 追記]
ここ面白かったです。
http://www.atmarkit.co.jp/news/201009/13/spell.html


2011年1月8日土曜日

Ruby:認定試験 合格への道

これまでJava一筋(JDK1.0.2の頃から)で来ましたが、これまであまり見向きもしてこなかったRubyを極めたいという思いが強くなり、まずは認定試験(銀)を受けることにしました。

すでに現役のプログラマーではないので、今更感は否めませんが、すこしずつRubyの知識を深めていくと、なかなか興味深い仕様もあり、Javaにはない新鮮さというか、楽しさというか、とにかく仕様を理解していくのが楽しく感じられました。
これまでの知識では理解するのに苦労するところもありますが、これからRailsも含め、習得していきます。

尚、正式な試験番号と名称は以下の通りです。
  • RY0-100
  • Ruby技術者認定試験(Ruby Association Certified Ruby Programmer Silver)
勉強期間は、試験勉強としては1ヶ月程度。Rubyトータルで4ヶ月程度か・・・
主に次の参考書で試験対策。
  • Ruby技術者認定試験 公式ガイド
あとはRuby本家のドキュメント。

次は、Gold RY0-200 と今後行われるRailsの試験も狙いますか・・・