/ 最近 .rdf 追記 設定 本棚

脳log[2011-04-12~]



2011年04月12日 (火) Firefox4の、保存期間の設定がなくなった閲覧履歴(20110327)。places.sqliteが固定サイズになったとのことで、趨勢を考えればまあ十分なサイズがあるとは期待できないな。履歴を長いこと残してると訪問済みリンクというのが役に立つ。(一週間なり三か月なり記憶も新しい)一定の期間に訪れたことがある、というのではない、これまでに訪れたことがあるかどうかということを自分の記憶力を超えて知らせてくれるようになる。「と思いながらそのサイトをうろうろしていたら、未訪問のはずのリンクが何カ所も閲覧済みの色になっていることに気付いた」ということが実際にあった。異なるルートから二度も行き着いた、という発見がブックマークボタンに手を伸ばさしめたのだ。不意に再訪問の必要に迫られて、漠然とした記憶から履歴を検索することが何度かあったが、保存期間が仮に一週間では見つかる可能性は薄いし、あるとわかってなければ手を尽くして探しだそうという気も起こらない。実のところ五年という履歴の保存期間は一年、三年と延長してきた結果の数字だ。全て保存されているという確信が本質的に重要。


2011年04月11日 (月)

最終更新: 2011-04-16T21:35+0900

[Ruby] 「HsbtDiary(2011-04-11) rubygems の taint と LOAD_PATH と $SAFE について

前にこうならんかな?って書いたのをもう一度。

require 'hoge'

したときに hoge.rbなり hoge.soなりが taintedな $LOAD_PATH要素に基づいて発見されたときは SecurityError。見つからなければ taintedな要素はスルー。という動作を Rubyに期待したい。今は taintedな $LOAD_PATH要素を無造作に File.expand_pathして SecurityErrorが起こるに任せているんではなかったか。


 @2011-04-16 Ruby 1.9.2p136と 1.8.7p330で挙動が違うのが SecurityErrorへの疑問を増す。

1.9.2では(確かめたわけではないけど)汚染されたパスの展開がセキュリティエラーにつながってるから、汚染されたパスが $LOAD_PATHの末尾にあった場合は $SAFE=1の状況下で require 'cgi'が成功する。require '存在しないファイル'はセキュリティエラー。汚染されたパスを基に展開を試行したかどうかが分かれ目。

1.8.7では $SAFE=1の状況下で汚染された文字列を引数にした File.expand_pathは 1.9.2と違い成功するものの、上のような場合でも require 'cgi'に失敗する。これは requireが内部的に File.expand_pathを呼び出し――これは 1.9.2とは違いセキュリティエラーを起こさないけれど 1.9.2同様汚染された文字列を返す――、その汚染された戻り値を使った require_internal(仮名)が 1.9.2とは違い $SAFE=1のときにセキュリティエラーを起こしてるのだと思う。挙動からの推測。

一貫性が欲しかったね。できれば実用的なものが。特定のディレクトリ(汚染された$LOAD_PATH要素)に特定の .rb, .soファイル(requireされたファイル)があるかないか判った(SecurityError or not)ところでどうだというの。


2011年04月07日 (木) この日記に書くコード片や各所へのパッチに対するスタンス。>NYSL Version 0.9982。面倒くさい義務や管理はナシ。プログラムやソースコードは自由で、個人や組織に独占されるのは面白くない(冒頭の copyrightは必要悪だと思うようになった。ソースに入り込んだ手垢のごとき名前付きコメントは見るのも書くのも嫌(でも名前だけに消しづらい)。ライセンスだって自由を担保するための必要悪だ)。という考えが自分の根底にある。まして、自分が書くのは独立したアプリケーションでなく欠片だけだから、何をか主張できようというもの。


2011年04月06日 (水) zenback を入れてみた」一点にだけ注目していた。期待は裏切られなかった。コメントの後に ZENBACKが表示されるのがイイ。そうでないと、読もうと思ったコメントが遅延ロードされた ZENBACKに押しやられて逃げていってしまうから。追記@2011-04-07:「zenbackをツッコミ欄の後ろに表示させた一件 - kayakaya日記(2011-03-28)」 突如わいてきた(ように見えた)要望の目的は最初からそこにあったのね。スクリプトを埋め込むのに tDiary本体の修正が本当に必要?って思って、danなにがしさんの(コメントが逃げる)ブログを Firebugで覗いてみたりしてたのよ。この後者のエントリを発見したのが、前のエントリの関連リンク(powered by zenback)だってんだから有用性は疑いえないな。

最終更新: 2011-04-14T01:54+0900

[SakuraEditor] BugReport/70 - SakuraEditorWiki

まったく、CViewCommander::Command_REPLACE_ALL ってのは人類の理解の範囲を超えている。

  • 通常選択範囲を置換
  • 矩形選択範囲を置換
  • ファイル全体を置換
  • 対象範囲を行単位で置換
  • 対象範囲をひとつのマッチごとに置換
  • 正規表現ライブラリを使って置換
  • クリップボードのテキストに置換
  • クリップボードの矩形テキストに置換
  • 置換ではなく前に挿入する
  • 置換ではなく後ろに挿入する

これ、あえて異なる複数の分類を一括りのリストにしてるけど、実際のコードがそうなのだ。こんな処理が一つの関数の中に、変数を共有しながら―しかも型を偽って本来とは違う使い方が特定の処理ルートではなされていたりする―、一部の処理を共有しながら、インターリーブされてる。

BugReport70.patch (1.7KiB, 2011-04-07 02:50)

submit(<commit以前)はしない。怖すぎる。


「「すべて置換」は置換の繰返し」フラグが ONのときの対策がまだ。

コミットログも読まずに軽率な修正。>BugReport70.rev2.patch (2.7KiB, 2007-04-07 06:50)

これから読む。>「SourceForge.net Repository - [sakura-editor] Revision 1049」, 「SourceForge.net: Sakura Editor: Detail: 1636751 - 行置換のオプション化&問題修正

うむ。削除したコードがなぜあえて論理座標だったのかわからない。


 @2011-04-11 「// 行単位で置換するので colDifは常に 0。」

って書いて削除したコードがパッチにあるけど、一つの行が複数のレイアウト行に分割されてることがある。一行処理して次の行……と思ったらまだ折り返された同じ行にいた、とか。前にも別件で書いてるけど、折り返しと矩形選択(+文字一括挿入/+置換)は本当にひどい組み合わせ。結果を予測できるものにするためには選択範囲の末尾の行から処理をしないといけない。そうすると文字の削除や挿入による折り返し位置の変化が後の処理に影響を与えないので。でもそうはなってない。だから、結果を維持する労力を割く必要もない「未定義」の動作だと考えてしまう。


2011年04月05日 (火) Firefox4. なくなったステータスバーの代わりにリンク先を表示する左下の領域。ウィンドウに対してスペースが余ってるのにほとんど全ての URLで真ん中が省略されてしまって使えない。なんで左半分しか使わない。飾りじゃないんだよ。


2011年04月04日 (月) ショートボブの女の子って可愛いよな しまぱん」。保存したくなる画像が一枚もなくて新発見。ショートボブはそれだけで*ナシ*だということがわかった。たぶんこういった偏見に基づいてる。アクティブで自分を主張する空気を読まない。男友達のような気安さがないのはもちろん、女性に対して期待してしまう要素もない。手に負えない存在。/// 性格診断「ISTJ型:やらなければならないことはする」 たしかに義務感で動いてるし、こうと決めたこと決まったことに従うのが好きだ(納得できる理由がある限り)。ただ、スペックが低いので「おかれた立場によっては社交的に振舞う」ことはできないし、「級長やプロジェクトの責任者や地域社会のリーダーに祭り上げられること」もない。荷が重すぎる。質問の「この世には論理的なもの、科学的なものでは割り切れない物事があると信じている。」にはメタ質問の前振りなのかと勘ぐるほど違和感を覚えた。もので割り切れるものって何?すいかと棍棒?


2011年04月02日 (土) MSI Global – Mainboard - 790FX-GD70」使用中の PCの M/Bのページ。サイトのリニューアルでドライバなんかの更新が見つけにくくなった。でも深刻なのはそれよりも前。画像のギャラリーと拡大機能が jQueryを使ったスクリプトとともに埋め込まれたこと。画像以外のメインコンテンツが下に押しやられたり、PageDown, PageUp, Home, Endといったページナビゲーションキーを乗っ取られるのは不便の一言で済むが、←, →, Home, Endキーを押し続けると簡単にブラウザ(Fx3.6, Fx4)が DoS状態になる。Logicoolのマウスユーティリティ SetPointの機能 UniversalScrollを使ってると一層効果的に Firefoxをハングさせられる。リークしてるのかメモリの使用量も増加の一途。これはブラクラだよ。とっととギャラリーのキーボードインターフェイスを捨てたほうがいい。それが原因だし、どうせ不便を生んでただけなので。結局、作成者側が誰も使ってないからこの Webページとしての致命的な欠陥に気付かないんでしょ。


2011年04月01日 (金) 々。以前はできなかった気がしたが、今の ATOKだと「おどりじ」で変換できる。小学校の漢字ドリルにそう出てたからね。実際は小さい文字の入力に使う Lや Xと同じで、きぎ、ひび、ひとびと、ささき、たた、みたいに語の一部として変換するので使わないけど。


2011年03月30日 (水) Project Euler Problem 85。1999998だと思ったが incorrectだと蹴られる。9が並んでるので慎重に桁を数えたが、そういうミスではなかった。もう解らない。

最終更新: 2011-08-20T02:12+0900

[ProjectEuler] Problem 85

 Problem 85

incorrect

Target = 2_000_000
Size = Math.sqrt(Target*2).floor+1
a = (1..Size).map{|i| i*(i+1)/2 }
answer = 0
until a.empty?
	jv = a.last
	answer = [a.map{|iv| iv*jv }.min_by{|v| (v-Target).abs }, answer].min_by{|v| (v-Target).abs }
	a.pop
end
p answer

 @2011-04-14

まったく恥ずかしい。答えが合わないとなって当然問題を読み直してはいたんだけど、日を置いて改めて読んでみたら問題が何を求めてるのかが見えてきた。"nearest solution" ではなく "area" だったとさ。

Target = 2_000_000
Size = Math.sqrt(Target*2).floor+1
a = (1..Size).to_a
answer = [0,0]
until a.empty?
	j = a.last
	answer = ([answer] + a.map{|i| [i,j] }).min_by{|i,j| (i*(i+1)/2*j*(j+1)/2 - Target).abs }
	a.pop
end
puts "#{answer[0]} * #{answer[1]} = #{answer[0]*answer[1]}"

2011年03月28日 (月) 20110321に追記した。並記したかったので追記。


2011年03月27日 (日) Firefox4. 閲覧履歴の保存期間の設定がなくなってる。5年分くらいは保存するように設定してたんだから、間違っても勝手に消してくれるなよ。ディスクキャッシュと一緒に削除するのもなしだ。/// Firefoxボタンの階層メニュー。ポップアップがメニュー項目の左右ではなく、▶の左右に表示される。左に表示されると親メニューが隠れてしまうことを考えてない。ボタンが常にウィンドウの左上にあるという想定もあるだろうが。


2011年03月26日 (土) Firefox4. Ctrl+Eで検索バーフォーカスはどうした。タイトルバーダブルクリックで最大化解除はどうした。タイトルバー左端ダブルクリックで終了はどうした。Mozilla流をやめて Windowsアプリに同化することでシェアを伸ばしたのではなかったのか。タイトルバーはメニューバーを表示すれば表示されるんだけど、メニューはいらない。メニューのほとんどをシェブロンにしてしまえたらメニューバーの使い道が広がるのに。///追加。ちまちまちまちまタブの横幅を変更されるとマウスで連続して閉じるのが大変。target="_blank"が機能しない。機能することもある。Add-onの可能性もあるが、互換性のないアドオンはFxのアップデートにつきもののひどいUX。責任転嫁はできない。///「Aero Window Title :: Add-ons for Firefox」最高。///「Tabs Open Relative (Modified) 1.2」が原因だった。///順番にキーを押していって発見。Ctrl+Kで検索バーにフォーカス。Windows Explorerがもう Ctrl+Eを採用してんだから Ctrl+Kはない。Ctrl+Lと並べたかったのかしらんけど。///「Change Search Shortcut :: Add-ons for Firefox」"Allows to change the search shortcut. After the comedy with Panorama taking over CTRL+E, then switching to CTRL+SHIFT+E, without restoring CTRL+E," comedyに同意する。どうしてリリース前に復帰させられなかった。


2011年03月25日 (金) 見えないところでの思いやりが、本当の思いやりなのだと思う。「誰にでも見える思いやり」なんてのは、思いやりではないのではないだろうか。」 たぶん最近多い ACの CMについて。この CM、いいと思うけどなあ。行動を促してるんだと思う。思うだけではダメで行動に移さなければいけない。思いは見えないけど行動すればそれは誰にでも見える。それを思いやりと(そのCMでは)呼ぶんだと。見せる必要はないけど、見えても嘘にはならないんじゃない。(こういうことは書いてもわかり合えるとは思わないのでコメントしないでここに書いてる)。目立つのを嫌って行動できない日本人は多そう。考えすぎ。それも言い訳を。子供の時にたたき込まれてたら照れもなくできるんだろうとも思う。レディファーストとか。

最終更新: 2014-04-25T14:53+0900

[ProjectEuler] Problem 81, 82, 83

 Problem 81

迷路より簡単。右下から左上に向かって、右の要素と下の要素を参照しながら順番に処理するだけ。

matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i) }
raise "正方行列でない!" if matrix.size != matrix[0].size
(matrix.size-1).downto(0){|i|
	(matrix[i].size-1).downto(0){|j|
		incr = nil
		incr = matrix[i][j+1] if j+1 < matrix[i].size
		incr = matrix[i+1][j] if i+1 < matrix.size && (!incr || matrix[i+1][j] < incr)
		matrix[i][j] += incr if incr
	}
}
p matrix[0][0]
__END__
content of matrix.txt here.

 Problem 82

まだまだ簡単。最下段から、行を右へ左へ処理しながら上へ向かうだけ。こういう、問題・入力に依存して可変長のメモリを確保したりしない、そのうえ問題を単純に走査するだけの解法は安心できる。

Matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i) }.transpose # transpose:問いの右から左が、下から上への処理になる。
Order = Matrix.size
raise "正方行列でない!" if Matrix.size != Matrix[0].size

row = Matrix[0].dup # 1-line memo. row is now at the first(top) line of Matrix.
1.upto(Order-1){|i|
	# move from up ↓↓↓↓↓↓↓↓↓↓
	0.upto(Order-1){|j|
		row[j] += Matrix[i][j]
	}

	next if i == Order-1 # 最後の行は横移動不要(※禁止ではない)。最小値だけを選び取って答えにするから。

	# move right →→→→→→→→→→
	0.upto(Order-2){|j|
		src, dst, move_cost = row[j], row[j+1], Matrix[i][j+1]
		row[j+1] = src + move_cost if src + move_cost < dst
	}

	# move left ←←←←←←←←←←
	(Order-1).downto(1){|j|
		src, dst, move_cost = row[j], row[j-1], Matrix[i][j-1]
		row[j-1] = src + move_cost if src + move_cost < dst
	}
}
p row.min
__END__
content of matrix.txt here.

Array#transposeを使う機会があるなんて思わなかった!好きなメソッドは transpose(今日だけ)。ま、使わなくてもいいんだけど線形にアクセスするために。ま、メモリ構造からは遠く離れた Rubyなんだけど。


 @2013-05-11 アップデート

N×N確保していた作業メモを 1行分だけで済ませるようにスクリプトを修正。

コメントに「transpose:問いの右から左が、下から上への処理になる。」ってあるけど、今問題文を見ると左から右になってる。まあ、どっちからどっちでも変わらないからね。問題文が左から右になったからってわけではないけど、アップデート後は上から下の処理に変えてる。下から上だと、どうしてもその必然性を探してしまうから。

 Problem 83

シリーズの締め。迷路のときとは違って 80×80ともなると手当たりしだいに探索の手を伸ばしていくと 10分以上の時間がかかる。優先度を付けると insertのコストが加わったにもかかわらず、笑っちゃうぐらい一瞬で終わった。

C++だったら queueの実装として std::multimapを使うところだけど配列をヒープ構造にするのもありだ。

Matrix = DATA.lines.map{|ln| ln.chomp.split(",").map(&:to_i).freeze }.freeze
raise "正方行列でない!" if Matrix.size != Matrix[0].size
matrix = Matrix.map{|ln| Array.new(ln.size) }
size = matrix.size
moved = lambda{|i,j, l,m|
	return false if not (0...size).include?(l) or not (0...size).include?(m)
	src, dst, move_cost = matrix[i][j], matrix[l][m], Matrix[l][m]
	return false if dst && dst < src + move_cost

	matrix[l][m] = src + move_cost
	return true
}
matrix[0][0] = Matrix[0][0]
queue = [[0,0]]
insert = lambda{|l,m|
	val = matrix[l][m]
	queue.insert(queue.index{|i,j| val <= matrix[i][j] }||queue.size, [l,m])
}
until queue.empty?
	i,j = *(queue.shift)
	break if matrix.last.last and matrix.last.last <= matrix[i][j]
	[[i-1,j],[i+1,j],[i, j-1],[i,j+1]].each{|l,m|
		if moved[i,j, l,m]
			insert[l,m]
		end
	}
end
p matrix.last.last
__END__
content of matrix.txt here.

<queue>ヘッダには priority_queueクラスがあるし、<algorithm>には make_heap, pop_heap, push_heap といった、配列(RandomAccessIteratorをそなえたコンテナ)にかぶせて使うための関数があった。そりゃあるわなあ。ソートキーが要素のみから算出できない今回の場合に priority_queueを使う(外部キー)か、multimapを使う(内部キー)かはやっぱり決めかねるけど。