けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :07219 ] the message: "[ruby-list:7219] Re: for in bsh
", on Mar/25 13:22(JST) SHUDOH Kazuyuki writes:

>首藤です。
>まつもとさん wrote:

>UNIX の伝統的な概念は、けっこう multithreading と相性悪いですものね。
>signal とか。

そうですね...

>> chdirやpwdの取り出しはかなり重いんでスレッドのコンテキスト切
>> 替えの度にカレントディレクトリの保存や移動を行うのは避けたい
>> ですから.
>
>スレッドごとのカレントディレクトリの需要が本当に大きいならば、
>カレントディレクトリに影響を受ける操作の直前になってから、
>復帰を行うという手もあるとは思います。

私が思っていたのは, cwdの情報ををスレッド単位に持ちcdなどを行なわない
で, 相対パスを伴うファイル操作に関してはそのcwdの情報を用いるというも
のでした.

>でも、カレントディレクトリに影響を受ける操作のリストアップやら
>実装の手間を考えると、割が合わないように思います。^^;

# でも, やってしまいました(^^;;;

In [ruby-list :07220 ] the message: "[ruby-list:7220] Re: for in bsh
", on Mar/25 13:37(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>ええ,しかしスレッドと相性の良い別のモデルを構築するのは大変
>な上に,伝統的なモデルを使えない苦しみにもつながるので,やは
>りできるだけ旧来のモデルに準拠したいと思ってます.

まあ, それは確かにいえますので, クラスとしてカレントワーキングディレク
トリを持ちファイル操作が行なえる様なクラスCWDを考えてみました. 感じと
しては, CWDのインスタンスはDirのメソッドとFileのクラスメソッドを足した
ようなことができるオブジェクトです.

それを使うと,

> Dir.chdir "/tmp"
> for dir in ["dir1", "dir3", "dir5"]
>   Dir.chdir dir
>   Dir.mkdir "tmpDir"
>   Dir.chdir "tmpDir"
>   f = open("tmpFile", "w")
>   f.print "TEST\n"
>   f.close
>   Dir.chdir "../.."
> end

は,

  cwd = CWD.cd("/tmp")
  for dir in ["dir1", "dir3", "dir5"]
    cwd.mkdir dir
    cwd.pushd(dir) do
      f = cwd.open("tmpFile", "w")
      f.print "TEST\n"
      f.close
    end
  end

のように書けるようになり, だいぶ簡単になると思います.

さらに, このCWDを拡張してフィルタも扱えるようにしてしまいました(^^;;; 
そうすると, このクラスはCWD(カレントワーキングディレクトリ)ではなく,
Shellそのものをクラスとして実現していることに気づきました. このクラス
を用いると, 上記のプログラムは以下のようになります.

  sh = Shell.cd("/tmp")
  for dir in ["dir1", "dir3", "dir5"]
    sh.mkdir dir
    sh.pushd(dir) do
      sh.echo("TEST") > "tmpFile"
    end
  end

だいぶ簡単になってかつShellっぽいですよね? さらに, 以下のようなことも
できるようにしました.

  sh.cat("/etc/printcap") | sh.tee("tee1") > "tee2"
  (sh.cat < "/etc/printcap") | sh.tee("tee11") > "tee12"

  sh.cat("/etc/printcap").tee("tee1") >> "tee2"
  (sh.cat < "/etc/printcap").tee("tee11") >> "tee12"

sh.filter1.filter2は sh.filter1 | sh.filter2 と同じです.

# ">>"の演算子の優先順位が ``|''より高いので,
#
#    sh.cat("/etc/printcap") | sh.tee("tee1") >> "tee2"
#
# は思ったようには動作しません.

さらに, Shell#catなどはShell::Filterのサブクラスのインスタンスを返すの
ですが, これらのクラスはEnumerableをincludeしていますので,

  sh.cat("/etc/passwd").collect{|l| l =~ /keiju/}

見たいなこともでき, 通常のrubyのプログラミングも楽しめるようになってい
ます(^^;;;

これだけでもだいぶ面白いクラスになっていると思うのですが, OSのコマンド
をShellクラスに定義するメソッドも用意しました. 以下のようなこともでき
るようになっています.

  Shell.def_system_command("sys_ls", "ls")
  Shell.def_system_command("sys_sort", "sort")
  sh.sys_ls.sys_sort.to_a

まだ, ドラフトバージョンですがプログラムも添付します. 皆さんの意見を参
考にしたいと思いますので, 何かコメントがあればどしどし言って下さい.

# 私は結構良いツールになるのではと思っています(^^;;;

begin 644 shell.tgz
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
`
end

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---