ホーム ブログ ページ 67

エラー表示で意図しない改行を解消する−fieldWithErrors、ActionView::Base、field_error_proc

0

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

こんにちは。maiです。
Ruby on Railsにはいろいろと便利機能がありますが、
フォームでvalidationに引っかかると該当箇所が赤く強調されるというのもその一つですね。
ただ赤く強調されるだけなら、とっても便利な機能がありますで終了なのですが、
この機能、該当箇所を強調するだけじゃなく、改行まで入っちゃうのです。

sample:元々の表示

28日記事のサンプル画像1

sample:エラーになったときの表示

28日記事のサンプル画像2

かなりカッコ悪いことになっています。
サイトのクオリティを考えれば、
ぜひとも元の表示のように1行の状態で赤枠が出る状態にしたいですね。

そこで、アラートが表示されている状態でhtmlのソースを覗いてみると、

<div class=”fieldWithErrors”><input id=”hoge” name=”hoge[hoge]” type=”text” value=”” /></div>

と書かれています。
犯人は<div>ですね。
<div>はブロック要素なので、閉じた後に改行されるのは仕様です。
デザイン的な制御はスタイルシートの仕事なので、
スタイルシートで「class=”fieldWithErrors”」を探してみると

.fieldWithErrors {
  padding: 2px;
  background-color: red;
  display: table;
}

デフォルトではこんなカンジになってます。
これを下のように書き換えます。

.fieldWithErrors {
  padding: 3px;
  border:2px solid red;
  display: inline;
}

これで表示を確認してみると…

28日記事のサンプル画像3

いいカンジ。

PCサイトだけならこれで完了でいいのですが、
mobileサイトはスタイルシートですべて解決もちょっと難しいところ。
そもそも、該当箇所が<div>ではなくて<span>でくくられれば、
勝手に改行されることはなくなります。

そこで、environment.rbの最後の行あたりに以下の一行を追加します。

ActionView::Base.field_error_proc = Proc.new {|html_tag, instance|  %(<span class=”fieldWithErrors”>#{html_tag}</span>)}

これで挿入されるタグが<span>になります。

28日記事のサンプル画像4

<div>の時はあった上下の余白もなくなってさらにいいカンジ。
(上下の余白はスタイルシートでも制御できますけど)

<span>は元々インライン要素なので、
さっき手直ししたスタイルシートの「display:inline」を削除します。
別に書いてあっても問題はありませんが、
いらないものは取ってしまいましょう。

.fieldWithErrors {
  padding: 3px;
  border:2px solid red;
}

これで完了。
(あってもなくてもいい部分だったので、表示は変わりません。)

[mysqlのベンチマーク]MyBenchの設定

0

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

お疲れさまです。佐久間です。

 最近、railsアプリケーションのDBとして使っている、mysqlのチューニングをしようと頑張っています。
 今日、mysqlのベンチマークテストをしようと、MyBenchというテストツールの設定をしてみました。

MyBench自体はperlだったりします。rubyとは書き方や実行が違っていて、とりあえずインストールしてみてもよくわからない部分が結構あったりしました。

実行環境:ubuntu 

  1. MyBenchをインストールしてみる


    # wget http://jeremy.zawodny.com/mysql/mybench/mybench-1.0.tar.gz
    # tar -vxf mybench-1.0.tar.gz
    mybench-1.0/
    mybench-1.0/MyBench.pm
    mybench-1.0/Makefile.PL
    mybench-1.0/META.yml
    mybench-1.0/bench_example
  2. Makefileを作成する

    # cd mybench-1.0
    # ls
    META.yml  Makefile.PL  MyBench.pm  bench_example
    # perl Makefile.PL
    Writing Makefile for mybench
    # ls
    META.yml  Makefile  Makefile.PL  MyBench.pm  bench_example


    Makefileができました。
  3. とりあえず、bench_exampleを実行してみる

    # bench_example    
    forking: ++++++++++
    sleeping for 2 seconds while kids get ready
    waiting: DBD::mysql::st execute failed: called with 1 bind variables when 0 are needed at /usr/local/bin/bench_example line 42.
    DBD::mysql::st execute failed: called with 1 bind variables when 0 are needed at /usr/local/bin/bench_example line 42.
    (省略)
    Use of uninitialized value in numeric gt (>) at /usr/local/share/perl/5.8.8/MyBench.pm line 134.
    Illegal division by zero at /usr/local/share/perl/5.8.8/MyBench.pm line 115.


    エラーが出ました・・・。

    というか、実行方法がすでに違います。
    実は、perlをさわるのは初めてで、よくわかっていません。

    あらためて、
  4. perl bench_exampleとして実行してみます

    # perl bench_example
    forking: ++++++++++
    sleeping for 2 seconds while kids get ready
    waiting: ———-
    Use of uninitialized value in scalar chomp at /usr/local/share/perl/5.8.8/MyBench.pm line 98.
    Use of uninitialized value in split at /usr/local/share/perl/5.8.8/MyBench.pm line 99.
    Use of uninitialized value in addition (+) at /usr/local/share/perl/5.8.8/MyBench.pm line 101.
    (省略)
    Use of uninitialized value in numeric gt (>) at /usr/local/share/perl/5.8.8/MyBench.pm line 134.
    Use of uninitialized value in numeric gt (>) at /usr/local/share/perl/5.8.8/MyBench.pm line 134.
    Illegal division by zero at /usr/local/share/perl/5.8.8/MyBench.pm line 115.


    ・・・bench_exampleの設定何一つ替えていないので、エラーが出るのも当たり前ですよ。

    ということで、
  5. bench_exampleの編集

    # cp bench_example bench_example.org
    # vi bench_example


    bench_exampleファイル

    #!/usr/local/bin/perl -w

    use strict;
    use MyBench;
    use Getopt::Std;
    use Time::HiRes qw(gettimeofday tv_interval);
    use DBI;

    my %opt;
    Getopt::Std::getopt(‘n:r:h:’, \%opt);

    my $num_kids  = $opt{n} || 10;
    my $num_runs  = $opt{r} || 100;
    my $db        = “test”;
    my $user      = “test”;
    my $pass      = “”;
    my $port      = 3306;
    my $host      = $opt{h} || “192.168.0.1”;
    my $dsn       = “DBI:mysql:$db:$host;port=$port”;

    my $callback = sub
    {
        my $id  = shift;
        my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1 });
        my $sth = $dbh->prepare(“SELECT * FROM mytable WHERE ID = ?”);

        my $cnt = 0;
        my @times = ();

    (以下略)


    このファイルを以下のように編集

    #!/usr/local/bin/perl -w

    use strict;
    use MyBench;
    use Getopt::Std;
    use Time::HiRes qw(gettimeofday tv_interval);
    use DBI;

    my %opt;
    Getopt::Std::getopt(‘n:r:h:’, \%opt);

    my $num_kids  = $opt{n} || 10;
    my $num_runs  = $opt{r} || 100;
    my $db        = “xxx_dev”; <=ここ(ベンチマークテストしたいDB名)
    my $user      = “root”; <=ここ (上に記載したDBのユーザー)
    my $pass      = “”;
    my $port      = 3306;
    my $host      = $opt{h} || “localhost”; <=ここ(上に記載したDBがあるホスト)
    my $dsn       = “DBI:mysql:$db:$host;port=$port”;

    my $callback = sub
    {
        my $id  = shift;
        my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1 });
        my $sth = $dbh->prepare(“SELECT * FROM users WHERE ID = ?”); <=ここ(ベンチマークテストしたいSQL文。)

        my $cnt = 0;
        my @times = ();

    (以下略)

    ちなみに、
    36行目あたりにある

    my $v = int(rand(100_000));


    の$vが

    my $sth = $dbh->prepare(“SELECT * FROM users WHERE ID = ?”);


    の?に入ります。
  6. いざ実行!

    # perl bench_example
    forking: ++++++++++
    sleeping for 2 seconds while kids get ready
    waiting: ———-
    test: 1000 0.000173 0.367284 0.001990417 1.990417 5024.07284503699
      clients : 10
      queries : 1000
      fastest : 0.000173
      slowest : 0.367284
      average : 0.001990417
      serial  : 1.990417
      q/sec   : 5024.07284503699


    できた!!やりました!!


    注意:今回bench_exampleで編集した部分を一つでも間違えると、以下のエラーが発生します。やっほー。


    forking: ++++++++++
    sleeping for 2 seconds while kids get ready
    waiting: ———-
    Use of uninitialized value in scalar chomp at /usr/local/share/perl/5.8.8/MyBench.pm line 98.
    Use of uninitialized value in split at /usr/local/share/perl/5.8.8/MyBench.pm line 99.
    Use of uninitialized value in addition (+) at /usr/local/share/perl/5.8.8/MyBench.pm line 101.
    (省略)
    Use of uninitialized value in numeric gt (>) at /usr/local/share/perl/5.8.8/MyBench.pm line 134.
    Use of uninitialized value in numeric gt (>) at /usr/local/share/perl/5.8.8/MyBench.pm line 134.
    Illegal division by zero at /usr/local/share/perl/5.8.8/MyBench.pm line 115.



    さらに
    今回、私の環境ではひっかかりませんでしたが、以下のperlモジュールが入っていないと、動かないみたいです。
    ・DBI
    ・DBD::mysql
    ・Time::HiRes

    おまけ
    macでのインストール方法。
    以下のコマンドを叩き込んでください。(perl入っていること前提です。)

    sudo port install p5-test-harness p5-test-simple p5-dbd-mysql p5-dbi p5-time-hires


    参考サイト: http://d.hatena.ne.jp/sukesam/20041015/1097812531

Rubyのコマンドライン引数と環境変数について(初心者向け)

0

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

お久しぶりです!
井上清晃(saronpasu)です。

今回は、ぐぐっと敷居を下げて Rubyビギナー向けの内容でお送りします。
Rubyのコマンドライン引数と環境変数について解説しようと思います。

コマンドライン引数の紹介

構文チェック( -c オプション)

Rubyに慣れないうちはよくお世話になります。$ ruby -c hoge.rb

このように実行すると、 hoge.rb内の構文チェックを行い、正常であれば

“Syntax OK”

と返してくれます。

文字コード宣言( -K オプション )

Rubyを実行する際の実行環境の文字コードを宣言します。$ ruby -Ku hoge.rb 

-K + 文字コード種類 と記述します。

UTF-8なら 「-Ku」

EUC-JPなら「-Ke」

Shift-JISなら「-Ks」です。 

これは、UTF-8で書かれたRubyスクリプトをWindowsで実行する場合には役に立ちます。

デバッグモードで実行( -d オプション )

$DEBUGというグローバル変数をTRUEにします。$ ruby -d hoge.rb

これを使う事で、 if $DEBUG then ~~ endとあるような箇所を実行する

デバッグモードで実行してくれます。

引数で実行しちゃう( -e オプション )

引数に書かれたコードをRubyスクリプトとして実行してくれます。$ ruby -e “print(‘Hello, World’)”

これを使う事で、Rubyでワンライナーが実行できます。

実行するディレクトリを指定( -C オプション )

特定のディレクトリにあるファイルに対して何かを実行する場合に便利です。$ ruby -C/home/user/document/ hoge.rb

この場合、/home/user/document/ ディレクトリに移動してから

hoge.rbを実行します。

例えば、スクリプト内で相対パスにあるファイルを読み書きするような

コードを書いている場合なんかは、このオプションが効果を発揮します。

cronを書くときにもいいかも!

ロードパスを指定して実行( -I オプション )

特定のディレクトリからrequireするように指定できます。$ ruby -I/home/user/lib/ruby/ hoge.rb

この場合、/home/user/lib/ruby/ ディレクトリが$LOAD_PATHに追加されます。

こうすることで何ができるのかというと、hoge.rbの中で

require ‘fuga’

と書かれていた場合に/home/user/lib/ruby/ も参照してくれます。

Rubyのlib/ディレクトリには入れたくはないけど、ライブラリとして他の

ディレクトリを指定したいという場合なんかには便利ですね。

require ‘/home/user/lib/ruby/fuga’

と書くよりは、

require ‘fuga’

と書いた方が断然シンプルで分かり易いですね。

requireしてから実行する( -r  オプション)

特定のファイルをrequireしてから実行してくれます。$ ruby -rkconv hoge.rb

と実行すると、 kconv.rbrequireしてからhoge.rbを実行してくれます。

何らかの理由で、hoge.rbにはrequireを書きたくない場合なんかに便利ですね。 

意外と知っていそうで使っていないコマンドライン引数についてのお話でした。

続いて、環境変数についても解説しましょう。

環境変数について 

デフォルトオプションを設定する( RUBYOPT 変数 )

上記で解説してきたコマンドライン引数を、いちいち入力しなくても

デフォルトで指定してくれるという便利な環境変数です。

Windowsの場合

マイコンピュータを右クリックし、プロパティの環境変数を開きます。

そして、システムの環境変数に以下の変数名、変数値を指定してみましょう。変数名 「RUBYOPT」
変数値 「-Ks」

こうする事で、Rubyインタプリタは常に文字コード「Shift-JIS」として実行してくれます。

RUBYOPTには複数の引数が指定できるのでこんな記述もできます。変数名 「RUBYOPT」
変数値 「-Ks -rkconv -rubygems」

上記の例では、「文字コードはShift-JIS、kconvRubyGemsrequireしてからRubyを実行する」という内容にです。

これで、$ ruby hoge.rb

と実行するだけで、$ ruby -Ks -rkconv -rubygems

と実行しているのと同じことになります。

Linux環境の場合 

ちなみに、bash環境の場合は.bashrcRUBYOPT変数を記述すると良いでしょう。

.bashrc RUBYOPT=’-Ke -rkconv -rubygems’
export RUBYOPT

こんな感じになります。

ロードパスを追加( RUBYLIB 変数 )

標準のlib/以外の場所からもライブラリを探索するように指定できます。

Windowsの場合

環境変数に次のように指定します。変数名 「RUBYLIB」
変数値 「C:\mylib\ruby」

こうすることで、標準のlib/以外にC:\mylib\rubyからもライブラリの

探索を行うようになります。

独自に作ったライブラリをC:\mylib\rubyfuga.rbと置いておくと

require ‘fuga’と指定するだけで、C:\mylib\rubyからも参照してくれます。

Linux環境の場合

bash環境の場合は、.bashrcRUBYLIB変数を記述すると良いでしょう。

.bashrcRUBYLIB=$HOME/lib/ruby
export RUBYLIB

おまけ:RubyGemsのパスを指定する( GEM_HOME 変数 )

Ruby標準ではないのですが、Ruby1.9.1では標準搭載になる方向ですし、

Rubyで何かを作る際にはかならずお世話になるので覚えておいて損はありません。

Windwosの場合

環境変数に次のように指定します。変数名 「GEM_HOME」
変数値 「C:\ruby\lib\gems\1.8\」

これを指定することで、RubyGemsC:\ruby\lib\gems\1.8\からGem

参照してくれます。

Linuxの場合

bash環境の場合は、.bashrcGEM_HOME変数を記述すると良いでしょう。

.bashrcGEM_HOME=/usr/local/lib/ruby/gems/1.8/
export GEM_HOME

Windows環境の場合についてですが、RubyForgeで配布されている

One-Click Installerを使うとGEM_HOME変数も設定してくれるようです。

なので、One-Click Installerを使っている場合は特に必要はありません。

知らなくても不自由はしないけど、知っていると得をする。

今回はそんな豆知識の紹介でした。

Rubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示する

0

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

佐藤伸吾です。

今回はRubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarth上で表示してみました。以下、その仕組みについて詳しく解説していきます。

Rubyを使ってPaSoRi経由でSuicaの乗車履歴を取得する

デモ動画

実際に動作している様子については、以下の動画をご覧下さい。

PaSoRi

PaSoRiとは、ソニーの非接触型ICカード「FeliCa」用の読み取り・書き込み機のことです。今回は「RC-S320」という機種を使用しました。

libpasori

libpasoriというライブラリが公開されており、これを用いれば、PaSoRiからの各種データ取得が可能です。

libpasori – RC-S320操作コード

Mac上にてlibpasoriを使用したい場合、以下のページが参考になります。

libpasori の共有ライブラリ化

libusb

libpasoriはlibusbも使用しますので、インストールして下さい。
% port search libusb 

libusb devel/libusb 0.1.12 Library
providing access to USB devices

% port variants libusb

libusb has the variants:
universal

% sudo port install libusb

テストプログラム

試しにC言語でテストプログラムを書いてみましょう。
単にデータを読み出すだけであれば、以下のようなプログラムでOKです。


#include
#include "libpasori.h" int main(void)
{
pasori *p;
felica *f;
uint8 d[16]; p = pasori_open(NULL);
pasori_init(p); f = felica_polling(p, 0xfe00, 0, 0);
felica_read_without_encryption02(f, 0x170f, 0, 0, d); printf("%d¥n", d[14]*256+d[15]); pasori_close(p); return 0;}

Suicaデータのフォーマット

Suicaデータのフォーマットについては
Ruby で Suica を覗いてみる
を参照してみて下さい。

rubyラッパーを書く

rubyからpasoriの機能を利用する為に、ラッパーを書きます。

詳細についてはRuby で PaSoRi 使ってみるを参照してみて下さい。


require 'dl/import' module Pasori
extend DL::Importable
dlload '/usr/local/lib/libpasori.dylib' typealias 'uint8', 'unsigned char'
typealias 'uint16', 'unsigned int'
#typealias 'uint16', 'unsigned short int' # libpasori.h
extern 'pasori* pasori_open(char*)'
extern 'void pasori_close(pasori*)'
extern 'int pasori_send(pasori*,uint8*,uint8,int)'
extern 'int pasori_recv(pasori*,uint8*,uint8,int)' POLLING_ANY = 0xffff
POLLING_SUICA = 0x0003
POLLING_EDY = 0xfe00 SERVICE_SUICA = 0x090f
SERVICE_EDY = 0x170f # libpasori_command.h
extern 'int pasori_init(pasori*)'
extern 'int pasori_write(pasori*,uint8,uint8)'
extern 'int pasori_read(pasori*,uint8,uint8)'
extern 'felica* felica_polling(pasori*,uint16,uint8,uint8)'
extern 'int felica_read_without_encryption02(felica*,int,int,uint8,uint8*)'
end
module Pasori
class << self
def felica_raw_values systemcode, servicecode, little_endian = false
values = []
b = Array.new(4).to_ptr
psr = pasori_open ""
pasori_init psr
flc = felica_polling psr, systemcode, 0, 0
i = 0
while felica_read_without_encryption02(flc, servicecode, 0, i, b) == 0
row = b.to_a('I')
data = ""
row.size.times do |j|
if little_endian
4.times { |k| data += sprintf "%02x", (row[j].to_i >> (8 *
k)) & 0xff }
else
data += sprintf "%08x", row[j].to_i & 0xffffffff
end
end
yield data if block_given?
values << data
i += 1
end
pasori_close psr
values
end
end
end
require 'pasori'
Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA,
true do |data|
puts data
end

路線・駅コード

路線・駅コードについては、路線・駅コード一覧からExcelファイルをダウンロードし、CSV形式で保存しておきます。

駅名から緯度経度を調べる

駅名から緯度経度を調べる為にGoogle Geocoderを使用しました。

GoogleMapsを利用したHTMLを生成する

erbを用いて、HTMLを生成します。GoogleMapsはJavaScriptから制御します。詳細についてはGoogle Mapsの基礎などを参照してみて下さい。


<%
require 'pasori' def Pasori.parse_suica_raw_value data
d = "%016b" % data[8, 4].hex
{
:type => data[0, 2],
:date => Time.local(d[0, 7].to_i(2) + 2000, d[7, 4].to_i(2), d[11, 5].to_i(2)),
:in => data[12, 4],
:out => data[16, 4],
:yen => data[20, 2].hex + (data[22, 2].hex << 8),
}
endrequire 'station'stations = Station.read('StationCode.csv.utf8')list = []
Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA, true do |data|
d = Pasori.parse_suica_raw_value data station_in = nil
station_out = nil list << [] list.last << d[:date]
stations.each do |s|
if s.area_cd.hex != 2 and s.line_cd.hex
== d[:in][0,2].hex and s.station_cd.hex == d[:in][2,2].hex
station_in = s
list.last << s
end
end stations.each do |s|
if s.area_cd.hex != 2 and s.line_cd.hex
== d[:out][0,2].hex and s.station_cd.hex == d[:out][2,2].hex
station_out = s
list.last << s
end
end list.last << d[:yen]
end%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script
src="http://maps.google.co.jp/maps?file=api&amp;v=2&amp;key=hogehoge"
type="text/javascript"
charset="utf-8">
</script> <style type="text/css">
#mymap {
position: absolute;
left: 0;
height: 400px;
width: 400px;
}
#list {
margin-left: 400px;
} </style> <script type="text/javascript"> var map; onload = function(){
map = new GMap2(document.getElementById("mymap"));
map.setCenter(new GLatLng(35.6984, 139.7732), 13);
map.addControl(new GLargeMapControl());
map.addControl(new GScaleControl());
map.addControl(new GMapTypeControl()); <% list.each do |inout| %>
setMarkers('<%= inout[1].station_name %>駅');
setMarkers('<%= inout[2].station_name %>駅');
<% end %>
}
onunload = GUnload;
onresize = function() { map.checkResize(); } var geocoder = new GClientGeocoder(); function moveTo(place){
geocoder.getLatLng(place, moveToThePlace); function moveToThePlace(latlng){
if(latlng){
map.panTo(latlng);
}else{
}
}
} function setMarkers(place){
geocoder.getLocations(place, setMarkersToThePlaces); function setMarkersToThePlaces(locs){
if(locs.Status.code == G_GEO_SUCCESS){
for(var i=0; i<locs.Placemark.length; i++){
var point = locs.Placemark[i].Point;
var lng = point.coordinates[0];
var lat = point.coordinates[1];
var latlng = new GLatLng(lat,lng);
var mk = new GMarker(latlng);
map.addOverlay(mk);
}
}else{
}
}
}
</script>
</head>
<body>
<h1>乗車履歴表示</h1>
<form onsubmit="moveTo(this.place.value); return false;">
<input type="text" size="40" id="place" />
<input type="submit" value="move" />
</form>
<div id="mymap" style="width:400px; height:400px;"></div>
<div id="list">
<table border="1">
<% list.each do |inout| %>
<tr>
<td><%= inout[0].strftime('%Y/%m/%d') %></td>
<td><%= inout[1].company_name %></td>
<td><%= inout[1].line_name %></td>
<td><a href="#" onclick="moveTo('<%= inout[1].station_name %>駅')">
<%= inout[1].station_name %></a></td><td>-></td><td><%= inout[2].company_name %></td>
<td><%= inout[2].line_name %></td>
<td><a href="#" onclick="moveTo('<%= inout[2].station_name %>駅')">
<%= inout[2].station_name %></a></td>
<td><%= inout[3] %>円</td>
</tr><% end %></table>
</div> </body>
</html>

GoogleEarthを利用して乗車履歴を表示する

乗車履歴を元にKMLというXMLファイルを生成し、Google Earthに読みこませれば、3Dツアーを再生することができます。KMLファイルの詳細についてはGoogle Earth KMLのレシピを参照してみて下さい。


require 'pasori' def Pasori.parse_suica_raw_value data
d = "%016b" % data[8, 4].hex
{
:type => data[0, 2],
:date => Time.local(d[0, 7].to_i(2) + 2000, d[7, 4].to_i(2), d[11, 5].to_i(2)),
:in => data[12, 4],
:out => data[16, 4],
:yen => data[20, 2].hex + (data[22, 2].hex << 8),
}
end$stderr.print "乗車履歴読み取り中"require 'station'stations = Station.read('StationCode.csv.utf8')list = []
Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA, true do |data|
d = Pasori.parse_suica_raw_value data station_in = nil
station_out = nil list_ele = [] list_ele << d[:date]
stations.each do |s|
if s.area_cd.hex != 2 and s.line_cd.hex == d[:in][0,2].hex
and s.station_cd.hex == d[:in][2,2].hex
station_in = s
list_ele << s
end
end stations.each do |s|
if s.area_cd.hex != 2 and s.line_cd.hex == d[:out][0,2].hex
and s.station_cd.hex == d[:out][2,2].hex
station_out = s
list_ele << s
end
end list_ele << d[:yen] next unless station_in and station_out list << list_ele $stderr.print '.'
end$stderr.print "\n"require 'rexml/document'
require 'open-uri'
require 'nkf'puts '<?xml version="1.0" encoding="UTF-8"?>'
puts '<kml xmlns="http://earth.google.com/xml/2.0">'
puts '<Document>'
puts '<name>kinshicyou.kml</name>'
puts '<visibility>1</visibility>'
puts '<open>1</open>'
puts '<desctiption>desctiption</desctiption>'def output_point(lon, lat)
puts '<visibility>1</visibility>'
puts '<Style>'
puts '<IconStyle>'
puts '<Icon>'
puts '<href>root://icons/palette-3.png</href>'
puts '<x>96</x>'
puts '<y>160</y>'
puts '<w>32</w>'
puts '<h>32</h>'
puts '</Icon>'
puts '</IconStyle>'
puts '</Style>'
puts '<Point>'
puts '<extrude>1</extrude>'
puts '<altitudeMode>relativeToGround</altitudeMode>'
puts '<coordinates>' + lon + ',' + lat + ',50</coordinates>'
puts '</Point>'enddef add_heading
$heading += 90
$heading = $heading % 360
enddef output_placemark(g, inout)
address = inout[1].station_name + '駅(東京)'
point = g.getPoint(address)

if point
lon = point[0]
lat = point[1] name = inout[0].strftime('%Y/%m/%d')
name += ' '
name += address
name += ' '
name += '乗車' puts '<Placemark>'
puts '<name>' + name + '</name>'
puts '<desctiption>description</desctiption>'
puts '<LookAt>'
puts '<longitude>' + lon + '</longitude>'
puts '<latitude>' + lat + '</latitude>'
puts '<range>200</range>'
puts '<tilt>60</tilt>'
puts '<heading>' + $heading.to_s + '</heading>'
add_heading()
puts '</LookAt>' output_point(lon, lat) puts '</Placemark>'
end address = inout[2].station_name + '駅(東京)'
point = g.getPoint(address)

if point
lon = point[0]
lat = point[1] name = inout[0].strftime('%Y/%m/%d')
name += ' '
name += address
name += ' '
name += '下車' puts '<Placemark>'
puts '<name>' + name + '</name>'
puts '<desctiption>description</desctiption>'
puts '<LookAt>'
puts '<longitude>' + lon + '</longitude>'
puts '<latitude>' + lat + '</latitude>'
puts '<range>200</range>'
puts '<tilt>60</tilt>'
puts '<heading>' + $heading.to_s + '</heading>'
add_heading()
puts '</LookAt>' output_point(lon, lat) puts '</Placemark>'
endendrequire 'geocoder'key = 'hogehoge'
format = "xml"
g = Geocoder.new(key, format) $stderr.print "緯度経度取得中"$heading = 0;
list.reverse.each do |inout|
output_placemark(g, inout)
$stderr.print '.'
end$stderr.print "\n"$stderr.print "経路情報描画中"puts '<Placemark>'
puts '<Style>'
puts '<LineStyle>'
puts '<color>99ff0000</color>'
puts '<width>6</width>'
puts '</LineStyle>'
puts '</Style>'
puts '<LineString>'
puts '<altitudeMode>relativeToGround</altitudeMode>'
puts '<coordinates>'list.reverse.each do |inout|
address = inout[1].station_name + '駅(東京)'
point = g.getPoint(address)

if point
lon = point[0]
lat = point[1]
puts sprintf("%s,%s,50", lon, lat)
end address = inout[2].station_name + '駅(東京)'
point = g.getPoint(address)

if point
lon = point[0]
lat = point[1]
puts sprintf("%s,%s,50", lon, lat)
end $stderr.print '.'
endputs '</coordinates>'
puts '</LineString>'
puts '</Placemark>'
$stderr.print "\n"puts '</Document>'
puts '</kml>'$stderr.print "処理終了!!\n"

まとめ

いかがでしたか?前回のGainerや今回のPaSoRiといったハードウェアをRubyから制御することによって、アイディア次第で面白い仕組みを比較的簡単に作ることが可能になります。

次回もRubyと何かを組み合わせて面白い仕組みを紹介する予定です。よろしければこのブログのRSSも購読してみて下さい。次回をお楽しみに!!

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

簡単&便利 Capistranoのススメ (導入編)

0

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

ごきげんよう、TrinityTです。

桜も咲き始め春の到来を感じますね!

今日は最近になって使い始めたとても便利なツール、Capistranoについて説明します。

Railsを使っている人はもちろん、使っていない人両方にオススメです。

Capistranoって何?

簡単に言うと「複数の環境に同じ処理を同時に実行させる」ツールです。

・昔はSwitchTowerと呼ばれてました。

・RoR環境でしか使えないと誤解されがちだが、他の環境でも十二分に便利。

・(サービスがPerlで書かれてる)はてなでも導入

・RoR環境だと基本的なコマンドが揃っているため特に便利。

何がうれしいの?

WebアプリでよくあるパターンとしてAPサーバが複数ある場合に各サーバに対して全く同じ処理(APを転送&APサーバ再起動…etc)を行う場合ってありますよね?

そういう場合にCapistranoを導入すれば以下のようなメリットが生まれます。

・複数サーバに対する処理をコマンド一回で出来るようになる

・ほとんどの処理をCapistranoを介して行うように出来るので、運用がわかりやすくなる

補足

Capistranoは1台にインストールされていれば良い

基本的に「Capistranoの起動サーバ1台」にインストールされていれば良いです。(全てのサーバにインストールする必要は無い。)

並列処理 するサーバのユーザ、パスワードは同じにする

並列処理する関係上、ユーザ名とパスワードは同じものを設定しておく必要があります。

今回の前提

以下の環境で、既にruby,rubygemsはインストール済みとします。

・CentOS5.1

・ruby1.8.6

.rubygems0.9.2

また複数サーバが無いとメリットが感じにくいので、以下の3台構成を想定します。

・サーバtest IP:192.168.0.21 ※Capistrano実行

・サーバap1  IP:192.168.0.22

・サーバap2  IP:192.168.0.23

インストール方法  

gemで一発でインストール可能です。

gem install capistrano

インストール後は、ヘルプを出して確認しましょう。

cap -h

ついでにバージョンも確認します。最新版は2.2.0です。

gem list capistrano

>capistrano (2.2.0)

使用方法(Helloworld編)

まず、以下の内容のファイル「deploy.rb」を作成します。

# 基本定義 

set :application, “hoge”  #プロジェクト名
set :user, “hoge”           #sshユーザー名

set :password, “hoge”    #sshパスワード

# role定義 

role :test, “192.168.0.21”

role :ap, “192.168.0.22”,”192.168.0.23″

# タスク

task :hw, :roles => [:test, :ap] do

  run “echo HelloWorld! $HOSTNAME”

end

task :gb, :roles => [:test, :ap] do

  run “echo GoodBye! $HOSTNAME”

end

基本定義としてsshのアクセス情報などを書きます。

roleは各タスクを実行するサーバのIPアドレスorホスト名を書きます。

タスクとしてHelloworld、GoodByeをそれぞれ表示するものを定義しました。

「run」はssh定義ユーザでコマンド実行をするためのタスクです。(後述)

さて、それでは各タスクを実行してみましょう。

コマンドは「cap -f <定義ファイル名>  <タスク名>」で実行できます。

cap -f deploy.rb hw

>実行結果 

  * executing `hw’
  * executing “echo HelloWorld! $HOSTNAME”
    servers: [“192.168.0.21”, “192.168.0.22”,”192.168.0.23″]
    [192.168.0.21] executing command
    [192.168.0.22] executing command
    [192.168.0.23] executing command
 ** [out :: 192.168.0.21] HelloWorld! test
 ** [out :: 192.168.0.22] HelloWorld! ap1
 ** [out :: 192.168.0.23] HelloWorld! ap2
    command finished

cap -f deploy.rb gb

>実行結果 

  * executing `gb’
  * executing “echo GoodBye! $HOSTNAME”
    servers: [“192.168.0.21”, “192.168.0.22”,”192.168.0.23″]
    [192.168.0.21] executing command
    [192.168.0.22] executing command
    [192.168.0.23] executing command
 ** [out :: 192.168.0.21] GoodBye! test
 ** [out :: 192.168.0.22] GoodBye! ap1
 ** [out :: 192.168.0.23] GoodBye! ap2
    command finished

実行した結果、$HOSTNAMEが各ホスト名に変換されています。

これにより各サーバ上でコマンドが確認できました。

なお、使用可能なタスクは以下の通りです。

・run   コマンド実行
・sudo   root権限でコマンド実行 実行対象サーバでsudoの設定をする必要有
・pu   ファイル作成
・delete  ファイル削除
・render  Erbテンプレートをレンダリング。
・transaction 複数の処理をまとめてトランザクションとする
・on_rollback transactionのロールバックを行う

長くなってしまったのでRailsで使用する場合の説明は次回に。

Rails的コメントアウト

0

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

こんにちは。KBMJのWebプログラマーの本多です。

通常、HTMLコメントアウトと言えば

<!– ここにコメントを書きます –>

と書きますが、この場合表示はされなくてもソース上には残りますよね。

コメントを残してソースの意味などを記入する分には良いのですが、例えば「一旦表に見せるのは不味い」などの事情があり、

急遽隠す場合などにはソースからも見られたくない…そんな時に役に立つのが、今回紹介するRailsコメントアウトです。

文字通り「見えなくなります」。

やり方はいたって簡単。

RHTMLファイル

<!– ここにコメントを書きます –>

と書くべきところを

<% if false %> ここにコメントを書きます <% end %>

と書きます。

if文とは、条件を満たす場合のみ中のコードを実行(記述)する。

という訳で if と false の2つを組み合わせる事で「必ず条件に合致しない」という意味になります。

必ず条件に一致しないため、「中のコードは実行されない」 = 「見れない」という訳ですね。

また、コメントの中にRailsのコードを書いていた場合、HTMLコメントアウトの場合ですと中のコードが実行され、余計な負荷がかかりますが、Rails的コメントアウトの場合は中のコードは実行されませんので、よからぬ負荷を軽減してくれたりもします。

結論:邪魔なコードはHTMLソースからも見えなくしちゃおう。

でも静的なHTML文の中でこれを書いても意味はないです・・・。

RHTMLファイルの中でのみ利用してください。

GOOD RAILS!!

使えるvalidate一覧

0

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

こんにちは

zenpouです。

先週ずっとインフルエンザでダウンしてました。

今日はvaildationについて書いてみます。

railsにある強力なvalidation機能で、どんな制限ができるか一覧化してみました。

validates_acceptance_of :checked, :accept => ‘1’
# 規約同意の検証

validates_presence_of :name
# 値がある事を検証

validates_format_of :email, :with => /[^@]+@[^@\.]+\.[^@\.]+/
# 正規表現での検証

validates_associated :frend
# 関連するオブジェクトの検証結果が正しいか検証

validates_confirmation_of :password
# 確認入力のチェック用
# _confirmation というアクセサが自動生成される。

validates_each :password { |record, attr, value| //////////////code//////////// }
# コード部分を使って検証条件をかける。

validates_inclusion_of :type , :in=> %w(男性用 女性用)
# 指定された値の範囲内であることを確認する。

validates_exclusion_of :password :in => /^\d+$/, :message => ‘数字のみは危険です’
# 指定された値の範囲外であることを確認する。

validates_length_of :name, :maximum=> 30, :minimum => 3
# 文字数の検証

validates_numericality_of
# カラムが数値か検証

validates_uniqueness_of
#カラムがユニークか検証

こんな感じです。

vaildationを使うと、dbに保存されるタイミングでチェックが行われる上、

エラーメッセージも管理できるので、webアプリケーションを作成するのに

非常に便利です。

せっかくなので、Thin を使って実践

0

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

こんにちは、O2です。

今日は、[書評]でも、単語集でもなく、気になっていた「mongrel」ではないWEBサーバの「Thin」を、まずはローカル環境(*1)に入れて、ローカル環境テストは、「Thin」でやってみることにした。

*1:WindowsXP 環境です。

mongrelとは

mongrel – Ruby + C(拡張ライブラリ) で書かれた httpd。 最近の Ruby の流行のフレームワーク( Ruby on Rails など )にもデフォルトで対応しており簡単に使うことができる。

Thinとは

最近話題の軽量・高速が売りのWebサーバです。

mongrelより、パフォーマンスの向上は、1秒あたりの要求につき最大25%向上し、およそ15%減のメモリ使用率。

1月の0.6.1バージョン以来、TCP/IPソケットと同様にUNIXソケットの聴取もサポートしており、ますます高速化してい る。(らしい)

 インストールしてみよう

>gem install thin

 あら、簡単!!

Bulk updating Gem source index for: http://gems.rubyforge.org
Select which gem to install for your platform (i386-mswin32)
 1. thin 0.7.1 (x86-mswin32-60)
 2. thin 0.7.1 (ruby)
 3. thin 0.7.0 (x86-mswin32-60)
 4. thin 0.7.0 (ruby)
 5. Skip this gem
 6. Cancel installation
> 1 (←Windows環境なので、「1」を選択)

起動は・・・

> thin start

 あら、簡単!!

起動後確認

mongrel 起動後の、Rubyメモリ使用量より、Thin起動後のメモリ使用量のほうが、約2MBくらい少なかったです。(数回、交互に起動してみた結果)

当分、Thinを使って見て、次の機会には、「Ebb」を使って見ようと考えてます。

aptanaでrailsをデバッグ実行する

0

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

こんにちは、KBMJの中平@railsエンジニアです。

今回はruby on railsのデバッグ方法について説明したいと思います。

通常、rails開発のデバッグは「ruby script\brekpointer」を使ったり、ruby-debugで「debugger」を利用していると思います。


しかし!私はaptanaというIDEで開発をしておりますので、今回は
aptana使っている人のみが出来るrailsのデバッグ方法を説明します!

まあ、何かといいますと、[eclipse]や[visual studio]にもある、デバッグ実行モードがaptanaにもありますので、それを使ったrailsのデバッグ方法を説明します。

知ってる人にはたいした技術情報ではないのですが、IDEに慣れていない人はデバッグ実行の存在を知らないことも多いので、これを機にaptana使いをひそかに増やしたい・・・

■デバッグ準備
aptanaのインストール方法はaptanaのインストールと使い方についてを見てください。

デバッグに必要なものをインストール

・ruby-debug-base
・ruby-debug-ide

これがないと、aptanaでrailsをデバッグ実行できず、エラーが出ていたので調べたところ、こちらのサイトを参考にさせていただきました。

http://programmer-toy-box.sblo.jp/article/7977379.html

以下のようにインストールします。

gem install ruby-debug-base –include-dependencies
gem install ruby-debug-ide –include-dependencies

■rubyのデバッグの設定
aptanaのウィンドウ→設定→Ruby→デバッガーのUse ruby-debug libraryをチェック。

■railsをデバッグモードで起動してみる
1.aptanaのサーバービューを開く(aptanaのウィンドウ→ビューの表示→サーバー を選択)

2.サーバービュー上で右クリック→追加 で起動したいprojectのサーバー設定をします。
  (すでにある人は作らなくてもいいです。)

3.通常railsは右矢印アイコンで起動ですが、ここで虫アイコンをクリックすることでrailsをデバッグモードで起動します。


■ブレイクポイントを設定して、指定した箇所でrailsを止めてみる。

エディターで止めたい行の左端のグレーの部分をダブルクリックすると、青く丸いアイコンが付きます。
これがブレイクポイントとなり、デバッグ起動時にこの場所でrailsが一時停止してくれます。
これは、デバッグ起動中に追加しても問題ありません。

画像の左端の青い丸印がそれです。 

aptanaでrailsのデバッグ方法

■ブレイクポイントで停止したらなにがうれしいの?

デバッグ実行時にブレイクポイントでrailsが一時停止するとaptanaのデバッグウィンドウが表示されます。
デバッグウィンドウで出来ることは

1.railsで使っている変数の中身がすべて見ることが出来ます。
 インスタンス変数は、selfという変数の中に色々入っていまして、sessionの値やuriなど、rails自体のインスタンス変数も取得できます。
 またローカル変数も問題なく見ることが出来ます。


2.ステップ実行できる
 バグが発生したときなど、怪しい部分を1行ずつ実行して動作確認することが出来ます。
 
 ステップ実行方法

 デバッグウィンドウのメニューに実行という項目がありその中にステップ実行するボタンがあります。

 ・ステップインは外部メソッドなどがあればその中に入ってさらに1行ずつ実行
  (ライブラリを使っていればその中も1行ずつ実行できます)
 ・ステップオーバーは外部メソッドの中には入らずそのメソッドのみを実行
 ・ステップリターンは外部メソッドに入ってもとの呼び出し元に戻りたいときに使います。

 ステップ実行をやめて処理を再開する際は、同じくメニューの実行から再開というボタンをクリックすることで通常にrailsが動作します。

3.メソッドの呼び出し順番がわかる。
 今いるメソッドがどこから呼び出されているのか、また何を呼び出しているのかが一目でわかります。

まとめますと、 

変数の中身を見ながらプログラムの処理を1行ずつ追いかけることが出来ますので、大変便利なrailsのデバッグ方法だと思います。

このように、変数の中身が見ることが出来ます。


■aptanaのデバッグモードにおけるデメリット
 デバッグモードは通常モードよりメモリやCPUを消費します。
 私のマシンもメモリ1Gの時には重くて使えなかったのですが、2Gにしてみたら問題なく使えました。(PCの性能によりますので、各自試してみてください)

aptanaでrailsの開発している方はこのデバッグ方法も使ってみてはいかがでしょうか?

empty?とblank?の違いって?

0

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

今回は、Ruby on Railsのメソッドについてお話します。

よく、if文で、

中身がなければ、 

こんな処理をしましょう、という 条件式を書くことがありますね。

そのときに、

empty?と書く人(場合)と、

blank?と書く人(場合)がいました。

どう違うのか?

というわけで

手元にある たのしいRuby で調べてみます。

empty?は、文字の長さが0かどうかを調べるメソッド。

しかし、blank?はどこを探しても載っていない。

なぜだ????

よく出てくるメソッドなのに。理由の前に、blank?との違いを書いておきます。

blank?は、

「文字の長さ0」 または 「nil」 ならば true を返すメソッドです。

もしempty?を使用した場合に、

空文字ではなくnilだと、エラーになってしまうので、 

 blank?を使うと良いわけです。

さて、答えですが。

blank?は、Rubyではなく、Railsのメソッドだったんですヨ。

毎日Railsのプログラムに埋もれていると、

そのメソッドが、Ruby発祥のものか、Rails発祥のものかが

分らなくなってきますし、

あまり意識してませんでした。

が、blank?は、Railsのおかげだったと

知りました。

Railsサマ、気づかなくてすみませんでした。。。という

気持ちになってみたり。

これからも、ちょっと意識して

使い分けしてみたいと思います。

ローカルでコマンドを打つとアスタリスクで囲まれたエラーが出る

0

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

はじめまして。mugiです。
本日は ruby script/server など、コマンドを打つと
妙なエラーが出るときの対処法をご紹介します。
レアケースな気がしますが…。

ある日、ローカルを立ち上げようとして ruby script/server を打つと、

*****************************************************************
*config.breakpoint_server has been deprecated and has no effect.*
*****************************************************************
/****/****/****/…. (以下ファイル名など)
というエラーが表示されました。調べていくうちに、おそらくローカル環境がおかしいだろう
というところまで突き止めまして、
インストールされている gem を調べてみました。

gem list
でインストールされている gem を見ます。

*** LOCAL GEMS ***

actionmailer (1.3.3.7116, 1.3.3, 1.2.5)
    Service layer for easy email delivery and testing.
…   
妙なバージョンがインストールされていました。1.3.3.7116 ですね。

gem uninstall actionmailer –version 1.3.3.7116
で削除します。他にも *.7116 系がインストールされていたら削除してください。

C:\svn\***>ruby script/server webrick => Booting WEBrick… => Rails application started on http://0.0.0.0:3000 => Ctrl-C to shutdown server; call with –help for options [2008-03-10 15:32:38] INFO WEBrick 1.3.1 [2008-03-10 15:32:38] INFO ruby 1.8.5 (2006-12-25) [i386-mswin32] [2008-03-10 15:32:38] INFO WEBrick::HTTPServer#start: pid=1324 port=3000
これで起動するようになります。
いつ *.7116 系をインストールしてしまったのかは、いまだに謎です。

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を使用して作ってみました。

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

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

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

最近人気な記事