Archive for 3月, 2011

NginXでは、git-httpサーバを公開することが困難な件

Time to Read

1分

理由は、NginXのhttp_dav-moduleが、PROPFINDなど一部のWebdavメソッドをサポートしていないため。

メソッドによってfastcgiでwebdav.cgiにリクエストを振る、などの手法も紹介されていましたが、それをするなら全リクエストをwebdav.cgiに振ってしまえばいいと思いました。

gitサーバをhttp(s)で公開する際は、素直にApache2、lighttpdなどを利用しましょう。。

参考

Apacheの場合の手順:

 

OmniAuth、Warden、Sinatraを連携しよう

Time to Read

6~8分

セットアップ

今回は最終成果物がSinatraの1-filerなので、bundlerを使わずにRubyGemsを管理する。なので、素直にインストール。今回使うものを全部入れておく(というか、OmnuAuthの依存関係で色々入ってくる)。

1
gem install sinatra omniauth warden_omniauth

OmniAuthのしくみ

Read the rest of this entry »

 

Padrino framework – カスタムクラスの置き場所について

Time to Read

1分

Padrino Frameworkで、カスタムクラスなどを規約と外れた場所に置きたい場合。

以下のファイルパスは「Padrino.root」からの相対パスと考えてほしい。基本的に、 config/boot.rb に起動前/起動直後フックを書くことができる。

lib 以下に置きたい

実は最近のPadrinoは、 lib/**/*.rb を自動的にロードしてくれる。なので何も考えずに置いとけば良い。

app/hoge 以下に置きたい

config/boot.rb の中の Padrino.before_load で設定。Padrino.require_dependencies を宣言するだけ。

おまじない的に Padrino.set_load_paths もしとくといいんじゃないかな。

1
2
3
4
5
6
7
##
# Add here your before load hooks
#
Padrino.before_load do
  Padrino.require_dependencies(Padrino.root + "/app/hoge/**/*.rb")
  Padrino.set_load_paths(Padrino.root + "/app/hoge")
end

config/initializers/*.rb を最後にロードしたい

Padrino.after_load に書けば確実に最後に読み込んでくれる。

1
2
3
4
5
6
##
# Add here your after load hooks
#
Padrino.after_load do
  Padrino.require_dependencies(Padrino.root + "/config/initializers/**/*.rb")
end

この場合、 $LOAD_PATH はいじられない。

 

Ruby – gtkmozembedの入れ方

Time to Read

1分

ずいぶん前の話ですが、

こういう記事を書いたんですけど、この記事ではaptで入れてますが、最近は

1
2
gem install gtk2
gem install gtkmozembed

と言う風に、Rubygemsからインストールも出来るようです。bundlerなどと連携して管理するのが楽になりました……。

この際、いくつかヘッダが必要になります。Ubuntu/Debianの場合、gtk2は参考ページのとおり libgtk2.0-dev でいいんですが、gtkmozembed gemは、

xulrunner-dev

パッケージが必要になります。

libxul-embedding-unstable is not found.
libxul-embedding is not found.
xulrunner-gtkmozembed is not found.
firefox-gtkmozembed is not found.
seamonkey-gtkmozembed is not found.
mozilla-gtkmozembed is not found.
No gtkmozembed is found. Abort.

インストール失敗時にこういうメッセージが表示されますが、「libxul-embedding」は Fedora 等向けのパッケージ名です。要注意。

Ruby1.8.7、1.9.2、REE、などでコンパイルを確認しています。ただ、一番安定するのは 1.8.7 のようです…。

 

Ruby で凄く簡単に GET/POST 送信ができる関数を作りました(追記あり)

Time to Read

30秒

Time to Write

30秒

使い方

(ry

1
p wbs_request(:GET, 'http://blog.udzura.jp/', :s => 'Ruby')
1
p wbs_request(:POST, 'http://www.google.com/', :q => 'Ruby')

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'net/http'
def wbs_request(method, uri_string, data={})
  uri = URI.parse(uri_string)
  uri.path = "/" if uri.path.empty?
  http = Net::HTTP.new(uri.host)
  case method.to_s.downcase.to_sym
  when :get
    query_string = URI.encode(data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&"))
    return http.get(uri.path + "?" + query_string).body
  when :post
    return http.post(uri.path, data).body
  when :put, :delete, :head
    raise NotImplementedError, "Not yet supported"
  else
    raise ArgumentError, "Unsupported http method"
  end
end

感想

  • Rubyコミュニティだと多分こんな記事書いても誰もブクマしない……どうすればいいんだ。
  • あと、まともなRubyプログラマなら多分open-uriとか、ちょっと複雑ならhttpclientやHTTPartyなんかを使うと思った。
  • 最初はrequire 'open-uri'; open(...) とやろうとしたがPOSTができなかった。
  • 今は反省している。
  • ちなみに、Rubyに関数はなくて、関数のように使えるメソッドがあるだけです。
  • 僕はPHP嫌いじゃないですよ。こういう記事を書くぐらいには好き。

see also

追記:QUERY-STRINGをURLエンコードしました

会社の先輩から指摘があったんですが、関数()の8行目が

8
query_string = data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&")

となっており、いわゆるURLエンコードがされていませんでした。お詫びして修正致します。というか、下手に車輪の再発明をするとこういうつまらないミスをしますよ、と言う教訓ですn(ry

追記:Curbを使ったら簡単にはならなかったけど多機能になりました

Curbという、libcurlのRubyバインディングがあるのは知っていました。一応使ってみました。

1
2
sudo aptitude install libcurl4-openssl-dev
sudo gem install curb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'rubygems'
require 'curb'
def wbs_request(method, uri_string, data={})
  query_string = URI.encode(data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&"))
  case meth = method.to_s.downcase.to_sym
  when :head
    return Curl::Easy.send("http_#{meth}", uri_string + "?" + query_string).header_str
  when :get, :delete
    return Curl::Easy.send("http_#{meth}", uri_string + "?" + query_string).body_str
  when :post, :put
    return Curl::Easy.send("http_#{meth}", uri_string, query_string).body_str
  else
    raise ArgumentError, "Unsupported http method"
  end
end

行数はあまり変わりませんが、put、delete、headなどにも簡単に対応出来たので対応しました。良かったですね。これならRESTful APIのテストにも使えますね。

Curbはlibcurlの機能(Basic認証とか)が使えるみたいなので、むしろ複雑なことをする方が向いているようです。