2013-10-30

paperclipをSub-URIで使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsで添付ファイルを扱いたい時は、いまどきはpaperclipのようなので使ってみました。

使い方は、以下が参考になります。
http://cumiki.com/hacks/19

Sub-URIで運用にしているのですが、アップロードした画像のurlを作成する際にSub-URIを考慮してもらえませんでした。

/my_app
の配下にrailsプロジェクトを置いているのですが、/my_appを考慮してもらえなかったのです。

で、考慮してもらえるように
config/application.rb
に以下を追加しました。

module MyApp
  class Application < Rails::Application
    ・・・
    config.paperclip_defaults = {
      :path => ":rails_root/public/system/:class/:attachment/:id_partition/:style/:filename",
      :url  => "#{Rails.application.config.relative_url_root}/system/:class/:attachment/:id_partition/:style/:filename"
    }
  end
end

2013-10-24

Raspberry Piに大人の科学マガジンUSB特撮カメラをつないでみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
大人の科学マガジンUSB特撮カメラを買ってみました。



なのでRaspberry Piにもつないで見ました。

カメラを接続してRaspberry Piを立ち上げると、あっさりカメラを認識していました。

lsusb

Bus 001 Device 005: ID 058f:3861 Alcor Micro Corp.
みたいな感じのが出てくれば認識されているようです。

私のRaspberry Piの環境は、無線LAN接続してモニタ等は接続していない状態です。
(無線LAN設定に関しては、Raspberry Piを無線LAN対応させてみたを見てください。)
そんな環境なのでUSBカメラの画像はネットワーク経由でブラウザで見る感じにしたいと思ったのです。

それを実現するためにmotionというのを使いました。

motionは、動体検知で利用するものとして有名な感じです。
なにかカメラ撮影しているなかで、何かが動いたら写真を残すみたいなことができます。
今回は動体検知は使わないのですけどね。

インストールは、
sudo apt-get install motion ffmpeg
でOKです。

設定は、
/etc/motion/motion.conf
に記載します。

今回デフォルトから変えたのは以下の項目です。


#motionをネットワーク経由してブラウザで操作できるようするためにoffに変えます
#control_localhost on
control_localhost off

#カメラ画像をネットワーク経由で見えるようにするためにoffに変えます。
#webcam_localhost on
webcam_localhost off

#なんで変えたか忘れました
#ffmpeg_video_codec swf
ffmpeg_video_codec mpeg4

#動体検知で画像を残さないようにoffに変更
#output_normal on
output_normal off

#今回のカメラでは8はサポートしてないようなので6にしました。
#ただ8にしていても使えないから6を使うよ~~みたいなメッセージが出ていたので
#そのままでもよい気がします。
#v4l2_palette 8
v4l2_palette 6


設定が終わったら
sudo motion
とシェルで実行するとmotionが立ち上がります。
rootで起動する必要があるようです。

webで検索すると、ここまでやったら
http://raspberrypi.local:8081
みたいな感じで8081ポートに接続すれば動画が見れるみたいなことを多いのですが、
chromeでもIEでも見ることができませんでした。

どうやら動画の形式がmotion JPEGという形式になっているようで、chromeでは直接見ることはサポートしていないようです。

ですが、以下のような感じでimgタグで指定すれば、きちんと見れました。
<html><body>
<img src="http://raspberrypi.local:8081">
</body></html>


動画が見れると、動画に移っている画像を任意のタイミングで静止画で残したくなります。
motionでは8080ポートでmotionを操作できます。
静止画を残すには、
http://raspberrypi.local:8080/0/action/snapshot
で接続してあげればOKです。





2013-10-20

sinatraでbundlerを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以前、
sinatraをpassengerで使う
というエントリを作成して、sinatraをpassengerで利用するときのtemplateを作成したのですが、
ちょっと古い感じになっていたので作り直してみました。

以前と比べて以下を変更しています。
・bundlerを使えるようにしてみた
・viewのテンプレートとしてhamlを使うようにしてみた
・rspec2に対応してみた

新規に作成したtemplateを
https://github.com/vivahiraj/sinatra_bundler_template
においてみました。

簡単な使い方としては、
リポジトリからファイルを取得したら、
bundle install
をすればOKです。

そして、開発時のWebサーバの起動は、
bundle exec rackup

テストの実行は、
bundle exec rake spec
 or
bundle exec rspec

とすればOKです。

2013-10-15

プリンタが壊れたのでEPSONのEP-706Aを買いました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
プリンタが壊れたので新しくプリンタを買いました。

買ったのは、EPSONのEP-706Aです。


今回、買う上での条件にしたのは以下の点です。
・コピーがしたいから複合機であること
・もう配線とか面倒なのでwifiで接続したい
・DVDのラベル印刷も使ってみようかなぁとか思ってみた
・スマホやタブレットから直接印刷がしたいなぁと思ってみた
・そんでもってできるだけ安い

この条件で探したらEPSONのEP-706Aがよい感じでした。
上位機種から機能を削ったものなのですが、私が使いたい機能は、しっかりついているのがよかったです。

実際買ってみてwifi接続は楽でよいですね。設定もぜんぜん問題なくツールでできました。
もともとプリンタが置いてあった場所に置いたのでwifiのどこでもおけるメリットは、まだ体感してないです。

置く場所を変えて、dropbox連携とかしてスキャナとかもPCなしで利用するとかやってもよいかなぁとか、ちょっと思っています。

想定してなかったけど、よかったなぁと思ったのは、前面給紙です。
今まで手差しで給紙していたのですが、前面である程度セットしておけるのは楽でよいです。


あと、今回お店でプリンタを見たのですが、ただプリントするだけだったら3000円台でプリンタも買えちゃうというのが驚きでした。


2013-10-10

Railsで大量データを扱うときはpluckを使ってみるのも一案のようです

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsで大量データを取得してeachでまわすと遅いです。

これは取得したデータすべてにActiveRecordオブジェクトを生成していることが原因でもあるようです。

なので対策として考えられるのは、生成するオブジェクトの数を減らす方法があります。

これにはfind_eachを使うと実現できます。

find_eachは指定した件数づつ(デフォルトでは1000件)データを取得して、その分だけのActiveRecordオブジェクトを生成します。
find_eachに関しては、過去に紹介していますので、そちらをご覧ください。
大量のデータをActiveRecordで処理するとき

find_eachはソート順を指定できないという欠点があります。


もう一つの方法としてActiveRecordオブジェクトを生成せずに配列なりハッシュなり、ActiveRecordよりも軽いオブジェクトを生成する方法があります。

これには、pluckを使えます。
以下のような感じで利用します。

Order.where( amount: 1000 ).pluck( :order_no, :name, :address )
 # => [["O123", "テスト太郎", "トーキョー"],["O456", "テスト花子", "オーサカ"]]

pluckの方では、ソート順は指定できます。

pluckに複数のカラムを指定できるのは、Rails4.0からのようで3.2では一つのカラムしか指定できません。

3.2でpluckで複数のカラムを指定するには、以下の方法でpluck_allという複数カラムを利用できるようなpluckを定義するパッチをあてる方法があります。
http://meltingice.net/2013/06/11/pluck-multiple-columns-rails/

こちらではハッシュのやり方ではハッシュでデータを取得します。

Order.where( amount: 1000 ).pluck_all( :order_no, :name, :address )
 # => [{:order_no => "O123", :name => "テスト太郎", :address => "トーキョー"},
          {:order_no => "O456", :name => "テスト花子", :address => "オーサカ"}]


もう一つの方法でmultipluckというgemを使う方法もあります。
https://github.com/hanzq/multipluck

こちらは私は試していないのですが、Rails4.0と同じ感じ使えそうなので将来のアップデートを見据えるとこちらもよさそうな気がします。


で、find_eachとpluckのどちらが速いかなのですが、私が試した数万件のデータを処理するケースではだいたい同じぐらいでした。
どちらもeachでまわすよりかは、断然早くなっています。
なのでどちらを利用するかはケースバイケースなのかなぁという感じです。