プロトタイピングの生産性
Rubyの学習と技術調査を兼ねて、イントラネット内の端末からWEBプロキシを通ってSSLで接続する中継サーバを介してテキストを交換するプログラムを作成してみました。
異常系を考えないでだいたいの動作が確認できるものが一日程度の作業でできてしまいました。
慣れた人であれば全く当然のことのように思われるかもしれませんが、今まではPerlやPythonなども詳しくは知らなかった私にとってみれば、リファレンスマニュアルやインターネットを調べつつ試行錯誤しながらでもこれだけの時間でできてしまったことは驚きでした。
振り返って自分の作業がはかどった理由を考えてみると、ライブラリの充実やコードの記述性そして自分との相性(覚えやすい)などもありますが、やはり対話的に実行しながら確認できるirbの活用が大きかったと思います。
もし既に知識や経験のある内容のプログラムであれば言語や開発環境にかかわらずそれほど生産性に差は出ないと思うのですが、知識が十分でなかったり調査しながらの試行錯誤が伴う場合には静的型言語よりも動的型言語の方が効果的だし、irbの様な対話的に実行できる環境を活用することで効率的に作業が進められると思います。
プロトタイピングは調査が目的であり、目的外の部分はとにかく手っ取り早く多少強引な方法でもプログラマの直感でコントロールできる言語が重要だと思います。
このような点からPerl、Python、Rubyなどはライブラリなども十分に豊富だしあとはプログラマとの相性で使いこなせば効果的だと思います。
参考までに今回作成したプログラムを引用しておきます。
SSL接続しテキスト情報を行単位で中継するサーバ:sslRelayServer.rb
require 'socket' require 'openssl' include OpenSSL ctx = SSL::SSLContext.new() ctx.cert = X509::Certificate.new(File.read('cert.pem')) ctx.key = PKey::RSA.new(File.read('servernopass.key')) svr = TCPServer.new(443) # port serv = SSL::SSLServer.new(svr, ctx) waiter = {} # waiting peer table def relay(from,to) Thread.start(from,to) do |from,to| from.each do |line| print(to, ":" + line) to.write line end print(from, " is gone\n") from.close print(from, " is to be close\n") to.close end end while true Thread.start(serv.accept) do |s| print(s, " is accepted\n") connectionID = s.readline print("id:" + connectionID) waiting = waiter.delete(connectionID) if waiting == nil then waiter.store(connectionID,s) else print(waiting, " and ") print(s, " is connecting!\n") relay waiting, s relay s, waiting end end end
WEBプロキシを経由して中継サーバにSSL接続するクライアント:sslClient.rb
require 'socket' require 'openssl' include OpenSSL useProxy = true if useProxy then soc = TCPSocket.new('localhost', 3128) # Proxy server address and port soc.puts 'CONNECT localhost:443 HTTP/1.0' # SSL Relay server address and port soc.puts '' print soc.readline else soc = TCPSocket.new('localhost', 443) # SSL Relay server address and port end ssl = SSL::SSLSocket.new(soc) ssl.connect ssl.puts 'This is connection ID.' Thread.start(ssl) do |s| s.each do |line| print line end end while gets ssl.write $_ end ssl.close soc.close
WEBプロキシを介さない場合にはこれ(sslClient.rb)の代わりにOpenSSLを使用することができます。
openssl s_client -connect localhost:443