korでテーブル変換サーバーが書けてた
ちょっと思いつきで、korで遊んでみた。
KorはRubyのgemだ。Rubyは2.0.0から対応している。
これからのプログラムを走らせる準備をしておく。
$ gem install kor kor-output-json
短いサーバープログラムを書く。
server.rb
#! /usr/bin/env ruby require "socket" require "kor" gs = TCPServer.open(8080) addr = gs.addr addr.shift printf("server is on %s\n", addr.join(":")) while true Thread.start(gs.accept) do |s| Kor::Cli.new([ *s.gets.chomp.split(/\s+/), *s.gets.chomp.split(/\s+/) ], s, s).run s.close end end
korがcliに特化しすぎたインターフェースにしたおかげで、
cliじゃなくてもKor::Cli
が使いやすくなっている。(良いんだか悪いんだか)
Kor::Cli.new
の第二引数と第三引数は、gets
とputs
を持ってさえいればいいので、
IO
オブジェクトでもStringiO
オブジェクトでもいい。もちろんTCPSocket
でも。
サーバーを走らせておく。
ruby server.rb
試しにcsvからjsonへの変換をやってみる。 1秒ごとに1行のcsvデータをサーバーへ送っているだけだ。
$ ruby -e '$stdout.sync=true; puts "csv"; puts "json"; puts "foo,bar,baz"; 10.times { |i| puts [i*10,i*20,i*30].join(","); sleep 1 }' | nc localhost 8080 {"foo":"0","bar":"0","baz":"0"} {"foo":"10","bar":"20","baz":"30"} {"foo":"20","bar":"40","baz":"60"} {"foo":"30","bar":"60","baz":"90"} {"foo":"40","bar":"80","baz":"120"} {"foo":"50","bar":"100","baz":"150"} {"foo":"60","bar":"120","baz":"180"} {"foo":"70","bar":"140","baz":"210"} {"foo":"80","bar":"160","baz":"240"} {"foo":"90","bar":"180","baz":"270"}
1秒ごとに変換された結果が返ってくる。*1
役に立つかはともかく、楽しい。
*1:ncを今回はじめて知った。