最終更新: 2009-09-04T06:13+0900
5日遅れて衝動買いした Excellioに遅れること 3日、Majestouch(黒軸=Linear) が到着。
20090830p01で書いたように、Excellioを USB->PS/2変換コネクタ経由で繋いでみてから M/Bがおかしくなって PS/2ポート(マウス用=緑色)に繋いだトラックボールが使えなくなっていた。そしてこのキーボードも……。ところが、BIOSセットアップでのことをふまえてマウスとキーボードを入れ替えて繋いでみたら、どちらも使えた。色の組み合わせが違っていて気持ち悪いけど、それだけなので使えて幸い。問題が起こったついでだからと BIOSをアップデートしてたんだけど、それでは解決しなかった。
出尽くしていて目新しい感想もないので箇条書きで
Excellioと甲乙付けがたいけど、コストパフォーマンスは Excellioの方が 3倍良い。パンタグラフに違和感がなければ、箱つぶれ Excellioおすすめ。
資料 > スイッチ・キートップガイド構造
最終更新: 2010-06-22T11:46+0900
初歩の初歩ですよ。
vector<int> v(99); for(int i = 0; i != (int)v.size(); ++i) { }
みたいなのがあって(俺が書いたんじゃないよ)、ひょっとしたらキャストがなくても問題ないのかもしれないし、それがないと警告(符号付きと符号なしの比較がうんたらかんたら)が出るのかもしれないけど、(int)って書きたくないよね。static_cast<int>()にしろっていう問題でもなくて。iの型を unsignedにするのも若干のアドホック感がある(なんのための typedef)。かといって v.size()の戻り値の型(vector<int>::size_type?)をコピってくるのも嫌だね。たとえば(そんなキーワードはないけど) varを使って
vector<int> v(99); for(var end = v.size(), i = 0; i != end; ++i) { }
みたいに書きたいし、コンテナの型を何度も書く代わりにそこにある、型付けされた変数を使ってこう書きたい
list<int> l(99); for(type(l)::iterator it = l.begin(); it != l.end(); ++it) { }
C++のことだし方法はあるはずだけど……。(typedef list<int> hoge; はコンテナの型(hoge)を見つけてこないといけないのは同じだし、俺俺タイプをいちいち命名したくもないし)
■_ をち
2chにはせいぜいautoマンセーと0b論争がお似合い
type(l)::iterator
の方も……N2971: Core issue 743: decltype(...) name qualifiers delctypeをnested-name-specifierで使えるようにする変更。簡単に言うと、delctype(T)::typeということができるようになる。 これは、日本から送った意見だ。だからどうということはないのだが。何を隠そう、信仰と勇気で有名なあの人が発見した問題だったはずだ。
「信仰と勇気で有名なあの人」って、すぐ上で auto
に関してリンクしたとこの中の人でしょう。decltypeが、varに対する autoのように自分の希望をかなえてくれる本物のキーワードだってことは C++0xに関する記述を断片的に目にするにつれ知っていたけど、最初から名前を修飾する目的に使用できたわけではないとは知らなかった。行動を起こした人がいるのだ。これはもう足を向けて寝られない。
最終更新: 2009-09-02T23:44+0900
キーワードファイルなんかはみんなでいじくって改善するのにちょうどいいものだと思ったら、やはり、CodeReposにあった。ただし PHPのみ。
キーワードの羅列には興味がないけど(php-mkkwd.phpは別)、正規表現キーワードは共有して他人のも見てみたいなあ(楽ができるから)。javascript_re_keywords.rkw。Ruby_re_keywords.rkw。
最終更新: 2009-08-31T09:35+0900
今のバージョンは 0.61。とりあえず気付いた点。
こんなエラーも出た。
Just-In-Time (JIT) デバッグを呼び出すための詳細については、 ダイアログ ボックスではなく、このメッセージの最後を参照してください。 ************** 例外テキスト ************** System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 AeroSnap.Application.SnapManager.SnapController.SnapTimer_Tick(Object sender, EventArgs e) 場所 System.Windows.Forms.Timer.OnTick(EventArgs e) 場所 System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) 場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 読み込まれたアセンブリ ************** mscorlib アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll ---------------------------------------- AeroSnapApp アセンブリ バージョン: 0.6.1.0 Win32 バージョン: 0.6.1.0 コードベース: file:///C:/Program%20Files%20(x86)/AeroSnap/AeroSnap.exe ---------------------------------------- System.Windows.Forms アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- System アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.Drawing アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- System.Configuration アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Xml アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- mscorlib.resources アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll ---------------------------------------- AeroSnap.Application アセンブリ バージョン: 0.6.1.0 Win32 バージョン: 0.6.1.0 コードベース: file:///C:/Program%20Files%20(x86)/AeroSnap/AeroSnap.Application.DLL ---------------------------------------- System.Windows.Forms.resources アセンブリ バージョン: 2.0.0.0 Win32 バージョン: 2.0.50727.4016 (NetFxQFE.050727-4000) コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_ja_b77a5c561934e089/System.Windows.Forms.resources.dll ---------------------------------------- ************** JIT デバッグ ************** Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、 またはコンピュータ (machine.config) の構成ファイルの jitDebugging 値を system.windows.forms セクションで設定しなければなりません。 アプリケーションはまた、デバッグを有効にしてコンパイルされなければ なりません。 例: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、 ハンドルされていない例外はすべてコンピュータに登録された JIT デバッガに設定されなければなりません。
最終更新: 2009-11-15T05:11+0900
188 :不明なデバイスさん:2009/08/03(月) 17:58:15 ID:Q6o7dXxt 好みがあるだろうからハッキリ書いておくと。 往年のThinkPadやDynabookのキーボードが好きだったという人。 こういう人はエクセリオ買ったら幸せになれる。 192 :不明なデバイスさん:2009/08/03(月) 18:45:23 ID:Q6o7dXxt 逆に言うと。 往年のThinkPadやDynabookのキーボードが嫌いだったという人。 こういう人がエクセリオ買うと不幸せになる。 193 :不明なデバイスさん:2009/08/03(月) 21:26:29 ID:0MB6rQRJ ThinkPadって一緒くたで言ってるけどどのThinkPadだよ。 TP600か?iシリーズの1200か?X32か?S30か?全部違うのわかってるか? 往年のとかひとくくりにしてるからネタ臭が消えないんだよ。 194 :不明なデバイスさん:2009/08/03(月) 22:27:36 ID:Q6o7dXxt そんな細かい型番まで憶えてないから「往年の」としか言えんのよ… そうね、日本IBM社製といおうか。「90年代の」といえばいい? 俺が知ってる(使ってた)のは90年代後半~2000年代初頭の頃。 DynaBookの方は2000年代初頭。まだスティック・ポイント(だっけ?)の頃。 どっちもWinの95~98辺りだなあ。XPの入ったThinkPadやDynaBookは 使った覚えがない。
はっはっはー。今日のタイトルに書いた「うっかり指乗せミスタイプ(ノートPCでよくある)」のノートPCってのは Windows98で、スティック・ポイントアキュポイントで、どっちが右(左)ボタン?ってなマウスボタン配置の DynaBookのことだ。不幸せになんかならないよね?逆ではなくて裏だし、いずれにしても元の命題の真偽とは関連しないから大丈夫<うるさい
楽天の FILCOキーボードショップは 3000以上で送料無料だったんだけど、箱つぶれ Excellioは 2980円で 20円足りない。キートップリムーバー(315円)をセットにした。箱も説明書もなくビニール袋に入ってるだけだったので使い方に困ったが、針金部分が同じように見えて微妙に長さが違うので、長い方をキートップに引っかけて左右に広げてからキーの奥にもぐり込ませるみたい。パンタグラフ式の Excellioには使えないので Majestouch用です。
箱つぶれ特価品なのに箱をつぶす手間もかけていない。NTT-Xストアの箱汚れ品と同じあからさまな建前商法。全然悪くはないけど。
評判通りキーは重い。ストロークは普通のパンタグラフ並に浅いが、もう少し深い方がいい。深くすると押し下げ時の左右のずれが大きくなるらしいが。深ければキータッチは軽くてもミスタイプの原因にならないと思う(これは Realforceルート?)。裏を返せば、ストロークが浅いのだから今の重さはちょうどいい。
ぺちぺちにちゃにちゃ音がするものの、そこはパンタグラフ。Microsoft Wired Desktop 500(RT2300, SN25Pのために買った間に合わせ)よりずっと静か。指がキートップを叩く音が支配的。Tab、左Ctrl、左Alt、変換キーだけはキートップからチャラチャラした音が目立つ。
左Alt手前のフレームが浮いている。手前でなければ気付かなかったのに、手のひらを置いたときに気付いてしまった。残念。
前のキーボードの慣れがあるので、Home, Endの配置はこうなった。
Home | End | PageUp |
Delete | Delete | PageDown |
右Windowsキーは右Altになった。
以下にレジストリの設定。
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,05,00,00,00,47,e0,52,e0,4f,e0,47,e0,\ 53,e0,4f,e0,38,e0,5c,e0,00,00,00,00
バイナリの意味は以下の通り。
00 00 00 00 # バージョン。0固定。 00 00 00 00 # フラグ。0固定。 05 00 00 00 # ターミネータ込みで 00000005個のマップエントリが続く。 47 e0 52 e0 # Insert(e0 52) → Home(e0 47) 4f e0 47 e0 # Home(e0 47) → End(e0 4f) 53 e0 4f e0 # End(e0 4f) → Delete(e0 53) 38 e0 5c e0 # 右Win(e0 5c) → 右Alt(e0 38) 00 00 00 00 # 終了。ターミネータがあるのに個数を入力させたのは何故?
(使えるかもしれない)スキャンコード一覧 > Keyboard scancodes: Keyboard scancodes
明日は 25日に注文した FKBN108ML/NBが来るんだけど、二枚もどうすんだ。
PS/2キーボードじゃないから S3からホットキーでのレジュームができなくなった。「Resume from S3 by USB Device (Enable/Disable)」みたいな設定が BIOSにあるけど、キーに触っただけで復帰するのは勘弁してほしい―だからマウスによるレジュームも無効にしてる―からやはり PS/2キーボードだな。
箱の裏面の白い部分がものすごく黄ばんでる(ような色をしてる)。角のほうにわずかに白い部分があるから、もとは全部真っ白だったのかも。(このへんが「箱つぶれ」?)
Excellioをマウス用の USB->PS/2変換コネクタを通して接続してみたけど、やっぱり使えず、USB専用キーボードだった。ところで、確認を終えて元の通りに繋ぎ直しても、PS/2に接続していたトラックボールが使えなくなっていた。BIOSセットアップに入ってトラックボールをいじると、右移動=F5、右ボタン=F6みたいにキーボード扱い。くまった。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout にも設定してみて改善するか様子を見る。
CapsLockの位置に左Ctrlがあると、左Ctrlと組み合わせられるキーが増えるね。これは良い。
最終更新: 2013-09-14T00:17+0900
使えないのを知っていて以前から HikiDocフォーマットでタイトルを書いていた。>>20090823 >>20090403
これを HTML化するのは意外と簡単。プラグインでできる。
add_title_proc {|date, title| if title.index('<') title.sub(/<span class="title">([^<>]+)<\/span>/){ %/<div class="title">#{WikiSection.new(CGI.unescapeHTML $1).body_to_html}<\/div>/ } else WikiSection.new(CGI.unescapeHTML title).body_to_html end }
今日のタイトルに含まれる「==日記==ブログ」という部分があまりにわかりにくかったので、HTML化してみた次第。URL自動リンクも有効になって、うまうま。
勘違い発覚。Headingがブロック要素を包含できる気がしていたが、Heading自身がブロック要素だということの記憶違い。<div>を含めちゃだめだ。
修正。
add_title_proc {|date, title| inline_or_nil = lambda{|src| lines = src.split(/\r?\n/) return nil if 1 < lines.length html = WikiSection.new(lines.first).body_to_html return nil if html[0,3] != '<p>' or html[-4,4] != '</p>' return html } if title.index('<') title.sub(/<span class="title">([^<>]+)<\/span>/){|_0| html = inline_or_nil.call(CGI.unescapeHTML $1) html ? %/<span class="title">#{html}<\/span>/ : _0 } else inline_or_nil.call(CGI.unescapeHTML title) or title end rescue title }
それなりにチェックはしてるけど、ブロック要素を返すプラグインを呼んだりしたら(HTMLの文法的に)即アウト。
最終更新: 2010-02-02T01:32+0900
3台目は CATEYE CC-RD300W。無線。現在/平均/最高速度計測。ケイデンス非対応。
リセットを繰り返していた CC-MC100W が、とうとう電池を替えても画面が映らなくなったので買い換え。
平均・最高ケイデンスを記録できる CC-TR200DW V2C が第一候補だったが、ラップ機能が不要なのと、測定結果を 14まで保存できるがその記録の中に積算距離(オド)が含まれていないせいで役に立たない(オドだけがログのプライマリキーになれる)のと、5分で節電モードに入ったあとの計測再開が手動なのが不満。
CC-RD300Wより新しい CC-RD400DW というのもあるが、付加機能のケイデンス機能が現在ケイデンスの表示にしか対応していない。センサー部の電池寿命が他機種の多くの半分にあたる半年間しかない。より高機能な V2Cとの実勢価格差が¥2000というのも躊躇させる。ちなみに付加機能はケイデンスだけでなく無線の ID対応というのもある。
結局、壊れた CC-MC100Wより機能が絞られてるわりにお高い CC-RD300W にした。最低限必要な機能は揃ってるし、ちょくちょく落っことすので高級機はもったいない。走行中のモードの切り替えはやりやすくなっているが、ブラケットから外した状態ではむしろやりにくい。俺の使い方では、外してからの操作の方が実は多かったり。ブラケットからの取り外しも固くてやりにくい。ツメが削れて外しやすくなってきたときは、走行中に落っこちやすくなったとき。センサーは CC-MC100Wのが流用できた(どちらも無線 ID非対応だから)。
ダメ。ボタン長押しでリセットというのが、本体自体がボタンになってることと相まって、誤爆しまくり。HL-EL400 のバンドが走行中に開かないように(すぐに固定がゆるむへなちょこ)、CC-MC100Wでやっていたように、CC-RD300Wをバンドの上に重ねて取り付けたらシーソーみたいにボタンが押し下げ状態になってリセット。本体をブラケットから取り外すときも、もたもたしないでガッと外さないとリセット。リセットボタンを新設して、ブラケットとの脱着方法を考えなければ次はない。
最終更新: 2010-05-19T17:19+0900
確かに変ですが、ここの部分をきっちりやろうとするとレイアウト処理性能にシビアに影響するみたいです。 ざっと試したところでは、ファイル読み込みで1.5~3倍くらいの処理時間がかかるようになってしまいました。 右端で折り返す設定で画面幅を変化させるときの応答にも同様に効いてきます。
さらりと、できなくはないと書かれているが、どうやるんだろう?
sakura_core\view\colors\CColorStrategy.cpp の後半(「色開始」部分)をこう書きかえてみても中途半端な結果。ファイルの内容は同じでも、文字の追加や削除、アンドゥなどの操作によって、意図通りの結果になったり現行通りだったり。処理速度に関しては、5MBのファイルを開いてファイルタイプをいろいろ切り替えてみたら、変更前よりプログレスバーの進みが明らかに遅い。1.5から 2倍というのは体感に一致している。
bool CColorStrategyPool::CheckColorMODE( CColorStrategy** ppcColorStrategy, //!< [in/out] int nPos, const CStringRef& cLineStr ) { //色終了 if(*ppcColorStrategy){ if((*ppcColorStrategy)->EndColor(cLineStr,nPos)){ *ppcColorStrategy = NULL; return true; } } //色開始 if(!*ppcColorStrategy){ for(int i = 0; i < (int)m_vStrategies.size(); ++i) { if(m_vStrategies[i]->BeginColor(cLineStr, nPos)) { *ppcColorStrategy = m_vStrategies[i]; break; } } } return false; }
違う。CheckColorMODE()のときに正規表現キーワードは働いてない。そもそも CheckColorMODE()の目的って? CLayoutMgr::Match_Quote()がとりあえず行末を返す( return cLineStr.GetLength(); )のって? それでどうやって行をまたげているんだろう。
白々しさ爆発だけど書く。下は sakura/trunk2/sakura_core/doc/CLayoutMgr_DoLayout.cpp から削除されたコード(の一部)。この部分が修正を加えられたうえで sakura_core/view/colors/CColorStrategy.cppに移動している。return falseを使わずに breakしているあたりがさらに嘘くささを増してるけど、別に、このときの変更をロールバックしたかったわけじゃない。知らなかったし、参考にしたのは SColorStrategyInfo::DoChangeColor()の方。
if(!*ppcColorStrategy){ CColorStrategyPool* pool = CColorStrategyPool::Instance(); for(int i=0;i<pool->GetStrategyCount();i++){ CColorStrategy* pcSample = pool->GetStrategy(i); if(pcSample->BeginColor(cLineStr,nPos)){ *ppcColorStrategy = pcSample; //bRet = true; break; } } }
俺が感じたプログレスバーの進みの遅さはたぶん基底クラスからの仮想関数の呼び出しに伴うものだったんだろう。一歩戻って進んで、ふりだしに戻る。
CheckColorMODE()がないとクォーテーション文字列が行をまたげない。
レイアウト(禁則処理とか折り返しとか)とクォーテーション文字列(+コメント)の関係がわからない。癒着してるなら、ボトルネックにもなってるらしい CheckColorMODE()をなくして、正規表現キーワードが行をまたぐことでカバーしたい。
http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&v=4079#4083
サクラエディタの色分け解析ルーチンは、全部で3つあって、
- 行データの変更に、各レイアウト行の先頭色を決めるもの(CLayoutMgr)
- 実際の作画時に各文字の色を決定しつつ作画するもの(CEditView::OnPaint)
- 対括弧の色を戻すときに各文字の色を決定するもの(CEditView::GetColorIndex)
最終更新: 2009-09-24T04:29+0900
方法は sakura/trunk2/sakura_core/sakura_rc.rcから CBS_SORTを一か所削除するだけでした。CRecentImp.AppendItem()が名前に反してあえて「アイテムを先頭に追加」しているけど、俺もそれが自然だと思う。「開く...(ドロップダウン)」ツールバーボタンから出るポップアップメニューには CBS_SORTみたいなフラグがないのだろう。ソートはされていない。望み通り。でも Windowsはスタートメニューの最近使った項目をファイル名でソートしてる。そういう考え方もあるんだろう。好きにやります。
ダイアログつながりで、拡張子補完も完全に切った。お節介は不要。拡張子補完って主にエクスプローラで拡張子を隠したままにしてる人のためにあると思う。
最終更新: 2009-08-24T23:53+0900
STAY~夜明けのSoul~(初回限定盤A)(DVD付)
GIZA
¥ 2,843
たまにアマゾンを検索して CDの発売を知る。
最終更新: 2009-08-28T23:41+0900
表示方法はこう。
# coding: utf-8 require 'date' add_section_leave_proc{|date, index| diary = @diaries[date.strftime('%Y%m%d')] next unless diary # in case @mode == 'preview' section, sidx = nil, 0 diary.each_section{|sec| sidx+=1 if sidx == index section = sec break end } lm = section.last_modified rescue next next unless lm lm = DateTime.new(*(lm.utc.to_a.values_at(5,4,3,2,1,0))).new_offset(Rational(135,360)) # 日本時間 lm.strftime %<<p class="lastmodified">最終更新: %Y-%m-%dT%H:%M%Z</p>> # 色分けテストとして、あえてタグと同じアングルブラケットで囲ってみた。 }
DateTimeのオフセットの単位がわからんかった。ブラウザのブックマークが「Rubyリファレンスマニュアル - 20051129」だからなあ。るりまには載ってるかも。とりあえず「fraction of a day」(date.rb documented by William Webber)とのこと。慣れない Rationalを使ったもんだから Rational(135,360)と書くべき所に Rational(135/360)と書いてしまい、オフセット 0の結果にしばし首をひねった。Rational()の呼び出しより引数の評価の方が先だからやむをえないことだけど、分数を表現するのにはやっぱり / を使いたい(使ってしまった)。Fixnumと Bignumのシームレスな移行のように、 Rationalへも融通無碍に切り替わって欲しい。利用者には Numericだけを利用しているように思わせる、ということ。必要なときに整数化(小数化)メソッドを呼ぶし、変数に整数(や分母を 1に約分できる分数)が入ってることを利用者が知っていれば、そのまま整数を前提としたメソッドを呼んだりできるといい。変わるのは、整数型の演算結果が整数型であることを前提にした(旧来の言語の呪縛に過ぎない)切り捨て除算がなくなる以外にあるだろうか。それも Pythonみたいに // を割り当てれば、無駄な有理数化、再整数化を避けられる。実感に基づいて、既に通った(んじゃなかったっけな?)議論を蒸し返してみました。俺は整数と小数の垣根を取っ払った JavaScriptを、最初は驚いたけど、評価している。JavaScriptのシンプルさが好きだ。セミコロンインサーションも、Cより怠けることを許していながら、Rubyの改行をターミネータにするやり方よりフォーマットが自由で、最高にバランスがいい(はまるのは returnだけだ)。require 'rational'; 10.to_r/2 とか不格好すぎるでしょ。ハードウェアと型から離れて本質に戻りましょう。算数で割り算と分数は同じものだったはずだ。<追記@2009-08-22>require 'mathn' がつまり Fixnumと Bignumと Rational(と Complex)をより親密にするおまじないでした(いまさら何を)。mathnって、読めない(マスエヌ?)のと名前から中身が想像できないのとで意識せず無視してたけど、Rationalとセットで見かけることが多かった気がする。それはそうと、Rationalや Complexの細々した議論に埋もれて全体の方向性が見えない。Ruby 2.0あたりでは require 'mathn' が不要になっているんだろうか……。</追記>
るりまにはスタンドアロンサーバー版と chm版より、スタティック HTML版を用意して欲しいなあ。chmだと閲覧が IEベースになってしまって、文字の大きさやスクロール量、進む戻るが自由にならなくて使いにくい。マニュアルサーバーを起動しておくのは嫌ですよ。view.cgiで CGIしようとしたらリンクがルートからの絶対アドレスなせいで Not Found。Apacheは既に動いてるから、名前ベースのバーチャルホストや待ち受けポートの追加で、るりまに一つのホスト(or ポート)を与えることはできると思うけど……大仰なのでやらない。base_urlのオプションが用意されてるから view.cgiの設定を間違えてるだけの気もするけど……わからない。
組み込みの Timeが UTCと localtimeしか扱わないのがもったいない。任意のオフセットに基づいた日時を出力したいだけだから、DateTimeは牛刀な印象がある。<追記@2009-08-21>よーくかんがえよー(命令形)、・・・・・・・・・ー。なんてことはない。オフセット分だけ未来(過去)の UTC時刻が即ちローカルタイムだよ。当たり前すぎて俺が何を言いたいのかわからないでしょう。先のスクリプト片の最後は DateTimeを使わずにこう書ける、ということです。
lm = section.last_modified rescue next next unless lm offset = 9 * 60 * 60 # 秒 lm_local = (lm + offset).utc # UTCと見せかけて lmの地方時。 %<<p class="lastmodified">最終更新: %d-%02d-%02dT%02d:%02d%s%+03d%02d</p>> % [lm_local.year, lm_local.month, lm_local.day, lm_local.hour, lm_local.min, offset/60/60, offset/60%60] }
……てなことを、makerss.rbの中の TDiary::RDFSection#time_stringが
g = @time.dup.gmtime l = Time::local( g.year, g.month, g.day, g.hour, g.min, g.sec )
gmtimeに基づく年月日時分秒からローカルタイムを作っている部分を見ていて(遅まきながら)気付いた。gmtimeも localtimeも皮をむけば UNIX epochからの経過秒に過ぎないんだから、どういう意味を持たせるかはこちらの自由だった。まあ、比較はできなくなりますが……(lm.to_i ≠ lm_local.to_i はその意味(同じ瞬間の別表現であること)を考えると望ましくない結果)。</追記>
脱線終了。表示するまでの仕込みがこんな感じ。
主に plugin/makerss.rbからの要請で更新日時を記録したいので、ちょっとした修正では最終更新日時は更新されない。とかいいながら、この日記には変更のあったセクションを見つける別の方法が入っている(20090705p01)ので makerss.rbが最終更新日時を利用するようにはしていない。
最初にポストされた時刻も有用だろうか? 日記だから最初にポストされた日はほとんど確定してるし、時刻まで知りたいとも思わないけど。
WikiSectionに last_modifiedプロパティをくっつけたけど、WikiSection自体はこれを管理してなくて、外部から操作されるだけだってのがいけてない。やっぱり to_src()と initialize()が DUMP & LOADを担う(last_modifiedや authorその他の情報をフォーマットに含める)か、メソッド群を整備してこちらの望む操作を WikiDiary、WikiSection自身にやってもらう(自分でやるから付帯情報のコピー漏れも発生しない道理)のがいい。
「編集」でセクションを追加したとき、更新日時のコピー処理でのぬるぽを修正。(if old_section and...を追加した)