2011年01月25日

PowerShell入門

■基本中の基本

 まずPowerShellのHelloWorldを実行してみます。Windowsのコマンドプロンプト(Cmd.exe)やLinuxのbashなど、従来のコマンドライン環境ではechoコマンドを使用しましたが、PowerShellでそのようなものは不要です。

PS U:\> "Hello World"
Hello World
PS U:\>

 PowerShellでは「表れたデータは行き着く先がなければ画面に出力される」という性質があります。上記の場合、二重引用符""で囲んでいる部分は文字列のデータとみなされます。この文字列を変数に代入するような命令はしていませんし、パイプラインに流す命令もないので、行き着く先がなくなり、画面に出力されたというわけです。
人気ブログランキング

 これと同じ理由で、次の場合も画面に出力されます。
PS U:\> 1     # 整数
1
PS U:\> 2.1   # 実数
2.1
PS U:\> 6.3/3 # 式
2.1
PS U:\>

 式を与えるとそのまま計算されます。exprコマンドやそれに相当するコマンドレットを書く必要はありません。

 変数の代入は次のようにします。代入するときも$が必要です。数値を直接書いた場合と同じように、変数だけそのまま書いた場合も、やはり画面に出力されます。

PS U:\Work> $x = 2.0
PS U:\Work> $x
2
PS U:\Work>

■オブジェクト指向の側面

 従来のCUIとPowerShellの最も大きな違いは、PowerShellにはオブジェクト指向プログラミングの要素が入っていることだと思います。先ほどまで「文字列のデータ」などと書いてきましたが、PowerShellの文字列は単なるデータではなく文字列型のオブジェクトです。整数や実数もそれぞれオブジェクトです。

 それでは単なるデータとオブジェクトでは何が違うのでしょうか。オブジェクトには、自分自身に関する情報であるプロパティや、自分自身と関係する何らかの処理であるメソッドが結びついているのが、単なるデータとの違いです。プロパティやメソッドなど、オブジェクトに結びついているものを、そのオブジェクトの「メンバー」と呼びます。

 オブジェクトには「型」があり、その型によって使用できるプロパティやメソッドが異なってきます。つまり、文字列型(String型)のオブジェクトはString型のプロパティやメソッドが、整数には整数型(int型)のメソッドやプロパティが結びついています。

■プロパティの例

 では、そのプロパティを実際に見てみます。

PS U:\Work> ("abcdefg").Length
7
PS U:\Work>

 文字列、つまりString型オブジェクトである"abcdefg"を( )で囲み .Length をつけたところ、7と出力されました。この「7」は、文字列の長さを表しています。

 既に何度も書きましたが、PowerShellでは文字列もオブジェクトです。そして、自分自身(文字列)の長さを表す「プロパティ」をもっています。上記の書き方をすると、String型オブジェクトのLengthプロパティを取得できるのです。

 従来のCUIや、オブジェクト指向でないプログラミング言語では、文字列の長さを計算するコマンドや関数を呼び出して文字列長を取得していました。PowerShellは、文字列自身が持っているプロパティを参照することで、文字列長を取得するのです。

■メソッドの例

 さて、今度はメソッドの呼び出しをしてみます。先ほども書きましたが、メソッドとはオブジェクトに結びついている処理であり、オブジェクト自身を使って何か行うものです。

 String型には多くのメソッドがついていますが、その1つに、文字列の一部が置換された文字列を新たに生成するものがあります。とりあえずまたコマンドを実行してみましょう。

PS U:\Work> ("abcdefg").Replace("cde","01234")
ab01234fg
PS U:\Work>

 文字列中の"cde"の部分が"01234"に置き換わった文字列が出力されました。

 メソッドの概念の説明とはあまり関係がないのですが、上の結果は、"abcdefg"の一部が置換されたのではありません。"abcdefg"の一部が置き換わった文字列が、新たに作られたのです。この違いは変数にしてみると分かりやすいかと思います。

PS U:\Work> $text = "abcdefg"
PS U:\Work> $text.Replace("cde","01234")
ab01234fg
PS U:\Work> $text
abcdefg
PS U:\Work>

 文字列型のオブジェクトが格納された変数である $text のReplace()メソッドを呼び出し、"ab01234fg"が出力されました。しかし、その後で $text を出力すると、元の文字列がそのまま表示されました。つまり、$textに格納された文字列は全く変わっていないのです。Replace()メソッドに限らず、String型のオブジェクトを代入した変数は、別のオブジェクトを代入しない限りは、ずっと同じ文字列が入ったままです。このことは頭に入れておくと役に立つことがあるかも知れません。

■型の違い

 話は変わりますが、Get-Itemコマンドレットにパスを指定すると、ファイル(FileInfo型)やフォルダー(DirectoryInfo型)のオブジェクトを取得できます。

PS U:\> Get-Item U:\Style.css

    ディレクトリ: U:\

Mode      LastWriteTime Length Name
----      ------------- ------ ----
-a--- 2010/07/24   8:16   3296 Style.css

PS U:\>

 ここで、「Mode」など表の列名になっているのはFileInfo型オブジェクトのプロパティです。「Length」というプロパティもあります。文字列のLengthプロパティは文字列長を表していましたが、ファイルのLengthプロパティはそのファイルのバイト数です。

 文字列の長さもファイルの長さも言葉の上ではどちらも「長さ」なので上記の動作は理にかなっています。しかし、機能の上でこの2つは全く違うものです。オブジェクト指向では、同名のプロパティであっても、結びついているオブジェクトによって適切に動作が切り替わるようになっています。

 FileInfoのLengthもプロパティには違いないので、( )で囲んで .Lengthをつけるとその値だけ取得できます。

PS U:\> (Get-Item U:\Style.css).Length
3296
PS U:\>

■おまけ

 文字列を直接書いた場合は、メンバーを呼び出すのに( )が不要です。

PS U:\> "abcdefg".Length
7
PS U:\>

 文字列に限らず、メソッドやプロパティによって取得したオブジェクトを使う場合も( )が不要です。

PS U:\> "abcdefg".Replace("cde","01234").Length
9
PS U:\> "abcdefg".Replace("cde","01234")  # 比較用に実行
ab01234fg
PS U:\>
web拍手 by FC2
posted by 北条利彦 at 00:18 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2011年01月15日

IE6 No More 〜IE6が嫌われる理由〜

 パソコン初心者の多くが使っていると思われるウェブブラウザーであるInternet Explorer (IE)ですが、これの過去のバージョンであるIE6は技術者から嫌われています。
人気ブログランキング
「IE6はもういらない」――Web企業が撲滅キャンペーン
IE6の“葬儀”行われる Microsoftから献花も
「IE6は9年前の腐った牛乳」――Microsoftがアップグレード呼び掛け

 開発元のMicrosoftでさえIE6は腐った牛乳だと酷評するくらいですから、IE6の嫌われ方は相当なものです。ここでは、なぜIE6がこうなってしまったのかを書いていきます。

 まず、多くのウェブページは複数の種類のファイルが集まって構成されていることは認識しておいて下さい。ページの中身を記述するHTMLや、書式を記述するCSS(見出しは太字にするなど)、あるいはページの動きを記述するJavaScript(クリックするとポップアップが開くなど)などです。この3つはいずれも、記号や英字、場所によっては日本語の文字が書かれたファイルです。

 たとえばCSSは次のように記述することができます。
h1 { border:solid 1px red }
このように記述すると、一番大きな見出しが太い赤線で囲まれます。

 この他にもHTMLやCSSやJavaScriptは、どのように書いたらどのように表示され、どのように動くという規則があります、ウェブブラウザーはこれに従わなければなりません。これ以降、この規則のことを「ウェブの標準」や単に「標準」と書きます。

 さて、ウェブの標準を守れていなかったのがバージョン6以前のIEです。正確には、ある程度は守られていたものの、守られていない部分が多々あったというところです。例を挙げると、CSSで表を中央に寄せるための書き方が、IEでは正しく認識されませんでした。そのため、標準に従ってウェブページを作るとIEでは中央寄せされず、IEで意図した通りに表示されるように作ると、今度は他のブラウザーで中央寄せされなくなるのです。

 それで困ったのはウェブデザイナーです。IEを使用している人は多いため、IEでちゃんと表示できないページを作るわけにはいきません。ここで選択肢は2つに分かれます。他のブラウザーでも正しく表示できるように知恵を絞るか、他のブラウザーへの対応をあきらめるか、です。

 仮にIEでも他のブラウザーでも正しく表示できるようにする方針をとったとしましょう。一般に、ウェブブラウザーがHTMLをダウンロードして中身を読み込んだとき、よく分からないことが書かれていると無視するというルールがあります。そのため、IE向けの命令は他のブラウザーが無視したり、その逆になったり、ということがあります。この場合、両方の命令を書いておけば基本的にはどちらのブラウザーでも正常に表示されます。しかし、そう都合のいいものばかりではありません。IE以外のブラウザー向けにページを書いて、IEでも正しく表示されるようにIE向けの命令を書き足すと、今度はIE以外のブラウザーで正しく表示されなくなることもあるのです。そのため、何もかも両者に対応させるというのは難しいのです。

 そこで、IEだけは正しく表示できることを保証して、他のブラウザーへの対応をあきらめたデザイナーもいます。他のブラウザーで見られなくとも、顧客はIEしか使っていないからIEだけ対応すれば良いだろうという判断です。ところが、これがうまくいったのはIE6まででした。Microsoftが、IE7以降はウェブの標準に従って表示させようという方針をとったためです。IE向けに作ってきたウェブサイトは、ウェブの標準に従ったブラウザー(IE7を含む)では正しく表示されませんから、古いIE専用のサイトを仕事で使うような人たちは、IEをアップデートできなくなってしまったのです。その古いサイトを新しく作り替えれば済むのですが、それがなかなか進んでいません。

 さて、IE6が出回ってから10年近くが経過し、新しいブラウザーができたり、元からあったブラウザーも新しいバージョンが次々と出ました。そんな中、どのブラウザーでも正しく表示できるように対応してきた人たちも、そろそろIE6に対応するのは限界だということで、次々にIE6のサポート終了を発表しました。IE6を未だに使っている人は、これらのサイトを閲覧したときに正しく表示されなくなっていくのです。こうなってしまった原因として、ウェブの標準に逆らってIE6を実装したMicrosoftはもちろん悪いのですが、そんなIE6に合わせてしまったウェブデザイナーや、IE6を使ってしまったユーザーも悪いのです。

Google、IE6など古いブラウザのサポート終了へ
Yahoo!JAPANもIE6サポート終了へ
YouTube、3月13日にIE6など旧版ブラウザのサポート終了

 一度標準的な決まりとして定められてしまえば、それがくつがえることは滅多にありません。一方で、単なるアプリケーションの仕様は、バージョンアップすれば変わってしまうのです。ですから、標準に逆らう、あるいは標準的に定められていない方法を使うと、アプリケーションのバージョンアップ後にはうまく動かなくなるリスクを抱えることになります。
web拍手 by FC2
タグ:IE
posted by 北条利彦 at 01:18 | Comment(2) | TrackBack(0) | ウェブブラウザー | このブログの読者になる | 更新情報をチェックする

2011年01月12日

C#のイベント

 C#では、クラスの内部で起きた事象を他のクラスに伝えるための機能が用意されています。これをイベントといいます。
人気ブログランキング
 デザインパターンでいうObserverパターンの代替となる機能です。Observerパターンでは事象が発生したときに呼び出されるメソッドは、インターフェースのメンバーである必要があるため、そのメソッド名を自由に決めることができません。一方でC#のイベントは自由に決められるので便利です。

 次のサンプルは、異なるフォームでボタンがクリックされたことを検知するものです。MainFormでmainButtonがクリックされるとSubFormが表示され、SubFormでボタンがクリックされると最終的にMainFormのSubForm_ButtonClickedが呼び出されます。

SubForm.cs
public partial class SubForm : Form
{
  // イベント。自分で追加。
  // ここにメソッドを登録可能。SubFormからは呼び出すことも可能。
  public event EventHandler<EventArgs> ButtonClicked;

  // SubFormのボタンがクリックされたときに実行
  // メソッドの外枠はMainFormのフォームデザイナで追加。
  // 中身は自分で入力
  private void subButton_Click(object sender,EventArgs e)
  {
    // nullでないことを確認し、メソッドとして呼び出し。
    if(ButtonClicked!=null) ButtonClicked(this,e);
  }
}

MainForm.cs
public partial class MainForm : Form
{
  // SubFormのボタンがクリックされたときに実行。
  // このメソッドは自分で追加する。
  void SubForm_ButtonClicked(object sender,EventArgs e)
  {
    MessageBox.Show("ボタンがクリックされました。");
  }
  
  // MainFormのボタンがクリックされたときに実行。
  // メソッドの外枠はMainFormのフォームデザイナで追加。
  // 中身は自分で入力
  void mainButton_Click(object sender,EventArgs e)
  {
    SubForm subForm=new SubForm();

    // イベントにメソッドを登録。
    // subButtonがクリックされたときに呼び出される。
    subForm.ButtonClicked+=this.SubForm_ButtonClicked;
    
    subForm.Show();
  }
}
web拍手 by FC2
posted by 北条利彦 at 20:43 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2011年01月05日

複数行コメントにマッチする正規表現

 C#やC言語などのソースコードでは /* 〜 */ を用いることで複数行のコメントを書くことができます。正規表現を用いたパターンマッチングをする際、この書式のコメントにマッチするパターンを作成したくなることもありますが、自力で考えようとしてもなかなか難しいです。
人気ブログランキング
 さて、そのパターンは、以下のとおりです。これで複数行コメントにマッチします。

/\*([^*]|\*[^/])*\*/
 考え方は次の通りです。
  1. /* で始まる
  2. ( * 以外の文字)または( * の次に / 以外の文字)
  3. 直前の繰り返し
  4. */で終わる

 プログラム上では、以下のようにして使います。Regexクラスなどを使用するため、ソースコードの先頭にusing System.Text.RegularExpressions;と書いておいてください。

private void button1_Click(object sender,EventArgs e)
{
  string input="a/*b/*c*/d/*e\r\ne*/f";
  string pattern=@"/\*([^*]|\*[^/])*\*/";

  MatchCollection matches=Regex.Matches(input,pattern);
  StringBuilder builder=new StringBuilder();
  foreach(Match match in matches)
    builder.AppendFormat("{0} : {1}",match.Index,match.Value)
      .AppendLine();
  MessageBox.Show(builder.ToString());
}

 実行結果(builderの文字列)は次の通りです。

1 : /*b/*c*/
10 : /*e
e*/

 ちゃんと複数行に対応し、2つのコメントにそれぞれマッチしています。
web拍手 by FC2
タグ:正規表現
posted by 北条利彦 at 22:49 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年12月17日

[C#] 未入力テキストボックスに説明文を表示する

 何も入力していない状態では、何を入力すればいいかを表すテキストが薄い色で表示され、実際に入力するときにはそのテキストが消えるようにしたいことがあります。
人気ブログランキング
 このような処理は、フォームのコンストラクター、およびテキストボックスのEnterイベント、Leaveイベントを実装することで実現できます。ただし、フォームが表示された時点でテキストボックスにフォーカスがあると不自然な動作をします。
public Form1()
{
  InitializeComponent();
  textBox1.Text=defaultText;
  defaultColor=textBox1.ForeColor;
}

string defaultText="何か入力して下さい";
Color defaultColor;
Color grayText=Color.Gray;

private void textBox1_Leave(object sender,EventArgs e)
{
  if(textBox1.Text.Length<=0 || textBox1.Text==defaultText)
  {
    textBox1.Text=defaultText;
    textBox1.ForeColor=grayText;
  }
  else textBox1.ForeColor=defaultColor;
}

private void textBox1_Enter(object sender,EventArgs e)
{
  if(textBox1.Text==defaultText)
  {
    textBox1.Text=string.Empty;
    textBox1.ForeColor=defaultColor;
  }
}
web拍手 by FC2
posted by 北条利彦 at 21:21 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年12月09日

[C#] .docx形式のWord文書を作る(Open XML SDK)

 Microsoft OfficeもVisual StudioもMicrosoftの製品ですから、Visual Studioを使ってMicrosoft Office形式のファイルを作ることもちゃんと可能になっています。それを実現するのがOpen XML SDKです。.NET Framework対応言語を使って文書を作れる……ことは良いのですが、解説が非常に少なく、作るのがいろいろとやっかいなところがあるように思います。
人気ブログランキング
 そんな中、大きな手がかりになるのは「10 行でズバリ!! [C#] Office - Open XML ドキュメントの作成」です。ここには十分短く的確なサンプルコードが載っています。詳しい手順の解説付きで非常にありがたいです。こういうものは、サンプルと違うコードを書こうとしたときに応用が利かない物も多くあるのですが、これの場合は他の使い方もなんとか考えつくことのできるものになっています。

 ここから先は「10 行でズバリ!!(略)」を読んだことを前提に話を進めます。

XHTMLを作成する感覚でWord文書を作る

 実際にOpen XML SDKでプログラムを書いてみると、あまりWord文書を作っているという印象は受けません。Documentクラスのオブジェクトを作ると(.docxファイルのZIPの中に)document.xmlが作られたり、DocumentクラスのオブジェクトのAppendメソッドでBodyクラスのオブジェクトを追加するとdocument.xmlにw:body要素ができたり……というような具合で、XHTMLを作るような感覚に似ています。

 Appendメソッドは多くの(全部の?)クラスのメンバーになっていて、ファイルの書式上は許されていないクラスもプログラム上では追加できてしまいます。正しい.docxでどのクラスを追加できるかはMSDNのオフィスデベロッパーセンターに書いてあります。

 Paragraphクラスの説明を見てみると、最初に「このクラスはw:p要素に対応していますよ」という意味(意訳)の英語が書かれています。さらに、その下の方には「Parent Elements」という表と「Child Elements」という表があります。これは、Paragraphクラスに対応する要素(w:p要素)の親要素になることのできる要素と、子要素になることのできる要素です。このようにして、何をどこに追加できるのか調べていくことができます。

Wordで保存したファイルと見比べる

 ここまで分かっても、「じゃあ、どうやって段落の中身のテキストを追加すればいいのか」ということが分かりません。テキストを指定するのはTextクラス(w:t要素)ですが、ParagraphクラスのChild Elementsにはw:t要素が書かれていないためです。Child Elementsに出てきた要素をすべてたどっていけば済むのですが、それでは手間がかかりすぎます。

 ここで役に立つのがWordです。.docx形式のファイルはXMLファイル(など)をZip圧縮したものですので、実際にWordが作成したファイルのXMLを見て、テキスト(w:t)がどの要素に入っているのか調べればいいわけです。

 適当なdocx文書の拡張子をzipに変更して展開すると、思いの外ファイルがたくさんあることが分かります。その中で一番重要なのはwordフォルダ内のdocument.xmlです。ここでw:r要素の中にw:t要素があり、その中にテキストが書かれていることが分かると思います。Paragraphクラスの説明を再び見るとChild Elementsに「r (Text Run)」という項目があります。このrは、w:r要素のrです。wはきっとWordProcessingのwでしょう。次に「r (Text Run)」に該当するクラスを探してみます。TextRunというクラスはありませんが、Runというクラスがありました。同じように、w:rの下のw:tに該当するクラスを探すとTextクラスであることが分かります。Textクラスの構築子にstring型オブジェクトを指定すると、ようやく段落にテキストを追加することができます。

 長々と書いてしまいましたが、次のコードでテキストつきの.docxファイルを作成することができます。「そもそもOpen XML SDKを使用する準備ができていないぞ」という方は「10 行でズバリ!! [C#] Office - Open XML ドキュメントの作成」を見て下さい。
Run textRun=new Run();
textRun.Append(new Text("中級解説"));

Paragraph p=new Paragraph();
p.Append(textRun);

Body body=new Body();
body.Append(p);

Document document=new Document();
document.Append(body);

using(var package=WordprocessingDocument.Create(
  "test.docx",WordprocessingDocumentType.Document))
{
  MainDocumentPart mainDocumentPart
    =package.AddMainDocumentPart();
  mainDocumentPart.Document=document;
}

 ソースコードの先頭には次の3行の宣言を書いておいて下さい。
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Packaging;
web拍手 by FC2
タグ:Open XML C# WORD .docx
posted by 北条利彦 at 18:30 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年11月27日

[C#]ビットマップを描画する

 画面に描画するのではなく、ビットマップ(System.Drawing.Bitmap)を作成するためにWindowsの描画機能を使いたいことがあります。このような場合、まずBitmapクラスのオブジェクトを作成し、そこからGraphicクラスのFromImage()メソッドを呼び出します。あとは、Graphic.FromImage()の返却値として得られるグラフィッククラスのインスタンスを使うとビットマップに描画できます。
人気ブログランキング
// 画像サイズ
Size bitmapSize=new Size(32,32);

// 画像作成
Bitmap bitmap=new Bitmap(
  bitmapSize.Width,bitmapSize.Height,
  System.Drawing.Imaging.PixelFormat.Format24bppRgb);

// グラフィックハンドル作成
Graphics g=Graphics.FromImage(bitmap);

// 円の外枠を表す長方形
Rectangle circleRect=new Rectangle(Point.Empty,bitmapSize);

// 円を描く
g.FillEllipse(Brushes.Aqua,circleRect);

// 保存
bitmap.Save(@"C:\Users\Houjou\Sample.png");

 次の画像は実際にこのコードで作成されたものです。
Sample.png
web拍手 by FC2
posted by 北条利彦 at 09:26 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年11月01日

IE8で更新ボタンと中止ボタンの位置を変更する

 Internet Explorer 6の頃はブラウザーの[進む]・[戻る]ボタンと[更新]・[中止]ボタンが一箇所に固まっていました。ページを戻ったら更新ボタンを押す……などのように、この4つのボタンは何かとまとめて使用することが多いので、IE6の頃は親切なボタン配置だったといえるでしょう。
人気ブログランキング
 しかし、IE7以降は[進む]・[戻る]ボタンと[更新]・[中止]ボタンの間にアドレスバーが入ってしまいました。こうなると、先ほどの操作をするときにアドレスバーをまたいでマウスを動かす必要が出てくるため、マウスの移動量が無駄に大きくなってしまいます。

 IE7ではこれを修正する方法はないのですが、IE8では、[進む]・[戻る]ボタンと[更新]・[中止]ボタンが一箇所に集まるようなオプションがつけられました。これは、以下の手順で設定できます。

 まず、タブが表示されている段で、タブのない部分を右クリックします。そのメニューの[カスタマイズ]サブメニューを展開し、[アドレスバーの前に[中止]と[更新]ボタンを表示]をクリックします。
ButtonsRight.png
IE8のデフォルト。更新ボタンと中止ボタンがアドレスバーの右側に表示されている。
ButtonsLeft.png
更新・中止ボタンの位置が変わり、4つのボタンが1箇所に集まった。
web拍手 by FC2
posted by 北条利彦 at 21:51 | Comment(0) | TrackBack(0) | ウェブブラウザー | このブログの読者になる | 更新情報をチェックする

2010年10月28日

HTTPヘッダーとRefererとグーグル検索URL訴訟

 Googleの検索結果ページで別のサイトへのリンクをクリックすると、検索に使用したキーワードがリンク先のサイトに漏えいするということで、集団訴訟が起きたそうです。このニュースは技術的にどういうことなのかを解説してみたいと思います。

グーグル、検索語含むURLの受け渡しが訴訟の標的に
http://japan.cnet.com/news/business/story/0,3800104746,20422043,00.htm

 今ではウェブページの規格通りにウェブブラウザーが解釈してくれる場合が多くなったため、どのブラウザーを使って表示してもだいたい同じような画面が表示されるようになってきました。しかし、ほんの少し前までは、使用するブラウザーが異なると、ページがかなり乱れて表示される場合がありました。ウェブブラウザーが規格通りに表示してくれば良かったのですが、なかなかうまくいかなかったのです。
人気ブログランキング
 ウェブサイトを作成する人にとって、これは悩みの種になります。同じウェブページであれば、どのウェブブラウザーでも同じように見えるよう、ウェブブラウザーを出している会社(団体)が作ってくれればいいですが、それはサイト制作者がどうにかできることではないのです。

 それでは何も手段がなかったかというと、そうではありません。一応の解決策が用意されていました。ウェブサイトを閲覧するには、ウェブブラウザーがウェブサーバーにURLを送信しますが、このとき、「HTTPヘッダー」と呼ばれる付加的な情報も送信しています。通常、HTTPヘッダーにはどのウェブブラウザーのどのバージョンを使っているという情報が含まれているので、ウェブサイト制作者は、その情報を見て、訪問者が利用してるブラウザーに合わせてページを表示すればいいのです。

 さて、HTTPヘッダーには「リファラー(Referer)」というものがあり、これもウェブブラウザーから送信されています。その内容は、直前に表示していたページのURLです。たとえば、もしこのブログのリンクをクリックすると、利用者のウェブブラウザーは、このブログのURLをRefererとしてリンク先サイトに送信するのです。ブラウザーが送信している情報ですからブログの管理人である私が制御することはできませんし、制御できてしまっては危険ですらあります。

 さて、冒頭のニュースに戻りましょう。Googleの検索結果のURLをよく見たことはあるでしょうか。Googleで「中級解説」を検索すると次のようなURLになります。

http://www.google.co.jp/search?source=ig&hl=ja&rlz=&=&q=中級解説&btnG=Google+検索&aq=f&aqi=&aql=&oq=&gs_rfai=

 見て分かると思いますが、検索した単語である「中級解説」が含まれています。そのため、検索結果画面のリンクをクリックしたとき、検索キーワードである「中級解説」が、リファラーとして送信されます。

 HTTPヘッダーはウェブブラウザーが自ら送信する情報です。サーバーが送信させているのではありませんから、もしユーザーがプライバシーは守りたいと思うのであれば、送信しなければ良いのです。

主要なHTTPヘッダー
Acceptブラウザーが扱うことのできるファイル形式
Referer直前にアクセスしていたページのURL
User-Agent使用しているブラウザー名とバージョン
Accept-Language使用できる言語
Hostアクセス先のウェブサーバー名
web拍手 by FC2
posted by 北条利彦 at 20:59 | Comment(0) | TrackBack(0) | ウェブ | このブログの読者になる | 更新情報をチェックする

2010年10月26日

インフラただ乗り論

 インターネットに接続するにはインターネット・サービス・プロバイダー(ISP、または単にプロバイダー)に契約して料金を払うかと思います。たとえば契約したISPがKDDIのDionであればKDDIに支払うことが当然であり、契約していないOCNやYahoo! BBなどには料金を払わないことも当然といえます。
人気ブログランキング

 ところで、インターネットというのは通信の一種ですから、当然ながら通信相手もいます。普段ウェブでアクセスするウェブサーバーもどこかの会社が運営していて、その会社もどこかのISPに契約しています。

 ここで、Iuのインターネットサービスを利用しているUさんがW社のウェブサーバーにアクセスしたとしましょう。W社が契約しているISPはIw社です。このとき、Iw社がUさんにインターネットの料金を払えと言い出したらUさんはどう思うでしょうか。ほとんど架空請求と変わらないような不当な請求ではないかと思うに違いありません。もちろん、その逆もまたしかりで、ウェブサーバーを運営しているW社が、UさんのISPであるIu社に通信料金を支払う義務は一切ありません。
InfraFreeRide.png
 もし「Iu社がW社から通信料金を取り立てるのは正しい」と認めてしまうとかなり大変なことになります。W社にアクセスしてくるのは別にUさんだけではありせん。Uさんとは全然関係のないTさんもアクセスしますし、きっとSさんもアクセスしてくるでしょう。すると、W社はアクセスしてくる人の分だけISP に支払いが発生してしまいます。こんなことになってしまったら、ウェブサーバーを公開しようと思ったら莫大な通信料を払うことになってしまうため、インターネットの衰退を招きかねません。実際にはW社は、自分が加入していないIu社などに料金を払う義務は全くありませんから、今のところは大丈夫です。

 しかし、この場合のIu社がW社から料金を取り立てるべきだと主張をするISPはあるのです。そのようなISPの言い分は、次のようなものです。

「W社もコンテンツを提供するためにIu社から回線を使っているのだ。W社がIu社に料金を払わないのは通信インフラのただ乗りだ」

 この主張は正しくなく、Iu社は、Uさんから通信料金を取っているのですから、W社からも料金を取るというのは二重課金です。

  W社に当たるのはGoogleやYouTubeなど、大量の通信が発生しているコンテンツ会社です。今のところは普通程度の通信量でウェブサイトを運営しているサイトから料金を取る話は出ていませんが、もしインフラただの理論が正当化され、実際に通信量を取るようになったら、比較的通信量の少ないサイト運営者からも通信料金を取り立てるようになっていくのは間違いありません。そのような事態に陥らないよう、インフラただ乗り論を認めてはいけません。
web拍手 by FC2
posted by 北条利彦 at 20:49 | Comment(0) | TrackBack(0) | 通信 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。