コマンド、プログラム、といった用語について整理をしておく。
自ら窓を開く(多くの場合、窓を閉じると終了する)プログラム:
これを「アプリケーション」と呼ぶ(分類する)人も最近は多いようだ。
窓を開かないプログラム:
GUI的には積極的にユーザと対話を行わないことが(その結果、短時間で終了することも)多い。ただし、
2.1 「タスクトレイ」にアイコンを表示してインタラクションのための待機は行うプログラム、や、バックグラウンドで継続的に実行するタイプのプログラムもあるが、
それについてはここでは詳しくは扱わないことにしておく。
GUI型のアプリケーションとは違って、CUI型のプログラムの場合、画面(窓)内で ボタンやメニュー等のGUI部品を通じたインタラクション(対話)で、プログラムも動作条件を 仔細に設定することが難しい。
代わりに、CUI型のプログラム(コマンド)では、事前に(つまり起動時に)「その動作に関する条件付けを行うことが多い。
コマンド引数として与えた文字列や数値は、プログラムの中で適切に扱われる。
(別の言い方をすれば)それらを適切に扱うようにプログラムを作る必要がある。
Ruby では 特殊な変数 ARGV(実体は文字列の配列)を通じて、呼び出し元(コマンドプロンプト)から引数を受け取る(その際のプログラムの書き方は前回資料に述べた通り)。
[smpl/httpGet1.rb]
に、第1パラメータとして、proxy:3128
のようなワードが渡された時に、それを host, port
の2つの変数に、分離して代入したい。
プログラムの中では ARGV[0]
(または
ARGV.shift
の値)に対して以下のような処理を行うことになる。
含まないときにどうするか(portはデフォルト値のまま; hostは ARGV[0]の値そのもの; が入っていることになる)、プログラムを書く際のアプローチは2つ。
参考:以下のような式をirbで確認してみる。
"abc:80"=~/(.*?)(?::(.*))?$/ and [$1,$2]
"abc"=~/(.*?)(?::(.*))?$/ and [$1,$2]
(?: ... )
を使っている(普通にカッコで囲むとキャプチャもされる)*?
を使っている。これらが正規表現活用のための工夫。プログラム例:
# -*- coding: utf-8 -*-
require 'socket'
host='www.nagano.ac.jp'
port='http'
case ARGV.shift
when /(.*):(.*)/ then host,port=$1,$2
when /(.+)/ then host=$1
end
resource=ARGV.shift || '/'
TCPSocket.open(host,port) do |s|
s.puts "GET #{resource} HTTP/1.0" ; s.puts
puts s.gets(nil)
end
このプログラムの核心部は HTTP(プロトコル)に従って、GETリクエストを送信している 箇所であることも確認されたし。
使用例:
ruby httpGet2
ruby httpGet2 www2.nagano.ac.jp:80
ruby httpGet2 www2.nagano.ac.jp:80 /hiraoka/NP/
「URL 正規表現」で参考になる情報は得られるだろう
以下のような式の、変数s に様々なURL文字列を入れて確認してみる。
s=~/(\w+):\/\/([\w.]+)(\/.*)/ and [$1,$2,$3]
実際にサーバを作ってみる:
\r \n
と表記される。
\
+
1文字の計2文字で、1つの文字を表現している。