SimpleBoxes

solipo 0.03 (was solipo 0.01/0.02)

solipo ver 0.010.020.03 を公開しています。→ [solipo 紹介ページ]

solipo は、Windows 上で動作する polipo の GUI ラッパーアプリケーションです。

「solipo」をダウンロード

solipo 0.01 では、同梱した polipo.exe が正しく動作しないバグがあります。本日中に solipo 0.02 をリリースします。

[2008.03.20 追記] polipo.exe を修正したバージョン (solipo 0.02) を作成しました。

[2008.03.20 追記] キャッシュクリア機能が正しく動作しないバグを修正したかもしれない solipo 0.03 を公開しています。

Windows XP での動作を確認しています。おそらく Windows Vista や Windows 2000 でも動作すると思うのですが、Windows XP 以外の環境がないため、確認できません。

polipo の動作や詳細な設定方法につきましては「 話題のProxyソフト「polipo」ちょっとだけまとめ - SmileStation」をご覧いただくと良いかもしれません。SimpleBoxes にもいくつか関連記事があります

[画像]solipo アバウトダイアログ

今回のバージョンから宵闇書房のトルキーさんに作成していただいた素敵なアイコンを使っています。

また、アプリケーション名は「solipo」に変わりました。これは p15.jp の Milli さんによる命名です。

機能的な追加項目はありませんが、ダイアログのレイアウトなどを見直しています。

Visual C++ 2008 Express Edition では、リソースを編集するための GUI エディタが利用できません。そのためこれまでは rc ファイルを直接編集していましたが、今回から ResEdit というアプリケーションで編集しています。

先日より公開している polipowin をご利用されている方は、polipowin.exe が置かれているディレクトリに solipo.exe を移動させて起動してください。

スポンサーリンク

polipo GUI for Windows を作ってみた

勉強がてら Windows 用アプリケーションを作成してみました。

主な開発環境は Parallels 上で動作する Visual Studio 2008 Express Editions on Windows XP で、C# でも VB でもなく、Visual C++ を使っています。

[画像]polipo GUI for Windows

Mac OS X には dolipo という GUI アプリケーションがあり、Windows でも tolipo というアプリケーションがあるのですが、polipo を手元でビルドしてみたら、あっさり動いたので、勉強がてら GUI も組み込んでみました。

dolipotolipo との一番大きな違いは、キャッシュディレクトリを GUI で設定できることでしょうか。

[画像]polipowin キャッシュ設定

まだ、テスト段階で動作はやや不安定な気がします。それ以前にどれだけ需要があるか分かりませんけど……。

[2008.03.11 追記]「試してみたい」という方いらっしゃいましたら、こちらからどうぞ→テスト版ダウンロード

スポンサーリンク

毎日更新はどの程度アクセス数に影響するか

2008 年 2 月が終わりました。

気付かれた方もいらっしゃると思いますが、先月は毎日更新しました。

ひと月に毎日更新したのは、実に 2001 年 5 月以来およそ 7 年ぶりになります。下旬に入ると結構ネタに困ってきていて、特に 25 日からの 3 日間は少々無理矢理記事にした感じです。

今回はちょっとした実験もかねていました。

毎日更新するようにすると、どの程度アクセス数がアップするのか。

昨年から今年の初めは、

  • 月 3 〜 4 回の更新
  • 1 日あたりのアクセス数は 100 前後

という状況でした。

2 月に入ってからの更新では、

  • 写真・画像を多めに
  • 説明できるだけ丁寧に

という点に気をつけてみました。最近記事 30 のうち、画像のない記事は 1/5 になっています。

グラフから読み取る

さて、まずアクセス数の遷移について見てみましょう。システムの都合上、2008.01.18 日からの集計になっています。

[図]2008.01 - 2008.02 アクセス数遷移グラフ

2008.01.31 より毎日更新をスタートしています。スタート時点での平均アクセス数は 136/day でした (2008.01.18 - 2008.01.30 の平均)。

毎日更新を開始して十日は、ほぼアクセスが変わりませんでしたが、2008.02.12 あたりからなんとなく増加しているような印象があります。

りもじろうさんの「住みたいところに住める俺」にトラックバックを送った翌日、2008.02.21 はさすがにアクセス数が多く、その時点での最高アクセス数を更新しています。

その後数日、アクセス数が落ちていますが、週末に入った影響だと思われます。週末はアクセスがやや落ちる傾向にあります。

結果、毎日更新することで、平均アクセス数は 188/day になりました (2008.01.31 - 2008.02.28 の平均)。およそ 50 の増加で 4 割近い上昇率です。

また、ソーシャルブックマークサイト、はてなブックマークlivedoor クリップでの被ブックマーク数とアクセス数の関連もざっくり調べてみました。

はてなブックマークlivedoor クリップでの被ブックマーク数をグレイでプロットしています (対象軸はアクセス数と異なっているので注意)。

これを見ると、被ブックマーク数とアクセス数の相関はあまりなさそう?

アクセス数アップ

ということで終われば、比較的すっきりしたんでしょうが、最後に罠が待っていました。

[図]アクセス数遷移グラフ - 2008.03.02

2 月末からPolipo - ローカルプロキシサーバ (dolipo / tolipo)proxy.pac と dolipo の config ファイルPolipo 絡みの記事を続けて書きました。

これがたまたま旬の話題で、想像以上にアクセスが集中してしまい、上昇率もへったくれもなくなってしまいました。

2008.03.03 19:00 時点で Polipo - ローカルプロキシサーバ (dolipo / tolipo)の被ブックマーク数は 34。このぐらいの数字になると、やはり影響が出てくるようです。

結論としては、

旬のネタをきっちりおさえて記事にする

というのがやはり効果があるようです。

スポンサーリンク

[解決]プロキシ設定スクリプト proxy.pac と GreaseKit の相性

追試したところ、どうも GreaseKit を利用している時にプロキシ設定スクリプトを利用するとうまくいかない様子です。

proxy.pac と dolipo の config ファイル

と書いたのですが、dolipo を作成された drikin さんのところ (Drift Diary12) で、dolipo Tips が紹介されていました。

SafariStand を公開されている hetima さんが対応 GreaseKit を作成されたようです。→ GreaseKit 1.4 for Pac のダウンロード

こちらを利用したところ、当方の環境 (下記の通り) でも問題なく動作しました。ありがとうございます。

hardware
MacBook Core Duo 2GHz / メモリ 2GB
OS
Mac OS X 10.4.11 Tiger
Safari
Safari 3.0.4 (523.12.2)
Plugins
SasariStand 3.0T157 / Twicetab 1.3 / GreaseKit 1.4 for Pac
dolipo
dolipo 1.0.6.1

proxy.pac 絡みでもうひとつ。

普段 Firefox では検索バーを表示しないでロケーションバーで Google 検索をしていたのですが、dolipo を起動した状態だと 504 Host d lookup failed: Host not found と表示されて検索できなくなってしまいました。

dolipo でロケーションバー検索できなくなった!

polipo(dolipo)向けproxy.pac で紹介されている proxy.pac を導入すると、多分解決します。

2008.03.01 に公開された dolipo 1.0.6 には proxy.pac が同梱されています。dolipo 起動後、~/Library/Application Support/dolipo/ 上にコピーされるので、それを指定します。

入力した検索内容をアドレスとして認識してアクセスしているのが原因だと思うのですが、これは

    if (isPlainHostName(host))
        { return proxy_no; }

という部分で判定されて、プロキシを通さないようにするため回避されるかと。

ただ、個人的にはキーワードを利用することをお勧めします。

アドレスバーに検索内容を直接入力した時には、余計なアクセスが生じます (検索内容をアドレスとして有効かどうかを確認するため)。

キーワードなら、ブラウザ側で自動変換してからアクセスになるので、その心配がありませんし、検索対象も検索サイトだけでなく、Wikipedia やオンライン辞書などユーザー側が自由に追加・設定することが可能です。[参考 : Firefox・Opera・Safari で「キーワード」を利用する]

スポンサーリンク

proxy.pac と dolipo の config ファイル

dolipo, a wrapper of polipo [dh memoranda]」や「polipo(dolipo)向けproxy.pac」で紹介されている proxy.pac は柔軟にプロキシ設定ができるようで、とても便利そうです。

Windows であれば、プロキシ設定スクリプト proxy.pac の設定方法が @IT詳しく説明されています。[参考 : Windows TIPS : WebブラウザのProxy設定を行うための4つの方法]

今まで proxy.pac を利用したことがなかったので、知らなかったのですが、Mac OS X でももちろん同様な設定があります。

Mac OS X における プロキシ設定スクリプト proxy.pac の設定

「システム環境設定」→「ネットワーク」→利用しているネットワークの設定→「プロキシ」と選んでいくと、「設定するプロキシサーバを選択」という項目があります。この中に「自動プロキシ設定」という項目があって、それが proxy.pac を指定する設定になります。

[画像]システム環境設定・プロキシ設定

Firefox では、プロキシの設定はシステム環境設定と独立しています。Firefox の場合、「環境設定」→「詳細」→「ネットワーク」→「接続設定」と選んでいくと、接続設定シートが開きます。この中にある「自動プロキシ設定スクリプト URL」が該当する設定になります。

[画像]Firefox 接続設定シート

プロキシ設定スクリプト proxy.pac はローカルファイルも指定可能です。「polipo(dolipo)向けproxy.pac」にある通り、file:///Users/ユーザー名/Documents/proxy.pac のように指定します (書類フォルダに置いた場合)。

Firefox ではうまく動作するのですが、システム環境設定のプロキシ設定側では今のところうまく動いていない様子。何がいけないんだろう……。

[2008.03.01 16:30 追記]追試したところ、どうも GreaseKit を利用している時にプロキシ設定スクリプトを利用するとうまくいかない様子です。とりあえず、GreaseKit を外して使ってみたら、Safari でも問題なく動作しています。

[2008.03.02 06:00 追記]解決しました

dolipo 内の Polipo の config ファイル

dolipo を利用しているときに Polipo の config ファイルを直接編集したい場合があります。例えば、disableIndexing の設定などはブラウザからアクセスできる設定画面から変更することができません。

dolipo から起動される Polipo の config ファイルは dolipo アプリケーション内部にあります。dolipo を選択して、コンテキストメニューより「パッケージの内容を表示」を選びます。

[画像]dolipo を選択してこんキスとメニューを開きます。

パッケージ内の「Contents」→「Resources」→「config」が Polipo の config ファイルです。

[画像]Contents/Resources/ 内に config ファイルがあります。

スポンサーリンク

Polipo - ローカルプロキシサーバ (dolipo / tolipo)

[画像]dolipo をインストールしました。各所で話題の dolipo を試してみました。

dolipo は、ローカルで動作させるプロキシサーバ Polipo の GUI フロントエンドアプリケーションです (Mac OS X 用)。

使ってみると、確かに体感できるほどぐっと速くなります。

キャッシュの効果が大きいのでしょう、設定して起動した後に、見ていたページをリロードすると応答速度が明らかに変わるのが分かります。

ただし、Polipo を通すことで、影響が出るウェブページもありますので、注意してください。[参考 : polipo(dolipo)向けproxy.pac]

Polipo の動作

Polipo の動作について polipo の公式ウェブページに簡単な解説があります。

creazy photograph さんのところで、意訳されています

5)Polipo はPoor Man's Multiplexing を利用できます。

→スミマセン、ここは良く分かりませんでした。

Macのネット環境高速化「dolipo」はナゼこんなに速いのか ::: creazy photograph

原文は以下の通り。

  • Polipo can optionally use a technique known as Poor Man's Multiplexing to reduce latency even further.

Polipo - a caching web proxy

意訳すると、

Polipo はレイテンシー (待ち時間) を減らすため、簡易の多重化通信 (Multiplexing) をオプションとして、利用できます。

という感じでしょうか。Poor Man's という言い回しは「廉価版の」「経済的な」というような意味合いがあるみたいです。

詳細な説明が polipo の公式ウェブページにあるので、さらに見てみます。

A major weakness of the HTTP protocol is its inability to share a single connection between multiple simultaneous transactions - to multiplex a number of transactions over a single connection. In HTTP, a client can either request all instances sequentially, which significantly increases latency, or else open multiple concurrent connections, with all the problems that this implies (see Persistent connections).

Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by requesting an instance in multiple segments; because the segments are fetched in independent transactions, they can be interleaved with requests for other resources.

Poor Man's Multiplexing in The Polipo Manual

最初の段落では、

HTTP プロトコルの大きな欠点として、複数の同時的なトランザクション間の単一コネクション - つまり、単一コネクションに対しての多重通信が共有できないという点があります。HTTP では、クライアント (ブラウザ) は、全てのインスタンス (取得対象となる文書、イメージなど) を順番順番にリクエストする方法 - 待ち時間が大幅に増えます - もしくは、複数の同時接続をオープンする方法 (HTTP1.1 ではオプションのひとつでしかありません) を選びます。

続いて、

PMM (簡易多重化通信) は、インスタンスを複数セグメントでリクエストすることにより多重通信をシミュレートします。セグメントは個別の独立したトランザクションで取得されます。他のリソースのためにリクエストをインタリーブできます。

とあります。

分割要求して、polipo 側でくっつけるようにして多重化しているってことなんでしょうか。訳があっているかどうか分かりませんが、私はそのように解釈しました。

ちなみに PMM はデフォルトでは off になっているそうです。config ファイルで pmmFirstSizepmmSize を設定すると有効になります。2 つのパラメータがありますが、どちらひとつを設定するだけでも有効になります。その場合、もう一方の方に値がコピーされます。

Polipo のパイプライン検査処理

あと、polipoのサイトには

  • HTTP1.1サーバでも、パイプラインをサポートしていないバギーなサーバーはたくさんあるよ
  • polipoはサーバーがパイプラインをサポートしているか慎重に調べ(carefully probes)てからパイプラインを使うぜ

ようなことが書いてます。どんな実装になってるか興味ありますねー。

polipoのパイプラインについて

ソースコードが公開されているので、さっくり見ることができます。

私もざっくりとしか見ていないので、断定はできかねるのですが、server.c で「らしい」処理が確認できます。

/* If server->pipeline <= 0, we don't do pipelining.  If
   server->pipeline is 1, then we are ready to start probing
   for pipelining on the server; we then send exactly two
   requests in what is hopefully a single packet to check
   whether the server has the nasty habit of discarding its
   input buffers after each request.
   If server->pipeline is 2 or 3, the pipelining probe is in
   progress on this server, and we don't pipeline anything
   until it succeeds.  When server->pipeline >= 4, pipelining
   is believed to work on this server. */
if(server->version != HTTP_11 || server->pipeline <= 0 ||
   server->pipeline == 2 || server->pipeline == 3) {
    if(connection->pipelined == 0)
        n = 1;
    else
        n = 0;
} else if(server->pipeline == 1) {
    if(connection->pipelined == 0)
        n = MIN(2, maxPipelineTrain);
    else
        n = 0;
} else {
    n = maxPipelineTrain;
}

server.c in polipo 1.0.4

接続したサーバに対して、pipelinepipelined というパラメータを保持して、パイプラインが行えるかどうかを確認しています。

pipeline が 2 もしくは 3 であれば、パイプラインの検査中ということみたいです。

上記のコードは httpServerTrigger という関数から抜き出しています。他の場所でもいくつかこのフラグに対して処理が行われている部分があります。

Polipo の設定

polipo を起動した後、ブラウザから http://127.0.0.1:8123/polipo/config にアクセスすると、polipo の設定を確認・変更することができます。これは Mac OS X / Windows / Linux 全てに共通です。

dolipo では、設定ウィンドウより「Open Polipo Config」ボタンからアクセス可能になっています。

他にブラウザからできる内容として

などがあります。ただし、後者二つはデフォルトでは無効に設定されているので、config ファイルで有効にする必要があります。

キャッシュインデックスは

http://127.0.0.1:8123/polipo/index?http://serenebach.net/

のように ? の後に、確認したいアドレスをつけます。

[画像]polipo キャッシュインデックスでキャッシュの状態を確認できます。

Polipo を Windows で利用する - tolipo

Polipo は Windows 版が用意されています。インストーラ もありますが、公式ウェブページにもバイナリがあります

設定などはテキストエディタを使って修正する必要があります。例えば、polipo 入れてみた on WindowsXP - 母方の祖母にフル・ネルソン日記などで紹介されています。

私の場合、dnsNameServer を直接設定せずに、

dnsUseGethostbyname = yes

のように dnsUseGethostbyname の設定を有効にしました。

[画像]タスクトレイに常駐する tolipo が便利です。設定ファイルの名称は何でもいいのですが、polipo.conf という名称にしておくと、tolipo を利用できるので、オススメです。

[図]polipo.exe と同じディレクトリに tolipo.exe と polipo.conf を置きます。

tolipo は polipo を起動して、タスクトレイに常駐するアプリケーションです。図のように「tolipo.exe」「polipo.conf」を「polipo.exe」と同じフォルダに入れます。

私の場合、「cache」というフォルダも作成しておいて、そこにキャッシュのファイルが保存されるようにしました。

[2008.04.02 追記] Windows 上で動作する polipo の GUI ラッパーアプリケーション solipo を作成しました。 → [solipo 紹介ページ]

スポンサーリンク

[JavaScript]canvas 要素で遊ぶ・画像の拡大縮小・回転

canvas 要素で遊ぶ」では、回転速度やイメージの大きさを制御できませんでしたが、制御できるようにしてみました。

以下の canvas 内をドラッグ & ドロップすることで、画像を回転させたり、拡大縮小ができるようになります。

手元の環境では、Internet Explorer 6 での動作が今ひとつ。やはりネイティブ対応じゃないので、重いのかもしれません。Internet Explorer では、記事の個別表示でしかうまく動作しないようです。もし以下にうまく画像が表示されない場合は、個別に記事を表示してみてください

[写真]MacBook キーボード

回転処理を入れると、ベクトル関連の処理が多くなります。今回のサンプルスクリプトでは、2 次元ベクトルを表現する簡単なオブジェクトも宣言しています。

function Vector(x,y)
{
  this.x = x;
  this.y = y;
  return this;
}
Vector.prototype = {
  length : function()
  {
    return Math.sqrt(this.x * this.x + this.y * this.y)
  },
  angle : function()
  {
    var theta = Math.acos(this.x / this.length());
    return (this.y > 0) ? theta : theta * -1;
  },
  clone : function()
  {
    return new Vector(this.x,this.y);
  },
  rotate : function(theta)
  {
    var x = Math.cos(theta) * this.x - Math.sin(theta) * this.y;
    var y = Math.sin(theta) * this.x + Math.cos(theta) * this.y;
    this.x = x;
    this.y = y;
    return this;
  }
};

画像の拡大縮小は drawImage メソッドで行っています。Canvas には、そのものずばり scale というメソッドもあるのですが、scale ではコンテキストそのものを拡大縮小してしまい、今回の用途には向いていませんでした。

マウスカーソルの位置をトラックして表示するようにもしています。コンテキストが回転しているので、回転した角度の分、戻して点を表示する必要があるという部分がややトリッキーです。

サンプルスクリプトの 96 行目から始まる「_point」という関数がカーソル位置のトラック処理です。

スポンサーリンク

[JavaScript]「canvas 要素で遊ぶ」サンプルコードの簡単な解説

[JavaScript]canvas 要素で遊ぶで作成したスクリプトのメインルーチンは 29 行目からの _update という関数です。

  _update : function(angle)
  {
    var self = this;
    var prev = self.angle * Math.PI / 180;
    var theta = angle * Math.PI / 180;
    var field = document.getElementById(self.name);
    if (!field || !field.getContext) return;
    var context = field.getContext("2d");
    // clear the previous draw
    context.rotate(- prev);
    context.clearRect(0,0,self.w,self.h);
    context.rotate(prev);
    context.drawImage(self.image, (self.w - self.image.width)/2, (self.h - self.image.height)/2);
    if (!Browser.isWinIE)
    {
      context.clearRect(0,self.h,self.w,self.h); // (*1)
      context.clearRect(-self.w,0,self.w,self.h); // (*1)
    }
    var x = (self.w / 2) - ((self.w / 2) * Math.cos(theta) - (self.h / 2) * Math.sin(theta));
    var y = (self.h / 2) - ((self.w / 2) * Math.sin(theta) + (self.h / 2) * Math.cos(theta));
    context.translate(x,y); // (*2)
    context.rotate(theta);
    self.angle = angle;
  },

Canvas を使うには、まず canvas 要素を DOM で取得して、コンテキスト上に Canvas のメソッドを使って描画するのが基本になります。

rotate メソッドを使うと、コンテキストの内容を回転させることが出来ます。

[図]canvas の rotate メソッド

上の図で、右側の赤い四角が実際に描画される内容になります。canvas 要素のサイズなどは rotate によって変化しません。Canvas の中身 (コンテキスト) だけが回転します。

canvas 要素で遊ぶ」のサンプルでは、回転してもイメージ全体が表示されるように、canvas 要素の大きさを大きめに確保するようにしています。

コード内の (*1) の部分では、イメージの左側と下側を消去しています。

これは時計回りで回転するイメージの残像が残らないようにするためです。Internet Explorer を除外しているのは、ExplorerCanvas負の座標軸を使うとエラーになるためです。

[2008.02.28 追記]追試したところ、そんなことはありませんでした。ExplorerCanvas では、座標そのものが無視されるようです。複数回呼び出すのがエラーの原因かもしれません。

コード内の (*2) の部分では、translate メソッドを使って、Canvas のコンテキストをずらしています。

rotate メソッドでは、左上が回転軸となります。そのため、その前に translate でイメージの中心が回転軸となるようにしています。

イメージは canvas 要素の中心に置かれているので、中心の座標が回転によってどのぐらいずれるかを (*2) の行の直前で計算しています。

[2008.02.28 追記]_update 内で、context.rotate(- prev); のように回転したコンテキストを元に戻す操作を行っていますが、これは必要ありません。

スポンサーリンク

[JavaScript]canvas 要素で遊ぶ

Safari、Firefox、Opera でサポートされている canvas 要素について調べています。次のイメージはクリックすると、回転します。

再度クリックで回転が止まります。回っている画像を見続けると酔うので、注意してください。

Internet Explorer では、記事の個別表示でしかうまく動作しないようです。もし以下にうまく画像が表示されない場合は、個別に記事を表示してみてください

[写真]MacBook キーボード

Internet Explorer でも Google が作成した ExplorerCanvas というライブラリを使用すると、canvas 要素が利用できるようです。

上記のように、canvas に描画された内容は回転させることができます。

単純に回転させるだけだと、残像が残ってしまうので、clearRect という関数を使って、残像を消す処理を行っています。

canvas については、HTML5.JP さんの Canvas - HTML5.JP でかなり丁寧に説明されています。サンプルも沢山あってとても参考になります。

スポンサーリンク

[JavaScript]イメージリスト(仮)の動作実験

うまく動作しない可能性もあります。うまくいけば、スライダーが表示されて、動かせるようになるはずです。

  • MacBookキーボード
  • MacBook正面
  • MacBookパッケージ

スタイルシートとメインスクリプトがマイナーチェンジされています。キャッシュの影響で正しく表示されない場合がありますので、その時にはリロードしていただくよう、お願いいたします。

[2008.02.26 追記]スライダー用に記述していた form 要素を外して、スクリプト側から生成するように変更しました。それに伴い、読み込まれるスクリプトとスタイルシートを若干修正しています。

[2008.02.26 さらに追記]2008.02.26 現在、Internet Explorer 7 では、スライダーが正しく動作しないようです。後日、修正するかもしれません。

スポンサーリンク

7/13