2008年 07月 01日

自分のことを知るために他人をミラーとして利用するのは、悪くはないけど、良くもないと思う。自分でやれることはやったらいいのに

ひどい夢をみた。

かなりボロいアパート、鍵がかからないところに、自分は住んでいて、生活をしている。なんか特別なことがある日に、バスでどこかにでかけて、帰ってきたら、自分の部屋がない。部屋がなくて探しまわっていたら、廊下みたいなところに、自分の持ち物の一部があることに気付く。泥棒に入られたようだ。(部屋がなくなる説明がつかないけど)

お金がないから、大抵のものは取り戻せない。もうなにもないなーと思ってダメだこれ、って思ったところで、これがプログラムだって気付く。適当に終了処理をすると元のプロンプトに戻る。好奇心でなんかそういう疑似体験っぽいプログラムを実行していたっぽい。

夢の中の夢の派生っぽい感じ。説明できない。

2008年 07月 03日

iTerm つかう!!!

なんか、すでに理由を忘れたんだけど Terminal.app に辟易したので iTerm つかう。今までなんで iTerm を使っていなかったかっていうと

  • タブうざイ☆ (screen のほうがスクリプタブルなのでいい)
  • Cmd+Num は window 切り替えにしたい
    • window サイズをかえていくつか重ねてつかいたいので

ambi-width がどうとかのパッチはさておき、Cmd+Num をタブきりかえじゃなくて window きりかえにするパッチをかいた

diff --git a/PTYWindow.m b/PTYWindow.m
index ce2676f..8207d01 100644
--- a/PTYWindow.m
+++ b/PTYWindow.m
@@ -109,14 +109,33 @@
 - (void)sendEvent:(NSEvent *)event
 {
 	// NSLog(@"%s: 0x%x", __PRETTY_FUNCTION__, self);
-	
+
 	if([event type] == NSMouseEntered)
-	{		
+	{
         //NSLog(@"window mouse entered");
 		if([[PreferencePanel sharedInstance] focusFollowsMouse])
 			[self makeKeyWindow];
 	}
-	
+	if([event type] == NSKeyDown)
+	{
+		if ([event modifierFlags] & NSCommandKeyMask)
+		{
+			NSString* c = [event charactersIgnoringModifiers];
+			NSArray* windows = [[iTermController sharedInstance] terminals];
+
+			NSLog(@"pressed: Command+%s", c);
+			for (int i = 1, len = [windows count]; i <= len; i++)
+			{
+				if ([c isEqualToString: [NSString stringWithFormat: @"%d", i]])
+				{
+					// [[iTermController sharedInstance] terminalWindows]
+					[[[windows objectAtIndex: i - 1] window] makeKeyAndOrderFront: self];
+					break;
+				}
+			}
+		}
+	}
+
 	if (super) [super sendEvent:event];
 }
 
diff --git a/iTermApplicationDelegate.m b/iTermApplicationDelegate.m
index 648f46a..5bb6f4c 100644
--- a/iTermApplicationDelegate.m
+++ b/iTermApplicationDelegate.m
@@ -558,15 +558,16 @@ static BOOL usingAutoLaunchScript = NO;
 	while ((aTabViewItem = [enumerator nextObject])) {
 		aSession = [aTabViewItem identifier];
         NSMenuItem *aMenuItem;
-		
-        if(i < 10)
-        {
-            aMenuItem  = [[NSMenuItem alloc] initWithTitle: [aSession name] action: @selector(selectSessionAtIndexAction:) keyEquivalent: [NSString stringWithFormat: @"%d", i]];
-            [aMenuItem setTag: i-1];
-			
-            [aMenu addItem: aMenuItem];
-            [aMenuItem release];
-        }
+
+		if(i < 10)
+		{
+		//	aMenuItem  = [[NSMenuItem alloc] initWithTitle: [aSession name] action: @selector(selectSessionAtIndexAction:) keyEquivalent: [NSString stringWithFormat: @"%d", i]];
+			aMenuItem  = [[NSMenuItem alloc] initWithTitle: [aSession name] action: @selector(selectSessionAtIndexAction:) keyEquivalent: @""];
+			[aMenuItem setTag: i-1];
+
+			[aMenu addItem: aMenuItem];
+			[aMenuItem release];
+		}
 		i++;
 	}
 

設定は http://f.hatena.ne.jp/cho45/iTerm/ においてみた。一枚ずつのページをすすめながら設定するとべんりっぽい。ふつうに ~/Library/Preferences/net.sourceforge.iTerm.plist (ソースからコンパイルすると iTerm.plist じゃなくなるっぽい) でもいい気がするけど


あと、そもそも cvs head は Xcode 2.5 + Mac OS X 10.4.11 ではビルドできなくて、 iTermSecurityMgr.{m,h} と Shells.{m,h} を iTerm.framework に追加しないとだめだった。

なんか iTerm の window 順がいつのまにか変わることがあって Cmd+num がズレる……

フルスクリーンにするとズレるみたいだ。フルスクリーンにするなら新しいウィンドウつくろう

「はてなTシャツ欲しい!」プレゼントキャンペーン開始【応募締め切り:7/9】 - はてなダイアリー日記 うけたw

そういえば、はてなダイアリーで告白するには、なぞなぞ認証を使えばいいんだと思う。「僕の好きな人の id が入ります☆……↓」とか書いて入力っていう、おおぅ、なんて黒歴史的な告白方法! 気持ち悪さレベルが10ぐらい上りそうだぜ!

2008年 07月 04日

正しい振舞い(笑

そろそろ殺されそう……

ひだまりスケッチ<a class="okeyword" href="g:subtech:keyword:×">×</a>365

やばいなぁ…… ほんといい。なんかやたら1期に比べてうごくなーっておもった。これだけはリアルタイムで放映見る。なんか、なぁ、ほんといい。ほんといい。余韻に浸っている。いろいろ、書きたいけれど、余白が65535バイトほど足らないので書かない。

log (じぶんいがいのだいたいさくじょしてるのでコンテキストがよめない)

01:25 <@cho45> XUL/Migemo
01:25 <@cho45> いれてみたけどいろいろすげええええ
01:25 <@cho45> Safari みたいなハイライトかっこよす
01:27 < g****> 365
01:30 <@cho45> migemo ためしてたらはじまってあせった > 365
01:30 <@cho45> 何度かためしたんですけど、慣れなくてだめだった > migemo
01:34 < m****> migemoとかいい365をみるんだ
01:34 <@cho45> なんかやたらうごきますね!
01:35 <@cho45> おれにチョコくれ! ゆの! ゆのー!
01:36 <@cho45> ゆのっちまじかわいい
01:36 <@cho45> ゆのっちまじかわいい!
01:36 <@cho45> ゆのっちまじかわいい!!!1
01:37 <@cho45> ほんとうごくなー
01:37 < m****> 来週から富士山です。
01:37 <@cho45> 来週からwww
01:37 <@cho45> no more 富士山

気付いたらはじまってて急いでヘッドフォンつけた。

もっと! もっと! キモく!!!!

2008年 07月 03日

screen と vim の憂鬱

screen でいっぱい window つくって vim 立ち上げまくったりしていると、よく「スワップが残ってるよ、既にどっかで vim ひらいてるよ」と怒られるのです。しかしながら僕は C-z でバックグランドに飛ばしまくるので、どこの window でうごいているのか頑張らないとわかりません。僕は頑張りたくありません。とても困りました。だから僕は、それを解決する方法を考えました。

まずは、pid から、そのプロセスがどこの window で動いているかを知るために、以下のようなことをします。

# .zshrc

# window num -> tty の対応ができるように
tty > /tmp/screen-tty-$WINDOW
# pid2screen
#!/usr/bin/env ruby

require "pathname"

pid = ARGV[0]
tty = `/bin/ps -o tty= -p #{pid}`.strip
win = Pathname.glob("/tmp/screen-tty-*").find {|i| i.read[tty] }
if tty.empty? || !win
	exit 1
else
	puts win.to_s[/\d+$/]
	exit 0
end

これで、pid2screen [pid] すると pid から該当のウィンドウ番号が表示されるようになります。(なければ exit 1)

そして、vim のラッパを書きます。すこし長いのでレポジトリに直接リンクをはりますね。

内容的には

  • swp ファイルがあったら、それを読んで pid を抜きだす
  • その pid で pid2screen する。
  • 結果があるならその window にとばす

という感じです。window に飛ばしてさらにそのファイルをアクティブにしたいところですが、いい方法が浮かびませんでした。悲しいです。でも、とても便利になりました。嬉しいです。

prompt にゆのっちを表示する。(挫折)

いよいよ、ひだまりスケッチ×365がはじまるので、プロンプトを、よりゆのっちにしたいと思い、

 / _ / × <

としたかったのですが、挫折しました。

まず、iTerm に ambiwidth を正常に表示するパッチをあててビルドしました。この時点で基本的にちゃんと表示されるようにはなりました。でも screen で画面を切替えてると幅がずれることがあってダメでした。

最初 iTerm の疑ってデバッグをしていたのですが、どうやらエスケープシーケンスの時点でずれた値がくることがわかりました。どうやら screen のせいみたいでした。なので、screen に cjkwidth を認識するパッチをあててビルドしてみたのですが、これがうまくいきませんでした。壮絶に崩れまくったので諦めました。悲しいです。

Mac で screen をつかいつつ、ambiwidth な文字をちゃんと表示できているという人がいたら、ぜひ教えていただきたいです。

ちなみに結局妥協した結果

 / _ / X <

にしました。Osaka の × は綺麗な × なので、やっぱり × にしたいです。

2008年 07月 04日

git-svn dcommit を自動的に行う

svk で mirror レポジトリに直接コミットするような感じにしたいときがいくらかありますよね。普通に git ci / git svn dcommit をやるんでもいいんですが、これだと git の軽さが損なわれてしまい、とても残念な気持ちになります。なので、git svn dcommit は非同期で裏に回すようにします。


しかし、けっこうこういう、裏にまわして非同期で実行して結果だけみたい場合っていうのはあるので、汎用化しておきます。結果表示はうまくいったかどうかだけわかればいいので、screen のラインに表示させることにしました。

backtick は wait を 0 に設定すれば screen と密着したデーモンみたいに使えるので、そこの中で DRb サーバをたちあげ、随時リクエストを実行していくようにします。(ただし :source で終了してくれたりはしないので、自分で過去の自分を kill するようにしています)

#!/usr/bin/env ruby

require "drb/drb"

DRb.start_service

o = DRbObject.new(nil, "druby://localhost:9999")
o.add_queue(ENV.to_hash, ARGV.join(" "))

こんな感じでリクエストをなげると、実行されて、一行ずつ screen の backtick エリアに表示されます。実際実行されているかどうかは、ps aux | grep AsyncDRb とかやると、wating... とか実行中のコマンドとかが表示されます。


でもって、これを有効にしたうえで、~/.gitconfig に alias を書きます。

[alias]
	ci      = !sh -c 'git commit -av && [ "$(git config --bool svn-remote.svn.autodcommit)" = "true" ] && $HOME/.screen/asyncrun.rb git svn dcommit && echo "dcommit done!"'
	svn-ad  = config svn-remote.svn.autodcommit true
	svn-ado = config svn-remote.svn.autodcommit false

自動的に dcommit したくない場合も十分あるので、svn-remote.svn.autodcommit の設定をみて、実行するかどうか決めています。

あとは普通に git ci とかやれば裏で dcommit が走りながら編集できるのでとても便利です。

2008年 07月 05日

アロエ

レンズの話ばかりのやつはおもしろくない。

発見と演出

普通の日常の中からおもしろいことを「発見」することと、そこらにあるつまらないものをおもしろく見せる「演出」の境界はどこにあるんだろう。写真を撮ってると思う。

ホウレンソウって、言葉を見るだけでとても憂鬱になる。

造花に見えるけどちがいます。「造花」っていう言葉がなぜかすぐに浮かんでこなくて、「造花」っていう概念だけが浮遊して困った。

make -j 2

make するとき常に gcc とかが一個しかうごいてなくて、マルチコア CPU だと 50% までしか使わなくて残念なかんじだなーっておもったら、make するとき -j 2 とか渡すと依存関係中で平行できるところは平行してやってくれるみたいだった。make -j だけだと起動しまくって重すぎなので、コアの数を指定するとよさそう?

2008年 07月 06日

Wassr 用の IRC ゲートウェイ

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

いままで tig.rb を継承して wig.rb を作っていたのですが、割と API に互換性がないのと、「チャンネル」とかに対応させるたりしたいために wig.rb は tig.rb をコピペしながら書きなおしました (ヘタに混在させてカオスにするよりはコピペのほうが健全)

tig.rb からの変更点

  • グループ機能をさくじょ (/join #foo とかは、ワッサーのチャンネルをヲチるようにするため)
  • ワサチャンネルへの対応 (jabber つかってても api 使っててもいけるはず。ただ api のほうは制限つけたりをちゃんとやってないのでそのうちだめなになるかも。今は wassr は api 制限ないので問題ない)
  • いろいろリファクタリング (tig.rb にも書き戻す予定)

ちゃんと説明すると (というか忘れそうなので現状の整理)

  • チャンネル名は、ワサチャンネルの英語名 (id) です。
  • jabber を使わない場合
    • 明示的に join したワサチャンネルだけが通知される ( /join #wassr_request ) とか
    • 現状ではワサチャンネルに参加する API がないので、先に web から参加しておく必要がある
    • 参加していないワサチャンネルでも、更新情報だけは /join するだけで見れる (単純に json feed みてるだけなので)
    • 入れば入るほど API アクセスが増えます
  • jabber を使う場合
    • 明示的にチャンネルに join しなくても、参加しているワサチャンネルのメッセージ自体は送られてくる (サーバメッセージの欄に表示されたりするはず)
    • いくらワサチャンネルに参加してても jabber コネクションは常に一つです
    • jabber 使うのが現状では一番効率的です。

IRC の「チャンネル」とワッサーの「チャンネル」が混ざるので、ワッサーのチャンネルは「ワサチャンネル」と書きなおしました

IM からでも /me fav id が使えるようにした。

  • ユーザごとにカウンタをもつ
  • 発言するたびにカウンタをインクリメント
  • id -> [nick, counter] のハッシュをつくっておく
  • /me fav id をしたときに nick の人の user_timeline をとってきて、counter の示す位置の status の id を取得
  • イイネの API を叩く


問題点

  • user_timeline がキャッシュされてる?っぽいので、ズレることがある。
  • タイミングによってはズレる。
  • とりあえずズレる

リア充大学生が羨ましい。

だめ

土日はずっとニコニコみながらコード書いてた。非常に充実していた。

2008年 07月 07日

今だどうやったら写真がうまくなるのか全くわからない……

日記を書いたけど、だめだったので消した。

2008年 07月 06日

Terminal.app にもどった

iTerm 重すぎてだめだ…… 軽くなるパッチがつくれたらもどろう。。。

2008年 07月 07日

へへへ

バイト先のイベントに参加していて、終電に乗って帰宅しようとおもったら、間違えて逆方向の電車に乗って\(^o^)/ 寝過しを心配していた自分がとてもアホみたいですねwww

バイト先に戻って作業する。いろいろ進んでないのがあるしいい機会だ。

2008年 07月 08日

もっとwww うへへwww 気持ち悪くwww

そういえば昨日気付いたけど、おれはもう青春とかいらないと思った。

ゆの in Ruby

#!ruby -Ku

class X
	attr_reader :a, :b

	def self./(a)
		new(a)
	end

	def self.to_s
		"×365"
	end

	def initialize(a)
		@a = a
	end

	def /(b)
		@b = b
		print self
		self
	end

	def <(o)
		puts " #{o}"
	end

	def to_s
		@a.a + "スケッチ" + b.to_s
	end

	class ::Object
		def _
			X.new("ひだまり")
		end
	end
end



X / _ / X < :来週も見てくださいね!

正式名称になるように一文字足しました

ゆの in Io-language

X := Object clone do (
	/ := method(
		if (self ?called, "スケッチ", "ひだまり") print
		self called := true
		self
	)

	< := method(o,
		"365" print
		o println
	)
)


X / _ / X < "来週も見てくださいね!"

このコードにおいて、 _ は評価されない ( / の引数なのだけど、/ 内では _ を評価していない) ので定義してなくてもいいところがポイントです。?called は、初回呼び出し時の called スロットがないために起こるエラーを回避します (正確な?の効果は「対象オブジェクトが指定メッセージに応答しないならば、メッセージセンドを行わない」かな? つまり ? でわっしょい!)。

文字列リテラルを使わずに call argAt(0) とかもできるはずなんですが、どうもマルチバイトだとダメみたいで諦めてます。

2008年 07月 09日

日記という形をとれなくなったとしても、言葉が続かなくなることはないだろう。

知・人工知能・孤独

知っていうのは、分類していくことだと思う。「分かる」ことは「分ける」ことだと思う。僕等、僕等自身に知があると思っているけれど、もともとは宇宙の中で、誰かによって、分かられた存在なのだろうと思う。分けられると知になる。孤独なのはあたりまえだ。そうでなければ知にはなりえない。

僕等、普段の生活の中で何かを分けている。何かを分断して、孤独にしていく作業をしている。その過程で、何か分けられたものは、なんだろう。

~/ がうちにくい

MacBook だとやたら `/ と typo して悲しいので

expand-to-home-or-insert () {
	if [ "$LBUFFER" = "" -o "$LBUFFER[-1]" = " " ]; then
		LBUFFER+="~/"
	else
		zle self-insert
	fi
}

zle -N expand-to-home-or-insert
bindkey "\\"  expand-to-home-or-insert

というふうにしてみました。先頭とかで \ をうったりすると ~/ に展開されます。どうしても \ を入力したいときは C-v \ すればたぶん入力できます。できないなら

bindkey "^V" quoted-insert

reload

ujihisa さんの .zshrc みて alias reload="exec zsh" があったので真似したのですが、たまに C-z かけた vim が露頭に迷うので

# vim とかが露頭に迷わないように
function reload () {
	local j
	jobs > /tmp/$$-jobs
	j=$(</tmp/$$-jobs)
	if [ "$j" = "" ]; then
		exec zsh
	else
		fg
	fi
}

こうしました。job がのこってるなら「終了しろよ!!!」って感じで fg かかります。

ゆの

タグ「"ゆの in language"」を検索 - はてなブックマーク ひだまりスケッチ×365! わしょしょい

「洗濯機から女の子」ってうまく英訳できないんだよなぁ…… 誰かうまいこと訳してほしい。というか日本語でもうまく略せない。。洗濯機娘 が限界? でもニュアンスが違うんだよなぁ。

一言で表現できたらいいのになぁ。「洗濯機から女の子」を一言で表現できないのが許されるのはオンドゥル語マデダヨネー

2008年 07月 11日

日本語のヘッダ画像も修正中

サイトデザインのデータとか普通に公開できるサイトがあったらいいんのになぁ。ガイドとレイヤー情報だけ先にウェブからみれて、興味があればダウンロードできる、みたいな。ガイドのひきかたとかどうやってんのか謎すぎる。

2008年 07月 10日

ゆの in shell

$ echo '#!/bin/sh\necho "ひだまりスケッチ×365 $(readlink $0)"' > 来週も見てくださいね\! 
$ ln -s 来週も見てくださいね\! X
$ ln -s /bin/cat _
$ PATH=.:/bin
$ chmod +x X| _ |X
ひだまりスケッチ×365 来週も見てくださいね!
$ X / _ / X < 来週も見てくださいね\! 
ひだまりスケッチ×365 来週も見てくださいね!

大事なことなので2度ずつ言いました。(環境壊れます)

2008年 07月 12日

Re: ゆの in Ruby

「おまえのコードつまんねーんだよ!!11」ってゆわれた気がしたのでバリエーションつくってみました><

# *_missing
class Object
	def self.const_missing(n)n end
	def method_missing(n, *a)
		print (n == :<) ? a : ({
			[:_, $!] => "ひだまり",
			[:/, :_] => "スケッチ",
			[:/, :X] => "×365"
		}[[n, a[0]]] || " ")
		n
	end
end


X / _ / X < 来週も見てくださいね!
# 上のと同じのをちょっとゴルフぽく。(むずい)
class X;end
class Object
def method_missing(n,*a)print n==:<?a:({[:_,$!]=>:ひだまり,[:/,:_]=>:スケッチ,[:/,X]=>:×365}[[n,a[0]]]||" ");n end
end

X / _ / X < 来週も見てくださいね!
# ひたすらエラーハンドリング

begin

X / _ / X < 来週も見てくださいね!

rescue NoMethodError => e
	case e.message[/`(.+)'/, 1]
	when "/"
		print "×"
		Object.__send__(:define_method, :/) {|
			x| _ |x
		}
		Object.__send__(:public, :/)
		retry
	when "|"
		print "365 "
		Regexp.__send__(:define_method, :|) {
			(/ _ /x)
		}
		retry
	else
		puts Regexp.last_match[1]
	end
rescue NameError => e
	case e.message
	when /constant X/
		Kernel.const_set(:X, :X)
		print "ひだまり"
		retry
	when /variable or method `_'/
		Kernel.__send__(:define_method, :_) { (/ _ /x) }
		print "スケッチ"
		retry
	end
end

とてもねむい

ゆの in Lua

なんかまだないっぽい

X = setmetatable({ x = "" }, {
	__div = function (o1, o2)
		if o2 then
			X.x = X.x .. "スケッチ"
		else
			X.x = X.x .. "ひだまり"
		end
		return o1
	end,

	__lt  = function (o1, o2)
		print(X.x)
		return X
	end,

	__call = function (self, arg)
		X.x = X.x .. "×365 " .. arg
		return X
	end,
})


return
X / _ / X < X"来週も見てくださいね!"
  • 普通に演算子オーバーロード
  • return つけないと式とみなされなくて syntax error
  • print は改行が入ってしまうので最後に一度だけ
  • 連結演算子が .. であることをすっかり忘れていてハマった
  • 比較演算子はオペランドが両方とも同じ型でないとエラーになってしまうため、ラップしてる
  • X"foo" は X("foo") と同じ、でもって、関数呼びだしはメタテーブルの __call になる。
  • 宣言していない、一度も代入していない変数が普通に nil として使えてしまうので _ に定義はいらない
2008年 07月 13日

今日、起きて、窓あけたら風が結構強くて、それが涼しくて、そのせいで、妙に現実感を失くした感覚になった。草の花の後半で、戦争が起こっているなかの日常みたいなのがあって、それがやたら静かに描写されるけど、ああいうのを、スケールの違いさえあれ、実感した。

位置決めとか、金とか、時間の節約とか、そういった戦争に関わる全てのことに、本当にうんざりしてる。

やっぱ TAMRON の 90mm MACRO が欲しい。買わないけど

紫陽花は終わりかけがいい感じだと思う。

紫陽花って、見るたびに、小学校低学年のときの、旧校舎に咲いていたのを思い出す。小学校のときの記憶って、雨の日のことばっかりだなぁ。校舎の立て直しが丁度在学中にあって、プレハブで授業を受けていたことがあるんだけど、そのときあたりの記憶も全部雨の日だ。

2008年 07月 14日

スルー力が全くない…… 煽られたら\(^o^)/ 状態

写真だけ見たけりゃ flickr でも f.hatena.ne.jp でも /searchdiary?word=*[photo] でもなんでもあるよ。

2008年 07月 13日

ゆの in PHP4

<?php
function x ($buf) {
	return str_replace("X / _ / X <", "ひだまりスケッチ×365", $buf);
}

ob_start("x");
?>

X / _ / X < 来週も見てくださいね!


<?php ob_end_flush(); ?>

僕の PHP の知識は 4 で止まっています。

もっと短かくなるよ!

http://subtech.g.hatena.ne.jp/mayuki/20080713/1215952300

php -v したら 5 でした……

2008年 07月 14日

CMS

なんか washer-in-the-rye.com を管理するにあたって簡単な CMS が欲しいので要件を整理しておく (theruck でつくる)

  • 簡単に編集できて管理できること
  • マルチリンガルであること
  • ERB をテンプレートに
  • HTML 直編集したい (あのページは実は microformats と RDF 埋め込みによる XSLT での RDF への変換をサポートしています)

思いついたこと

  • git 使いたい
    • git push すると本番に反映されるように
  • 別に本番環境で確認できる必要なくね?
    • ruby foobar.rb するとローカルウェブサーバが立ち上がって確認できればいい

自分は十分に助けてもらっているので、ちゃんと自分の足で歩かなくてはならない。

ゆの まとめ用スクリプト

ブクマからキーワードページのテーブルにするやつ

require "rubygems"
require "mechanize"
require "active_support"
require "time"

@ua = WWW::Mechanize.new

puts "|*言語|*リンク|"
begin
	results = []

	uri = "http://b.hatena.ne.jp/cho45/atomfeed?tag=%E3%82%86%E3%81%AE%20in%20language"
	loop do
		begin
			warn uri
			@ua.get uri
			doc = XmlSimple.xml_in(@ua.page.body)
			raise "Bug?" unless doc["entry"]

			results.concat doc["entry"]

			next_link = doc["link"].find {|link| link["rel"] == "next" }
			break unless next_link
			uri = next_link["href"]
		rescue RuntimeError
			sleep 1
			retry
		end
	end

	results.map! {|entry|
		entry.update("lang" => entry["subject"] - ["ゆの", "language", "ゆの in language", "ひだまりスケッチ"])
	}

	results = results.sort_by {|entry| [entry["lang"], entry["issued"]] }.map { |entry|
		warn entry["subject"].inspect
		"|%s|[%s:title]|" % [
			entry["lang"],
			entry["link"].find {|link| link["rel"] == "related" }["href"],
		]
	}

	raise "Bug?" if results.uniq!
rescue RuntimeError
	sleep 1
	retry
end
puts results

なんかちゃんとフィードがとれないことがあるのでチェックかけてリトライしてる。

todo: last.fm のパスワード変更

ゆの

弾さんが煽ったせいか [[ゆの in language]] がやたら盛り上がっててうける。特に Java がドラマチックでめっちゃおもしろい。

git でサイト管理する

とりいそぎ CMS 作るまでにあいだ git push で更新できるようにした

$ cat .git/hooks/post-receive
#!/bin/sh

cd ..
/virtual/lowreal/git/bin/git --git-dir=.git reset --hard

ってやると push したときに Working Copy が hard reset されて更新される。なんか PWD と --git-dir をうまいこと指定しないとダメだった…… (フックスクリプトの実行時の pwd は .git 以下)

常に reset がかかるのでリモートでファイル編集とかしちゃだめ。今まで rsync してたけど --delete が怖くてできなかったのでこれでスッキリ

2008年 07月 15日

今だにはてなダイアリーキーワードの履歴の diff の読みかたがわからない。diff -u の形式か2カラムの対比表示にしてほしい……

瞬殺だった…… http://subtech.g.hatena.ne.jp/cho45/20080716/1216141617

2008年 07月 16日

はてなダイアリーキーワードの diff をみやすくする

キーワードの編集ページの履歴リンクをクリックすると、クリックした履歴の一つ前の履歴との比較を diff して表示します。

JavaScript での diff と format は http://ejohn.org/projects/javascript-diff-algorithm/ のをそのまんま使ってます。ちょー簡単にできた。

alias nopaste

.zshrc に追記した

if [ `uname` = "Darwin" ]; then
	alias nopaste='curl -F file=@- nopaste.com/a >&1 > >(pbcopy) > >(open `cat`) '
	alias nonopaste='pbpaste | nopaste'
else
	alias nopaste='curl -F file=@- nopaste.com/a'
fi

foobar | nopaste とかやると、ブラウザで結果を開きつつ、クリップボードに URL がコピーされて、すぐどっかに貼れるようになる。

2008年 07月 17日

gerry++

海老名で途中下車、掃除中でまじあせる

2008年 07月 19日

gerry++

ガムくいすぎ?

Pure DOM なツリービルダー (べんり版 & 総合的には jQuery よりはやいこともあるよ版)

http://subtech.g.hatena.ne.jp/cho45/20071117/1195309573 の便利版

<div class="entry">
	<h2 class="title">#{title}</h2>
	<div class="body">
		#{body}
	</div>
	<div class="info">
		<span class="datetime">#{datetime}</span>
		<span class="author">#{author}</span>
	</div>
</div>

みたいな文字列が template1 に入ってて

var t = dom(template1, parent, {
	title    : "aaa<aaa>",
	body     : "foobar",
	datetime : "2008-07-19(0日前)T20 : 26 : 54+09 : 00",
	author   : "cho45"
});

ってやると #{foobar} がフィルされます。

ってだけだと別に普通にエスケープしながら置換したらいいじゃんって感じですが、返り値が便利です

t.root     //=> div.entry
t.title    //=> h2.title
t.body     //=> div.body
t.info     //=> div.info
t.datetime //=> span.datetime
t.author   //=> span.author

みたいにクラス名に対応する要素が入ってます (ルートは root に)。

ベンチマーク:

- "jQuery only $"        -> $(template1) しているだけ
- "jQuery pre-replaced"  -> #{} を置換してから $(template1)
- "jQuery"               -> $(template1) してから find/end を駆使してテキスト設定
- "dom()"                -> 上記関数使って一括設定

jQuery の find/end は (中身想像すればあたりまえですが) コスト高いです。でも jQuery 使っていて、先に HTML をばーーーって作ってしまってから、操作したい要素を取得したいケースは結構あって、find を使ってしまいがちです (というかそうしないと綺麗に書けない)

dom() だとパースして要素を追加するのと、欲しい要素の列挙を同時にやっているので、その分有利です。それと Pure DOM なのでテーブル関係のBKなハックを入れなくても parent を直接指定すれば問題ないです。

実体/数値参照を展開してないのでそのコード入れたらもっと遅いかもですね。

2008年 07月 20日

ゆの in Ruby エラーメッセージ

クソ長いです

#!/usr/bin/env ruby -Ku
# vim:set ft=ruby:
# ひだまりスケッチ× というファイル名で保存する必要があります
X = 365


















































































































































































































































































































































t = Time.now
t += 7 * 24 * 60 until t.wday == 4
n = t.strftime("X365次は%m月%d日25時25分からです><")
eval "class #{n} < Exception; end"



alias _ raise
$! = Kernel.const_get(n).new(File.read(__FILE__)[/< (.+!)$/, 1])













X / _ / X < 来週も見てくださいね!

出力はこんな風になります。

ひだまりスケッチ×:365: 来週も見てくださいね! (X365次は07月24日25時25分からです><)

方針としては

  • 365行目で raise させる

ってだけです。

Ruby のエラーメッセージはトップレベルの場合

filename:line: message (ErrroClassName)

になります。トップレベルではない場合は in`methodname` が入ってくるのでダメです。そこで _ を raise の alias にすることで、raise と書かなくても例外をゆのっち内で起こせるようにしました。_ には引数がないので、引数なしの raise となり、直前の例外が raise される効果になります。「直前の例外」は $! に入っており、代入することもできるので、例外を生成して直接 $! へ代入しています。

$! へ代入するクラスの名前が、エラーメッセージの括弧内に入るので、オマケで次週の TBS での放送日を入れることにしました。const_name として valid な名前にするのが結構めんどいうえに綺麗にならないですがこんなもんでしょうか。

短かいバージョン ファイル名も行数も関係なし。上のコードは _ でプログラムを抜けて「来週も見てくださいね!」が評価されないのですが、これだとされます。

#!/usr/bin/env ruby -Ku
# vim:set ft=ruby:

class X < (_ = Exception)
	class << self
		def /(o)
			self
		end

		def <(o)
			raise X, o.to_s
		rescue Exception
			$!.set_backtrace(["ひだまりスケッチ×365"])
			raise
		end
	end

end

class Object
	def method_missing(name, *args)
		name
	end
end

X / _ / X < 来週も見てくださいね!
ひだまりスケッチ×365: 来週も見てくださいね! (X)

あぶねー日記にメモらなかった忘れてた

mixi ニュース経由で日記読んでみたらほんと想像力がない人が多くてびっくりする。おれもああなってしまうのかなぁ……もうなってるのかなぁ……

2008年 07月 21日

約5ヶ月間ほど週に5日ぐらい、1時間半から2時間かけて鎌倉に通うニート生活をしていた。うまいこと書けないので [1年後ぐらいに書く]

頭の中に住んでいる、仮想的な敵、最悪のケースの最悪の人の像、というのがあって、彼は日常の中の些細な言葉や行動を増幅して、その言動の原因の最悪のケースを僕に伝えてくる。悪いことがないことはありえない。程度の問題だ。程度の問題だから、増幅されると困る。

なんかやたらめったら自信のある眼をしている大学生と、どんなことにも興味を示さない大学生と、どっちも本当に嫌だ。やたらめったら自信だけあって結局なんもせん、なんもできん、みたいな人にどれだけ殺されそうになったかわからないし、どんなことにも興味を示さない人に、どれだけの僕のやる気を剥されたかわからない。「考えてる」って言葉にするけど、何を考えているか言葉にできない人は実際は全く考えていない。それはかつての僕そのものだ。考えている、と信じこんでるだけで全く何も考えてない。しかも「自分が考えていないこと」に気付きたくないから余計何も書かなくなる。

2008年 07月 22日

はてダ開いて、「日記書く」ってやると、ちょっと前に書こうとしてやめた内容がバックアップから復元されてきて、継続性を感じる。でもあれ別人だもんなー

2008年 07月 23日

Elastic Layout + min-width に対応していないブラウザは JS で補完 + JS 切ってても最低限見れる、ってのが最近の傾向です。

「論争」と彼がいう「何か」を、わざと相手の感情に訴えかけるようにふっかけて「あらあら感情的になっちゃダメじゃないですか」なんてシレっていうやつが多すぎてホント腹が立つ。

わざと肩ぶつけて「どこみてんだよ」と大して変わらない。議論チンピラ

2008年 07月 25日

アマゾンカート整理

何か3ページ近くになって金額がひどいことになってしまっていたから、そろそろ整理すべきだろって思って整理していくつか買った……

まんが

  • うさぎドロップ1
    • 続き買う
    • たぶんこれ何度も読みたくなる系だなー
  • ルート255
    • なんかおれマンガがうまく頭に入ってこない
  • 我輩は嫁である
    • どこ経由で知ったのか全くわからないけど読むのしんどすぎたw
    • もっかいよみなおす
  • ひだまりスケッチ 1, 2, 3
    • 友達から借りて読んでただけだったので原作買った
    • しばらく会ってなくて3巻がまだ手元にあるけど

まんが以外の本

  • 残像に口紅を 筒井康隆
    • まだ読んでない
  • 女生徒 太宰治・佐内正史
    • ほーって感じだった。更めて読んではいない。
    • オビにエレカシ宮本がいるんだけど……

CD

  • Depth of Layers Upper - The Jetzejohnson
    • よかったので、Downer 他も買う
    • どこで知ったのかわからない

ほかいろいろ。

なんか全部1つずつ買ったつもりだったのに、2つ買ってたやつ (ひだまりスケッチ 1, 2 と女生徒) があって困る…… 返品めんどいなぁ。

うさぎドロップ

いいなー なんか自然と読みなおしてしまった。表情がなー いいなー これはコスパいい作品ですね!!

マルタ・サギーは探偵ですか?6

よんだー 次でおわりか

2008年 07月 26日

だいたいみんな「そんなこともしらないで」コードをかいているのだ。おおかれすくなかれ。

そういえば数日前に町田でかわいい女の子みかけた。でもなんかよくわからんないよなー何がかわいいのかよくわからなかった。眼差し? どうでもいい

どうでもいいわけない!!! また夢に出てきた女の子思い出した(笑) きもい(笑) きもいです(笑)

「それはダメだよー」っつって怒られて社会的に終わる。

頭悪いおれはどうしよもなく学習に時間がかかり他人を待たせるので独りでやるしかない。

なんか知らないけどずっと気持ち悪い。

発見と演出

発見

  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small

演出

  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small
  • :small

七姫物語5

よんだ。カラの一人称がとてもいいなー

ジェッジジョンソンをききながら、作品の消費をしまくっていると、個人的な意味での新時代を感じる。(おおげさ)

2008年 07月 25日

yukkuri

2008年 07月 27日

『残像に口紅を』を読みながら (まだ読みおわってない) 言葉がなくなっていくことを考えてみてたりした。対象まで消えていくのはなんか違和感があるけど、単純に、言葉だけが、表現の手段として失なわれていくと、あと自分は何をつかえますか?みたいな


『残像に口紅を』では、ゲームというか実験として表現が消えていくけど、今この瞬間にも、他人との関係性のせいで表現は失われていっているよなぁ。

2008年 07月 28日

ピクトグラムとかって、「子供でもわかる」とかいわれていて、まぁ確かにそうなのだろうけど、なんか違和感がある。

ピクトグラムとヒストグラムが似すぎてる。

実際そうですもんね。そうでなくても、いないってだけで、なにか問題があるのは、明かなわけです。

2008年 07月 29日

ひさしぶりに体重はかったら 60kg 超えてた。

gerry++

起きてすぐトイレ……しかも頭痛……

うさぎドロップ

4巻まで届いたので読んだよ!!! これほんといい漫画だなぁ……

3ヶ月先の予定も立てられないのだから不安にならないわけないじゃないですか(笑)(笑)(笑)

2008年 07月 30日

キーボードは絶対に拘るべきものの一つだとほんと思う。

せっかくいろいろ遠ざけてみたのに、全く、生きている気がしない! もうこれ一生なおらないんでしょうか

破滅の直前には言及数が増えるものですよ。

数日調子悪いのは風邪なのかなぁ。でも調子悪いの自体は一ヶ月以上前からあってなんかよくわかんないなぁ……

えへへ、こんにちは! 期待はずれの cho45 です☆ミ

gerry++

起きてすぐトイレ…… お腹痛くはない

2008年 07月 31日

パンフォーカスにしたいなら一眼じゃないほうがいいじゃんsk ケータイだとさすがに画質悪いけど、コンデジだったら十分な画質でるよなぁ。

体調回復した気がする。クーラーつけて寝るのはかなりダメだなぁ。昨日・今日があまり暑くなくてよかった。

人のものを盗んで来て自分のものにちゃんと作り直す才能は、そのずるさは、これは私の唯一の特技だ。本当に、このずるさ、いんちきには厭になる。毎日毎日、失敗に失敗を重ねて、あか恥ばかりかいていたら、少しは重厚になるかも知れない。けれども、そのような失敗にさえ、なんとか理窟をこじつけて、上手につくろい、ちゃんとしたような理論を編み出し、苦肉の芝居なんか得々とやりそうだ。
(こんな言葉もどこかの本で読んだことがある)

↑ 前のセクション、最初、blockquote にしてみたけど、はずした。この部分は、転載すると、メタっぽい。女生徒の一節です。

ブログパーツの JS のテンプレ

まだ試行錯誤中

(function blogparts_name ($, Deferred) { with (Deferred) {

var script = (function me (s, l) { l = (l || s.length) - 1; return /XXX/.test(s[l].src) ? s[l] : me(s, l) })(document.getElementsByTagName("script"));
var params = {}; script.src.match(/#(.+)/)[1].replace(/([^,=]+)=([^,=]+)/g, function (_, key, val) { params[key] = val });

// メイン処理

} // end with

function log (m) {
	if (window.console) window.console.log(m);
}

... ユーティリティ関数群

}).apply(this, (function Libraries () {
// ライブラリのコードコピペ

//=begin jQuery {{{
//=end jQuery }}}

//=begin JSDeferred {{{
//=end JSDeferred }}}

return [window.jQuery.noConflict(true), Deferred];
})());