2010-05-10
■Chrome と Irvine を連携させるExtensionを作ってみた。
無さそうなんで作ってみた。かなり面倒だった。
原因は不明ですが、環境によって動作しない場合があるようです。
現状では私(id:deraw)がメンテするのが難しく、
@b2ox様がちゃんとコンテキストメニューが使用できる改良版を作成されていますのでそちらをおすすめします。
注意
- 実験的に作成した拡張です。使用は自己責任でお願いします。
- まずオプションから、Irvineをインストールしたフォルダ内にあるircom.exeのフルパスを設定してください。
- インストール後はChromeの再起動をしてください。(または現在開いているページの再読込を行ってください。)
- Chromeの制限で、右クリック(コンテキストメニュー)からは呼び出せません。
- 「すべてのURLを送る」「すべてのURLを送る(IMGを含む)」「リンクのインポート」「選択範囲のダウンロード」しか出来ません。
- Windows 7 x64上でしか動作確認してません。不具合があればご報告頂けるとありがたいです。(OSのバージョンやurl、可能であればIEやFirefoxで再現するかどうか)
- b2ox様の協力により、リンクや画像の上でalt+左クリックするとマウスカーソル位置のURLをirvineに送れるようになりました。
ただし、同時にchromeの「名前を付けて保存」ダイアログが表示されてしまうので手動で閉じてください。
インストール
過去のバージョン
更新履歴
0.2.1(2010/7/28)
- version 0.2の修正によって、Irvineへ送るURLが抜け落ちる問題が発生したので修正(ircom.exeの終了待ちをするよう変えた)
0.2(2010/7/20)
- b2ox様の修正を取り込みました。
- Windows XPで動作しなかった問題を暫定修正(ircom.exeに渡す引数を2000文字までに制限した)
0.1
- 初版
仕組みなど
- 基本的にFirefoxのIrvine用コンテキストメニュー拡張と同様に、ircomを経由して連携してます。
- 現在のChromeでは外部プロセスを起動できないので、NPAPIを使用して無理矢理起動してます。そのため、セキュリティ問題が発生する可能性があります。
- NPAPIプラグインはnixysaを使いました。これが無いと無理。ソースも一応置いておきます。
- Chrome拡張部分はGPLです。(Irvine用コンテキストメニュー拡張に倣いました)
参考にしたページなど
http://ido.nu/kuma/2009/11/22/chrome-npapi-nixysa/
http://ido.nu/kuma/2009/12/10/create-html-link-with-createlink-for-chrome-like-makelink/
http://dev.screw-axis.com/doc/chrome_extensions/ref/api/tabs/executeScript/
http://code.google.com/chrome/extensions/browserAction.html
http://blog.makotokw.com/memo/chrome-extension/#k7a8926c
http://gihyo.jp/dev/serial/01/chrome-extensions
http://groups.google.co.jp/group/chromium-extensions-japan
http://d.hatena.ne.jp/Constellation/20100311/1268272374
躓いたことなど
- コールバック内のErrorは握りつぶされるので、自前でErrorオブジェクトをconsole.errorしなければならない。
- embedのstyleをdisplay:noneにしたらプラグインが読み込まれなかった。
- chrome.tabs.sendRequestは非同期だから、コールバックが呼び出される前にpopupウィンドウを閉じるとコールバックが呼ばれない。
W32APIのCreateProcess/ShellExecute関数のパラメータは32kまで。
ShellExecuteExだともっと少ないかも。とりあえず2000文字までにした。
2009-11-18
■[プログラミング]"()" のない関数名とコードの生成
"()" のない関数名とコードの生成
http://msdn.microsoft.com/ja-jp/library/094z0768%28VS.80%29.aspx
#include <stdio.h> void funcn(); int main() { funcn; /* missing function call operator; call will fail. Use funcn() */ } void funcn() { printf("\nHello World\n"); }
理解はできるが、こんなコードが警告もなくコンパイル通ってしまうC/C++はやっぱい怖い
2009-10-13
■[プログラミング]malloc/freeでSIGSEGVが発生する。
以前あったことをメモっておく。
Solaris SPARCでCプログラミングをしてたとき、malloc関数(free関数)でセグメント違反が発生することがあった。
スタックトレースは下のような感じで。(アドレスは適当)
#0 0xfed4247c in realfree() from /usr/lib/libc.so.1
#1 0xfed42d88 in cleanfree() from /usr/lib/libc.so.1
#2 0xfed41ebc in _malloc_unlocked() /usr/lib/libc.so.1
#3 0xfed41db0 in malloc() from usr/lib/libc.so.1
#4 0x131e0 in main(argc=1,argv=0xxxxxxxx)
最初は、「ライブラリ関数内でバグっているんじゃないか」と思ったけど、調べるとどうやら違うみたい。
webで調べても濁した記述しか無くて、手元のDEBUG HACKSをみたらジャストな事例があった。
で何が悪かったかというと、自分のソースがバグってて、(セグメント違反になる前のどこかで)mallocした領域に対してバッファアンダーフローしてた。
どうやらmallocした領域のちょっと前に、ライブラリ用のデータを書き込んでいて、そこが破壊されるとそれ以降のmalloc/freeがおかしくなるようだ。
詳しくは pacsec.jp/psj06archive.htmlなどを参照。
それにしても、バッファアンダーフローした瞬間にはわからないから厄介だった。
