/ 最近 .rdf 追記 設定 本棚

脳log[2010-04-16~]



2010年04月16日 (金) ここまで読んだ。「【コラム】3Dグラフィックス・マニアックス (53) 水面の表現(2)~動的なさざ波 | パソコン | マイコミジャーナル」今や隔世の感があるバーチャファイターや FF7からの道のりを辿れる。

最終更新: 2010-05-01T17:13+0900

[tDiary] Hatenaスタイル

リストをネストしたときだけ生のテキストに<p>タグが付くのがオリジナルのはてなと違うんだそう。ついでに空の<p>タグが生成されるのも気になるけどそれは別。

最初に。<li>はブロック要素もインライン要素も包含可能らしいけど両方を並べて含んでいいのかはわからなかった。読めない(block or inlineの 0以上の繰り返し、だという気はする)。Another HTML-lintが文句を言わなかったのでいいものとしよう。

次に、CodeReposの hatena_style.rbの中を見てみる。Hatena::Blockがなにやら特別な位置を占めてるけど、一応 Hatena::Inlineと同じように振る舞うみたい。ところで、Hatena::Blockはブロック要素の連なり、Hatena::Inlineはインライン要素の連なりを表してるけど、その両方の連なり(<li>の中身とか)を表すクラスがない。

てっとりばやく済ませるために、Hatena::BlockAndorInlineというクラスを用意して Hatena::Blockが行っていた仕事をごっそり移動するそれだけでなく。Hatena::BlockAndorInlineにはインライン要素を含んでいいのかを示すフラグを initializeを通して与え、それにより何が何でも<p>タグで囲むのかそのままにするのかという動作を変えることにした。現状、求められてるのがその違いだけだから。

Hatenaスタイルは使ってないからあからさまなバグがあっても気付かない可能性が大きいです。

suppress_ptag_in_nested_list.patch (7.1KiB, 2010-04-16, r37217との差分)古くなりました。


順序付きリストや定義リストの対応を忘れてる。

<dt>の中はインライン要素の 0以上の繰り返し、<dd>の中はインライン要素とブロック要素の 0以上の繰り返しっぽい。Hatenaスタイルでは定義リストにはインライン要素しか認めていないので対応は必要なし。順序付きリストだけ。

suppress_ptag_in_nested_list.rev2.patch (8.2KiB, 2010-04-16)

svn diffで -x -p (-x <ARG>: diffに渡すオプション, -p: Cの関数名を表示)を初めて付けてみたけど、Rubyスクリプトであってもクラス名は拾ってくれるみたい。


 @2010-04-18 MLに書いた件

次々空いてくる穴をふさぐのはどちらかといえば好きだけど……。

suppress_ptag_in_nested_list.rev3.patch (8.4KiB, 2010-04-18)
r37218に対して。rev2パッチ + (無限ループになっていた例での)段落の分割を防ぐ。
suppress_ptag_in_nested_list.rev3-2.patch (2.9KiB, 2010-04-18)
r37218に対して。(無限ループになっていた例での)段落の分割を防ぐ、だけのパッチ。

 @2010-04-20 「stack level too deep (SystemStackError)」になるらしい。

それはそれとして、

  • Hatena::Block#title_is_dummy?のロジックが反対。(誤:==/正:!=)
  • r37240はリストが必要以上に深くなる。
  • Hatena::Section#bodyは期待通りうごかないかも。(目的がデバッグ出力だったなら OKだけど)

      def body
        @tree.body.to_s
      end

    @treeは以前は Hatena::Blockか Hatena::Inlineだった、俺の変更で Hatena::BlockAndorInlineか Hatena::Inlineになった。カスタマイズされた to_sメソッドを持っているのは Hatena::Blockだけ。

  • 空のサブタイトルでエラー。Hatena::Block#initializeでの配慮が足りなかった。

肝心の深すぎる再帰は再現できない。自分自身を子要素に持ってるなんてことはないはずだから convertメソッドが自分自身を呼び出すしかない。その可能性があったのは Hatena::Block#convertのみ。そのときは if @body == selfでチェックして @body(Hatena::Block).convertを回避していたし、今は @bodyに Hatena::Inlineか Hatena::BlockAndorInlineしか入っていないから自分自身を呼ぶことは考えられない。わからん。キャッシュのせいだったら拍子抜けだなあ。<<<以前は @bodyに Hatena::Blockが入っていたんだから、古いデータと新しいコードの組み合わせで無限再帰は十分ありうる話。.parserキャッシュにはクラス名やインスタンス変数も入ってるし。

 とりあえず
  • fix_c37239.patch (623B, c37239の修正)

    サブタイトルの有無の判断が間違って反対になっていた。

    サブタイトルのみのときにエラーになっていた。

  • fix_c37240.patch (955B, c37240の修正)

    順序付き、順序なしリストの階層が勝手に深くなっていた。

    セクションの分割に失敗していた。


 「<p>はなくなったが空行が……」

たぶん HTMLソースレベルの空行なんだと思う。Hatena::BlockAndorInline#convertでインライン要素の後だけは改行を付加しないようにすればなくせるが、<p>の有無と違って(white-space:preとかしない限り)見た目に関与しないのでこだわらない。(<p>の後ろと</p>の前にも改行が挿入される、だとか考え始めるときりがない)

スレ主は hatena_style.rbを使うことにこだわってはいないという。こちらは楽しんでやってるんだけど、いつまでもデバッグに付き合ってもらうわけにもいかないだろう。はてなはウクレレ記法ができてこそのはてなだと思ってるので、それができない hatena_style.rbから乗り換えるのも悪くないと思う。

「ウクレレ記法」で検索したら主犯が見つかった。最初は Hikiに実装したって書いてるよ。(始めて一か月ほどだったとも書かれていて)つくづくプログラミングは何に使うかが大事だと思う。(英語なんかと一緒でツール)


 @2010-04-25

http://coderepos.org/share/ に書かれている通りにメールを送ってみたが音沙汰がない。スパム判定されたか。comitterってそのページに書かれてるので全てだよね。行動力のある人間なら(というか人並みの人でも) Twitterなり IRCなり blogなりでアクションを起こすんだろうが……。(だから手続きが自動化されてなさそうなのが嫌だったんだ。漏れるし遅れるし。それにサービス自体個人の奉仕に依存してる)

気になる。自分のバグも他人のバグも気になる。


 @2010-05-01: c37240のバグは c37332で本人の手によって修正されたみたい。

Hatena::Section#initializeの部分の修正は、既に行頭の *で分割された文字列が与えられるから問題ないとして先のファイル(fix_c37240.patch)に含めてなかったけど、まあ subが gsubになったって減るもんじゃなし。

それだけでなく 実は一行だけ buffer = '' を buffer = lines.shiftに書き換えた。これがないと無限ループに陥るケース(「>>>」という本文。3文字目は他の文字でもいい)があるみたいなので。


2010年04月15日 (木) 「新快速 ○○行き HH:MM △分遅延」結局何時に着くのだろう? 5分後の HH:MMなのか 5+△分後なのか。電光掲示で知りたい(またそれだけのスペースしかない)のは次の電車がいつ来るかなので遅延も織りこみ済みだろうと思いかけたが、すぐに、正確さが売りの日本の電車のこと、あれはいつ着くはずであったのかを示す時刻だろうと考え直した。(その通りだった。それに発着時刻は電車のIDでもあるし(あっち行き/こっち行きだけで済む駅ばかりではないだろう))

最終更新: 2010-05-07T12:01+0900

[tDiary] 非同期ファイルアップロード

設定画面に jQueryが仕込まれたのと、JavaScriptの置き場所が用意されたので、ファイルのアップロードを非同期に行う準備が整ったのではないか。独自のサブミットボタンを編集画面に貼り付けるプラグインが全部非同期になれば、プレビュー画面にアップロードフォームを表示しても(編集中の本文が消えたと)怒られないだろう。

ジャンクだけど Firefox3.6と Internet Explorer8と Google Chrome4.1で動くものをこの日記(最新じゃないので jQuery対応ではない)に仕込んでみた。

  1. アップロードフォームの targetをこっそり作成した iframeにすることで編集画面が遷移するのを防ぐ。
  2. iframe.{onload|onreadystatechange}をつかまえて、レスポンス(新しい編集画面)から目当ての要素(アップロード済みのファイル一覧とか)を取り出す。(iframe.{contentDocument|contentWindow.document}.getElementById("image_file_list"))
  3. replaceChildは問題が起きるかも?と思ったので .innerHTML = .innerHTMLでざっくりページの一部を更新。
  4. ファイル一覧の数が 0個と 1個を行き来するときは画面が痙攣したようになるのでアニメーションにできると良さげ。

これで本文を書きながらプレビューもできるしファイルのアップロードもできる。


クリップボードアクセスのために Flashを使うよりはましだけど、<iframe>に頼らなければいけないというのもわりと屈辱的。<frameset><frame>以上に、これまで存在を認めてこなかったのに。


何となくできないものと思っていたけど <iframe>の中から外のドキュメントにアクセスすることができるみたい。それができたら編集画面が無制限に入れ子になる(編集画面の<iframe>の中の編集画面の<iframe>の中の……)ことを今より簡単に防止できて、スクリプトももうちょっと使いやすく書き換えられる。


 Firefoxが(3.6になっても)テキストエリアのスクロール位置をリセットしてしまう件。

Karetta|[JavaScript] Firefoxでtextareaのカーソル位置に文字列を挿入した後にスクロールが先頭に戻ってしまう問題(karetta.jp)」で紹介されている通りで直った。といってもできるだけ余計なことをしないように条件を付けたが。

var scrollTop = textarea.scrollTop;
/*
  ここで、テキストエリアに文字列を挿入する。
*/
if(0 == textarea.scrollTop && 0 < scrollTop) {
  // スクロール位置がリセットされていたので復元する。
  textarea.scrollTop = scrollTop;
}

ところで、Internet Explorer 8だけはテキストエリアのキャレット位置を保存しようなんてことを考えなかったみたいで、いったんテキストエリアがフォーカスを失うとキャレットが必ず末尾に移動する。スクロール位置がどうこうどころではないわな。


 @2010-05-07

「何となくできないものと思っていたけど <iframe>の中から外のドキュメントにアクセスすること」 < HTML5 sanbbox属性


2010年04月14日 (水) はてブのトップが二週間ぶりに更新された。


2010年04月13日 (火) TouchSmart tx2の後継がでないから X201 Tabletが最有力。でも¥200kもするなら Office with PPTぐらい付いていて欲しい。### ノートパソコンによく付いてる指紋認証機能がうらやましい。なんでも、ログインとかパスワード入力の手間を省けるとか。デスクトップPCだとキーボードに付いてると使いやすいと思うんだけど。### あった。Microsoftや IBM、Lenovoから、早くは 5年以上前に発売されてた。ただ、「Majestouchには付いていない」と言わなければいけないのがキーボードとセットにしたことに伴う難しさ。


2010年04月11日 (日)

最終更新: 2010-04-13T09:43+0900

[Vista] 続・やっぱりありました。Vistaで Aero Snap

二つ目は AquaSnap。 Aero Snapや Aero Shakeを模倣するだけでなく拡張もし、カスタマイズもできる。スキン機能やフェードインしてくるアバウトダイアログに象徴されるように見た目にもこだわってる。でも Windowsキーと矢印キーを組み合わせたグローバルホットキーには対応してなさそう。下フレームのダブルクリックによる高さの最大化とグローバルホットキーの二つが加わるとありがたさが三倍に増すんだけど。


2010年04月10日 (土) 短縮URLを使うIMスパムでワームに感染 - ITmedia News」この間抜けな URL短縮サービスはなんというドメインを使っていたんでしょ。スパム指定するのに必要なんだけど。


2010年04月08日 (木) [リーンベル] サリヴァンとょぅι゙ょも倒して一周目(NORMAL)クリア。(ミニスカサンタ衣装がどうしても手に入らないのが納得いかない。トナカイばっかりの三人組て……)


2010年04月07日 (水) baiduspiderはヘッダに置いた <meta name="robots" content="noindex,nofollow" />を理解できないようだ。HTTPレスポンスこそ text/htmlとはいえスラッシュがあるせいだとは言わせない。「Baidu.jpのクローラーはロボット排除基準を遵守しています。ウェブサイトの運営者はrobots.txt を設置するか、サイトページ中HTMLファイル内に<META>タグを記述することで、Baidu.jpのクローラーがウェブサイトの一部もしくは全部へアクセスすることを禁止できます。」 嘘ばっかり。


2010年04月05日 (月) とうとう Refererスパムも来始めた。コメントスパムの方も、NGワードが設定されていることを察知するのか vigraとか ciallisだとか微妙にキーワードを変えてきている。こういう段階的対応が自動化されてたらこっちはたまったもんじゃないよ。

最終更新: 2013-08-20T01:04+0900

[Ruby] 「少なくとも優秀ではない」ことを否定する(≠優秀である)。

makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (1/2) - ITmedia エンタープライズ」経由で「人生を書き換える者すらいた。: 人材獲得作戦・4 試験問題ほか

粘菌でも迷路問題を解けるというのだから負けてはいられない。Rubyで一時間半弱かかった。

#! ruby
# coding: Shift_JIS

# 迷路データ

maze = <<MAZE
**************************
*S* *                    *
* * *  *  *************  *
* *   *    ************  *
*    *                   *
************** ***********
*                        *
** ***********************
*      *              G  *
*  *      *********** *  *
*    *        ******* *  *
*       *                *
**************************
MAZE

# マップ

class Point
	def initialize(x, y)
		@x, @y = x, y
	end
	attr_reader :x, :y

	def ==(other)
		@x == other.x && @y == other.y
	end
	def to_s
		"(#{@x},#{@y})"
	end

	def left
		Point.new(@x-1, @y)
	end
	def right
		Point.new(@x+1, @y)
	end
	def up
		Point.new(@x, @y-1)
	end
	def down
		Point.new(@x, @y+1)
	end
end

class Map
	def initialize(maze)
		lines = maze.strip.split(/\r\n?|\n/)
		@height = lines.length
		@width = lines.first.length
		y = -1
		@map = lines.map{|line| y += 1
			x = -1
			line.split(//).map{|ch| x += 1
				if(ch == 'G')
					@goal = Point.new(x, y)
					nil
				elsif(ch == 'S')
					@start = Point.new(x, y)
					nil
				elsif(ch == '*')
					-1
				else
					nil
				end
			}
		}
	end
	attr_reader :height, :width
	attr_reader :start, :goal

	def []=(point, value)
		@map[point.y][point.x] = value
	end
	def [](point)
		@map[point.y][point.x]
	end
	def up(point)
		return -1 if point.y-1 < 0
		return @map[point.y-1][point.x]
	end
	def down(point)
		return -1 if self.height <= point.y+1
		return @map[point.y+1][point.x]
	end
	def left(point)
		return -1 if point.x-1 < 0
		return @map[point.y][point.x-1]
	end
	def right(point)
		return -1 if self.width <= point.x+1
		return @map[point.y][point.x+1]
	end
end

map = Map.new(maze)
#puts "width×height = #{map.width}×#{map.height}"
#puts "start:#{map.start} / goal:#{map.goal}"

map[map.goal] = 0;
#puts "goal=#{map[map.goal]}"

# 先端

nodes = [map.goal]
while node = nodes.shift
	next if node == map.start
	[node.left, node.right, node.up, node.down].each{|nxt|
		case(map[nxt])
		when -1
			# 壁
		when nil
			# 未踏
			map[nxt] = map[node] + 1
			nodes.push(nxt)
		else
			# 既に到達したルートがある
			if(map[node] + 1 < map[nxt])
				map[nxt] = map[node] + 1
				nodes.push(nxt) unless nodes.include?(nxt)
			end
		end
	}
end

# Map to result

map.height.times{|y|
	map.width.times{|x|
		point = map[Point.new(x,y)]
		print point == -1 ? '***' : ("% 3d"%point)
	}
	puts
} if false

result = maze.strip.split(/\r\n?|\n/)

node = map.start
until node == map.goal
	[node.left, node.right, node.up, node.down].each{|nxt|
		if(map[nxt] == map[node] - 1)
			node = nxt
			result[nxt.y][nxt.x] = '$'
			break
		end
	}
end

puts result.join("\n")

ノードっていうのはひとマスのこと。「先端」っていうコメントが適当すぎる(植物では頂端分裂組織っていうらしい)。方針はゴールからスタートに向けて、一マス移動するごとに一ポイントを加算しながら全方位に触手を伸ばしていき、すでに他の触手が通過した道は、自分が最適な場合にのみ侵入するこの判断は不要。全ての触手が行き場を失うかスタートに到達するかしたら終了。スタートから一ずつ減っていく数字をたどると(一少ない数をもつ隣接マスが二つ以上あっても解答に求められていないので無視する)ゴールへ着き、それが最短経路(だったらいいな)。

最初は粘菌方式をまねようと思ったが、通路をすべて覆った状態からスタートして、スタートとゴールにつながっていない島を切り捨て、袋小路から撤退するのはいい。遠回りと近道を取捨選択するためにどういう評価をすればいいのかを決められなかった。どうすればいいの?粘菌は何を考えてる?例えば


二番目のリンク先のトラックバックを見てる。みんな優秀なのね、C++で一時間もかかってないし。何人かが言及している「BFS」。それって一般的知識? 幅優先探索(Breadth-First Search)か最良優先探索(Best-First Search)の略だということはわかった。


壁のもつポイントを -1 に設定したことで、壁に侵入しないことを保証する when節を省略してもよかったんじゃないだろうか。気付くのが遅れたが。


ゴールにも $ って書き込んでら。(スタートには書きこまんように気をつけたんだが)


粘菌すごい。

培地に、三個以上の餌を置く。粘菌は迷路の実験のように最短距離を結ぶか?

結果は違った。

粘菌は、丸く、複数の経路を持つ管を作った。「最短経路だと一カ所故障したら必ず孤立する場所が出ます。だから粘菌は、一カ所が故障しても全体はつながり、なおかつ距離がなるべく短い経路を作ったのです」

部分部分がどういう反応をするとそういう結果になるんだろ???


 @2013-08-19 こういうことらしいです。わかりません。

粘菌の行動原理は、量子ドット間の近接場光を介したエネルギー移動プロセスに類似している

この判断は不要 @2010-04-11 不要だったらしい。ノードリストが FIFO(=push/shiftを使う=幅優先)なら起こりえないみたい。

例えば 粘菌が電気を好む抵抗(集まると抵抗が下がる)だとしてスタートとゴールに電圧をかけるイメージ?

本日のツッコミ(全2件) ツッコミを入れる

BorsJoigreeBS GE VC KX LJ UZ ZY RW MS IS ML JE AL FWUN BR EJ AV DD XQ..

ds14050解析班はどこだ?


2010年04月04日 (日) 「健全な先入観」からの連想 > "When you hear hoofbeats think horse not zebra." Wikipediaの同じページにこうも書かれてるのは要注意 > "Three master diagnosticians have noted, however, that cautions against making surprising diagnoses (e.g. of a rare disease) are not valid in practitioners with greater knowledge and experience:"

最終更新: 2010-04-04T06:25+0900

[無題]

 麻枝准dis - 感想考察批評日常

そんなあなたに、とある科学の超電磁砲の 4巻はいかがでしょう。俺はこの巻を読んで、作者は冗談では済ませられない、のっぴきならない一歩を踏み出したと感じた。まだ失望してもムカついてもいないが、危ういものを感じながら 5巻を待っている。


2010年04月03日 (土) 焼きなまし法。どこかの日記に知ってて当然とばかりにさらりと登場したときに慌てて検索して(一読して)ブックマークしたけど……使う機会がないよね。


2010年04月02日 (金) 西川善司の3Dゲームファンのための「End of Eternity(エンド オブ エタニティ)」グラフィックス講座(前編)- GAME Watch」「後編」こういうのを読むとゲーム制作者を本当に尊敬する。


2010年04月01日 (木) 3年前に買った本をまた買ってしまった。なんか知ってるエピソードが多いなと思いながらも最後まで読んでるし。素直に 2にしとけばよかった。

最終更新: 2010-04-17T12:02+0900

[無題]

 比例計算

 「全長200kmの道路があります。
 最初の100kmを時速50kmで、
 次の100kmを時速100kmで走りました。
 200kmの道路全体では時速何キロで走りましたか?」

 に非常によく似た問題があった。

 「(100km/h + 50km/h) ÷ 2 で 75km/h!!」

 とお客さまに答えそうになる馬鹿が出た…。
 (省略)

悲しいことに全然笑えない。100km(50km/hで走った距離)と 100km(100km/hで走った距離)を見比べて 1:1だから、足して 2で割って平均を出せばいいやと考えるのは仕方がないというか、頭の中で方程式は解けないからと目の前の数字に飛びついちゃったんだよね。(上の問題はただのたとえらしいけど)算数の問題って火曜サスペンスと同じで与えられる判断材料(数字)に過不足がないことが当たり前になってるから、それに慣れてると考えずに反射的に数字をこねくって答えを出してしまいがち例えばというのもありそう。

(馬鹿ですが)気を取り直して、この場合は走行距離でなく走行時間の比率を基にすれば暗算できたんだろうか。

「全長200kmの道路があります。
  200kmを走り終わったとき、
  2/3の時間を時速50kmで、
  1/3の時間を時速100kmで走っていました。
  道路全体では時速何キロで走りましたか?」

  50 × 2/3 + 100 × 1/3 = 66 (km/h)

ブコメを見た。水溶液濃度の話も出てた。そして最も簡単な考え方は「200km ÷ 3h = 66km/h」だった。ああなんて遠回り。

「調和平均だっけ」とも書かれていた。調和平均の定義を調べて計算したら「2×100×50÷(100+50)」なぜだか(自分の頭ではマジカル)答えが出た。でもこれだと走行距離が 95kmと 105kmだったときにどうすればいいかわからなくなりそう。

例えば 「100gの水に 5gの NaClを溶かしてできる食塩水の質量パーセント濃度は?」という問いに 5%と答えてしまうおバカな中学一年生でした。<<こねくってさえいなかった!