2007年 09月 27日

小さなころからやっておくべきだったこととか

そういうのをやってない。うちでは、芸術系のそういうことを一切やってない。おれはボーイスカウトを小学校低学年からちまちまやっていたけど、兄貴はそれさえやってない。ボーイスカウトで、これから得ようとしたら絶対に無理なこと、っていうのはそんなにない。ボーイスカウトをやっていても、特技になるようなことは特にない。ここで「健全な精神」とかいいだすやつがいるかもしれないけど、ぶち殺すぞヒューマンって感じだ。ちなみち「ぶち殺すぞヒューマン」の元ネタがわからなくて今ぐぐってみた。ヘルシングなんだ。読んだことない。たぶん伺かのさくらのセリフで覚えた(きもい)

自信になりえるような特技がとくにない。

おれ好かれる要素がなにひとつないな。更めて思った。あっても持て余すからいいよ。そういうことにしておこう。

やっぱおれは、コンピュータいぢるのがすきなんだなぁ。シェルの環境改善したりとか、やりたいことをやるための最もスマートな方法を探すとか、SKK を使いこなすとか、なんでもいいけど、そういうのは楽しい。ぐぐったり、man をみたりしながら、そんな情報の森だか洞窟だかを冒険して、生き残る術を探すのだ。現実の冒険よりも圧倒的にリスクが少なく金もかからず、できた方法は他の人と共有できる。

「おもしろいね」=「え、これどうやってるの」>>>|超えられない壁|>>>「すごいね」

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 である限りつくれない。

chokan 更新

Eval はとりあえずオフにしたまま。

とりあえず改行をちゃんととりのぞくように
http://lab.lowreal.net/trac/changeset/879
invite されたときほいほいついていかないように
http://lab.lowreal.net/trac/changeset/880
operator に設定されたマスクからだけ invite をうけるように
http://lab.lowreal.net/trac/changeset/882
@もらったらくれた人の@を奪ってから@を捨てるプラグイン
http://lab.lowreal.net/trac/browser/chokan/trunk/plugins/always_no_op.rb

@うばうのは AutoOP でループしないようにだけど、普通は JOIN で処理してて大丈夫だろうから奪わなくてもいいかもしれない。チャンネル唯一のオペレータが chokan に@あげるとチャンネルのオペがいなくなる。

2時ぐらいからずっと寝てた。仕事しろ。


海岸に近い、三日月型の地域。回りは山で、斜面が結構きつい。鎌倉に近いけど、もっと狭い。街の中心に HMV タワーというのがある。そんなに大きいわけではない。そして、それを新しくしたタワーが建築途中、だったのだけど、中止されて、既にあまり綺麗ではない。中世ヨーロッパっぽい模様のタワーなのだけど、土台のところだけ。
そこそこよく見る、坂道のわかれ道はこの街の少しはずれの場所だった。

なにか大きな大災害がおこる。内容はよく覚えてない。とにかくたくさん人が死ぬ。

2007年 09月 25日

1から100までの数字を色を表わすとするとどういうアルゴリズムがいいんだろうなぁ。
小さいほど青で明度が低く、大きいほど赤で明度があがる? 彩度で雰囲気調整?

カラーピッカー


Photoshop では HSV の H を横に縦に出したやつ (たぶんもっともよくみる形のピッカー) しか使わないけど、実際どういう形が一番いいんだろうなぁ。いいっていうのは、直感的に選びたい色が選べるという意味で、だけど……



Windows 標準のカラー選択ダイアログもこれだった気がするけど、これは中間色がなんとなく選びにくい感じ。


これも上とあんまり変わらない。

やっぱ「あの色 (色相) の、こういう感じのトーン……」って選ぶからいちばんうえのっぽいのが一番使われているんだと思うけど、それにしてもこういう選びかたをさせるピッカーの形もいくつかある。

Painter の右にむいた二等辺三角形 (http://lowreal.net/2005/triangle-color-selector とほぼ同じだけど、正三角形ではない。等間隔になるように三角形の高さを底辺と合せてある) は結構好きだけど、ちょっと狭い感じがする。

http://www.ficml.org/jemimap/style/color/wheel.html こういうのもあるけど、意図がよくわからない。

ほかに色相環+そのなかに四角とかも見る。これは場所をとるのが欠点だけど、色相環がちゃんと環になっているのが好き。人気があるっぽいSAIもこれっぽい (もちろんピッカーの形で選ばれているわけではないだろうけど)。


あと関係ないけど、普通の人に「いい色」を選びとってもらうという用途で、別に全部の色を選ばなくていいんじゃね、というなら、例えば DIC カラーとかを参考にしつつ適当に抜いてくるとか、あるいは「日本の伝統色」とかジャンルわけでやるとかがいいのかなぁ。

curses のメモ

じぶんはターミナルをほぼ全画面表示させているので、横幅が結構ながい。
そんなんで、ときどき右側にちょっと表示させたいなぁってことがあったりするのでそれのサンプル。

#!/usr/bin/env ruby

require "curses"
class Curses::Window
	def puts(*msgs)
		write(msgs.map {|m| m.to_s.chomp + "\n" }.join)
	end

	def write(str)
		@data ||= ""
		@data << str

		setpos(0, 0)
		l = maxy - 1
		out = @data.split(/\n/).last(l).join("\n") + "\n"
		addstr(out)
		refresh
		@data = @data.match(/(.*\n)*.*\n?\z/)[0] 
	end

	def sync=(*)
	end
end

Curses.init_screen
begin
	win1 = Curses::Window.new(Curses.lines, (Curses.cols / 2).to_i, 0, 0)
	win2 = Curses::Window.new(Curses.lines, (Curses.cols / 2).to_i, 0, (Curses.cols / 2).to_i+1)

	Curses.refresh
	
	$stdout = win1
	$stderr = win2
	
	load(ARGV.first, true)

ensure
	Curses.close_screen
end

$stdout と $stderr を画面半分ずつわけて表示させてみる。引数に ruby スクリプトをとる。
うえのをてきとうに double.rb とかで保存して http://lab.lowreal.net/trac/browser/c/mendoi/proxy.rb を実行させると、左にのっとりされたファイル、右にスキャンしたファイルが表示される。

(画面ちっちゃくして撮影)

$0 == __FILE__ やってるスクリプトはうごかないけど、とりあえず proxy.rb だけこうしたかった (ちゃんとのっとりできてるかわかりにくかった)

@data をちゃんとつめないとだめだ
http://lab.lowreal.net/trac/changeset/877

Tumblr のログイン支援

http://svn.coderepos.org/share/lang/javascript/userchrome/tumblr-multi.uc.js
ステータスバーに tumblr のアイコンがでる。クリックすると今までログインしたことのあるユーザ名が一覧表示され、選択するとそのアカウントでログインしたうえでブックマークレット発動
ログイン情報はパスワードマネージャから拾ってくるので保存されてないとつかえない。

chokan クラックされた

Eval と SimpleReply 系を併用してつかってる人がもしいたらすぐ Eval のほうを無効にしてください。任意の IRC コマンドが放てます。

IRCNet にいた chokan は一旦落とし、Eval をロードしない状態でうごかしています。てら迷惑な chokan
もっとセキュアな eval を考え中

kill してとめて main screen turn on / got signal とかいうから、あれもしかして SSH で入ってシェル見てんのとか思ったりして tail -f /var/log/auth.log したりとか……
でもぱっとみは chokan 経由でしかやってなかったっぽいし、なんで signal でとめたのがわかったのかわからない……彼らからするとみえないはずなんだけどなぁ。chokan のログはとってなくて (表示させてるだけで、追ったときは screen のバックログ検索) ふかくおえない……

chokan は tiarra 経由でつないでて、chokan.rb を殺しても IRCNet 側的にはなにもおきない (これは CTCP で彼らはしってた)。Eval 経由ではソケットへの書き込みは $SAFE 的に一切できないはずだから (できるなら SimpleReply を経由しないだろう)、直接そこからどうこうしたってわけではないと思う……

直接 chokan に対してセッションをはれていたわけではないはずだから、SEGV させてうんたらってのはできないはず。SEGV させたら Eval がもう動かないし

  • chokan.rb から任意の IRC コマンドが発行できる状態になっていた
  • freenode と ircnet につないでいたが IRCNet 以外ではとくになんもなかった
  • 他のチャンネルいくつかにも強制 JOIN していた。すべて IRCNet
  • http/https/ssh/ircd 以外のポートはルータの時点で閉じてる。
  • SSH のログで最後にアタックがあったのは 16:00 で、.net ドメイン (全て失敗) クラッカーは .at .ch だった。
  • SSH はそれから先 publickey でのおれのログインしかない。

直接セッションはらせる方法もあることはあるか……
DCCCache つかって CTCP SEND 投げて chokan に直接接続させて、ほげほげ? できんの?
とおもったけど、接続がきた時点で日付とか nick をふくめてファイルを生成しているのになんもできないからこれは使ってないっぽい。