2013年2月25日月曜日

【Ruby】yamlをrubyで書き出そうとしたときのメモ


設定ファイルの書き出し、書き込みみたいな事がしたかったので調べてて
使った事無かったyamlを使ってみようと思った。なんか見やすいですしおすし。
1Animal:
2 gorira: Goritaro
3 cat  : Nyanko
4 horse : Umazo
こんな風にかける。 ファイルに書き出したかったので、調べてみると、
1open("./test.yml","w") do |f|
2 YAML.dump(hoge,f)
3end
でファイルに書き出せるっぽい。しかもrubyで書いたオブジェクトをそのままの形で書き出す事ができると、どこかで見た気がしたので、下みたいに書いて出力してみた。
01#!/usr/bin/ruby
02require "yaml"
03 
04hoge = "test1"
05fuga = "test2"
06 
07class Hoge
08  attr_accessor :hoge,:fuga
09   
10  def initialize(hoge,fuga)
11    @hoge = hoge
12    @fuga = fuga
13  end
14end
15 
16class Piyo
17  attr_accessor :piyo
18 
19  def initialize(piyo)
20    @piyo = piyo
21  end
22end
23 
24piyo = Piyo.new(fuga)
25hoge = Hoge.new(hoge,piyog)
26sample = hoge.to_yaml
27 
28open("./test.yml","w") do |f|
29  YAML.dump(hoge,f)
30end
すると、こんな風に書き出された。
1--- !ruby/object:Hoge
2hoge: test1
3fuga: !ruby/object:Piyo
4  piyo: test2

違う!わたしが欲しいのはこんなYAMLちゃんじゃないわ!!!1
なんか’!ruby’とか入ってるのは、rubyのオブジェクトだからっぽい。
1hoge = {'Hoge' =>{'hoge'=>'test1','Piyo'=>{'piyo'=>'fuga'}}}
これだと普通に出力されました。
1---
2Hoge:
3  hoge: test1
4  fuga:
5    piyo: test2
これだよ!ほしかったのは

そこで、調べてみるとオブジェクトの’taguri’と'to_yaml_style'というのを書き換えてあげるといいといいらしい。いいらしいがうまくいかず(前確かめたときはちゃんとできたのに)。
(gihyo 言語別 YAML用ライブラリ徹底解説)

いろいろと検索結果をぶらぶらとしていて、たどりついたココ(YAML/オブジェクトシリアライズ処理を読む)に習って、rubyのソースを'to_yaml'で検索してみるとそれっぽいのが出てきました。
ちなみに確認したバージョンはruby-1.9.3-p392
01#ext/syck/lib/syck/rubytype.rb
02class Object
03    yaml_as "tag:ruby.yaml.org,2002:object"
04    def to_yaml_style; end
05    undef to_yaml_properties rescue nil
06    def to_yaml_properties; instance_variables.sort; end
07 def to_yaml( opts = {} )
08  YAML::quick_emit( self, opts ) do |out|
09            out.map( taguri, to_yaml_style ) do |map|
10    to_yaml_properties.each do |m|
11                    map.add( m[1..-1], instance_variable_get( m ) )
12                end
13            end
14        end
15 end
16    alias :syck_to_yaml :to_yaml
17end

これだけ見てもさっぱりわからないですね。と、ここまでやって思ったんだけど、よくよく考えると今やりたいことはyamlでやる必要ないかなぁと。(←今ココ

rubyでyamlを書き出そうとして、なんとなしにrubyのライブラリのソースにたどり着いたので、いろいろと中身も見ていければなぁと思ったりしましたメモでした。(まわりくどい)

 ※文体変えた

2013年2月22日金曜日

【Ruby】WEBrick でプロキシサーバをつくってみる


Macのブラウザでネットワーク関連の処理をあれこれしたいと思った時に、Windowsを利用していた時に使っていたFiddler的なものが欲しくなりました。WEBrickを使ってプロキシサーバをつくれば、似たような事ができる(?)と教えていただいたので、早速試してみる事にしました。 

サーバサイドのスクリプトも、Ruby自体もあまり触った事がなかったので、ついでにどんな風にかけるのかあれこれいじりながらやってみる事にしています。いろいろとやってみたい事があるのですが、とりあえず置き換えの方法だけでもメモしておきます。

 Webrickを利用している部分は抜き出してクラスに。まだまだいろいろと機能があるようなのでいじりながら何ができるかを検討中。
01##./lib/proxy.rb
02#!usr/bin/ruby
03require 'webrick'
04require 'webrick/httpproxy'
05include WEBrick
06 
07class Proxy
08   attr_accessor :config
09 
10  def start
11    print @config
12    @server = WEBrick::HTTPProxyServer.new( @config )
13    Signal.trap('INT') do
14     @server.shutdown
15    end
16    @server.start
17  end
18 
19  def shutdown
20    @server.shutdown
21  end
22    
23end
設定ファイル(yml)
1server:
2 :BindAddress    : '127.0.0.1'
3 :Port           : 10080
4 :DocumentRoot   : ''
5 :CGIInterpreter : '/usr/bin/ruby'

handlerの中身の部分は、あまりいろいろ試してみていないのでこれからいろいろと試しつつ、できそうな事があれば実装していこうと思います。URLを比較する部分とかはまだ適当です。
01##./main.rb
02#!usr/bin/ruby
03require './lib/proxy.rb'
04require 'yaml'
05 
06@server = Proxy.new
07 
08REPLACE_CONTENT =<<EOF
09<body>
10<h1>Oh!</h1>
11<body>
12EOF
13 
14 
15REPALCE_TARGET = "tsukajizo.com/"
16 
17def start_proxy
18  #Handler
19  handler = Proc.new(){|req,res|
20 
21    if "#{req.host}#{req.path}" == REPALCE_TARGET
22      res.body = REPLACE_CONTENT
23    end
24  }
25   
26  #プロキシサーバの設定
27  config = YAML.load_file('./config.yml')
28  server_config = config['server']
29  server_config[:ProxyContentHandler] = handler
30   
31  #プロキシサーバの起動
32  @server.config = server_config
33  @server.start
34end
35 
36start_proxy
なんか、こうもうちょっと使いやすい感じにしていきたいですね。

とりあえず。
 →

こんな感じです。