/ 最近 .rdf 追記 設定 本棚

脳log[2009-04-23~]



2009年04月23日 (木) [COSMOS] MSI 790FX-GD70の BIOSv1.2出た。出たのは今日だけど BIOS自体は 2009-03-31のものみたい。


2009年04月21日 (火) 壁紙を 790FX-GD70の全体図にした。基板萌え。

最終更新: 2009-12-30T04:34+0900

[COSMOS] はじめての、いわゆる「自作」パソコン。

ケースCoolerMaster COSMOS 1000¥27000パーツ決定はこのケースから。というかこのケースの(値段の高さの)せいで BTOから自作へ方針転換。気密性と静音指向、それと、らしくない見た目が決め手。
ケースオプションCoolerMaster SIDE WINDOW BLACK (for COSMOS S)¥6500吸音材はなくなるけど中が見えると楽しい。(自分で組んだからなおさら)
PSUOwltech Seasonic M12 600W (SS-600HW)¥16500効率はより新しい M12Dシリーズのほうが優れるが、一番低い容量で 750W。そんなには不要。
M/BMSI 790FX-GD70 (MS-7577)¥20000シックで良い。これを見た後ではピンクとか黄色とか青とか、考えられない。ASUSだけは黒がいい感じだけどオンボードサウンドの評価がやけに低い。
CPUAMD PhenomⅡ X3 720 Black Edition (Socket AM3)¥15000 Windowsスコア 5.8(Windows 7では 6.7)。コア数よりクロック周波数。あと TDPの(Core i7と比べたときの)低さ。
CPUクーラーCoolerMaster V8¥10000見た目と存在感のみで選んだ。ケースと同じ CoolerMaster製品なので目に入った。
RAMBUFFALO FIRESTIX DDR3-1066 2×2GiB (FSX1333D3G-K4G)¥7800Windowsスコア 5.9(7.5)。赤いヒートシンクが良い。それだけ。そんなわけだから上位の FireStix Infernoも下位の FireStix Heatも不可だし、オーバークロックもしません。DDR3は 3枚組みが多くて閉口した。DDR3は Double-Data-Rate 3の略だっての。i7だけじゃないっての。
VGASAPPHIRE ATI Radeon X1600 (DDR2 512MiB)SN25Pから移植Windowsスコア 4.5(4.5)(Aero)、4.9(4.6)(Game)。
HDDいくつかSN25Pから OSごと移植Windowsスコア 5.9(5.9)。Windowsのライセンスを有効にするために電話が必要だった*
光学ドライブDVDいろいろ対応(IDE接続)SN25Pから移植
FDDふつーのSN25Pから移植M/B付属のケーブルは 5インチベイの上から 3段目までしか届かなかった。エアフローを遮るので普段ケーブルは繋がない。
RAIDHighPoint RocketRaid 2302SN25Pから移植

 CoolerMaster COSMOSについて

COSMOSと 790FX-GD70の組み合わせは良い。ケースのフロントパネルのコネクタが全て M/Bに接続できてはりぼてにならない。COSMOSがはじめからそなえるケースファン 4つも SYSFAN1/2/3/4に過不足なくつなげられる。COSMOSの HDDベイは 6つ。M/Bの SB750がサポートする SATAポートも 6つ。JMicronが追加で 2つの SATAポートを提供するので、片方をフロントパネルの eSATAに使っている(ホットプラグはできないかも。HDDのドライバ次第だと思うが)。もう片方は SATA接続の Blu-rayドライブでもつなげばいいだろう。

COSMOSの電源LEDは青色で点灯・消灯の 2モード。HDDアクセスLEDも青色。なんで青色。なんで同じ色。もうね、青色LEDはいらないよ。電源は緑、HDDはオレンジでいいじゃない。

今使ってるディスプレイ―MITSUBISHI VISEO MDT243WGの電源LEDも青色で、点灯、点滅、消灯の 3モード。目に刺さる青色というのがまず間違い。明るさを 100段階で調節できて 0にすると常時消灯もできるがそれでは役目を果たしていないし、気にならなくなるまで暗くすると今度は視認性が悪い。青色でなければそこそこ明るくても気にならなかったはずだ。サスペンドモードを点滅で表したのが二つ目の間違い。点滅周期(約4秒)と同じだけの時間見つめていないとサスペンドモードと電源OFFを区別できない。リモコンの感度が悪いことと相まって、PCを休止する->モニタの電源を切る->切れたかな?->じっと見つめて、暗くて視認性の悪い LEDが点滅していないことを確認する、という面倒を毎日負わされる。(VISEOの前に使っていた BenQ FP937S+は電源ONが黄緑、サスペンドがオレンジだった。調節機能はなかったが不足もなかった)

閑話休題。COSMOSについて。COSMOSの天板は他で言われているように振動して音を出す。いまは無事でもそのうち音を出すようになります。何か物を置くか、内側におもりを貼り付けでもすればよいか。>>>プチプチを詰めました。

排気ファン 3つに囲まれた CPU領域の冷却は申し分がない。5インチベイ 2つをつぶして 12cmファンを取り付けられる(そのためのブラケットは COSMOSに余分に付属していた) HDD領域も、位置が吸気口の直上ということもあって比較的問題がない。拡張スロット領域のグラフィックカードの冷却が COSMOS 1000 一番の癌。どうにかして空気の流れをつくらなければいけない。グラフィックカードに付いている小さくて高回転のファンが現在の最大の騒音源なので、この領域の冷却が静音化にもつながる喫緊の課題。Zalman VNF100は V8や DrMOSのヒートシンクと干渉しそうなので、気は乗らないが Scythe MUSASHIをとりあえず注文した。

今はグラフィックカードのファンが最大の騒音源で目立っているが、これを止めると、静音ケースといえども 3つある排気ファンの音が普通に聞こえてくる。電源と HDD上の吸気ファンの音は多分聞こえていない。排気ファンの交換がこの後の課題だが、空気の流れのあるところに必ず音があるような気がしないでもない。となれば隔離か。>>>夏以外は回転数を 50-75%にしぼることで相当改善する。

 MSI 790FX-GD70について

  • 温度はどこで計ってるの? (温度が高くても対処のしようがない)
  • Northbridge用のフィルタドライバがインストールされない。(何度インストーラを起動してもドライバが最新でないと表示される)
  • AMD OverDriveが起動できない。(付属CDの Ver.2.1.5、最新の Ver.2.1.6共に。OSのクリーンインストールをしないとダメなのかも)
  • SpeedFanで電圧や SYSFAN2/4、CPUFANの回転数がとれない。(MSIのユーティリティでも SYSFAN2/4は 0rpmになっているし、IOH/ICHの電圧も 0V。BIOSには 5つすべての回転数が表示されている)
  • BIOS設定「Power On by PS/2 Keyboard」を有効にしても機能しない。PS/2に常時給電するにはどうすればいい?
  • 自家製ユーティリティ「GreenPowerCenterⅡ」が ICHを ATI SB710だとおっしゃいますが SB750ではなくて?
  • SpeedFan 4.37はこのように報告する

    Win9x:NO  64Bit:YES  GiveIO:NO  SpeedFan:YES
    Scanning ISA BUS at $0290...
    Scanning AtiIgp SMBus at $0B00...
    F75387 found on SMBus at $2E
    F75133S found on SMBus at $36

    GreenPowerCenterⅡによると LPC I/Oは Fintek F71889Fだ。(OC Dialの上に蟻っぽいマークのチップがあって、たしかに Fitek F71889?と読める)

  • M/B上の赤色の HDDアクセス LEDを消灯したいのですが……。
  • スペック表でやたら IEEE1394(rear, internal)が Optionalだと主張されているがどういう意味? 使えるよ。
  • まさか、いまどき Wake On LANに対応してなかったりするの? (そういう表示や設定を一切目にしていない。いや、LAN Option ROM (Enable/Disable)というのがそうかも。PXE Boot?)
  • PC-IDEAで買ったんだけど、マニュアルの各国語の中に日本語がないと思ったら、ヨーロッパ版だった。(だからどうということもない。USB2.0 2ポートを外出しするブラケットが付いていた)

* これが二回目の電話認証なんだけどいずれも、シリアルを伝えて、新しいの聞いて、はい終了。向こうにはどういう情報が表示されているのだろう?

 「Any Key」「Ctrl+Esc」「Ctrl+F1」「Ctrl+Space」から選択。電源ボタンも変わらず使える。「Password」を選べるのは AwardBIOS。これは AMI BIOS。

 F75133Sは not usedだとも。


2009年04月12日 (日) [COSMOS] 届いた。大きいのはわかってたはずなのに、わかってなかった。しゃれにならん。M/Bと電源と CPUと CPUクーラーとメモリを注文した。オプションの透明のサイドパネルを選んだものだからパーツの選択肢が狭まって困る。気違いじみた色使いのマザーボードは使いたくないよ。


2009年04月10日 (金) フロントに IEEE1394が必要。3G iPodのために。

[][COSMOS][SN25P] ["CoolerMaster COSMOS ATX、Full Tower 電源なし RC-1000-KSN1-GP"]

本当に楽しみだから、待ちきれずに届く前に書いてしまう。次の PCのためにケースを買った。

 現在の SN25Pの不満点

  1. HDD冷却用の小さいファンの片方から、常に甲高いチリチリ音。(高い音は本当に気に障る。ファンは大きいものに限る)
  2. メモリの最大搭載量が 1GiB×2。しかも DDR。(何のための 64-bit OSか)
  3. GPUと HDDの冷却能力不足。(GPUをファンレスにするのは熱で無理。冷却のために 2スロットを占有するボードはスペースで無理。選択肢が少ない)
  4. CPUソケットが Socket939。(もはや新しい CPUは手に入らない。今の CPUは Athlon 64 X2 3800+ 2.00GHz)

 次の PCに求めるもの

  1. 没個性的でないデザイン・機能
  2. 静音性
  3. 限られた吸気口(フィルタ付き)
  4. キーボードで電源ON (SN25Pは任意のキー列(パスワード)で電源を入れられる。Award BIOSの機能らしい)
  5. 省電力
  6. 省スペース
  7. 潤沢なメモリ (DDR3 2GiB×3 or DDR2 2GiB×4)
  8. (Socket AM3)
  9. (PCI Express 2.0スロット)

 思考経路

いかにも PCという見た目の無骨なタワー型、ミドルタワー型、スリムタイプの PCには全くそそられない。最近はメーカーが独自に作り込んだ PC(ソニーの VAIO type?とか、HPの TouchSmart PCとか)に注目している。でもメーカーのお仕着せは御免なわけで、Shuttleのキューブ型ベアボーンはメーカーの個性と自由さのバランスがちょうど良かった。今、物欲を一番そそられるのは Appleの Mac miniと、HPの TouchSmart PC。どちらも唯一無二のできばえだと思う。ただ、Mac miniは MacであるがゆえにメインPCになれないし、TouchSmart PCは "Personal" Computerにするのはもったいない。デザインパネルをまとってキューブ型 PCをもういちど……は性能がいまいちだし静音も冷却も限界が知れてるので避けたい。コアを増やすのがはやってる今、Xeonを二個積んでデュアル CPUがやりたいな……(構成カスタマイズ中)……げ、40万円。Quadro FX高すぎ。ゲーミング PCは性能に問題はないし、個性的なんだけど全体に厨のにおいが漂っていて好きになれないな……、200mm大径ファン!前面エアフィルタ!天面にコネクタ・電源スイッチを配置! Antec Nine Hundred Two!素晴らしい! 青色LEDと 9つもある(とはいえ 3.25インチHDDもここに格納する) 5インチベイがいかにもゲーミングPC、いかにも自作PCといった風情でマイナスポイントだけど、合理的な天面アクセスは評価が高い。使える上にパッと見でも(凡百のケースと)ちょっと違うのが良い。ここで COSMOS登場。200mmファンこそ持たないものの、密閉構造と最初から備えた静音対策、落ち着いた、PCケースっぽくないデザインが高評価。大きさだけが難点に思えるも、Extended ATXに対応、Dual Xeonも可能、と考えればむしろ利点。

 BTO


2009年04月04日 (土) Safariってば Windowsにあっても、文字のきれいさだけでなく、画像の色でも優秀なのね。> http://www.color.org/version4html.xalter


2009年04月03日 (金) [tDiary] エスパー待ちで想像ついちゃったww > エスパー登場(ときどきの雑記帖 i戦士篇 2009年4月(上旬))

最終更新: 2010-01-30T00:03+0900

[SN25P] マイクロソフトのキー配置が使いやすい理由。(たんなる慣れかも)

キーといっても 6つのキーのこと。即ち Delete, Insert, Home, End, PageUp, PageDown。MSのキー配置といっても MSオリジナルのとか MSキーボード全てのという意味ではなく、自分の使ってる MSキーボードのキー配置という意味。

省スペースでない一般のキーボードはこうなってる。

InsertHomePageUp
DeleteEndPageDown

MSの今使ってるキーボードはこう。

HomeEnd
InsertPageUp
DeletePageDown

縦長の配置になっている。

一般のキーボードでは Home, Endボタンが押しづらく(探りづらく)感じる。MSの配置では強いていえば Insertが押しづらいか。けれど Insertキーの出番は挿入・置換モードの切り替えとコピー(Shiftキー併用)だけで、どちらも全く使わないので一向に構わない。

  1. 押しづらく感じるキーの共通点は何か。辺の真ん中にあること。
  2. では、MS配置の PageUpキーを押しづらく感じないのはなぜか。PageDownとセットにして辺でとらえてるから。
  3. 一般的な配置の Home, Endキーを辺でとらえられないのはなぜか。隣の、探りやすい、角のキーと関連がないから。

終了。


 追記@2009-08-30

一般的な配置の場合、Insert、Home、Endをローテートして、

HomeEndPageUp
DeleteInsertPageDown

こうしたら、左上辺(Home, End)、右辺(PageUp, PageDown)、左下角(Delete)として、よく使うキーを捉えられるんでは。(Insertはどうあっても埋もれる運命)

Majestouchがもうじき届くのでキーマップとキートップを変更してみよう。HKLMを利用するとマシン単位の変更になるけど、キーボード本体や、専用ドライバを使ってこの変更ができると他のキーボードへの影響がなくて良いのだけど。

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

通りすがりのTブラウジングしていたらたまたまこの記事を見つけました。 キー配置の意見は僕も全く同じです。 次キーボードを買い換える..


2009年03月25日 (水) MDT243WGの、非難囂々のフレームは通称 wktk(枠テカ)。PS3に合わせたんだって。つや消しのサテンブラックでも、wktkクリアピアノブラックでもどっちでも安い方でいい。

[][MDT243WG][SN25P] ["三菱電機 MDT243WG 三菱マルチメディアワイド液晶ディスプレイ MDT243WG"]

今使っている、今の PCと同時に買ったディスプレイは BenQ FP937S+。当時 33000円也。>20050830p01

 新旧モニタ スペック比較

(旧) BenQ FP937S+(新) MITSUBISHI MDT243WG
サイズ19インチ(376mmx301mm)24インチ(518mm×324mm)大きくなった。
解像度1280×10241920×1200縦にも横にも広くなった。縦が 1080以上だと黒帯がでて嫌いって人がいるけど、俺はむしろ黒帯がないと、知らないところで上下か左右がカットされていそうで気になる。
横:縦5:416:10ワイドになった。もうスクウェアにはこだわらない。縦置き二画面より、ワイド大画面に二つのウィンドウを並べる方が手軽(Windows 7では特に)。タスクバー領域のために 16:9より 16:10を選ぶ。
画素ピッチ0.294mm0.270mm画素の密度が上がった。文字が小さくなるのは dpiで調節する(追記:調節する必要を感じないのでそのまま)。Petzoldさんの本に、GetSystemMetrics()から得られる解像度や dpiに関係する値を基にした計算方法が載っていたが、理解をあきらめた経緯がある。アプリケーション作者には理解してもらいたい。
パネルTN (Samsung, AUO)A-MVA (AUO)TNから VAに。旧モニタが初めての液晶モニタだったためか、スクロール中の文字が読めないことに戸惑ったが、TNパネルに起因する不満はなかった。注視してる範囲なんて狭いから視野角の狭さも気にならなかった。MDT243WGでも左右端に輝度の落ち込みがある。気にしなーい。
輝度300cd/㎡500cd/㎡500は明るすぎ。今のモニタでもブライトネス 0で使っている。最初は最高輝度 250cd/㎡の BenQ G2400WDを買う予定だった(輝度半分。消費電力も半分。価格は 3分の 1)。ブライトネス 0で MP Modeをレベル 3にしてもまだ明るい。暗闇で使うモニタではない。白背景だと本が読める。黒背景でも辛うじてだが文字が判別できる。
コントラスト比700:11000:1(2000:1 CRO)VAパネルの黒に期待。
視野角(上下/左右)135°/150°178°/178°(コントラスト比10)TNは見下ろす角度以外では使い物にならないので、ごろ寝も縦置きもできない。カタログスペックで VAパネルは IPSと並んでるけど、色の変化なども含めると実用的には IPSより確実に劣るらしい。
応答速度8ms6ms (gray to gray), 16ms旧モニタは黒背景に白文字が覿面に弱かった。最短時間が 6msだとか 8msだとかより、最悪の場合にどこまで落ち込むかの方に注目したい。
入力DVI-D, ミニD-SUB 15ピンDVI-D(HDCP対応), ミニD-SUB 15ピン, HDMI×2, D5端子, S端子, コンポジットPS2を、映ればもうけもんみたいな NOVAC EntaVision HDで接続するのをやめたかった。PS2を捨てられれば MITSUBISHI RDT261WHを買っていた。
消費電力40W(最大)110W(最大)画面サイズの差を差し引いても、TNパネルは消費電力と価格の低さが魅力。
VESAマウント100mm×100mm200mm×100mm200×100は一般的じゃない。
その他グランツーリスモをやっていると目の裏が痛くなる。リモコン付き。前後傾以外に首振り、高さ調節可能。前モデルと同様、ミュート時に OSDが出続ける。モードを切り替えたときに右上にでる情報表示(半透明)がうまくタイトルバーとスクロールバーを避けてる。リモコンのミュートボタンがなぜか高速リピート動作。

海外レビュー > NEC MultiSync 24WMGX3 Review


2009年03月23日 (月) Internet Explorer 8。Firefox3でも IE8betaでも全くダウンロードが始まらないから Safariでダウンロード中。使って欲しくないんだな。


2009年03月17日 (火) XRegExp(シンプルな正規表現しか使えない JavaScriptにモダンな拡張機能を提供する JavaScriptライブラリ)の作者が『Regular Expressions Cookbook』を書いた(共著)って。気になるけどクックブックってどんなんなんだろう。「読める」本ではないような不安があるんだけど。

[][正規表現] [ペーパーバック] Jan Goyvaerts, Steven Levithan【Regular Expression Cookbook】 Oreilly & Associates Inc

Regular Expression Cookbook Regular Expression Cookbook
Jan Goyvaerts/Steven Levithan
Oreilly & Associates Inc
¥ 4,073

XRegExp: JavaScript regex library」は、「SyntaxHighlighter(Ver.2.0)」で使われていたので知った。XRegExpの作者が、本の著者の一人、Steven Levithan。

XRegExp(Ver.0.6.1)が、Firefox 2,3、Internet Explorer 5.5-8β1、Safari 3.1、Opera 9.27の JavaScriptに付け加えて利用可能にする正規表現の機能は

  •  名前付きキャプチャグループ

    後方参照も可。String.replace()での使用も可。

  •  s(singleline)フラグ

    「.」が改行にもマッチ。

  •  x(extended)フラグ

    ほとんどの空白を無意味なものにしたり(=パターンを自由にインデントできる)、行コメント(#から改行まで)を利用可能にする。

  •  インラインコメント

    (?#ここにコメント)

  •  Unicode Properties & Blocks サポート

    こんなの。\p{L}, \p{M}, \p{N}, \p{InHiragana}, \p{InKatakana}。否定は大文字のPで \P{}。

    文字集合の中で使えないという制限があるが、若干の工夫でなんとかなる。

使い所が限定されていそうだったり、使い方が難しそうな機能として

  •  XRegExp.matchRecursive(string, left, right, modifiers, options)

    (独り言) 名前付きキャプチャグループをサポートしたなら、そのキャプチャ結果をスタックして、そこにパターンを繰り返し適用する書き方を用意することで、matchRecursive()なんてスペシャルメソッドは不要にできるのでは? <何を言ってるのか自分でわかってないよ

    XRegExpのコンストラクタに「脳log[2008-01-11-p01] 鬼車すごい。正規表現で再帰ができる。」で書いたようなパターン文字列を渡して、再帰を認識するマッチングを行いたいです。

正規表現に関連するいくつかのメソッドを上書きし、ブラウザ間の差異を吸収するとともに、仕様通りの動作に統一したりもする。

  •  /pattern/g.lastIndex

    IEなどが、幅0の文字にマッチしたときに lastIndexを不当にインクリメントするのを修正。

  •  String.split(separator, limit)

    • 分割パターン中のキャプチャグループを戻り値の配列に挿入する。
    • マッチに参加しなかったキャプチャグループの位置に undefinedを挿入する。
    • 連続するセパレータの間などに存在する空文字列を省略せずに戻り値の配列に含める。

    (独り言) limitを指定したときに戻ってくる配列の要素数が limitと一致しない。XRegExpのバグ? もちろん separatorにキャプチャグループは使っていない。


 再帰パターン

例えば再帰の深さの上限を 10や 20と決めてしまって、XRegExpのコンストラクタでごにょごにょパターン文字列を展開してみればどうだろう。JavaScriptで正規表現を一から実装しようというプロジェクトではないから、自ずと制限が定まってしまうのだけど、上限付きでもそれが 20もあれば十分という気がする。


 追記@2009-06-25: XRegExp 1.0がリリースされている(2009-06-24)。

驚いた。大部分がライブラリの機能紹介という退屈な(<作者本人が一番よく知っているから)文章に紛れ込んだバグ報告(とも呼べそうにないもの)を不自由な Google翻訳から見つけ出すとは。

1.0のソースも眺めてみたいけれど巨大な変更履歴にちょっと後込み。そのうちね。

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

Steven LevithanHi. I translated this page using Google Translate. The la..


2009年03月15日 (日) [TM-150] トラックボールだからホイールの代わりに SetPoint(Ver.4.00)の機能の Universal Scrollを使っている。で、Firefoxをスクロールさせる > ポインタの下に Flashがくる > スクロール止まる どうよ?この隙のない動作は。(望まれてないけど)


2009年03月13日 (金)

最終更新: 2014-12-24T10:54+0900

[SHJS] SHJSに行番号表示機能を。

個人的にはなくても不便はないけども、番号を表示する方法のアテができたので。

 番号を表示する方法

求める条件は

  • 選択&コピーで(改行コードまでは無理にしても)元のソースコードが手に入ること。余分に行番号までコピーされるなんてもってのほか。
  • 開始行番号が指定できること。できれば非推奨な <ol start="555">以外の方法で。(Chili 2.2はこの方法だった)

SyntaxHighlighterのように "view source", "copy to clipboard"機能を用意して、行番号が一緒にコピーされる欠点をカバーするのは次善の策。

WP-Syntaxやっているように、1行 2列のテーブルを作って、左の列に行番号を、右の列にハイライトされたソースコードを配置するのは、サポートするブラウザも多そうで良さげ。

でも行番号あり・なしで二通りの出力フォーマットを用意するのはスクリプトのサイズの面から避けたい。何と言っても、忘れていたけど、shjs-0.4.2をいじくったものであるこの日記の /shjs/sh_main.js はハイライトするついでに、各行に <span class="odd">、<span class="even">というタグをかぶせていたのだった(しかも 3行の追加だけで)。その方面でいくことにする。

つまり、CSS2の counter-reset, counter-increment, counter に全面的に頼った方法。contentで追加した文字列がコピペ不能なのがかえって幸いした。Fx 3.0.7、Safari 3.2.2、Opera 9.64、IE8で期待通りの表示を確認した。(※末尾に追記あり)

 スタイルシートに追加したルール

pre.sh_sourceCode.sh_numbered .odd:before,
pre.sh_sourceCode.sh_numbered .even:before {
  counter-increment: sh_sourceCode;
  content: counter(sh_sourceCode, decimal-leading-zero) ": ";
}

 sh_main.js (version 0.4.2)に加えた変更

--- sh_main.js-0.4.2	Mon May 12 23:07:40 2008
+++ sh_main.js	Fri Mar 13 23:29:34 2009
@@ -60,6 +60,8 @@
     currentStyle = style;
   };
 
+  var oddLine = false;
+
   var endOfLinePattern = /\r\n|\r|\n/g;
   endOfLinePattern.lastIndex = 0;
   var inputStringLength = inputString.length;
@@ -78,6 +80,7 @@
     }
 
     var line = inputString.substring(start, end);
+    builder.startElement((oddLine = !oddLine) ? 'odd' : 'even');
 
     var matchCache = null;
     var matchCacheState = -1;
@@ -158,6 +161,7 @@
       builder.endElement();
     }
     currentStyle = undefined;
+    builder.endElement();
     if (endOfLineMatch) {
       builder.text(endOfLineMatch[0]);
     }
@@ -307,8 +311,13 @@
 @param  element  a DOM <pre> element containing the source code to be highlighted
 @param  language  a language definition object
 */
-function sh_highlightElement(htmlDocument, element, language) {
+function sh_highlightElement(htmlDocument, element, language, firstline) {
   sh_addClass(element, "sh_sourceCode");
+  if (firstline !== null && ! isNaN(firstline)) {
+    // cssのセレクタで区別できるように。
+    this.sh_addClass(element, "sh_numbered");
+    element.style.counterReset = "sh_sourceCode " + (parseInt(firstline) - 1);
+  }
   var inputString;
   if (element.childNodes.length === 0) {
     return;
@@ -345,7 +354,8 @@
       if (prefix === "sh_") {
         var language = htmlClass.substring(3);
         if (language in sh_languages) {
-          sh_highlightElement(htmlDocument, element, sh_languages[language]);
+        // firstlineなんて非標準属性をでっちあげないで
+        // スクリプトにパラメータを渡す方法は?
+        // (class属性を乱用するのは気に入らない)
+          sh_highlightElement(htmlDocument, element, sh_languages[language], element.getAttribute("firstline"));
         }
         else {
           throw "Found <pre> element with class='" + htmlClass + "', but no such language exists";

sh_main.js (version 0.5)への変更も似たようなものだけど、sh_load()の中にも変更すべき場所がある。

sh_main.js (version 0.6)を対応させるのは面倒なので省略。0.4.2も実はそうだったんだけど、shjsはスタイルのネストを想定していない。例えばこれ。

// URL inside comment. <http://vvvvvv.sakura.ne.jp>

ハイライトされた結果の HTMLはこうなる。

<span class="sh_comment">// URL inside comment. &lt;</span><span class="sh_url"><a class="sh_url" href="http://vvvvvv.sakura.ne.jp">http://vvvvvv.sakura.ne.jp</a></span><span class="sh_comment">&gt;</span>

フラットな構造で、comment, url, commentと 3つの要素が並んでいる。commentが urlを含むような構造にはならない。0.6ではハイライト前後のタグ構造をマージする仕組みになっているから、0.4.2や 0.5のように ad hocなごまかしができなくて、まずはこの前提を取り払わなければいけない……。

 (付録) hikidoc.rb (revision 108) への変更

<<< language, number
>>>

<pre class="sh_language" firstline="number">
</pre>

に変換します。

--- hikidoc.rb.108	Thu Aug 28 22:11:00 2008
+++ hikidoc.rb	Fri Mar 13 23:05:05 2009
@@ -335,7 +378,7 @@
     @output.preformatted(@output.text(text))
   end
 
-  BLOCK_PRE_OPEN_RE = /\A<<<\s*(\w+)?/
+  BLOCK_PRE_OPEN_RE = /\A<<<\s*(.*\S)?/
   BLOCK_PRE_CLOSE_RE = /\A>>>/
 
   def compile_block_pre(f)
@@ -665,9 +706,18 @@
     end
 
     def block_preformatted(str, info)
-      syntax = info ? info.downcase : nil
+      syntax, firstline = *(info ? info.split(/\s*,\s*/) : [])
+      syntax = syntax.downcase if syntax
+      firstline = /\A[-+]?\d+\z/.match(firstline).to_a[0] if firstline
       if syntax
         begin
+          attr_firstline = firstline ? %Q( firstline="#{escape_html_param firstline}") : ""
+          @f.print %Q(<pre class="sh_#{escape_html_param syntax}"#{attr_firstline}>), text(str), "</pre>\n"
+          @f.puts inline_plugin(%Q(shjs #{syntax.dump}))
+          return  
+
           convertor = Syntax::Convertors::HTML.for_syntax(syntax)
           @f.puts convertor.convert(str)
           return

 追記: コピペまでは試してなかった。

お試しください。

Firefox> 行番号が選択されたり選択されなかったりする。見た目の選択範囲に関わらず行番号はコピーされない。
Safari> 行番号も選択範囲に入るがコピーはされない。
Opera> 行番号がコピーされる。
IE8> 行番号がコピーされる。
ダメダメだあ。(この機能は封印しよう)

 追記@2009-03-27: 最後で全部ひっくりかえしちゃった。

やっぱり一行二列の表を作る方法でいくことにした。

この方法だと、preを一旦取り除いて tableの下に追加する関係からか、同じ preにハイライト処理が二回走ってしまう(getElementsByTagName()で得られる NodeListが liveである、ということ)。sh_sourceCodeというクラス名を目印に、二度目以降の処理をスキップするよう動作を変更した。

Internet Explorerは 8になっても一筋縄ではいかないようで……。左右の列の<pre>の高さが、デフォルトスタイルシートと同じ font-size:80%でないと揃わない。「IE8互換表示」や「IE7」モードだと揃うんだけど。

二重処理を防ごうと Array.prototype.sliceを使って NodeListを Arrayに変換しようと思ったらまたしても IEの壁。オブジェクトを指定してください、と相変わらずわかりにくいエラーメッセージ。(prototype.jsが愚直にループをまわしてるのは IEのせいかもね)

<table>を使うとその中の <pre>の幅が、内容に同期している(最小にして十分なサイズ)。他の <pre>と同じように、いつでも本文と同じ幅に揃えたいなー。

 追記@2009-04-02: 0-paddingオプションとか。(暇だなあ)

<pre class="sh_javascript" firstline="00339">
  このような <pre>を出力すると……
</pre>
sh_putLinenumber: function(element, param, inputString) {
  var startline = parseInt(param, 10);
  var opt = /^([-+]?)(0*)(\d+)/.exec(param);
  var opt_explicit_sign = (opt[1] === '+') ? '+' : '';
  var opt_zero_padding = (0 !== opt[2].length) ? new Array(opt[2].length + opt[3].length + 1).join('0') : '';
  var re_zero_padding = new RegExp('^0+(?=\\d{' + opt_zero_padding.length + '})');
  var nums = inputString.match(/(?:\r\n?|\n)(?!$)|$/g);
  if (0 !== opt_explicit_sign.length || 0 !== opt_zero_padding.length) {
    for (var i = 0; i !== nums.length; ++i) {
      nums[i] =
        (0 < startline + i ? opt_explicit_sign : startline + i < 0 ? '-' : '') +
        (opt_zero_padding + Math.abs(startline + i)).replace(re_zero_padding, '') +
        nums[i];
    }
  }
  else {
    for (var i = 0; i !== nums.length; ++i) {
      nums[i] = '' + (startline + i) + nums[i];
    }
  }

  var d = element.ownerDocument;
  var e = {table:'table', tbody:'tbody', tr:'tr', tdLeft:'td', pre:'pre', tdRight:'td'};
  for (var p in e) {
    e[p] = d.createElement(e[p]);
  }
  element.parentNode.replaceChild(e['table'], element);
  e['table'].appendChild(e['tbody']).appendChild(e['tr']);
  e['tr'].appendChild(e['tdLeft']).appendChild(e['pre']).appendChild(d.createTextNode(nums.join('')));
  e['tr'].appendChild(e['tdRight']).appendChild(element);
  e['table'].className = 'sh_sourceTable';
  e['pre'].className = 'sh_sourceCode sh_numbers';
  return element;
},

341-344、346-354、358行がオプションのために追加した部分。(SyntaxHighlighter2.0の行ハイライト機能はこういときにつかうのだな。イラネと思っていたのを改めます)

固定幅というわけではなくて、0の数以上に繰り上がれば桁が増える。上の場合では 99999行目を超えたとき。テストする段で気付いたが、最低でも 92行のソースコードを貼らないと恩恵に与れない……。

正規表現を持ち出すまでもなく、適切な数の 0をくっつけるだけでよかったんだね(> JavaScriptのビルトインオブジェクトの拡張:ゼロパディング - 気まぐれショウルーム)。先に調べよう。過去に、適切な数の 0を知るために log(10)をとればいいと無邪気に考えていた苦い記憶があるので、最初に正規表現を持ち出してしまった(それもどうだ?)という事情があったりもするんだけど。(Number.toString(10).lengthで済んでしまうなんて!)

 345行目の /(?:\r\n?|\n)(?!$)|$/g というパターンについて

<pre>直後の改行は存在しないかのように扱われるが、</pre>直前の改行は存在する(スクリプトで取得できる)ものの表示されない(4つのブラウザで確認)。というわけで、末尾の空行に行番号を付けてしまうと列の左右で行の数が一致しなくなる(だから除外する)。


Google Chrome(1.0.154.53)は

<pre>.innerHTML = <pre>.innerHTML

とやるたびに先頭の改行文字を取り除いていってしまうんじゃないか? 個別のブラウザ対応は切りがないし、完全対応は不可能なので、行番号を付けるときは <pre>の最初と最後の行を空行にしないのが最も安全。

トンデモ IEさんは <pre>.innerHTML= だろうと <tag style="white-space:pre">.innerHTML= だろうと空白をトリミングしてくれますしね。

 追記@2009-04-04: 一行二列の TABLE方式にしたら shjs-0.6での対応も簡単だったので。

テストが不十分なので、langファイルの自動読み込み部分など、一度も実行されていない部分が動くかは不明。

最小化方法は JSMin。ためしに YUI Compressorにもかけてみたがローカル変数の短縮を全くやってくれなくて JSMinと大差ない結果だった。一番外側の無名関数の実行部分をとりのぞいたらちゃんとローカル変数名の短縮もやってくれた。

小手先の変更もいくつか加えた。(ブラウザ判別コードの実行を一度だけにしたり << 関数の中で分岐するんでなく、判別結果で関数を取り換える)


2009年03月12日 (木)

[W53S]「au電話機 拾得のご連絡」

落としたのが 10日の 20時頃で、翌日の昼には auから「重要なお知らせを送ったのでご覧ください」という内容のメッセージが留守番電話に入っていた。このタイミングで「重要な」ってアレしかないだろ?そうなんだろう?とワクワクテカテカしながら待っていたら速達で(といってもアマゾンから来るペリカン便と同じ早さで)タイトルのような文書が届いた。

どなたかが拾って翌朝には警察に届けてくれていたんだろう。10日の 20時から 24時にかけて少なくとも 10回は呼び出しがあったはずだから、さぞ迷惑だったと思う。感謝。


2009年03月11日 (水) [SQLite] 3.3.14から 3.6.11にアップデートしたら、NATURAL LEFT JOINの動作が変わっていて、納得のいかない結果になる。