2011-08-30

rubyで出力のバッファリングをやめる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで以下のような感じのコードを書きます。

print "xxx"
sleep 2
print "yyy"
sleep 2
print "zzz"

xxxと出てからyyyと出てzzzと出てくるのを期待したりするのですが、このように出力されないで
実際は、しばらく待って一気にxxxyyyzzzと出力されることになります。

これは標準出力する際に、バッファに一時的にためていてある程度たまってから出力しているせいなわけで
これを期待するように動かすには、
STDOUT.sync = true
print "xxx"
sleep 2
print "yyy"
sleep 2
print "zzz"

のように
STDOUT.sync = true
を追加すればOKです。

バッファリングされるのは標準出力だけでなく自分で書き込み用に作成したファイルへの書き込みでも同様な感じになります。
動作ログをファイルに取っている場合とかは、バッファリングせずにすぐに書き出してもらいたいわけです。
そんな時は、以下のような感じにファイルハンドラに
fw.sync = true
のような感じのものを追加すればOKです。
fw = File.open("eeee.txt",'w')
fw.sync = true
fw.puts 'aaa'
sleep 2
fw.puts 'bbb'
sleep 2
fw.puts 'ccc'

2011-08-22

自動水やり器を試す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ちょっとしばらく家をあけたのですが、その際に鉢植えに水を自動でやる方法はないかと探してみました。
すると
http://www.geocities.jp/babulunooya/sub1.htm#mizu
を見つけて試してみました。

しかし、うちでは日当たりがいまいちなせいか、あまり水が出ていない気配です。 

なのでポンプを使って自動水やり器を作ってみようと思ったわけです。
電池で動くポンプが欲しかったのですが、安いものが見つからず。
そして見つけたのが以下の灯油ポンプです。

   

こちらは自動で止まる機能も付いています。
これを買って試してみたところ水でも動きました。
おまけに水を出す方の先端が水にぬれると自動で止まる機能もついています。

これでいいのでは? と思ったのですが、
一度水にぬれて自動で止まってしまうと、スイッチを入れなおさないと再度スイッチを入れなおさないと動きませんでした。

それでは改造だ!と思ったわけです。
しかし電子工作の知識が全然なのです。
そもそもモーターを動かすこともろくに出来ずに出かける時間になってしまいました。

結局、キャップをしめた2リットルペットボトルの底に穴を開けて植木鉢の上におきっぱなしにするだけで出かけてしまいました。
結果は、何個かはすっからかんになって草も枯れかけていたのですが、いくつかは水が残っていたりしました。

穴の数とかをうまく調整すれば
数日ぐらいならば、これでよかったのかも・・・
という感じです。

だけど今度は買ってしまった灯油ポンプを改造してみようと思ったりしたのでした。

2011-08-21

腹筋月間、挫折!

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今月は、何回でもいいから腹筋をするぜ! とか宣言しましたが、挫折です。 ちょっと泊りがけのお出かけやら遅くまでの飲みとかが続き途絶えてしまいました。 一度、途絶えるとやる気がでない~~~ いかんですね。

2011-08-12

rubyでpdf出力したときのspec

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyでThinReportsを使ったりとかしてpdfを出力する機能を作った場合のテスト方法です。

PDF::Readerを利用します。
なので以下のようにgemでインストール。
gem install pdf-reader

今の段階でインストールされるPDF::Readerのバージョンは、
0.10.0
のようです。

0.10.0を使っているときの方法です。
(0.11.0alphaが最新のようですが、0.11.0ではやり方が違う感じになりそうです)

テストではrspecを使っているとして以下のようなテストケースを書けばよさげです。

require 'spec_helper'

describe OtamesiController do
  it "PDFに想定したデータが埋め込まれる" do
    require 'pdf/reader'
    #以下の結果がpdfを出力しているとします
    get 'otameshi', :id => 1
    output = ""
    receiver = PDF::Reader::TextReceiver.new(output)
    PDF::Reader.string(response.body,receiver)
    output.should match(/埋め込みデータ1/)
    output.should match(/埋め込みデータ2/)
  end
end
これで確認できるのは、想定したデータがPDFのどっかに埋め込まれていることの確認にすぎないので
PDFで出力された値の文字サイズとかは上記ではわかりません。
receiverを変えたらひょっとしたらサイズとかも取れる可能性はあります。


2011-08-09

ActiveScaffoldで削除の時のメッセージをカスタマイズする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで削除の際に出る確認メッセージをカスタマイズする方法です。 単純にメッセージを変えるのであれば以下のような感じでよいです。
config.delete.link.confirm = "削除してもいいのかい?ホントにいいのかい?"
単純な変更ならば、上記でよいのですが どうせならば何を削除するのかを、ちゃんとメッセージしたい場合は、以下のような感じになります。 例えばusersテーブルの情報を削除する場合です。 削除メッセージに削除対象のnameカラムの内容を表示するようにします。
config.delete.link.confirm = nil
config.delete.link.dhtml_confirm = UserConfirm.new
上記で指定したUserConfirmを以下のように定義します。
class UserConfirm < DHTMLConfirm
  def onclick_handler(controller, link_id)
    code = ""
    if link_id =~ /delete-([0-9]+)-link/
      name = User.find($1).name
    end
    script = <<-END
if (confirm("「#{name}」を削除していいのかい?ホントにいいのかい?")) window.gFireModalLink();
END
  end 
end
このUserConfirmクラスを app/controller/users_controller.rb のコントローラーのクラスの上にでも書いておけばOKです。 (他の場所の方がよいかもしれないですが・・・)

2011-08-02

rubyで帳票を作るのに便利そうなThinReportsがバージョンアップしていた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
一度、Rubyで帳票を作るのに便利そうな
ThinkReports
を以下で紹介させていただきました。
rubyで帳票

そのThinkReportsがバージョンアップしてpreview3になった模様です。
preview3ではpdfの出力ができるようになったようで、かなり便利そうです。
また画像もレポートに入れることが出来るようになった模様です。

以前のpreview2とはかなり変わっているようですので試してみました。

利用するには以下の2つが必要なようです。
・ThinReports Editor:帳票デザインツール
・ThinReports Generator for Ruby:帳票作成環境

インストール方法は、
http://osc.matsukei.net/projects/thinreports/wiki/Installation_Guide
を見ればよいのですが、それぞれ以下のような感じです。

・ThinReports Editorのインストール
Windows環境で作業を行います。
http://www.thinreports.org/download/
から最新版をダウンロードしてインストールする。

・ThinReports Generator for Rubyのインストール
linux環境で実行します。
su -
gem install thinreports --pre


で使い方です。

まずは帳票のデザインをします。
http://osc.matsukei.net/projects/thinreports/wiki/Getting_Started
こちらを見ればなんとなく使い方がわかります。
データを当てはめるところにしっかり名前をつけておけばよい感じです。
以下のような感じのを作ってみました。
日本語を使う場合は、IPAフォントを以下から取得してインストールする必要があります。
http://ossipedia.ipa.go.jp/ipafont/index.html

preview2で作ったものは、preview3では使えなくなっていました。
今回は大きく変わっているようなので仕方がないとは思いますが、正式リリース時にはpreview3で作ったものも利用できるようになってもらいたいです。
そうでないと、導入するのに躊躇しちゃいますからねぇ。

デザインしたものにデータをはめ込み、pdfを作成するのは以下のような感じです。
ちなみにThinReportsではruby1.9.2を推奨しているようですが、都合により1.8.7で試しています。
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'thinreports'

report = ThinReports::Report.new :layout => 'test_test.tlf'
report.start_new_page do |page|
  page.item(:aaa).value('おらおら')
  list = page.list(:test_list)
  data = [['コード1','おなまえ1','バルバル'],
          ['コード22','おなまえ12','バルバルバル'],
          ['コード22333','おなまえ12345','バルバルバル場るバルバル'],
          ['コード2233344455555','おなまえ1234567890','バルバルバル場るバルバルバリバリバリバリ'],
          ['コード2233344455555667788','おなまえ1234567890なまえ~~~~','バルバルバル場るバルバルバリバリバリバリバロバロバロ'],
         ]
  data.each do |d|
    list.add_row do |row|
      row.item(:code).value(d[0])
      row.item(:name).value(d[1])
      row.item(:valval).value(d[2])
    end
  end
end

report.start_new_page do |page|
  page.item(:aaa).value('オラオラオラオラオラオラオラオラオラオラオラオラオロオラオラオラオラオラオラオラオラララララララララララララ')
  list = page.list(:test_list)
  for i in 0..50
    list.add_row do |row|
      row.item(:code).value('code' + i.to_s)
      row.item(:name).value('name' + i.to_s)
      row.item(:valval).value('valval' + i.to_s)
    end
  end
end

File.open('test_out.pdf', 'w') do |f|
   f.puts report.generate(:pdf)
end

puts 'Done'

上記のレポートレイアウトファイルとレポート出力サンプルプログラムをいかにおいておきました。
https://github.com/vivahiraj/thinreports_sample

このプログラムで作成されたPDFファイルは以下のようになります。
https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0Bx24kLioozIcMjk3MTRlNzMtNjQxYy00N2I4LTg3MzItODZhMmFmM2MwY2Ri&hl=ja

なかなかよさげです。
本番リリースでは、preview3で使ったものが、そのまま(もしくは若干の修正で)使えるようになっているとうれしいですね。





2011-08-01

WBS「トレたま」で放送された商品をAmazonで検索してみた(201107放送分)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
WBSのコーナーの「トレたま」で放送された商品をAmazonで検索してみました。

自宅で簡単フォトブック (放送:7月29日)
 見つかりませんでした

携帯バイブがパワーアップ (放送:7月28日)
 amazonにありました
 パワーアップ携帯電話バイブ

好きな声ナビ (放送:7月27日)
 見つかりませんでした

ジッパー式イヤホン (放送:7月26日)
 amazonにありました
 ジップアップ インナータイプ イヤフォン「Zipbuds(ジップバズ)」 ピンク
 Zipbuds(ジップバズ) / Tangle-Resistant Earbuds (Black with Pink) - イヤホン - 【直輸入】
 Zipbuds(ジップバズ) / Tangle-Resistant Earbuds (Pink with White) - イヤホン - 【直輸入】

ツイッターが新聞に (放送:7月25日)
 見つかりませんでした

寝てても安心! (放送:7月22日)
 amazonにありました
 快眠防災まくら

自動ブレーカー切断装置 (放送:7月21日)
 amazonにありました
 スイッチ断ボール ※地震時に自動的にブレーカーを落とし、通電火災を防ぎます!
 スイッチ断ボール ※地震時に自動的にブレーカーを落とし、通電火災を防ぎます!
 スイッチ断ボール ※通電火災防止グッズ!低コストで登場!

球体掃除機! (放送:7月20日)
 amazonにありました
 BLACK&DECKER orb(オーブ) 【CD1枚程のスペースに収まる】 充電式ハンディクリーナー パールマジェンタ ORB48PM
 BLACK&DECKER orb(オーブ) 【掃除機に見えない球体デザイン】 充電式ハンディクリーナー ホワイト ORB48W
 BLACK&DECKER orb(オーブ) 【掃除機に見えない球体デザイン】 充電式ハンディクリーナー ブラック ORB48B

貼って作る名画! (放送:7月19日)
 見つかりませんでした

天気で変わる水やり機 (放送:7月18日)
 見つかりませんでした

家電を操る魔法のつえ (放送:7月15日)
 amazonにありました
 WAND 13種類のジェスチャーを記憶させられる杖型学習リモコン カイミラ魔法の杖 KYMERA WRC10209
 WAND 13種類のジェスチャーを記憶させられる杖型学習リモコン KYMERA WRC10209
 WAND カイミラ魔法の杖 13種類のジェスチャーを記憶させられる杖型学習リモコン KYMERA WRC10209
 WAND カイミラ魔法の杖 13種類のジェスチャーを記憶させられる杖型学習リモコン KYMERA WRC10209【並行輸入品】
 WAND カイミラ魔法の杖 13種類のジェスチャーを記憶させられる杖型学習リモコン KYMERA WRC10209
 学習リモコン【KYMERA WAND BEARER カイミラの魔法の杖 WRC10209】【正規品】
 WAND 魔法の杖 KANDELA LEDマジックキャンドル
 カンデラの魔法の杖 Kandela Wand & Candle pack ※カイミラの魔法の杖の第2弾!キャンドルをつけたり消したり自由自在!
 カイミラの魔法の杖 KYMERA WAND BEARER ※イギリス生まれの魔法の杖の形をした学習リモコン!
 カイミラの魔法の杖 KYMERA WAND BEARER ※イギリス生まれの魔法の杖の形をした学習リモコン!

火花が消える (放送:7月14日)
 見つかりませんでした

自分を抱きしめるウエア (放送:7月13日)
 見つかりませんでした

ちっちゃ~いトイデジカメ (放送:7月12日)
 amazonにありました
 CHOBi CAM ONE HD【ちょビッカム ワン HD】
 CHOBi CAM ONE ちょビッカム ワン
 防水 CHOBi CAM WP シルバー ちょビッカムWP

エアタッチシステム (放送:7月11日)
 見つかりませんでした

クール寝袋 (放送:7月8日)
 見つかりませんでした

“ショットガン”虫取り機 (放送:7月7日)
 amazonにありました
 【虫捕りグッズ】虫ハンター Mushi Hunter (Fly-GoodBye)
 虫ハンター Fly-GoodBye 2個セット ※電池、薬剤不要!強力な吸引力で一気に虫を吸い獲る!

手書き電子メモ帳 (放送:7月6日)
 amazonにありました
 KING JIM ハンディメモ「マメモ」 ブラック×ブラック TM2クロ

音声認識エレベーター (放送:7月5日)
 見つかりませんでした

2役こなす水筒 (放送:7月4日)
 amazonにありました
 マックマー Twin Cap Bottle ティーフリー グリーン 500ml AA0026
 マックマー Twin Cap Bottle ティーフリー ブラウン 500ml AA0025
 マックマー Twin Cap Bottle ティーフリー ブラック 500ml AA0024

楽々測定 健診スキャナー (放送:7月1日)
 見つかりませんでした

今月は毎日、腹筋をしてみよう月間にしてみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ぽっこりお腹がキニナル今日この頃です。

なので今月は、毎日10回でも20回でも、ちょっとでもいいから腹筋をしてみようと思ってみました。

さてさて続けられるでしょうか?