2007年 09月 28日

gerry++

HHK が日本語キーボードあつかいになる

http://support.microsoft.com/kb/927824/ja (XP でもおなじ)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters 
LayerDriver JPN	REG_SZ	kbd101.dll
OverrideKeyboardIdentifier	REG_SZ 	PCAT_101KEY
OverrideKeyboardSubtype	DWORD 	0
OverrideKeyboardType	DWORD 	7
2007年 09月 27日

gerry++

おれの腹もクラックされてた……

chokan を CodeRepos にうつした

http://coderepos.org/share/wiki/chokan


SafeEval は http://coderepos.org/share/browser/lang/ruby/safeeval に分離して gem に
まだリリースしてない。わすれてるテストがありそう

グラフの書きかたがわからない。

あのよくみる、うねうねしたやつ。一個要素ふえるとうにょーんって動いたりするじゃないですか。だめだもう。そういうのわかんない。ぜんぜん。あたまわるい

zsh のプロセス置換 =() と <() の違い

/dev/fd とかつかうのが < で、常に tmpfile つかうのが =、でいいのかな。一応 man よんだけど英語わかんね

これは例えば lv だと違いが顕著

$ lv <(date)
FileStretch(): Illegal seek
exit 255

$ ls -altr <(date)
prw-rw----   1 cho45  cho45  28  9 27 02:50 /dev/fd/12 # Mac OSX
lr-x------ 1 cho45 cho45 64 2007-09-27 02:51 /proc/self/fd/11 -> pipe:[2297610] # ubuntu Linux

$ lv =(date)
# ちゃんとみれる

$ ls -altr =(date)
-rw-------   1 cho45  wheel  28  9 27 02:51 /tmp/zsh0WJFb7

あと非同期かどうかも関係あるっぽい

$ cat =(date) =(sleep 5) =(date) =(sleep 10) =(date)   
木  9 27 03:59:16 JST 2007
木  9 27 03:59:21 JST 2007
木  9 27 03:59:31 JST 2007

$ cat <(date) <(sleep 5) <(date) <(sleep 10) <(date) 
木  9 27 03:59:54 JST 2007
木  9 27 03:59:54 JST 2007
木  9 27 03:59:54 JST 2007

前者は 15 秒かかったあと全部一気にでてくる。
後者は随時出力されながら、総合で 10 秒かかる。(順番は守られる)

zsh のチートシート

http://d.hatena.ne.jp/rubikitch/20070925#zshcheatsheet これみて、おおなるほどと思ったのでやってみた。
bindkey で超絶悩んだ……けど結局悩み損だった(つかってない)

http://lab.lowreal.net/trac/changeset/887

cheat-sheet は直接バインドせず、C-[ : して execute: だしてから cheat-sheet 実行するようにしてみた。キーバインドするほどではない気がしたのと、vi っぽくコマンド実行するようなのがいいかなみたいな。いやそれなら help だろ、っていうか help! もやらないといけないけど help! は定義できなそうとか今書きながら考えてたけどやってみたらできた

help! () { zle -M "E478: Don't panic!" }
zle -N help!

zsh の = (which的な意味で)

$ ls =ls
/bin/ls*

どうみても ls `which ls`より使いやすいです今まで本当にありがとうございました (which へのメッセージ的意味で)。

If a word begins with an unquoted `=' and the EQUALS option is set, the remainder of the word is taken as the name of a command. If a command exists by that name, the word is replaced by the full pathname of the command.

SC440 がきた

XP Pro をセットアップした。CD ドライブが家にあるのどれつないでも認識しなくてかなりこまった。なんか接触不良っぽいけどよくわからない。基盤側のコネクタを一回はずして押しこんだりしてやっと認識した。と、おもったら XP インストール中に 55% まできたところでまた認識しなくなって再インストール。なんなんだ。 (BIOS ですら認識してなかった)

起動してから付属CDからドライバインストール。なんかやっぱCDがうまく認識されない。まじこまる。なんどか射れたり抜いたりやってると認識したりする。よくわからない……スピンインすると割と安定する気がする。スピンアウトするとなかなか認識しない。これはドライブの問題っぽい?

前に使ってた HDD (250G) もうつしたけど、手元のケーブルだと SC440 の下の HDD ケースには入らないので、フロントにつっこんだ。ケーブルのとりまわしを変えるのが大変だった。(電源の変換ケーブルももってない)

  1. Chipset ドライバ
  2. reboot
  3. Nic ドライバ
  4. reboot
  5. オンボードグラフィックドライバ
  6. reboot
  7. Firefox
  8. PCIe x4 mod (はんだごて。端の1pinがうもれたけど GND なのでちょっと不安定になるだけと楽観視)
  9. 前つかってたうるさいグラボを装着 (GeForce 6200)
  10. nVidia のドライバインストール
  11. Parity Error でるので http://pc.usy.jp/wiki/index.php?PowerEdge%2FParity%20Error%B2%F2%BE%C3%CB%A1
  12. WPCRSET 自動起動
  13. IE7 Standalone
  14. synergy
  15. foobar2000
    1. Columns UI
    2. 保存してあった設定から復元
  16. Last.fm
  17. WAVIO SE-U55GX をつける (前のPCだとプチプチノイズはいって大変だったけど、今回はない)
  18. smb でマウント
  19. マイドキュメントをマウントしたドライブに設定

ぶっ壊れたPCのメモリが利用できないのがかなしいけど、圧倒的に静かになってよかった。余裕があったらメモリ増やしたい。512 でも使わないからそんなに困らないけど

2007年 09月 26日

環境に一切干渉できない eval

#!ruby -Ku

# クラス化して Module.new.instance_eval するようにしてみる。
# まだなんかあるかなぁ……

class SafeEval

	def safe_eval(code, tm=1)
		result = nil
		tg = nil
		th = Thread.start do
			# スレッドグループを作り、
			# 新たなスレッドはすべてこれに所属させる。
			tg = ThreadGroup.new.add(Thread.current)
			$SAFE  = 4
			result = Module.new.instance_eval(code)
		end.join(tm)
		# 生成されたスレッドをすべて削除
		tg.list.each {|t| t.kill }
		raise TimeoutError unless th # タイムアウトした場合 Thread は nil を返す
		result
	end

	alias eval safe_eval

end

if $0 == __FILE__
	require "test/unit"
	class SafeEvalTest < Test::Unit::TestCase

		def setup
			@t = SafeEval.new.taint
		end

		def test_safe
			assert_raise(SecurityError) do
				@t.safe_eval("puts ''")
			end

			assert_raise(SecurityError) do
				@t.safe_eval("$foo = :foo")
			end

			assert_nothing_raised(SecurityError) do
				@t.safe_eval("def hoge; end")
			end

			@t.safe_eval <<-EOS
				def safe_eval(code)
					"Nice boat."
				end
			EOS
			assert_not_equal("Nice boat", @t.safe_eval("nil"))

		end

		def test_safe_access
			assert_raise(NoMethodError) do
				@t.safe_eval("@foo << :bar")
			end
			assert_equal(nil, @t.instance_variable_get(:@foo))

			assert_raise(NameError) do
				@t.safe_eval("@@foo")
			end
		end

	end
end

まだなんかあるかなぁ……
SafeEval クラスは毎回つかいすてる。
インスタンス変数は無名 Module でさよならする。
クラス変数は SafeEval クラスが untaint である限りつくれない。