2011年1月18日火曜日

本日の将棋Part2・BonanzaGAKOI!

Bonanzaってやたら大駒切るよね。あの棋風はほんと独特だと思う。

やぽー。今回は二本だて。「U549」新メンバーのふゆさんとの対局になりました。徐々に体を慣らしていきたい…。


この棋譜へのコメントは「 こちら 」までどうぞ。

押してねっ→BlogPeople「趣味の世界」ブログランキング

本日の将棋・悪役

ごめんなさい!

と、わかる人にだけわかる「ごめんなさい」を書いておいてやっふー。そんなに久方ぶりでもない将棋の時間だよ。

一人暮らしも順調に面倒くさくなってきて、洗い物?なにそれおいしいの状態。おいしくないよネー。食べたら致死だよネー。

将棋そのものは久しぶりではないとはいえ、所属しているサークル「U549」のメンバーとはものすごい久しぶりの対局になりました。コトの顛末は以下からどうぞ…。


この棋譜へのコメントは「 こちら 」までどうぞ。

押してねっ→BlogPeople「趣味の世界」ブログランキング

2011年1月16日日曜日

meta_where を使った検索

検索というかなんというか。

u1 = User.new :name => "user1"
u1.comments << Comment.create :message => "hoge hoge"
u1.comments << Comment.create :message => "hoge moge"
u1.save


u2 = User.new :name => "user2"
u2.comments << Comment.create :message => "hoge fuga"
u2.save


u3 = User.create :name => "user3"

こんな感じのデータがあったとして、

User.search("user") # => [u1, u2, u3]
User.search("hoge") # => [u1, u2]

というような結果を求めるとき、 User.search の実装は以下のようになる。

scope :search, lambda {|query|
  includes(:comments).group("users.id").where(:name.like => "%#{query}%" | :comments => {:message.like => "%#{query}%"})
}

Comment に複数の属性があるときは :comments => [{:message.like => "%#{query}%"} | {:updated_at.lt => Date.today}] のように渡せばいい。ゴチャゴチャするけど。

ちなみに includes ではなく joins を使うと、検索結果にコメントの設定されていない u3 がヒットせず、 group を付けないと、 "hoge" の検索結果が [u1, u1, u2] になってしまうので、 users.id でグループ化する必要がある。らしい。

押してねっ→BlogPeople「趣味の世界」ブログランキング

本日の将棋・ひさびさに

「相振り中飛車で攻め潰す本」買ったんですけど、全然読めてないです。

棋譜こめったーも中途半端な出来栄えのような、サーバが不安定というか、落ち着いたら誰でも使えるようにしていきたいですねぇ。


この棋譜へのコメントは「 こちら 」までどうぞ。

2011年1月12日水曜日

[Rails3] meta_whereのコンディションとdelayed_jobのハマりどころ

都合上「何にでもヒットする meta_where のコンディション」が必要になったので、作りかた。

MetaWhere::Condition.new :id, nil, :like

これでおk。

catch_all = MetaWhere::Condition.new :id, nil, :like
Books.where(catch_all | :title.matches % "相振り中飛車で攻")

こんな感じで使える。場合によっては便利…?

それからdelayed_job、これはいろいろと fork されているみたいだけど、今回は有名な https://github.com/collectiveidea/delayed_job こちらを採用させてもらいました。

Mail.delay.deliver

とメソッドチェインするだけで遅延してくれるという優れ物ですが、実用までのメモと自分用のメモ。

$ vi Gemfile
gem "delayed_job"


$ vi config/initializers/delayed_job_config.rb

Delayed::Worker.destroy_failed_jobs = false


$ bundle
$ rails generate delayed_job
$ rake db:migrate
$ ./script/delayed_job start

これで使えるようになる。なお production 環境で使う場合は

$ rake db:migrate RAILS_ENV=production
$ RAILS_ENV=production ./script/delayed_job start

こんな感じ。

で、ハマりどころは、

  • コントローラやProcインスタンスに対しては使えない。適宜 SomethingHelper::should_be_delayed などを定義して使う。
  • delay を呼び出すコードの周り(どの辺までなのかは知らん)が変わったら delayed_job デーモンを再起動すること。

このふたつ。見事にハマりました。

ま、リソースが足りなきゃいくら遅延しても意味ないけどね。

お名前.comのサーバがまた落ちている…。

押してねっ→BlogPeople「趣味の世界」ブログランキング

[Rails3] ActiveRelation

やたら忘れるのでメモ。

RailsCastsの http://media.railscasts.com/videos/239_active_record_relation_walkthrough.mov この動画がとても参考になった。それにしてもRails使いはMacの人が多いなー。やっぱり故郷がMacだと必然的にそうなるのかしら。

えーそれで、リレーションを作成するには

ActiveRecord::Relation.new User, User.arel_table

とかするみたい。引数はモデルと Arel テーブル。この Arel テーブルには事前に定義した条件があってもいいような悪いような。

で、メソッドチェインできるのは

  1. where
  2. having
  3. select
  4. group
  5. order
  6. limit
  7. offset
  8. joins
  9. includes
  10. lock
  11. readonly
  12. from

の12個。

チェインを繋げるとデフォルトで(というか普通に) AND になるようだけど、 OR にする方法ないのかな…。Arel使えってことか。

押してねっ→BlogPeople「趣味の世界」ブログランキング

2011年1月11日火曜日

[Rails3] link_to do

link_to にブロックが渡せるなんてどこに書いてあったんだ…知らなかった。

例えば Rails で

    画像
リンク文字列

のようなレイアウトにしたい場合にブロックが使える。例えばHaml:

= link_to @user do
  = image_tag "#{@user.name}.png"
  %br
  = @user.name

マクロとレキシカルスコープがあればRuby最強なのになと思う信者でした。

押してねっ→BlogPeople「趣味の世界」ブログランキング

[Rails3] prototype_legacy_helper

Rails3になってUJS(UnobtrusiveJavaScript)が推奨されるようになり、 rails.js がコアとして動作するようになったのは時代に乗ってる感じでいいのだけれど、いかんせんドキュメントもサンプルも少ないのが現状なので、以前のヘルパも使いたくなってくるのが人情というもの。

例えば「link_toヘルパに :remote をつけて特定のtext_fieldの内容を送信」という動作をさせるにはどうすればいいのか、いくら検索してもさっぱりわからなかった。Creative Commonsにオライリーから出ているRails3本の中身が載っているらしいけれど、やっぱり英語…ということで腰が引けてしまう。

そこで、過去の遺産を使うには prototype_legacy_helper が便利らしい。

$ rails plugin install https://github.com/rails/prototype_legacy_helper

これで link_to_remote などといった旧来のヘルパを扱うことができるようになる。上記「特定の text_field の中身を送信」は link_to_remote:with オプションでばっちり。

...
<%= text_field_tag :address_zipcode %>
<%= link_to_remote "AutoComplete", :url => find_zipcode_path, :with => "'zipcode='+$('address_zipcode').value" %>
...

:with オプションについてはネットにいろいろと情報があるけど、個人的に今回初めて使ったので解説を載っけておく。

ようするに "" で括られたJavaScriptらしい。で、JavaScriptの文字列でなければならず、 :with => "'key1=value1&key2=value2'" と指定すると、 params[:key1] == value1 などになる。 & で区切ってハッシュにしてくれるので、いちいちデータをシリアライズしなくてもいいみたい。

DOMオブジェクトを選択して中身を取り出すのはお馴染 $ 関数に value メソッドだけど、あくまで「JavaScriptの文字列」として渡す = '' で括る必要があるので、少し面倒くさい。そのサンプルは上のコードにある通りで、 "'zipcode='+..." とクォーテーションがいかにも読み辛いけど、Emacsの正規表現に比べたらマシと思えばマシ…かも知れない。

押してねっ→BlogPeople「趣味の世界」ブログランキング

2011年1月10日月曜日

Rails3 で大量の一括Insert

ができるらしい。

https://github.com/zdennis/activerecord-import

プラグインではないようなので v0.2.4 をダウンロードしてコピー。Wikiに載っているような使い方もできるけれど、個人的には

columns = [:first_name, :family_name]
values   = [["John", "Smith"], ["Jane", "Due"], ["Gonbe", "Nanashi"]]
Person.import columns, values

のような使い方のほうがメモリ効率がよさげかなと。

押してねっ→BlogPeople「趣味の世界」ブログランキング

[Ruby][Rails] CamelCase と snake_case

結構どこを探してもなかったんよね。
ヘルパーのAPIドキュメントにも無かったっぽいし。

つまりリフレクションしたいときとかにクラス名(CamelCase)をメソッド名(snake_case)に変換して __send__ したい場合があるじゃないのよさ。そんなときに一発変換できないかなと思って探してみたら、こんなメソッドが出てきました。

"CamelCase".underscore     # -> "camel_case"
"snake_case".camelize      # -> "SnakeCase"
"snake_case".pluralize     # -> "snake_cases"
"snake_cases".singularlize # -> "snake_case"
"snake_cases".classify     #  = "snake_cases".singularlize.camelize

classify メソッドなんてものもあった。で、こういうことがわかると検索したときに「あ、こんなに情報あるんじゃん」という事態になってしまう何かの法則。

あると便利だと思うので、Rails3からバラして使うのも良しですね。

押してねっ→BlogPeople「趣味の世界」ブログランキング

2011年1月4日火曜日

Ubuntuで動画を携帯向けにエンコードする

まず、Ubuntuに入っているffmpegのバージョンは古い、というより本家ffmpeg1日に1コミット以上という凄まじい早さで開発が進んでいるので、とりあえずSVNリポジトリからチェックアウトして、コーデックもろもろもインストールし、ffmpegのビルド&インストールも済んでいるものとします。

参考URLはこちら: http://ubuntu.futene.net/

変換は make で行おうと思ったのですが、ファイル名にスペースがあると面倒なことになりそうなので、Rakeを使うことにしました。といっても、ルールの定義をするだけな上に基本的なことも理解していないので、特に clean タスクの定義はぞんざいです。まぁ自分用なので、気に入らない方はスルーでおk。

さて、ffmpegへ渡すコマンドラインですが、ffmpegの取る引数はもう現代の魔法ですね。ボクも意味はほとんどわかりませんが、ネットの海から持ってきた情報をかき集めただけのものです。こんな感じ。

$ ffmpeg -i infile.avi -qmin 1 -qmax 51 -pix_fmt yuv420p -vcodec libx264 -coder 0 -vpre medium -bufsize 1000 -g 60 -vlevel 12 -qns -qpel -mbd 2 -s 320x240 -r 29.97 -b 512k -maxrate 5000 -acodec libfaac -ac 2 -ar 44100 -ab 96k -f 3g2 outfile.3g2

コーデックには一応フリーのものを使っています。で、これを2パスエンコードしようということで、Rakefileの登場なわけですね。

SRC = FileList["*mp4"]
DST = SRC.ext("3g2")
INSTALL_DIR = "/media/********************/Video/"


FFMPEG = "ffmpeg"
UNRECOGNIZED_OPTIONS = "-hq -bitexact -vprofile baseline -4mv -trell -aic -me full -fixaspect -muxvb 192 -muxab 64"
OPTIONS = "-qmin 1 -qmax 51 -pix_fmt yuv420p -vcodec libx264 -coder 0 -vpre medium -bufsize 1000 -g 60 -vlevel 12 -qns -qpel -mbd 2 -s 320x240 -r 29.97 -b 512k -maxrate 5000 -acodec libfaac -ac 2 -ar 44100 -ab 96k -f 3g2 -threads 8 -y"


task :default => DST


task :clean do
  DST.each do |file|
    if File.exists? file
      sh "rm '#{file}'"
    end
  end
  sh "rm -f *log"
  sh "rm -f *mbtree"
end


task :install => :default do
  raise RuntimeError, "マウントされてませんよ" if not File.exists? INSTALL_DIR
  DST.each{ |file| sh "cp '#{file}' #{INSTALL_DIR}" }
end


rule ".3g2" => ".mp4" do |t|
  sh "#{FFMPEG} -i '#{t.source}' -pass 1 #{OPTIONS} '#{t.name}'"
  sh "#{FFMPEG} -i '#{t.source}' -pass 2 #{OPTIONS} '#{t.name}'"
end

ほんとシンプルですが、 rake install とすると特定のディレクトリへコピーするようにしました。携帯への転送がWindowsじゃないと行えないので、NTFSパーティションに書き込むための措置です。それが見えなかったら RuntimeError 投げます。

というわけで自分用でした。

※転送しても見れなかったらごめんなさい。

押してねっ→BlogPeople「趣味の世界」ブログランキング

2011年1月2日日曜日

Windowsで再生できるのにUbuntuで再生できないDVD

知り合いの家に「ニャーン」じゃなくて「ニャァア)〜()ン」となく不思議な猫ちゃんがいるんだけど、しかも2匹いるんだけど、なんであんな色っぽいというか、(いや色っぽくはないな、雄だし)変な、というか、ツッコミたくなる鳴き声になっちゃったのでしょうね。甘え上手…? 違うと思う!

あいむふぁいんあんじゅー? 今日はDVD関連のお話ですよ。

レンタル屋さんで「おおかみかくし」を借りてきたら、「動画プレイヤーで開く」を選択しても再生できないでやんすよ。ちなみにUbuntu 10.10のお話。これは結局CSSという方式で暗号化されているからで、再生もろもろには辿り着けたのだけれども、それを忘れて何度も同じことをGoogle先生に尋ねてしまいそうなのでメモメモ。

まず「Ubuntu Tweak」をインスコしまする。そして medibuntu をどうにかして有効にして、ついでに HandBrake も有効化しておきます(※HandBrakeはDVD→MP4動画な変換ソフトちゃんです)。

すると Synaptics から libdvdcss2handbrake-gtk が見えるようになっているはずなので、そのふたつをインスコローリング。結論から言うと libdvdcss2 だけあれば Totem だろうが mplayer だろうが再生できるようにはなるんですが(もちろん各種コーデックのインストールも忘れずに)、HandBrakeも libdvdcss2 を自動的に参照して読めるようになってくれるようなので、お察しください

それでは簡単リッピング作業じゃないじゃないじゃない、動画鑑賞をお楽しみくださいNE☆

押してねっ→BlogPeople「趣味の世界」ブログランキング