[#6862] Re: http_get.rb — 青山 和光 <PXN11625@...>

In-Reply-To: [ruby-list:6844] Re: http_get.rb

15 messages 1998/03/01

[#6906] ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...>

藤本です、こんにちは。

25 messages 1998/03/03
[#6907] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/03

まつもと ゆきひろです

[#6908] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6911] Re: ruby's Icon ? — OZAWA Sakuro <ozawa@...> 1998/03/03

小澤さくです。

[#6912] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんにちは。

[#6914] Re: ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...> 1998/03/03

藤本です、こんばんは。

[#6918] manual 1.18b index — WATANABE Tetsuya <tetsu@...>

ruby-man-1.1b8 で、name タグがついているものを拾い集めて

17 messages 1998/03/04
[#6921] Re: manual 1.18b index — matz@... (Yukihiro Matsumoto) 1998/03/04

まつもと ゆきひろです

[#6954] Re: ruby's Icon ? — nosuzuki@... (Norio Suzuki)

こんばんは。鈴木教郎です。

18 messages 1998/03/04
[#6964] Re: ruby's Icon ? — matz@... (Yukihiro Matsumoto) 1998/03/05

まつもと ゆきひろです

[#7023] infinity — Tadayoshi Funaba <tadf@...>

ふなばです。

41 messages 1998/03/09
[#7029] Re: infinity — shugo@... (Shugo Maeda) 1998/03/09

前田です。

[#7033] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/09

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

[#7041] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803091741.CAA05774.keiju@cupmail0.rational.com>

[#7048] Re: infinity — keiju@... (Keiju ISHITSUKA) 1998/03/10

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

[#7049] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7051] Re: infinity — keiju@... (石塚圭樹 ) 1998/03/10

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

[#7054] Re: infinity — matz@... (Yukihiro Matsumoto) 1998/03/10

まつもと ゆきひろです

[#7050] Re: infinity — Kazuhisa YANAGAWA <katze@...> 1998/03/10

In message <199803100359.MAA08628.keiju@cupmail0.rational.com>

[#7259] Socket#shutdown — keiju@... (Keiju ISHITSUKA)

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

16 messages 1998/03/28
[#7260] Re: Socket#shutdown — matz@... (Yukihiro Matsumoto) 1998/03/28

まつもと ゆきひろです

[#7265] Re: Socket#shutdown — keiju@... (石塚圭樹 ) 1998/03/29

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

[ruby-list:7116] select() & Delegated class (Re: builtin class inherit)

From: TEI meiki <tei@...>
Date: 1998-03-15 12:20:32 UTC
List: ruby-list #7116
鄭です。

まつもとさん、前田さん、石塚さん、delegateの件、教えて頂いて
ありがとうございます。

なんだか、間が空いてしまいましたが、くだんの私のスクリプトの Modem を
あつかうコードは、結局、このメールの末尾のようになりました。
(lock ファイルを作るところがずいぶん長くなってしまった。)

ところで、この Tty<Delegator を select に渡すと type エラーになってしまいます。
前の、Tty<File のころは、select で扱えたのですが。
しかたがないので、いまは、top level で

alias sysselect select 
def select(i,o,e,t)
  si = []; so = []; se = []
  i.each {|f| si << ( if defined? f.__getobj__ then f.__getobj__ else f end)}
  o.each {|f| so << ( if defined? f.__getobj__ then f.__getobj__ else f end)}
  e.each {|f| se << ( if defined? f.__getobj__ then f.__getobj__ else f end)}
  sysselect(si,so,se,t)
end

という具合に逃げています。
もっとスマートな方法が有りましたら教えて下さい。

あと、下記のコードで、特定の例外を発生させて捕捉するために
class ErrLocked < Exception; end と宣言して使いました。
こんな使い方であっていますか?

例外についてはリファレンスマニュアルの文法の raise の項に
例外はクラスであるらしいこと、全ての例外のスーパークラスが Exception で
あること、ユーザーズガイドに begin/rescure/raise の簡単な使い方の説明
くらいしか記述が無くて、いまひとつよくわかりませんでした。
ruby-1.1bx/lib の下をのぞきまわって、どうやらException のサブクラスを
宣言してそのクラス名を、例外の名前として使用するらしいと判断しました。
(これであってますでしょうか?)
ここらへん、何かの文書でもうすこし記述があるとありがたいです。
それと、既存の例外一覧とその階層図が欲しい所です。
ruby のソース(ついに見てしまった、、^_^;) error.c:Init_Exception() から
以下のようになってるらしいとはわかりましたし、名前から内容も大体想像つきます
が、やっぱり文書が欲しいです。
  String
	GlobalExit
		SystemExit
		fatal
		Interrupt
		Exception
			SyntaxError
			TypeError
			ArgumentError
			NameError
			IndexError
			NotImplementError
			LoadError
			RuntimeError
			SecurityError

それと、例外の使い方を調べていたら、catch/throw という似たような用途と
おもわれる組み込み関数をみつけたのですが、どのように使い分ける物なのでしょう?
(和文のリファレンスマニュアルの throwの説明だけ英文でした ^^;)

---------------- Tty class ---------------------
require "delegate"
require 'final'

class Tty < Delegator

  CBREAK = 0x00000002
  RAW    = 0x00000020
  ECHO   = 0x00000008
  TIOCGETP = 0x40067408
  TIOCSETP = 0x80067409
  class ErrLocked < Exception; end

  class << Tty

    # create lock file
    def uu_dolock(tfile, lfile)
      lf = File.open(tfile, "w")
      lf.printf("%10d\n", $$); lf.chmod(0444); lf.close
      begin
	File.link(tfile, lfile)
      rescue 
	raise ErrLocked, "#{lfile} locked"
      ensure
	File.unlink(tfile)
      end
    end

    # check who was lock and cleanup
    def uu_lockactive(lfile)
      File.open(lfile, "r") do |f|
	pid = f.gets; f.close
	if pid == nil || pid.length != 11 || pid.to_i <= 0 then
	  File.unlink(lfile)
	  raise "#{lfile} unkown format"
	end
	begin
	  Process.kill(0, pid.to_i) 
	  raise ErrLocked, "#{lfile} already locked"
	rescue Errno::ESRCH
	  # not found process
	  File.unlink(lfile)
	end
      end
    end

    def uu_lock(lfile,tfile)
      begin
	uu_dolock(tfile, lfile)
      rescue ErrLocked
	uu_lockactive(lfile)
	uu_dolock(tfile, lfile)
      end
    end
    private :uu_lock, :uu_lockactive, :uu_dolock

    def new(name, mode)
      lockfile = "/var/spool/locks/LCK..#{name}"
      tmpfile = "/var/spool/locks/LTMP.#{$$}"
      begin
	uu_lock(lockfile,tmpfile)
      rescue ErrLocked
	raise ErrLocked, "/dev/#{name} locked"
      end
      begin
	super(File.open("/dev/" + name, mode), lockfile)
      rescue
	File.unlink(lockfile)
	raise
      end
    end
    alias open new

    def unlockcallback(path)
      proc {
	if File.exist?(path)
	  File.unlink(path) 
	end
      }
    end
  end

  def initialize(file, lockfile)
    @file = file
    @lockfile = lockfile
    ObjectSpace.define_finalizer(self, Tty.unlockcallback(lockfile))
    super(file)
  end
  
  def close
    @file.close
    File.unlink(@lockfile)
    ObjectSpace.undefine_finalizer(self)
  end

  def __getobj__
    return @file
  end

  def raw_mode
    tty = "\0" * 256
    self.ioctl(TIOCGETP, tty)
    ttys = tty.unpack("C4 S")
    ttys[4] |= RAW
    ttys[4] &= ~(ECHO|CBREAK)
    tty = ttys.pack("C4 S")
    self.ioctl(TIOCSETP, tty)
  end
  def cbreak_mode
    tty = "\0" * 256
    self.ioctl(TIOCGETP, tty)
    ttys = tty.unpack("C4 S")
    ttys[4] |= CBREAK
    ttys[4] &= ~(ECHO|RAW)
    tty = ttys.pack("C4 S")
    self.ioctl(TIOCSETP, tty)
  end
  def cooked_mode
    tty = "\0" * 256
    self.ioctl(TIOCGETP, tty)
    ttys = tty.unpack("C4 S")
    ttys[4] &= ~(CBREAK|RAW)
    ttys[4] |= ECHO
    tty = ttys.pack("C4 S")
    self.ioctl(TIOCSETP, tty)
  end
end
------------------------------------------------

-- 
                         ┌─鄭  明毅───────────────────┐
                         └──tei@harmony.co.jp──tei@mirage.linc.or.jp─┘

In This Thread