続きを閉じる
▼phpとは
こまったときのウィキ先生にお尋ねしますと、
PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー)とは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。
とのお返事をいただきましたヽ(´・ω・`)ノ
わかりにくいかもしれませんねぇ、簡単に説明しましょう。
HP作ってる人なら大体の人が思うことじゃないでしょうか。
「HTMLで条件分岐とか変数使えればなー」
と。
そこで登場するのがjavascriptさん、だいたいなら彼だけで事足りるのですが、それでも限界があって・・・。
js(javascript)ではページを超えた設定はできません。
つまり引数を渡してリンクを飛ばす・・・という芸当はできないわけですし、外部ファイルから情報をもらうこともできません。
そこででてきたのがphp、これなら上の2つの芸当も簡単にできます。
よく見るんじゃないでしょうか。 少なくてもfc2のブログをやっている人なら、管理画面のurlみてみてください。
http://blog**.fc2.com/control.php
?mode=editor&process=load&...
これは過去記事の管理のurlなんですが、赤字のところです。
しっかりと引数を渡しています。
これは$_GET["***"]で得ることができて・・・なんていう話は今はしないでおきましょうか。
興味があったらぐーぐる先生に教えてもらってください。
phpの仕組みを説明しましょう。
htmlやjavascriptはウェブブラウザが扱える言語なんです。
一方phpはウェブブラウザでは扱えない。 なので困ったブラウザ君はどうするかというと、サーバー先生に翻訳を依頼するわけです。
やさしいサーバー先生なら、ブラウザでもわかるhtmlタグに翻訳して返してくれるわけです。
一方性格の悪いサーバー先公(fc2とかyahooとかry)は翻訳してくれません。
ここからは翻訳してもらえたとして進めます。
htmlにしてもらえたなら、もうブラウザ君にとってはお手の物で、ちゃっちゃと処理できます。
ただし、「レポート(htmlソース)を見せてみろ」というと、当然翻訳版しか見せてくれません、というより見せれません。 やり方知らないんですから(

△とぴっくりーだー
まだphpつかえるサーバーのアカウントとってないので画像になってしまいますけど、今回はこれの説明なわけですが、これのhtmlソースを見てみると・・・。
htmlソースを見ただけではphpを使っているのかすらわからないまで証拠隠滅されていますね。
その点では他人のをパクれないという欠点(製作者側からしたら利点)があるわけです。
▼本題:トピックリーダー
では実際にほんもののソースを見ていきましょうか。
作り方、ってよりむしろ素材っぽい感じがありますけど・・・。
というより、わたしもまだphpははじめたばっかりなので教えられるほどの知識はないのですm(_ _)m
なので、言っちゃうと「無理やり作った」といわざるを得ないプログラムです。
正直うまいひとならもっと効率よく造れると思うのですが、多分検索してもこんな1つのサイトに特化したリーダーの素材なんてないでしょうから、下手でも乗せておきます。
php使えるサーバーできのこのHPとか作ってる人がいたら参考にしてもらえれば・・・^p^
途中にあるリンクはしたにある文法説明へのリンクです。
<?php
//きのこ公式のお知らせのページを開いて読み込み、そのファイルハンドルを$purlという変数(phpでは$が変数)に代入
$purl =
fopen("http://maplestory.nexon.co.jp/web_module/skins/MapleStory/board_list.asp?strboardid=maplestorynews", "r");
//$dataと$dateという2つの変数を配列と定義
$data =
array();
$date = array();
//$strという変数に、きのこ公式のhtmlを1行ずつ代入、それの繰り返し (*1)
while ($str =
fgets($purl)) {
//この1行に<td width="438">という文字が入っていたら$data配列に追加
if (
strpos($str, "<td width=
\"438\">") != FALSE) {
array_push($data, $str); }
//この1行にwidth="61"という文字が入っているなら$date配列に追加
if (strpos($str, "width=\"61\"") != FALSE) { array_push($date, $str); }
//$dataに4つ超のデータ(つまり5以上)が入っていればループ終了
if (
count($data) > 4) {
break; }
}
//きのこのお知らせページを閉じる
fclose($purl);
//現在の時間を拾得
$now =
getdate();
//$iを0から$date配列の長さより小さい範囲で(この場合0〜4)動かし、ループ (*2)
for ($i = 0; $i < count($date); $i++) {
//「>」という字の次から10文字を$dstrに代入
$dstr =
substr($date[$i], strpos($date[$i], ">") + 1, 10);
//$dstrの前から4文字を$yearに代入
$year = substr($dstr, 0, 4);
//$dstrの5文字目から2文字分を$monthに代入
$month = substr($dstr, 5, 2);
//$dstrの8文字目から2文字分を$dayに代入
$day = substr($dstr, 8, 2);
//この行の日付のタイムスタンプを拾得
$tsp =
mktime($now["hours"], $now["minutes"], $now["seconds"], $month, $day, $year);
//$expに$monthの1文字目を代入
$exp = substr($month, 0, 1);
//$expが0なら月の十の位の0を白色にして非表示もどきに
if ($exp == 0) { $month = "<font color=\"#ffffff\">0</font>" . substr($month, 1, 1); }
//$dstrの8文字目から2文字分を$dayに代入
$exp = substr($day, 0, 1);
//$expが0なら日の十の位の0を白色にして非表示もどきに
if ($exp == 0) { $day = "<font color=\"#ffffff\">0</font>" . substr($day, 1, 1); }
//その行の更新日時が今から3日以内なら
if (($now[0] - $tsp) <= (3*24*60*60)) {
//全体を赤文字に
$time[$i] = "<font color=\"#ff0000\">{$year}年{$month}月{$day}日</font>";
} else {
//そうでないならそのまま代入
$time[$i] = "{$year}年{$month}月{$day}日";
}
}
//$iを0から$date配列の長さより小さい範囲で(この場合0〜4)動かし、ループ (*3)
for ($i = 0; $i < count($data); $i++) {
//icn_noticeという文字列が含まれていれば
if (strpos($data[$i], "icn_notice") != FALSE) {
//$typに"お知らせ"を代入
$typ = "<font color=\"#00BFFF\">お知らせ</font>";
//icn_eventというry 以下同じなので省略
} elseif (strpos($data[$i], "icn_event") != FALSE) {
$typ = "<font color=\"#F4A460\">イベント</font>";
} elseif (strpos($data[$i], "icn_update") != FALSE) {
$typ = "<font color=\"#EE82EE\">アップデート</font>";
} elseif (strpos($data[$i], "icn_maintenance") != FALSE) {
$typ = "<font color=\"#90EE90\">メンテナンス</font>";
} else {
$typ = "不明";
}
//$xxに$i行目のデータの「href="」からを代入
$xx = substr($data[$i], strpos($data[$i], "href=\""));
//「"」がある場所で文字列を区切り、配列として$yyに代入
$yy =
split('"', $xx);
//上で区切ったものの3番目の2文字目からを今度は"<"で区切る
$zz = split('<', substr($yy[2], 1));
//タイトルが半角60文字を超える場合(レイアウト的に2行になる場合)
if (
strlen($zz[0]) > 60) {
//タイトルを半角56文字目まで+「...」に変更
$zz[0] = substr($zz[0], 0, 56)."...";
}
//「時間 告知の種類:<a href="URL" tar...>タイトル</a>」を配列$retに追加
$ret[$i] = "{$time[$i]} {$typ}:<a href=\"{$yy[1]}\" target=\"_blank\">{$zz[0]}</a>";
}
//$iを0から$retの配列の長さより小さい範囲で(この場合0〜4)動かし、ループ
for ($i = 0; $i < count($ret); $i++) {
//$retの$i番目を書き出す 末尾に改行タグ<br>とソースの改行\n追加
echo "$ret[$i]<br>\n";
}
?>
☆文法
<?php
?>
phpプログラムの開始と終了を意味します。
fopen(読み込むファイル, モード)
fclose(ファイルハンドル)
fopen()でファイルを開きます。
モードは、"r"(読み込み)"w"(書き込み)"r+"(読み書き込み)です。
他にもありますけど、とりあえずはこのくらい知っていれば・・・。
fclose()でファイルを閉じます。
開いたものを閉じないとエラーになる可能性があるそうです。
ファイルハンドル(FH)というのは、fopen()の返り値($a = fopen()とやると$aがFH)です。
fgets(ファイルハンドル)
fopen()で開いたファイルを1行ずつ読み込みます。
ファイルの終端に達すると、FALSEを返します。
array()
配列をあらわします。
phpの配列には2種類あって、javascriptとかでおなじみの連番配列は、
$array = array(値1, 値2, ...) 、$array[0] = 値1 と定義できます。
もう片方は連想配列といい、
$array = array(キー1=>値1, キー2=>値2, ...)、$array[キー1] = 値1
となっています。
count(配列)
配列の長さを返します。 要するに配列に何個要素があるかです。
array_push(配列, 値)
配列の最後に値を挿入します。 連想配列の場合も連番になってしまいます。
while (条件) { 実行内容 }
プログラマーにはおなじみのwhileですね。
条件が真の間実行内容を繰り返すものです。
if (条件) { 真の場合の内容 } else { 偽の場合の内容 }
これまた定番なif構文。 そのまま条件分岐を表します。
ifとelseの間にelseif (条件)をはさんで、最初の条件は偽だけど2番目の条件は
真の場合の処理をいれたりもできます。
for (初期設定; 条件; 増分) { 実行内容 }
これもおなじみなfor構文。
初期設定をして、条件が真の間、増分をしながら繰り返すものです。
具体的には、初期設定に$i=0をいれて、増分に$i++($iを1だけ加算)、
そして条件「$iが○○以下」の間実行内容を繰り返すというのが一般的。
break
whileやforなどのループを無理やり抜けるときに使うものです。
strpos(文字列, 検索文字)
文字列に検索文字がはいっていたら、その検索文字の最初の字までの文字数を
返すものです。 検索文字がなかったらFALSEを返します。
substr(文字列, 開始位置[, 文字数])
文字列を開始位置で設定した位置から文字数分だけ切り取った値を返します。
文字数省略時は最後までです。
split(検索文字, 文字列)
検索文字があるごとに文字列を切って、配列にして返します。
javascriptにも同じのがありますね。
strlen(文字列)
文字列の字数を数えます。 半角字数でカウントするので、ひらがなや全角カタカナ、
漢字などは2文字でカウントされます。
getdate()
今の時間を連想配列で拾得します。
キーの値は、secondsで秒、minutesで分などで、0でタイムスタンプです。
※タイムスタンプ・・・1970年1月1日からの秒数
mktime(時, 分, 秒, 月, 日, 年)
日付データからタイムスタンプを計算して返します。
//
コメントアウトを表します。 その行だけ有効です。
\"
「"」をあらわします。
たとえば連想配列の時、$array["src="http""]なんてなると、"src="までで終わり、
後ろはなんなんだ、と解釈されるため、それを避けるために作られたもの。
上の場合は、$array["src=
\"http
\""]とします。
エスケープシーケンスと呼ばれる技法です。
echo 文字列
文字列をブラウザに書き出します。
一番単純なのになぜか一番最後^^;
☆解説
注釈1 (*1)
//$strという変数に、きのこ公式のhtmlを1行ずつ代入、それの繰り返し
while ($str = fgets($purl)) {
//この1行に<td width="438">という文字が入っていたら$data配列に追加
if (strpos($str, "<td width=\"438\">") != FALSE) { array_push($data, $str); }
//この1行にwidth="61"という文字が入っているなら$date配列に追加
if (strpos($str, "width=\"61\"") != FALSE) { array_push($date, $str); }
//$dataに4つ超のデータ(つまり5以上)が入っていればループ終了
if (count($data) > 4) { break; }
}
きのこのお知らせのページを1行ずつ読み込んでいきます。
そして、<td width="438">で始まる行は・・・、
<td width="438"><img src="http://static.nexon.co.jp/maplestory_3rd/home/icn_notice.gif" align="absmiddle"> <a href="board_content_list.asp?strboardid=maplestorynews&intidx=29402&intgotopage=1">接続障害解消のお知らせ</a> </td>
となっています。 つまり、<td width="438">は、

△きのこのお知らせページ
このテーブルの緑枠の部分の列のことを言っています。
幸いなことに、ねくそんは一番上だけにwidhを設定して他はしないという方法をとらず、
また他にwidh="438"の部分を作ったいなかったため、
こういうプログラムが作れたわけです。
他サイトのを作ろうとしている人なら、こういった何かしらの特徴、
特に企業物なら必ずあるはず(手動では限界があるから)なので、
そこを狙ってみると案外簡単に作れるでしょう。
<td width="438">がある行を読み込むと、$dataという配列に追加されます。
次の次の行を見てください。 この$dataという配列が5つの要素を持ったら
ループを強制終了するようになっています。
つまり、トピックを5つしか読み込まない、すなわち5行表示ということです。
なので、ここの数字を変えるといくつトピックを読み込むのか変えれます。
ちなみに、間にあるwidth="438"の意味ですけど、これは・・・
<td width="61" bgcolor="#93bedd" class="colorfff" align="center">2008.07.24</td>
こういう行がヒットするんです。 見てのとおり・・、

△この行!
ですよね。 つまり日付データをいただくわけです。
これは$date配列に格納します。
注釈2 (*2)
//$iを0から$date配列の長さより小さい範囲で(この場合0〜4)動かし、ループ
for ($i = 0; $i < count($date); $i++) {
//「>」という字の次から10文字を$dstrに代入
$dstr = substr($date[$i], strpos($date[$i], ">") + 1, 10);
//$dstrの前から4文字を$yearに代入
$year = substr($dstr, 0, 4);
//$dstrの5文字目から2文字分を$monthに代入
$month = substr($dstr, 5, 2);
//$dstrの8文字目から2文字分を$dayに代入
$day = substr($dstr, 8, 2);
//この行の日付のタイムスタンプを拾得
$tsp = mktime($now["hours"], $now["minutes"], $now["seconds"], $month, $day, $year);
//$expに$monthの1文字目を代入
$exp = substr($month, 0, 1);
//$expが0なら月の十の位の0を白色にして非表示もどきに
if ($exp == 0) { $month = "<font color=\"#ffffff\">0</font>" . substr($month, 1, 1); }
//$dstrの8文字目から2文字分を$dayに代入
$exp = substr($day, 0, 1);
//$expが0なら日の十の位の0を白色にして非表示もどきに
if ($exp == 0) { $day = "<font color=\"#ffffff\">0</font>" . substr($day, 1, 1); }
//その行の更新日時が今から3日以内なら
if (($now[0] - $tsp) <= (3*24*60*60)) {
//全体を赤文字に
$time[$i] = "<font color=\"#ff0000\">{$year}年{$month}月{$day}日</font>";
} else {
//そうでないならそのまま代入
$time[$i] = "{$year}年{$month}月{$day}日";
}
}
ここでは、まず$date配列を処理します。
トピックを5つもらったので、当然$dateも5つの要素を持つ配列のはずです。
しかし配列をすべて同時に処理することはできません。
なので、1つずつ動かすわけですが、ループ回数を変数に格納してループ処理
させてやれば1回定義するだけでどれだけ要素をもっていようがすべて処理できます。
なのでつかったのがfor構文。 ループ回数は$iのことです。
ここで$dateの正体を思い出してみましょう。
$dateは「width="438"」を含んだソースの行、すなわち・・・
<td width="61" bgcolor="#93bedd" class="colorfff" align="center">
2008.07.24</td>
こんなのが代入されているはずです。
そして今ほしいのは赤色の部分。 他はどうでもいい。
というわけで切り捨てます。
strpos($date[$i], ">")で赤文字の手前にある「>」までの字数、それに + 1すると
赤文字の位置ですね。 そこから10文字分切り取り、つまり赤文字全部です。
ネクソンは月日を0詰めで書いてくれていたので助かりました。笑
これで$dstrには赤文字の部分、「2008.07.24」が代入されています。
前から4文字、つまり「2008」を$yearに代入、5文字目から2文字分、
つまり「07」を$monthに、最後「24」を$dayに代入しています。
ここで急にタイムスタンプとかでてきてこんがらがりますねぇ。
だれでしょう、こんなわかりにくいプログラム組んだ人(
この説明は後に回しますね。
次に、先ほどは助かったとか書いた0詰めですが、いざ表示するとなると邪魔・・・。
ということで、今度は先が0かどうかを確かめます。
年にはやる必要がないので、月と日だけ。 これは注釈見ればわかるでしょう。
ちなみに、なんで白文字とかいうややこしいことしてるかというと、
ただ単に文字の長さをそろえたかっただけです><
最後に、オプションをつけたいと思います。
つまり、見ている現在から3日以内に更新された内容を赤文字表示して目立たせよう!
ということで、必要になるのが今の時間と更新時間。
しかし更新時間は見てわかるように、日と月が0詰めだった場合、もはや数字では
なくなっていて、とてもタイムスタンプ計算できる変数ではなくなっています。
なので先にタイムスタンプを計算してしまったわけです。
日付だけしか情報はないので、更新の時・分・秒は今の時間と同じものを使用。
今の時間(タイムスタンプ)は、この注釈の前の行で$nowに格納しました。
厳密にいうと$now[0]ですね。
ぁ、「文法説明なんて読み飛ばしたwww」って人のために補足しますね。
タイムスタンプ=1970年1月1日からの秒数のことです。
そして、タイムスタンプ単位、要するに秒単位での計算ですので、3日は・・・、
(3日×24時間×60分×60)秒です。
今のほうが更新時よりタイムスタンプは上なので、今から更新日を引いて、
その差が3日以内ならふらぐがたつわけです^^;
注釈3 (*3)
//$iを0から$date配列の長さより小さい範囲で(この場合0〜4)動かし、ループ
for ($i = 0; $i < count($data); $i++) {
//icn_noticeという文字列が含まれていれば
if (strpos($data[$i], "icn_notice") != FALSE) {
//$typに"お知らせ"を代入
$typ = "<font color=\"#00BFFF\">お知らせ</font>";
//icn_eventというry 以下同じなので省略
} elseif (strpos($data[$i], "icn_event") != FALSE) {
$typ = "<font color=\"#F4A460\">イベント</font>";
} elseif (strpos($data[$i], "icn_update") != FALSE) {
$typ = "<font color=\"#EE82EE\">アップデート</font>";
} elseif (strpos($data[$i], "icn_maintenance") != FALSE) {
$typ = "<font color=\"#90EE90\">メンテナンス</font>";
} else {
$typ = "不明";
}
//$xxに$i行目のデータの「href="」からを代入
$xx = substr($data[$i], strpos($data[$i], "href=\""));
//「"」がある場所で文字列を区切り、配列として$yyに代入
$yy = split('"', $xx);
//上で区切ったものの3番目の2文字目からを今度は"<"で区切る
$zz = split('<', substr($yy[2], 1));
//タイトルが半角60文字を超える場合(レイアウト的に2行になる場合)
if (strlen($zz[0]) > 60) {
//タイトルを半角56文字目まで+「...」に変更
$zz[0] = substr($zz[0], 0, 56)."...";
}
//「時間 告知の種類:<a href="URL" tar...>タイトル</a>」を配列$retに追加
$ret[$i] = "{$time[$i]} {$typ}:<a href=\"{$yy[1]}\" target=\"_blank\">{$zz[0]}</a>";
}
お次は$data配列をいじります。
さて$dataの正体は・・・、
<td width="438"><img src="http://static.nexon.co.jp/maplestory_3rd/home/
icn_notice.gif" align="absmiddle"> <a href="
board_content_list.asp?strboardid=maplestorynews&intidx=29402&intgotopage=1">
接続障害解消のお知らせ</a> </td>
こんなのでしたよね。 やけに長いです。汗
今回いただきたい情報に赤字をつけました。
一番最初、icn_notice.gif、これはなんぞや、といいますと・・・、

△これ!
のことです。 つまり告知の種類がわかります。
これは確認してみたところ4種類あり、
icn_notice.gif・・・
お知らせ
icn_event.gif・・・
イベント
icn_update.gif・・・
アップデート
icn_maintenance.gif・・・
メンテナンス
があるんです。
これで前半にやっていることはおわかりかなと。
strpos(文字列, 語句)は文字列に語句があった場合はその位置を返しますが、
なかった場合はFALSEを返す、つまりあったらFALSEは返ってこない、
そういう発想です。笑
次に、いらないものを切り飛ばしてわかりやすくしましょう。
ということで、href=の前までは切り飛ばし、
href="
board_content_list.asp?strboardid=maplestorynews&intidx=29402&intgotopage=1">
接続障害解消のお知らせ</a> </td>
と、こうなりました。
ここで便利なsplitの登場です。 spli(キー, 文字列)で、文字列にキーがあったら
そこで切っていって、配列にして返してくれるもの。
この場合は・・・、
「href=」 "
「
board_content_list.asp?strboardid=maplestorynews&intidx=29402&intgotopage=1」 "
「>
接続障害解消のお知らせ</a> </td>」
こうわかれますね。
見てのとおり、2番目に分かれたものは、そのままURLに使うことができます。
これで後は最後のタイトルだけです。
split('<', substr($yy[2], 1))ですから、今度は「<」で区切ることになります。
しかし、文字列にはsubstrがありますね。 yy[2]というのは3つ目にわけた、
「>
接続障害解消のお知らせ</a> </td>」
のことです。
プログラムやったことない人はこんがらがると思いますけど、配列は0からすたーとなので、
0に1つ目、1に2つ目、2に3つ目がはいってます。
substrは文字列をある位置から切りとるもの、1文字目ってなってますが前述のとおりで、
1というのはわれわれのいう2文字目にあたります。
なので、「
接続障害解消のお知らせ</a> </td>」を「<」で区切れ、ということ。
「
接続障害解消のお知らせ」 <
「/a> 」 <
「/td>」
こうなりますね。
これでめでたく必要なものがそろいました。
後は組み合わせるだけです。
が、もしタイトルが長すぎると2行になってしまう可能性があります。
サイトのレイアウトにもよりますけど、わたしの場合はタイトルが半角60文字超えると
2行になるので、超えた場合は「○○○...」と省略するようにしました。
ちなみに、半角字数というのは、「abcd」といった文字は1文字、「あいうえ」は2文字のカウント。
時間の文字列は注2で解説したようにして$timeという変数に
告知の種類は$typという変数に
urlは$yyの2番目の配列、つまり$yy[1]に
タイトルは$zzという配列の最初、つまり$zz[0]に
それぞれ格納されています。
後はこれを表示する文字列に合体すればいいので、
| 実行例: | 2008年07月24日 | | お知らせ | : | 接続障害解消のお知らせ |
| 完成例: | {$time[$i]} | | {$typ} | : | <a href=\"{$yy[1]}\" target=\"_blank\">{$zz[0]}</a> |
ちなみに、$timeが$time[$i]となっているのは、$timeも5行分の情報を持っている配列、
そして今やっているこの$dataの処理も5行分ある配列の処理で5回行われる、
そしてループ回数は$iですから、$time[$i]としてあげれば対応するというわけです。
この後は、これを5行分繰り返し表示して終了となります。
▼実際のphpファイルのソースは・・・?
疑問に思えた方はすばらしいです。
というのも、上のphpだと・・・、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
とか、
<meta http-equiv=Content-Type content="text/html; charset=Shift_JIS">
とかはどこから沸いてきた、という話になりますからね。笑
phpはhtml埋め込み型といいました。 ウィキ先生が。
phpファイルのソースの全体図は・・・、
<!DOCTYPE ....
<html><head>......</head>
<body>
<div ...>
<?php
・・・・・・
?>
</div>
</body></html>
こんな構造になっています。
ここがphpの利点でして、他にこんなこともできます。
<?php
if ($a==1) {
?>
<a href="morning">おはようございます</a>
<?php
} elseif ($a==2) {
?>
<a href="day">こんにちは</a>
<?php
} else {
?>
<a href="night">こんばんは</a>
<?php
}
?>
「動的に」とはこういうことをいう・・・のかなぁ?
よくわかんないです(ノ゚ロ゚)ノ⌒┻━┻
要するに、上で示したphpファイル全体ソースの図のようにしてファイルを作り(当然メモ帳でもおっけー)、名前を「***.php」にして保存して、phpが使えるサーバーにアップすれば、簡単な自作トピックローダーが使えますよ^^;
ほんとにトピックしか表示しないので、自サイトで使うときはインラインフレームでも使って表示してくださいな。
ちなみに、文法の上にあるphp部分の全体図のところ、コピペすればちゃんと説明部分はコメントアウトしてあるので動きますよ。笑
講座っぽくしながら、結局は素材っぽい感じですけど、一応"講座"のつもりなので、完全にコピペしようがご自由に使ってください。笑
著作表示とかもぜんぜんいらないです^^/
でも、気の利く人はphpのソースのした、</html>の下あたりにでも、HTMLのコメントアウト(<-- -->)使って影でこっそりリンクしてくれるとうれしいです。殴
トピックリーダー使いたい人ならソースを見てくれる・・・かもしれないから!