カウンター

  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング

今回は、カウンターを表示します。

 

ホームページにある、
「あなたは○○番目の訪問者です」
というものです。

 

といっても、最近あまり見ないですね。

 

また、
「ノーマル」「黒ボックス」「デジタル」
をそれぞれ指定すると、
画像表示が変わります。

 

こちらをクリックしてください。

index.cfm

<cfinclude template="define.cfm">
<cfinclude template="header.cfm">
<cfinclude template="counter.cfm">
<!---解説
    counter.cfmファイルを利用しています。
    今回の処理の中心となるファイルです。
--->

<cfinclude template="disp1.cfm">
<cfinclude template="disp2.cfm">
<cfinclude template="footer.cfm">

define.cfm

<cfset title="カウンター">

<cfset keta=6>
<!---解説
    カウンター表示の桁数を設定しています。
--->

<cfset img_type=arrayNew(1)>
<!---解説
    arrayNew()で配列を作成します。
    3次元までの配列が可能です。
    今回は1次元です。
--->

<cfset img_type[1]="ノーマル">
<cfset img_type[2]="黒ボックス">
<cfset img_type[3]="デジタル">

<cfif isDefined("url.type")>

    <cfcookie name="type" value="#url.type#">
    <!---解説
        cfcookieタグでクッキー変数typeを設定します。
    --->

</cfif>

<cfparam name="cookie.type" default="1">
<!---解説
    cfparamタグはnameで指定した変数が存在しない時、
    defaultで指定した値を設定します。

    初めてプログラムを実行した時は
    cookie.type変数が存在していないので、
    1がセットされます。
--->

<cfset ftype="#cookie.type#">

header.cfm

<cfoutput>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <title>#title#</title>
</head>

<body>
■#title#<br><br>
現在の表示画像:<b>#img_type[ftype]#</b><br>
<br>
以下を選択すると画像が変わります。<br>

<cfloop index="i" from="1" to="#arrayLen(img_type)#">
・<a href="index.cfm?type=#i#">#img_type[i]#</a><br>
</cfloop>
<!---解説
    arrayLen関数で、配列の個数を求めます。
    今回は3つです。
--->

<hr>
</cfoutput>

counter.cfm

<cflock name="counter" timeout="100">
<!---解説
    cflockタグで排他制御します。
    ネットワークでの処理では排他制御は重要です。

    マニュアルでcflockについて見てみると、

    「ColdFusion Serverは、1度に複数のページリクエストを処理できる
    マルチスレッドWebアプリケーションサーバです。」

    とあります。また注意として、

    「ファイル操作連想配列をcflockで囲むとファイルが開き、
    他のアプリケーションやColdFusionタグを使用して
    書き込みが実行されるため、
    ファイルの更新に失敗することはありません。」

    とありました。

    ようするに、今回のプログラムでcflockタグを使用しなかったら、
    1度に複数のページリクエストがあるかもしれないので、
    カウンタ用のファイルは壊れるかもしれません。

    cflockタグの使用によって同時処理はないので、
    ファイルが壊れることはありません。


    nameはlock名称です。これを元に処理を待ちます。
    アプリケーションに対してユニークにしてください。

    timeoutは、ロックを得るときまでの最大時間を秒単位に指定します。
    今回はロック内の処理をするまで最大100秒待ちます。
--->

    <cfset fname="#ExpandPath('counter.txt')#">
    <!---解説
        ExpandPath関数で、指定した相対パスを絶対パスで返します。
        この関数を使うことにより、以下の利点が考えられます。

        1.絶対パスの穏便
            わざわざ物理的な指定、例えば「c:\hoge\」などを
            プログラム内で書く必要がありません。
            このことは、プログラムを見てマシンのディレクトリ構成が
            わからないというセキュリティ上の利点もあります。

        2.アプリケーションの柔軟な対応
            例えば、今回のプログラムを別のディレクトリに移動しても、
            プログラム内容を変更することなく動作させることができます。
    --->

    <cffile action="read" file="#fname#" variable="cnt">
    <!---解説
        cffileタグのreadアクションにより、ファイル内容を読み込みます。
        ファイル名は絶対パス名で指定します。
        今回の場合は、読み込んだファイル内容をcnt変数にセットします。
    --->

    <cfset cnt=cnt+1>
    <!---解説
        cnt変数を1、カウントアップしています。
    --->

    <cffile action="write" file="#fname#" output="#cnt#" addnewline="No">
    <!---解説
        cffileタグのwriteアクションにより、ファイルを書き出します。
        ファイル名は絶対パス名で指定します。
        outputに書き出す内容をセットします。
        addnewline="No"で改行をセットしません。
    --->

</cflock>

<cfset cnt=RepeatString("0",keta-len(cnt)) & cnt>
<!---解説
    指定した桁数の、数字の文字列に編集します。

    今回のRepeatStringの設定により、
    指定桁からカウンターの桁数を差し引いた分の桁の
    0の文字列が作られます。

    &により文字列同士の結合を行います。
--->

disp2.cfm

<cfoutput>
■画像表示<br>

<cfloop index="i" from="1" to="#len(cnt)#">
<!---解説
    cntの桁数分、繰り返します。
--->

    <cfset gfile="img/#ftype#/" & mid(cnt,i,1) & ".gif">
    <!---解説
        画像ファイル名を指定します。

        例えば「ノーマル」を指定、数字が0の場合、
        img/1/0.gif
        という文字列が作られます。

        あらかじめimgディレクトリ内に1,2,3ディレクトリを作り、
        その中に0から9までのgifファイルを用意しておきます。
    --->

    <img src="#gfile#">
</cfloop>
</cfoutput>
  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング

この記事に関連する記事一覧

最近の投稿
カテゴリー
タグ
アーカイブ
プロフィール