これまで、物理的なコンピュータの上でプログラムを動かそうとするときに必要な、ハードウェアの制御、プロセスの管理などなど面倒なことをやってくれるソフトウェアのことをオペレーティングシステムと呼んでいました。
最近はいままでコンピュータの上でやっていたような作業、エクセルのシートを作るだとか、パワーポイントで資料を作るだとか、ファイルを保存しておくとか、そういった作業が全部ブラウザの向こう側にあるウェブ上のアプリケーションだけでできるようになってきています。
手元のコンピュータで動いていたアプリケーションのかわりに、ブラウザの向こう側にあるウェブ上のアプリケーションを使うようになってきた結果ウェブがOSのように感じられるようになったことを指してWeb Operating Systemと呼ぶこともあります。(Web operating system - Wikipedia, the free encyclopediaによればもともとは、あるプロジェクトの固有名詞だそうです)
今はそれに対して、ブラウザを使ってインターネット上にあるデータを読み込んできて、その内容をに応じてまたインターネット上にデータを書き込んだりするのが一般的な使い方です。コンピュータに繋がっているディスクのデータを書き換えたりすることは少なくなりました。
もしWebがOSになるのだとしたら、そのOSに繋がっているストレージはやっぱりWeb上にあって、そうしたらそのストレージを操作するためのデバイスドライバは何?というところから、FUSEと、SITEINFOを使ったAutoPagerize/LDRizeについて考えてみました。
ほかにもRESTなWebサービスをマウントするRESTファイルシステム、FUSEで作ってみた:TKMR.blog.showでは、RESTのAPIを持つWeb上のサービスをファイルシステムとしてマウントすることができます。
まずこのRESTのAPIを持つウェブ上のサービスをマウントするRESTfsの構造と、ほんものの物理デバイスを管理するファイルシステムのドライバの構造を比較してみました。

現在のOSがストレージからファイルを操作するときにはopen, read, write, closeといったインターフェイスが使われています。このインターフェイスは、ファイルの操作をだけでなく、通信用のソケットやデバイスドライバの操作にも使われています。歴史的なことはわかりませんが、このインターフェイスがコンピュータ上で行いたかった様々な操作をうまく抽象化できたので結果として今まで生き残り、今でも標準的なインターフェイスとして利用されているのではないでしようか。コンピュータ上でよく行う操作をうまく抽象化したものがopen, read, write, closeのインターフェイスだと考えることができます。
どんなファイルシステムであってもOSからはすべて同じインターフェイス(open, read, write, close)で操作できるようにするための抽象化層がFSDです。FSDはファイルシステムごとに異なるディクトリツリーの管理方法や、ファイルの中身のデータが物理デバイス上のどこに書かれているかといった情報を管理しています。OSからファイルの読み取り要求があったときには、要求されたファイルが物理デバイス上のどこにあるかを調べてその位置を読みこむために(正しいかどうかかなり怪しいですが)、Linuxであればioctl, WindowsであればIoCallDriverというインターフェイスを介してハードウェアデバイスを管理しているデバイスドライバを呼び出します。
デバイスドライバは、物理デバイスがなんであれFSDからはすべて同じインターフェイス(ioctl, IoCallDriver)で読み書きできるようにするための抽象化層です。デバイスドライバはFSDから呼び出されると、渡されたパラメータに応じて物理デバイスの特定の位置を読みこみます。そのためには物理デバイスごとに異なるアドレスにマッピングされているコントロール用のレジスタに、物理デバイスごとに異なるコマンドを書き込む必要があるので、物理デバイスごとに異なっているその値をデバイスドライバの中に持っています。
この二つの抽象化層(FSDとデバイスドライバ)をはさんでいるので、OSは物理デバイスがHDDでもUSBメモリでもおなじ方法でファイルを読み書きすることができます。
RESTfsがOSに組み込まれたFUSEからopen, read, write, closeというインターフェイスで呼び出されるところまでは同じで、そこから先が異なります。OSからの要求を受け取ったRESTfsは、その要求をTwitterモジュールに送ります。TwitterモジュールはTwitterというウェブ上のサービス固有の認証方式や、アクセスする方法(GET/POST/PUTなど)、アクセスするべきAPIのURLやメソッド名を管理しています。
これはちょうど物理デバイスのデバイスドライバが、物理デバイスひとつひとつに固有のコマンドレジスタのアドレスやコマンドを管理しているのに似ています。
AutoPagerizeはウェブ上のサービスごとに異なるページの内容と次のページをXPathで表して、ブラウザでページの一番下までスクロールしたときに自動的に次のページの内容を今表示しているページにjavascriptでくっつけています。この各ウェブ上のサービスごとに記述されたXPathはSITEINFOと呼ばれています。LDRizeも同様に、ページの中のパラグラフ、そのページでリスト表示されているデータのひとつひとつをXPathで表して、キーボードのj,kでパラグラフを移動できるようにしています。
この仕組みをデバイスドライバと比較して下のような図にしてみました。
多くのウェブページは大量の情報を表示する方法として、ひとつのページに何十件かの情報を表示して、表示しきれなかった部分は次のページにわけて全部のデータを表示する方法を採っています。結果として、ウェブを見るときには、自分が探している項目が出てくるまでリスト表示されている項目をひとつずつ見て、そのページになければ次のページをロードしてまた項目をひとつずつ見る、という操作を頻繁にしています。
AutoPagerize,LDRizeは、ブラウザ上でよく行われる次のページを見ると次のパラグラフ見るをという操作をそれぞれインターフェイスとして持っていて、ページの一番下までスクロールしたときと、キーボードのjを押したときにFirefoxから呼び出されるようになっています。
OperaのFast Forwardもこの次のページを見るというインターフェイスをAutoPagerizeとは異なるアプローチで実装していると考えることができます。
pageElement)を取り出して現在のページに繋げます。そのためには現在表示されているページのDOMツリーの中でどの部分がpageElementかを知る必要があります。
LDRizeも同様に次のパラグラフ見るという要求を受け取ったときに、DOMツリーのどの部分がひとつひとつのパラグラフ(paragraph)かを知る必要があります。
pageElementもparagraphも、ウェブページによって異なっているので、AutoPagerize/LDRize本体とは切り離されて外部のSITEINFOによって管理されています。これはちょうどFDSが膨大な数が存在する個別の物理デバイスのパラメータを持たずに、物理デバイスの操作はデバイスドライバに任せているのに似ています。
AutoPagerize/LDRizeも、無限にあるウェブサイトごとに必要なパラメータを内部に持たずにSITEINFOに任せていると見ることができます。
open, read, write, closeというインターフェイスはコンピュータ上で頻繁に行われる操作をうまく抽象化することができました。ブラウザ上で頻繁に行われる操作というのは、まだ歴史が浅くどのようなインターフェイスが考えられるのか模索されている段階だと思われますが、次のページを見る、次のパラグラフ見る、という操作は紙媒体の時からずっとあるインターフェイスでもあり、今後も残っていくのではないでしょうか。
AutoPagerize/LDRizeはそのインターフェイスを実装しているのだと考えることができます。そして、無数のウェブページに対応するためにSITEINFOという抽象化層があり、この抽象化層はWeb Operating Systemにおいて、ストレージからデータ
を読み出すためのデバイスドライバの役割を果たしているということができそうです。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/178
comments