korでテーブル変換サーバーが書けてた

ちょっと思いつきで、korで遊んでみた。

github.com

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の第二引数と第三引数は、getsputsを持ってさえいればいいので、 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を今回はじめて知った。