RubyonRailsでクエリを直接実行したいときの方法

2009-06-16
このエントリーをはてなブックマークに追加

ActiveRecord::Base.connection.execute(実行したいクエリ)

インデックス張りなおしたいときや更新クエリをごそっと投げたいときなんかは意外と重宝します。

これにコールバック関数とか組み合わせることができると便利なんですよね。あ、BackgrounDRb使えばいいのか。

RubyonRailsでメールを送信するサンプルをもうちょっと詳しく

2009-05-29
このエントリーをはてなブックマークに追加

RubyOnRailsで日本語メールを送信するでActionMailerの使い方を簡単に説明しましたが、これだけだと自分の備忘録にすらなっていないので追記。

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => ‘SMTPサーバ’,
  :port => 25,
  :authentication => :login,
  :user_name => ‘アカウント’,
  :password => ‘パスワード’
}

上記をconfig/environment.rbに追記。

送信するときには「RubyOnRailsで日本語メールを送信する」の例であれば、コントローラ等から

Hoge.deliver_sendmail

とすればOK。「Hoge」はクラスですね。「deliver_」はお約束です。アンダースコアの後ろがメソッド名になります。~というメソッドに紐付くメールを送信しなさい、っていうイメージですかね。

RubyでHTTP経由でのXMLの受信と解析

2009-05-27
このエントリーをはてなブックマークに追加

まぁ簡単にいうとRSSリーダーみたいなことをしたいときに使います。相手がRSSじゃなくてもOKです。Web上のコンテンツを読み込みたいときに使います。ただ、今回のサンプルだとgetしかできないので、制限はあります。

require ‘open-uri’

open(“http://www.tt-house.com/atom.xml”){|f|
  data = f.read
  xmldoc = REXML::Document.new data
  xmldoc.elements.each(“feed/entry/title”){|element|
    p element.text
  }
}

文字コードのことは気にしてません。

これでハセテツラボRSSのタイトル一覧が取得できます。他のサービスとのマッシュアップ等にも使えますが、やっぱりデータのpostもできないと使い勝手は悪いですよね。

postをするサンプルは次回にしましょう。

RubyonRailsのform_tag備忘録

2009-05-22
このエントリーをはてなブックマークに追加

頻繁に使うくせに、いつまでたっても覚えられない。ついついコピペして使いまわしちゃうから「あれ、どうやって書くんだっけ」の繰り返しになってしまう。

これは、確認も含めて整理しておこう。

<% form_tag ({:controller => ‘コントローラ’, :action => ‘アクション’}, {:method => ‘post’, :multipart => true}) do %>
  <dl>
    <dt>入力してください。「テキストボックス」</dt>
    <dd><%= text_field_tag :hoge, nil, :style => ‘width:320px;’ %></dd>
    <dt>選択してください「ラジオボタン」</dt>
    <dd>
      <label><%= radio_button_tag :status, ‘0’, ‘checked’ %>非表示</label>&nbsp;|&nbsp;
      <label><%= radio_button_tag :status, ‘1’ %>表示</label>
    </dd>
    <dt>コメントしてください。「テキストエリア」</dt>
    <dd><%= text_area_tag :comment, nil, :style => ‘width:320px;height:120px;’ %></dd>
    <dt>ファイルをアップロードしてください「ファイル」</dt>
    <dd><%= file_field_tag :file_name %></dd>
  </dl>
<% end %>

methodはデフォルトでPOSTなので、特に指定する必要はありません。ファイルをアップロードしない場合は

<% form_tag :controller =>’コントローラ’, :action => ‘アクション’ do %>

でもOKです。text_field_tagの「:hoge」は要素名、「nil」は値。アクション側で受け取るときは

params[‘hoge’]

で受け取れます。

Railsであればform_forが猛烈に便利なのですが、すべてのフォームがモデルとイコールなわけではないので、やっぱりform_tagの出番も増えます。

設計が間違ってるのかなぁ。

RubyonRailsでファイルI/Oを走らせずにCSVを作成、圧縮してダウンロードさせる方法

2009-04-24
このエントリーをはてなブックマークに追加

長いタイトルですな。

つまり、サーバ上でファイルを作って圧縮、ダウンロードは結構簡単にできるんです。ただ、ファイル生成しちゃうとファイル名をユニークにしなきゃいけなかったり、ファイルのダウンロードが終わったら削除しなきゃいけなかったり、気分的に手間なんですよね。タイミングによってはダウンロードが開始される前に削除されちゃったりして、びっくりでした。

で、オンメモリでCSVファイル作って圧縮、ダウンロードまでしてみました。まぁメモリが安くなったからこそできる技ですよね。CSVが小さければいいけど、昔はこんなこと怖くてできなかった。

require ‘rubygems’
require ‘zipruby’

data = “a,b,crnA,B,C”
Zip::Archive.open_buffer(buffer, Zip::CREATE) do |arc|
  arc.add_buffer(“download.csv”,data)
end

send_data(buffer , :type=>’application/zip’, :filename => “download.zip”, :disposition=>’attached’)

オンメモリでCSVちゅーのはどうでもよくて、ポイントはZip::Archiveのadd_bufferでしょう。ziprubyのバージョンにもよりけりなのかもしれません。今回利用したのは0.2.9です。あとはsend_fileじゃなくてsend_dataを使うあたりですかね。

 

RubyでZIP圧縮、パスワードも設定する

2009-03-13
このエントリーをはてなブックマークに追加

RubyonRailsアプリケーションでサーバサイドでファイル圧縮、パスワードの設定をしてダウンロードさせる必要があったので調べてみました。

ZipRubyがあったりRubyZipがあったり、どっちがどうなんだか、相変わらずRubyは混乱します。今回は評判のよさそうなZipRubyを使いました。gemでインストールできて、バージョンは0.2.9でした。バージョン低いのがちと気になります。

gem install zipruby

これだけでインストールは終わりです。

require ‘rubygems’
require ‘zipruby’

Zip::Archive.open(‘hoge.zip’,Zip::CREATE) do |arc|
  arc.add_file(‘test.pdf’)
end

Zip::Archive.encrypt(‘hoge.zip’, ‘password’)

コレだけです。簡単すぎる。

複数ファイルをひとまとめにしたい場合は

arc.add_file(‘test.pdf’)

 

を繰り返せばOK。ただ、フォルダごとごっそり圧縮、という方法は不明。フォルダ名を引数に指定したら怒られてしまいました。当然の結果。

最後の行がパスワードの設定です。ZIPファイル作るときにパスワードを設定するのではなく、既存のZIPファイルに対してパスワードを設定する、というイメージですね。Lhaplusではちゃんと解凍できました。

RubyでMySQLに接続

2009-03-12
このエントリーをはてなブックマークに追加

MySQL/Ruby と Ruby/MySQL の二つがあるようです。どっちがどっちか混乱しましたが、MySQL/Rubyがgemでとってこれて、Cで書かれたAPIのようです。Ruby/MySQL はRubyで書かれているようで、比較的低速らしいです。今回はMySQL/Rubyを利用しました。

gem install mysql

で一式インストールできます。PHPのPEARやRubyのgemは、一度つかったらやめられません。これは堕落なのでしょうか。

で、今回はWindows上にMySQL5.0をインストールしてつないでみたのですが、バリバリ文字化けました。DBはUTF8で作ってあって、ソースも以下のようにUTF8であることを明記していました。

require ‘rubygems’
require “mysql”
require ‘iconv’

$KCODE = ‘UTF-8’

db = Mysql::connect(“ホスト名”, “ユーザ名”, “パスワード”, “DB名称”)
rs = db.query ‘クエリ’
rs.each do |item|
  p item[0]
end

なんでなんで?と調べていたら、my.ini(あー、iniってあたりがWindowsだなー、Linuxだとmy.cnfだったかな?)の[mysqld]に

default-character-set=utf8
skip-character-set-client-handshake

の追記が必要らしい。これはクライアントからの接続時に「文字コードはUTF8でっせ」とデフォルトで設定してあげるためのものらしいです。「set names utf8」と同じ意味ですね。これで文字化けずにWindows上でRubyとMySQLを利用することが出来るようになりました。

これまではC#とSQL Serverで統計とか集計のプログラム書いてたけど、Rubyの方がラクチンなんですよね。Railsばっかり注目されてますけど、Rubyは便利ですよ。

 

Tags: ,

RubyonRailsでのselect_dateの使い方

2009-01-20
このエントリーをはてなブックマークに追加

何回書いても忘れてしまう。

view側

<%= select_date(Date.now, :use_month_numbers => true, :prefix => “from_date”) %>

Controller側

from_date = Date.parse(params[‘from_date’][‘year’] + “-” + params[‘from_date’][‘month’] + “-” + params[‘from_date’][‘day’])

これで日付型のfrom_dateに格納される。
ただ、不正な日付(2月31日等)はparseのタイミングでエラーが出るので、正確な日付かどうかのチェックは必要。

Date.valid_date?(params[‘from_date’][‘year’].to_i,params[‘from_date’][‘month’].to_i,params[‘from_date’][‘day’].to_i)

NGの場合はnilが返ってくる。

RubyonRailsでBackgrounDRbを使って定期イベント、非同期処理を行う

2009-01-06
このエントリーをはてなブックマークに追加

開発環境はWindows、本番環境はLinuxであったために悲しいことになった。Windows上ではforkが動かない(実装されていない)ので、BackgrounDRbを稼動させると怒られてしまう。まぁコーディングだけしてテストサーバにアップ、テストというちまちましたことを繰り返せば済む話なので我慢しましょう。

では、まずはインストールから。

gem install chronic packet
ruby script/plugin install http://svn.devjavu.com/backgroundrb/trunk
rake backgroundrb:setup

インストールはコレだけです。BackgrounDRbはgemじゃなくて、Railsプロジェクとに対してインストールするということですね。複数のプロジェクトがあったら、それごとにインストールします。この場合、インストールという表現は不適切なんでしょうね。

rakeを実行するとBackgrounDRb用のマイグレーションファイルができあがっています。ジョブのキューを保存しておくためのモノっぽいです。これを実行しておかないとBackgrounDRbを起動させたときに怒られます。怒られてばっかりですね。

ruby script/generate worker hoge

これでhogeというworkerができます。中に「create」っていうメソッドがありますが、コンストラクタですね。自分でメソッドを追加します。ここで嬉しいのがActiveRecordやActionMailerが使えることでしょうか。まぁ当然なのですが、非常にありがたいです。


:backgroundrb:
  :ip: localhost
  :port: 11006
:schedules:
  :hoge_worker:
    :hogehoge:
      :trigger_args: 0 * * * * * *

backgroundrb.ymlに上記のように書いておくと、毎分0秒にHogeWorderのhogehogeというメソッドを実行してくれます。インターバルはcrontabと同じ書き方ですが、「秒」と「年」が増えています。「年」って使うのかなぁ。。。オリンピックリマインダー?

コントローラなどから処理を投げたいときには

MiddleMan.new_worker(:worker => :hoge_worker, :method_name => :hogehoge)

と記述します。もちろん引数も渡せます。

 ちなみに、BackgrounDRbは事前に起動しておく必要があります。リスナーが別スレッドで待っていて、それに対して処理を投げるようなイメージでしょうか。若干メモリが不安です。

ruby script/backgroundrb start
ruby script/backgroundrb stop

これで起動と終了です。複数同時起動はしません。

インストールの仕方等々、バージョンによって違いがあるような気がします。細かいところで悩んだことが多かったです。備忘録を兼ねて、同じことで悩んでいる方の助けになればと思います。

RubyでDatetimeオブジェクトをフォーマット

2008-12-30
このエントリーをはてなブックマークに追加

Datetimeオブジェクト.strftime(“%Y/%m/%d %H:%M”)

上記で、「2008/12/30 3:42」といった感じでyyyy/mm/dd HH:MM形式で出力される。まぁどの言語も大して変わりませんな。

Tags: