ホーム ブログ ページ 68

rubyの便利ツールirbをカスタマイズしてみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今回は、rubyやruby on railsの便利ツールであるirbをカスタマイズしてみた。

カスタマイズする前の注意点

RubyGemsが必要になるのでインストールしておくこと

カスタマイズしてみた環境windows xp
ruby 1.8.6
rubygems 0.9.4
rails 1.2.6

irbを便利に使うためにrubyプラグインを導入するメソッドがわからないときに教えてくれる素敵なプラグイン
gem install what_methods

rubyプラグインをirb起動時に有効にするために.irbrcをホームディレクトリなどに定義する今回は下記のような.irbrcを作成した。
require ‘rubygems’

#shellのように TAB でメソッドを補完出来るようにする
require ‘irb/completion’

# what? でメソッドを調べることができるようにする
require ‘what_methods’

require ‘pp’
IRB.conf[:AUTO_INDENT]=true

#shellの↑で履歴をたどれることができるようにする
IRB.conf[:SAVE_HISTORY]=200

rubyプラグインwhat_methodsの使い方下記のように使えば使うべき関数を教えてくれる
例)文字列を数字に変えてくれる関数が知りたいとき
irb(main):001:0> “1234”.what? 1234
“1234”.to_i == 1234
“1234”.to_f == 1234
=> [“to_i”, “to_f”]

まとめirbにおいてTab補完、関数検索、履歴をたどることができるようになった。

実行モード ”environment”設定の基本

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、oneafter999です。

今回はRuby on Railsにおける実行モード(environment)についてご説明します。
基礎中の基礎ですが、おさらいの意味も含めて簡単に記述してみます。

実行モードとは?

Railsでは、アプリケーションを動かす時には必ず実行モードを指定することになっています。
実行モードを切り替えることで、環境によって異なる設定(DBやサイトURLなど)を切り替えることができます。

実行モードの種類

デフォルトで用意されているのは以下の3つです。
・開発 developmetn 開発時に利用するモード
・テスト test テスト時に利用するモード
・運用 production 運用時に利用するモード
これ以外にも、自分で独自に実行モードを追加することができます(別途解説)。

設定ファイル

実行モードの設定ファイルは”config/environments”ディレクトリの中にあります。
実行モードごとにファイルを作成します。
“development”モードの設定ファイルは”config/environments/development.rb”といった感じです。

実行モードの指定

“script/console”やマイグレーションを実行するとき、実行モードを何も指定しないと”development”で実行されてしまいます。
ですので、これらを実行するときは必ず実行モードを指定します。
“$ RAILS_ENV=production ruby script/console”といった感じです。

独自の実行モードの作成

デフォルトで用意されている実行モードの他にも、自分で独自に実行モードを作ることができます。
<作成方法>
・”database.yml”に作りたい実行モード名で設定を加えます
・”development.rb”をコピーするなどして、作りたい実行モード名の設定ファイルを作成します

注意点

実行モードの設定は、2度読み込まれるようになっています。
ですので、重い処理やメール送信などの処理は記述しない方がいいでしょう。
Rails初期化時に読み込まれる設定ファイルの中に、”after_initialize”というものがあります。
こちらは1度しか実行されないので、2度実行されて困る処理はこちらを利用することができます。

以上です。

実行モードが2度読み込まれることなどは、今回調べてみて初めてしりました。

奥が深いですね。

JRubyを触ってみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして もっぱらJava開発の方が多い marumoruです。

今回は、「JRuby」について、導入方法(OS:Windows)を書きたいと思います。

そもそもJRubyとは? 

JavaVM上でRuby言語を動作可能にするもので

Javaの処理速度、安定性と、Ruby,Railsの生産性のいいとこどりを狙っているらしい

RubyからJava / JavaからRubyの呼び出しが可能らしい

↑イマイチ分かったようでよくわからん為、インストールしてみる

インストール方法

1.JDKインストール (JDKインストール方法は省略・・・ 注Java SE 1.4.2以降で)

2.JRubyダウンロード (今回は、ver1.0.1 を選択)

3.ダウンロードしたJRubyファイルを解凍し、任意の場所におく

4.環境変数にJRuby(解凍したファイル)内のbinフォルダをパスに通す

以上で完了!

ざっくりと書きましたが、以外と簡単!

バージョン確認 

コマンドプロンプトにて>jruby -v

 Rubyのバージョンが表示されれば、成功です。

動かしてみる

おきまりの「こんにちは!世界!(直訳)」をやってみる

jruby、jirbコマンドを使って、java,ruby記述でそれぞれ書いてみる

・jruby (rubyコマンドみたいなもの)

任意の場所に以下を記述したファイルを作成 (ファイル名:hello.rb)puts ‘Hello World!!’ 

コマンドプロンプトより、作成したファイルがあるディレクトリへ移動し以下を実行jruby hello.rb

・jirb (rubyでいうとこのirbコマンドみたいなもの)

コマンドプロンプトにて

>jirb

irb(main):001:0> require ‘java’

=> true

irb(main):002:0> import ‘java.lang.System’

=> [“java.lang.System”]

irb(main):003:0> System.out.println(‘Hello World!!’)

Hello World!!

=> nil

Java,rubyでそれぞれ記述してみたが、ほほうって感じ

Railsを入れてみる

続いて、jrubyにrailsをインストールしてみます。

rubyには、”gem”というパッケージ管理コマンドがありますが

jrubyについても同様にコマンドが存在します。jruby -S gem install rails –version 1.2.6 –include-dependencie

(今回は、ver1.2.6を指定)

RoRアプリの作成方法についても、railsとほぼ同じです。jruby -S rails test_jruby

→今回「test_jruby」というアプリ名となります。

コマンドプロンプトより、作成されたtest_jrubyフォルダ内に移動し以下のコマンドを実行jruby script\server

ブラウザにて、以下のURLを入力し、ページが表示されることを確認http://localhost:3000/

Welcome aboard のページが出たら成功です。

触ってみての感想  

Java、Rubyをやったことがある人には、非常にとっつきやすそうというのが素直な感想でした。

ただ色々調べていて、まだまだ発展途上であるようです。(verからもわかるとおり・・・)

しかし、Ruby,Javaのいいとこどりは、魅力的でもあります。

今回は導入のみで初歩的なことのみでしたが

次回には、実際にTomcat上で、Railsアプリの動作させる方法等を

ここに書けたらと思います。(いつになることやら)  

mongrelとの戦い〜503エラー?mongrelが死んだってことさ…

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

mongrelがあまりにも死ぬのでdeploy恐怖症にまでなった初心者のmaiです。

mongrelってよく死にますよね。
体感的には10回restartしたら1回はダメになる感じです。
つい昨日もmongrelは沈黙しました。
もやしっこめ。

 そんなもやしっこmongrelを叩き起こす方法の一つを拙いながらもご紹介します。

Capistranoを使ってDeployすると、mongrelは自動でrestartしてくれるわけですが、
そのときの正常なログは↓のようなカンジ。

 ** [out :: 192.168.0.1] stopping port 3000
 ** [out :: 192.168.0.1] stopping port 3001
 ** [out :: 192.168.0.1] starting port 3000
 ** [out :: 192.168.0.1] starting port 3001

スッキリです。
mongrelの目覚めもバッチリです。
いつもこの調子で頑張ってほしいものです。

とはいえ、もやしっこのmongrelはたまにスッキリ立ち上がりません。
そのときのログはこちら。

*** [err :: 192.168.0.1] ** !!! PID file tmp/pids/mongrel.3000.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3000.log for errors.
*** [err :: 192.168.0.1] ** !!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start.
*** [err :: 192.168.0.1] ** !!! PID file tmp/pids/mongrel.3001.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3001.log for errors.
*** [err :: 192.168.0.1] ** !!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start.
 ** [out :: 192.168.0.1 stopping port 3000
 ** [out :: 192.168.0.1] stopping port 3001
 ** [out :: 192.168.0.1] starting port 3000
 ** [out :: 192.168.0.1]
 ** [out :: 192.168.0.1] starting port 3001
 ** [out :: 192.168.0.1] 

あきらかにエラー。
startingとかいってるけど、どっからどう見てもmongrelが生きてるとは思えません。
それでも一応、実は以外と元気です、というオチもあるかも!と思って
ブラウザで確認してみるも、当然のように503エラーです。

現実逃避はやめて、素直にエラー文を見てみると、

PID file tmp/pids/mongrel.3000.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3000.log for errors

どうやら、「mongrel.3000.pid」というファイルを作ろうとしたけど、
すでに同じ名前のファイルがあったために作れませんと言いたいようです。

そこでサーバにある「tmp/pids/mongrel.3000.pid」というファイルを確認。
アプリのルートディレクトリまで行くと見つけられるはず。

[hogehoge pids]$ ls
mongrel.3000.pid  mongrel.3001.pid

いました。
このファイルたちはいてはいけない人たちなので、ご退場願います。

rm mongrel.300*

これでスッキリ。
lsコマンドで、pidsがカラッポになったのが確認できます。

最後にmongrelをstart。

 ** [out :: 192.168.0.1] starting port 3000
 ** [out :: 192.168.0.1] starting port 3001

 今度はスッキリパッチリ目覚めました。
ブラウザでも動作が確認できたので、mongrelの復旧作業はこれで終了。

今回学んだこと。

・mongrelはpidによって管理されている…らしい(学びきれてない)
・pidのファイルが居座ってると、killしたところでmongrelは復活しない…らしい
・エラーが起きたときは奇跡に頼らず、素直にエラー文と向き合うが吉

 今回気づいたこと。

mongrelってつい「mogrel」って打ってしまいがち。
…私だけ?

sshでrootログインの禁止

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして。sakuma85です。 

この前覚えました、sshでのスーパーユーザー(root)権限での 、
ログイン禁止の方法をご紹介します。
サーバー乗っ取られ防止の初歩的な対策です。

 (注意:ssh先にroot以外のユーザーがいないと、sshログインできなくなっちゃいます。)

実行環境はubuntuです。
とりあえず、sshをいれるところから始めます。
コンソールを開いて、以下を実行です。

# su –
# apt-get install ssh
これでsshができるようになりました。
インストール直後はrootでsshログインできます。

実行結果root@ooooo:~# ssh 192.168.x.xxx
root@192.168.x.xxx’s password:
root@xxxxxx:~#


sshd_configを編集し、rootでのログインを禁止します。# vi /etc/ssh/sshd_config 

 
開かれたファイルのPermitRootLogin yes 

の行をPermitRootLogin no

にします。 

編集作業はこれでお終いです。

sshを再起動します。# /etc/init.d/ssh restart

rootでsshを試してみます。 root@ooooo:~# ssh sakuma@192.168.x.xxx
root@192.168.x.xxx’s password:
Permission denied, please try again.
root@192.168.2.119’s password:

何回パスワード入力しても失敗です。

普通のユーザーでsshしてみます。root@ooooo:~# ssh sakuma@192.168.x.xxx
sakuma@192.168.x.xxx’s password:
sakuma@xxxxxx:~#

できました!

database.ymlの設定方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。kimiです。

今回は、”config/database.yml”の設定方法について紹介します。

Railsでは、「ActiveSupport + Railties」が使うDBの設定を”config/database.yml”に記述します。

それでは、自分のDB環境に合った設定を行いましょう。

まず、”config/database.yml”に接続情報を記述します。

記述方法は各DBによって若干変更があります。
デフォルトではMySQL用の設定ファイルが用意されています。

また、”config/databese.yml”はプロジェクト作成時に指定したDB用の設定ファイルが作成されます。
MySQL以外のDBの場合、各項目を1から記述するのが面倒であれば、

もう一度プロジェクトを作り直すことで作成されます。


最初に各モードについて簡単に説明します。

■development
開発時に利用するモード
Webサーバーの既定もdevelopmentになっています。

■test
テスト時に利用するモード

■production
本番時に利用するモード
本番は開発環境より早く動作します。


これらの記載はWebサーバーを起動する際にどれを使用するか選択できます。
まず、ここではdevelopmentだけ記載しましょう。

記述例(MySQLの場合)


  development:
  adapter: mysql
  database: doruby_development(データベースを指定)
  host: localhost(接続先を指定)
  username: root(ユーザー名を指定)
  password: ****(パスワードを指定) 

日本語を使う場合は、さらに”encoding”オプションで文字コードを指定します。

 encoding: utf8

データベースへの接続は以上です。

おまけ

データベースの作成方法です。

ログイン

mysql -u root -p
Enter password: ******

既存のデータベースを削除

mysql> drop database doruby_developmemnt;
Query OK, 20 rows affected (1.91 sec)

データベースの作成

mysql> create database doruby_developmemnt;
Query OK, 1 row affected (0.01 sec)

以上、初歩的な設定方法の紹介となりましたが

最後までお付き合い頂き、ありがとうございました。

それでは、BIG(toto)がキャリーオーバー中なので夢を買ってきます!

HeartBeatの設定

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちわ!tacchiです。

Ruby on Railsを利用した、サイト構築で利用したので、HeartBeatの設定について書きます。

HeartBeatで何をしようとしているかというと、2台のサーバで共通のRailsプロジェクトを利用して、各々のサーバでmongrelプロセスを立てようとしてました。

nfsでやればいいじゃねーかと仰るかもしれませんが、設定している方が落ちちゃったら両方のプロセスがダメになっちゃうんですよね。


ちょっとややこしいですが、DRBDパーティション単位での同期を取って、HeartBeatでDRBDをクラスタリングしようと考えました。というか、自分が考えたわけではないですが・・・

前回説明した、DRBDはPrimaryとSecondaryがあり、それをHeartBeatで切り替えちゃおうとしています。
では説明に入ります。

以下クラスタリングしたいサーバに設定して下さい。例では、hogeweb01とhogeweb02の2台です。

検証環境

  CentOS5
  heartbeat-2.1.2

設定例

1.まず、HeartBeatのインストール(両サーバ)
 $ yum install heartbeat 
本サイトからソースダウンロードして入れる手もあります。   

2./etc/ha.d/ha.cfの変更(両サーバ) ※HeartBeatの設定ファイルです
変更したのは赤字にしているやつです。ldebugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 1
deadtime 10
warntime 5
initdead 120
udpport 694
bcast  eth0            # Linux
auto_failback on
node hogeweb01          # host名
node hogeweb02          # host名

###########################
#
#       Unusual options.
#
###########################
use_logd yes

3./etc/ha.d/authkeysの変更(両サーバ) ※これは、通信認証用のファイルです。
auth 1
1 sha1 HI!

4.authkeysファイルの属性を600にする必要があります(両サーバ)
$ chmod 600 authkeys
5.DRBDとの連携(両サーバ)
hogeweb01 10.0.0.160/24 drbddisk::r0 

# hogeweb01はプライマリになるマシン
# 10.0.0.160/24はDRBDのリソース
# drbddisk::r0はDRBDのディスク
6.HeartBeatの再起動(両サーバ)
$ /etc/init.d/heartbeat restart 
7.テスト
 hogeweb01のHeartBeatを停止して、hogeweb02のDRBDがPrimaryになっていれば成功です。DRBDの確認方法はこちら
$ /etc/init.d/heartbeat stop 

まとめ

DRBDがプライマリ側のみしかマウントできないため、このPrimaryとSecondaryの切り替えは、非常に役立ってます。さらに、nfsを自動的に設定してくれたり、切り替わったタイミングでメールを飛ばしてくれたりできますが、今日はここまで。。。

Rails導入でRuby標準クラスへ追加される関数達(String編)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 Ruby on Railsでは、Webフレームワーク機能以外にも、Ruby標準のクラスなどに関数の追加なども行われます。これらの関数は便利な割にそんなに知られていない気がするので、紹介してみようかな~と思います。

at

at(位置:integer)
文字列の指定した位置の文字を返します
例)
  “Hello”.at(0)  # => “H”
  “Hello”.at(4)  # => “o”
  “Hello”.at(10) # => nil
  “Hello”.at(-1)  # => “o” 最後から1文字
  “Hello”.at(-4)  # => “e”
  “Hello”.at(-10) # => nil

first

first(長さ:integer 初期値:1)
文字列の先頭から指定した長さの文字列を取得します

例)
  “Hello”.first  # => “H”
  “Hello”.first(3)  # => “Hel”
  “Hello”.first(10) # => “Hello”
  “Hello”.first(0)  # => “Hello”
  “Hello”.first(-3)  # => “He” 最後から4文字目から先頭
  “Hello”.first(-10) # => “”

from

from(位置:integer)
文字列の指定した位置から最後までの文字列を取得します

例)
  “Hello”.from(1)  # => “ello”
  “Hello”.from(3)  # => “lo”
  “Hello”.from(10) # => “”
  “Hello”.from(0)  # => “Hello”
  “Hello”.from(-2)  # => “lo” 最後から2文字目から最後
  “Hello”.from(-10) # => “”

last

last
文字列の最後から指定した長さの文字列を取得します

例)
  “Hello”.last(1)  # => “o”
  “Hello”.last(3)  # => “llo”
  “Hello”.last(10) # => “Hello”
  “Hello”.last(0)  # => “Hello”
  “Hello”.last(-2)  # => “llo” 先頭から2文字目から最後
  “Hello”.last(-10) # => “”

to

to
文字列の先頭から指定した位置までの文字列を取得します

例)
  “Hello”.to(1)  # => “He”
  “Hello”.to(3)  # => “Hell”
  “Hello”.to(10) # => “Hello”
  “Hello”.to(0)  # => “H”
  “Hello”.to(-2)  # => “Hell” 最後から2文字目まで
  “Hello”.to(-10) # => “”

starts_with?

starts_with?
文字列が指定した文字列で始まるかを判定します

例)
  “Hello”.starts_with?(“H”)  # => true
  “Hello”.starts_with?(“Hel”)  # => true
  “Hello”.starts_with?(“Helo”)  # => false
  “Hello”.starts_with?(“ello”)  # => false

ends_with?

ends_with?
文字列が指定した文字列で終わるかを判定します

例)
  “Hello”.ends_with?(“o”)  # => true
  “Hello”.ends_with?(“ello”)  # => true
  “Hello”.ends_with?(“Hel”)  # => false
  “Hello”.ends_with?(“oilo”)  # => false

camelize

camelize(先頭の文字をどうするか:シンボル(:lower小文字|:upper大文字 初期値:upper)
パス形式からRubyのクラス名にする。/は::に変換されます。

例)
  “active_record”.camelize #=> “ActiveRecord”
  “active_record”.camelize(:lower) #=> “activeRecord”
  “active_record/errors”.camelize #=> “ActiveRecord::Errors”
  “active_record/errors”.camelize(:lower) #=> “activeRecord::Errors”

classify

classify
テーブル名をRubyのクラス名にする

例)
  “egg_and_hams”.classify #=> “EggAndHam”
  “post”.classify #=> “Post”

constantize

constantize
文字列のオブジェクトが読み込まれていれば、そのオブジェクトを返す

例)
  “Module”.constantize #=> Module
  “Array”.constantize #=> Array

dasherise

dasherize
「_(アンダースコア)」を「-(ハイフン)」に置換する

例)
 “puni_puni” #=> “puni-puni”

demodulize

demodulize
モジュールの部分を取り除く

例)
  “ActiveRecord::CoreExtensions::String::Inflections”.demodulize #=> “Inflections”
  “Inflections”.demodulize #=> “Inflections”

foreign_key

foreign_key(単語間をアンダースコアで区切るか:boolean 初期値:true)
クラス名から外部キー名にする

例)
  “Message”.foreign_key #=> “message_id”
  “Message”.foreign_key(false) #=> “messageid”
  “Admin::Post”.foreign_key #=> “post_id”

humanize

humanize
アンダースコアで区切られた文字をスペース区切りにし、最初の単語の先頭の文字を大文字にする。また、「_id」があれば削除する。そのことで、人が読みやすい形にする

例)
  “employee_salary” #=> “Employee salary”
  “author_id” #=> “Author”

pluralize

pluralize
複数形にする

例)
  “post”.pluralize #=> “posts”
  “octopus”.pluralize #=> “octopi”
  “sheep”.pluralize #=> “sheep”
  “words”.pluralize #=> “words”
  “the blue mailman”.pluralize #=> “the blue mailmen”
  “CamelOctopus”.pluralize #=> “CamelOctopi”

singularize

singularize
単数形にする

例)
  “posts”.singularize #=> “post”
  “octopi”.singularize #=> “octopus”
  “sheep”.singluarize #=> “sheep”
  “word”.singluarize #=> “word”su
  “the blue mailmen”.singularize #=> “the blue mailman”
  “CamelOctopi”.singularize #=> “CamelOctopus”

tableize

tableize
クラス名をテーブル名にする

例)
  “RawScaledScorer”.tableize #=> “raw_scaled_scorers”
  “egg_and_ham”.tableize #=> “egg_and_hams”
  “fancyCategory”.tableize #=> “fancy_categories”

titleize

titleize
全ての単語の先頭の文字を大文字にする

例)
  “man from the boondocks”.titleize #=> “Man From The Boondocks”
  “x-men: the last stand”.titleize #=> “X Men: The Last Stand”

underscore

underscore
camelizeの逆の処理をする。名前空間を含めたクラス名をパスにする

例)
  “ActiveRecord”.underscore #=> “active_record”
  “ActiveRecord::Errors”.underscore #=> active_record/errors

まとめ

 地味に役立ちそうなものが多い感じですかね。

 camelizeとかはバンバン使えるようになりたいですよ。

railsで画像などファイルをアップロードする方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

初めまして新米エンジニアのカツオです。

KBMJに入ってから初めてプログラミングというものに触れ日々奮闘しております。

まだ入ってから日も浅いので、
プログラミング初心者の僕がruby on railsの開発の中つまづいたことを
紹介することがメインになるかと思います。

ドーゾよろしくお願いします。

そんなわけで今日は

railsでファイルなどをアップロードの仕方を紹介します。

ファイルをアップロードするときはform_tagに multipartオプションが必要になります。

<% form_tag ( {:action => 'create' }, {:multipart => true } ) %>
<label for="image">画像をアップロード</label><%= file_field_tag 'image' %>
<%= submit_tag '作成' %>
<%= end_form_tag %>

multipartオプションがないと

例えば

「tanuki.jpeg」という画像の場合、

「tanuki.jpeg」というファイル名だけをstringとして受け取ってしまう訳です。

つまり画像情報を受け取れないのです。

だからファイルを取り込むときは

:multipart => true

をform_tagの第二引数に指定してあげましょう。

そうすることによって

StringIO(stringを拡張したもの)でクエリーがやってきて

画像が取り込めるようになるわけです。

とまぁこういったレベルのことを紹介できたらいいなと思います。

ではでは!

遠隔地のチョロQを操縦する方法 with JavaScript, AJAX, Rails, Gainer, Webカメラ, and USTREAM.TV

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

遠隔地のチョロQ(キューステア)をUSTREAM.TVのストリーミングビデオで見ながら、Webブラウザ上でのキーボード操作で操縦できるWebアプリを作ってみました。以下、その仕組みについて詳しく解説していきます。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

チョロQ(キューステア)操縦Webアプリの動画

動作している様子と仕組みの概要については、以下の動画を見るのがてっとりばやいかも。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

http://jp.youtube.com/watch?v=-n3XV6GGdWY 

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

http://www.nicovideo.jp/watch/sm2432398 

チョロQ(キューステア)Webアプリ概要図

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

ustream.tv

ustream.tv 

WebカメラとWebブラウザだけで動画配信できてしまうWebサービスです。今回はこのサービスを動画中継に使用しました。

Gainer 

GAINER.cc

USBと電子部品の橋渡しをしてくれるI/Oモジュール。FlashRubyなどから電子部品を簡単に扱えるようになります。今回はミニリレーの制御に使用しています。

Gainerについては以下のショップで購入すると良いかもしれません。

使用方法については、以下の書籍が非常に参考になります。

http://rcm-jp.amazon.co.jp/e/cm?t=ateamkbmj-22&o=9&p=8&l=as1&asins=4861672015&fc1=000000&IS2=1&lt1=_blank&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr

ミニリレー

電磁石を用いて電気的にスイッチをON/OFFする部品。今回は赤外線リモコンの制御に使用しています。

チョロQ(キューステア)

チョロQ(キューステア)

付属の赤外線リモコンで制御できるチョロQ(キューステア)。今回はこれを操縦します。 

Amazonでも購入することができます。

http://rcm-jp.amazon.co.jp/e/cm?t=ateamkbmj-22&o=9&p=8&l=as1&asins=B000WZ9MDY&fc1=000000&IS2=1&lt1=_blank&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr

Webアプリ動作環境

動作環境は MacOSX 10.5 ですが、

rubygainerの接続ができれば、他のOSでも動作すると思います。 

チョロQ(キューステア)-Gainer接続の参考書籍

GainerチョロQ(キューステア)の接続方法については下記の書籍が詳しいです。

http://rcm-jp.amazon.co.jp/e/cm?t=ateamkbmj-22&o=9&p=8&l=as1&asins=4861671655&fc1=000000&IS2=1&lt1=_blank&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr

Rails config/environments/development.rb

以下、ソースについて解説していきます。 

 config/environments/development.rb あたりの最後に以下のような記述を追加してください。require ‘gainer’

$gainer = Gainer::Serial.new(‘/dev/cu.usbserial-A2002mcq’)
$gainer.digital_output = 0xf
sleep(1)
$gainer.digital_output = 0
sleep(1)require ‘gainer’ は、rubyからgainerを扱うためのgemです。gem install しておいてください。 

Rails app/controllers/top_controller.rb

 require ‘gainer’

class TopController < ApplicationController
  def frontleft
    $gainer.digital_output[0] = false
    $gainer.digital_output[1] = true
    $gainer.digital_output[2] = false
    $gainer.digital_output[3] = true
  end

  def front
    $gainer.digital_output[0] = false
    $gainer.digital_output[1] = true
    $gainer.digital_output[2] = true
    $gainer.digital_output[3] = true
  end

  def frontright
    $gainer.digital_output[0] = false
    $gainer.digital_output[1] = true
    $gainer.digital_output[2] = true
    $gainer.digital_output[3] = false
  end

  def stop
    $gainer.digital_output[0] = true
    $gainer.digital_output[1] = true
    $gainer.digital_output[2] = false
    $gainer.digital_output[3] = false
  end 

  def backleft
    $gainer.digital_output[0] = true
    $gainer.digital_output[1] = false
    $gainer.digital_output[2] = false
    $gainer.digital_output[3] = true
  end

  def back
    $gainer.digital_output[0] = true
    $gainer.digital_output[1] = false
    $gainer.digital_output[2] = true
    $gainer.digital_output[3] = true
  end

  def backright
    $gainer.digital_output[0] = true
    $gainer.digital_output[1] = false
    $gainer.digital_output[2] = true
    $gainer.digital_output[3] = false
  end
endgainerのIOポートから入出力するためのgemがあり、これを使うと上記のように簡単にgainerを扱うことができます.l

difital_output[0] = true などとすることで、gainerのデジタル出力を操作することができます。 

Rails app/views/top/index.rhtml

<%= javascript_include_tag :defaults %>



<%= link_to_remote(“left”, :url => { :action => “frontleft” }) %><%= link_to_remote(“front”, :url => { :action => “front” }) %><%= link_to_remote(“right”, :url => { :action => “frontright” }) %>
<%= link_to_remote(“left”, :url => { :action => “backleft” }) %><%= link_to_remote(“back”, :url => { :action => “back” }) %><%= link_to_remote(“right”, :url => { :action => “backright” }) %>

ustreamのブログパーツを張りつけて映像配信を実現しています。

JavaScriptでキーイベントを取得して、AJAXでサーバー側にリクエストを飛ばしています。なのでustreamによる映像配信がページ遷移で途絶えることはありません。

Railslink_to_remote()を用いたリンクも用意しています。

USB -> Gainer -> ミニリレー -> 赤外線リモコン 回路

 回路については先ほどの書籍と、以下の写真を参考にしてみて下さい。

使用しているリレーは941H-2C-5Dというもの。

秋葉原の秋月電子にて1個100円で購入しました。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

ミニリレー -> チョロQ(キューステア)赤外線リモコン

リモコン側については以下のようにハンダ付けしています。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

キーボード -> JavaScript -> AJAXの様子をFireBugで確認

FireBugを使うと、AJAXによるリクエストの様子が見れます。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

AJAX -> Rails をログで確認

操縦中のサーバー側のログについては、こんな感じ。

チョロQ キューステア JavaScript AJAX Rails Gainer Webカメラ USTREAM.TV

チョロQ(キューステア) with JavaScript, AJAX, Rails, Gainer, Webカメラ, and USTREAM.TV まとめ

以上、WebブラウザでチョロQ(キューステア)を操縦する仕組みをGainerRailsを使用して作ってみました。

この仕組みを使えば、色々と楽しそうなことができそうですね。

他にも面白いネタを考えています。次回もお楽しみに!

個人ブログ : 拡張現実ライフ

Ruby on Railsで作られたredmineのカスタマイズ1 ~インストール編~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはtacchiです。
redmineについて数回に分けて語ってみます。

Tracでのプロジェクト管理

自分のプロジェクトでは、Tracを利用して各々のタスクを管理しています。全員のタスクを把握すること、各自が各々のタスクを宣言することによって把握することを目的としています。
こういった使い方をされてるところは、少ないと思いますが、これがなかなか使えるんです。  

今までTracを利用していたのですが、redmineの記事を見つけたので、試してみました。

redmineを試した理由

なんで今頃redmineなのかと言われるかもしれないのですが、Tracとredmineの違いとして、Tracは多くのプラグインが用意されていて、redmineはそれがないと言われてるのですが、自分たちにとってはredmineの方がカスタマイズしやすいのではと思ったからなんです。それは、Ruby on Railsを採用しているからなんです。  

今回は、redmineのインストール方法を記します。いつまで続くか分からないですが、必要な機能を付けたしていければと思っていて、ここで公開させてもらえればと思ってます。

検証環境

CentOS 5
ruby 1.8.6
Rails 1.2.6
mysql Ver 14.12 Distrib 5.0.22

redmineのインストール方法

1.svnでソースをチェックアウト
$ svn checkout svn://rubyforge.org/var/svn/redmine/trunk redmine
$ cd redmine

2.DB接続のための設定を行う$ vi config/database.yml

※database.ymlの中身production:
adapter: mysql
database: redmine
username: redmine
password: redmine
encoding: utf8

3.DB作成
mysql > create database redmine;

4.テーブルの作成(redmine以下で実施)rake db:migrate RAILS_ENV=”production”

5.初期データのインポートrake load_default_data RAILS_ENV=”production”

6.起動ruby script/server -e production  

大体、上記で動くと思います。自分は、mongrel_clusterの設定を行って、Apacheを利用して閲覧できるようにしています。

利用した感想

使いこなせると、とても便利だと思います。最初言ったようにRuby on Railsだとカスタマイズしやすいので、色々できるんではないかと期待しています。時間の許す限りTryしてみたいと思います。とはいえ、業務優先。  

MacBook AirのレビューとLet’s noteとの比較

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

うちの会社にもMacBook Airが届きました。

私の物ではないですが、とりあえずフォトレビュー用に写真をとりました。

とりあえずid:kstnが使うみたいです。

という訳で写真と、let’s noteとの比較は…..

まず、左側面のportです。

usb一つにディスプレイケーブル用1つにヘッドホン端子です。

少ない。

しかも折りたたみ式です。

格納できます。

次に右側面の電源ケーブルの接続先と電源ケーブル。

 しっかりくっついているというわけではなく、

持ち上げるとすぐ外れました。

恐らく、充電途中でもケーブルの抜き差しを意識せずに持って立ち上がれる事を

意識しているのかと。

パームレストの尖っている部分がちょっと痛そうです。 

そして、薄さや大きさを手持ちのLet’s note(w5)と比較してみました。

実際に比較した写真。

真横からじゃなくてすいません。。。。

倍以上の差を感じます。

やはり厚さは全然違いますね。

上から見た形。

Airの方が大きいです。

重量は、手に持った感じで何人かに聞いてみた所

「わからない」や「Let’s noteの方が軽い」とか「air のが軽い」とか

バラバラでした。実際は大してかわらないと思います。 

画面が大きくて 薄くて、重さは一緒という事で、

モバイルPCとしての利便性は十分に果たせるんじゃないでしょうか。

ただ、こうやって間隔が開いてるキーボードは結構苦手です。

ここで自分なりのMacbookのメリットデメリット(Let’s noteと比較して)

メリット 

1.MacOSが使える。

2.CTRLがデフォルトでAの横(Let’s noteだと設定変更が必要)

3.薄いので鞄に入れても、他の本が入れれる。

4.軽いので持ち運んでもあまり疲れない。

デメリット 

1.パームレストが尖ってる。

2.結構サイズが大きいので入る鞄が限られてくる

3.薄さの割には重い。

4.ドライブが無い。

5.USBポートが少ない。 

6.バッテリーが持たない。(予測)

こんな所でしょうか。

半額ぐらいだったらサブノートとして気軽に買えるんだけどなーと

個人的に思ってます。 

Railsの開発でscreenを使う理由

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも、高瀬です。

書く回数が多い気がしますが、本当の順番は、月曜日である今日で、

今日書くのは業務なので一応書きます

以前、自分のブログでscreenのはじめ方 や screen ショートカットキー一覧というエントリを書いたことがありますが、

今回は、何故Railsの開発にscreenを使っているのかという話を書いてみます。

以前、該当のエントリでは、下記の様に書きました。

1.複数シェルを立ち上げてSSHでも画面切り替えが出来る。
2.ssh等の接続が切れても再度つなぎなおす事が出来る。
3.コピペSSH越しでもキーボードのみで可能。

使い始めた当初は実際それがきっかけだったんですが、

使い込んでくるとRails開発との親和性が高いことがわかってきます。

今じゃローカルでもscreen使ってますからね。

というわけでローカルでもscreenを使い続ける理由

1.プログラムが並行で動かせる
2.コンソール以外は見なくても済む。
3.alt + tabで切り替える画面数が少なくて済む。
4.作業を中断した所から再開できる。
5.screenのログをとる事で作業履歴が追える。

で、特に1.のプログラムが並行で動かせる事が一番の理由だったりします。

実際にrailsの開発時に立ち上げる物としては以下の様な感じになります。

1. vim(もしくはemacs)でプログラム弄る。
2. ruby scrip/console でプログラム試し
3. autotest(もしくはrake実行) でテスト
4. mysqlやpgsql等DBプログラム でデータ確認
5. topコマンド で負荷確認
6. tail -f でログファイル監視
7. svn とか ls とか findとか通常のシェルで
8. ruby script/server(大体の場合これはデーモンとして動かしてます)

計8個です。

これだけWindows等でプログラムを立ち上げたら

切り替え時にALT + TABするだけでも大変です。

しかもコンソール以外にもブラウザやメーラーやメッセンジャ、IRCクライアントなどあれば混乱の極み(アッー)です。

というわけでscreenのウィンドウ毎に名前をつけて

番号指定して切り替われば作業が効率化するわけです。

(実は本気出せば意外とvimでも実行できたり

IDE系のツールでもできたりしますが。。。)

 consoleでちょこっとPG弄くってpgに反映したり、

 autotestでエラー出てないか確認したり

 dbを見ようとしてmysqlに切り替えたり

 svn のチェックしたりとかが全てキーボードで操作できるのです。

全てキーボード、全てコンソール。

凄く幸せです。

ホームポジションから手が動きません。

マウス要りません。

楽です。

文字だけで、グラフィックのない画面を見てると集中できますし、

シェル主体の開発になることで自然とサーバの操作を覚えられる利点もあります。

その気になればウィンドウ分割もできますし、

というわけであなたも今日からscreen使いましょう。

[screenのはじめ方]

補足:あとはブラウザとしてw3mとかlynxの操作方法を覚えるぐらいでしょうか(※まだ慣れていない)

ActiveRecordのconditionsを綺麗に書くTips2つ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

高瀬です。Railsで開発してる 人は一部の例外(RubyでActiveRecordを使わないでDBに接続する方法)を除いてactiverecord(AR)でDBを検索すると思います。 今回はARでDBの検索をする際に綺麗に書けるようになるtipsです。

1.conditions句をシンボル使ってDRYに書く

conditions句って実はシンボル使えるらしいのです。

最近まで知りませんでした。

というわけで、?だと

:conditions =>[“(prefecture_id = ? and user_id = ?)  or (other_prefecture_id = ? and other_user_id = ?)”,  11, 2, 11, 2]

 と、分けわかんなくなっちゃう様な検索文を

:conditions =>[“(prefecture_id = :prefecture_id and user_id = :user_id)  or (other_prefecture_id = :prefecture_id and other_user_id = :user_id)”, {:prefecture_id => 11, :user_id => 2}]

っていう書き方ができます。

2.ヘルパつかってみる。 

こんなライブラリとかをつかいます。

module ActiveRecordHelper
def flatten_conditions(conditions, op = “and”)
return nil if conditions.empty?
ps = []
condition = conditions.collect do |c|
next if c.size < 1
ps += c[1..(c.size)]
“( #{c[0]} )”
end.delete_if { |c| c.blank? }.join(” #{op} “)
[condition, ps].flatten unless condition.empty? end
end

class ActiveRecord::Base
include ActiveRecordHelper
end

そーすると

@condition = []

@condition << [” prefecture_id = ? “, params[:prefecture] ] if params[:prefecture]

@condition << [” sex = ? “, params[:sex] ] if params[:sex]

  @users = User.find(:all, :conditions => @conidition)

こういう風に、配列にガシガシ追加するだけーという検索条件の追加の仕方ができます。

RailsのActionMailer(Tmail)でドットの連続などのRFC違反している携帯メールアドレスに対応する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、KBMJの中平@railsエンジニアです。
今回は、docomoやauなどのメールドレスでドットの連続とか@の前にドットをつけたRFC違反メールアドレスだと、ruby on rails のActionMailer(Tmail)でメール送受信が失敗していたので、その対策方法を書きます。RFC違反メールアドレスだとActionMailer(Tmail)でどのような問題が起こるのか

ruby…rails.@kbmj.com などのメールアドレスだとActionMailer(Tmail)を使ってメールの送受信をした時に、メールアドレスの
from、toがnilになってしまいメールアドレスが送受信できません。
(スパムが心配なのでドメインは弊社のものにしています。)

確認してみる

ruby script/console
>> TMail::Version
=> “0.10.7”
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = ‘ruby…rails.@kbmj.com’
=> nil

とnilになってしまい、メールアドレスがきちんと取得できません。

■対策方法
こちらのサイトを参考にさせていただきました。

最新のTMailだと対策されているみたいですが、リリース済みのプロジェクトでしたので、parse.yからparse.rbを作り直します。

1.parse.yファイルを取得します。

Tmailを単体で取得し、その中にparse.yがありますのでそれを使います。
http://rubyforge.org/frs/?group_id=4512
ここからダウンロード、使用しているTMailと同じバージョンのものを使います。

リビジョン 3329で対応しているみたいですので、
変更内容
svn log -r 3329 http://i.loveruby.net/svn/public/tmail/trunk/

svn diff -r 3328:3329 http://i.loveruby.net/svn/public/tmail/trunk/lib/tmail/parser.y
で変更点を同じようにダウンロードしたpaser.yに編集します。

2.parse.yからparse.rbを作成しなおします。

raccを使いparse.yからparse.rbを作成いたします。
raccがない場合は取得して使ってください。

windows環境だとサンプルのように
racc -ocalc.rb calc-ja.y
としても、実行されないので
c:\ruby\bin\racc  -ocalc.rb calc-ja.yという感じで実行する必要があります。

praser.rbを作成する。

c:\ruby\bin\racc  parser.y -E -o tmail_parser.rb

参考にさせていただいたサイトですと、直接既存のparser.rbを置き換えていますが、
私は直接置き換えずtmail_parser.rbとファイル名をつけ、
project\libの中にtmail_parser.rbを入れておき
起動時に
TMail.instance_eval{remove_const ‘Parser’}
require ‘tmail_parser’
として、parser.rbを新しいtmail_parserを使うようにしております。

これで、RFC違反メールアドレス対策が出来ました。
確認してみる。

ruby script/console
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = ‘ruby…rails.@kbmj.com’
=> “ruby…rails.@kbmj.com”


問題ないことが確認できました。

第2の問題
実際にメール送受信を試したところ、送信は出来ているのですが受信に失敗していました。
ログを調べてみると・・・・
postfixがRFC違反メールアドレスだと、

ruby…rails.@kbmj.comを”ruby…rails.”@kbmj.com という感じで変更していました。


そのため、再びparseが上手くいかずメールアドレスがnilになっていました。
ログを見るとヘッダー情報にはメールアドレスがそのままきていましたので、

require ‘action_mailer’

module TMail
  class Mail
    # 指定された名前の最初のヘッダを取得する
    def first_header(key)
      if port.to_s =~ /^#{key}:\s*(.*)/i
        $1
      else
        nil
      end
    end
  end
 end

このようなmoduleを作成し、
メールの受信処理に

def receive(email)
email.first_header(‘return-path’).sub(/^</, ”).sub(/>$/, ”).sub(/^\”/,”).sub(/\”@/,’@’)
end

とすることで、無事メールアドレスが取得できました。

古いバージョンActionMailer(Tmail)でRFC違反メールアドレスの対応する場合は参考にしていただければと思います。

[Rails 2.0]起動時のファイルの読み込みの順番がわかった!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回は、Rails 2.0のプロセス起動時に読み込まれるファイルの順序について調べてみました。

 まず、気になったのはRiding Rails: Rails 2.0: Preview Releaseにある。config/initializers配下のファイルの読み込みがどの段階なのかということです。

 Rails::Initializerのソースを見てみると、proccessの一番最後で行われていたので、プロセス起動時の最後の段階で読み込まれるようです。(ちなみに複数ある場合は、ファイル名順)

 config/environment.rbで初期化した変数とか使えるのかな~というのが一番の懸念点でしたが、大丈夫なようです。

 この調査で、わかったのですが、プロセス起動時前の処理とかも別ファイルで指定できるようになっているみたいです。

 config/preinitializer.rbを用意すると、プロセス起動時の一番最初にこれが読み込まれます。あんまり使うことはなさそうですが、頭の片隅に入れておくと今後役に立つかもしれません。

 config/initializers配下については使っていきたいと思っていたので、読み込まれる段階がわかってよかったです。config/preinitializer.rbについても必要になったら使っていきたいと思います。

【まとめ】起動時のファイルの読み込みの順番

config/preinitializer.rb

config/environment.rb

config/initializers配下のファイル

Ruby on Railsでacts_as_paranoidを使い倒す

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

KBMJのプログラマのx5rです。

今日はRuby on Railsプラグインのacts_as_paranoidについて説明します。
これはDBのモデルデータを削除をする時に物理削除ではなく、論理削除をするためのプラグインです。

Railsの2.0系がリリースされましたが、まだ1.2系で開発することも多いと思います。
しかし、このacts_as_paranoidプラグイン、使い方は簡単ですが、Railsの1.2.5で利用する時に一部の機能でエラーが発生して使用できなかったり、また、私の希望する機能がありませんでしたので、このacts_as_paranoidプラグインを一部改良しました。

そこで、私が行ったエラーの対処法と拡張を説明したいと思います。
なお、以下#{RAILS_ROOT}で全て作業しているものとします。

CRUDアプリの作成

前回のAmazonAPIの使い方を説明した時は、Railsのバージョンは2.0系でしたが、今回はRails1.8.5を利用します。

まず、CRUD処理が必要なので、scaffoldを利用して作成します。
以下、単純なので簡単に流れだけ書いておきます。

 $ script/generate model Book #Bookモデルの作成
 $ less db/migrate/001_create_books.rb #Bookモデルのマイグレーションを編集
 class CreateBooks < ActiveRecord::Migration
   def self.up
     create_table :books do |t|
       t.column :title,        :string
       t.column :author,       :string
       t.column :date,         :date
       t.column :created_at,   :datetime
       t.column :updated_at,   :datetime
     end
   end
    def self.down
     drop_table :books
   end
 end
 $ rake db:migrate #マイグレート
 $ script/generate scaffold Book Book #scaffoldを作成
 $ script/server #サーバ起動 

では、http://localhost:3000/bookにアクセスします。
実際にデータを追加して削除すると、レコードが削除、つまり物理削除されていることがわかります。

acts_as_paranoidの導入

acts_as_paranoidのインストール

acts_as_paranoidプラグインをインストールします。

 $ ruby script/plugin source http://techno-weenie.net/svn/projects/plugins
 $ ruby script/plugin install acts_as_paranoid 

 deleted_atカラムを追加

acts_as_paranoidプラグインではdeleted_atカラムを論理削除のためのフラグとして機能しますので、deleted_atカラムを追加します。

 $ script/generate migration AddBooksDeletedAt #マイグレーションファイルの作成
 $ less db/migrate/002_add_books_deleted_at.rb #マイグレーションファイルの編集
 class AddBooksDeletedAt < ActiveRecord::Migration
   def self.up
     add_column :book, :deleted_at,   :datetime,  :comment => "削除日時"
   end
    def self.down
     remove_column :book, :deleted_at
   end
 end
 $ rake db:migrate #マイグレーション 

acts_at_paranoidの設定

Bookモデルにacts_as_paranoidクラスメソッドを追加します。

 $ less app/models/book.rb
 class Book < ActiveRecord::Base
   acts_as_paranoid
 end 

動作確認

実際に削除してみると、

 undefined method `construct_count_options_from_args' for Book:Class 

というエラーが表示されます。

これは最新のacts_as_paranoidプラグインがRails2.0に向けた対応をしたことによる影響らしいです。

そこで
RAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb
の約90行目あたりの

 calculate_with_deleted(:count, *construct_count_options_from_args(*args)) 

 calculate_with_deleted(:count, *construct_count_options_from_legacy_args(*args)) 

に変更します。

これで削除をしてみるとうまく動作することが確認できます。

論理削除されたものも取得する

さて、場合によっては論理削除されたデータも含めた形で表示したいということもあるかと思います。
そして、acts_as_pluginは削除フラグのたっているものも含めて取得するためのメソッドも用意しています。

それが以下の2つの方法です。

  • :with_deletedオプションを指定
  • find_with_deletedメソッドを利用

はじめにBookControllerに次のようなアクションを追加し、簡単なテンプレートも作成して試してみます。

BookControllerにlist_with_deletedアクションを追加

$ less app/controllers/book_controller.rb
 class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     #データ取得処理を記述する
   end
  end 

テンプレートを作成

 $ less app/views/book/list_with_deleted.rhtml
 <%- @books.each do |book| -%>
 
   <%= book.title %> - <%= book.author %> - <%= book.date %>
 <%- end -%> 

 :with_deletedオプションを指定

list_with_deletedアクションにデータ取得処理を記述します。

 $ less app/controllers/book_controller.rb
  class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     @books = Book.find(:all, :with_deleted => true)
   end
 end 

http://localhost:3000/book/list_with_deletedにアクセスしてみます。すると

 Unknown key(s): with_deleted 

と表示されてしまいます。

そこで[#8896] find(:all, :with_deleted => true) broken (at least in version 0.3.1/July-2006)を参考にRAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rbの約58行目あたりの

 class << self
   alias_method :find_every_with_deleted,    :find_every
   alias_method :calculate_with_deleted,     :calculate
   alias_method :delete_all!,                :delete_all
 end 

に1行追加して

 class << self
   VALID_FIND_OPTIONS << :with_deleted unless VALID_FIND_OPTIONS.include?(:with_deleted)
   alias_method :find_every_with_deleted,    :find_every
   alias_method :calculate_with_deleted,     :calculate
   alias_method :delete_all!,                :delete_all
 end 

のようにします。
これで論理削除されたものも含まれて表示されます。

find_with_deletedメソッドを利用

find_with_deletedメソッドで論理削除されたものも取得する方法があります。

以下で説明するページネートで利用するためにこちらも確認してみます。
list_with_deletedアクションにデータ取得処理を記述します。

$ less app/controllers/book_controller.rb
 class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     @books = Book.find_with_deleted(:all)
   end
 end 

http://localhost:3000/book/list_with_deletedにアクセスしてみます。すると

undefined method `extract_options!' for [:all]:Array 

というエラーが表示されます。
これもRails2.0に向けた対応によるものです。

そこで論理削除プラグイン(バグ修正) – Rails開発日記のサイトを参考に対応します。
上記のサイトではActiveSupportに直接変更を加える方法が説明されていますが、それはあまりやりたくないので、RubyおよびRailsの特性を生かして、クラス(モジュール)を拡張して対応してみます。
上記サイトのリンク先

のソースを今回のRailsアプリに反映させます。


RAILS_ROOT/libにactive_support_extend.rbというファイルを作成して以下のように記述します。

 $ less lib/active_support_extend.rb
  module ActiveSupport #:nodoc:
   module CoreExtensions #:nodoc:
     module Array #:nodoc:
       module ExtractOptions
         # Extract options from a set of arguments. Removes and returns the last element in the array if it's a hash, otherwise returns a blank hash.
         #
         #   def options(*args)
         #     args.extract_options!
         #   end
         #
         #   options(1, 2)           # => {}
         #   options(1, 2, :a => :b) # => {:a=>:b}
         def extract_options!
           last.is_a?(::Hash) ? pop : {}
         end
       end
     end
   end
 end
  class Array
   include ActiveSupport::CoreExtensions::Array::ExtractOptions
 end 

そしてRAILS_ROOT/config/environment.rbに

 $ less config/environment.rb # 一番下に記述
 require "active_support_extend" 

を記述してWebrickを再起動します。
そして、再度http://localhost:3000/book/list_with_deletedにアクセスしてみます。
これで論理削除されたレコードも表示されているのがわかります。

ページネートでfind_with_deletedを利用する

 ActionController::Paginationを拡張

上記で、論理削除されたデータの取得ができるようになりましたが、一覧画面でページネートを利用した際にも論理削除されたデータを取得したいことがあります。

そこでActionCcontrollerのpagination.rbを参考にページネートを拡張してみます。


RAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/の下にpagination_extend.rbというファイルを作成し、以下のように記述します。

$ less vendor/plugins/acts_as_paranoid/lib/pagination_extend.rb
 module ActionController
   module Pagination
     def paginate_with_deleted(collection_id, options={})
       Pagination.validate_options!(collection_id, options, true)
       paginator_and_collection_for_with_deleted(collection_id, options)
     end
     module ClassMethods
       def paginate_with_deleted(collection_id, options={})
         Pagination.validate_options!(collection_id, options, false)
         module_eval do
           before_filter :create_paginators_and_retrieve_collections_with_deleted
           OPTIONS[self] ||= Hash.new
           OPTIONS[self][collection_id] = options
         end
       end
     end
     protected
     def create_paginators_and_retrieve_collections_with_deleted #:nodoc:
       Pagination::OPTIONS[self.class].each do |collection_id, options|
         next unless options[:actions].include? action_name if
           options[:actions]
          paginator, collection =
           paginator_and_collection_for_with_deleted(collection_id, options)
          paginator_name = "@#{options[:singular_name]}_pages"
         self.instance_variable_set(paginator_name, paginator)
          collection_name = "@#{collection_id.to_s}"
         self.instance_variable_set(collection_name, collection)
       end
     end
     def find_collection_for_pagination_with_deleted(model, options, paginator)
       model.find_with_deleted(:all, :conditions => options[:conditions],
                  :order => options[:order_by] || options[:order],
                  :joins => options[:join] || options[:joins], :include => options[:include],
                  :select => options[:select], :limit => options[:per_page],
                  :offset => paginator.current.offset)
     end
     def count_collection_for_pagination_with_deleted(model, options)
       model.count_with_deleted(:conditions => options[:conditions],
                   :joins => options[:join] || options[:joins],
                   :include => options[:include],
                   :select => options[:count])
     end
     def paginator_and_collection_for_with_deleted(collection_id, options) #:nodoc:
       klass = options[:class_name].constantize
       page  = params[options[:parameter]]
       count = count_collection_for_pagination_with_deleted(klass, options)
       paginator = Paginator.new(self, count, options[:per_page], page)
       collection = find_collection_for_pagination_with_deleted(klass, options, paginator)
        return paginator, collection
     end
   end
 end 

やっていることは最終的にfind_with_deletedメソッドを実行するために、そこまでのルートで呼ばれるメソッド名に「_with_deleted」を付けているだけです。
DRYではないですが、まあよしとします。

そして、RAILS_ROOT/vendor/plugins/acts_as_paranoid/init.rbでロードします。

$ less vendor/plugins/acts_as_paranoid/init.rb
 # 先頭に追加
 require 'pagination_extend'
 # 以下省略 

BookControllerのlistアクションを修正

 $ less app/controllers/book_controller.rb
 class BookController < ApplicationController
   # --- 省略 ---
   def list
     @book_pages, @books = paginate_with_deleted :books, :per_page => 10
   end
   # --- 省略 ---
 end 

動作確認

http://localhost:3000/book/listにアクセスすると、論理削除されたデータも含めたページネートが実現されています。

参考サイト

fastladderをrailroadで図を作ってみる。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

たっちな人がfastladderを試していたので対抗して 

railroadでモデルとコントローラの図を作ってみた。

コマンド 

railroad -C | dot -Tjpg > controller.jpg

railroad -M | dot -Tjpg > model.jpg

http://cl.pocari.org/2008-02-10-1.html

あと、こちらではもっときれいにER図つくってあるので

開発する際の参照はこちらの方がいいかと。

ちなみにrailroadはgem install railroadで入ります。 

ヘルパーメソッド

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。エンジニアのmimiです。

難しい話は、他の方にまかせて、私は初級者・初心者にやさしい内容を書いていきたいと思います。

今回のテーマは、「ヘルパーメソッド」

ヘルパーメソッドとは、 

リンクを貼る(a href) など、HTMLのタグを作成するためのメソッドです。

 たとえば

<%= link to "削除",  :action => 'destroy'  %>

  これは↓

<a href="/destroy">削除</a>

 というHTMLを吐き出します。

 これに、アラートを出したいときには、

<%= link to "削除",  { :action => 'destroy' }, :confirm => "削除しても本当に後悔しない?" %>

 ↓

<a href="/destroy"  onclick="return confirm('削除しても本当に後悔しない?');">削除</a>

  となり、ポップアップで「OK」か「キャンセル」のボタンが表示されます。

 URLを作成するものとしては、

<%= url_for  :controller => 'list',  :action => 'destroy'  %>

 これは、”/list/destroy”となります。:controllerを省略した場合は、現在の位置と同じになります。   

Ruby on Railsでは、直接HTMLタグを書かずに、

 ヘルパメソッドを利用するのがルールです。

ディレクトリが変更になったときにでも、対応がしやすいこともありますし、

何より終了のタグを忘れる危険性もないので、楽ですね。

他にもメソッドはたくさんありますが、今回はここまでとします。

読んでくださってありがとうございます。

Ruby標準csv遅い

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、ワイYです。
今回は、Rubyの標準CSVはどの程度遅いのか、FasterCSVというRubyプラグインを用いて検証してみました。

検証前の準備・RubyプラグインFasterCSVをgemを用いてインストールする。gem install fastercsv・検査データとして郵便局のHPから郵便番号CSVを取得する。

検証方法Ruby標準のbenchmarkモジュールを使って、Ruby標準CSVとRubyプラグインFasterCSVにそれぞれ郵便番号CSVを読み取らせて比較する。

検証環境

OS: Windows XP

CPU: Core 2 Duo 2.4GHz

MEMORY: 3GB

Ruby v1.8.6

fastercsv v1.2.3

プラグインFasterCSVの使い方require ‘rubygems’
require ‘fastercsv’
#CSVファイルを読み込み一行ずつ処理をする
FasterCSV.foreach(“csvファイルパス指定”){ |csv|
p row #=>配列
}


検証に用いたコード検証には、ハッシュのキーを郵便番号、値を住所を挿入するようなプログラムにしました。require ‘rubygems’
require ‘benchmark’
require ‘csv’
require ‘fastercsv’
$KCODE=’sjis’

Benchmark.bm(15) do |x|
 #FasterCSV
 x.report(” FasterCSV”) do
   hash = {}
   FasterCSV.foreach(“KEN_ALL.CSV”){ |row|
     hash[ row[2] ] = row[6] + row[7] + row[8]
   }
 end

 #ruby標準CSV
  x.report(“CSV”) do
    hash = {}
    CSV.foreach(“KEN_ALL.CSV”){ |row|
      hash[ row[2] ] = row[6] + row[7] + row[8]
    }
  end
end

結果3回実験してみたが、RubyプラグインFasterCSVの方が5倍ほど早い事がわかった。詳細は、下図を参照してください。

まとめRubyでCSV関連を扱うときはプラグインのFasterCSVを使うようにしよう。

railsで開発したダイエットサイトとそのソースコード

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

体重が0.1トンでは済まなくなってきた高瀬です。

3連休の内、土日を使ってKBMJ社内で開発合宿を行いました。

その参加者の一人が最近ツイッターに体重のメールを送ってははてなグラフに読み込ませて、

ダイエット記録を出してると聞いたので、ダイエット記録を登録するサイト作ってみた。

だいえとというサイトです。

具体的には…… 

記録を登録するとぺたっと張ってるグラフの内容が簡単に更新されます。

ただそれだけですが、一応携帯からも記録を登録出来る様に作りました。

http://daieto.dip.jp/diets/show/zenpou


こんな感じのグラフです。

そしてダイエットサイトのソースコードはこちら 。

最近人気な記事