サーバ上にあるXMLを簡易的なWebアプリから、参照したり、変更したり、したいと。
簡易って言ったらsinatraが一番かな、と。
XMLをオブジェクトにしたりシリアライズしたりするのもRubyなら楽そうだし。
ってことで、、
■ Sinatraの環境設定
自分の開発マシンにはRuby1.8.7が入ってるのでソレ使います。
$ ruby -v ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]
gemすら入ってなかったのでapt-get installで入れます。
sudo apt-get install rubygems1.8
gemは外にアクセスしにいくのでプロキシの設定をします。
vi ~/.gemrc http_proxy: http://サーバ:ポート
Sinatraをインストールします。
$ sudo gem install sinatra Successfully installed tilt-1.1 Successfully installed sinatra-1.1.0 2 gems installed Installing ri documentation for tilt-1.1... Installing ri documentation for sinatra-1.1.0... Installing RDoc documentation for tilt-1.1... Installing RDoc documentation for sinatra-1.1.0...
HelloWorldするためのコードを書きます。
vi hello.rb require 'sinatra' get '/' do 'Hello world!' end
フォアグランドで起動してブラウザからアクセスしてみます。見事画面上にHello worldが表示されます。
ログにアクセスの形跡も残っています。fabicon無いよ的なログも残ってますねw
ポートはデフォルトだと4567になっていますが、指定したい場合は-pオプションでポート番号を指定します。
$ ruby -rubygems hellp.rb == Sinatra/1.1.0 has taken the stage on 4567 for development with backup from WEBrick [2010-11-25 11:27:40] INFO WEBrick 1.3.1 [2010-11-25 11:27:40] INFO ruby 1.8.7 (2010-06-23) [i686-linux] [2010-11-25 11:27:45] INFO WEBrick::HTTPServer#start: pid=19635 port=4567 127.0.0.1 - - [25/Nov/2010 11:27:59] "GET / HTTP/1.1" 200 12 0.0018 localhost.localdomain - - [25/Nov/2010:11:27:59 JST] "GET / HTTP/1.1" 200 12 - -> / 127.0.0.1 - - [25/Nov/2010 11:27:59] "GET /favicon.ico HTTP/1.1" 404 420 0.0007 localhost.localdomain - - [25/Nov/2010:11:27:59 JST] "GET /favicon.ico HTTP/1.1" 404 420 - -> /favicon.ico
■ REXMLでXML読み込み
XMLファイルを作ります。
$ vi hoge.xml <?xml version="1.0"?> <hage> <front>danger</front> <back>safe</back> </hage>
REXMLを使ってパース&XPathを使って中身をみてみます。
先ほど作ったSinatra用のRubyでXPathを使ってXMLの中身を取り出してみます。
vi aaa.rb require "rexml/document" xml_file = "hoge.xml" file = File.new(xml_file) doc = REXML::Document.new(file) puts doc.elements['/hage/back'].text
叩いてみると値が取り出せました。
$ ruby aaa.rb safe
■ sinatraから参照&変更してみる
とりあえずsinatraでWeb画面から先ほどの要素が取れるようにします。
以下のコードでブラウザから取得することができました。
ちなみにsinatraはコード変更するとサーバを再起動しないと変更が反映されません。
が、gemでshotgunってコマンド入れて、それ叩くと反映されます。
equire 'sinatra' require "rexml/document" xml_file = "hoge.xml" get '/' do file = File.new(xml_file) doc = REXML::Document.new(file) doc.elements['/hage/back'].text end
引き続き、値を変更してみます。
全然RESTっぽくないですが、、getで/back_dangerっていうアクセスで
先ほどの”safe”を”danger”に変更してみます。
get '/back_danger' do file = File.new(xml_file) doc = REXML::Document.new(file) file.close doc.elements['/hage/back'].text = "danger" File.open(xml_file, "w") {|xml| xml.write(doc) } "modified" end
http://localhost:4567/back_dangerで画面からアクセスすると、
modified が表示されて、サーバ上のファイルを開くと以下のように
backもdangerになっとります。ゲーハーっす。
vi hoge.xml <?xml version='1.0'?> <hage> <front>danger</front> <back>danger</back> </hage>
後はボタン押したらOSコマンド発行できたりとか、ログをtailさせたの画面から見れたりとか、
ボンボン追加してって運用で楽出来るようになりたいな、と。
あ、、認証とかどうすんべ。。。@daipresentsに相談かな。。w
コメント