<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>あいまいモード</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/" />
   <link rel="self" type="application/atom+xml" href="http://www.imymode.com/atom.xml" />
   <id>tag:www.imymode.com,2006://1</id>
   <updated>2008-04-17T00:55:07Z</updated>
   <subtitle>インターネット活用のための情報共有サイト。HTML、JavaScript、CGIからブログ、SNSまで、いろんな情報を共有しましょ。</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.35</generator>

<entry>
   <title>マイコンピュータをデスクトップに表示するには</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/blog/desktopicon.html" />
   <id>tag:www.imymode.com,2008://1.56</id>
   
   <published>2008-04-17T00:27:28Z</published>
   <updated>2008-04-17T00:55:07Z</updated>
   
   <summary>マイコンピュータのアイコンをデスクトップに表示させるには</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ブログ的ひとりごと" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5" label="WindowsXP" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="7" label="デスクトップ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="6" label="マイコンピュータ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./archives.html">ブログ的ひとりごと</a> &gt; マイコンピュータをデスクトップに</div>
<h2>マイコンピュータのアイコンをデスクトップに表示</h2>
<p>
最近買ったパソコン、OSはいまだにWindowsXPをあえて選択して使っているのですが、マイコンピュータやマイドキュメントが見当たりません。Windows95やWindows98のようにエクスプローラがない今、各ドライブのフォルダにアクセスするのははやりマイコンピュータから、という方が多いのではないかと思うのですが、やはりあった方が便利ですよね。
</p>

<p>
自分も「たしかどこかで設定できたはずなんだけどなぁ、、、」と探し回って、とっても簡単なところに設定があったので、知っている人は簡単！だと思いますが、おぼえがきということでマイコンピュータのデスクトップ表示を説明したいと思います。
</p>
]]>
      <![CDATA[<h2>マイコンピュータ表示のための手順</h2>
<p>
デスクトップの何もないところを右クリックして「プロパティ」を選択してください。<br />
<img src="../images/blog/desktop.gif" />

</p>

<p>
そうすると、下記のように「画面のプロパティ」のダイアログボックスが表示されます。この「デスクトップ」のタブを選択します。そうすると、普段壁紙などを変更する画面に切り替わります。下の方に「デスクトップのカスタマイズ」（赤くなっている部分）というボタンがあります。ここをさらにクリックします。<br />
<img src="../images/blog/desktop2.png" />
</p>

<p>
そうすると、「デスクトップ項目」という新しいダイアログボックスが開きます。その「全般」タブを選択し（通常はそこが最初に開かれているはず）、「デスクトップアイコン」と書かれたところにある「マイドキュメント」「マイコンピュータ」「マイドネットワーク」「Internet Explorer」の表示させたい項目にチェックを入れれば、それぞれをデスクトップに表示させることができるようになります。<br />
<img src="../images/blog/desktop3.png" />

</p>

<p>
知ってしまえば簡単ですが、普段そんなところ操作しないですよね？ひとりでああでもない、こうでもないと情けない時間を過ごしてしまいました。
</p>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./archives.html">ブログ的ひとりごと</a> &gt; マイコンピュータをデスクトップに</div>

]]>
   </content>
</entry>
<entry>
   <title>エクセルに計算ミス！セキュリティパッチにご注意</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/blog/patch.html" />
   <id>tag:www.imymode.com,2008://1.50</id>
   
   <published>2008-03-17T10:34:48Z</published>
   <updated>2008-03-17T15:37:24Z</updated>
   
   <summary><![CDATA[トップ &gt; ブログ的ひとりごと &gt; エクセルのバグ エクセルの計算結...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="ブログ的ひとりごと" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./archives.html">ブログ的ひとりごと</a> &gt; エクセルのバグ</div>
<h2>エクセルの計算結果はどこまで信頼できるのか！</h2>
<p>
マイクロソフトの公式サイトに掲載された警告。エクセル２００３のセキュリティアップデートを実行すると計算ミスが起きるかも・・・というもの。正確な計算を期待してエクセルを使っているのに、計算ミスがでたのでは、何のためのエクセルだかわからなくなります。
</p>

<p>
マイクロソフトの公式ページを下記に引用しましたが、「MS08-014」というパッチを適用すると、計算結果がおかしくなるというもの。詳しくは、VBAからReal Time Data（RTD）ソースを参照すると、エクセルに計算ミスが発生。回避するには個別のセルごとに計算すること、ということです。
</p>
<blockquote>After you install security update MS08-014, Excel 2003 calculations return an incorrect result when a Real Time Data source is used in a user-defined Visual Basic for Applications function（<a href="http://support.microsoft.com/kb/950340/en">マイクロソフトの公式情報</a>）</blockquote>

<p>
VBA使わない普通の計算ならそんなに影響もないのかと気楽に構えてますが、どこに見えないバグが潜んでいるかもしれません。実際、エクセルの計算が完璧かというとそうでもないようで、自分がエクセルを使い始めたOffice97の頃は統計関数に計算結果がおかしくなるものがいくつかあると聞いたこともあります。
</p>

<p>
あくまでも補助ツールとして割り切って使わないと痛い目に会うのかもしれませんね。計算が違ったことで被った損害とかはきっと見てもらえなさそうです。
</p>
]]>
      <![CDATA[<h2>セキュリティパッチは様子を見てあてる？</h2>
<p>
一昔前のシステム管理の暗黙の了解として「セキュリティパッチはすぐにあててはいけない」というのがありました。今でこそ、ウイルス対策やスパイウェア対策など、様々なセキュリティ対策のためにパッチはすぐに当てるというのが常識化しつつありますが、一昔前は「パッチは怖くてあてられないもの」だったのです。
</p>

<p>
理由は単純で、パッチをあてたことによって、これまで安定して動いてきたソフトウェアが起動しなくなるリスクがあるから。とりあえず今動いている方が大事という考え方でシステムは運用されてきました。驚くべきことですが、大企業の基幹システムでもこのような考え方がシステムメンテナンスでは常識だったのです。
</p>

<p>
実際、業務としてシステムを動かしている以上、具体的な被害が起きてもいないのにパッチを適用して、それで止まった時の被害の方が大きいという判断をするのは、ある意味合理的ではあります。ただ、最近それも変わりつつあり、ウイルスやスパイウェアの被害が深刻になってきたからこそ、パッチを適用していない不作為の責任というのがシステム管理者（または、管理会社）に求められるようになってきて、「パッチはすぐに適用しないと」が常識化してきているのだと思います。
</p>

<p>
一番いいのは、パッチなど不要な完璧なシステムを作ることなんでしょうが、それは永遠の課題なのでしょうね。
</p>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./archives.html">ブログ的ひとりごと</a> &gt; エクセルのバグ</div>
]]>
   </content>
</entry>
<entry>
   <title>１０００円以下で出来る、ホスティング</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/host/u1000.html" />
   <id>tag:www.imymode.com,2008://1.49</id>
   
   <published>2008-02-12T14:33:34Z</published>
   <updated>2008-02-12T14:58:15Z</updated>
   
   <summary><![CDATA[トップ &gt; レンタルサーバー &gt; 1000円以下のレンタルサーバー ...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="レンタルサーバー比較" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">レンタルサーバー</a> &gt; 1000円以下のレンタルサーバー</div>
<h2>１０００円以下で出来る、ホスティング！</h2>
<p>
広告付きの無料ホームページやプロバイダーのサービススペースを借りてのサイト運営から一歩前進しませんか？ホスティングを利用すれば、自分の思いのままのページを自由につくることが出来ます！ここでは１０００円以下の予算で利用できるホスティングサービスを集めてみました。
</p>

<h3>ロリ・ポップ！レンタルサーバー</h3>
<p>
<a href="http://px.a8.net/svt/ejp?a8mat=I6C9D+E8M8MQ+348+60H7L" target="_blank">
<img border="0" width="100" height="60" alt="Click Here!" src="http://ad.a8.net/svt/bgt?aid=030528913861&wid=001&eno=01&mid=s00000000404001010000&mc=1"></a>
<img border="0" width="1" height="1" src="http://ad.a8.net/0.gif?a8mat=I6C9D+E8M8MQ+348+60H7L" alt="Click Here!"><br />
<strong>月額２５０円</strong>という格安の値段でホスティングができる。基本的にサブドメインで運用だが、女性向けのかわいいアドレスが多く用意されている。また、女性の方、お引っ越しの方半額キャンペーンも実施中。CGI、SSI、PHP、RUBYが利用可能で、便利なCGIが最初から数十個もインストール済みというのも初心者にはうれしい。また、格安ながら、htaccessやSendmail(qmail)も利用できる。
</p>
<p>
<!--　内容ボックス　-->
<table class="hikaku" border="0" cellspacing="1">
<tr class="hikaku_top">
<td>プラン</td><td>初期費用</td><td>月額</td><td>Disk</td><td>メール</td><td>CGI等</td><td>DB</td><td>OS</td><td>その他</td><td>ドメイン</td>
</tr>

<tr class="hikaku_tr">
<td>ロリポップ</td><td>3,000</td><td>250*</td><td>200MB</td><td>1acc</td><td>CGI,SSI,PHP,RUBY</td><td>-</td><td>Linux</td><td>htaccess可</td><td>×</td>
</tr>
</table>
*250円は年払いの場合。また、キャンペーン対象の場合初期費用1,500円引き
</p>

<h3>シーサイド・ネット</h3>
<p>
<IFRAME frameBorder="0" allowTransparency="true" height="45" width="135" marginHeight="0" scrolling="no" src="http://ad.jp.ap.valuecommerce.com/servlet/htmlbanner?sid=2038053&pid=871357288" MarginWidth="0"><script Language="javascript" Src="http://ad.jp.ap.valuecommerce.com/servlet/jsbanner?sid=2038053&pid=871357288"></script><noscript><a Href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2038053&pid=871357288" target="_blank" ><img Src="http://ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=2038053&pid=871357288" height="45" width="135" Border="0"></a></noscript></IFRAME><br />
サブドメイン型と独自ドメイン型とのサービスを用意しているので、予算等に合わせて選択できる。１サーバーあたり１４０名までの定員制をとっている。CGIはsuExec対応、独自ドメインサービスの場合はSSL標準使用可など、セキュリティー面での強化を行っているホスティングサービス。また、料金が税込みなのが嬉しい。
</p>

<p>
<!--　内容ボックス　-->
<table class="hikaku" border="0" cellspacing="1">
<tr class="hikaku_top">
<td>プラン</td><td>初期費用</td><td>月額</td><td>Disk</td><td>メール</td><td>CGI等</td><td>DB</td><td>OS</td><td>その他</td><td>ドメイン</td>
</tr>

<tr class="hikaku_tr">
<td>サブドメイン</td><td>2,000</td><td>750</td><td>150MB</td><td>無制限</td><td>Perl,SSI,PHP</td><td>-</td><td>Linux系</td><td>転送制限4.5GB/週</td><td>×</td>
</tr>

<tr class="hikaku_tr">
<td>独自ドメイン</td><td>0</td><td>1,800</td><td>300MB</td><td>無制限</td><td>Perl,SSI,PHP</td><td>-</td><td>Linux系</td><td>SSL対応</td><td>○</td>
</tr>
</table>
*キャンペーン中で初期費用が無料
</p>]]>
      <![CDATA[<h3>株式会社ジェイナビ</h3>
<p>
<IFRAME frameBorder="0" allowTransparency="true" height="45" width="135" marginHeight="0" scrolling="no" src="http://ad.jp.ap.valuecommerce.com/servlet/htmlbanner?sid=2038053&pid=871459888" 
MarginWidth="0"><script Language="javascript" 
Src="http://ad.jp.ap.valuecommerce.com/servlet/jsbanner?
sid=2038053&pid=871459888"></script><noscript><a 
Href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2038053&pid=871459888" target="_blank" 
><img Src="http://ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=2038053&pid=871459888" 
height="45" width="135" Border="0"></a></noscript></IFRAME><br />
低価格レンタルサーバであるが、多彩なサービスがある。FrontPage対応、ログデータ解析、SSLサーバー、MySQLが全てのプランで利用できるのがうれしい。また、ドメイン取得・登録料が無料 (StartUp Plan は除きます) 。ドメインを既にお持ちの場合は、初回設定料 5,000 円が無料となるサービスを行っている。(StartUp plan は除く)。通常のドメインに加えて、２０種類ものドメイン（.ai .to .nu そして .mu など）が取得、利用できる。
</p>

<p>
<!--　内容ボックス　-->
<table class="hikaku" border="0" cellspacing="1">
<tr class="hikaku_top">
<td>プラン</td><td>初期費用</td><td>月額</td><td>Disk</td><td>メール</td><td>CGI等</td><td>DB</td><td>OS</td><td>その他</td><td>ドメイン</td>
</tr>

<tr class="hikaku_tr">
<td>StartUp</td><td>5,000</td><td>833</td><td>50MB</td><td>無制限</td><td>CGI,PHP,SSH</td><td>MySQL</td><td>-</td><td>転送量1G/月</td><td>○</td>
</tr>

<tr class="hikaku_tr">
<td>Standard</td><td>5,000</td><td>1,500</td><td>100MB</td><td>無制限</td><td>CGI,PHP,SSH</td><td>MySQL</td><td>-</td><td>転送量2G/月</td><td>○</td>
</tr>

<tr class="hikaku_tr">
<td>Pro</td><td>5,000</td><td>3,000</td><td>250MB</td><td>無制限</td><td>CGI,PHP,SSH</td><td>MySQL</td><td>-</td><td>転送量4G/月</td><td>○</td>
</tr>

<tr class="hikaku_tr">
<td>Business</td><td>5,000</td><td>5,000</td><td>500MB</td><td>無制限</td><td>CGI,PHP,SSH</td><td>MySQL</td><td>-</td><td>転送量8G/月</td><td>○</td>
</tr>

</table>
</p>

]]>
   </content>
</entry>
<entry>
   <title>無料ウイルス対策ソフトAVGの活用とその実力は？</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/security/avg.html" />
   <id>tag:www.imymode.com,2008://1.48</id>
   
   <published>2008-02-05T05:56:58Z</published>
   <updated>2008-02-07T06:50:30Z</updated>
   
   <summary><![CDATA[トップ &gt; セキュリティ入門 &gt; 無料ウイルス対策AVG 無料ウイル...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="セキュリティ入門" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="ネット技術のメモ書き" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">セキュリティ入門</a> &gt; 無料ウイルス対策AVG</div>
<h2>無料ウイルス対策ソフトの活用とその実力は？</h2>
<p>
最近、いろいろなサービスが無料で提供されています。インターネットが普及しはじめたころは、無料のホームページやインターネットメールサービスなどがその主流でしたが、最近ではずいぶんといろいろなサービスが無料化されていて、本当にビジネスとして成り立つのか？と疑問に思えてくるものもあるくらいです。
</p>

<p>
<img alt="pasocom.gif" src="../images/pasocom.gif" width="57" height="100" align="right" class="sashie" />
そしてついに、無料のウイルス対策も登場してきました。ウイルス対策というと、通常はソフトを購入後、最新のウイルスに対応するための更新料が必要になってくるというのが常識です。逆にこの更新料があるからこそ、ウイルス対策がビジネスモデルとして確立された商売になっているとも言えるのですが、それを無料にしてしまうとはいったいどんなカラクリなのでしょうね？
</p>

<h3>AVG Anti-Virus Free Editionが日本語対応</h3>
<p>
<img alt="avg.jpg" src="images/avg.jpg" width="132" height="61" align="left" class="sashie" />
さて、数々あるウイルス対策ソフトですが、肝心なのは本当にウイルス対策になるのかどうか。いくら無料で保障がなくても、ウイルスを撃退できなければ意味がありません。そういうことからも、ウイルス対策ソフトだけは有料を、と思ってきた方々も多いはずです。
</p>

<p>
そんな中、世界中でおそらく最も多くの人に使われている無料のウイルス対策ソフトがあります。GrisoftのAVGです。このソフト、製品版の機能限定版（といっても、ウイルス対策の部分は製品版と同じ）ということで、機能的には信頼できるのではないかと思いますが、以前は英語版しかなかったので、「英語が苦手・・・」という方には心理的ハードルが高かったのではないかと思います。
</p>

<p>
このAVGも日本語化されて、ずいぶんと身近なソフトになっているのではないかと思います。英語版しかなかった時代には日本語化パッチの当て方や、使い方などを解説したサイトも多くみかけたので、これがある意味、ハードルの高さを端的に示していた気もします。
</p>
]]>
      <![CDATA[<h2>実際に日本語版AVG無料版を使ってみる</h2>
<p>
では、実際にAVGの無料版を使ってみましょう。下記のサイトにアクセスして、無料のダウンロードをクリック。するとダウンロードが始まります。
</p>
<ul>
  <li><a href="http://free.grisoft.com/doc/downloads-products/jp/frt/0?prd=aff">AVG Free ダウンロードページへ（日本語版）</a></li>
</ul>

<p>
<img src="images/avg_download.jpg" width="450" height="425" alt="AVG Free Edition" />
</p>

<h3>ダウンロードされたファイルをクリック</h3>
<p>
ダウンロードして保存されたファイルをダブルクリックしてインストールの開始です。あとはインストーラの指示に従って進めていくだけで簡単にインストールできてしまいました。<br />
<img alt="avgicon.jpg" src="images/avgicon.jpg" width="95" height="83" />
</p>

<p>
最初に警告が出ますが、これは無視して進めて大丈夫です。<br />
<img alt="avginst01.jpg" src="images/avginst01.jpg" width="470" height="278" />
</p>

<h3>インストール途中で日本語を選択するのをお忘れなく</h3>
<p>
途中で言語選択ができます。Englishだと英語のままになってしまうので、日本語を選択するのをお忘れなく！<br />
<img alt="avginst02.jpg" src="images/avginst02.jpg" width="516" height="374" />
</p>

<p>
うまくインストールできて、ソフトウェアが無事に動くと、タスクトレイにAVGアイコンが表示されます。また、ウイルスパターンファイル（ワクチンファイルとも言うことも）が古い場合には、このAVGアイコンがモノクロになるので、最新の状態でないことがすぐにわかります。<br />
<img alt="avgicon2.jpg" src="images/avgicon2.jpg" width="125" height="33" />

</p>

<h2>AVGの無料版でできること、できないこと</h2>
<p>
詳細は、会社のページで確認していただくとして（もちろん日本語になってます！）、無料版の機能を確認してみました。
</p>
<h3>無料版AVGでできること</h3>
<h4>100% のウイルス検出率</h4>
<p>
VB100% 賞をはじめ、多数の賞を受賞しているとのこと。無料であってもウイルス、ワームおよびトロイの木馬に対する完全な保護を掲げています。
</p>

<h4>完全な接続時保護</h4>
<p>
今では当たり前の機能ですが、開いたファイル、実行したファイルまたは保存したファイルをすべてスキャンして保護します。
</p>

<h4>電子メールチェック</h4>
<p>
送受信されるすべての電子メールをチェックしてくれます。メジャーなメールソフトにはほぼ対応しているので、よっぽど変わったメーラーを使っていない限りは大丈夫です。ただ、これも、最近のウェブメールサービス（Gmail、Yahooメール）が無料のウイルスチェックをしているので、昔ほど重要でないのかもしれません。AVGのチェックを通ったメールにはその旨のコメントが挿入されています。
</p>

<h3>AVG無料版でできないこと</h3>
<p>
基本的に商用利用などはできません。また、教育機関や行政機関での利用もダメだったはずです。家庭用個人使用でのみ無料ということですので注意が必要です。また、サーバー用OS（Windows Serverなど）にもインストールできません。これは個人用ということを考えても当然なのだと思います。
また、パーソナルファイアウォールやスパイウェア検出もできません。
</p>

<h2>結局、AVGの実力は？</h2>

<p>
無料版でできないこともいろいろかかれていますが、これら機能は元々ウイルス対策ソフトの基本機能ではなかったので、いわゆるウイルス対策にはこれで十分です。家庭で個人用に使っている分には面倒な更新手続きの支払いが不要なので、本当に楽だと思います。
</p>

<p>
かなりお勧めのソフトですね！
</p>
<hr>
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">セキュリティ入門</a> &gt; 無料ウイルス対策AVG</div>
]]>
   </content>
</entry>
<entry>
   <title>GoogleMapをホームページやブログに設置する方法</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/inet/googlemap.html" />
   <id>tag:www.imymode.com,2008://1.43</id>
   
   <published>2008-01-31T06:18:42Z</published>
   <updated>2008-02-26T04:52:51Z</updated>
   
   <summary>GoogleMapをホームページやブログに設置する方法 こんなのいまさら説明もい...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="ネット技術のメモ書き" scheme="http://www.sixapart.com/ns/types#category" />
         <category term="Google関連情報" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="2" label="GoogleMap" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="3" label="グーグルマップ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<h2>GoogleMapをホームページやブログに設置する方法</h2>

<p>
こんなのいまさら説明もいらない！という方も多いと思いますが、自分のメモ書きもかねて、、、
</p>

<p>
以前はグーグルマップを自分のページに取り込むためには、GoogleMapのAPI Keyを取得して自分でコードを書いてやる必要がありました。今でも複雑なアプリケーションを書くためには必要なのですが、単純に地図だけ表示する場合には、驚くほど簡単にマップを取り込むことが可能になっています。
</p>

<h3>ステップ１：GoogleMapの画面に切り替える</h3>
<p>
まず、通常どおり、Googleマップにアクセスです。左上にある「地図」をクリックして、Googleマップの画面に切り替えます。
<img alt="googletop.jpg" src="http://www.imymode.com/inet/images/googletop.jpg" width="450" height="327" />
</p>

<h3>ステップ２：マップを表示してリンクボタンをクリック</h3>
<p>
ここで、探したいポイントを検索するなり、矢印ボタンを使って表示させるなりして、表示させたいマップを探します。サンプルでは東京駅を表示してみました。
</p>
<p>
ここで、地図右上にある「このページのリンク」というボタンをクリックします。<br />
<img alt="googletop.jpg" src="http://www.imymode.com/inet/images/googlemap01.jpg" width="450"  />
</p>

<h3>ステップ３：ソースコードの取得とサイズの調整</h3>
<p>
すると、「この地図を貼り付けて地図を共有できます」と「HTMLを貼り付けてサイトに地図を埋め込みます」という二つのメニューが出てきます。特にサイズ等に問題がなければそこに書かれたHTMLソースコードをそのままブログやホームページに貼り付けて完了です。<br />
<img alt="googletop.jpg" src="http://www.imymode.com/inet/images/googlemap02.jpg" width="450"  />
</p>

<p>
表示される地図の大きさを調整したい場合には「埋め込み地図のカスタマイズとプレビュー」をクリックします。
</p>

]]>
      <![CDATA[<h3>ステップ４：カスタマイズ画面で自由なサイズに変更</h3>
<p>
そうすると、「カスタマイズ」用の画面が表示されますので、自分のブログやホームページのサイズに合わせて地図を調整の後、ソースコードをコピーして張り付ければバッチリですね！この機能がなかったころは、APIキーを取得して、自分でJavaScriptを書いて・・・と面倒でしたが、ずいぶんと楽になりました。<br />
<img alt="googletop.jpg" src="http://www.imymode.com/inet/images/googlemap03.jpg" width="450"  />
</p>

<h4>実際に貼り付けてみた：サンプル</h4>
<p>
実際にこのページにも貼り付けてみました。とっても簡単です。<br />
<iframe width="425" height="400" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.co.jp/maps?f=q&amp;hl=ja&amp;geocode=&amp;q=%E6%9D%B1%E4%BA%AC%E9%A7%85&amp;ie=UTF8&amp;om=0&amp;s=AARTsJpB2eM-6D8nJEQSYzDU4UHkYlUwPA&amp;ll=35.690834,139.771242&amp;spn=0.027884,0.036478&amp;z=14&amp;iwloc=addr&amp;output=embed"></iframe><br /><small><a href="http://maps.google.co.jp/maps?f=q&amp;hl=ja&amp;geocode=&amp;q=%E6%9D%B1%E4%BA%AC%E9%A7%85&amp;ie=UTF8&amp;om=0&amp;ll=35.690834,139.771242&amp;spn=0.027884,0.036478&amp;z=14&amp;iwloc=addr&amp;source=embed" style="color:#0000FF;text-align:left">大きな地図で見る</a></small>
</p>

<p>
ほとんどの方はこれで用が足りてしまうのではないかと思います。ぜひ活用を！
</p>

<ul>
<li><a href="http://maps.google.co.jp/">Googleマップへのリンクはこちら</a></li>
</ul>]]>
   </content>
</entry>
<entry>
   <title>Cookieの有効な利用方法と注意点</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web21.html" />
   <id>tag:www.imymode.com,2008://1.42</id>
   
   <published>2008-01-25T06:49:19Z</published>
   <updated>2008-02-26T04:54:28Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; Cookieの活用方法 Cook...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの活用方法</div>
<a href="web20.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web22.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>Cookieの有効な利用方法</h2>
<p>
技術的にはCookieをどのように扱うかを知ることができましたが、実際のプログラムの中でどのように使っていくかということが重要です。上手に使えば、かなり効果的なページを作ることもできます。
</p>

<p></p>
<h3>掲示板等フォーム入力時の前回の書き込みの内容の記録</h3>

<p>
普段のインターネットで一番目にするのがこれかもしれません。掲示板などの書き込みを行った場合に、次回その掲示板を訪問したとき自分の名前やメールアドレスが既に記録されていて便利・・・（こわい？）と思ったことはないでしょうか。これもCookieを利用しています。
</p>

<p>
最初の書き込みで再度入力する可能性のある情報をCookieとして保存して、２回目以降に表示します。ぱっと見たときには自分の情報がそのホームページで管理されているような錯覚を覚えますが、実際には自分のブラウザから読み出されているだけなのです。
</p>


<h3>パスワード認証におけるセッションの保持として利用</h3>
<p>
おそらく、最近のウェブアプリケーションで一番よく使われているのがパスワード認証を行った場合のセッション保持としての利用だと思います。<a href="web17.html">セッションの保持</a>でも書きましたが、HTTPというのはステートレスな通信ですので、リクエストをするたびに誰が通信するということを気にしません。よって、それ以外の方法、以前はHIDDEN属性などで先ほどの通信と今の通信が連続しているという状態を教える必要があります。
</p>

<p>
HIDDEN属性なら、画面が変わるたびにHTMLとしてHIDDEN属性に対してパスワードまたはセッションIDのようなものを書き出す必要がありますが、Cookieに埋め込めば利用者が意識することなく、セッションのチェックを行うことが可能になります。
</p>

<p>
どのようにCookieを利用するべきかはアイディア次第という部分も多数あるので、今後気がついた時点でいろいろと実験していきたいと思います。
</p>

]]>
      <![CDATA[<h2>Cookieを利用する場合の注意点</h2>
<p>
これまでいろいろ便利な面を見てきましたが、注意点もいくつかあります。
</p>

<p>
まずCookieは利用者側で受け取りを拒否することが可能であるということです。よって、受け取りを拒否されてしまうと、Cookieを使った仕組みだけに依存している場合、プログラムがうまく動かないということが想定されます。先ほどの例でいうなら、パスワード認証におけるセッション保持の場合がそうですね。
</p>

<p>
このような場合には、最初にCookieを利用しないとその機能も利用できないこと、また、受け入れるような設定になっていない場合にはエラーメッセージでCookieを受け入れるように促すことも必要になってきます。
</p>

<p>
プライバシー云々として誤解を受けることが多いCookieですので、あくまでも利用者の利益のために利用しているということを説明しておくといいのかもしれません。
</p>

<p>
あと、追記ですが、<a href="../exp/cookie.html">Cookieが書き込める範囲、読み込める範囲についての実験</a>も公開していますので、
参考までにどうぞ。
</p>

<a href="web20.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web22.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/07/16 by あいまい)<br />
	(更新2005/2/12)
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの活用方法</div>

]]>
   </content>
</entry>
<entry>
   <title>Cookieの利用方法について - 読み込み編</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web20.html" />
   <id>tag:www.imymode.com,2008://1.41</id>
   
   <published>2008-01-25T06:39:03Z</published>
   <updated>2008-02-26T04:55:38Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; Cookieの読み込み Cook...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの読み込み</div>
<a href="web19.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web21.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>Cookieの利用方法について - 読み込み編</h2>
<p>
Cookieの仕様および書き込む方法について見てきましたが、次は書き込まれたCookieを読み出す方法です。
</p>

<p>
これは意外にも簡単で、Cookieを呼び出す専用の環境変数を利用します。
</p>

<p class="scriptdisp">
		　Perlでの呼び出し方法（環境変数を利用）<br>
		<br>
		　$cook = $ENV{'HTTP_COOKIE'};
</p>

<p>
ブラウザは先ほどの「Domain」と「Path」が一致すれば、そのサーバーに対してCookieを送り返します。それがサーバーの環境変数である「 <em>$ENV{'HTTP_COOKIE'}</em> 」に格納されるのです。
</p>

<p>
これを上の例のようにプログラム中で変数に格納して利用します。
</p>

<h3>Cookieを書き込むためのサンプルプログラム</h3>
<p>
では、Cookieがどのようにデータをやり取りしているのかを見るために、下のようなプログラムを作成してみました。
</p>

<p>
<a href="./scripts/cookie.cgi" target="_blank">
&gt;&gt;サンプルプログラムはこちらから（別窓）
</a>
</p>

<p>
このプログラムは適当な内容をCookieとして有効期限を指定して書き込むものです。有効期限内であればブラウザを落としても情報を保持しています。また、<strong>削除したい場合には過去の有効期限を指定するとCookieは消えます</strong>。
</p>

<p>
実際にプログラムの中では下記のようにヘッダーとしてCookieを書き込み、環境変数の<em>$ENV{'HTTP_COOKIE'}</em>で読み込むという形をとります。
</p>

<p class="scriptdisp">
		■書き込み(ヒアドキュメントとして書く場合)
		<br>
		<br>
		01: print &lt;&lt;HTML;<br>
		02: Content-Type: text/html<br>
		03: Set-Cookie: IMYLAB=Cookieの内容; expires=有効期限<br>
		04: <br>
		05: &lt;html&gt;<br>
		06: &lt;head&gt;...<br>
		07: ・・・<br>
		<br>
		*行番号は便宜的につけたものです。
</p>

<p>
Perlをメインに紹介してきましたが、JavaScriptやHTMLでもCookieを書き出すことは可能です。
</p>
<p></p>

]]>
      <![CDATA[<h3>JavaScriptでCookieを扱う場合</h3>
<p>
「document.cookie="cookieの値";」で書き込み、「変数=document.cookie;」で読み込みます。このCookieの値のフォーマットは先ほどのPerlと同様です。
</p>

<p>
ちなみに、現在参照しているページでどんなCookieが書き込まれているか見てみたい場合に、アドレス欄に「JavaScript:document.cookie;」と入力してEnterを押すと、そのページで書き込まれたCookieをブラウザで表示できます。
</p>

<h3>静的なHTMLでCookieを扱う場合</h3>
<p>
静的なHTMLファイルであっても、「&lt;meta http-equiv="Set-Cookie" content="～"&gt;」というメタタグで書き込みは出来ます。この「http-equiv」というのはヘッダーに書き込むのと同等な働きをHTMLファイルレベルで実現するためのもので、Perlの時にヘッダーに書き込んだのと同等ですが、残念ながらHTMLレベルでは読み込む方法がありません。（私が知らないだけかも、、、）
</p>

<p> 
</p>

<a href="web19.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web21.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/07/16 by あいまい)<br />
	(更新2005/2/12)
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの読み込み</div>

]]>
   </content>
</entry>
<entry>
   <title>Cookieの利用方法について - 書き込み編</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web19.html" />
   <id>tag:www.imymode.com,2008://1.40</id>
   
   <published>2008-01-25T06:23:23Z</published>
   <updated>2008-02-26T04:56:52Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; Cookieの書き込み Cook...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの書き込み</div>
<a href="web18.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web20.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>Cookieの利用方法について - 書き込み編</h2>
<p>
それでは、実際にPerlでCookieをどのように利用するかを見てみたいと思います。
</p>

<p>
まずCookieの仕様について必要最低限のことを示したいと思います。先ほどの図でもお分かりのとおり、Cookieはサーバー側からデータを送るのが最初です。このデータを、通常はHTTPヘッダーと呼ばれるHTMLのソースなどでは見えない場所に書き込みます。
</p>

<blockquote cite="http://wp.netscape.com/newsref/std/cookie_spec.html">
	Set-Cookie: NAME=VALUE; expires=DATE;
	path=PATH; domain=DOMAIN_NAME; secure
</blockquote>

<p>
実際にPerlなどのサーバーサイドプログラムでは下のように書くことになります。
</p>

<p class="scriptdisp">
		　Perlでの実装方法<br>
		<br>
		　print "Set-Cookie: (<em>～クッキーの中身</em> )\n";<br>
</p>

<p>
では、この中身をいっしょに考えていきたいと思います。
</p>


]]>
      <![CDATA[<h3>Cookieに書き込むパラメーターの解説</h3>
<h4>NAME=VALUE</h4>
<p>
ここに、Cookieの名前と内容を書き込みます。たとえば、このCookieの名前を「IMY」、書き込みたい内容を「ABCDEFG」だとすると、
</p>

<p class="scriptdisp">
 Set-Cookie:IMY=ABCDEFG;
</p>

<p>
というようになります。<br />
ネットスケープのページにはこの内容の部分は「%XX%XX%XX」というように、URLエンコードされた文字がお勧め、、、とかかれてますが、実際違う方法で書き込むとどうなるのでしょうか。機会があれば実験結果を公開します。上の引用部分でCookieの仕様を書きましたが、全て書き込まれなくても、最低この部分のデータさえあればCookieとして動きます。
</p>

<!-- 次の説明 -->

<h4>expires=DATE</h4>
<p>
Cookieのデータをサーバーからパソコンに記憶させた場合に、いつまでそのデータが有効か、いつまで保存されるべきかを指定します。このexpires=「～」で有効期限を書き込むと、その日付まで保存されるようになります。
</p>

<p>
このDATEの部分の書式は下のようになります。
</p>

<blockquote cite="http://wp.netscape.com/newsref/std/cookie_spec.html">
	Wdy, DD-Mon-YYYY HH:MM:SS GMT
</blockquote>

<p>
（Wdy:曜日 / DD: 日 / Mon: 月 / YYYY: 年 / HH: 時 / MM: 分 / SS: 秒）
</p>

<p>
日本時間の場合に「JST」とか指定ますが、Cookieの場合には「GMT」しか指定できないそうです。ですが、この「expires」というのは先ほどの「NAME=VALUE」と違い<strong>必須ではありません</strong>。ですから、ここを省略すると、セッションが終了と同時にCookieは消去されます。
</p>


<!-- 次の説明 -->

<h4>domain=DOMAIN_NAME</h4>

<p>
ここには、Cookieが書き出されたドメイン名が入ります。通常、Cookieは書き込まれたサイトにしかその情報を返しません。AAAというホームページで書き込まれたCookieをBBBというホームページに返したりはしません。（こんなことがおきると、セキュリティー上も問題ですが、、、）
</p>

<p>
何も指定しなければ、サーバーのホスト名が入ります。
</p>

<!-- 次の説明 -->

<h4>path=PATH</h4>
<p>
先ほどはドメインでしたが、ここでは更にドメインの中のPath、わかりやすく言うなら、どのディレクトリから受けとったCookieかという情報を書き込みます。逆にここを違うPathに書き換えることで、別のPathにあるCGI用プログラムとかにCookieを渡したりできるようになります。
</p>

<p>
何も指定しなければ、書き出されたプログラムがあるPathが入ります。
</p>

<!-- 次の説明 -->

<h4>secure</h4>

<p>
この「secure」というオプションを書き加えると、HTTPS（SSL）といった安全な環境での通信時にしかCookieをやり取りできないようにできます。
</p>

<p> 
</p>

<a href="web18.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web20.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/07/16 by あいまい)<br />
	(更新2005/2/12)
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieの書き込み</div>

]]>
   </content>
</entry>
<entry>
   <title>Cookieとは - 活用方法の概略</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web18.html" />
   <id>tag:www.imymode.com,2008://1.39</id>
   
   <published>2008-01-25T06:15:42Z</published>
   <updated>2008-02-26T04:58:17Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; Cookieとは Cookieの...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieとは</div>
<a href="web17.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web19.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>Cookieの利用について</h2>
<p>
これまではサーバー側に処理された情報を記録する方法を中心に扱ってきました。たいていそのような処理で問題ないのですが、利用者のパソコン（クライアント）側にデータを記録できるといいなぁ、、、と思ったことはないでしょうか？
</p>

<p>
掲示板などで毎回入力する必要のある決まった項目（名前、メールアドレスなど）といったことから、ログインするまでもないけど利用者が設定した画面構成を再度表示したい場合まで、、、
</p>

<p>
このような場合にCookieという技術を利用することができます。このCookieの歴史について深くはここでは触れませんが、もともとNetscape社がブラウザにデータを記録するために開発した技術で、それが他のブラウザにも採用され、現在では標準的となっている技術の一つです。
</p>

<h3>Cookieの仕様とその仕組み - 図解</h3>
<ul>
<li><a href="http://wp.netscape.com/legal_notices/cookies.html" target="_blank">ネットスケープ社のCookie公式情報（他サイト）</a></li>
<li><a href="http://wp.netscape.com/newsref/std/cookie_spec.html" target="_blank">Cookieに関するスペック（他サイト）</a></li>
<li><a href="./scripts/cookie.cgi" target="_blank">とりあえずサンプルプログラムはこちらから（別窓）</a></li>
</ul>

<p>
下の図でもわかるように、
</p>

<ol>
<li>最初にページを見に行くと（リクエスト）</li>
<li>Webサーバーからページがダウンロードされて各個人のパソコンにホームページが表示されると同時に</li>
<li>Cookieも送信されてパソコンに保存されます。</li>
<li>そのCookieは次回そのページを表示するときに、そのページが置かれたサーバーに戻される仕組みとなります。</li>
</ol>

<p>
<a href="../exp/cookie.html">どの範囲でCookieが読み書きされるかはこちらから</a>
</p>

<p>
<img src="./img/cookie.png" width="465" height="189" alt="Cookieの仕組み" />
</p>
]]>
      <![CDATA[
<h3>Cookieの利用とプライバシーへの配慮</h3>

<p>
Cookieを利用されるとプライバシーが、、、ということが懸念されていたりしますが、基本的に情報を持っていかれるのではなく、情報を利用者側に埋め込まれるのです。使い方を正しく明示して利用者の不安を取り除いてあげる必要もありますね。（場合によってはプライバシーを侵害するような使い方もできるので注意が必要です。）
</p>

<p>
また、このCookieという技術はPerlやPHPといったサーバー側でのプログラムでないと実現できないかというとそうでもなく、JavaScriptやHTMLの中でも簡単に利用できてしまいます。よく、貴方は○○回目の訪問ですね？とかいうちょっと目障りなメッセージとかに遭遇しませんか？この程度のことならJavaScriptで簡単に可能なのです。
</p>

<p> 
</p>

<a href="web17.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web19.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/07/16 by あいまい)<br />
	(更新2005/2/12)
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; Cookieとは</div>

]]>
   </content>
</entry>
<entry>
   <title>セッション(接続状態)の保持 - たった一度だけの関係？</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web17.html" />
   <id>tag:www.imymode.com,2008://1.38</id>
   
   <published>2008-01-25T05:33:09Z</published>
   <updated>2008-02-26T05:00:19Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; セッション保持 セッション(接続...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; セッション保持</div>
<a href="web16.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web18.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>セッション(接続状態)の保持 - たった一度だけの関係？</h2>
<p>
一番最初でも書きましたが、ホームページは要求に対して返信という命令の繰返しで成り立っている仕組みです。つまり、常に通信している状態というのを管理できません。わかりやすく書くと、誰がホームページをクリックしたかという情報はクリックしたそのとき限りしか感知しない、ということです。
</p>

<p>
自分は同じサーバー内のAというページからBというページにリンクにより移動したとします。自分のパソコンやブラウザは自分がそのようにページを移動したことを覚えていますが、要求を受け付けて応答しているサーバーはAのリクエストもBのリクエストも「誰が」という状態を全く管理していないのです。
</p>

<p>
これはHTTPというプロトコルの仕様なのですが、パソコン（クライアント）から要求があって、その応答をサーバーがする過程では、そのとき一度限りの関係でしかないのです。これがどのように問題になるのでしょうか？
</p>

<h4>一番簡単な例でたとえるなら、、、</h4>

<p>
掲示板のプログラムで、初期設定を発言の最新から１０件表示としていたとします。当然、次の１１～２０を見るためには都度１１～２０のデータがほしい、戻る場合も１～１０のデータがほしいという情報を送信する必要があるのです。自分が今１～１０のデータを見ていたとしても、そのことはサーバー側では全く感知しません。
</p>

<p>
もっと重要な例でいうなら、パスワードで制限されたページを考えてみてください。最初にユーザID＆パスワードを入力して認証されれば最初のページが表示されますが、利用者がその保護されたページを移動するためには、都度、その利用者がその人であることを教えてやる必要があるのです。
</p>

<h4>ステートレス型通信の特徴</h4>
<p>
このあたりの、一つのアクションに対する応用の仕方がスタンドアローンでプログラムを書く場合との最大の違いになるのです。（これを<strong>ステートレス型</strong>といいます。ステートレスとは状態がない、、、つまり状態を管理しないということです。）
</p>

<p>
スタンドアローン形のプログラムの例で言うなら、一度なにかの処理をするごとにそのプログラムを終了しているのと同じことです。毎回終了しているので、その続きの処理をさせるのには、毎回そこまでのデータを教える必要がある、ということと同じになります。
</p>

<p> 
</p>

<h3>inputタグのhidden属性で状態を伝える（一例として）</h3>

<p>
一連の処理で画面が次々と変わっていく（遷移していく）場合には、それらが継続していることをサーバーに伝える必要があるということは、先ほどの記述で理解していただけた（？）と思っていはいるのですが、では、サーバー側でその連続性を認識できない（セッションが確立されない）なら、どのようにしてそれおを実現するか、という問題が発生します。
</p>

<p>
その一例としてあげられるのが、INPUTタグのhidden属性を利用する方法です。では、今回もサンプルで考えてみましょう。
</p>

<p>
まず、ユーザー登録（懸賞応募など）のプログラムを考えてみたいと思います。下のような流れで画面は移っていきますよね？
</p>

<p class="scriptdisp">
		　画面遷移<br>
		<br>
		　１・情報入力画面<br>
		　　　↓<br>
		　２・情報確認画面<br>
		　　　↓<br>
		　３・送信終了画面<br>
</p>

<p>
通常このようなデータを受け付ける場合の画面遷移を考えた場合、１番だけの入力画面で終わるケースはまれですし、入力している利用者側にも不安を与えかねません。
</p>

<p>
そこで、２番目のプロセスのように、入力させてその情報を再度確認させる画面を表示し、そこで送信（登録）終了後に、ただしく処理された旨の確認画面を出す、という流れになっています。
</p>

<p>
１で入力された情報を再度確認のために２に表示するのはこれまでのプログラム処理と同じなのですが、その情報を最後にサーバーに書き込むという処理の場合にも、２から３に移動するときに、１で入力された同じ情報を再度、利用者の端末側から送り込む必要があるのです。（１で情報を入力され、２で表示した段階で、サーバーはその情報を全く覚えていません。）
</p>

<p>
よって、プログラム内では、１で入力された内容の必要なものを確認画面のためにHTMLで書き出すと同時に、再度サーバーに送り込むための準備をする必要があるのです。そのために、１で入力された内容を再度INPUTタグにHIDDENとして書き込む必要があるのです。（面倒ですが、ステートレスであることがHTTPというプロトコルの仕様なので、仕方がありません）
</p>

<p>
このような処理は今回に限らず、状態を維持しながらページを表示したい場合には、「自分が今どのような状態なのかのすべて」を「毎回」サーバーに教える必要があります。
</p>

<h5>hidden属性でのセッション保持のサンプル</h5>
<p>
ちなみに、上で解説した入力画面の例を理解してもらうために、サンプルをつくりました。下をクリックすると、別窓が開きます。（今回はhidden属性の使い方になるので、サンプルソースはありません。）
</p>

<ul>
 <li><a href="./scripts/hiddentest.cgi" target="_blank">&gt;&gt; サンプルはこちらをクリック</a></li>
</ul>
]]>
      <![CDATA[
<h3>その他の実装方法 - Cookieでセッションの保持</h3>
<p>
HTML内にhidden属性を利用する方法以外にCookieを使う方法もあります。Cookieを利用すれば、hidden属性を利用するのと同様に、そのパソコンのデータをサーバーとの間でやり取りできます。また、INPUTタグを利用するのと違い、HTMLにデータを書き出すことが不要です。（そのかわりCookieを読み書きするための処理が必要ですが、、、）
</p>

<p>
ただし、Cookieは利用者のパソコンで利用不可としていることもあるため、Cookieを使えるようにしていないとこの方法は使えません。
</p>

<p>
どちらの方法がいいかという点については一長一短ありますし、これはユーザーパスワード等を使ったページの保護を考える場合にも必要となってきますので、別途検討したいと思います。具体的には、ユーザーパスワードを求めるようなページを作った場合、セッションの維持をするために、CookieやHidden属性に生のパスワードを埋め込むか、それともセッションIDのような数値を生成するか、、、というちょっと奥の深い話になってしまいます。
</p>

<p>
今回はとりあえず、状態保持には都度情報を送信する必要がある、ということを理解してもらえればOKだと思います。
</p>
<p> 
</p>

<a href="web16.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web18.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/02/15 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; セッション保持</div>
]]>
   </content>
</entry>
<entry>
   <title>簡易アンケートを作ってみる</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web16.html" />
   <id>tag:www.imymode.com,2008://1.37</id>
   
   <published>2008-01-25T05:12:03Z</published>
   <updated>2008-02-26T05:02:23Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; 簡易アンケート 簡易アンケート ...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 簡易アンケート</div>
<a href="web15.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web17.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>簡易アンケート - 入力内容を保存・表示する</h2>
<p>
前回で解説したようなプログラムならJavaScriptで出来てしまいます。ですから、次はそれだけでは出来ないようなものをサンプルとして取り上げます。「カウンター」の応用編のようですが、アンケート集計です。
</p>

<p>
<center>
<form action="./scripts/quest.cgi" method="post" onSubmit="window.open('','result000','width=150,height=150,scrollbars=no,resizeable=no,toolbar=no,titlebar=no,status=no');" target="result000">

<table bgcolor="#ffcc00" cellpadding="15"><tr><td bgcolor="#ffffff">
<font size="2">
■アンケート調査です。<br>
賛成:<input type="radio" name="ans" value="yes"><br>
反対:<input type="radio" name="ans" value="no"><br>
<input type="submit" value="答える">
</font>
</td></tr>
</table>
</form>
</center>
</p>

<p>
今回も、とりあえずソースを見てみたいと思います。（ただ、ずいぶん長いソースになってきました・・・）
</p>

<p class="scriptdisp">
	01: #!/usr/local/bin/perl<br>
	02: <br>
	03: require 'jcode.pl';<br>
	04: <br>
	05: <font color="#990000"><b>&amp;read_data;</b></font><br>
	06: <br>
	07: # count.datというファイルから現在のカウント数を読み込む<br>
	08: open (IN, "quest.dat");<br>
	09: @count=&lt;IN&gt;;<br>
	00: close(IN);<br>
	11: <br>
	12: # 改行コードを取り除く<br>
	13: chomp @count;<br>
	14: <br>
	15: # 現在のカウント数$countに１を追加<br>
	16: if ($FORM{'ans'} eq "yes"){	$count[0]++;}<br>
	17: elsif (	$FORM{'ans'} eq "no"){$count[1]++;}<br>
	18: <br>
	19: # print以外でもヒアドキュメントは使えるんです。便利！<br>
	20: $newdata = &lt;&lt;"DATA";<br>
	21: $count[0]<br>
	22: $count[1]<br>
	23: DATA<br>
	24: <br>
	25: # １増加したカウントを保存<br>
	26: open (OUT, "&gt;quest.dat");<br>
	27: print OUT $newdata;<br>
	28: close(OUT);<br>
	29: <br>
	30: # ここからHTMLでの表示<br>
	31: print &lt;&lt;"HTML";<br>
	32: Content-Type: text/html<br>
	33: <br>
	34: &lt;html&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&lt;/head&gt;<br>
	35: &lt;body&gt;<br>
	36: アンケート結果&lt;br&gt;<br>
	37: 賛成 ： $count[0] 人&lt;br&gt;<br>
	38: 反対 ： $count[1] 人&lt;br&gt;<br>
	39: &lt;/body&gt;&lt;/html&gt;<br>
	40: HTML<br>
	41: <br>
<font color="#990000">
	42: # サブルーチン化された読み込み処理<br>
	43: sub read_data(){ <br>
	44: 　　if ($ENV{'REQUEST_METHOD'} eq "POST") {<br>
	45: 　　　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br>
	46: 　　} else {<br>
	47: 　　　　$buffer = $ENV{'QUERY_STRING'};<br>
	48: 　　}<br>
	49: 　　foreach (split(/&/, $buffer)) {<br>
	50: 　　　　($keyword, $value) = split(/=/);<br>
	51: 　　　　$value =~ tr/+/ /;<br>
	52: 　　　　$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;<br>
	53: <br>
	54: 　　　　# S-JISコード変換<br>
	55: 　　　　&amp;jcode'convert(*value, "sjis", "", "z");<br>
	56: <br>
	57: 　　　　$value =~ s/\r//g;<br>
	58: 　　　　$value =~ s/\n//g;<br>
	59: <br>
	60: 　　　　$FORM{$keyword} = $value;<br>
	61: 　　} <br>
	62: }<br>
</font>
	63: __END__<br>

</p>

]]>
      <![CDATA[<h3>簡易アンケート・プログラムソースの解説</h3>

<h5>共通の処理をサブルーチン化する</h5>
<p>
まず、最初の例との違いですが、入力されたデータを処理する部分をサブルーチン化しています。下の「<b>&amp;</b>read_data;」というのは「read_data」という名前のサブルーチンの処理をしなさい、というPerlの命令です。
</p>

<p class="scriptdisp">
	01: #!/usr/local/bin/perl<br>
	02: <br>
	03: require 'jcode.pl';<br>
	04: <br>
	05: <font color="#990000"><b>&amp;read_data;</b></font><br>
<br>
<br>
<font color="#990000">
	43: <b>sub read_data()</b>{ <br>
	44: 　　if ($ENV{'REQUEST_METHOD'} eq "POST") {<br>
	45: 　　　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br>
	　　　　・・・<br>
	60: 　　　　$FORM{$keyword} = $value;<br>
	61: 　　} <br>
	62: }<br>
		<br>
</font>
</p>

<p>
５行目でそのように書くことで、今度は４３行～６２行（茶色の部分）を実行するような命令になります。Perlでは「&amp;***」でサブルーチンを呼び出し、「sub ***{}」でサブルーチンの処理を定義しています。
</p>

<p>
ですから、このようによく使う命令群をサブルーチン化することで、効率よくプログラムを書くことが出来ます。（これはPerlに限ったことではないですが・・・）
</p>

<h5>ファイルからデータの読み込み</h5>
<p>
次に、アンケートデータを保存してあるファイルからデータを読み出します。このとき、「＠count」という配列に読み込みます。テキストデータだと各行が配列の要素に一致します。「$count[0]⇒１行目、$count[1]⇒２行目、$count[2]⇒３行目」というようにです。
</p>

<p class="scriptdisp">
	08: open (IN, "quest.dat");<br>
	09: @count=&lt;IN&gt;;<br>
	00: close(IN);<br>
	11: <br>
	12: # 改行コードを取り除く<br>
	13: chomp @count;<br>
</p>

<p>
ですが、各要素の末尾には改行コードがついていて、処理するには不具合があるので１３行目の「chomp」という命令で改行コードを取り除いています。
</p>

<p>
あとは、「yes」か「no」かで、集計処理を分けて最終的にそれを保存して終了、という処理になります。
</p>

<p class="scriptdisp">
	15: # 現在のカウント数$countに１を追加<br>
	16: if ($FORM{'ans'} eq "yes"){	$count[0]++;}<br>
	17: elsif (	$FORM{'ans'} eq "no"){$count[1]++;}<br>
</p>

<p>
書き込みをする条件を入力してもらうという点を除けば、基本的にはカウンターと同じ処理だと思います。簡単ですよね。これで入力データの処理について理解してもらえたでしょうか？？
</p>
<a href="web15.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web17.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/02/05 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 簡易アンケート</div>

]]>
   </content>
</entry>
<entry>
   <title>血液型占いをつくってみる</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web15.html" />
   <id>tag:www.imymode.com,2008://1.36</id>
   
   <published>2008-01-25T05:04:34Z</published>
   <updated>2008-02-26T05:03:30Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; 血液型占い 血液型占いをつくって...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 血液型占い</div>
<a href="web14.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web16.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>

<h2>血液型占いをつくってみる</h2>
<p>
前回プログラムへのデータの渡し方（入力）について考えましたが、あれだけではいったい何をやっているのか？？？な状態だったと思います。そこで、今度はサンプルとしていくつか簡単なデータをやり取りするプログラムを作ってみたいと思います。
</p>

<h3>選択に応じて内容を変える - アルゴリズム</h3>
<p>
まず、簡単な例からです。
</p>

<p>
利用者の選択に応じて、表示内容を変えるためのプログラムです。具体的には最初でやった「おみくじ」のようなプログラムになります。「おみくじ」の場合は画面を変化させるための振分けをサーバー内の時間によって行っていましたが、これを入力されたデータによって変化させる、という単純なものです。
</p>

<p>
プログラムの簡単な流れとしては下のようになります。
</p>

<p class="scriptdisp">
		　入力（選択）画面（HTML）<br>
		　　↓<br>
		　プルダウンによる選択<br>
		　　↓<br>
		　クエリーを受けて処理<br>
		　　↓<br>
		　プログラム内で分岐<br>
		　　↓<br>
		　表示<br>
</p>

<p>
前回は「おみくじ」だったので、今回は「血液型うらない」にしてみたいと思います。ウェブ上で血液型を聞いて、それに応じた内容を返す、というプログラムです。
</p>

<p>
<center>
<form action="./scripts/fortune2.cgi" method="post" onSubmit="window.open('','result00','width=200,height=150,scrollbars=no,resizeable=no,toolbar=no,titlebar=no,status=no');" target="result00">
<table bgcolor="#ffcc00" cellpadding="15"><tr><td bgcolor="#ffffff">
<font size="2">
■血液型占い（選択してチェックしてみて！）<br>
Ａ型　:<input type="radio" name="bloodtype" value="A"><br>
Ｂ型　:<input type="radio" name="bloodtype" value="B"><br>
Ｏ型　:<input type="radio" name="bloodtype" value="O"><br>
ＡＢ型:<input type="radio" name="bloodtype" value="AB"><br>
<input type="submit" value="チェック">
</font>
</td></tr></table>
</form>
</center>
</p>

<p>
とりあえずソースを見てみましょう。
</p>

<p class="scriptdisp">
		01: #!/usr/local/bin/perl<br>
		02: <br>
		03: require 'jcode.pl';<br>
		04: <br>
		05: if ($ENV{'REQUEST_METHOD'} eq "POST") {<br>
		06: 　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br>
		07: } else {<br>
		08: 　　$buffer = $ENV{'QUERY_STRING'};<br>
		09: }<br>
		10: <br>
		11: foreach (split(/&/, $buffer)) {<br>
		12: 　　($keyword, $value) = split(/=/);<br>
		13: 　　$value =~ tr/+/ /;<br>
		14: 　　$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;<br>
		15: <br>
		16: 　　# S-JISコード変換<br>
		17: 　　&amp;jcode'convert(*value, "sjis", "", "z");<br>
		18: <br>
		19: 　　$value =~ s/\r//g;<br>
		20: 　　$value =~ s/\n//g;<br>
		21: <br>
		22: 　　$FORM{$keyword} = $value;<br>
		23: } <br>
		24: <br>
		25: if ($FORM{'bloodtype'} eq "A"){<br>
		26: 　　$hyoji = "きまじめ";<br>
		27: }elsif ($FORM{'bloodtype'} eq "B"){<br>
		28: 　　$hyoji = "ほがらか";<br>
		29: }elsif ($FORM{'bloodtype'} eq "O"){<br>
		30: 　　$hyoji = "おおざっぱ";<br>
		31: }elsif ($FORM{'bloodtype'} eq "AB"){<br>
		32: 　　$hyoji = "つかみどころがない";<br>
		33: }else{<br>
		34: 　　$hyoji = "？";<br>
		35: }<br>
		36: # ここからHTMLの表示です。<br>
		37: print <<"HTML";<br>
		38: Content-Type: text/html<br>
		39: <br>
		40: &lt;html&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&lt;/head&gt;<br>
		41: &lt;body&gt;<br>
		42: $FORM{'bloodtype'}型のあなたの性格&lt;br&gt;<br>
		43: $hyoji<br>
		44: &lt;/body&gt;&lt;/html&gt;<br>
		45: <br>
		46: HTML<br>
		47: <br>
		48: __END__<br>
		＊インデントにスペースを使っています。<br>
		　このままコピーしても動きません。<br>
		*左端の番号は便宜的に付けた行番号です。<br>
</p>

]]>
      <![CDATA[<h3>血液型占いプログラムの解説</h3>

<p>
最初の行の「require 'jcode.pl';」
</p>

<p class="scriptdisp">
		03: require 'jcode.pl';<br>
</p>

<p>
これは入力された文字コードを変換するために「jcode.pl」というライブラリーを取り込む処理です。前回のデコードでも書きましたが、入力される文字コードによって文字化けとなる可能性があるため、これらを適切な文字コードに変換する必要があります。逆に入力される文字が英数だけならこの処理は要らないと思います。
</p>

<p>
次からの行が前回解説した部分になります。実は、今回のサンプル程度の入力ならこんなに複雑な処理をする必要もないのです。入力されるのは、「bloodtype」 という属性が「A,B,O,AB」 ということだけですので、「<b>?bloodtype=**</b>」という入力さえ処理できればいいはずです。しかも入力されるのは英文字だけです。（数字さえない！）
</p>

<p>
よって、１０～２３行の処理をもっと単純に書き直すためには、
</p>

<p class="scriptdisp">
		【入力処理を単純にした例】<br>
		05: if ($ENV{'REQUEST_METHOD'} eq "POST") {<br>
		06: 　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br>
		07: } else {<br>
		08: 　　$buffer = $ENV{'QUERY_STRING'};<br>
		09: }<br>
		10:<b> ($keyword, $value) = split(/=/);</b><br>
		11:<b> $FORM{$keyword}= $value;</b><br>
		<br>
		＊太字の部分が10-23行を置き換えた部分<br>
</p>

<p>
これだけでOKになってしまいます。（当然require 'jcode.pl'も不要）<br />
では、なぜ前回のように複雑なことをしているのかということですが、<font color="red">外部からの入力データを汎用的に扱うことができるようにするため</font>なのです。
</p>

<h5>プログラムに汎用性を持たせる</h5>
<p>
入力というのは今回に限らず、プログラムをするときには必ず必要になってきます。その必ず必要になってくる部分を毎回その入力されるデータごとに合わせて処理をしているのでは、プログラムを作成するときの作業効率が悪くなるからです。
</p>

<p>
上の単純に書いた例では、一つのデータしか扱うことができません。このプログラムだけで終了ならいいのですが、もし、もう一つデータを受け取りたくなった場合には、それ用に書き換える必要もあります。また、英文字以外を使う場合には文字コードに応じた処理も、、、と考えると、前回のようにある程度一般化する必要があるのです。
</p>

<p>
こうすると、今回のサンプルで、血液型以外に生年月日と年齢を入力してもらおう、、、と言った場合でも、入力される部分を全く書き換える必要なくデータを取り込むことができます。
</p>

<p>
通常このように一般化（共通化）されて、何度も頻繁に利用される部分だけを抜き出してサブルーチン化します。（またはライブラリーやモジュール化する場合もあるでしょう・・・）よって、次のプログラムではこの入力を実行する部分だけをサブルーチンとして抜き出して処理しています。（次項を参照）
</p>

<h5>ヒアドキュメントで簡単にＨＴＭＬ出力</h5>
<p>
最後に、入力された内容にしたがって表示させるHTMLを作る部分ですが、前回までのprint命令とはちょっと違う書き方をしています。これはヒアドキュメントという手法です。
</p>

<p class="scriptdisp">
		print &lt;&lt;"HTML";<br>
		<br>
		ここに自由にテキスト、HTML等を書き込めます。<br>
		<br>
		HTML<br>
		<br>
		＊HTMLの部分はどのような文字でもOK<br>
</p>

<p>
これを使うと一行ごとにPrintを書かなくてもよくなりますし、ダブルクォーテーション（”）を（\）でエスケープすることも不要です。こんな便利なもの早く教えろ！と言われそうですが、、、
</p>

<p>
また、ヒアドキュメントで書き出された部分の改行は反映されますので、わざわざ「\n」を書かなくても良くなります。逆に、ここで改行して表記してしまうと出力結果にも改行は反映されるので注意が必要です。（&lt;BR&gt;の意味ではないです。念のため・・・）</p>

<p>
それ以外は通常のPrint文と同じです。複数行OKなPrint文だと思えばOKでしょう。
</p>

<a href="web14.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web16.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/02/05 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 血液型占い</div>
]]>
   </content>
</entry>
<entry>
   <title>受け取ったデータの処理</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web14.html" />
   <id>tag:www.imymode.com,2008://1.35</id>
   
   <published>2008-01-25T02:56:45Z</published>
   <updated>2008-02-26T05:05:57Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; 受け取ったデータの処理 受け取っ...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 受け取ったデータの処理</div>
<a href="web13.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web15.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>

<h2>受け取ったデータ処理のためのプログラム</h2>
<p>
前回で、データの送信がどのように行われるか理解できたと思いますが、送信されたデータをプログラム内で処理できるように整理する必要があります。下のソースは、「項目名１＝値１＆項目名２＝値２＆項目名３＝値３」といったデータを$bufferという変数に取り込むための処理です。
</p>

<h3>POSTとGETの場合わけ - 分岐処理</h3>
<p>
この場合、先ほども書きましたが、POSTで送信された場合とGETで送信された場合で処理が違う(格納される変数が違う)ため、場合分けを行っています。
</p>

<p class="scriptdisp">
			01: if ($ENV{'REQUEST_METHOD'} eq "POST") {<br />
			02: 　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br />
			03: } else {<br />
			04: 　　$buffer = $ENV{'QUERY_STRING'};<br />
			05: }<br />
			<br />
			<br />
			【簡易解説】<br />
			01: もしも $ENV{'REQUEST_METHOD'} が POST なら<br />
			02: 　　STDINという変数から $ENV{'CONTENT_LENGTH'}の長さだけデータを読み出して<br />
			　　　　$bufferに入れる<br />
			03: それ以外の場合（GET）は下の処理<br />
			04: 　　$ENV{'QUERY_STRING'}からデータを読み出して$bufferに入れる<br />
			05: 以上<br />
</p>

<p>
まず、「<b>$ENV{'REQUEST_METHOD'}</b>」という特別な変数を参照して、要求が「POST」か「GET」かのチェックを行います。この「<b>$ENV{'REQUEST_METHOD'}</b>」は環境変数と言われ、要求等に関する様々な情報を知ることができます。これ以外にも様々なものがありますので、順次紹介したいと思います。
</p>


<h5>POSTで送信された場合</h5>
<p>
POST の場合は、標準入力(STDIN)として入力されるので、上記のように $buffer に対して、<font color="#000099">$ENV{CONTENT_LENGTH}</font> の長さのデータを入力する、というようにして処理します。(上記２行目。$ENV{CONTENT_LENGTH}は入力されたデータの長さをチェックする環境変数です。)
</p>

<h5>GETで送信された場合</h5>
<p>
GETの場合は、URLとして送信されるので、そのデータの長さに限界があります。
また、送信されたデータは標準入力ではなく、<font color="#000099">$ENV{QUERY_STRING}</font> に格納されるので、その中のデータをそのまま $buffer に入力しています。(上記４行目)
</p>

<p>
ちなみに、ここでは$bufferという名前の変数を使いましたが、どんな名前のものでもOKです。これで、プログラム内にデータを取り込むことができました。ただ、この状態では
</p>

<p class="scriptdisp">
			　$buffer = <u><font color="red">「項目名１＝値１＆項目名２＝値２＆項目名３＝値３」</font></u>
			<br />
</p>

<p>
というつながった一つのデータに過ぎませんので、これを扱えるようにバラバラにする必要があります。
</p>

<h3>まとまったデータを分離する処理</h3>
<p>
下記の処理では、$bufferに格納されたデータを「&amp;」を区切り文字として分離する処理です。これを、&amp;で区切れることができなくなるまで繰り返します。「foreach」とはPerlで利用できるそのような繰返し処理です。
</p>

<p class="scriptdisp">
			　foreach (<b>split(/&amp;/, $buffer)</b>) {<br />
			　　　処理（ここはあとで解説）<br />
			　}
</p>


<p>
ですが、&amp;で切り取られたデータはどこにいってしまったのでしょうか？
これは、Perlの書き方の問題なのですが、Perlはソースの表記をかなり省略できます。この場合、上記の太字の部分で切り取られたデータは、「<font color="red">$_</font>」という汎用的な変数に格納されて、変数を使うことを明示しなくても使えるという非常に便利（あいまい）な機能です。この「$_」は明示して使うこともできますし、明示せずに省略して関数を使うことで、自動的に引数として渡すこともできます。
</p>

<p>
ですから、<font color="#000099">foreach(split(/&/,$buffer))</font> は正確に記述すると、
</p>

<p class="scriptdisp">
			　　　foreach $_ (split(/&/,$buffer))
			<br />
</p>

<p>
ということになります。<br />
この切り取られたデータは
</p>

<p class="scriptdisp">
			　$buffer=「項目名１＝値１＆項目名２＝値２＆項目名３＝値３」
			<br />
			<br />
			　　　↓
			<br />
			<br />
			　項目名１＝値１<br />
			　項目名２＝値２<br />
			　項目名３＝値３<br />
			<br />
</p>

<p>
上記のように分解されますが、まだ項目と値が＝でつながっているのでさらにこれらを分離する必要があります。よって、「foreach(){}」の繰り返し処理の中で、この分解されたそれぞれを、さらに「<font color="red">＝</font>」で分離して、
</p>

<p class="scriptdisp">
			　　($keyword, $value) = split(/=/);
			<br />
			<br />
			　　　↓
			<br />
			<br />
			　　$keyword<br />
			　　$value<br />
			<br />

			＊ちなみに、上の式は次の式の省略形です。<br />
			　　($keyword, $value) = split(/=/, $_);
			<br />
</p>

<p>
というように変数にそれぞれ格納します。
<br />
これを、$keywordと$valueという関連づいた変数で扱うことができるように、ハッシュに格納します。（Perlでの常套手段です。）
</p>

<p class="scriptdisp">
			　　　$FORM{$keyword} = $value;<br />
			<br />
			　　　　　↓
			<br />
			<br />
			　　　$FORM{'項目名１'}＝値１<br />
			　　　$FORM{'項目名２'}＝値２<br />
			　　　$FORM{'項目名３'}＝値３<br />
</p>

]]>
      <![CDATA[<h3>エンコード処理 - 日本語として読めるように</h3>
<p>
これで入力されたデータをプログラム中で変数として扱うことができるようになります。
基本的にはこれでOKなのですが、ちょっと困る場合もあります。先ほど上でも書きましたが、「GET」でも「POST」でも送信するときに「<font color="red">%82%A0%82%A2%82%DC%82%A2...</font>」という文字に変換されてしまいます。（エンコードという）
</p>

<p>
英数だけなら問題ないのですが、それ以外の文字や日本語の文字はこのように通常では読めない形式に変換されてしまうので、これを読めるように戻してやる必要があります。（デコードという）
</p>

<p>
そこで、$value に格納されたデータの中に、「<font color="red"><b>%**</b></font>」という形式で書かれたデータを見つけた場合、下記のように%だけと取り除いて、通常の１６進数のコードを取り出す必要があるのです。（これは１６進数だったのですね！）
</p>

<p>
そこで、次のような式が必要になります。
</p>

<p class="scriptdisp">
			　　　$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
			<br />
</p>

<p>
これは、色々な処理を効率よく一行にしてしまっているので分かりにくいのですが、簡単に書くと下のような処理を順番にしています。
</p>

<p class="scriptdisp">
			<b>$value =~ s/（データ１）/（データ２）/eg; </b>
			<br />
			<br />
			これは、$value の文字列に「データ１」に該当する部分があれば「データ２」に置換するという処理です。
			<br />
			<br />
			<b>%([a-fA-F0-9][a-fA-F0-9])</b>
			<br />
			<br />
			この場合、「%」で始まるアルファベットまたは数字で構成される二桁の文字列（例、%82%A0%82%等）を見つけたら変換しなさい、
			という命令となっています。
			<br />
			<br />
			<b>pack("C", hex($1)</b>
			<br />
			<br />
			変換の仕方ですが、%だけ抜き出して変換された１６進数を１０進数に変換して、
			それを文字（Char）として更に変換したものに置き換えなさいという処理を行っています。
			<br />
			<br />
			最後に、その内容を $value に上書きして終了。<br />
			つまり、「%82%A0%82%A2%82%DC%82%A2...」のような読めない文字が読める文字に変換されます。
			<br />
</p>

<p>
入力を受付けるデータが英数文字だけならこれで問題ないのですが、日本語を使いたい場合もあります。このような場合は、文字コードに従った処理をする必要があるので、（WindowsはShift-JIS, UnixはEUCなど、、、）<font color="red"><b>jcode.pl</b></font> というモジュールにそのあたりの処理を任せます。
</p>

<p class="scriptdisp">
			　　# S-JISコード変換<br />
			　　&amp;jcode'convert(*value, &quot;sjis&quot;, &quot;&quot;, &quot;z&quot;);
			<br />
</p>

<p>
この部分は、説明が難しくなるので、日本語を使う場合には、これが必要だ、、、と覚えておいてもらえばOKだと思います。
</p>

<h3>不要なデータの除去 - エスケープ処理</h3>
<p>
あと、これは後ほどセキュリティのところで別途とりあげようと思うのですが、入力されたデータを処理に移す前に加工する必要があります。プログラム中に不特定多数からデータ入力を許すわけですから、そのデータをチェックする必要があるのです。データの中には、改行コード等が入っていることもあり（カット＆ペーストで入力した場合など）、それが入力されると、処理がうまくいかないこともありえます。よって、ここでは、「<font color="red"><b>\r</b></font>」といった改行コードを無効にする処理をしています。また、空白は「+」とエンコードされてしまうので、これも通常のスペースとなるように戻す処理をしています。
</p>

<p class="scriptdisp">
			　　　$value =~ s/\r//g;<br />
			　　　$value =~ s/\n//g;<br />
			　　　$value =~ tr/+/ /;
			<br />
</p>

<p>
それ以外にも入力を避けたほうがいい文字はたくさんあります。これを「エスケープする」というのですが、その理由等についてはかなり奥が深く、ここで簡単に説明するには重要すぎるトピックなので、別途説明したいと思います。
（ちなみに「<a href="keiji03.htm">掲示板作成：データのサニタイズ</a>」でも取り上げています。）
</p>

<p>
以上の処理をまとめたソースは次のようになります。
</p>

<p class="scriptdisp">
			01: if ($ENV{'REQUEST_METHOD'} eq "POST") {<br />
			02: 　　read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});<br />
			03: } else {<br />
			04: 　　$buffer = $ENV{'QUERY_STRING'};<br />
			05: }<br />
			06:<br />
			07:<br />
			08: foreach (split(/&amp;/, $buffer)) {<br />
			09: 　　($keyword, $value) = split(/=/);<br />
			10: 　　$value =~ tr/+/ /;<br />
			11: 　　$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(&quot;C&quot;, hex($1))/eg;<br />
			12: 　　<br />
			13: 　　# S-JISコード変換<br />
			14: 　　&amp;jcode'convert(*value, &quot;sjis&quot;, &quot;&quot;, &quot;z&quot;);<br />
			15: <br />
			16: 　　$value =~ s/\r//g;<br />
			17: 　　$value =~ s/\n//g;<br />
			18: <br />
			19: 　　$FORM{$keyword} = $value;<br />
			20: }
			<br />
</p>

<p>
これで、入力されたデータに関する処理は以上なのですが、これだけ見ても何がどうなっているか理解できないかもしれませんので、次回で実際に簡単なプログラムを使って解説してみたいと思います。
</p>
<a href="web13.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web15.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/01/29 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 受け取ったデータの処理</div>
]]>
   </content>
</entry>
<entry>
   <title>プログラムにデータを引き渡す方法</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web13.html" />
   <id>tag:www.imymode.com,2008://1.34</id>
   
   <published>2008-01-25T02:32:10Z</published>
   <updated>2008-02-26T05:10:14Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; データの受け渡し データの受け渡...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; データの受け渡し</div>
<a href="web12.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web14.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>データの受け渡し方（データ入力の方法）</h2>
<p>
これまでは、時間によるメッセージの変化やカウンターといった、わりとサーバー側で一方的に作成される内容のプログラムを見てきました。いわゆる出力というものです。
</p>

<p>
しかし、いろんなプログラムを作っていくときには利用者側でいろいろとコントロールしたいことも多くなってくると思います。掲示板に文字を書き込むこともそうですし、プルダウンメニューとかで指定した条件で検索をしたりです。
</p>

<p>
このように、利用者側からサーバー（プログラム）に対して何か入力をさせるためには、どのようにしたらいいのでしょうか？
</p>

<p>
主な方法としては、二通りあります。
</p>

<h3>GETを使ってデータを送信</h3>
<p>
ひとつは「GET」という方法です。このGETという方法は、ブラウザから普通にHTMLの文書を要求するときと同じ方法になります。同じ？とは、普通URLいわゆるアドレスで「<font color="#0000ff">http://ww......</font>」と呼び出しますよね？この方法です。
</p>

<p>
入力したいプログラムが「<b>test.cgi</b>」だとすると、その後ろに「<b>test.cgi<font color="#ff0000">?</font><font color="#0000ff">happy</font></b>」とすることで、プログラム自体に「<font color="#ff0000">？</font>」以降の文字列を送り込むことができます。
</p>

<p>
あちこちの掲示板やサーチエンジンのリンクボタンのURLを注意してみてください。「<font color="#0000ff">http://www.xxxxxx.com/bbs.cgi?mode=next&amp;num=12....</font>」というのを見たことはないですか？これがまさにそうなんです。
</p>

<p>
すごく単純ですよね。これがWebサーバーの中では、<b>QueryStrings</b> という環境変数に格納されて、プログラムの中で <b>QueryStrings</b>の中身を参照すると、「？」以下の文字を読み出すことができる、という仕組みになっているようです。
</p>

<p>
当然URL形式になるので、ここに日本語を書き込むと、文字化けしたようなデータに変換されて送信されます。サーチエンジンで検索したすぐあとのアドレスバーに「<font color="#ff0000">%82%A0%82%A2%82%DC%82%A2...</font>」とかって表示されていて、「なんだろう？」とか思ったことはないですか。あれが、変換された日本語などの表示なんです。
</p>

<h3>POSTを使ってデータを送信</h3>
<p>
もうひとつ方法があります。
<br />
「POST」と呼ばれる方法です。一番最初の回で<a href="web04.html">ブラウザはHTMLソース以外にヘッダーという情報を受け取っている</a>という話をしたことを覚えているでしょうか？このような情報は受け取るときだけではなく、送信するときも同じように見えない情報としてサーバーに送信されています。この見えない場所にデータを埋め込んで送信する方法です。
</p>

<p>
見えないのに、どうやって送信するかということですが、方法はすごく見慣れた方法で行います。
</p>

<p>
いわゆるフォームというのを使ってします。「&lt;form action=&quot;&quot; method=&quot;&quot;&gt;」というタグですね。ここの「method」のところに「<font color="#0000ff">method=&quot;post&quot;</font>」と送信方法を指定することで、POSTとしてフォームで入力された内容がサーバーに向けて送信されているのです。
</p>

<p class="scriptdisp">
			&lt;form action=&quot;http://.....&quot; method=&quot;<b>post</b>&quot;&gt;<br />
			　&lt;input type=&quot;&quot;&gt;......<br />
			<br />
			　ここのインプットタグの内容がプログラムに入力される<br />
			<br />

			　&lt;/form&gt;<br />
</p>

<p>
じゃあ、「method=""」のところに「GET」って入れたらどうなるの？って思いませんか。
ご推測のとおり、フォームの情報がURLになって送信されるのです。大手のサーチエンジンなどは、ほとんど「検索」ボタンのフォーム部分が「method="get"」となっているので、検索したあとは、アドレスのところに変な文字が表示されるんですよね。
</p>

<p>
ただ、「POST」と「GET」、どちらの方法を使うべきかは、その目的にもよりますが、一般的に「POST」を使ったほうが安全性が高くなるといわれています。その理由は、「GET」で送られた内容はURLとして送信されるので、目に付きやすいし経由するサーバーのログに残る、「POST」は普通なら見えないような形で送信されるしログとしても残らないということらしいです。
</p>

<p>
また、「GET」だと、ブラウザ（クライアント）側に履歴として残ったりすることもありますし、URLでプログラムに引数を渡すことが可能なので、いたずらされやすいという点もあると思います。
ただ、「GET」にも別の利点があり（これは後述します。）、どちらを使うかは場合に応じてということですね。
</p>

]]>
      <![CDATA[<h2>プログラムではどのように入力を実装するか？</h2>
<p>
では、実際にどのようにデータを取り込むかを考えてみたいと思います。
</p>

<p>
さきほどプログラムの「？」以下が送信されると書きましたが、実際フォームなどでどのようなデータが送信されているかをみてみるために、下のような簡単なプログラムを作って見ました。
</p>

<p>
これで、フォームの各項目を入力して「Submit」ボタンを押したときに、どのようにデータが送信されているかがわかります。
</p>

<p>
<table cellspacing="0" cellpadding="10" border="0">
	<tr>
		<td>
		<b>POSTの場合</b>
		</td>
		<td>
		<b>GETの場合</b>
		</td>
	</tr>
	<tr>
		<td>
		<form action="./scripts/decode.cgi" method="POST" target="_blank">
		１つ目（name1）：<input type="text" name="name1" value="値１" maxlength="10" size="5"><br>
		２つ目（name2）：<input type="text" name="name2" value="値２" maxlength="10" size="5"><br>
		３つ目（name3）：<input type="text" name="name3" value="値３" maxlength="10" size="5"><br>
		<input type="submit" value="Submit(別窓)">
		</form>
		</td>
		<td>
		<form action="./scripts/decode.cgi" method="GET" target="_blank">
		１つ目（name1）：<input type="text" name="name1" value="値１" maxlength="10" size="5"><br>
		２つ目（name2）：<input type="text" name="name2" value="値２" maxlength="10" size="5"><br>
		３つ目（name3）：<input type="text" name="name3" value="値３" maxlength="10" size="5"><br>
		<input type="submit" value="Submit(別窓)">
		</form>
		</td>
	</tr>
</table>
</p>

<p>
よく見ると、「<font color="#0000ff">name1=abc&amp;name2=cde&amp;......</font>」となっています。フォームの名前である項目名とその値がイコールでペアになって送信されているのがわかりますでしょうか？しかもそれぞれが＆でつながっています。
</p>

<p class="scriptdisp">
			　項目名１＝値１<font color="red"><b>＆</b></font>項目名２＝値２<font color="red"><b>＆</b></font>項目名３＝値３
			<br />
</p>

<p>
よって、これらのデータを処理するためにはそれぞれの値をばらばらに切り直して、プログラムの中で使いやすいように加工する必要があります。
</p>

<p>
全ての項目および値のペアは「<font color="red"><b>＆</b></font>」で区切られていますので、まずこれをそれぞれのペアごとに分解する必要があります。
</p>

<p>
また、バラバラにしたペアを変数として扱いやすいようにするために、それぞれの項目名を引数とするハッシュに取り込みます。(Perlでの常套手段です。)
</p>

<p>
では、実際に外部からデータを入力（取り込む）するためのプログラムの解説をしたいと思います。
</p>

<a href="web12.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web14.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2004/01/29 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; データの受け渡し</div>]]>
   </content>
</entry>
<entry>
   <title>ファイルロックのアルゴリズム</title>
   <link rel="alternate" type="text/html" href="http://www.imymode.com/lab/web12.html" />
   <id>tag:www.imymode.com,2008://1.33</id>
   
   <published>2008-01-25T02:19:51Z</published>
   <updated>2008-02-26T05:11:27Z</updated>
   
   <summary><![CDATA[トップ &gt; プログラミング研究 &gt; 排他のアルゴリズム 排他処理のた...]]></summary>
   <author>
      <name></name>
      
   </author>
         <category term="プログラミング研究" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.imymode.com/">
      <![CDATA[<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 排他のアルゴリズム</div>
<a href="web11.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="./">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web13.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>
<h2>排他処理のためのプログラム</h2>
<p>
共有するデータをMySQLといったようなDBMSで操作するときは、これらソフトが排他制御を行ってくれるので、割と簡単に排他の処理ができるらしいのですが、プロバイダーや無料のレンタルスペースだと、データベースソフトは使えないので、通常のテキストファイルをデータファイルとして、自分で排他制御する必要があります。（DBMSとの連携はまだ勉強中です・・）
</p>

<h3>ファイルロックのアルゴリズム</h3>
<p>
理屈は簡単です。自分が書き込みをしようと思ってファイルを開くときには、他の誰にもファイルを開かせない、それだけのことです。流れを書くと。
</p>

<p class="scriptdisp">
１．ファイルをロックして排他制御する。（これで、誰もファイルを開くことができない）<br />
２．ファイルを開いてデータを参照<br />
３．必要な処理を行う<br />
４．ファイルに処理後のデータを保存<br />
５．ファイルのロックを解除する。（誰でもアクセス可能な状態にする。）<br />
</p>

<p>
以上です。
</p>

<p>
これは、書き込みを行う場合だけに発生する問題ですので、読み込みしかしないデータには排他の処理は無意味です。
</p>

<p>
そこで、サンプルとして使ってきたカウンターのプログラム（Perl）ではどのような手法で排他を行うかを考えてみたいと思います。
</p>

<p>
Perlには「flock」というファイルの排他制御を行う関数があります。ただ、これはサーバーのOSに依存するので、使えない場合があります。と書かれていることが多いのですが、自分の経験上、使えないというサーバーを使ったことがありません。WindowsNT系でも使えたので、おそらく大丈夫だと思います。（Windows９X系は使えません。！）
</p>

<p>
いろんなCGI用Perlスクリプトを配布しているサイトでは、Symlinkなどを利用してファイルの排他（ロック）を行っているようですが、Symlinkなどは、もともとファイルの排他をするためのものではなく、アルゴリズム的にも不完全だという指摘も聞きます。個人的には、不完全な排他なら、しないほうがいいのでは・・・とも思ってます。
</p>

<h3>flockを使ったファイルロックの方法</h3>
<p>
flockを利用してファイルに排他をかけることを考えると、以下のようなプログラムになりそうです。前回行ったカウンターのプログラムに排他をかける例で示してみます。
</p>

<p class="scriptdisp">
		01: #!/usr/local/bin/perl<br />
		02: <br />
		03: <font color="#009900"># ロック用ファイルを作成</font><br />
		04: open(LOCK, "&gt;lock.temp");<br />
		05: <b>flock(LOCK,2);</b> <font color="#009900"># ロック用ファイルをロックする</font><br />
		06: <br />
		07: <font color="#009900"># count.datというファイルから現在のカウント数を読み込む</font><br />
		08: open (IN, &quot;count.dat&quot;);<br />
		09: $count=&lt;IN&gt;;<br />
		10: close(IN);<br />
		11: <br />
		12: <font color="#009900"># 現在のカウント数$countに１を追加</font><br />
		13: $count=$count+1;<br />
		14: <br />
		15: <font color="#009900"># １増加したカウントを<b>別の一次ファイルに保存</b></font><br />
		16: open (OUT, &quot;&gt;count.temp&quot;);<br />
		17: print OUT $count;<br />
		18: close(OUT);<br />
		19: <br />
		20: <font color="#009900"># 別の一次ファイルから本来のファイルに名前を変更</font><br />
		21: rename("count.temp","count.dat");<br />
		22: <br />
		23: <font color="#009900"># 最初に作ったロック用ファイルを削除</font><br />
		24: unlink("lock.temp");<br />
		25: <br />
		26: <font color="#009900"># ロックしたファイルを解除</font><br />
		27: flock(LOCK,8);<br />
		28: close(LOCK);<br />
		30: <br />
		31: <font color="#009900"># ここからHTMLでの表示</font><br />
		32: print &quot;Content-Type: text/html\n\n&quot;;<br />
		33: print &quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&lt;/head&gt;&quot;;<br />
		34: print &quot;&lt;body&gt;&quot;;<br />
		35: print &quot;あなたは $count 番目の訪問者です。&quot;;<br />
		36: print &quot;&lt;/body&gt;&lt;/html&gt;&quot;;<br />
		37: <br />
		38: __END__<br />
		<br />
		*左端の番号は便宜的に付けた行番号です。
</p>

<p>
どうでしょうか？これで排他がかかりました。
</p>

]]>
      <![CDATA[<h3>プログラムの解説</h3>
<p>
それでは、一部簡単にですが、解説したいと思います。４～５行目で、以前はなかったロックのための処理を行います。ここで、ちょっと「おや？」と思うのは、今カウンターとして変更したいファイルは「count.dat」なのに、どうしてわざわざ別のファイル「lock.temp」を作って、それをロックするのか、ということです。
</p>

<p class="scriptdisp">
		03: <font color="#009900"># ロック用ファイルを作成</font><br />
		04: open(LOCK, "&gt;lock.temp");<br />
		05: <b>flock(LOCK,2);</b> <font color="#009900"># ロック用ファイルをロックする</font><br /> 
</p>

<p>
上記のように別のファイルを利用するのは、変更をしたいファイルを直接ロックすることも可能なのですが、こうすると、ファイルを開いてロックをするまでの間に若干の時間的隙間ができてしまうので、その隙間の間にファイルを開くことが出来てしまうからです。
</p>

<p>
実際、自分のローカルマシンで短時間に直接ファイルをロックする方法で１０００回書き込みを行うプログラムを書いて、２つ同時に実行させてみました。その結果、本来なら１０００回のアクセスが２つ同時に実行されているので、カウンターは２０００になるべきなのですが、全く違う数字になっていました。
</p>

<p>
その後、上記のように別にロックファイルを作ってそちらをロックしてから、ファイルの書き込みを行う処理に変更して同じ実験をしたのですが、こちらは、２つのプログラムの処理終了後はカウンターはちゃんと２０００となっていました。
</p>

<p>
（この実験については、別の機会にここで公開します。ファイルロックは奥が深いことを思い知らされました・・・）
</p>

<p>
ということで、実験のように数秒間で１０００以上のアクセスがあることなどは、個人のページではまずないと思うのですが、別にロックファイルを作った方が正しく処理ができるということが理解できます。
</p>

<p>
それ以降は、前回書いたカウンタープログラムと同じ手順ですが、ここで、更に一点違う場所があります。普通なら、１増加させたデータを直接カウンター用のデータファイル「count.dat」に書き込むべきなのですが、これをあえて別の仮ファイル「count.temp」に書き出しています。（１６行をご覧ください。）
</p>

<p class="scriptdisp">
		15: <font color="#009900"># １増加したカウントを<b>別の一次ファイルに保存</b></font><br />
		16: open (OUT, &quot;&gt;<b>count.temp</b>&quot;);<br />
		17: print OUT $count;<br />
		18: close(OUT);<br />
		19: <br />
		20: <font color="#009900"># 別の一次ファイルから本来のファイルに名前を変更</font><br />
		21: <font color="#990000">rename("count.temp","count.dat");</font><br />
</p>

<p>
別のファイルに書き出した後に、２１行目で名前を変更させて、元のファイルにしています。こうする理由ですが、ファイルを書き込んでいる途中でシステムが強制終了等になると、ファイルが壊れてしまうため、それを防ぐ目的です。（この部分のアイディアは、ここのレンタルサーバーの技術情報からお借りしました。m(__)m）
</p>

<p>
最後に、ロックファイル用に作成した仮ファイルを削除して、ロックを解除して処理終了です。
</p>

<p class="scriptdisp">
		23: <font color="#009900"># 最初に作ったロック用ファイルを削除</font><br />
		24: unlink("lock.temp");<br />
		25: <br />
		26: <font color="#009900"># ロックしたファイルを解除</font><br />
		27: flock(LOCK,8);<br />
		28: close(LOCK);<br />
</p>

<p>
ただ、１７行目のロックの解除は「 close() 」がある場合は不要です。念のために書いています。
</p>

<h2>本当にロック（排他処理）は必要か？</h2>
</p>

<p>
最後に、ファイルのロックについていろいろと書きましたが、本当に排他の処理が必要か？という問いに関しては、少々疑問もあります。個人で作っているページのレベルなら排他処理をしなくても十分に耐えられるのかな・・・と思ってます。逆に、排他処理を行っていたにもかかわらず壊れてしまった、という経験もあります。
</p>

<h3>自分の経験を少しだけかくと・・・</h3>

<p>
アンケート集計のプログラムを書いたことがあります。２０人程度が５分ほどの間にWeb上でアンケートに答えて、その集計を行うというものです。これを９０日程度毎日繰り返したことがありましたが、排他処理なしで全く問題ありませんでした。たまたまかもしれませんが、これくらいの頻度で壊れることのないレベルです。日に５０～１００人程度のアクセスがある個人ページの掲示板くらいなら、排他処理はしなくてもOKなのかなぁ・・・とも思いますね。
</p>

<p>
正直、排他をかけた場合とかけない場合で、プログラム的にどの程度の負荷になるかはよくわかってませんが、下手な排他処理をかけるくらいなら、かけない方が壊れにくいのかなぁ、、、とも思いますね。ということで、前回「欠陥があります！」と書いておきながら矛盾しますが、ロックは時と場合に応じて・・・ということでしょうか？
</p>

<p>
商用サイトや、信頼性をかなり追求されるようなプログラムには必要でしょうが・・・というか、そういうサイトを作る場合は、そもそもDBMSなどのプログラムと連携させるべきでしょう。
</p>

<p>
ファイルロックは奥が深すぎて、最初に勉強・・・とおもって手がけるには大きすぎる課題でした。実験なども色々してみましたが、まとまりきっていないので、もう少しまとめてから公開したいと思います。m(__)m
</p>
<a href="web11.html">
<img src="img/back.gif" alt="一つ前にもどる" height="15" width="50" /></a>
<a href="index.html">
<img src="img/top.gif" alt="目次にもどる" height="15" width="50" /></a>
<a href="web13.html">
<img src="img/next.gif" alt="次のページへ" height="15" width="50" /></a>


	<div id="writedate">
	(作成2003/09/19 by あいまい)<br />
	</div>
<hr />
<div class="pankuzu"><a href="../">トップ</a> &gt; <a href="./">プログラミング研究</a> &gt; 排他のアルゴリズム</div>]]>
   </content>
</entry>

</feed>
