JSON::XSとかMacVimでちょっと調べた部分を忘れないためにメモ
しばらく前から図書館蔵書マップのサーバー側のスクリプトのHTMLをパースする部分をHTML::TagParserからWeb::Scraperに切り替えようと企んでいました。
ただWeb::ScraperはJSONモジュールが2.0以降なので、まず現在動作しているスクリプト120個ぐらいを一斉に書き換えてからJSON.pmをUPDATEするというかなり面倒な手順になり半ば放置していました。
よくよく考えるとWeb::Scraperをインストールした時にJSONもUPDATEして(JSON.pmは前のに戻した)、XS版もインストールしていました。
それならば2.x用に書き換えたスクリプトでとりあえず明示的にXS版を指定しておけば(use JSON; ではなくuse JSON::XS;みたいな感じで)できた物からUPLOAD出来る事に気付きました。
例)
1.x版
use JSON; $JSON::Pretty = 1; # 整形する $JSON::Indent = 4; # インデント幅を4に $JSON::Delimiter = 2; # セミコロンの前後に空白を開ける print objToJson($obj, {keysort => 1}); #キー順にソートする
2.x版
use JSON::XS; # 本当はuse JSON;で my $json = new JSON::XS; # 同様にnew JSON; $json->pretty; print $json->canonical->encode($obj);
試しに動かしてみると所蔵しているのに所蔵していないマーカが表示される、Firebugのコンソールで見る限りちゃんとレスポンスを取得出来ているように見えるのになぜ?という事で一旦term上で変更前後で吐いているJSONにdiffをかけてみると2.x用に修正した方はtrueとfalseがクォートされていることがわかった。
例)
// 1.x { [ 'foo' : true, 'bar' : false, ], } // 2.x { [ 'foo' : 'true', 'bar' : 'false', ], }
よくよく調べてみると元々のスクリプトが正しくないのを1.x版だとよしなにしてくれていたようで、無い頭でPerlDocを読んでみると
other references
Other unblessed references are generally not allowed and will cause an exception to be thrown, except for references to the integers 0 and 1, which get turned into false and true atoms in JSON. You can also use JSON::false and JSON::true to improve readability.
to_json [\0,JSON::true] # yields [false,true]
とあるのでこんなふうに書けばいいのかと早速テストすると
$foo = 'true'; # 1.x # $foo = true;はエラーになる $foo = JSON::true; # 2.x
Bareword "JSON::true" not allowed while "strict subs" in use at hogehore
直接JSON::XSしているからJSON::XS::trueと書かないとダメでした。
これでダラダラとJSON::XSを使うスクリプトに置き換えていってJSON.pmをUPDATEして、固有データをYAMLで定義して大幅にスクリプト数を減らしWeb::Scraperでパースする形に切り替えるのに一歩近づけたような気がします。*1
メモ
MacVimがバージョンアップして.gvimrcに追記した内容
-
- exコマンドモードの時に勝手に日本語入力になってしまうのを抑制するには
set iminsert=0
-
- 上部に余計なアイコンを表示させない(vim使うのにマウス使わないからできるだけ画面広く使いたいので)には
set guioptions-=T
フルスクリーンにするにはexコマンドモードで
:set fu
なんだけど、最初からフルスクリーンにするには.gvimrcにどう書けばよいのか調べる
set fullscreen
ではダメでした