- SHJS can now automatically load language script files (feature request #2007022 - thanks to Michal Nazarewicz and Eugene Marcotte).
- Highlighting of C/C++ and JavaScript has been improved.
- A new language file for Oracle SQL has been added (thanks to Mike Breeze).
- Case-insensitive regular expressions are now handled more efficiently.
- SHJS now treats <br> tags as line terminators in input (bug #2054144 - thanks to Altforweilerer).
- Compressed .min.js files are now generated with YUI Compressor.
languageファイルの自動読み込みは Msxml2.XMLHTTPか XMLHttpRequestを利用する。
<script>タグを挿入するのかも*と思っていたが今風のやり方だった。(SourceForgeの Feature Requestsで両派の議論があったようで、0.5では Asynchronous XMLHttpRequestを採用したけど将来かわるかもー、だって)
lang/sh_javascript.jsの全変更点(多分)は
新たに対応したものも対応が外れたものもあるが、どちらも JavaScriptの仕様に近づくための変更という点は共通。
それでもやっぱり Javaっぽいのは、java.langまるごとインクルードだった前バージョンの source-highlight-lang/javascript.langが、java.langの中身をベースに足し引きしたものに変わったに過ぎないから。
「大文字小文字を無視する正規表現を効率的に」っていうのは lang/sh_sql.jsを見るにこういうこと。
/[Vv][Aa][Rr][Cc][Hh][Aa][Rr]/ // ver. 0.4.2 /VARCHAR/i // ver. 0.5
……。
YUI Compressorはローカル変数名を縮めることで JSMin以上の圧縮を図る。
他にも、obj["prop"]を obj.propに(可能なら)したり、連結されるリテラル文字列を予め一つにしたり、オブジェクトノーテイション(って言うの?)のプロパティ名部分の引用符を取り除いたり({"p1":v1, "p2":v2} -> {p1:v1, p2:v2})、するらしい。
おれは JSMinでアグレッシブ(level 3 of 3)に最小化する(と、不要な空白と全ての改行が取り除かれるので、セミコロンインサーションの余地がなくなって、一つのセミコロンも省略できなくなる)のが好きなんだけど。何より Javaの実行環境がないから、YUI Compressorは動かない……。
ブラウザ(クライアントサイド)で実行されるのでサーバーの負荷が増えません。
メインスクリプト(最小化されたものが数KB)は必須ですが各言語ファイルはオプションです。名前も知らない言語の定義ファイルまでブラウザにダウンロードしてもらう必要はありません。
自動認識のような不確かなものに頼りません。(自分の書いているものが何語なのか知らない人は少ないでしょう。あえて情報を削ってスクリプトの仕事を増やす必要はありません)
言語ファイルは、状態オブジェクトの配列です。各状態は正規表現のパターンを一つ以上持ち、マッチしたパターンにより配色と遷移先を決定します。状態が増えるのをいとわなければ何でもできます⁑⁂。
ダブルクォーテーション文字列や数字や URLなどにマッチする正規表現を並べて順番にマッチングさせるだけのハイライターより一段上のパターン認識が可能です。(有名どころの SyntaxHighlighter 2.0は XRegExpというライブラリを使用していて、これが Perl5や鬼車や .NET並の正規表現を JavaScriptでも使用可能にしています。これも一歩踏み出す一つの方法ですが、ほとんど XMLのハイライトでしか使われてないようにも見えるのがもったいない)
JavaScriptの方は letみたいな新しいキーワードには対応していないが、JScript5.5(ECMAScript3)に準拠したスクリプトのハイライトに可能な限り対応している。Javaもどきの実装とは全然違います。
Rubyの方もがんばったけど、こちらは正規表現による字句解析レベルでは判断の付かない要素が多くて、例えば
str1 = % hoge ; #=> "hoge" str2 = "%04d-%02d-%02d" % [2008, 8, 20] #=> "2008-08-20"
% をメソッドと判断する(下段)か %!string! とする(上段)かは文脈がないと決められない。現在は後者が誤って %!string! と判断されている(%!string!記法の区切り文字としてスペースを認めなければ、より多くのケースで妥当な表示が得られるのはわかっているが……)。また、改行を含む %!string! リテラルにも対応していない(はてなはこれができる。悔しい)が、かっこを使った %記法( %[string]など )では改行を含むことができる。
既知の不具合はこれだけ。(知らないだけ)
* その場合スクリプトが実行されないことがあったような……(検索結果>http://la.ma.la/blog/diary_200612061928.htm ) と思ったが、IEで innerHTMLを使った場合の話だった。とはいえ、DOMで <script>エレメントを作成することは可能で、実行もされるというのだろうか?
⁑ 厳密ではない。感覚的な言葉。
⁂ この文では普通の正規表現以上の表現力(例えばかっこの対応を調べられる)があるのを説明できていないような。(ある状態から別の状態へ移動するだけでなく後戻りすることもできるから、というのでは説明になっているだろうか?
*4 2008年12月にリリースされた shjs-0.6でフォーマットが変更になったので shjs-0.5用。
こう書くと
""[[http://vvvvvv.sakura.ne.jp]] ""どこからの引用だかわかるでしょうか? "" ""すくなくとも Firefox3、Safari3.1、Opera9.50ではわかるはずですが、IE7では無理です。
こうなる。
どこからの引用だかわかるでしょうか?
すくなくとも Firefox3、Safari3.1、Opera9.50ではわかるはずですが、IE7では無理です。
HTMLはこんな感じになっている。
<blockquote cite="http://vvvvvv.sakura.ne.jp">...</blockquote>
スタイルシートはこう。残念な子 IE7は contentをサポートしていないのが敗因。
.section blockquote[cite]:after, .section blockquote[title]:after { content: "引用元: "attr(title)" "attr(cite); /* ハイパーリンクにしたい。マークアップもしたい。 */ display: block; text-align: right; font-style: oblique; background-color: #F3F9FF; }
引用の最初の行が二重ブラケットリンクだけだった場合に限り、その中身を <blockquote>の cite/title属性として扱う。こういうパターンがあり得る。
URLANDTITLETITLEONLYhttp://URLONLY
http://vvvvvv.sakura.ne.jp/w/9784320122079/?QuotePageProblem
ちょっと説明。
アンカーが重複するのを防ぐために、quote_pageプラグインが他ページを HTML化する際に prefixを用いるようにした。でもこの prefixがそのままではうまく動かない。
prefixとは Hiki::HTMLFormatter_default#initializeが受け取る五番目のパラメータ。その意味は、見出しに付くアンカーの接頭辞。デフォルトでは prefix='l' となっており、l0, l1, l2,...とアンカーが割り振られることになる。
ところで、quote_pageが様々な prefixを用いてメソッドを呼び出しても、Hiki::HTMLFormatter_default::HEADING_REが
%r!<h(\d)>.*<a name="l\d+">.*?</a>(.*?)</h\1>!
となっており prefix='l' がハードコーディングされている(太字部分)。これの修正が必要だった。
また、rd+スタイルの場合はもっと悲惨で、五番目のパラメータ(なぜか suffixという名前)は全く利用されていない。修正の可能性はリンク先で書いたが自分で使っていないので未対応のまま。
なんでこんな使えないパラメータ(prefix, suffix)があるんだろう。
bugfix in headings in blockquotes (html_formatter.rb, Revision 1.47)
このへんが関係ありそう。引用の中の見出しは TOCに含めたくないとかそういうことだろうか。テストケースがあれば regressionの有無を確認できるんだけど……。
現在の状態で確認したが、引用の中の見出しが TOCに含まれるということはなかった。
ちなみに、Revision 1.46の tocメソッドにも prefix='l' 決めうちのミスがあったが、1.47でのそれにあわせるような変更から考えるに、ミスではなく prefix='l' の見出しだけが TOCに含まれるという仕様なのかもしれない。<ないない
ところで、最初のリンク先の Hikiには最新の HikiDocを入れているのだけど、その場合、html_formatter.rbを最新の hikidoc.rbに対応したものに全面的に書き換えないと、hikidoc.rbの大改造のメリットが半分しか活かせていないことになる。現在の html_formatter.rbはかつての hikidoc.rbを思わせる、正規表現で全体をバッサバッサと置換していく、文脈無視の大味な実装。(そこまで正規表現を信用できないし、最大長のわからない文字列を何度も何度もなめまわすのは避けたいところ)
WikiNameを見つけ出す(自動リンク)正規表現が微妙に違う。
HikiDocにおまかせしたので、連続する大文字が許容される一方、大文字で終わる名前は拒否されるようになります。(GOODWikiName, BadWikiNAME)
日記に書いた手前、どんな風になるのか試してみただけだし、現状で困ってもいないので、この(追記部分の)変更は使用中の Hiki( http://vvvvvv.sakura.ne.jp/w/ )には入れていない。あしからず。
まあ、ポインタと配列は一緒とか云っている人は、一遍
シンデミル?int array[なんかでかいすうじ]; なグローバルな実体を extern int *array; で参照してはまればいいと思うよw
手っ取り早く確かめるのはこんなんで。
たぶんSEGVで落ちるはず。
なぜ SEGVで落ちるのかわからなかったので、試してみた。
/* cmd /V:ON SetEnv cl a.c foo.c bar.c */ #include <stdio.h> void foo(); // foo.c void bar(); // bar.c char array[256]; int main() { printf("main: :array: %p\n", array); printf("main:addr:array: %p\n", &array); foo(); printf("%s\n", array); bar(); printf("%s\n", array); return 0; }
配列(array)を配列(char[])として参照。
extern char array[]; // a.c void foo() { printf("foo : :array: %p\n", array); printf("foo :addr:array: %p\n", &array); strcpy(array, "hello, foo world"); }
配列(array)をポインタ(char*)として参照。
extern char *array; // a.c void bar() { printf("bar : :array: %p\n", array); printf("bar :addr:array: %p\n", &array); strcpy(array, "hello, bar world"); }
main: :array: 0040DAA0 < char array[] main:addr:array: 0040DAA0 > &array == array foo : :array: 0040DAA0 > foo:array == array foo :addr:array: 0040DAA0 > &foo:array == foo:array hello, foo world bar : :array: 6C6C6568 < 6C(l) 6C(l) 65(e) 68(h) bar :addr:array: 0040DAA0 > &bar:array が arrayと同じ (a.exe は動作を停止しました)
確かに落ちた。
例えば arrayと書いたときに得られるイメージが 6C6C6568... だったとする。これを charと解釈すれば 'h'(68h) になるし、intと解釈すれば 1819043176(6C6C6568h) になる。shortなら 25960(6568h)。では char* なら? そのまま 6C6C6568。(ポインタのサイズが 64-bitなら、あと 4バイト先まで読むことになるが)。ではでは char[]なら? 6C6C6568... というメモリ領域を指すアドレスが手に入る。
arrayとラベルされたメモリ領域(6C6C6568...)が存在するときに、それをポインタとして扱った場合と、配列として扱った場合では、得られるものがまるで違う。(6C6C6568というメモリ上の値か、そのアドレスか)
配列とポインタが混同されるのはどちらもアドレスが得られるから。違うのはそのときその変数が参照しているメモリイメージ。配列変数は配列の中身が格納された領域を参照しながらそのアドレスを返すが、ポインタ変数はアドレスが格納された領域を参照しており、その内容をそのまま返している。
* 違うみたい。>http://www.kt.rim.or.jp/%7ekbk/zakkicho/08/zakkicho0808a.html#D20080809-2
1 秋山瑞人 2 桜庭一樹 2 高殿円 4 野村美月 5 葉山透 6 米澤穂信 7 清水マリコ 8 西尾維新 9 乙一 10 古橋秀之 10 佐々原史緒 10 友桐夏 13 竹宮ゆゆこ 13 森橋ビンゴ 15 今野緒雪 16 十文字青 16 中村九郎 16 海猫沢めろん 19 冲方丁 20 谷川流 21 長谷敏司 22 中村九郎 23 片山憲太郎 23 支倉凍砂 25 桜坂洋 25 一柳凪 27 田中ロミオ 28 山形石雄 29 海原零 29 おかゆまさき 31 加地尚武 32 貴子潤一郎 32 細音啓 34 紅玉いづき 35 アサウラ 36 壁井ユカコ 37 藤原祐 37 海羽超史郎 37 豪屋大介 40 瀬尾つかさ 40 木村航 42 小林めぐみ 43 ヤマグチノボル 43 桑島由一 45 平坂読 46 竹岡葉月 47 有川浩 47 甲田学人
読んだことがあるのがだいたいこの順位までの作者。(何人か下位にこぼれているし、蒼穹の女神を評価している すずきあきら はリストにも入っていない)
桑島由一の順位が低いがこの人の名前は「桑島由一 <> ヤマグチノボル」の一回しか目にしていない。作家に明確な順位付けなんかしていないから、名前が出てくるたびに評価は上下するもの。一度しか名前が登場しないのでは、例えばこのばあい、桑島由一の評価は完全にヤマグチノボルに依存しているがそれは不正確。ましてこの二人の場合、引き分けを選ぶことしかできませんでしたよ。
<追記>そうだ。推移律。作家をソートするときに推移律が成り立つことを期待してはいけない。作家を評価する軸は作家の数だけあったっておかしくないし、それらの軸ごとに一定の重みを付けて評価をひとつの数値に落とし込むなんて不可能。なんて、今回の試みを真っ向から否定する発言。</追記>
ほんとうにソートしているだけだから選んでいる本人には結果に全く意外性がない。退屈。結果を見ると「高く評価している作品を」「何作も」出している人の評価が高いのがわかるが、そのように選んだのだから自分にとっては当然の結果。
2、3回ダブルクリックしてしまって選択を誤ったが、海羽超史郎という人の著作を読んだことはありません。
WZR-AGL300NHなら WPA/WPA2混在、TKIP/AES混在が可能なので無問題。(ところで Ver.1.200ファームでも WPA-PSK(AES)が相変わらず使用不可なのかが疑問。設定項目からそういう区別がなくなっているということは何でも OKになったということ?)
アンテナが 3本もあるから多分大丈夫? < まだ確かめていない
WLI-TX4-AG300Nには HDDレコーダー(RD-XS36)とネットワークメディアプレイヤー(AVLP2/G-2)を接続。再生が一度途切れると最早まともに再生を再開できない AVLP/G-2の原因が帯域の不足した無線LANだとしたら、AVLP2/G-2の(有線)LANポートを使用して、最大300Mbpsでる WLI-TX4-AG300Nに無線通信を任せたら解決するかも。
無線部分を AVLP2/G-2内蔵IEEE802.11gから WLI-TX4-AG300Nに任せたら再生が途切れることがなくなった。電子レンジを使ってさえ途切れない。
WZR-AGL300NHにとってかわられたアクセスポイントには Tomato firmware(version1.19)をインストールしてこの PC(SN25P)のネットワークアダプタになってもらった。
WHR-G54Sをイーサネットコンバータみたいにするには Wireless Modeを Wireless Ethernet Bridgeにするのだけど、これを設定すると Tomatoの設定画面が開けなくなって困った。原因は
ルータ(192.168.1.1) <-/ /-> WHR-G54S(192.168.2.1) <--> (192.168.2.2)SN25P
という環境で作業していたものが、この設定で
ルータ(192.168.1.1) <--> (???.???.???.???)WHR-G54S(192.168.2.1) <--> (192.168.1.XXX)SN25P
というように、SN25Pの IPアドレスを WHR-G54Sではなくルータが割り振るようになって WHR-G54Sの LAN側アドレスと SN25Pが違うサブネットに属してしまっていたから。
IPv4のプロパティを開いて SN25Pのアドレスを一時的に 192.168.2.XXXの固定アドレスに変更して、WHR-G54Sのアドレスを 192.168.1.XXXに変更して、SN25Pのアドレスを元に戻すと解決。
WZR-AGL300NHの方に WDS(リピータ機能)の設定がなかったのと、あっても暗号化に WEPしか使えないので却下。
PCの LANポートが使えるようになるから。USBの無線子機では WOLが使えないので。まだ VGF-WA1が SN25Pを起こすことはできていないけど、きっとできるはず?
常々、マウス、キーボード、ディスプレイ、無線LANのみを具えた軽量クライアントPC*が欲しいと思っていた。HPの TouchSmart PCはさらにタッチスクリーンを具えていて、期待の一歩先を行っている。64-bit Vistaの採用も良い。メモリが安くて余ってるのに 32-bit OSで 3GB程度のメモリしか扱えないとか馬鹿らしいからね。未だに 64-bit版を選ばせないメーカーは怠慢(<サポートの苦労を考えない放言)。
あえて難をいうなら、地デジ対応(予定)は全くもって必要ないのだが、単体モニタとして使用できるように外部入力端子は欲しい。ディスプレイポートだか HDMIだかはもちろん、コンポーネントか D端子までがカバーされていると完璧。
* ノートPCはまず癖のないキーボードを具えておらず、マウスもなく、縦1024以上のディスプレイを持ったものもなかなかない。
AVLP2/G-2の件が謎だが、どうもこのパソコンに問題があるらしい。Vistaなので Windows Media Connect 2.0をインストールしたり、WMP11を再インストールしたりできないのがつらい。WMP12をインストール(いつの話だ)したときに共有できるようになったらいいなあ。
AVLP2/G-2は OKと書いたが安定していない。起動してもなかなかデバイスリストに追加されない。
TVersityと VGF-WA1を起動した状態で、ルーターを再起動したりなんかしていて、ふと WA1の画面を見たら TVersityが現れていた。謎。WMP11ではやはり共有できない。
TVersityは Shift_JISな mp3タグが化けるので使いにくい。それ以外は設定項目が多くて良い。何よりサーバーとして役目を果たしている! でもアルファベットを問答無用でキャピタライズするのはやめて。
1.0.0.0 RC1を、UACオンの Vistaに XP SP2互換モードでインストールして、SSDP Discoveryサービスも動かしたままだけど問題ない。ただ、ハイバネーションから復帰したあとつながらなくて、TVersityのサービスを再起動する必要があったりする。文字コードも iTunesと同じ Unicodeにしたら化けないし、もはや何のソフトが原因で Shift_JISにこだわっていたのかも思い出せないのでタグは、Unicodeに一括変換してしまう。
これで VGF-WA1を使い倒す環境が整った、わけではなくて、WMA Losslessをこのように
PC --(IEEE802.11g)--> AP --(IEEE802.11g)--> WA1
無線で送り出して無線で受け取ろうとすると再生が途切れ途切れになる。WMAファイルのプロパティを見たら 1Mbps弱だったから、理論上限値 54Mbpsの IEEE802.11gにはがんばって欲しい。
(余談) WMP11の共有もずっとオンにしているが WA1から見えたことはない。
箱を開けたりしているうちはウキウキだった。さすが日本のメーカーだなー、とか。梱包とモノはすごくいい。でもいろいろつまずいた。
VGF-WA1がサポートしているのは IEEE802.11b/gの
説明書を見たら WPA-PSK AESは確かに抜けている。うちのアクセスポイントが古いのは認めよう。でもクライアントにはどんなアクセスポイントにも接続できるように幅広い対応を求めたい。仕方がないのでアクセスポイントを TKIPにした。
最新のファームが購入の決め手だったのに……。
デバイスドライバのインストールに失敗したというメッセージが出て失敗する。(VGF-WA1の液晶が updating firmware...と表示したままになるが、電源を切っても再起不能になったりはせず問題なかった)
説明書に Vista対応とは書かれているが、SP1なのがいけないのか、64-bit版なのがいけないのか。(ちなみに Vista対応を謳うのならそれは当然 32/64-bit両対応を意味するものと了解しているので、64-bitがいけないとは思っていない。原因である可能性は極めて高いと思っているが)
XP SP2を使ってファームウェアのアップデートだけはできたが、インストーラがファームウェアアップデートという、最初のプロセスでこけるので Vista機にワイヤレススピーカーマネージャをインストールできなかった。だもんで、VGF-WA1を PCのリモートスピーカーとして使用することができない。インストーラから個別のインストーラを展開できれば他のモノのインストールは成功する可能性もあるのに。
DLNAサーバーには Windows Media Player 11を使うことにした。
コントロールパネル > ネットワークと共有センター > メディア共有 > 変更...
で設定画面が開くがデバイスリストに VGF-WA1が現れない。パケットが届いていない可能性もあるかと思って、別の DLNAクライアント(I-O DATA AVel LinkPlayer2)を起動したらこれはリストに追加された。VGF-WA1は現れない。当然、VGF-WA1の方にもサーバーが現れない。
とりあえず Webラジオ*を聞きながら日記を書きつつ途方に暮れている。
追記: DELLの XP SP2パソコンでは問題なく共有できる。
追記: VAIO Media Integrated Serverなら Vista機でも共有できる⁑。でも余計なものはインストールしたくない。
追記@2009-03-23: LinkStation Mini(LS-WS1.0TGL/R1)を DLNAサーバーにした。 日本語の表示も問題なし。DLNAクライアントとしても使えるようになりネットラジオ専用機状態から脱却。