/ 最近 .rdf 追記 設定 本棚

脳log[2012-02-06~]



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


2012年02月05日 (日) ビットブリット。"The following list shows some common raster operation codes." COMMON? と思って検索すると名前のないのがいっぱい出てきた。「Ternary Raster Operations (Windows)」SourceビットとDestinationビットとPattern(Brush)ビットの2×2×2の組み合わせそれぞれの結果を1にするか0にするか、全256通りを選択できる。三度の呼び出しが一度に減って嬉しい。■使用例。Destは文字の背景。Srcは白背景黒文字のマスク(ただし白黒やグレイスケールではなく輪郭に色が出てるはず)。Patは(本来の)文字の色のブラシ。ROPは 0x00B8074A. 0xB8(0b10111000)というのが P,S,Dがそれぞれ 1,0のときの出力を特定の順番で並べたもので ROPコードのキー。ビットパターンで望みの結果を示すことはできるけどその結果を導くビット演算は理解できない。特にXORが関わっては。("if S=1 then D if S=0 then P" = 0xB8 = PSDPxax ※大文字は参照するビットのソース。小文字は演算。逆ポーランド記法)


2012年02月01日 (水) [SakuraEditor] そういうファイルを正に作ろうとして気付くその存在に >> view/CTextDrawer_DWriteImp.cpp いつからあったん?調べると9か月前だった。9か月前の自分が作ったのと同じ名前のブランチを今日また作成し、9か月前の自分がすでに作ったファイルを今また作ろうとしていたところだった。何やってんの。■ところで、DispTextって文字の数だけ呼ばれるんだけど、こんなんを仮想関数にしても良いものだろうか。9か月前の自分はできるだけ長い GLYPH_RUNを対象にすることで回数を減らそうとしてたみたいだけど(ANSIビルドの ExtTextOutW_AnyBuildにある半角文字1024字制限に引っかかったりしてね)。■■■ @2012-02-02 文字は出た(サンプルコード切り貼りコーディング!……delete[]だけ追加しときました)。ひらがなのカーブのギザギザが消えて、もやっとしてるのが観察できる。GDIだと(※メモ帳と秀丸(HmDWriteオフ)でも同様)謎に縦横比が狂って縦長(半角サイズ)になる、Consolasとリンクしたメイリオの日本語文字も全角サイズで表示された。Consolas+メイリオだとグリフが表示されてなかった一部のUnicode記号も出た。あと最低限やることはフォントの変更についていくこと、なめらかな文字サイズ変更、特性の違うモニタへの書き分け(※でもマルチモニタの経験がない)、文字を書き込んだメモリ上のビットマップとエディタ領域の正しい合成(今はテキトーなサイズのビットマップのテキトーな領域をコピーしてるだけ)。ダイナミックローディングの優先度は最低(XPで実行しないし)。■■■テキストエディタにもタイピングゲームみたいな楽しみがあっていいと思うんだよね。削除した文字が砕け散るとか、貼り付けた文字が後ろの文字を押しのけるとか。インタラクションと打てば響くレスポンスが。■■■@2012-02-03 全角半角を、実際に文字を配置して判断してる部分がある。これは GDIだ。文字を DirectWriteで描いた場合、描画と判定が食い違うことがある。おかしな環境に限った話だと思うけど……。TODO:下線。斜体のオーバーハング。■■■DONE:下線, DPI-aware. TODO:斜体のオーバーハングと背景画像対応。画面内の文字の数に比例してカクついてる……。■ GDIだと描画がおかしくなる環境でしか積極的なメリットを見出しにくい Consolas 48での比較画像Consolas 14での比較画像MS ゴシックだとこっちはやらせかってぐらい明らかに違うけど(っていうか違うフォントだよね?※)、表示品質を気にする人は今更使ってないだろう(選択肢が豊富な英字等幅フォントにリンクされて表示されることはわりとあるかもね。日本語部分がMSゴシックになるときのがっかり感ときたら……)。※文字が1000分の100太いのは好みによる味付けです。gdippを使ってもほぼ同じ表示が得られてるのでフォントが違うってことはなかった。「MS~系のフォントの場合は、サイズが16pt以下の場合、ビットマップフォントが使われるようです」ということみたい。■DONE:背景画像対応。TODO:(背景画像なしのときの)斜体のオーバーハング。ノーマルのサクラは色の切り替わり部分を除いて切り落とさずに表示できてるんだけど。■■■@2012-02-05 Very Sleepyで DWriteCreateFactoryとして表される DWriteモジュール唯一のエントリから呼び出される memcpyで費やされる時間の合計が絶望的に長い。待ち時間の50%がこれ。DirectWriteを(効率的な)ハンコにするには DWriteTextLayoutをキャッシュしても駄目なのはわかっていて、GLYPH_RUNを再利用すべきなんだろうか、RenderTargetを GDIでなく D2Dにしないと駄目なんだろうか。一文字ハンコにするのがもう非現実的で、1以上の長さを持つ GLYPH_RUNを対象にすべきなんだろうか。教えて秀丸さん。■■■@2012-02-08「gdippの DirectWriteブランチ」でお勉強。■必要であるか否かに関わらず宣言的に IDWriteBitmapRenderTarget->Resize()を呼んでいたのだけど、これをやめると相当速くなった。それでも、Ctrl+V押しっぱなしの連続貼り付けが時々引っかかる。PageDownキーでの全画面書き換えはやっぱり待ちが入る。ブラックアウトしたまま 10秒以上待たされたりしなくなったというだけのこと。■■■TODO(追加):英字と日本語のベースラインを揃える(今は英字が浮いてる)。■DONE@2012-02-29 baseline揃え。


2012年01月27日 (金) クマー!「ちなみに,Ruby 1.9 では lamda と綴れない人のために,-> という記号が利用できることになりました.


2012年01月26日 (木) 僕の経験から言うと、日本人には「イングランド=英国」と考える傾向があるみたいだ。僕自身ですら、スコットランドのことを詳しく知らないしね。スコットランドは英国の一部、カリフォルニアが米国の一部であるように、そんな風に僕は認識してる・・・・・・・しかし、僕のスコットランド人の友達は、スコットランドはイングランドと別の国なんだと言って譲りません。(笑)」英語の時間に「イギリスは England」って習ったもんね。そのせいだ。高校の時には友人から「グレートブリテンおよび北アイルランド連合王国」みたいなのを聞いてへぇーとなって、「スコットランドヤード」というゲームでこれがイギリスの警察の名前だと聞かされて、まあそんな感じ。ニュージーランド人(コメ主)とスコットランド人と同じくらいの意識の隔たりがあるよね。今はイギリスっていうと UK(ユナイテッドキングダム)か GB(グレートブリテン)だろって思う。


2012年01月23日 (月) [SonyReader] ホーム画面に最後に読んだ3冊を表示するために PDFファイルの更新日時を操作してる(→20111101p01)せいだと思うんだけど、サムネイルの再作成と最後に読んだページのリセットが行われることがある。特に最後に開いていたページのリセットが困る。更新日時のセットってまさに読みかけの(最後に開いていた)本に対して行うわけだから。ページ履歴が残ってればページを探す苦労はないけど、cacheExt.xmlの肥大化対策として historyタグを削除する(→20111226)こともあるわけで。cacheExt.xml(それか cache.xml)の日付情報を併せて書き換えてファイルが新しくなったと誤認されないようにしないといけないのかも。■■■ 現在 PDF数 900以上。16GBメモリースティック 10GiB使用。32GB SDカード 20GiB使用。PCに接続して内容を書き換えた後、MS・SDなし、MSのみ、SDのみでは問題ないが、MS・SD二枚差しだと反応が極度に遅くて再起動を数回繰り返したりバッテリーがなくなるまで再起動を繰り返したりする。充電したりリセットしたり再起動したりしながら気長に待ってると最終的には使えるようになる。誰でも書き換えられるメモリーカードの中身に依拠して動作を不安定にしたらダメだよ。リカバリはできてるともいえるけど。他人には全く使用を薦められません。■■■ @2012-01-28 タイムスタンプが新しくなってもサムネイルの再作成は行われなかった。むしろ本来の更新日時を復元されて古くなった方のサムネイルが再作成された。いずれも、再開ページはリセットされていない。むむむ。この前はバッテリー切れまで再起動を繰り返すうちに本体の時刻までが狂っていたのだけど、そういう例外的な事象に関連してのことだったのか?そういえばシリーズものをひとつにまとめた PDFに続きをくっつけてサイズが変わっても続きから読めてたもんなあ(サイズと更新日時はどちらも cache.xmlに size, date属性として記録されているので、実際のファイルと食い違っていればわかる)。■■■@2012-04-20 ページ位置のリセットは本を「未読の書籍」コレクションから開いたときに行われる気がする。大丈夫なときは書籍一覧から開いたときだったような。■■■@2012-09-10 ページ位置のリセットの原因は PDFの保存形式の違いだと思われる。ChainLPで作成した PDFも Adobe Acrobat 9で結合した PDFも、一度 Acrobat 9で開いて[ファイル]>[名前を付けて保存]という決まった操作で保存するようにしてから全然起こらなくなった。


2012年01月22日 (日) [BAD BOY] 雨で濡れてるうちにリムとスポークの汚れを(初めて!)拭き取っていたら後輪のスポークの一本がゆるゆるなのに気がついた。後輪といえば去年の 11月に振れ取りをしてもらった方だが、そんなに頻繁に調整が必要なものか?■@2012-01-24 計ってみたら同じ(反フリー)側のスポークがみな 18-20目盛りだったのにその一本は 5目盛りだった。だけどこれを締めるとまあその部分がブレーキシューに接触するわけで、5目盛りでないとバランスが保てない。締めた上で妥協できる程度には振れをとったけど、ハブが中心になかったりリムが楕円形になってても知らないよ。


2012年01月20日 (金) えっと……、TVに赤色の B-CASカード(※Wikipediaで見たら青カードでも大丈夫そうだ)がささってるのを確認して、BSアンテナ(6500円)を仰角41度方位角220度で取り付けて、エアコンの穴からケーブルを通したら、BSフジは見られるの? もちろんすでに家に通ってる光ファイバーを使った CATVサービスに加入する手もあるんだろうけど(最低料金が毎月1300円(500円)+工事費)。■ 放映時間。実は録画せずに見られる深夜帯(23:50~)がありがたかった。夕方に放映される鈴鹿は毎年苦労していた。たぶん、録画したら見ない。チャンネル権とか子供の頃の遠い記憶だ。■ あっ。N!H!K! アンテナ隠さないと。


2012年01月19日 (木)

最終更新: 2012-01-20T00:09+0900

[ProjectEuler] Problem 10, 12, 14, 17, 19, 21, 23

穴埋め。解ける問題がはやなくなってきたから……(完全になくなってはいないはずっ)。

 Problem 10

時間コストを空間コストに置き換えて。

arr = [true] * 2_000_000
sum = 0
2.upto(arr.size-1){|i|
	next unless arr[i]
	sum += i
	i.step(arr.size-1, i){|j|
		arr[j] = false
	}
}
p sum
p Process.times

 Problem 12

Rubyに頼った。prime_divisionのこと。

require 'mathn'

trinums = lambda{
	tri, n = 0, 1
	return lambda{
		tri, n = tri+n, n+1
		return tri
	}
}.call

loop{
	tri = trinums.call
	div = tri.prime_division.inject(1){|d,_| f,e = *_; d*(e+1) }
	if 500 < div
		puts tri
		p Process.times
		exit
	end
}

 Problem 14

ゴールから攻めようとか小賢しいことは考えずに。

number_of_chain = lambda{
	memo = {1=>1}
	this = lambda{|n|
		return memo[n] || (memo[n] = 1 + this[n%2==0 ? n/2 : 3*n+1])
	}
	return this
}.call

p (1...1_000_000).max_by{|_| number_of_chain[_] }
p Process.times

 Problem 17

面倒なだけ。

cc = lambda{
	return this = lambda{|n|
		count, num = 0, n

		digit1000 = num / 1000
		if 0 < digit1000
			count += this[digit1000] + 'thausand'.length
			num -= digit1000 * 1000
			count += 'and'.length if num != 0
		end

		digit100 = num / 100
		if 0 < digit100
			count += this[digit100] + 'hundred'.length
			num -= digit100 * 100
			count += 'and'.length if num != 0
		end

		digit10 = num / 10
		if 2 <= digit10
			count += {
				20=>'twenty'.length,
				30=>'thirty'.length,
				40=>'forty'.length,
				50=>'fifty'.length,
				60=>'sixty'.length,
				70=>'seventy'.length,
				80=>'eighty'.length,
				90=>'ninety'.length,
			}[digit10*10]
			num -= digit10 * 10
		end

		if num != 0
			count += {
				1=>'one'.length,
				2=>'two'.length,
				3=>'three'.length,
				4=>'four'.length,
				5=>'five'.length,
				6=>'six'.length,
				7=>'seven'.length,
				8=>'eight'.length,
				9=>'nine'.length,
				10=>'ten'.length,
				11=>'eleven'.length,
				12=>'twelve'.length,
				13=>'thirteen'.length,
				14=>'fourteen'.length,
				15=>'fifteen'.length,
				16=>'sixteen'.length,
				17=>'seventeen'.length,
				18=>'eighteen'.length,
				19=>'nineteen'.length
			}[num]
		end
		return count
	}
}.call

p (1..1000).inject(0){|sum,n| sum + cc[n] }

 Problem 19

問題文が難しかった。閏年の条件として "A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400." って書いてあったけど、centuryって XX01年から XY00年の 100年間を指す語だと思ってるから、"a century"が XY00年のことだけを示してるとは思わなくて、結果的に 100の条件を読み飛ばした上に 400の条件を逆にとらえてた。

days_of_month = lambda{|year,month|
	return 31 if [1,3,5,7,8,10,12].include?(month)
	return 30 if [4,6,9,11].include?(month)
	return 29 if year % 400 == 0
	return 28 if year % 100 == 0
	return 29 if year % 4 == 0
	return 28
}

dow = 1 # 日月火水木金土=0123456. 1=Monday. 1900-01-01 was a Monday.
(1..12).each{|month|
	dow = (dow + days_of_month[1900,month]) % 7
}
# Now dow indicates the day of 1901-01-01.

count = 0
(1901..2000).each{|year|
	(1..12).each{|month|
		count += 1 if dow == 0
		dow = (dow + days_of_month[year,month]) % 7
	}
}
p count

 Problem 21

愚直に(←これしか書いてなくない?)。

d = lambda{|n|
	divsum = 1
	t, tmax = 2, n
	while t < tmax
		q, r = *n.divmod(t)
		divsum += (t!=q ? t+q : t) if r == 0
		t, tmax = t+1, q
	end
	return divsum
}

p (1..10000).inject(0){|sum,n|
	dn = d[n]
	sum + (n < dn && d[dn] == n ? n+dn : 0)
}

 Problem 23

そのまま(←愚直にを言い換えただけ)。

class Integer
	def abundant?
		divsum = 1
		t, tmax = 2, self
		while t < tmax
			q, r = *self.divmod(t)
			divsum += (t!=q ? t+q : t) if r == 0
			t, tmax = t+1, q
		end
		return self < divsum
	end
end

expressible = [false] * (28123+1)
abundant = []
(1..(28123-12)).select(&:abundant?).each{|n|
	abundant << n
	abundant.each{|a|
		break if expressible.size <= a+n
		expressible[a+n] = true
	}
}
p (1..28123).inject(0){|sum,n| sum + (expressible[n] ? 0 : n) }

2012年01月15日 (日)

最終更新: 2012-01-17T01:44+0900

[tDiary] SourceForge.net: tDiary: TDiary::Plugin の多重初期化を減らしたい

自分の稼働中の tdiary.rbを見てみると該当部分はこうなっていた。

def load_plugins
	calendar
	@lazy_diaries.update( @diaries )
	if @plugin
		@plugin.diaries = @lazy_diaries
		@plugin.date = @date
		@plugin.last_modified = last_modified
		@plugin.comment = @comment
		return @plugin
	end
	@plugin = Plugin::new(
		'conf' => @conf,
		'mode' => mode,
		'diaries' => @lazy_diaries,
		'cgi' => @cgi,
		'years' => @years,
		'cache_path' => cache_path,
		'date' => @date,
		'comment' => @comment,
		'last_modified' => last_modified,
		'logger' => @logger
	)
end

if @plugin ... end部分はたしか kazuhikoさんのコードだったような……。

そうそうこれこれ*。>>脳log[2009-08-06-p01] tdiary.rbと plugin/navi_user.rbにパッチあて(plugin/recent_list.rbの分は使用してないのでスルー) + セクションごとの最終更新日時に一票 >>[tDiary-devel] all_filtersとかload_pluginsが呼ばれ過ぎで遅い件


@plugin.diariesと @plugin.dateと @plugin.comment、それとたぶん @plugin.last_modifiedに更新が必要なのはすでにわかってた話なんじゃないの、ってことなんだけど、このコードは tDiary-3.0.1になったときに失われてる。svn logは「Merge branch 'master' into svn」なので経緯は不明。


>>Re: [tDiary-devel] #194 blog-category.rbが動作しない

* 「@plugin」で引っかからなかったので「捨ておけぬ」でサイト検索して見つけた。


2012年01月14日 (土) ウィンカーのオートキャンセルが邪魔で邪魔でしょうがない。まだ必要なのに解除され再度出し直し、そういうときはロックがかからないからしばらく押さえ続けて、もう車の向きが変わったからとオートキャンセルを待たずに解除して、ということが常だ。まったく気に入らない。バイクのウィンカーが無音で、手動キャンセルだったことが影響してる。そんなんじゃあ忘れやしないし、交差点を直進するときや何でもないときにキャンセルボタンを押す癖がつく(関係ないがヘッドライトの点灯・消灯・LOW・HIGHもついつい確認してしまう)。そんなわけでオートキャンセルはいらんお世話でしかない。俺は、馬鹿な(思い通りにならない)機械を、憎んでる。冷静さを失うほどに。まして、そいつが自分のことを気がきいてると勘違いしていようものなら……(たたきつぶしてやる!)。


2012年01月13日 (金) なぜ C++で NULLチェックをするかといえば、そのパラメータが参照でなくポインタである時点で、省略可能な引数であることが示唆されているわけで(省略する場合は通例 NULLか 0を渡す)、その場合 NULLとは異常値ではなく想定された値。ぬるぽを回避する責任は受け取った関数側にあると考えてチェックしちゃう。


2012年01月09日 (月) どうでもいい話。call by valueと call by reference. 「参照(※)の値渡し」と「値の参照渡し」を区別する必要性が、まずない。(※ここでいう「参照」っていうのは「特定の言語において参照と呼ばれるもの」程度の意味しかないんでしょうね。そこからまた不毛な議論が……。) だから混同が起こるのだが、最初の定義にこだわっても得るものはない。だからどうでもいい。そこはコンパイラなど言語処理系の領域で、言語(利用者)の関知するところではない。不変オブジェクト(JavaScriptの文字列とか)であれば特に値(実体が遍在する)だ参照(実体がひとつ)だ値渡しだ参照渡しだと区別する必要がない。振る舞いは同じだ。だいたい参照って何?言語が用意したポインタ(メモリアドレスとその幅と値の解釈)の代替じゃないの?代替の行うことが値の追加の解釈だとすれば、それもポインタに含めうる。で、ポインタは値だ。参照が概念的な存在なのと、視点の存在するレイヤーによって同じものが値(と呼ばれるもの)だったり参照(と呼ばれるもの)だったりするからその対象が定まらないんだよ。■ 俺が JavaScriptと Rubyを使い始めた初期にそれらの言語を気に入った点には、扱いがどちらにもなりうる文字列の振る舞いがはっきりしていたことがある(JavaScriptでは文字列を変更することができない。Rubyでは明示的にコピーしなければ変更が伝播する)。C#も classと structの対比と boxingの説明で明確にしてた。いつのまにか関数呼び出しから話がそれてるが、結局、関数の外に影響するかしないかしか興味がないからだ。■ Wikipedia(ja):引数では値渡しと並記されてるのは変数渡しで、参照渡しは変数渡しの実装手段のひとつだという位置づけだなあ。■■■共有渡し。「参照渡しとの大きな違いは、関数内部での仮引数への新しい値の代入は、外側の対象には影響しない(参照渡しの場合は影響します)ということです。」そういう違いがあったのね。それは「ゴツいシンボル」が存在しない JavaScriptや Rubyと C++の、言語レベルの違いとして処理してる(ので意識してなかった)なあ。