DiaryException このページをアンテナに追加 RSSフィード Twitter

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
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(土)

[]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に対しほぼ全開になっている)。

クールではないとか、Webの縮図だとか、色々言われているYahoo!だが、こういう甘さが本当に残念。

2012-05-16(水)

[]Google Chrome開発版でsocket APIを試す

Google Chromeの開発版で、拡張機能APIにソケット通信が追加されたそうだ。ネットワークプログラミングマニアとして、早速ドキュメントを読んでみた。

しかし、参考ページにあるサンプルコード通りには動かなかったので、ドキュメントエラーメッセージを見ながら実際に動くものを作ってみた。ちなみに、experimental.socket.htmlドキュメントのどこからリンクが張られていないので、まだ本当に実験段階の「使われるレベルにない」APIのようだ。

動作環境としてGoogle Chrome 21.0.1137.1 canary (Windows/Mac)を用いた。

まず、拡張機能でexperiment APIを使えるように、chrome://flagsの設定を変更し、再起動する。

f:id:LaclefYoshi:20120516220626p:image

次に、manifest.json"permissions": ["experimental"]記述した拡張機能を作り、Chrome拡張機能管理画面から読み込む。

拡張機能ソースに同梱したtcpserver.pyudpserver.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通信実装も夢ではない。

TCP通信が出来るようになったら、IRCクライアントを書きたい。

2012-01-21(土)

[][]iBooks Authorが出力するPDFの枠を消す

f:id:LaclefYoshi:20120121193753p:image

多分、iBooks Authorとしては、PDF出力はあくまで確認用として用いるべしといったところで、枠はそれを強調するための飾りなんだろう。

無料でこれほど使い易い(機能も適度に豊富な)出版ツールを他に知らないので、積極的に使いたい。そのためには、iBooksEPUBだけでなく、出版(印刷、配布)用のPDFファイルも出力できなければ、応用範囲が広がらない (会社iBooks Authorロゴ入りのPDFファイルを提出することは、タダコピでコピーした裏に広告が入っている書類を提出することとあまり違いがない。つまり、体裁が悪い)。

そこで、iBooks Authorが出力するPDFファイルの枠を消すことにした。思いついた方法は2つある。

pdfcrop

PDFCropPDFファイルの余白を判断して切り取る。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

f:id:LaclefYoshi:20120121212422p:image

問題なく余白が切り取られているが、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

f:id:LaclefYoshi:20120121214413p:image

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(土)

[]BRAVIAHDD接続

以前購入したSONY BRAVIA KDL-32EX420に、録画用HDD接続するため、また、引越し前にデスクトップPCを処分し、一応取っておいたHDDが3つほどあるので、それを活用するために、AmazonIDE/SATAUSB変換アダプタを購入した。

f:id:LaclefYoshi:20111217133112j:image

GREEN HOUSE SATA/IDE-USB2.0変換アダプタ 2.5インチHD対応 GH-USHD-IDESA

GREEN HOUSE SATA/IDE-USB2.0変換アダプタ 2.5インチHD対応 GH-USHD-IDESA

とりあえず、IDEの80GBを接続したところ、難なく認識。録画可能容量は70GBと出た。テレビ初期化すると、再度PC初期化しなければ、PC接続するHDDとして使えなくなるそうだ。

f:id:LaclefYoshi:20111217134038j:image

70GBで何時間くらい録画できるのか、テレビの設定を探してみたが見当たらなかったので、ググッてみると、1時間で10GB程度使うらしい。画質/音質設定でも変わるのだろうか。

従って、このHDDだと7時間くらい。大晦日『絶対に笑ってはいけない空港 24時』は6時間だそうだから、なんとか収まりそう。

2011-12-11(日)

[]Google Chrome拡張機能: Amazon to Yahoo! Bookstore

概要

f:id:LaclefYoshi:20111211210239p:image

f:id:LaclefYoshi:20111211210240p:image

解説

Google Chrome拡張機能Amazon to Yahoo! Bookstore」は、Amazon書籍情報Yahoo!ブックストアへの検索リンクを追加する拡張機能です。

現在Amazonのページ上における以下の箇所に、Yahoo!ブックストア検索リンクを表示します。

背景

昨日からYahoo!ブックストアを使い始め、

というよく理解出来ないカテゴリが並び(少年(少女)コミック青年(女性)コミックの違いは何だ? BLはまだしもロマンスだけなぜ別?)、紙書籍基準で言えば旧作新作が入り交じって並ぶ「新着作品」リストがあり、検索の絞り込みは値段と出版社しかなく著者絞り込みは出来ない、という、本屋で本を買ったことがない人が作ったとしか思えないような中身にうんざりした。

改めて、本屋で僕がどうやって本を選んでいるのかということを考えると、本屋の棚は出版社順に並んでいるものの、各出版社棚では著者五十音順だし、背表紙が並んだ棚というのは一見した時の情報量が多いので、すぐに目的の本を発見できる。あるいは、目的を持たず本屋に訪れていると、新刊コーナや雑誌コーナに行き、新しい本との出会いを求めることもある。

角川書店提供するBOOKWALKERは「作家一覧」というリスト提供しているし、メディアミックスされて今人気のある作品をすぐ発見できるようになっていたりして、かなり使い易い。Yahoo!ブックストア11月に出来たばかりのようなので、これから改善するかもしれないが、利用者としては待っていられない。妙なガラパゴスちっくの独自フォーマットではなくEPUB(DRM付き)を提供し、複数の電子書籍提供サービスをまとめて利用できるYahoo!ブックストアを積極的に使っていこうと思うのに、読みたい本を見つけられなければ意味が無い。

さて、おそらく僕のWeb上の行動をほとんど知っているのはGoogleだと思うが、僕の本の趣味嗜好を知っているのはAmazonだと思う。Amazonほしい物リスト結構詰まっているし、トップページに行けば、あえて買っていなかったり今まで知らなかったが確かに欲しいと思える本が並んでいる。「持っています」をクリックすれば余計なものは表示されず、割と精度がいいオススメ本が現れている。この仕組みを、この趣味嗜好データを、Yahoo!ブックストアで利用したいと思った。

そこで、AmazonYahoo!ブックストアを繋ぐGoogle Chrome拡張機能を作った。僕はMacを使っているので、Amazon書籍データを参照 → Yahoo!ブックストア検索リンクボタンクリック → (電子書籍があれば)そのYahoo!ブックストアページをChrome to PhoneAndroid端末に転送Android端末で書籍データダウンロード/閲覧 という流れになっている。

実際にAmazonオススメされている本から辿り、時には検索し、良さそうな本を探し、Yahoo!ブックストアを参照していった。そうして分かったことは、やはり、まだまだ電子書籍化された本は、非常に少ないということだった。星新一検索すると1件、筒井康隆は0件、ライトノベル講談社ノベルスも無いし、漫画中途半端な巻までしか出ていない。買って読んでみると、活字本なのに画像ファイル形式であったりして、電子書籍メリットがほとんど見えないものも多かった。こればかりは、こちらからどうこう出来る問題ではない。ただ、出版社に、電子書籍に対する正しい理解が広まり、積極的な展開が行われるのを待つしかない。

2011-11-05(土)

[]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」に設定する。

ビルド

もし前バージョンGrowlMacインストールしている場合は、ソースディレクトリにあるRelease/Uninstall Growl.appを実行してアンインストールする。

Xcode:Project NavigatorのProductsに「Growl.app」が出来ているので、右クリック-「Show in Finder」。Debugディレクトリが表示されるので、Growl.appをどこか適当なところに移動。

Growl.appを実行。設定画面が開き、インストール終了。

2011-09-23(金)

[]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

パスが省略されているかチェックする必要がある。