2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012-05-26(土)
■[Web]Yahoo! Axisの秘密鍵を読んでみる
Yahoo! AxisというWebブラウザ用拡張機能とiOSアプリが公開された。Yahoo!のWebブラウザだ (そしてGoogleに挑戦している)、という触れ込みがニュースに流れたが、quick answersの面白さはあるものの、Webブラウザという表現は適切ではなく、Webブラウザの上で動きWeb体験を提供する何か、だと思う。
拡張機能に秘密鍵ファイルが同梱されていることが話題になったので、早速抜き出してみた。抜き出すのは簡単で、Google Chromeに拡張機能をインストールしてユーザ設定ディレクトリに展開された拡張機能ディレクトリから取ってくればいい。Axisは他にも色々セキュリティ的に危ない出来になっているので、インストールを推奨せず(晒し者にするためか)ファイルを配布している人もいる。
拡張機能の中身を見てみると、build.xmlがあり、ビルドツールにantを使っていたことが分かる。Chrome Web Store経由の配布ではなく、Yahoo!のサーバから配布するために、拡張機能をパックするtargetが定義されている。その際に、Yahoo!が作成したものであることを証明するための秘密鍵を読ませる必要があり、build.xmlと同じディレクトリに置いていたことで、今回のようなミスが発生したと考えられる。
ところで、拡張機能.crxというパックされたファイルには、証明書(the author's RSA public key)が埋め込まれている。
試しに、この埋め込まれた証明書と、うっかり公開されてしまった秘密鍵が、本当に対応しているのか確認してみた。
証明書と秘密鍵が対応している(正しいペアである)かどうかは、各データのmodulusフィールドが同じかどうかであることで確認できる。
$ python check_keys.py warning [YAxis_Chrome_v1_0_20120520.crx]: 306 extra bytes at beginning or within zipfile (attempting to process anyway) Public key modulus: D609E9C990D38EFADFB21AFBD227EDBAFCFE4C2E6A9ECE84B0A95DF9914E93DC832B7A70BF07FFE1D29317544EE57B6F249E740707919C364340FFD05F1EB2E2A5C321D8447BFBC4D18FA97C5E6ABB24AF3D60F0C37E46D2C820522EE2BE1ECB0D528B7A2A9C9309EC1E542A06BCFAFF2A3239C0F739F8C54E7BD9C5B52BEA65 Private key modulus: D609E9C990D38EFADFB21AFBD227EDBAFCFE4C2E6A9ECE84B0A95DF9914E93DC832B7A70BF07FFE1D29317544EE57B6F249E740707919C364340FFD05F1EB2E2A5C321D8447BFBC4D18FA97C5E6ABB24AF3D60F0C37E46D2C820522EE2BE1ECB0D528B7A2A9C9309EC1E542A06BCFAFF2A3239C0F739F8C54E7BD9C5B52BEA65 match!
modulusの値が同一なので、確かにこの秘密鍵は拡張機能の証明書に用いられていたものである、ということが分かった。
Yahoo included their cert private key inside the Axis Chrome extension.. (means anybody can sign extension as yahoo).. : netsecにある通り、この秘密鍵を用いることで、誰でもYahoo!の証明書付きの拡張機能を作ることが出来る。うまくすれば、このYahoo! Axis拡張機能を偽の拡張機能で置き換えることが出来るかもしれない (Yahoo! Axis拡張機能のpermissionsは [ "cookies","history","tabs","management","webNavigation","http://*/*","https://*/*"]となっていて、我々の情報がYahoo! Axisに対しほぼ全開になっている)。
2012-05-16(水)
■[Chrome]Google Chrome開発版でsocket APIを試す
Google Chromeの開発版で、拡張機能APIにソケット通信が追加されたそうだ。ネットワークプログラミングマニアとして、早速ドキュメントを読んでみた。
- 参考: Chrome supports TCP & UDP Sockets by Alex MacCaw
- ドキュメント: chrome.experimental.socket - Google Chrome Extensions - Google Code
しかし、参考ページにあるサンプルコード通りには動かなかったので、ドキュメントとエラーメッセージを見ながら実際に動くものを作ってみた。ちなみに、experimental.socket.htmlはドキュメントのどこからもリンクが張られていないので、まだ本当に実験段階の「使われるレベルにない」APIのようだ。
動作環境としてGoogle Chrome 21.0.1137.1 canary (Windows/Mac)を用いた。
まず、拡張機能でexperiment APIを使えるように、chrome://flagsの設定を変更し、再起動する。
次に、manifest.jsonに"permissions": ["experimental"]を記述した拡張機能を作り、Chromeの拡張機能管理画面から読み込む。
拡張機能のソースに同梱したtcpserver.py、udpserver.pyは単純なTCP/UDPソケットサーバの実装になっている。あらかじめ、Google Chromeが起動しているマシンで動かしておく。
拡張機能管理画面に表示されたこの拡張機能のbackground.htmlのInspect views (Developer tools)を開く。JavaScriptコンソールでexperimental.socket.*を使ったコードを書いてテストする。
ドキュメントにはsocket-typeとして'udp'で無ければならないとあるので、UDP通信のみをテストした ('tcp'を指定することも出来るようだが、通信を確認できなかった) 。
また、chrome.experimental.socket.write(..)の第2引数がstringとあるが、文字列を入れるとエラーになったため、APIのテストコードを参照し、文字列をArrayBufferに変換したデータを渡している。
// JavaScriptコンソール上で
> udp_socket_writer("127.0.0.1", 9998, "hello")
undefined
▼Object
bytesWritten: 5
> udp_socket_writer("127.0.0.1", 9998, "こんにちは、そけっと")
undefined
▼Object
bytesWritten: 30
$ python udpserver.py # ターミナル上でUDPサーバが動作している ('127.0.0.1', 62019) wrote: hello ('127.0.0.1', 51649) wrote: こんにちは、そけっと
UDPサーバにデータが送られていることを確認できた。逆にChrome側をサーバとして動作させることも出来るらしい。Webブラウザ同士のP2P通信実装も夢ではない。
2012-01-21(土)
■[Mac][PDF]iBooks Authorが出力するPDFの枠を消す
多分、iBooks Authorとしては、PDF出力はあくまで確認用として用いるべしといったところで、枠はそれを強調するための飾りなんだろう。
無料でこれほど使い易い(機能も適度に豊富な)出版ツールを他に知らないので、積極的に使いたい。そのためには、iBooks用EPUBだけでなく、出版(印刷、配布)用のPDFファイルも出力できなければ、応用範囲が広がらない (会社でiBooks Authorロゴ入りのPDFファイルを提出することは、タダコピでコピーした裏に広告が入っている書類を提出することとあまり違いがない。つまり、体裁が悪い)。
そこで、iBooks Authorが出力するPDFファイルの枠を消すことにした。思いついた方法は2つある。
pdfcrop
PDFCropはPDFファイルの余白を判断して切り取る。TeX Liveに同梱されているので、大抵の人の環境には入っているだろう。
これにそのままiBooks Authorの出力PDFファイルを引数として渡すと、上、左右は問題なく余白が切り取られるが、下の「 iBooks Author」の部分が余白とみなされず切り取られない。そこで、目視で測ったピクセル値を切り取り枠下側に加えた。
$ time pdfcrop --margins "0 0 0 -55" ibooks_pdf.pdf ibooks_pdf_cropped.pdf PDFCROP 1.32, 2011/08/10 - Copyright (c) 2002-2011 by Heiko Oberdiek. ==> 4 pages written on `ibooks_pdf_cropped.pdf'. real 2m51.121s user 2m43.072s sys 0m0.714s
$ identify ibooks_pdf.pdf ibooks_pdf.pdf[0] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.010u 0:00.009 ibooks_pdf.pdf[1] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.009 ibooks_pdf.pdf[2] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.009 ibooks_pdf.pdf[3] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.009 $ identify ibooks_pdf_cropped.pdf ibooks_pdf_cropped.pdf[0] PDF 922x598 922x598+0+0 16-bit Bilevel DirectClass 69.4KB 0.000u 0:00.019 ibooks_pdf_cropped.pdf[1] PDF 922x598 922x598+0+0 16-bit Bilevel DirectClass 69.4KB 0.000u 0:00.019 ibooks_pdf_cropped.pdf[2] PDF 922x598 922x598+0+0 16-bit Bilevel DirectClass 69.4KB 0.000u 0:00.019 ibooks_pdf_cropped.pdf[3] PDF 922x598 922x598+0+0 16-bit Bilevel DirectClass 69.4KB 0.000u 0:00.019
問題なく余白が切り取られているが、4ページのPDFファイルの処理に2、3分かかっている。
元のPDFファイルにあったメタデータはpdfcropの処理の過程で全て上書きされ、また、PDFデータは画像形式に変換されるので、元のPDFファイルにあった文字情報が失われる。文字を選択、コピー出来ないPDFファイルを作りたいのであれば問題ないが、そうでない場合は使い勝手の悪いPDFファイルとなるので注意が必要だ。
PDF Hack
iBooks Authorが出力するPDFファイルには/MediaBox [0 0 1024 748]はあるが、その他の枠情報は無い。
シェルコマンドでCropBox情報を加えてみた。枠の大きさは、pdfcropが判断した余白情報から決定した。
$ time sed -e 's;/MediaBox;/CropBox [52 75 973 673] /MediaBox;g' ibooks_pdf.pdf > ibooks_pdf_cropped.pdf real 0m0.004s user 0m0.002s sys 0m0.003s
pdfcropの時と同じ、4ページのPDFファイルを処理させてみたが、一瞬で終わってしまった。表示結果は、pdfcropを用いた場合とほぼ同じだった。
CropBox情報を加えたPDFは、プレビュー.appとGoogle Chromeで正常に見られることを確認した。ただ、一部のプログラムでは異常なPDFと判断されるようだ。
$ identify ibooks_pdf_cropped.pdf **** Warning: An error occurred while reading an XREF table. **** The file has been damaged. This may have been caused **** by a problem while converting or transfering the file. **** Ghostscript will attempt to recover the data. **** This file had errors that were repaired or ignored. **** The file was produced by: **** >>>> Mac OS X 10.7.2 Quartz PDFContext <<<< **** Please notify the author of the software that produced this **** file that it does not conform to Adobe's published PDF **** specification. ibooks_pdf_cropped.pdf[0] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.010u 0:00.019 ibooks_pdf_cropped.pdf[1] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.019 ibooks_pdf_cropped.pdf[2] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.009 ibooks_pdf_cropped.pdf[3] PDF 1024x748 1024x748+0+0 16-bit Bilevel DirectClass 95.8KB 0.000u 0:00.009
あくまで、PDFの表示枠情報を加えているだけなので、メタデータや文字情報はそのまま残っている。いざとなれば、CropBox情報を削除して元のPDFファイルに復元することも出来る。
pdfcropと比べ、処理が速く、使い易いPDFファイルが出力されることから、CropBox情報付加の方を今後採用することにする。
ついでに、これを簡単に実行するAppleScriptを書いた。
アプリケーションとして保存し、それにPDFファイルをドラッグアンドドロップすれば、PDFファイルと同じディレクトリにCropBox情報が付加されたPDFファイルが出力される(同時に複数ファイルが与えられた場合、それぞれのファイルについて処理を行う)。
2011-12-17(土)
■[TV]BRAVIAにHDDを接続
以前購入したSONY BRAVIA KDL-32EX420に、録画用HDDを接続するため、また、引越し前にデスクトップPCを処分し、一応取っておいたHDDが3つほどあるので、それを活用するために、AmazonでIDE/SATA→USB変換アダプタを購入した。
GREEN HOUSE SATA/IDE-USB2.0変換アダプタ 2.5インチHD対応 GH-USHD-IDESA
- 出版社/メーカー: グリーンハウス
- 発売日: 2007/05/31
- メディア: Personal Computers
- 購入: 91人 クリック: 567回
- この商品を含むブログ (15件) を見る
とりあえず、IDEの80GBを接続したところ、難なく認識。録画可能容量は70GBと出た。テレビで初期化すると、再度PCで初期化しなければ、PCに接続するHDDとして使えなくなるそうだ。
70GBで何時間くらい録画できるのか、テレビの設定を探してみたが見当たらなかったので、ググッてみると、1時間で10GB程度使うらしい。画質/音質設定でも変わるのだろうか。
従って、このHDDだと7時間くらい。大晦日の『絶対に笑ってはいけない空港 24時』は6時間だそうだから、なんとか収まりそう。
2011-12-11(日)
■[Chrome]Google Chrome拡張機能: Amazon to Yahoo! Bookstore
概要
解説
Google Chrome用拡張機能「Amazon to Yahoo! Bookstore」は、Amazonの書籍情報にYahoo!ブックストアへの検索リンクを追加する拡張機能です。
現在、Amazonのページ上における以下の箇所に、Yahoo!ブックストア検索リンクを表示します。
背景
昨日からYahoo!ブックストアを使い始め、
というよく理解出来ないカテゴリが並び(少年(少女)コミックと青年(女性)コミックの違いは何だ? BLはまだしもロマンスだけなぜ別?)、紙書籍基準で言えば旧作新作が入り交じって並ぶ「新着作品」リストがあり、検索の絞り込みは値段と出版社しかなく著者絞り込みは出来ない、という、本屋で本を買ったことがない人が作ったとしか思えないような中身にうんざりした。
改めて、本屋で僕がどうやって本を選んでいるのかということを考えると、本屋の棚は出版社順に並んでいるものの、各出版社棚では著者五十音順だし、背表紙が並んだ棚というのは一見した時の情報量が多いので、すぐに目的の本を発見できる。あるいは、目的を持たず本屋に訪れていると、新刊コーナや雑誌コーナに行き、新しい本との出会いを求めることもある。
角川書店が提供するBOOKWALKERは「作家一覧」というリストを提供しているし、メディアミックスされて今人気のある作品をすぐ発見できるようになっていたりして、かなり使い易い。Yahoo!ブックストアは11月に出来たばかりのようなので、これから改善するかもしれないが、利用者としては待っていられない。妙なガラパゴスちっくの独自フォーマットではなくEPUB(DRM付き)を提供し、複数の電子書籍提供サービスをまとめて利用できるYahoo!ブックストアを積極的に使っていこうと思うのに、読みたい本を見つけられなければ意味が無い。
さて、おそらく僕のWeb上の行動をほとんど知っているのはGoogleだと思うが、僕の本の趣味嗜好を知っているのはAmazonだと思う。Amazonのほしい物リストは結構詰まっているし、トップページに行けば、あえて買っていなかったり今まで知らなかったが確かに欲しいと思える本が並んでいる。「持っています」をクリックすれば余計なものは表示されず、割と精度がいいオススメ本が現れている。この仕組みを、この趣味嗜好データを、Yahoo!ブックストアで利用したいと思った。
そこで、AmazonとYahoo!ブックストアを繋ぐGoogle Chrome拡張機能を作った。僕はMacを使っているので、Amazonで書籍データを参照 → Yahoo!ブックストア検索リンクボタンクリック → (電子書籍があれば)そのYahoo!ブックストアページをChrome to PhoneでAndroid端末に転送 → Android端末で書籍データをダウンロード/閲覧 という流れになっている。
実際にAmazonでオススメされている本から辿り、時には検索し、良さそうな本を探し、Yahoo!ブックストアを参照していった。そうして分かったことは、やはり、まだまだ電子書籍化された本は、非常に少ないということだった。星新一で検索すると1件、筒井康隆は0件、ライトノベルも講談社ノベルスも無いし、漫画も中途半端な巻までしか出ていない。買って読んでみると、活字本なのに画像ファイル形式であったりして、電子書籍のメリットがほとんど見えないものも多かった。こればかりは、こちらからどうこう出来る問題ではない。ただ、出版社に、電子書籍に対する正しい理解が広まり、積極的な展開が行われるのを待つしかない。
2011-11-05(土)
■[Mac]Growl 1.3をビルドしてインストールする
App Storeで買うとver.1.3.1が170円。自分でビルドするとver.1.3が無料。経験はプライスレス。
http://code.google.com/p/growl/source/checkoutから、ソースをチェックアウトする。
ターミナルでソースのトップディレクトリに入り、generateHgRevision.shを実行 (hgRevision.hを生成)する。TARGET_BUILD_DIRがセットされていないので、カレントディレクトリを指定する (カレントディレクトリ直下にinclude/hgRevision.hが生成される)。
GrowlVersion.h内の#include "hgRevision.h"を#include "include/hgRevision.h"に書き換える。
Xcode 4.2でGrowl.xcodeprojを開く。ビルドターゲットをGrowl.appにセット、Project: GrowlとTargets:Growl.appの「Code Signing Identity」を「Don't Code Sign」に設定する。
ビルド。
もし前バージョンのGrowlをMacにインストールしている場合は、ソースディレクトリにあるRelease/Uninstall Growl.appを実行してアンインストールする。
Xcode:Project NavigatorのProductsに「Growl.app」が出来ているので、右クリック-「Show in Finder」。Debugディレクトリが表示されるので、Growl.appをどこか適当なところに移動。
2011-09-23(金)
■[Java]URI.resolveに注意
Jythonで例を示す。
>>> from java.net import URI >>> example = URI("http://www.example.com/") >>> example.resolve("index.html") http://www.example.com/index.html >>> exampleNoPath = URI("http://www.example.com") >>> exampleNoPath.resolve("index.html") http://www.example.comindex.html
ええー!
>>> uriNoPath = "http://www.example.org" >>> example = URI(uriNoPath) >>> if example.path == '': ... example = URI(uriNoPath + '/') ... >>> example.resolve("index.html") http://www.example.org/index.html









