ラベル Sinatra の投稿を表示しています。 すべての投稿を表示
ラベル Sinatra の投稿を表示しています。 すべての投稿を表示

2017-08-31

sinatraでベーシック認証した時のユーザ名とパスワードを取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
apacheなどのwebサーバ側でベーシック認証させておいて、
sinatra側で、その時のユーザ名とパスワードを取得する方法です。


auth_info = Base64.decode64(request.env['HTTP_AUTHORIZATION'].split(' ')[1]).split(':')
username = auth_info[0]
password = auth_info[1]

2013-11-06

Raspberry PiにつないだUSBカメラの画像をブラウザから確認するものをrubyで作ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Raspberry PiにつないだUSBカメラの画像をブラウザ経由で見れて、好きなタイミングで静止画で残せるものをrubyで作ってみました。

と言ってもカメラ画像をmotionでストリーミング処理して、その結果をimgタグで表示しているだけだったりします。

Raspberry PiにUSBカメラをつないでmotionで確認する手順は
Raspberry Piに大人の科学マガジンUSB特撮カメラをつないでみた
をご覧ください。

なのでmotionを動かしておくことが前提ですが、作ったのは以下のような感じのものです。

ざっくりした画面の説明は以下のような感じです。


sinatraを利用していて、ソースは以下においてあります。
https://github.com/vivahiraj/pi_camera


最低限motionの設定として以下をいじる必要があります。
control_localhost off
webcam_localhost off
output_normal off
#ファイルの出力先をsinatraで静的ファイルとしてみることができるpublic配下にする必要があります。
target_dir /home/pi/pi_camera/public/img/motion


ソースを取得した後の利用方法は、最初に
bundle install
をする必要がありますが、
その後、webサーバとして動作させるには以下のようにします。
bundle exec rackup
これで9292ポートでwebサーバが起動します。

撮った画像のリストが別に見れなくてもよいならばmotionが動いているRaspberry Pi上でなく別のマシンで動作させてもカメラ画像は見ることはできるはずです。

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です。

2012-05-12

sinatraで複数選択のcheckboxの値を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
sinatraに限らないのかもしれませんが、複数選択する場合のcheckboxの取り扱いです。

ケース1
一番単純なのは、それぞれ別の名前のチェックボックスを用意することだと思います。
以下のような感じです。

好きな色は?
<input type="checkbox" name="like_red" value="red">赤
<input type="checkbox" name="like_blue" value="blue">青
<input type="checkbox" name="like_green" value="green">緑

この場合は、paramsの値をチェックすればOKです。
チェックされているときだけ、値が入りチェックがなければ値が入っていません。

チェックされていれば
params['like_red']
で"red"が取れます。


ケース2
他にparamsで配列で受け取れるようにする方法もあります。

以下のような感じです。
nameの書き方がポイントです。

好きな色は?
<input type="checkbox" name="like[]" value="red">赤
<input type="checkbox" name="like[]" value="blue">青
<input type="checkbox" name="like[]" value="green">緑

この場合は、params["like"]にチェックした値が配列で入っています。
赤と青がチェックされていれば
params['like']
で['red','blue']が取れます。


ケース3
他にnameが同じになっているケースがあります。
以下のような感じです。

好きな色は?
<input type="checkbox" name="like" value="red">赤
<input type="checkbox" name="like" value="blue">青
<input type="checkbox" name="like" value="green">緑

この場合は、仮に複数の値がチェックされていてもparams["like"]で取れるのは、どれか一つだけです。
なので上記二つの書き方に変えるのがよいとは思うのですが、この場合でsinatraで受け取る方法です。

以下のような感じで受け取れます。
以下ではとりあえず複数受け取った値を,で連結しています。

  data = {}
  env["rack.request.form_vars"].split("&").each do |d|
    (k,v) = d.split("=")
    k = URI.decode(k).toutf8
    v = URI.decode(v).toutf8 unless v.nil?
    if data[k].nil?
      data[k] = v
    else
      data[k] = data[k] + ", " + v
    end
  end

これで赤と青がチェックされていた場合は、
data['like']
で"red,blue"が受け取れます。


2012-02-07

sinatraでファイルアップロードのテストをする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
sinatraでファイルをアップロードさせるよなアプリのテストをする場合です。

ファイルアップロードは、以下が参考になります。
http://d.hatena.ne.jp/yamamucho/20100620/1277003595

抜粋かつちょっと改造ですが、こんな感じでfileという名前のパラメータでファイルを受け取るとします。
require 'rubygems'
require 'sinatra'

post '/upload' do
  if params[:file]
    content_type params[:file][:type]
    f = params[:file][:tempfile]
    f.read f.size
  end
end

このようなアプリのテストをする場合は、以下のような感じです。 rspecでテストする場合は、以下のような感じです。
require 'rubygems'
it "アップロードしたらファイルの中身が帰ってくる" do
  upload_file = File.dirname(__FILE__) + "/foo.txt"
  post_file   = Rack::Test::UploadedFile.new(upload_file)
  post "/upload", "file" => post_file
  last_response.body.should == "foo"
end


sinatraをpassengerで使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで簡単なwebプログラムを組みたいなぁ、Rails使うほどの規模でもないなぁというときは軽量フレームワークのSinatraがステキです。

Sinatraの詳しい使い方は、以下を見ればOKです。
http://www.sinatrarb.com/intro-jp.html

本当に簡単に試すならばファイルがひとつあればいいお手軽さなのですが、
Sinatraで作ったものをPassengerを使って公開するときには、ちょっと準備が必要です。
具体的には、以下が参考になります。SubURIで動かしています。
http://d.hatena.ne.jp/seiunsky/20090614/1244978847

Sinatraアプリとしては、以下のファイルとディレクトリが必要になります。

+public(空ディレクトリ)
+tmp(空ディレクトリ)
+app.rb(アプリ本体 たとえばこういうやつ)
+config.ru(おまじないファイル。こんな感じ)

これだけでOKです。
sinatra_appというSubURLで公開するならば
publicディレクトリをhtdocs/sinatra_appにリンクを張って
Passengerの設定で
RackBaseURI /sinatra_app
と書けばOKです。

これでとりあえずOKなのですが、さくっと作ったプログラムだとなんで作ったのかとか忘れがちなのでドキュメント用のディレクトリも使いした方がよいかなぁとか思います。
そしてさくっと作ってもrspecでテストをしておいた方がよいよなぁと思うわけなので、上記にさらにいくつか追加して以下のような感じにします。


+doc(ドキュメント格納用ディレクトリ)
+public
+spec
| |-app_spec.rb(テストファイル)
| |-spec.opts(rspecのオプション情報)
| |-spec_helper.rb(テスト用helper)
+tmp
+README(ざっくり説明用。これだけあればよいときも多いと思います)
+Rakefile(rake specとやるために準備)
+app.rb
+config.ru

sinatraでrspecを使うためには、以下が参考になります。
http://d.hatena.ne.jp/amacou/20100221/1266768409
http://labs.unoh.net/2009/07/bdd_on_sinatra.html

こちらを元に以下のファイルを作成してみました。


+spec
| |-app_spec.rb
| |-spec.opts
| |-spec_helper.rb
+Rakefile

ということで、これらのサンプルをとりあえず
https://github.com/vivahiraj/sinatra_template
に置いてみました。








追記(2013/10/24)
bundlerを利用したテンプレートも作成してみました。
sinatraでbundlerを使う