/ 最近 .rdf 追記 設定 本棚

脳log[2012-02-25~]



2012年02月25日 (土) 「XXXX is not prime.」って違和感あるなーと思って ATOKで辞書を引いた。primeの形容詞は限定用法のみとあった(※名詞の前に置く使い方。[関係詞]限定条件に添わないホニャホニャの存在を否定しない(示唆する)用法)。XXXXが数字なのは見てわかるから「XXXX is not a prime.」でどうだろ。


2012年02月24日 (金) 「青い光の奇跡」駅や踏切での飛び込み自殺激減 : 社会 : YOMIURI ONLINE(読売新聞)」気持ち悪くて近寄りたくなくなるんだよね。実際に見て「うげっ」と思った。他所で死んでるのとは違うの?飛び込みって衝動的に誘い込まれるもんなん?■「Business Media 誠:杉山淳一の時事日想:鉄道自殺は増えていない。自殺全体が増えている (1/5)


2012年02月23日 (木) Avastはどうしちゃったんだろう。今日になって ASR-1.8.7、ASR-1.9.3、Ruby-1.8.7、Ruby-1.9.2、perl、svnadmin、svnlook、gdipp_loader32、ChainLP、sakuraW、LHMELT、Very Sleepy、果てはこんなミニマルなプログラムまでをサンドボックスで開こうとする。ちょっと基準がアグレッシブすぎるんじゃないの? 設定を記憶させられるので手間は一回だし(※頻繁にアップデートするようなものだと都度選ばないといけないかもしれないが)、ザルなのよりはいいけど。■ OFFにしたった。■「過ぎたるは猶及ばざるが如し」とか、「必要十分」の、特に必要であるかどうかという部分を常々大事にしたいと思ってる。俺ってば「日本人」じゃないね。


2012年02月22日 (水) XRegExp-1.5.1


2012年02月21日 (火) [SonyReader] PRS-650が SONYのサイトで生産完了になってた。外部メモリ2枚差しと金属筐体、レッドにもメッセージ刻印ができることだけは PRS-T1に勝って(まさって)いて、それゆえに PRS-650の方を買った人間としては惜しまれる。■ cacheExt.xmlを数倍(<1MB)に肥大させてページ送りやらコレクションの表示やら何かと動作を遅延させる最大の原因<history>タグを削除するときの検索条件。「^\s*<history>[\s\S]*?</history>\n」サクラエディタで一個一個確認しながらやってる。


2012年02月18日 (土) [Vista] 延命。「Windows クライアント OS の製品サポートライフサイクル ポリシー変更について (2012 年 2 月)」「Windows Vista Ultimate 64-bit edition 延長サポート終了日 2017/04/11」さんざん延長されて Vistaより長生きになってた(※この発表までは) XPの例があるので知ってた。嘘。いつ発表されるのだろう残り時間は少ないぞと戦々兢々としてた。開き直ってセキュリティパッチがなくてもあと2、3年は使い続けるつもりを、つい2、3日前に確認したばかり。■ Windows 2000信者の気持ちは解らなかったけど、少し触った Windows 7のシェルが使いやすいとは思わなかったので Vistaっぽくできるなら間違いなくそうしてた。何が気に入らないってタスクバーでウィンドウを一覧できないこと。俺はグループ化なんてしないよ。そこはタブとマルチウィンドウを使い分ける。Firefoxもサクラエディタもそれができる。


2012年02月17日 (金) Cのいけてないところ。ローカル変数がデフォルトで constでないところ。関数の外の変数がデフォルトでグローバルなところ。staticを付けてファイルに閉じ込めてもまだスレッドローカルでないところ。■TLSにアクセスするときにスレッドIDみたいな引数が不要なのを知ったときには虚を衝かれる思いがした。だというのに Rubyで Thread#[]メソッドにて副スレッドが主スレッドに処理結果を渡そうとしたとき、selfがレシーバとなるスレッドオブジェクトとは違っていてしばし途方に暮れてしまった。副スレッドで実行されているコードが自身を表すスレッドを取得するには Thread.currentを呼び出すのだった。ついつい常に背負ってるコンテキストの存在を忘れてしまう。■なぜ C++の~と書かず Cの~と書いたか。C++だと無名namespaceに言及しないといけないと思ったが使ったことがないから。


2012年02月16日 (木) カスタムメモリアロケータ。フレームやステージを区切りにして全域を解放する戦略をとるなら個別の deleteがいらないとは目から鱗。万能って言われてたのは Pythonの Arenaと同じ類?■■■あ、でもデストラクタでメモリ以外のリソースを確実に解放することは期待できない?そこが C++の好きなとこだし、単に必要に迫られて言語の不備を取り繕ってるだけなんじゃないかともチラッと思うが、C#にも usingがある。■いやいやそういうオブジェクトはスタックに置けばいいのか。きちんとクラスの設計と利用の両場面で意識を分けられるだろうか。■ class定義で newを禁止できるのだっけ?


2012年02月14日 (火) iPad3の噂の解像度はそれだけで正義。ScanSnapが出力した JPEGを拡大してなお全体を表示する余地があるくらいだ。そんなことは PCででもできない。24.1インチの PCモニタよりずっと小さい大きさに、WUXGA以上の解像度。とにかく自炊 PDFの表示を一目見てみたい(疑っているのではなく圧倒されたくて)。■ガラス越しのタッチインターフェイスには慣れるもんなんだろうか。

最終更新: 2021-09-14T21:45+0900

[ProjectEuler] Problem 191

 Problem 191

別個に知っているが関連があるとは思っていなかった二つの Webサイト、「ときどきの雑記帖 再起編 2012年2月(中旬)」から「Problem 191 - もうカツ丼でいいよな」へのリンクがどういう観点で張られたのか、確かめるために*リンク先を読みたいがネタバレはいかん。との思いでがんばった。

まず問題がおかしい。欠席は3連続でなければ許されるのに遅刻は1回までとか。まあどうでもいい。それより問題文が難しかった。punctuality(無遅刻)と forfeit(権利の喪失)の2単語は辞書を引いたし、カンマや関係詞で連続する文は主語述語修飾関係がわかりにくいので、細かいことを考えずに流れに注意して4、5回読み直した。81という数字がどういう経緯で出てきたのか(※OALの3文字で作る長さ4の文字列=3^4通り)、説明があれば問題文を理解する一助となったろうに、そんなものはなかった。

Half_period_strings行以降のバグてんこ盛りのぐだぐだは一重に処理時間と消費メモリを節約することが目的。正規表現でやることは最初からの方針だったのだけど改行で連結した 30-period stringsを検索しようとしたら Rubyがメモリ不足で落ちる。ワーキングセットが 2GiBを超えたあたりだったと思う。ならばと一行分ずつ逐一処理しようとすると時間がかかりすぎる(30分はかからないが)。Threadで分散してみようとしたが Ruby(1.9)には GVLとかいうのがあって CPUを 33%までしか使ってくれなかった。Fiberもそういう期待には応えてくれないみたい。プロセス間通信は面倒。時間が許すなら、

Thirty_period_strings = Joint_period_strings[
	Fifteen_period_strings, Fifteen_period_strings
]
p Thirty_period_strings.inject(0){|count,tristr|
	count + 1 + tristr.scan(/A|(?<=AA)O|(?<=A)O(?=A)|O(?=AA)/).length
}

これ(を配列を要求しないように書き換えたバージョン)だけで済んでしまうことなのに、15-period stringsと 30-period stringsの間には処理すべき量に雲泥の差があった。

戦略は、

  • 一つまでしか許容されない Lをひとまず無視(scoreというのが Lの持ち込む派生語の数に関連した値)。
  • (現実的に扱える量である)15-period stringsの連結を考える。

以下、偶然なのかなんなのか、答えは出たが説明できないスクリプト(ピリオドの置き方が Ruby 1.9専用みたい)。実行時間は1秒未満。

# PE 191

Letters = %w(O A).freeze
Re_filter = /^(?:(?!AAA).)*$/
Joint_period_strings = lambda{|*args|
	return args.first.product(*args.drop(1))
		.map{|_| _.join('') }
		.select{|_| _.match(Re_filter) }
}
Three_period_strings = Joint_period_strings[
	Letters, *Array.new(2){ Letters }
].freeze
Six_period_strings = Joint_period_strings[
	Three_period_strings, Three_period_strings
].freeze
Fifteen_period_strings = Joint_period_strings[
	Six_period_strings, Six_period_strings, Three_period_strings
].freeze
Re_score = /A|(?<=AA)O|(?<=A)O(?=A)|O(?=AA)/
IndexedScore = Struct.new(:num, :sum)

Half_period_strings = Fifteen_period_strings

l_index = Hash.new{|h,l_back| h[l_back] = IndexedScore.new(0,0) } # by ending codon. {'OOO'=>IndexedScore,'OOA'=>,...}
r_index = lambda{|r_front| return l_index[r_front.reverse] } # by starting codon. {同上} (実体はl_indexと共有)
Half_period_strings.each{|str15|
	score = l_index[str15[-3,3]]
	score.num, score.sum = score.num+1, score.sum+str15.scan(Re_score).length
}
p l_index.keys.product(l_index.keys).inject(0){|count,_| l_back, r_front = *_
	joint = l_back + r_front
	next count if Re_filter !~ joint
	l_score, r_score = l_index[l_back], r_index[r_front]
	joint_score = [joint, l_back, r_front].map{|_| _.scan(Re_score).length }.inject{|a,b| a-b }
	next count + l_score.sum*r_score.num + r_score.sum*l_score.num + (1+joint_score)*l_score.num*r_score.num
}
p Process.times

 @2012-02-15

他所を見て回った。得たヒントは「漸化式」「DP」「scoreは Oを数えるだけ」「prize stringは Lの出現回数(0-1)と先端部の Aの連続数(0-2)で classifyできる」。

 「scoreは Oを数えるだけ」

実際、どちらでもいけた。だけど下の方が良いのは明らか。ビットを数える処理にも置き換えられるし、joint_scoreは不要になるし。

score = tristr.scan(/A|(?<=AA)O|(?<=A)O(?=A)|O(?=AA)/).length
score = tristr.count(?O)
 「prize stringは Lの出現回数(0-1)と先端部の Aの連続数(0-2)で classifyできる」

このヒントを基に以下のスクリプトができた。実行時間はコンマ1秒未満。10倍高速。早く書けてバグが無くて実行が速くて、昨日と一昨日の自分が何に頭を悩ませてたのか不思議になるよね。この着想に独力でたどり着けないところが己の限界。

# coding: utf-8
# PE 191

Extend_prize_strings = lambda{
	L,A,O = 1,1,1
	A0L0, A0L1, A1L0, A1L1, A2L0, A2L1 = *0..5
	return lambda{|prize_strings| ❦=prize_strings
		return [
		# a=0; l=0
			❦[A0L0]*O + ❦[A1L0]*O + ❦[A2L0]*O,
		# a=0; l=1
			❦[A0L0]*L + ❦[A0L1]*O + ❦[A1L0]*L + ❦[A1L1]*O + ❦[A2L0]*L + ❦[A2L1]*O,
		# a=1; l=0
			❦[A0L0]*A,
		# a=1; l=1
	 		❦[A0L1]*A,
		# a=2; l=0
			❦[A1L0]*A,
		# a=2; l=1
			❦[A1L1]*A
		]
		# a=3 (prize forfeited)
			❦[A2L0]*A
			❦[A2L1]*A
		# l=2 (prize forfeited)
			❦[A0L1]*L
			❦[A1L1]*L
			❦[A2L1]*L
	}
}.call

Period = 30

# index of prize_strings: i = (a<<1)|l
# a = consecutive As at a prize string head. (0,1,2)
# l = occasion of L. (0,1)
# starting state(=prize string length is zero): a=0;l=0;prize_strings[i]=1
prize_strings = [1,0,0,0,0,0]
Period.times{
	prize_strings = Extend_prize_strings.call prize_strings
}
p prize_strings.inject(&:+)
p Process.times

C++11だとコンパイル時に答えを出してしまいそうだ。再帰30回だし。

* 確かめた結果は……Rつながり?

 このルールに理由を見つけられなくはない。一時間目の数学(K川先生)に遅刻した日は二時間目から登校していた。欠席ならお咎めなしだから遅刻より(その場では)楽だったし、教師にとっても授業が止まらないから欠席の方が良かっただろう。違う、これは俺の考え。教師の対応から判断するなら大きい声で邪魔するのが正解。でもできません。蛇足。遅刻というか時間に厳しい人で、自分自身も授業の始まりと終わりをきっちりチャイムに揃える人。だからそこに、登校手段による例外を認めてほしくはなかった。


2012年02月09日 (木) しばらくの間 Firefox(3.6.26)を起動したくない理由があって IE9を開いた。アドレスバーに適当な文字列を打っても検索してくれたりはしないのね。だったら検索欄を残しとけよ。テンキーの 0を使って文字サイズのリセット(Ctrl+0)はできないのね。拡大(Ctrl++)と縮小(Ctrl+-)はどっちでもできるのに。(エラー画面以外の)何も表示する前からうんざりだよ。■俺が初めての PCで初めてのインターネットブラウザで初めて Webページを表示したときに助けになったのは IE(4か5)の検索ペインだった。メニューバーも検索ボックスも気のきいたアドレスバーもない IE9には何がある?■■■すばらしい。ぐちぐち文句を垂れるだけの自分とは違って行動してるね。「Firefoxの過去履歴を統合する - もの置き処」履歴切り詰めのトリガーがもしサイズやレコード数だったら結合してもすぐ……とか考えるけど、期待して Firefox 10.0上げ。■@2012-04-12 今は Fx11.1なんだけど、places.sqliteが暗号化されてるかデータベースファイルじゃないってエラーになった。sqlite3(3.7.7.1)コマンドで VACUUM;してやると正常に完了した。


2012年02月08日 (水) Calibreはいくつか前のバージョンから(0.8.38の今も) periodicalNameの切り出しルールを変えたのかな。どういう仕組みで決まるのか本当は知らんけど。titleが CNNだと後ろに続く日付までが periodicalNameに含まれてしまって、日付が違うだけで新しいシリーズとして Sony Reader上で場所をとってしまう。titleが C N Nだと大丈夫。Cnnだとアウト。NASAはセーフで、CNNNもセーフ。三文字頭字語のニュースソースってありがちだと思うんだけどな。■■■@2012-02-09 .pyoにコンパイルされてるから諦めてたけどソースを見つけた。sony_cache.pyの periodicalize_book()だ。logを見ると最近になって変更があったわけではない。[ (とその後に続く日付)より前の部分が空白を除いて4文字未満のときにそれを捨ててしまうのは最初からの仕様だ。変わったのは俺が、定期購読の「タイトルをタグに追加」しなくなったこと。これによって最初のフォールバックを素通りして最後の選択:book.title(日付つき)が使われるようになった。タイトルをタグに追加したくない理由は、タグはコレクションとなって Reader上に現れるから。定期購読にあるのと同じバインダーはコレクションにはいらない。一度に表示できる数は9しかないのだから。さて、どうしたものか。


2012年02月07日 (火) 履歴。Firefox4以降(いこうのいは(大なり)イコール/インクルーシヴのい。最近エレベータの注意書きに震度4以上の時と震度4以下の時の二通りが書かれているのを見た。震度4の時は相反する指示のどちらに従えと?)の履歴に絶望したのを何度も書いた。20110327,20110412,20110719,20111216。こういう履歴とか MRUっていうのは開いた日時で記録されるけど、俺にとって開いた順番は大した意味がない。むしろ、閉じた順番が大事。閉じる直前には確実にコンテンツをそれも長い時間、目にしているのだ。コンテンツをトリガーに想起されるのは閉じた順番であり日時であって、場合によっては前日やもっと前だったりする開いた日時ではない。Firefoxには 3.6までの履歴保存機能とともにそういうところにも目を向けて欲しい。あとね、履歴のプライマリキーは日時(+URL)であって、URLではない。最終訪問日時順に表示した履歴をもとにブラウジングしてみればいい。クリックする度に順番が入れ替わって使いにくさがわかる。今の Firefoxは記録期間も記録内容も貧弱なんだよ。


2012年02月06日 (月) Rubyの Array#eachに対して不安になること。これは要素を先頭から yieldしてくれるんだろうか?そうは明記されてないけど、というもの。そういうわけで、時々は添え字をカウントアップしながら配列を処理してる。Rubyっぽくないけどそういう要求があるときもある。