2008年 06月 01日

何度か書いたりしているけど、僕は数学ができなくて文系に進んだ気があるので、そこにコンプレックスがあるんだよなぁ…… でもって、なんかこう、ぷろぐらむのえらいひととかは、体系的に数学を勉強しとかないのが許されるのは web 2.0 (笑) までだよネーっていう感じなので、そういうのを見るたびに、(それはたぶん正しいから) どうしようもない心持ちになる。

情熱を売ることをしたりすると、定期的にそれがなくなる周期でとてもとても大変なことになる。

宇宙はいつか消えてなくなり、人生は一瞬で終わってしまう。そこまで言わなくとも、あらゆるものはすぐに変わって形をなくし、流行は流行でしかない。そんななかで、声高に「生産性!」「労働!」などと叫び、誰かにそれを強制させようとするのはとてもバカみたいだ。人生は人間ごっこという遊びで、あるキャラクタをそこそこに演じているにすぎない。もちろん真剣に遊ぶのは間違った遊びかたではないからいいけれど、そのバカバカしいほどのマゾさを「これが楽しいんだよ!」などと他人に押しつけるのはヘンタイかつ悪い意味でのオタク的だと思う。「人生オタク」っていうのは、どんなオタクよりもタチが悪く、救いがたいバカで、害だと思う。

なんか判断力がなくて困るよーーーー 行動の指針を見失ってる。もともとあったのかすらなぞな

ちょうしこいてて ほんとに さーせん

将来が餡の雲

Web of trust (信頼の輪)

もっとこう、ゆるい wot が欲しいんだよなぁ。普通の人でも使えるような。

既に信頼できる人が保証人になって、隣の人を知るっていうことは普通に昔からあることだろうけど、こういうのこそ安全なネットワークに必要なのにあんまりシステムとして取り入れられてないのはなんでなんだろう。

と思ったけど SNS が近いのかなぁ。でもあれは信頼の輪としては働いてないよなぁ。mixi での FOAF はそんなに信頼できない。なんでだろう。保証人がどれほど保証しているかがわからないからかなぁ。人によってはマイミク申請をかたっぱしから許可していたりするし、そういう人の保証人としての信頼度はすごく低いはずだけど、そういうのはパっと見わからない。


あと、インターネットの場合、信頼の輪の一番最初が難しいよなぁ。誰を信頼したらいいかなんてわからないし、誰も自分を保証してくれたりはしない。オフラインであれば親が最初の輪になるけど、ネットだとそういうのない。今は信頼の材料として、日記やブログの継続や、所属が明かなら所属による保証ぐらいしかないよなぁ。既に輪があったとしても、クラスタが違うとそれは効かない。

2008年 06月 02日

自分の年齢をちゃんとわかってなくて困る、一年っていう単位が微妙すぎて、感覚的に計れない。

さすがにまずいですよねー…… とかおもう。常識を知らなくても知っていても、常識的な行動ができないなら意味ない……

朝の二時間ぐらいの間に、どうにかして頭の中にある回路を解析し、スイッチを切り替えて「やっていける」という表面上の自信みたいなものを構築しなければいけない。毎日毎日回路の構造は変わって、スイッチの切り替えかたも変わる。

2008年 06月 03日

2008年 06月 04日

話を聞くときは常に相手のポジションと自分との関係性を考えなければならない。圧倒的に相手の有利なことを、あたかもこちらのほうにより利益があるようにいっているのは危険だし、詐欺である。それを信じこんで楽しいならいいけれど、あとには何も残らない。悪質な新興宗教と一緒だ。

当たり前なことは当たり前に認識しないといけない。お金があれば社会に感じる不安の殆どは間違いなくなくなるし、そのうえでは完全に自由に事が運べるのだ。自分の意志で動ける時間を作らないといけないんだよ。 一番怖いのは、誰かの意志を自分の意志と勘違いすることだ。目に見える共通のプロトコルはなんだ? 疑えよ。

↑無理

2008年 06月 03日

typo しにくい id を自動生成

hiveminder のタスク id とかってidの16進数の下位4ケタみたいな感じになっているのですが、あれが激しくうちにくくて、ついでに連番っぽいので間違えて違うタスクを done しちゃったりします。そゆことにならないような id を生成するのをつくってみました。

  • 数字は遠いし typo しやすいので使わない
  • qwert キーボードに限定しない

というかんじにしたいので、aiueo 以外の文字 + aiueo を連番で出すようにしてみました。こういう配列は日頃からうっているのでうちやすいはず!!

class TypableMap < Hash
	Roma = "a i u e o k g s z t d n h b p m y r w j v l q".split(/ /).map {|k|
		%w|a i u e o|.map {|v| "#{k}#{v}" }
	}.flatten

	def initialize(size=2)
		@seq = Roma
		@map = {}
		@n   = 0
		@size = size
	end

	def generate(n)
		ret = []
		begin
			n, r = n.divmod(@seq.size)
			ret << @seq[r]
		end while n > 0
		ret.reverse.join
	end

	def push(obj)
		id = generate(@n)
		self[id] = obj
		@n += 1
		@n = @n % (@seq.size ** @size)
		id
	end
	alias << push

	def clear
		@n = 0
		super
	end

	private :[]=
	undef update, merge, merge!, replace
end

map = TypableMap.new
id = map.push(:foo)
p id #=> "aa"

map << :bar
map << :baz
p map #=> {"aa"=>:foo, "ai"=>:bar, "au"=>:baz}

かなり適当ですが結構うちやすいかなと思います。

でもって tig.rb に組み込んで自由に、確実に fav れるようにしてみました。( http://coderepos.org/share/changeset/13144 )

CTCP ACTION で fav ai などを送ると、目的のメッセージが fav できます。CTCP ACTION はクライアントによって送りかたが違いますが、irssi だと /me です。/me fav eita などなど

2008年 06月 05日

ねむたい

ずっとねむたい

fotolife がライセンス表示できるようになった

スバラシス。僕のは全部「表示・非営利 (by-nc)」にしときました。今の flickr のルールと一緒です。

ただ、fotolife はフォルダごとなので、思いたったときに all rights reserved にもどされると、一見ライセンス違反しているように見える罠が flickr より顕著ですね。怖くてあんまアテにならないかも……

つまり、「自分がみたときは CC だった」のに、あとから作者がライセンスを変えて「おまえはライセンス違反だ」と言いだす可能性がある。基本的にはサービス側でライセンスの変更履歴をとっておくべきだと思う。考えすぎなのかもしれないけど、不安は不安なんだよなぁ。flickr の CC 写真をあんま積極的に使ってない大きな理由だし……

2008年 06月 06日

マーケターは利己的に動く、エンジニアは合理的に動く。

リテラシ低いユーザを、リテラシが低いまま取り込むサービスじゃなくて、リテラシが高くなるようにデザインされたサービスじゃないとだめだ。

[niconico:sm3557256]
ふいたw いろいろまざってるwww

2008年 06月 05日

Io みたいな async を Ruby でやってみる

http://subtech.g.hatena.ne.jp/secondlife/20080605/1212634318 みてふと思いついたのでやってみた。

class Foo
	def heavy(n)
		sleep n
		n
	end
end

f = Foo.new

p :a
foo = f.async(:heavy, 2) # 即座にかえる
p :b
p foo # まつ
p :c
p foo # 即座にかえる
p :d

foo = f.async(:heavy, 2)
bar = f.async(:heavy, 5)
p :e
p [foo, bar] #=> 5秒まってから [2, 5]

foo = f.async(:heavy, 2)
bar = f.async(:heavy, 5)
p :f
sleep 5 # 5秒間カレントスレッドをとめてスイッチ
p :g
p [foo, bar] #=> 即 [2, 5]

Io の foo @heavy の雰囲気そのままな感じ。

スレッドなのでどこで実行されるかは確実ではない。Ruby のスレッドは IO 待ちとか sleep とかでスイッチする。

実装:

class Future
	def initialize(obj, name, args, block)
		@obj, @name, @args, @block = obj, name, args, block
		@th  = Thread.start do
			Thread.pass # 一応明示的に pass しておく
			@obj.send(@name, *@args, &@block)
		end
	end

	def method_missing(name, *args, &block)
		@th.value.send(name, *args, &block)
	end

	# 全部委譲してなりすます
	Object.instance_methods.each do |m|
		next if %w|__send__ __id__ object_id|.include? m.to_s
		undef_method m
	end
end

class Object
	def async(name=nil, *args, &block)
		Future.new(self, name, args, block)
	end
end

Thread をラップした Future をつくるだけなのでたいしたことはやってない。この方法だとどんなメソッドでも非同期にできる。

undef_method しまくって method_missing に飛ばしているので、パっと見もとのオブジェクトを変わらない Future インスタンスができる。(inspect も書きかえているということなので、p は信じてはいけない)
p は inspect をよんでるし、#{} は to_s をよんでいるので、透過的に扱えるようにみえる。このオブジェクトにメッセージがおくられた結果を使う限り、Future は見えない。

Lazy と似てるけど違うのは、呼ぶのが確定した時点でもう評価を開始するところ (Ruby のスレッドは暇になるまでスイッチしないけど)。最終的に準備ができていないと待たされるけど、準備できていれば待たされない。


あとでもこれだと symbol をわたしてなんかカッコわるいのでもう一個中間オブジェクトをかましてみる。

class Object
	def async(name=nil, *args, &block)
		name ? Future.new(self, name, args, block) : AsyncObject.new(self)
	end

	class AsyncObject
		def initialize(obj)
			@obj = obj
		end

		def method_missing(name, *args, &block)
			Future.new(@obj, name, args, block)
		end

		Object.instance_methods.each do |m|
			next if %w|__send__ __id__ object_id|.include? m.to_s
			undef_method m
		end
	end
end
p :a
foo = f.async.heavy(2) # 即座にかえる
p :b
p foo # まつ
p :c
p foo # 即座にかえる
p :d

a = f.async.heavy(1)
b = f.async.heavy(2)
c = f.async.heavy(3)

p :e
sleep 3 # カレントスレッドやすむ
p :f
p [a, b, c] # 即座にかえる

アクターモデルについては今調べたりしてみてるけど、まだよくわかってない……

コールバックは instance_eval

p [
	Kernel.async.sleep(3).async.instance_eval { p "done #{self}"; self },
	Kernel.async.sleep(2).async.instance_eval { p "done #{self}"; self },
	Kernel.async.sleep(1).async.instance_eval { p "done #{self}"; self },
]
__END__
"done 1"
"done 2"
"done 3"
[3, 2, 1]

最初の定義で、Object#async を Future よりあとに定義していることに注意が必要です。Future#async は method_missing よばれません (よばれるとこういうふうに書けないですね)。


サブテクの日記の最新タイトルをとってきてみる

require "net/http"
require "uri"

def aget(uri)
	puts "getting => #{uri}"
	Net::HTTP.async.get(uri).async.instance_eval {
		p "done #{uri}"
		self
	}
end

require "rubygems"
require "hpricot"

base = URI("http://subtech.g.hatena.ne.jp/diarylist")
doc = Hpricot(aget(base))

doc.search(".hatena-body .day .refererlist ul li a").map {|a| aget(base + a[:href] + "rss") }.map {|body|
	doc = Hpricot(body)
	[doc.at("//dc:creator").inner_text, doc.at("//item/title").inner_text]
}.each do |id, title|
	puts "id:%s : %s" % [id, title]
end

実行してみると getting と done がまざって実行されているのがわかると思う。一旦全部 async しないといけないから map が二回でてきてるのはかっこわるいかも……

2008年 06月 07日

サーバとどいた

けどセットアップめんでええええええええ。とりあえず 500GB * 2 の HDD を明日買ってテンションあげる……

マシン名は Karen にした。おれの管理のコンピュータ名は女性名で統一していて (よくありげって DIS られう)、ただし制限を一応つけてるのでめんどかった。

  • Charlotte
  • Winona
  • Nina
  • Mary
  • Karen

必要なもの: HDD * 2, SATA ケーブル 2, SATA 電源変換コネクタ 2

シングルトン

シングルトンオブジェクトは「グローバル変数」の言いかえです。

2008年 06月 06日

サーバセットアップ

todo list

  • sshd
  • bind
  • apache
  • tiarra
  • plagger
  • mysql
  • openfl
  • iptables

めんどくさいな

とりあえず付属してきた 80GB の HDD をシステムディスクにするので ubuntu LTS をインスコ。

  • apt-get install
    • openssl-server
    • openssl
    • ssh
    • sshfs
    • gcc
    • libc6-dev
    • make
    • autoconf
    • ruby
    • subversion
    • apache2
    • bind9
    • git
    • git-svn
    • lv
    • screen
    • libxml2-dev
    • libssl-dev
    • vim (あとで入れなおす)
wget http://svn.coderepos.org/share/dotfiles/setup/cho45-setup.rb
ruby cho45-setup.rb

でだいたい自分の作業環境は整う。過去のじぶん++

  • cpan
    • Bundle::CPAN
    • CPAN
    • App::Ack
    • Catalyst::Devel
    • Plagger
    • ↑ だいたいこれで依存モジュールはいる
2008年 06月 08日

RAID

500GB * 2 をデータディスクに

> n
> p
> 1 #パーテーション番号
> 1 #最初のシリンダ

> +500000M
> t # タイプ変更
> fd # Linux raid auto detect

> p
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x6c4fc740

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       60789   488287611   fd  Linux raid autodetect

sdb, sdc に、

$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: array /dev/md0 started.

$ sudo mkfs.ext3  /dev/md0

データディスクのマウントポイントに悩む。/srv と /home はデータディスクにしたいけど、パーティションをきりたくない。/home は symlink にしたくないし、普通にマウントするようにしたい。

調べてみるとう mount --bind old new みたいにすればできるみたいだ。なので

  • /mnt/data に /dev/md0 をマウント
  • mount --bind /mnt/data/home /home
  • mount --bind /mnt/data/srv /srv

にしてみる。

$ sudo mount -l
/dev/md0 on /mnt/data type ext3 (rw) []
/mnt/data/home on /home type none (rw,bind)
/mnt/data/srv on /srv type none (rw,bind)

みたいになった。できたっぽい。

fstab に書く

/dev/md0                                  /mnt/data       ext3    defaults,errors=remount-ro 0       1
/mnt/data/home                            /home           none bind
/mnt/data/srv                             /srv            none bind

バックアップとか

神経質すぎるのかなぁ…… でも消えたらマジこまるしなぁ。

僕が大学生のこと嫌いなのは単純に嫉妬しているだけですよ。

「その場にいなくてよかった」とか「被害を被らなくてよかった」というよりも「あれが僕じゃなくてよかった」と思っていた。それは僕だったかもしれないし、僕がああなる可能性を確実に否定することができない。

mysql

どうやるのがいいのかよくわからないけど、もとのサーバのファイルをそのままコピることにしてみた

sudo tar cpf /tmp/mysql.tar /var/lib/mysql
scp charlotte:/tmp/mysql.tar /tmp
cd /var/lib/mysql
sudo tar xpf /tmp/mysql.tar

しかしながら

ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)   

とかでるので http://ubuntuforums.org/showthread.php?t=112505 にしたがって

GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;

した。password は /etc/mysql/debian.cnf

家の開発環境を (インターフェース的な意味で) 強化してみた。でもなーなんかなぁ 家の環境整えてもあんま使えないんだよな……

備えよ常に

2008年 06月 09日

週末にやろうとおもっていた写真関係のアレコレが全く進んでない。というかこういうとき一人だとどの程度にすればいいのかまったくわからなくて本当に困るなぁ……

  1. 自発的にやれる行為
  2. 言われたらやれる行為
  3. 自分ではまず絶対やりたくないけど、どうしても必要になったらやる行為
  4. 他人がやるぶんにはいいけど、自分では絶対にやらない行為
  5. 他人がやるのも全く許せない行為
2008年 06月 08日

バックアップとか

最終的なこうせい

  • 500GB (RAID1) -> /backup (pdumpfs で一日一回)
  • 250GB -> /home
  • 80GB -> /

データディスク以外は RAID かけないようにした。/home も一日一回バックアップあれば壊れたとき復元できるので RAID かけない。

2008年 06月 09日

逃げだしたい

RAW 管理アプリをつくりたい…… てかいろいろつくりたいのあるけど、いろいろ面倒で手がつけられない

2008年 06月 11日

真剣に生きているフリをしているっていうのに腹がたつんだとおもう。自分もそうだからなんだろう

2008年 06月 12日

404 Not Found

僕は攻めらしいですよ!! 絵だとニコンのカメラっぽいけど、僕はキヤノンユーザです(謎) アサノさんありまとう *oeo*

2008年 06月 14日

自信なんていらない……

2008年 06月 12日

なんかすごく心穏かになる夢を見たはずだけど、よく覚えてない。People In The Box をつけっぱなしで寝たおかげかなにか

丘、緑、Yシャツ、スカート、凧、青空、坂、自転車

2008年 06月 14日

おれはめぐまれすぎ

2008年 06月 15日

けっきょくおれはどこにいってもへやでひとりでまじなきするようにできているのではないか

季節感ゼロ

IMG_2042

バラは確かに綺麗なんだけどなぁ。綺麗ってだけなんだよなぁ。

鮮かな赤っていうのもたまにはいいなぁ。引き込まれるよなぁ。衝動的なかんじだ

2008年 06月 14日

日記

コード書いてた。ドキュメント書いてた。でもどうせこんなの役に立たなんだろう。金にならないオープンソース(笑) それでもやるってことですか、そうですか? お金と暇があれば自由にオープンソースなコードが書けるんだけど、わかってますかねー。お金お金とはいいたくないけど、実際問題として、お金があれば社会生活上の不安の殆んどは解決するじゃないですか。でももういいよねー お金なんていらないよねー 例えば「一ヶ月後に死のう!」と元気よく決めておけば、一ヶ月間生きられるだけのお金ならあるわけで、ならまぁいいか、みたいな。

購読者数増えてきても、全く気にしないで書きたいことを書きまくろうと心に決めているはずなのに、やっぱアレだなーとか思ってしまうことに腹がたつ。割れてないサブアカがあんまりない。

2008年 06月 15日

時系列をパっと見でわかりにくくするために、過去の日記に追記していく試み

烏丸御池が溜池山王といくら似ているからといって間違えてはいけませんよ

で、そんだけ頑張ったあなたは、なにを手に入れたんですか?

コンピュータつかっていろいろ簡単になったんだから、その分楽をすればいいっていうだけの、簡単なことなのに、コンピュータに仕事をとられたからなんかしないといけないのっていうのは、なんか本当にうざったいなぁ。コンピュータがエラーだしてないか監視するだけの簡単なお仕事でいいじゃん。

そうだ! ここはまだ文章になってるだけマシだ! なってるのかよくわからないけど(笑) ぼくはよみかえしてどうにか理解できるけど(笑) ありえん(笑)

バカばっかりだ。バカばっかりだ。目に付きにくい暴力で戦争をやってるにすぎない。なにが平和だよ。スイーツ(笑) 恐るべきことに、だいたいの人は「平和なのが一番だよね☆」とかいいつつ日々のなかで戦争を平気でやるのだけれど、あれは素でやってるんでしょうか。血が流れるだけが戦争ではない。そしてそれに僕も加担しているんだな!!!

「天は人の上に人を造らず、人の下に人を造らず」というのは、心がけであって、真実ではない。実際にはそうではないから、せめてそう考えられるうちはそういう状態にしましょうか、っていう心がけだ。本気で信じている人もいるかもしれない。戦争する人達とかだ。

僕は頭のおかしいフリを、ヘタクソにしているにすぎませんから。だから全く問題がないのですよ。一体全体、あらゆる困難が全くなかった僕がおかしくなるはずがありませんよ。僕はずっと幸せですよ。観察結果しか意味ないんでしょ? みんな戦争しているから、他人が実際にどう感じているかなんてどうだっていい。こう見えるからこうだ、ってだけだもの。チューリングテストみたいかもですね。でも僕はチューリングテストが通ったら人間とみなしていいと思っています。

2008年 06月 16日

もっと絞ればよかった。接写リングつけて近づくと被写界深度と絞りの対応がズレて混乱する。

「こういう女の子いいよね」シリーズ

せめて写真ぐらいは、とおもって再現像したりしたけれど、だめなのばっかだ

いやまじおれ漢字とか書けねーし(笑) いやマジでマジで(笑) 追いつめてるの誰(笑) おれ?(笑) なんでおれがそんなことしないといけない?(笑) マゾじゃねーし(笑) 誰がしむけたの?(笑) でてこいよ(笑) え、あ、ニートです(笑) 働いてないです(笑) 学校もいってないです(笑) ニコ中っす(笑) あでもニコチン中毒じゃないっす(笑) タバコほんと嫌いなんで(笑) 歩きタバコみると後ろから打ん殴ってやろうかと思います(笑) 自分が発狂したときは歩きタバコを優先すると思いますよ(笑) 不謹慎2.0(笑) リスクヘッジ(笑) もういらない(笑)

どうにか頭のスイッチを明日の朝までに切替えるために、できる限りの言葉、魔法というより呪いみたいな、頭の中で渦巻いて離れないものを外部化して、プールの水を内側からの見掛け上減らすことをしているわけです。呪いは消えさりませんから、外部化するのが精一杯なわけです。外部に一時的に出しておくだけですから、ループして戻ってきます。そうなったらまた外部化する手続きをしないといけないわけです。タンポポ。

twitter ってほんとクソつまんなくてうける。演出ばっかりだ。演出過剰

何が「僕も僕も」なんだよほんとうにもううざいな。非リア充演じているのが腹が立ちまくる。リア充ならリア充っていえばいいじゃない。僕はリア充ですからどうでもいいっちゃどうでもいいですけどね(笑) 大学生はほんとうにダメだな。おれみたいなのばっかりだ。twitter のたかだか一行を書くのにも、人々の思惑を考えるようになってしまった。

アルコール摂取したらほんと何するかわからなくて恐ろしい。いろいろ安定するまでは一滴も飲まないほうがいいと強く感じるわけです。酔ってなくてこれですからね。ひどいですよ。(女生徒リスペクト)

女生徒全部覚えようとか思ったけど短編とは言え結構長いので記憶力が皆無な自分にはとてもむずかしい。女生徒読んで何回泣いたかマジわからん(笑)(笑)(笑)

2008年 06月 11日

簡単に死ぬ方法をたくさんの人が探しているんだから、さっさとつくればいいのに

2008年 06月 09日

結局、時間をかけて考えるものは趣味でしか作れないんだろう。いちいちお伺いをたててたら試行錯誤なんてできるわけないだろ。通ったときには既に情熱もなく、それは苦痛でしかない。

2008年 06月 16日

この日記もフィクションです。演出です。

この日記を読んでから僕に会う人がなんかギャップを感じたり、あるいは僕をもともと知っていてからこの日記を読んでギャップを感じたり、いろいろあるかと思いますが、それはその人が自動的にキャラクタ化しているからですよ。別にどれが本当とかはないからいいですよ。どんな像を持っていてもやりたいようにやるだけです。

逆に、「自分」のキャラクタを「自分」で固めて、相手にそのイメージを強要する人がときどきいますね。そういう人がとても嫌いです。同じように、自分で作った作品の解釈を制御しようとする作家も嫌いです。創造が次に続かないからですね。アイデアにならない。その作品でアイデアの連鎖は終了。消費するだけの作品。ゴミ。

つきつめると、デザインとブランディングっていうのがどっちも嫌いということになりますが、それはある程度はそうですが、全部ダメってわけではもちろんないですよ。0か1かに生きてるわけじゃないんですから。プログラマは0か1かに囚われていると考えている人がいくらかいるかと思いますが、そうでもないと思いますよ。逆に、コンピュータと付き合うと、どこまでが割り切れることかが肌でわかるようになりませんか? そうなりたいものですね。

知ってますか? 非同期実行がさー綺麗に書けるんだよー、とか言っても女の子にはモテませんよ? えぇ、知っていますよ。だからなんだっていうんですか?

2008年 06月 15日

feature name

def feature_name(class_name)
	class_name.split(/::/).map {|const|
		const.scan(/[A-Z](?:(?![A-Z][a-z])[A-Za-z])*/).map {|i| i.downcase }.join("_")
	}.join("/")
end


require "rubygems"
require "spec"

describe "feature_name" do
	it "should generate filename from class_name" do
		feature_name("A").should           == "a"
		feature_name("Foo").should         == "foo"
		feature_name("FooBar").should      == "foo_bar"
		feature_name("FOOBar").should      == "foo_bar"
		feature_name("Foo::Bar").should    == "foo/bar"
		feature_name("Foo::BarBaz").should == "foo/bar_baz"
	end
end

def feature_name_(class_name)
	class_name.split(/::/).map {|const|
		const.downcase
	}.join("/")
end

require "rubygems"
require "spec"

describe "feature_name_" do
	it "should generate filename from class_name" do
		feature_name_("A").should           == "a"
		feature_name_("Foo").should         == "foo"
		feature_name_("FooBar").should      == "foobar"
		feature_name_("FOOBar").should      == "foobar"
		feature_name_("Foo::Bar").should    == "foo/bar"
		feature_name_("Foo::BarBaz").should == "foo/barbaz"
	end
end

アンダースコアださいなぁ…… どうせ逆変換できないなら後者でいい感じかなぁ。。

2008年 06月 16日

LDR 用のブックマークレット

これは便利、LDR か Fastladder ひらいて実行すべき

javascript:void(subs.model.list.forEach(function(s){if(s.link=="\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0064\u002e\u0068\u0061\u0074\u0065\u006e\u0061\u002e\u006e\u0065\u002e\u006a\u0070\u002f\u0063\u0068\u006f\u0034\u0035\u002f")new API("/api/feed/unsubscribe").post({subscribe_id:s.subscribe_id})}));

心底絶望した。

2008年 06月 17日

http://flickr.com/photos/cho45/2580068461/#comment72157605624965558 こういうコメントは本当にうれしいなぁ。

zsh の exntended_glob と HEAD^^^ を共存させる。

extended_glob すると ^ が特殊文字になって HEAD^^^ とかできなくなって UZEEE のでやってみた。

typeset -A abbreviations
abbreviations=(
	"L"    "| $PAGER"
	"G"    "| grep"

	"HEAD^"     "HEAD\\^"
	"HEAD^^"    "HEAD\\^\\^"
	"HEAD^^^"   "HEAD\\^\\^\\^"
	"HEAD^^^^"  "HEAD\\^\\^\\^\\^\\^"
	"HEAD^^^^^" "HEAD\\^\\^\\^\\^\\^"
)

magic-abbrev-expand () {
	local MATCH
	LBUFFER=${LBUFFER%%(#m)[-_a-zA-Z0-9^]#}
	LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
}

magic-abbrev-expand-and-insert () {
	magic-abbrev-expand
	zle self-insert
}

magic-abbrev-expand-and-accept () {
	magic-abbrev-expand
	zle accept-line
}

no-magic-abbrev-expand () {
	LBUFFER+=' '
}

zle -N magic-abbrev-expand
zle -N magic-abbrev-expand-and-insert
zle -N magic-abbrev-expand-and-accept
zle -N no-magic-abbrev-expand
bindkey "\r"  magic-abbrev-expand-and-accept # M-x RET はできなくなる
bindkey "^J"  accept-line # no magic
bindkey " "   magic-abbrev-expand-and-insert
bindkey "."   magic-abbrev-expand-and-insert
bindkey "^x " no-magic-abbrev-expand

こうすると

git reset HEAD^ # までうって RET をおすと
git reset HEAD\^ # に展開されて実行される

git di HEAD^^^..HEAD^ # とうつと、
git di HEAD\^\^\^.
git di HEAD\^\^\^..HEAD\^ # と展開されていく

git は引数に割とファイルとったりするので glob の機能自体は残しておきたいわけです!

2008年 06月 18日

完璧に負け癖がついてる。どうすればいいんだ

なんかなー、けっきょく「今まで一回も負けたことがないのから何やるにしても自信満々ですよ」っていう人が生きのこるわけで、じゃあもう負けっぱな感じになると、抜け道がないのだよなぁ。もうこれ、ホントに運でしかない。しかもそういう運を持っている人が、もっと頑張れよ!!!とかいうからなー おわってんなー おわってんなー

これでギリギリのところでフォールバックする状態があればいいけど、残念ながら世の中的にそんなものは存在しやがらないので、逃げだそう!と、思いたったその瞬間には死が待っていて、なので「にげだしたい」の同意語として「しにたい」が使われてしまうのだなと思った。でもって、死んでもいいじゃん、ってのは、「死にたくない」を無視して逃げ道を強制的に作っておくっていう

rescue がないと、スタックのさらの上の rescue まで例外が飛ぶんですよ。「え、そんなことで、そこまでしちゃうの」ってのは rescue 書いてないからだよ。フォールバックの仕組みを各レイヤーにつくろうよ。

自分の中で、やることにストッパがかかってる感じだなぁ。頭で、おれは、これやろう、って思っているのに、手が動かないっていう、なんか、システムにロックがかかってる感じ、違う誰かに操られている感じ。そのせいで怒られる。殺される。

  • 刺身タンポポを瞬殺 + 個人研究
  • 共同研究

だと、前者のほうが気が楽なのかもなと思った。そんなうまいこといかないよ。あれかーそもそも考えかたが間違っていたのかもなぁ……

帰宅してからなんもしてないでもうこんな時間かー 電車乗ってる時間がもったいないなぁ。でも電車の中ってなんも集中できないし、周りの人間はみんなクソだし、臭いし、怖いし、

Tree Style Tab + Mac OS X

Firefox3 がリリースされましたね! Mac OS X 版ではテーマが Safari 系になったりして結構変わっています。 (プロトタイプ段階では Proto という名前のテーマでした)

でもってリリース (と、Tree Style Tab の最近の変更?) でちょっと変わったりしているっぽいので Tree Style Tab (縦置き) の見た目をそれに合せる userstyle を更新しました。

http://userstyles.org/styles/4677

2008年 06月 20日

ここ数日ふとんで寝ずに床に寝たりしてる。割とこっちのほうが寝心地が悪いので起きやすい気がする。

freenode のアカウントのメタデータ

何かに使えるかもなー

# 現在ログイン中のアカウントにメタデータ追加
/msg NickServ@fn set property <name> <value>

# nick で指定したユーザのメタデータを取得
/msg NickServ@fn taxonomy <nick>

例えば OpenID の claimed_id を登録させるようにして、IRC ログの自動認証とかかなぁ。

  1. (ユーザ) /msg NickServ@fn set property OpenID http://www.lowreal.net/ しておく
  2. (ユーザ) IRC ログのページで nick を宣言する。
  3. (サーバ) taxonomy で、宣言された nick の OpenID claimed_id を取得する
  4. (サーバ/ユーザ) ユーザをその OpenID の URL 使って認証させる (普通に OpenID Auth)
  5. (サーバ) 認証できれば、そのユーザが現在 JOIN しているチャンネルのログが見れる

こんなことするほど IRC log は重要じゃないけど、ほかになんか面白いことできないかなぁ

2008年 06月 21日

RubyKaigi

1日目から参加します。2日目のサブセッションで net-irc について話をする予定です。ちょっと内容がいまいちなのでブラッシュアップ中。すごい緊張する……

RubyKaigi

2008年 06月 23日

RubyKaigi

みなさん、お疲れさまでした! 特にスタッフの方々は動きまくっていて本当にすごすぎる……

今回初めて RubyKaigi に参加したので、「あーあの人が、あの人かー」というのをふむふむと眺めつつ、チキンなので話せなかったりしたりなど、とても普通の人っぽい楽しみかたをしていました。

いろいろ整理できていないのでちまちま書いていきます。

なんか、あれ、全部嘘だから気を付けたほうがいいと思いますよ

RubyKaigi というか、カンファレンス系のイベントは、帰ってきて、ネットに書かれた感想とかを、行っているからこそわかる空気感を想像しながら読めるのがとてもいいのだよなぁ。そういうのがあると、例え外にでて電車に乗って憂鬱になりながら帰ってきたりしても、よかったなぁと思えるのだ。

2008年 06月 24日

本当に全くの初心者だったとき、僕には時間があり余っていたので、試行錯誤ないし試行錯誤のための試行錯誤を、いくらでもできた。周りにはコンピュータに詳しい人はいなかったから、独学するしかなかったし、掲示板での初心者的な質問は、すると殺される類ものだと思っていたから、質問したこともない。

誰かに教えてもらったことがないから、基本的なことについて、どうやって伝えたらいいか全くわからない。頭のなかでなんとなく考えた言語化するまえのものを抱えながら、実行してみて答えあわせしていただけで、そこには単純に、試行錯誤しかなかった。カリキュラムなんてなかった。言語について纏まった本は殆ど購入したことがない。作りたいものドリブンの学習しかしたことがなくて、(困ったことに) その方法でしか学習できない。

初心者のときに、周りに教えてもらえる人がいなかったというのは、よかったことなのかもしれない。でも遠まわりをしている。そしてゴールは見えない。いまだ安定しない。わるかったのかもしれない。一定までは、誰しも孤独に試行錯誤をせざるを得ないから、下手に誰かがまわりにいないほうが、集中できるのだと思うけれど、どっちがいいかは 一生でどちらかしか経験できない以上、わからない。

検索したらでてきたのでセルフリブログ

環境に求められている能力がないということは、つまり自分が自分でないことなんだよね。で、その差がいまいち釈然としなくて気持ち悪い感じ。じゃあその自分でない自分っていうのは、誰なんですかっていう、よくあり気な問答があるわけで、問答とか言いつつ答えがない罠が待っているわけで、なにこれ、みたいな。

アウトプットしないといけないのに、どうもアウトプットする能力が明らかに足りていなくて、あるいはモチベーションとかも足りていなくて、結局何もアウトプットできない。作れない。

どういう人がすごいかっていうと、なんだかんだでアウトプットが大きくて、それなりにフィードバックが (DIS であれ) ある人なんだよなぁ。そしてそのフィードバックを次に生かすことができるような、なんか、無理だな。

もちろんそのアウトプットは、適切な基礎があってこそで、あるラインを越えるまで、絶対的に孤独な向上作業であるはずだけれど、何か間違ってラインを越えないうちに誰かと何かをやったりするのは、困ったことになる。不安定なものを余計不安定にしてどうするんだ。しっかり基礎をやるべきだ。前も似たようなこと書いたなぁ。

http://lowreal.net/logs/2006/08/05/1

よく、ある程度熟したアーティストが、他のアーティストとコラボレーションして「いい刺激になった」とかいうけど、あれはそのアーティストが既に一つ山を越えていて、ある種完成されている (つまり、完成=安定の状態を崩すための刺激) からであって、その山を越えるまではずっと孤独なんじゃないかって

http://lowreal.net/logs/2006/04/14/1

そういえばコンピュータ関係で、最初にとても悩んだ疑問は「アップロード」の概念だったけど、今も昔もダウンロードの反対としか説明できない。なんでダウンロードが理解できていてアップロードが理解できていなかったのかが今となってはよくわからない。サーバ・クライアントモデルだとクライアントはダウンロードしかできないと思いこんでいたのかもしれない。サーバ・クライアント、みたいなモデルをいつ学んだかはわからない。

「自分」が書いたものは、誰かのコピーをシュレッダーにかけたものをかきあつめた断片みたいなものだから、もとはといえば他人のものなのだ。どれひとつとして、自分自身の言葉なんてものはない。過去の自分がとりあえず纏めあげたものは、頭に残っていて、検索しやすい。所詮過去の自分なんてのは他人で、しかも死んだ人間だから、好きなようにできる。特別な意味なんてないのだ。

サブセッションの自分の発表、みなおしたけど、とりあえず纏めがなくて dnbk した。30分は途中で冷静になって、全く見当外れのことを言っているのではないかと憂鬱になる。動画の記録が残るのは本当にいいなぁ。会場で感じた自分の印象と、客観的に見てみた印象ってのは結構違う……

本当に、あの程度の発表をするのにもなかなかしんどいのに (もちろん言いたいことを伝えるためにはしかたないのだ)、スピーカーをやって、スタッフをやって、普通に働いているなか、金・土・日と動けるのには本当に尊敬しかできない。

うんこ! うんこ!!!!!!

書き捨てているから何でも書けるにすぎない。あらゆる失敗がつまっている。

シュレッダーにかかったものだって、かきあつめて繋ぎあわせればなんかになるんじゃないかと思う。おれは本当のことを書けない。本当のことを知らないし、本当のことだと信じていることもないからだ。一人称がころころ変わるのはパッチワークの証しである。

そして列車は行く - Good Dog Happy Men

いいなー すげー かっこいいなー よくわかんないけど「敬礼返しながらこっそりベロ出した 一番最高の笑顔で」のところがめっちゃいいなー

そういえばつくばから帰ってくるときの片瀬江ノ島行きの電車の中で、なんかこう、不思議な女性がいたのを思いだした。顔を伏せて寝ていたから顔は見えなかったけど

中継されるからそれでいいや、っていうのは、それはそれでいいのだけど、CD あるからライブ行かなくていいやってのと全く同じだと思います。物理的な距離、場の共有っていうのは、すごく重要なんです。ネットばっかりやってる余計感じます。大学の講義のように形式知を効率的に得るための場ではなくて、空気の振動から、何かを感じとる場だと思っています。

眠れないけど、頑張って寝よう……

2008年 06月 23日

Firefox3 + Firebug 1.2.0b3 でハマった

なんかよくわからないんだけど

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
	<head>

		<script type="text/javascript" src="uuu.js"></script>
		<script type="text/javascript" src="test.js"></script>
		<script type="text/javascript" src="foobar.js"></script>
	</head>
	<body>

	</body>
</html>
// uuu.js

typeof(console);

/*
 * typeof(console) を src でよみこんだスクリプトでやるとダメ
 * typeof(window["console"]); もだめ
 *
 */
// test.js
(function() {
	var scripts = document.getElementsByTagName('script');
	var script  = scripts[scripts.length - 1];
	alert(script.src);
})();

こうすると alert で test.js が alert されない。なぜか script.src が undefined になってしまう。Firebug を Disabled にすれば大丈夫。これ困る……

alert(window.__lookupGetter__("console"));

してみると

function () {
    return window.loadFirebugConsole();
}

ってなってる。

console を参照できるかどうか試すコードを書きたいなら

if (
	(
	 typeof(window["__lookupGetter__"]) == "function" &&
	 typeof(window.__lookupGetter__("console")) == "undefined" && typeof(window["console"]) == "undefined"
	) ||
	typeof(window["console"]) == "undefined"
) {
	alert("console is undefined");
}

と書いたほうがいいっぽいなぁ。もちろん Firebug の変更によってまただめになるだろうから、とても adhoc すぎてウンコなんだけど……

はてスタ IRC ストリーム

http://coderepos.org/share/browser/lang/ruby/net-irc/trunk/examples/hatena-star-stream.rb

はてなスターが付き次第 IRC に通知するのをつくりました。

  • ついたURL
  • つけた人
  • 引用コメント (あれば)

が通知されるようになります。

これメモリくいすぎるので書きなおします

外部ファイルハッシュにしてみた。なおったかな

2008年 06月 24日

IRB でのデモを楽にする

.irbrc にかく

require "rubygems"
require "irb/completion"
require "wirble"

Wirble.init
Wirble.colorize


data  = <<EOS.split(/\n/)
require "future"
class Foo
  def omoi(n)
    sleep n
    n
  end
end
f = Foo.new
f.omoi(1)
f.async.omoi(1); nil
r = f.async.omoi(5); nil
r
r = f.async.omoi(3); nil
r
omois = (1..5).map {|i|
  f.async.omoi(i).async.tap { p [:ok, i] }
}; nil
EOS

Readline.completion_proc = proc {|word|
	if word.empty?
		[ data.shift ]
	else
		IRB::InputCompletor::CompletionProc.call(word)
	end
}
Readline.completion_append_character = ""
Readline.completion_case_fold = true

こんな風にすると、行頭で [TAB] をおして [RET] をくりかえすことでシナリオを喋りながら進行でき、かつ結果がリアルタイムに表示され、必要であれば [TAB] を押さずにコードをはさめるのでライブデモに便利です。

といっても、やっぱライブデモはタイプも含めでデモな感じがするのでちょっと寂しい感じになるのは否めないのですが!

~/sketch

~/tmp/test.* を ~/sketch にうつした。殴り書きのコードをいままで ~/tmp/test.rb とかに書いていたんだけど、~/tmp はやっぱ定期的にさっぱり消したいのでわけた。あと補完しやすいように test っていうファイル名をやめてファイルタイプをファイル名にした。

2008年 06月 25日

少なくとも先2年ぐらいの見通しがたってからじゃないと他のことに手を出したりできないとおもうんですよ!

僕の人生初片瀬江ノ島は寝過しですよ。

2008年 06月 26日

mabinogi やりたいなー 木刀で4連したいなー

あーーーー 24時間だと足りないよーー

ちゃんと眠りたい。ほんと寝ないと調子悪くなるからやばい。でもあれもこれも中途半端で眠れない……

あらあなた、関係性に縛られて何も言えなくなることが大人になることだと勘違いしていらっしゃるのね

Test::WWW::Mechanize つかうより mechanize + RSpec のほうが (おれは) 高速で書けるなぁ…… Mechanize のメソッドとか HTTP::Response とかがどうしても覚えられない…… HTTP サーバ介さないぶん早いんだろうけど、最終的には HTTP サーバ経由したテストはするしなぁ……

2008年 06月 28日

サイトごとにパスワード変えたい

どうするのがいいかなー

  • マスターパスワード一個は覚える
  • サイトごとに違うパスワードに
  • 出先や、環境が違っても生成できるように
  • サイト一個だけパスワードを変更したい場合にできるように

単純に location.host + master-pass を JS で SHA1 かけるのがお手軽っぽい。けどそれだとサイト一個だけパスワード変更ができない。

  • マスターパスワードを何個か覚えて、サイトごとに全部試す
    • 割と普通の方法
  • サイトごとに追加の文字列をどっかにもっておく
    • どこに置くか

ふつうにマスターパスワードいくつか覚えるのがよさそう。変にがんばってもしかたない。


あと問題点は

  • SHA1 だと長すぎて登録できないサービスがある
Digest::SHA1.hexdigest("")
#=> "da39a3ee5e6b4b0d3255bfef95601890afd80709"

[Digest::SHA1.digest("")].pack("m")
#=> "2jmj7l5rSw0yVb/vlWAYkK/YBwk=\n"

してできるだけ頑張ったあと先頭いくらかかなぁ……

http://svn.coderepos.org/share/lang/javascript/bookmarklets/passon.bookmarklet.js

CodeRepos に置いてみました。SHA1 (光成さん作) も Base64 (弾さん作) もライブラリつかったので頭つかわないで書けた! スバラシス

CodeRepos においておけば出先のときでもまずどこに置いてあるか忘れないし、svn だから変更がトラッキングしやすいしいいかなぁ的な

いくつかのサイトは既にこれつかって変えてみた。

  • prompt でマスターパスワードを入力するのは表示されてしまうのでまずい。
  • ページ内のパスワード入力フォームをそのまま使うように
  • フォーカスされている input の内容をマスターパスワードとして使い、パスワードをつくって input 要素にもどしてる
  • 文字数制限があってダメなときは、でてきた生成ずみパスワードの prompt に数字で文字数を入れると削って入れなおす

生成済みパスワードは人間が即座に覚えられるようなものじゃないので prompt だしてる。

prompt に出すのも録画環境だったりするとやっぱちょっとアレなので、クリップボードに入れるようにしてみた。

パスワードに制限がかかってるサイトは、そんなに多くはないみたいなので個別にブックマークレットに入れておくことにした。

働かざるもの食うべからずの社会

プログラマなんていらないどころか害じゃないですか。

2008年 06月 29日

単純作業について

単純作業について、そんなに嫌いではなくて、なんでかっていうと、そこには機械化の余地があるからだと思う。どうすれば綺麗に今やっていることを一般化して応用可能な機械にできるかっていうのが思い描けるのは面白い。単純作業したほうが早いことはいくらかあるけど、それは楽しくない。単純作業を単純じゃなくする方法を考えて実行するのが楽しいのだ。単純作業を最適化して仕事をなくしたい。

みんな仕事をしなければならない、っていう洗脳が消えさらない限り、自動化なんて意味がない。

一寸先は餡の雲

「将来が餡の雲」だと響きがイマイチなので似たような言いかえにしました。(もともと将来が不安をリスペクトしたものでしたがイマイチリスペクト感もなかったですね)

自動化して仕事が減った結果、仕事を失くした人は、どこから金を得るんだろう? 仕事を減らしたんだから、何もしなくていい人がたくさんでてくるはずだ。実際今そういう人達ってたくさんいるよね。世間はそういう人達を悪者にするし、本人も「働かなければ生きていけない」と思ってしまう。お金がないと生きていけないし、現状では働くこと以外でそれを手にすることができない。「生きていてもいい」っていうシステムがない。その状態で仕事を減らすってことは、プログラマは人を殺してるんじゃないか?

不思議なことにみんな、お金を持ってない。誰がもってるんだろう?

お金以外の何かを提示していいのはそっちじゃない。バランス・バランス。

2008年 06月 30日

リスクありすぎる気がするよね。でもちょっとやってみたいなと思う。わからんね。結果どうなるか、全然わからんね。

セルフリブログ。なんかやたら「バランス」って使うなーっておもってサイト内検索かけたらひっかかったので読んだりした。なんでこんなこと書こうと思ったんだろうなぁ。わからない。ほんとキモいなー今も昔もキモい。キモイキモイキモイ

自分でその最上級にくだらなくて、つまらなくて、つらい「努力」とやらを望んでやっているのに、「俺はつらい努力をしているから偉い」みたいな考え方をするのはさけたい。意識的/無意識的に関わらず、さけたい。だから時々自分をチェックする必要がある。

http://lowreal.net/blog/2006/12/19/3

人間が生きていることになんて、なんの意味も、価値もない。意味も価値も、見いだしているのは人間/自分そのものだ。だから、「つらい」ことをやっている自分、というのは、自分がそれを望んだからそれをやっているに過ぎないと思う。いくらでも、楽しい方向に考えることはできるはずだ。でもそれは殆どの場合うまくいかない。ちょっと「つらい」ことをしたあとに楽しいことをしたほうが、より楽しいことを知っているからだ。でもって人によって、この「つらい」ことをするのと「楽しい」ことをするのとのバランスが違う。殆どずっと楽しい人もいるし、殆どずっと辛い人もいる。

http://lowreal.net/blog/2006/12/19/3

「辛いふり」をしたり「楽しいふり」をしなければならない。くだらない人間ごっこをしなければならない。みんな楽しいことをしていればいいのにも関わらず、「みんな楽しいこと」をしている状況になるためには、既にみんなが楽しくなければいけない。誰か一人が壊れていると、それが人間ごっこをはじめるせいで周りが巻き込まれる。誰がこのクソマゾゲーを始めたか知らないけど、だいたい今生きている人は巻き込まれてるだけだ。しかも連鎖的に確実に悪化していくので、救いようがなく、そのうち必ず終わってしまう。

http://lowreal.net/blog/2006/12/19/3

そういえば「人間ごっこ」について、この頃と今とではちょっと考えかたが変わっていることに気付いた。2年ぐらいまえ「人間ごっこ」は、生まれたときからやっているものではないと思っていたけど、今は生まれること自体が人間ごっこの始まりだと思ってる。2年前に知っていた、人間ごっこを辞める唯一の方法は、本当に唯一の方法なんだなぁと思う。

いろんなことがとても退屈なことに思えてくる。よくわからない。

再読しない日記に意味はない。それと書き捨てに価値を持たせたいわけじゃない。手が動くように、好きにさせたい。

頭の悪い人の書く文章は一目瞭然すぎてとても憂鬱になる。おれのが全部そうだからだ。

セルフリブログ楽しいなー このキモさがたまらん!!!!!

テンションあがってきたwwww

なんか、ヘタにモテようとしているのはほんと嫌だなー (女の子から、とかに限らず)。もっと心の底から DNBK させるような、グロテクスな感じがいいんじゃないのかなーーー 結局演出してるんだもんなぁ。気付かずうちにってことですか? 結局日記をいくつかに分散させているのもそれなんだろ。エロゲやりたいなー

「あーこの id だと、誰誰さんが読んでるからちょっと自重しよう」みたいな、ね。そういうのがダメなんだよねーーー それがコミュニケーションを円滑にする? ですよねーwww

しかし! おれは! これだけ暗めのことを書いているにも関らず、「しにたい」と書かれたエントリがとてつもなく嫌いなのである!!!! おまえ「しにたい」じゃなくて「にげだしたい」と正確に書けよ!!!! 本当にしにたくないくせに

こうやってぼくは、おれが尊敬するような人物像から、離れていくのだな

とても面白い日記を書く人ほど、プライベートモードとかにせずにそのまま消えていきやがるので、フィードリーダに上ってこなくてそのまま忘れる。

どっかで 1965 の女性ボーカルカバー (コピー?) を拾って mp3 だけ手元にあるんだけど、これいいなー

一週間ぶりにヒゲをそった

今日の環境

こういう写真があると、なんか奇妙な感覚になりませんか。なりませんね。

なんで現実世界の継続はファーストクラスじゃないん?

2008年 06月 29日

re.pl ~/.re.pl/repl.rc

# ~/.re.pl/repl.rc
# vim:set ft=perl:
Devel::REPL::Script->current->_repl->load_plugin($_) for qw/Colors MultiLine::PPI Packages FancyPrompt OutputCache LexEnv/;
Devel::REPL::Script->current->_repl->load_plugin($_) for qw/Completion CompletionDriver::Keywords CompletionDriver::LexEnv/;
Devel::REPL::Script->current->_repl->fancy_prompt(sub {
    my $self = shift;
    sprintf '%03d%s >_<x< ',
        $self->lines_read,
        $self->can('line_depth') ? ':' . $self->line_depth : ''; 
});

なんかでも補完効かないんだよね……

2008年 06月 30日

どこにリンクされているのか、それっぽくわかるようにする

	def title(url)
		uri = URI(url)
		@ua.get(uri)

		text = ""
		case
		when uri.fragment
			fragment =  @ua.page.root.at("//*[@name = '#{uri.fragment}']") || @ua.page.root.at("//*[@id = '#{uri.fragment}']")

			text = fragment.inner_text + fragment.following.text + fragment.parent.following.text
		when uri.to_s =~ %r|^http://h.hatena.ne.jp/[^/]+/\d+|
			text = @ua.page.root.at("#main .entries .entry .list-body div.body").inner_text
		else
			text = @ua.page.root.at("//title").inner_text
		end
		text.gsub!(/\s+/, " ")
		text.strip!
		NKF.nkf("-w", text).split(//)[0..30].join
	rescue Exception => e
		@log.debug ["title:", e.inspect]
		""
	end

はてスタ IRC ストリームつかってて、URL だけだとどこにスターついたのかよくわからないので、こういうのをカマして、リンクされた周辺の文字列をひろっています。結構うまいこといきます。@ua は WWW::Mechanize で @log は Logger です。

ハイクを特別扱いしてるのは、はてスタ IRC ストリームのチャンネルで発言するとハイクに投稿されるようになっているため、ちょっと優遇してる感じです。

.zshrc 再編

.zshrc は単体でどっかのサーバに転送してもいいような感じにして、作業環境では ~/.zsh/mine.zshrc を読むようにした。

でもって作業環境ではないホストに入っているときは prompt 変えるようにした。

下が作業環境で、うえはどっかべつのところ。rprompt にホスト名表示させても全く見ないし、プロンプトの形が同じだととても混乱するので大きく変えた。REMOTE ってついてるのは (リモートの作業環境もあるから変だけど)、単純に強調