E*TRADE証券の株式情報ページからYahooファイナンスへリレー検索

E*TRADE証券で株価をチェックする際に、同時に「Yahooファイナンス」のチャー トや掲示板を併用して見ることが多いのだが、わざわざ銘柄コードをコピペして 検索フォームに入力するのが前々から面倒だったので、GreaseMonkeyを使って
- 株式情報ページのhtmlから銘柄コードを抜き出す
- 抜き出した銘柄コードを検索するリンクをページ内に追加
というスクリプトを書いた。
このページの読者にとって有益かどうかはさておき、作ったので公開しておく。
E*TRADE証券の株式情報ページからYahooファイナンスへリレー検索
以下技術解説。こっちのほうがこのページの読者向けかな?
XPathによるhtml要素の抜き出し
今回、
- 銘柄コードが書かれているTextNodeを取得
- リンクを挿入する場所を特定
するのにXPathを使ったのだが、htmlソースを眺めながら、ないしはDOMの構造を 眺めながらXPathを考えるのは激しく大変なので、 XPatherというFirefoxの拡張を使った。これを使えばDOM Inspectorの機能が拡張され、 XPath検索機能が使えるようになったり現在注目しているノードのXPath表現が分 かったりする。激しく便利。
銘柄コードの取り出し
XPathで「(8701) JASDAQ」と書かれているノードを取ってきて、正規表現で銘柄 コードだけ抜き出す。TextNodeからテキストを抜き出す方法が分からなかったけ ど、text_node.dataで良いらしい。
リンクの挿入
document.createElement()でせっせと作り、親ノードを指定してinsertBefore() で挿入。
元々の株式情報ページがtable主体のレイアウトになっていたので、好きではな いのだが馴染ませるために同じようなレイアウトをDOMで作成。しかしDOMでhtml 構成するのは面倒。今回作成したJavaScriptの半分近くは単にリンクやテーブル を作るだけだったりする。
日本語文字列の表示
GreaseMonkeyスクリプトに日本語を書いて加工後のhtmlに日本語を表示しようと しても日本語が文字化けするので、 Unicode Number Entity Reference Converterのページから「日本語 → Unicode実体変換」を行なった結果の文字列を書くこ とで日本語文字列を入れることにした。この方法でもtitle要素に入れた日本語 は化けてしまうのだが、実害ないので放っておくことに。
各種リファレンス
今回のスクリプトを書く場合に限って言えばXPathの何たるかを知らなくても良 いのだけど、このページは 自分で書いたXPathの結果を確認出来るページがあってXPathを書く練習をするにはもってこいなので紹介しておく。
Mon, 26 Jun 2006, 00:27 [/tech] permanent link
Amazonの書籍紹介ページからASINをクリップボードにコピーするbookmarklet
cf. 最速インターフェース研究会 :: Firefoxでテキストをクリップボードにコピーする方法
この前副産物で作ったbookmarkletだが、FirefoxにはJavaScriptからクリップボー ドにコピーする手段がないためプロンプトに表示して[CTRL]-Cでクリップボード にして使うという方式を取っていた。
しかしFlashと組み合わせるとクリップボードに書き込めるらしい。しかも、そ のFlashをサーバに置かずにJavaScript自体に含める方法もあるということで、 bookmarklet化した。
それのリンクを張ろうと思ったのだが、今の日記システムのパーサでは素のhtml を書けない(実体参照変換を禁止するコマンドを使っていても勝手に変換してし まう)ので、仕方なくテキストで書くことに。
javascript:(function(){function s(text){var url = ['data:text/html;charset=utf-8;base64,PGJvZHk+PC9ib2','R5PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKGZ1','bmN0aW9uKGVuY29kZWQpe3ZhciBzd2ZfZGF0YSA9IFsKICdkYX','RhOmFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoO2Jhc2U2','NCxRMWRUQjJ3JywKICdBQUFCNG5EUGdZbGpBd01qSTRNejAlMk','YlMkY5JTJGZTJaZkJnYUdhV3dNRE1uNUthJywKICdrTU10TjRH','ZGdaZ1NJTXdaWEZKYW01UUFFJTJCQm9iaTFCTG5uTXlDcFB6RW','9oU0dJJywKICdQRnAlMkZBeHNEREJRa3BGWkRGUUZGQ2d1eVM4','QXlqSTRBRVVCaXkwVndBJTNEJTNEJwpdLmpvaW4oIiIpOwpkb2','N1bWVudC5ib2R5LmlubmVySFRNTCA9IFsKICc8ZW1iZWQgc3Jj','PSInLHN3Zl9kYXRhLCciICcsCiAnRmxhc2hWYXJzPSJjb2RlPS','csZW5jb2RlZCwnIj4nLAogJzwvZW1iZWQ+JwpdLmpvaW4oIiIp','Owp9KSgi',btoa(encodeURIComponent(text)+'")</'+'script>')].join("");var tmp = document.createElement("div");tmp.innerHTML = '<iframe src="'+url+'" width="0" height="0"></iframe>';with(tmp.style){position ="absolute";left = "-10px";top = "-10px"; visibility = "hidden";};document.body.appendChild(tmp); setTimeout(function(){document.body.removeChild(tmp)},1000);};s(document.defaultView.asin);})();
「新規ブックマーク作成」で、上のテキストをコピペしてURL欄に張り付けると 使える。たぶんWindowsのFirefox限定?
応用編で、タイトル文字列をクリップボードにコピーするものも作ってみた。使 い方は上と同じ。
javascript:(function(){function s(text){var url = ['data:text/html;charset=utf-8;base64,PGJvZHk+PC9ib2','R5PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKGZ1','bmN0aW9uKGVuY29kZWQpe3ZhciBzd2ZfZGF0YSA9IFsKICdkYX','RhOmFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoO2Jhc2U2','NCxRMWRUQjJ3JywKICdBQUFCNG5EUGdZbGpBd01qSTRNejAlMk','YlMkY5JTJGZTJaZkJnYUdhV3dNRE1uNUthJywKICdrTU10TjRH','ZGdaZ1NJTXdaWEZKYW01UUFFJTJCQm9iaTFCTG5uTXlDcFB6RW','9oU0dJJywKICdQRnAlMkZBeHNEREJRa3BGWkRGUUZGQ2d1eVM4','QXlqSTRBRVVCaXkwVndBJTNEJTNEJwpdLmpvaW4oIiIpOwpkb2','N1bWVudC5ib2R5LmlubmVySFRNTCA9IFsKICc8ZW1iZWQgc3Jj','PSInLHN3Zl9kYXRhLCciICcsCiAnRmxhc2hWYXJzPSJjb2RlPS','csZW5jb2RlZCwnIj4nLAogJzwvZW1iZWQ+JwpdLmpvaW4oIiIp','Owp9KSgi',btoa(encodeURIComponent(text)+'")</'+'script>')].join("");var tmp = document.createElement("div");tmp.innerHTML = '<iframe src="'+url+'" width="0" height="0"></iframe>';with(tmp.style){position ="absolute";left = "-10px";top = "-10px"; visibility = "hidden";};document.body.appendChild(tmp); setTimeout(function(){document.body.removeChild(tmp)},1000);};s(document.evaluate(%22//b[@class='sans']%22, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent);})();
今回の件以外にも、今のこのページはいろいろ不都合あるからblog移行を検討し ようかなぁ……。まぁそれは別件で書くか。
Sat, 27 May 2006, 00:16 [/tech] permanent link
続・Amazonの商品紹介ページに近所の図書館検索のリンクを追加
以前作ったGreaseMonkeyスクリプトが、AmazonのURLの仕様変更に伴い動かなくなっ てたので修正。これを機に取ってきただけのスクリプトを見直してみる。
1 function libsearch() {
2 var asinmatch = document.location.href.match(/\/product\/([^/]*)\//);
3 var asin = null;
4 if (asinmatch) {
5 asin = asinmatch[1];
6 }
7 if (asin){
8 var header = document.evaluate("//b[@class='sans']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
9 if (header) {
10 var spl_link = document.createElement('a');
11 spl_link.setAttribute('href', '(図書館検索CGIなどのURL)');
12 spl_link.setAttribute('title', 'Search Library');
13 spl_link.innerHTML = '</br><span style=\"font-size:90%; background-color:#ffffcc;\">» Search Library!</span>';
14 header.parentNode.insertBefore(spl_link, header.nextSibling);
15 }
16 }
17 }
おおざっぱに言うと、
- URLからASINを取得(2〜6行目)
- 本のタイトルが書かれたelementを検索(8行目)
- 本のタイトルが書かれたelementの親エレメントに、検索CGIへのリンクが含まれたelementを追加する。場所は本のタイトルが書かれたelementの次(9〜16行 目)。
という感じか。ASINを得る方法はベタというか、HTML解析してとかじゃなくて URLをそのまま使っていたとは。盲点だった。
この副産物として、 Amazonの書籍紹介ページからASINコードを取り出すbookmarkletを作ってみた。こちらは、document.defaultView.asinというプロパティを使っ ている。これは商品紹介ページをfirefoxのDOM Inspectorでつらつらと眺めてい たら見つけて、上記のスクリプトもこれを使えば簡単だと思ったら、スクリプト からは取得出来なかったのでURLから取るようにしたという経緯がある。
Thu, 25 May 2006, 00:04 [/tech] permanent link
Amazonの商品紹介ページに近所の図書館検索のリンクを追加

このページの作者が作られた、「Amazonの商品紹介ページに世田谷図書館の検索ページへの リンクを付与する」というスクリプトを改良して、自分の近所の図書館向けに対 応してみた。これは Greasemonkeyという、出力htmlをクライアント側で加工してブラウザに表示するという Firefoxの拡張で実現している。
検索CGIがどういうqueryを必要としているかはhtmlソースを見れば分かるが、そ れよりも実際にサーバに送っている文字列を見た方が楽なので、 Live HTTP Headersの拡張をインストールして調べた。また最近のCGI系のライブラリは、GETで渡さ れたかPOSTで渡されたかを気にせずともプログラムが組めるので、逆に言うと htmlにPOSTで送るように書かれていてもGETで送ることで同じように処理出来て しまうことが多い。この図書館もそうだった。
で完成。……うわ、これむちゃくちゃ便利だ。今までいちいち図書館の検索ペー ジに飛んでISBNを打ち込んでいたのがわずか1クリックに。すごいよ Firefox+Greasemonkey。
Tue, 07 Mar 2006, 23:57 [/tech] permanent link
Linux環境構築への道 4日目
www.xemacs.orgから最新のベータ版(21.5.23)をビルドしてみるも、これも日本 語のファイルを読み込んだ途端にフリーズする(--with-mule付きでコンパイルし たので、日本語に全く対応してないわけではないはず)。 これはもうemacsのバージョンとは関係ないのかも……でも他の日本語フォント を使うアプリケーション(EvinceやFirefox)は問題なく動く。
使っているフォント側に問題があるのかと思いemacsは別のフォント(-fn 8x16) を試してみたが、結果は同じだった。 今日安定版が21.4.18に上がっていることに気づいてこれをyumでインストールし てみたが、結果は同じ。
もう駄目だ。Linux使うのは諦めよう。
自分の問題解決能力ってかなり低下しているなぁ……。まぁ昔は時間もあったし コストパフォーマンス度外視で調査していた側面もあったりはするけど。
Sat, 10 Dec 2005, 00:28 [/tech] permanent link
Linux環境構築への道 3日目
xemacs関係のソフトを全部消してemacs(21.4.5)を入れるも、そっちも刺さる。 日本語のファイルを開いたときに刺さる可能性がかなり高く、日本語のファイル を開いてスクロールさせるだけでプログラムが固まってしまう。実は、もしかし たらemacsもxemacsも関係ないのかも知れない。
その他の要因
- utf-8の日本語ファイルも、euc-jpの日本語ファイルも関係なく刺さる。
そして相変らずググってもそれらしい記事は見つからず。後試せそうなのは、
- 自分でコンパイルする
- yumを使わず、どっかからrpmを持ってくる
- X(GNOME)で日本語を表示するとアプリケーションが刺さるという観点から調査仕直す
- (上関連)GNOMEを辞めて、KDEや他のWindowManagerを試してみる。
- → KDEでも同じ現象が起きる。
- → WindowsマシンからPuTTYで接続してemacsを起動した場合、X環境でのemacsと同じような操作をしても刺さらなかった。
- Linuxを辞めて、FreeBSDにする
くらいか。正直最後のはやりたくないんだが、(X)Emacsの使えないUNIX系OSなん て自分にとって何の価値もないので仕方がない。
Tue, 06 Dec 2005, 00:17 [/tech] permanent link
Linux環境構築への道 2日目
xemacsがまだ刺さる。XIMの問題かと思っていた、find-fileしてファイルを開い た直後に固まるという現象がまだ起こるのだ。
しばらくググッて同様の現象に悩む人がいないか探してみたが、それらしいバグ は報告されてないようだ。xemacsのバージョンも確認してみたが最新(21.4.17)。 このバージョンは今年の2月にリリースされていたもののよう。
xemacsがこれだけ不安定だと、一部の作業をLinuxに移すメリットがまるでない ので、何としてでも原因を追及して対策しないといけないのだが……しかしハマ るねぇ。出来るだけ回避したいのに。
Fri, 25 Nov 2005, 00:08 [/tech] permanent link
Linux環境構築への道 1日目
ここ数年は趣味でUNIX系OSに触れることはwww.sokohiki.orgのメンテ以外では全 然なかったのだけど、いろいろな条件が重なったので、久しぶりにUNIX系OSを触っ てみようという気になった。
- 旧sayakaのHDD(40G)が空いた。
- WinXPにウィルス対策ソフトを入れて、日常作業のうちいくつかの作業の待ち時間が耐えられないほどになった。
- UNIXのシェルが使えたら便利になる局面がいくつかあった。かと言ってcygwinでは満足出来なかった。
で、今までずっとFreeBSDを使い続けていたのだが、
- FreeBSDで「使える」ようになるまでいろいろ設定するのは辛い
- Linuxなら簡単そうだ(本当にそうなのかはさておき)
- Linuxにも一度は触れておきたい
ということで今回はLinuxに挑戦。ここで問題になるのがディストリビューショ ンなのだけど、長いものには巻かれろってことで「Fedora Core」に。
この調子で書き続けると長くなりすぎるので、箇条書きで。
- 前日にFedora Core4が入ったムック本(CD-ROMにて収録)を購入。
- インストールに一度失敗する罠。カスタム設定でいろいろ設定したのに……。
- 2度目のインストール時には面倒なので「デスクトップ用途」を選んでほとんどおまかせ。無事インストール完了。
- 追加で「開発ツール」を入れてたら、「CD1を入れてください」→「CD2を入れてください」→「CD1を入れてください」→……と言われ続け、10回以上はCD を入れ換えさせられる羽目に。
- インストール直後から音が鳴る。すげぇ。
- Xの設定ファイルも自動作成で何もしなくても良いのか。すげぇ。
- Firefoxサクサク動く。使用感もWindows版とほぼ同じ。
- デュアルディスプレイの設定まで出来てしまうのか。すげぇ。
- sambaを入れてもLANDISK(I・O DATA製、たぶんsambaでフォルダ公開)がファイルブラウザから見えない。 LANDISKのホスト名をDNSに登録して直接マウントさせたら見えるようになった。 でもこれだと自動マウントになってるっぽいので、emacsなどから触るときには 都合悪いな。
- emacsでfind-fileするとかなりの確率で刺さるので、xemacsに乗り換え。しかしそれでも刺さる。良く調べたら、[CTRL]+[SPACE]でXのIMを起動すると刺さっ ている様子。emacsが刺さっていた原因もこれかも。
- で、
env XMODIFIER='@im=None' xemacs
というシェルスクリプトを書いてこれを起動するようにして対処。 - GNOMEにはbiffアプレットはないのかなぁ?
- emacsのフォント設定ってどうやるんだっけ?
とりあえずはこんなところ。Win、Linux共にデュアルディスプレイで、CPU切り 換え器でマウス・キーボードだけ入れ換え。モニタの切り換えは手動だけど、右 画面はLinuxで左画面がWinなどという状態が作れるので便利。
ひとまずの目標は、
が出来るところまで持っていくことか。メールはwlかmew入れたらすぐだろうか ら、問題はパッケージ化されてない小さなemacs-lispと~/.emacs、それにフォン トか……。
Wed, 23 Nov 2005, 23:53 [/tech] permanent link
C#
最近引っかかってきたので勉強することにした。C++は使えるのでC++との違いを 中心に勉強。
参考にしたページは こちら。
C++と違う点は……面倒なので全部は網羅してないけど。
- メンバ変数、メンバ関数の定義がJavaっぽい。
- 基本的に参照型。
- 構造体はC++と大きく違い、クラスに比べていろいろな制限がある。あと値型として扱われる。
- 参照を渡すときにはref、未初期化の参照を渡す場合はoutを使う。
- ボクシング、アンボクシング
- メンバ変数やメンバ関数の隠蔽にはnewというキーワードを使う
- 仮想関数の宣言にはvirtual、仮想関数の継承にはoverride。
- これ以上継承させたくない場合にはsealed(Javaのfinal)。
- アクセサを簡単(?)に定義出来る「プロパティ」という仕組み。
- 「インデクサ」という仕組み。配列プロパティとでも言うべきか。
- 「読み取り専用」を指定するreadonlyキーワード。
- enumはSystem.Enumを基底した型。式中に含めればToString()が呼び出され、名前が返される。
- 演算子のオーバーロードにおいて、例えば"<<"演算子をオーバーロードすれば自動的に"<<="演算子もオーバーロードされる。C++は"<<="演算子をオーバー ロードしてから"<<"演算子を"<<="を使って記述するという方法が一般的だった から、ちょっと違和感がある。
- 多重継承不可、インターフェースを使う(Javaと同じ)。
- 型チェック(is)、型変換(as)。
- usingステートメント。namespaceの参照とは似ても似つかぬ使い型だなぁ……。同じキーワードで異なる使用方法があるというのはいかがなものか。newもそう だよなぁ。
- checked,unchecked。桁溢れのチェックを行う/行わない。
- delegate。C++でこれと同じことを行うのはすごく大変なのよねぇ……。
- event。「delegateの用途限定版」+「プロパティ」といったところか。
- attribute。どうしてこういう仕組みが必要なのか、どこで使うと便利なのか良く分からない。あと言語仕様がクラスの命名規則にまで関与するのは正直気持ち悪い。
- いちおうポインタも使えるらしい。
などか。
Mon, 10 Oct 2005, 01:06 [/tech] permanent link
skkのかなモードで、":"をタイプしたときに半角で出て欲しい
カナモード時のキー入力に対する変換文字は、
- skk-rom-kana-base-rule-list: デフォルト設定
- skk-rom-kana-rule-list:ユーザ追加の設定
を使って決定されるらしい。今は、":"(半角)をタイプしたときに":"(全角)が 出力されるように、skk-rom-kana-base-rule-list中に
(setq skk-rom-kana-base-rule-list
'(
...
(":" nil ":")
...
)
と書かれているようだ。というわけで、skk起動時にこのエントリを削除するよ うにしてみた。
; オマケ。add-hookする際にいちいちlambda定義しなくて済むように。
; cf. http://sodan.org/~knagano/emacs/dotemacs.html
(defmacro defun-add-hook (hookname &rest sexplist)
"add-hook のエイリアス。引数を関数にパックして hook に追加する。"
`(add-hook ,hookname
(function (lambda () ,@sexplist))))
(defun-add-hook 'skk-load-hook
(setq skk-rom-kana-base-rule-list
(delete (assoc ":" skk-rom-kana-base-rule-list) skk-rom-kana-base-rule-list)))
うまくいったが、ここまで辿りつくのに1時間15分もかかってしまった。
Wed, 01 Jun 2005, 00:42 [/tech] permanent link