「スクリプト」の編集履歴(バックアップ)一覧に戻る
スクリプト - (2014/05/23 (金) 22:45:22) のソース
*目次 #contents(fromhere=true) *スクリプトとは 参照:[[V2C 使用法 外部コマンド:スクリプト>http://v2c.s50.xrea.com/manual/script.html]] V2Cには&bold(){スクリプト}と、&bold(){System系スクリプト}があり次の違いがあります。  (4)&bold(){スクリプト} (br,8)[[外部コマンド]]に登録することよってV2Cの機能を拡張して&color(red){手動}で実行ができるものです。 (br,8)V2Cユーザーが個別に自由な名前を付けて配布・利用することが可能です。  (4)&bold(){System系スクリプト} (br,8)V2Cの[[設定ファイル]]です。V2C本体の動作(更新、書き込みなど)に&color(red){自動}で影響を与えることができるものです。 (br,8)名前が決まっているため、一ファイル内に複数の機能がまとめて用意されていることがあります。 どちらも[[スクリプト一覧]]からファイルを入手し、設定することで利用できます。 *スクリプトの実行に関する注意点 スクリプトは様々な理由から&color(red){エラーの発生や不具合が生じる可能性があります。}[[スクリプトFAQ>http://www39.atwiki.jp/v2cwiki/pages/56.html#id_ebada386]]を参考にしてください。 自分で修正できない人は、&color(red){どのスクリプトでエラーが出るかをエラーメッセージも添えてスクリプトスレに報告}してください。 (エラーメッセージはメニューの「表示」→「最後のエラーメッセージ」から取得できます。) 誰かが修正してくれるかもしれません。 また、自分で修正できる方はスクリプトスレで修正版を公開していただけると助かります。 *&aname(id_9a294772,option=nolink){スクリプトの設定方法} 参照:[[V2C 使用法 外部コマンド設定>http://v2c.s50.xrea.com/manual/extcommand.html]] ここではスクリプトのひとつ、[[tree.js]]を例に解説します。 +&bold(){スクリプトをインストールするフォルダを作成する。}&br()まず、V2C保存用フォルダに"&color(red){script}"フォルダを作成します。全てのスクリプトは、このフォルダに入れることでインストールすることができます。&br()V2C保存用フォルダの場所は、V2Cの「メインメニュー」→「ヘルプ」→「V2Cについて」から確認することができます。 +&bold(){スクリプトファイルを入手し、"script"フォルダに入れる。}&br()入手したtree.jsを"script"フォルダに入れる。 +-スクリプトの主な入手先 +--[[スクリプト一覧]]からダウンロードする。&br()tree.jsをダウンロードし、zipファイルを解凍する。 +--[[スクリプトスレ@V2C掲示板>http://yy61.60.kg/test/read.cgi/v2cj/1252074124/]]からコピペでスクリプトファイルを作成する。&br()(文字コードは&color(red){UTF-8}で保存。Windows付属のメモ帳の場合は「名前をつけて保存」ダイアログの下の方で文字コードを指定でます。) +-その他の入手先 +--[[V2C関連スレ用アップローダー>http://loda.jp/v2cthread/]]からダウンロードする。&br()上記と同じくtree.jsをダウンロードし、zipファイルを解凍する。 +--[[頂き物スクリプト>http://v2c.s50.xrea.com/contrib/script.html]](※現在古いファイルです。最新ではありません。)からダウンロードする。&br()上記と同じくtree.jsをダウンロードし、zipファイルを解凍する。 +&bold(){スクリプト一覧の[[詳細>tree.js]]か、スクリプトファイルの中身をメモ帳等のテキストエディタで参照し【登録場所】に指定されている場所に【ラベル】【コマンド】を設定する。} +-&bold(){【登録場所】}&br()&bold(){全体 レス表示}&br()V2Cの「メニュー」→「設定」→「外部コマンド」→「一般」タブ→「レス表示」タブ(または「全体」タブ)を開く。&br()次の項目のテキストエリアに&font(b,blue){青字}の文を記入する。 +--&bold(){【ラベル】}&br()&font(b,blue){被参照レスでツリー表示} と記入する(好きな文字列でもよい)。 +--&bold(){【コマンド】}&br()&font(b,blue){$SCRIPT tree.js} と記入する。(tree.jsのように複数のコマンドが用意されている場合は、欲しいものだけ選択することができる) +--&bold(){ID}&br()&color(blue){&bold(){10}} と記入する。(記入は任意です。[[マウスジェスチャ>キーバインド・マウスジェスチャ]]に割り当てないなら未設定でOK) +&bold(){追加ボタンを押し、一覧に追加されたことを確認し、OKを押して設定終了。} #image(title=記入した状態,http://www39.atwiki.jp/v2cwiki?cmd=upload&act=open&pageid=21&file=%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89.jpg) 参考:ぶるるる [[V2CでJaneにもあったレスツリーを表示>http://sarasate.seesaa.net/article/142177327.html]] **使い方 【登録場所】に従って登録した場所から、スクリプトを実行することができます。具体的な使用場所については、[[外部コマンド]]を参照してください。 ***例)レス表示に登録したtree.jsを使用する レスが表示されてる上(レス番の上ではないので注意!)で右クリックしてください。ポップアップメニューに自分が付けたラベル名(上記設定の通りであれば「被参照レスでツリー表示」)が追加されてるはずです。それクリックすると、右クリックした場所のレスに対するツリーが表示されます。なお、被参照レスでない場合は表示されません。 **備考 ***マウスジェスチャに登録 いちいち右クリック→選択という操作が面倒だという場合は、マウスジェスチャに登録することもできます。上のスクリプト設定のときにIDを設定しておくと、マウスジェスチャのレス表示のトコに追加されてるはずです。([10] レス表示 みたいな感じ)それを設定してやればマウスジェスチャで起動できます。 ***ツールバーボタン・お気に入りに登録 [[ツールバーボタン]]のボタン登録領域を右クリック、もしくはお気に入りのフォルダを右クリックから「コマンドの登録…」で登録できます。 これらからのみ使用可能な専用スクリプト(スレッド一覧表示可能な拡張検索)もあります. ***マウスオーバーで実行 (T20100813からURLExec.dat経由でも使用できるようになりました。詳細は「[[マウスオーバー]]」から) ***ポップアップのレイアウトを変更 このtree.jsは、動的にHTMLを作ってそれをV2Cがポップアップで表示してるだけなので、中をいじれば自分の好きなようにレイアウトを変えられます。スクリプトはただのテキストファイルなので、tree.jsをUTF-8で開けるテキストエディタで開いて書き換えればOK。 例えば、tree.jsの下のほうにあるCSSの設定の下記の行で、&bold(){x-small}を&bold(){medium}にすると文字が大きくなります。 body{margin:5px 0 5px 5px; font-size: x-small;} ***ポップアップからマウスを外した時にポップアップを閉じるようにする 通常、スクリプトでのポップアップはクリックしないと閉じませんが、R20101119よりマウス移動だけで閉じる事が可能となりました。 ただし、スクリプト内に専用の設定を記述する必要があります。(少なくとも2010/11/19以前にリリースされたスクリプトは設定されていないはず) 自分で設定し直す場合は以下のようにすれば有効にできます。 #highlight(javascript){{ // 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて v2c.context.setDefaultCloseOnMouseExit(true);// を先頭行に追加し、保存する。 }} 通常は上記で問題ないですが、各ポップアップ毎に設定を変えたい場合は下記のようにしてください。 #highlight(javascript){{ // 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて setPopupText(***)// か setPopupHTML(***)// という行を探して(***は何かしらの文字列)、その真下に v2c.context.setCloseOnMouseExit(true); //という行を追加し、保存する。 }} ***ポップアップの文字列を選択出来るようにする #highlight(javascript){{ // 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて setPopupText(***)// か setPopupHTML(***)// という行を探して(***は何かしらの文字列)、その真下に v2c.context.setPopupFocusable(true);// という行を追加し、保存する。 }} 選択文字列に対する右クリックメニューはコピーと外部コマンド以外の選択メニューは出ません。 また、コピペでは一部改行されない等の制限があります。 さらに、一部の外部コマンドはエラーが出て使用できない可能性があります(v2c.context.thread等がnullになるため) ***その他 -スクリプトファイル名を<>で囲むとV2Cの内部スクリプトを指定することができます。(現在は<wikipedia.js>のみ。) -ファイルの拡張子は".js"である必要はありません。 *System系スクリプトの設定方法 ここではスクリプトのひとつ、[[rescheck.js]]を使用した例として、1つのレスに複数のURLがある場合で行頭に連番を振る機能を解説します。 +&bold(){スクリプトをインストールするフォルダを作成する。}&br()まず、V2C保存用フォルダに"&color(red){script}"フォルダを作成します。さらにその中に"&color(red){system}"フォルダを作成します。&br()スクリプトは、この"system"フォルダに入れることでインストールすることができます。&br()V2C保存用フォルダの場所は、V2Cの「メインメニュー」→「ヘルプ」→「V2Cについて」から確認することができます。 +&bold(){スクリプトファイルを入手し、"system"フォルダに入れる。}&br()入手したrescheck.jsを"system"フォルダに入れる。&br()入手先はスクリプトの設定方法と同じです。 +&bold(){スクリプトファイルの中身を確認・編集する。}&br()以下の&font(b,blue){青字}の行を探し&font(b,red){行頭}の"&underdot(red,1px){//}"を削除する。&br()&font(b,blue){&underdot(red,1px){//}ck.renbanURL = true; //URLのみの行が連続する場合、各行に番号を振る}&br()目的の機能を利用するには、行頭の"//"を削除するなど、編集する必要があります。&br()スクリプトファイルの中身をメモ帳等のテキストエディタで参照しファイル内のコメントに従うか、自力で編集してください。 +&bold(){スクリプトのパーミッション設定}&br()今回の例ではこの操作は必要ありません。&br()利用する機能にはパーミッション設定が必要な場合があります。ファイル内に促す記述があれば従ってください。&br()「メインメニュー」→「設定」→「外部コマンド」→「スクリプト」 で、利用するスクリプトのテキストエリアに英字を入力することで設定できます。 +&bold(){スクリプトの読み込み}&br()「メインメニュー」→「ファイル」→「再読み込み」→「rescheck.js」 で、ステータスバーに「rescheck.jsを起動しました」と表示されれば成功です。 **使い方 起動に成功すれば、所定の動作で条件が合えば機能が自動実行します。 ***例)rescheck.jsの機能を使用する。 更新して新着レスを取得するなどすれば、設定例だと、URLの行頭に番号が振られるはずです。 ---- *スクリプトFAQ **scriptの数が多く、フォルダ内がごった返しているので整理したい '/'または'\'を区切り文字として サブフォルダ内のスクリプトファイルを指定することができます。 //scriptフォルダ内にtestという名前のフォルダを作りそこに格納する $SCRIPT test/example.js -"system"と"lib"は予約フォルダ名ということにしておいてください。 -v2c.getScriptSubFile(n) による他のスクリプトファイル名との衝突に注意してください。 **スクリプト実行時に「Cannot run program~」というエラーが出る パス区切り記号としての¥(バックスラッシュ)が1つしかない可能性があります。 WindowsのFirefoxで2chのHPを表示させる例: v2c.exec('"C:\\Program Files\\Mozilla Firefox\\firefox.exe" http://www.2ch.net/'); と言ったように、¥は2つ記述する必要があります。 **スクリプト実行時に「access denied」や「~Permission」というエラーが出る パーミッションの設定が間違っている可能性が高いです。 下記の外部コマンド登録例でいうと&underdot(red,1px){F}の部分です。 #blockquote(){${SCRIPT:&underdot(red,1px){F}} hoge.js} 各スクリプトで指定する文字は異なります。 基本的にスクリプトファイル(~.js)の中に設定法が書いてあるはずなので、設定が間違っていないか確認して下さい。 マウスオーバーでスクリプトを起動するようにしている場合は、URLExec2.dat内の記述も間違っていないか確認して下さい。 post.js等のフォルダに保存するだけで適用されるシステム系スクリプトの場合は、「外部コマンド」→「スクリプト」タブからパーミッション設定を確認してください。 **スクリプト実行時に「Cannot find function~」というエラーが出る V2Cの最新機能の可能性があります。V2Cを更新してください。 テスト版の場合は更新チェックの対象にならないため本スレ,スクリプトスレで作者のレスを探してください。 **Javaを更新後、スクリプト実行時に「Cannot add a property to a sealed object~」というエラーが出る スクリプトの修正が必要となります。 1.7.0_01(1.6.0_29)以降に採用されているRhinoが更新されたためecma-262 5th準拠となりホストオブジェクトは拡張禁止(常にObject.isExtensible()==true)となりました。 このためホストオブジェクトに新たなプロパティを追加するコードではエラーが発生し、部分修正が必要となります。 //*(作成・編集者向け)スクリプトFAQ *スクリプト開発者向け情報 |書きかけの項目です。加筆、訂正募集中。| //参考:ぶるるる [[V2Cスクリプト作成メモ>http://sarasate.seesaa.net/article/234332752.html]] //>本当はwikiに書きたいところだけど、こっちの方が気楽に書けるので・・・だもんでwikiへの転載は大歓迎。後、もし嘘書いてたら教えてください。 //ソース例: //#highlight(linenumber,javascript){{ //function test() { // var hoge = "テスト"; // v2c.println(hoge); //}; //test(); //}} // //汎用性のあるスクリプトテンプレートってのはどうですかね。 //例えば、クリップボードの内容を特定のソフトに引数を付けて送ると言ったようなものです。 //http://yy61.60.kg/test/read.cgi/v2cj/1304861674/585 //のようなものです。wikiに追加するとしたら ////【登録場所】 レス表示 ////【ラベル】 テスト ////【内容】 テスト ////【コマンド】 ${SCRIPT:Fx} temp.js ////【スクリプト】 //var vcx = v2c.context; //vcx.setClipboardText(vcx.selText); //v2c.exec('(引数付きのパス)'); //こんな感じですかね。。。 **v2cparms.txtでの変更によるバグに関して Rhino1.7R3のバイトコードコンパイラにはバグがあって無限ループに陥ることがあるのでシステムプロパティrhino.opt.levelを変更してはいけません。 v2cparms.txtでauxargs=-Drhino.opt.level=<-1以外>とか絶対やらないように。 **V2Cの返す値はJavaのオブジェクト V2Cが返す値はJavaのオブジェクトであるためスクリプトから扱うにはjavascriptの型に変換する必要があります。 とくに文字列は注意が必要でswitch文では比較に==ではなく===が行われるためjavascriptの文字列とjavaの文字列はマッチしません。 #highlight(linenumber,javascript){{ switch(th.board.key){ case "software":// コレではマッチしない } //java to javascript as type string var jsKey = String(th.board.key); switch(jsKey){ case "software":// javascriptの文字列ならマッチする } }} 配列もjavaの配列なのでいつものおまじないが必要。 #highlight(javascript){{ var refResIndex = Array.prototype.slice.call(res.refResIndex);}} **OpenJDK RhinoとMozilla Rhinoの違い OpenJDKとmozillaの実装の差異については[[ここ>http://jdk7.java.net/rhino/README.TXT]]を参照。 ただし、バージョンに関してOpenJDK版は1.7R3がリリースされる前にリポジトリから取ってきたようなのでリポジトリのタグ1.7R3やリリースされた配布物とは違います。 どのリビジョンかは不明ですがOpenJDKが利用しているソース以降のバグフィックスや機能追加、仕様変更などは反映されていません。 そのためデフォルトの言語バージョンは1.8ですがRhinoのjavascript1.8実装は段階的に行なわれているのでOpenJDKのRhinoでは利用できない言語機能が沢山あります。 1.7R3がリリースされて1年以上経つのでバグも沢山ありますが踏んじゃった場合自分で辿るしかありません。 ***constのバグ >どのリビジョンかは不明ですがOpenJDKが利用しているソース以降のバグフィックスや機能追加、仕様変更などは反映されていません。 これに関連してconst定義するとバインディングは行なわれ再定義も不可能ですが値が常にundefinedになります。 **LiveConnect rhinoにはjavaと通信するためのLiveConnectという仕様があります。 Packagesという変数にjavaのパッケージが含まれているので"Packages." + FQCN(完全修飾クラス名)でjavaのクラスにアクセスできます。 よく使われるパッケージはトップレベルにすでに定義済みです。自分でインポートする場合はJavaImporterを使います。 importPackageやimportClassはトップレベルを汚染しメモリリークするので使用は控えましょう。 また、java beansプロパティに準拠したメソッドはプレフィックスset/getと関数呼び出しの括弧を省略し代入と参照の形で書くことが出来ます。 #highlight(linenumber,javascript){{ //自分でインポート var swingNameSpace = JavaImporter(Packages.javax.swing); //よく使われるパッケージは定義済み var f = new javax.swing.JFrame("test"); //自分でインポートしたパッケージを参照 var btn = new swingNameSpace.JButton(test); //beans property access f.visible f.visible = true;}} ***メソッドオーバーロードの明示的解決 LiveConnectではメソッド呼び出し時に期待される型が異なるとエラーになります。 メソッドのオーバーロードが存在する場合がそれにあたりますが、そのときは明示的にオーバーロードを解決する必要があります。 オーバーロードの明示的解決にはブランケット記法を用いてobj["メソッド名(シグネチャ)"]と書きます。 #highlight(linenumber,javascript){{ var f = new javax.swing.JFrame("test"); //シグネチャは完全に一致する必要がある f["setVisible(boolean)"](true)}} ---- LiveConnectの詳細な仕様は[[ここ>https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/LiveConnect_Overview]] ---- **チューニングについて javaの現行バージョンが7となったのでjava7前提の話。 また、同じスクリプトが何度も実行されるときキャッシュされている可能性があります。 OpenJDKのRhinoは1.7R4で入った最適化が入る前のバージョンなので最適化が入った部分を比べると2~5倍程度遅い。 そのうち特にV2Cに関わる部分は文字列操作やLiveConnect、ついで型変換や正規表現と多岐にわたります。ここら辺で上記の差が生まれます。 ***文字列結合 文字列を結合するときはjava.lang.StringBuilderを使うか配列に代入して最後にArray.prototype.joinすると早い。 #highlight(javascript){{ var buff1 = new java.lang.StringBuilder(); //foo var buff2=[]; //bar buff1.toString(); buff2.join("");}} ただし数千ループくらいなら結合演算子だろうがStringBuilderだろうが配列だろうが変わらない。