Posts Tagged ‘Ruby’

, , | No Comments | 8月 18th, 2008

 よりよい家計簿を目指して、RubyAMFを使ってみる。Rails + Flex3.0 でやろうと。

インストール(Rails側)

$ script/plugin install --force http://rubyamf.googlecode.com/svn/trunk/rubyamf/

設定

 インストールすると config/rubyamf_config.rb が出来るので、ここで設定を行う。

無視したいフィールドがあったら、下記のように指定する。

ClassMappings.ignore_fields = ['created_at','created_on','updated_at','updated_on']

ActionScript側で、変数名をキャメルにするかアンスコ区切りにするか。

ClassMappings.translate_case = false

public var created_at:Date;

ClassMappings.translate_case = true

public var createdAt:Date; // created_at in rails

AS側で、動的にRailのモデルと関連づけを出来るようにするか。ARから派生したモデル以外でも使えるみたい。

ClassMappings.assume_types = true

指定は、以下のようにする。
# Flash:: fl.net.registerClassAlias(‘User’,User)
# Flex:: [RemoteClass(alias='User')]

ClassMappings.assume_types = false のとき、以下のようにしてRails側とAS側のマッピングをするか。

ClassMappings.register(:actionscript => 'Address', :ruby => 'Address', :type => 'active_record')

とすると、
Ruby側

class Address < ActiveRecord::Base

AS側

[RemoteClass(alias="Address")]
public class Address {

デフォルトだと、ASから送られてくる日付は Time オブジェクトになるが、これを DateTime オブジェクトにするかどうか。true で DateTime, false で Time。

ClassMappings.use_ruby_date_time = true

これを true にすると、associationを eager load してくれるみたいです。false にすると、いちいち設定する必要があります。

ClassMappings.check_for_associations = true

AS側で保存したときに、Rails側でどのように受け取るかの設定。

ParameterMappings.scaffolding = false

として、AS側でsaveしたとき

save(context);

Rails側では、以下のように受け取ります。

def save
  @context = params[0]
ParameterMappings.scaffolding = true

として、AS側でsaveしたとき

save(
   {context:context}
);

Rails側では、以下のように受け取ります。

def save
  @context =
     params[:context]

書きかけ。

, , , | 2 Comments | 5月 1st, 2008

まず、ImageMagickのインストールです。jpg,pngを扱うときはlibpng, libjpeg が必要になるのであらかじめインストールしておきます(後から入れても動いた)。

ダウンロード先

libjpegのインストール

Independent JPEG Group のサイトから、jpegsrc.v6b.tar.gz のソースをダウンロードしてきます。コンパイルしたあと、make install-lib とすることで jpeglib がインストールされるようだ。

$ wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz
$ tar xvzf jpegsrc.v6b.tar.gz
$ ./configure --prefix=/usr/local/
$ make
# make install
# make install-lib

これで通らないときは、 *.so のファイルを作る –enable-shared オプションを付けて configure すると通るかも。

./configure --prefix=/usr/local --enable-shared

libpngのインストール

INSTALL には、 configure して make すればおkみたいな感じで書いてあるけど、通らないときがある。libpng インストール を参考にして、予め用意されているmakefile を編集することでインストール出来るようだ。

$ wget http://jaist.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.28.tar.gz
$ tar xvzf libpng-1.2.28.tar.gz
$ cd libpng-1.2.28
$ cp script/makefile.linux makefile
$ vi makefile
 
ZLIBの辺りを以下のように書き換える。
 
ZLIBLIB=/usr/local/lib
ZLIBINC=/usr/local/include
#ZLIBLIB=../zlib
#ZLIBINC=../zlib
 
$ make
# make install

なぜかmakeが1回では通らず、2回makeすると通る。(RedHat ES4で2回起きた)

ImageMagickのインストール

$ wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.4.1-0.tar.gz
$ tar xvzf ImageMagick-6.4.0-11.tar.gz
$ cd ImageMagick-6.4.0
$ ./configure --prefix=/usr/local
$ make
$ make test
# make install

make install で

/bin/install: cannot create regular file `/usr/local/man/man1/cjpeg.1': No such file or directory

と出てしまったときは、ディレクトリが出来ていないようなので、以下のコマンドを実行してから再トライしてみれば通るはず。

# install -d /usr/local/man/man1

これやると、libMagick* 系のライブラリがないって言われる… /usr/local/lib/libMagick* を /lib/ 以下にコピーすればいいんだけど、しっくりこないです。

Rmagickのインストール

Rubygemsがインストール済みの上で以下を実行

# gem install rmagick

, | No Comments | 4月 20th, 2008

以下のサイトを参考にRailsでQRコード作ってみた。

MacにGDとRubyGDをインストール

$ sudo port install gd2
$ sudo port install rb-gd

QRコードクラスライブラリ for Ruby をDLしてきて、RAILS_ROOT + ‘/lib’ 以下に設置。

このまま使ってみると、qrcode.rb の Regexp.compileでエラーが出るので、 該当の箇所を書き換える。RailsでQRコードを生成を参考にして、Regexp.comple の第3引数でデフォルトエンコードに戻すようです。

# Regexp.compile(n3_search))
# ↓みたいに引数を追加。合計4箇所あるはず。
Regexp.compile(n3_search, false, 'n'))

ReadMeに QrcodeのコンストラクタでQrcode用のデータを @path を設定しているので、これを変更しろとのことで、 @path = RAILS_ROOT + ‘/lib/qrcode_data’ と変更する。これは高速化のために必要と書いてある。

あとは、読み込みたいところで以下のようにして使う。RubyでQRコードを作ろうを参考に以下のような形で。

ruby script/console とか立ち上げると

>>require 'qrcode_img'
>> url = "http://d.hatena.ne.jp/omochist/"
>> qr = Qrcode.new
>> qr_data = qr.make_qrcode(url)
>> qr_image = Qrcode_image.new
>> qr_image.image_out(qr_data, 'png', 'ecpplue.png')

これで、RAILS_ROOT に ecpplus.png っていうQRが出来ています。

QRコードの大きさを変えたいときは、Qrcode_image に @module_size, @quiet_zone というのがあるので、これを調節する。

@module_size # 全体の大きさ
@quiet_zone # 余白

>> qr_image = Qrcode_image.new
>> qr_image.set_module_size(7)  # 1-8が指定可能なようだ
>> qr_image.set_quiet_zone(1)  # 1-8が指定可能なようだ

あとはさっきと同じような感じ。

| No Comments | 1月 9th, 2008

Tmailというライブラリを使うと、メールを解析して扱いやすくしてくれます。

Tmailのインストール

# gem install tmail

パース方法

ファイルからパースする

メールがファイルであるならば、Fileクラスのインスタンスを渡してTMailクラスのインスタンスを作る。

receive1.rb

#! /usr/bin/ruby -w
require 'rubygems'
require 'tmail'
 
file = File.open('mail.txt'){|f| f.read}
email = TMail::Mail.load(file)
p 'to: ', email.to
p 'from', email.from

TMail::Mail.load を使ってFileクラスのインスタンスを渡すとそれを解析してくれる。mail.txt で FromとToが以下のようになっていたとすると、それぞれが配列に入る。

From: from_address@ecpplus.net
To: to_address@ecpplus.net

$ ruby receive1.rb
"to: "
["to_address@ecpplus.net"]
"from: "
["from_address@ecpplus.net"]

標準入力からパースする

receive2.rb

#! /usr/bin/ruby -w
require 'rubygems'
require 'tmail'
 
email = TMail::Mail.parse(STDIN.read)
p 'to: ', email.to
p 'from', email.from
$ cat mai.txt|ruby receive2.rb
"to: "
["to_address@ecpplus.net"]
"from: "
["from_address@ecpplus.net"]

添付ファイルを取得する

tmailダウンロードするとサンプルがついているので、それにならう。

receive3.rb

#! /usr/bin/ruby
require 'rubygems'
require 'tmail'
 
def main
  mail = TMail::Mail.parse(STDIN.read)
  mail.to # To: を取得
  mail.from # From: を取得
  idx = 1 # 複数の添付ファイルがあった場合のファイル名にしてる
  mail.parts.each do |m|
    m.base64_decode
    File.open("#{idx}.#{ext(m)}", 'w') {|f|
      f.write m.body
    }
    idx += 1
  end
end
 
CTYPE_TO_EXT = {
  'image/jpeg' => 'jpg',
  'image/gif'  => 'gif',
  'image/png'  => 'png',
  'image/tiff' => 'tiff'
}
 
def ext( mail )
  CTYPE_TO_EXT[mail.content_type] || 'txt'
end
 
main
$ cat mai.txt|ruby receive3.rb

これで、1.jpg, 2.png のようなファイル名で添付ファイル保存されるので、これで何かしたかったら分かるように保存しておけばOK。

メールサーバに来たメールを解析するとき

メールサーバにメールが届いたらそれをトリガーにして エイリアス作って渡してあげます。トリガーのひきかたは、省略。
/etc/aliases に以下のように記述して、 chihaya@ に来たメールを引数で渡すようにします。

chihaya: "|/usr/bin/ruby  /home/chihaya/receive3.rb"

あとは STDIN.read で標準入力を読んで処理すれば大丈夫。解析後のデータを使ってお好きなように。

| No Comments | 1月 2nd, 2008

オブジェクトのプロパティを send メソッドで参照するには、send の引数にプロパティの名前を渡せばいい。

たとえば、以下のようなUserクラスがあったときに send で nameをひっぱって来るには以下のようにする。

class User
  attr_accessor :name, :email
  def initialize(name, email)
    @name = name
    @email = email
  end
end
 
>> user = User.new('chu', 'chu@example.com')
=> #<user:0x2b5764296468 @email="chu@example.com", @name="chu">
>> user.name
=> "chu"
>> user.send('name')
=> "chu"

設定ファイルでフィールド決めて内部で処理するようなときはよく使う。

次に、send を使ってオブジェクトのプロパティに 値を設定したい場合は、 send に引数を二つ渡す。 ruby は プロパティへのアクセスも全てメソッドになってる。

name属性への代入は、 name= というメソッドに引数を渡していることになる。

>> user = User.new(‘chu’, ‘chu@example.com’)
=> #
>> user.send(‘name=’, ‘chu2′)
=> “chu2″
>> user.name
=> “chu2″

send について調べてみたら、以下のようになっていた。第一引数にメソッド名を渡して、そのメソッドに対する引数は可変長の第二引数以降に渡せばいいみたい。

send(name[, args ... ])
send(name[, args ... ]) { .... }
__send__(name[, args ... ])
__send__(name[, args ... ]) { ... }

オブジェクトのメソッド name を、引数に args を渡して呼び出し、メソッドの実行結果を返します。
ブロック付きで呼ばれたときはブロックもそのまま引き渡します。メソッド名 name は文字列かSymbol です。
send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。
send, __send__ は、呼び出し制限 にかかわらず任意のメソッドを呼び出せます。
ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください。

download the hurt locker  
UA-682965-1