POTI-boardのエラーを減らすために htmltemplate.inc編

potiboard.phpに
ini_set( 'error_reporting', E_ALL );
を追加して、すべてのエラーを表示するように設定。
E_DEPRECATEDレベルのエラーが大量に発生しているのを確認しました。
POTI-boardで使っているhtmltemplate.incに問題があるようです。

POTI-board htmltemplate.inc php7 E_DEPRECATED
PHP: PHP 7.0.x で推奨されなくなる機能 - Manual

PHP 4 形式のコンストラクタ
非 static メソッドに対する static 呼び出し
将来のバージョンでは動作しなくなるので今のうちに警告…という事ですね。
PHP 4 形式のコンストラクタ (クラス名と同じ名前のメソッドを定義するもの) が非推奨
__construct() メソッドを実装していれば、この警告は発生しません。
該当する箇所は…。

POTI-board htmltemplate.inc php7 E_DEPRECATED
class StandardParser extends TemplateParser{
// function StandardParser(){
function __construct(){
class htmltemplate{
private $parser;
// the constructor
// private function htmltemplate(){
private function __construct(){
の2箇所でした。
static 宣言されていないメソッドに対する static 呼び出しが非推奨となりました。 将来的には削除される見込みです。
それなら…static 宣言すれば、という事で、

POTI-board htmltemplate.inc php7 E_DEPRECATED
public static function add($tag){
// This method is obsolete.Use addTag() instead.
$inst=&htmltemplate::getInstance();
$inst->parser->add($tag);
}
POTI-board htmltemplate.inc php7 E_DEPRECATED POTI-board htmltemplate.inc php7 E_DEPRECATED

左、htmltemplate.inc書き直し前、右、書き直し後。
とりあえず、エラーがでなくなるところまで何とか。
PHP 5からPHP 7へ移行する際に気を付けるべきポイント (1/4):CodeZine(コードジン)

staticメソッドとして宣言したメソッドをインスタンスメソッドとして実行するにはワーニングなどが表示されないようですが、こちらも良いコードとは言えませんので、もしそのようなコードがあればこの機会に対応することをおすすめします。

インスタンスを使っているのに静的というのはおかしいという事なのでしょうね…。
staticなプロパティの使いどころ - PHPで翻訳三昧

PHP5からは、static を指定したプロパティは
インスタンス化しなくてもアクセス出来るよう変わりました。

php5ではもっと簡単にわかりやすく書ける…みたいです。

GitHub - sakots/poti-kai: POTI-board, the oekaki BBSサ骨さんによるオープンソースプロジェクトです。
phpのプログラムを書き慣れている方なら、おそらくhtmltemplate.incの問題の箇所を修正できると思います…。

どこが問題なのか、コメント行にも書いておきましたのでよろしくお願いいたします。
これから、サ骨さんのところにアップします…。

POTI-boardのログファイルを解析するphp

phpでお絵かき掲示板の最新画像を表示: STP^3のphpで呼び出した画像を元に、POTI-boardのログファイルを開いて、その画像の該当スレッドへのリンクと、タイトル、作者名を呼び出すphpの改良版です。

運営しているお絵かき掲示板では、レスでお絵かきを許可する設定にしていないので、ここまでする必要は無かったのですが、レスでお絵かきを使っていても、正確に該当スレッドへのリンクになるようにしておきたかったので工夫してみました。

プログラムの最初の行にコメントアウトしたファイル名がならんでいますが、本来はphpで呼び出すところを手動で入力してみて期待した動作になるかどうかテストをしたあとです。

設置しているPOTI-boardによって、この画像ファイルのURLや番号は変わりますので、このプログラムをそのまま設置しても動作しません。
使う場合は、入れ替えるべき箇所を入れ替える必要があります。
<?php
//画像のパスとファイル名
$imgno = 'poti/src/OB1529126099132.png';
//$imgno = 'poti/src/OB1532687964328.png';
//$imgno = 'poti/src/OB1515724311525.png';
//$imgno = 'poti/src/OB1516791076735.png';
//$imgno = 'poti/src/1525238233707.png';
//13桁のUNIX timeにする
$imgno = substr($imgno, -17,-4);
$fp = fopen("poti/img.cgi", "r"); //ログファイルの場所
while ($line = fgets($fp)) {
//ログファイルの書式から変数を取得
list($no,$now,$name,$email,$sub,$com,$url,
$host,$pwd,$ext,$w,$h,$time,$chk,$ptime,$fcolor) = explode(",", $line);
//KASIRAで指定した文字列を取り除く
//OBを取って13桁のUNIX timeにする
// $time = ltrim($time, 'OB');
//後ろから13桁のほうが確実なので書き直した
$time = substr($time, -13);
//取得したファイル名の
//13桁のUNIX time
//と$timeが同じならスレッドの番号は$no?
if ($time == $imgno){
$resno = $no;
break;
}
}
//レス画像かもしれないので、tree.logを見に行く
fclose($fp);
$fp = fopen("poti/tree.log", "r"); //ログファイルの場所
while ($line = fgets($fp)) {
//ログファイルの書式から変数を取得
$tree = explode(",", $line);//コンマ区切り形式のログの解析
$i=0;
$a=mb_substr_count("$line", ",")+1; //レスの数
//コンマ区切りなのでコンマの数+1。
while ($i < $a) {//0からレスの数までループ
if(rtrim($tree[$i], "\n")==$resno){
$resno=rtrim($tree[0], "\n");//スレッドの番号は$tree[0]
$count_end=true;//カウント終了
break;
}
if($count_end){break;}//レス先が見つかったのでbreak
echo "$i</br>";//確認用、実際には使わない。
$i++;
}
}

fclose($fp);
//掲示板のレス送信画面にリンク
echo '<a href="poti/potiboard.php?res='.$resno.'">掲示板</a></br>';
//タイトルを表示
echo "$sub</br>";
//投稿者名を表示
echo "$name</br>";
?>
なんども、無限ループになって青ざめましたが、なんとかここまで。レスの数だけループして番号を探すようにしたので、無駄にループする事がなく、またループの数が足りないという事もおそらく起きない…と思います。
$i=0;
$a=mb_substr_count("$line", ",")+1; //レスの数
//コンマ区切りなのでコンマの数+1。
while ($i < $a) {//0からレスの数までループ

何度も失敗しながらやっとここまでたどり付いた問題の箇所。
ループ文の中でループしているので、ループの条件を明確にしないと無限ループになりかねない、簡単そうでおそろしい箇所でした。

お絵かき掲示板のログ処理 php

テストプログラムなので、実行結果はあじけないこんな感じの画面です。
縦にならんでいる数字は、tree.logを読み込んだ回数です。ここが1とか2とか3ならサーバにそれほど負荷がかからないと思いますが、1000とか5000になると負荷がかかりすぎてプログラムが終了したり、高負荷になってサーバの制限がかかるかもしれません。
間近の画像を呼び出しているだけなら、それほど高い負荷にはならないはずですが、管理画面でリソースのチェックをして大丈夫かどうか確認したほうがいいのかもしれません。

プログラムを書ける人なら、こんなサンプルプログラムは必要ないのかもしれないし、書けない人には意味がわからないかもしれない。
さらにPOTI-boardのログを別のphpで使うプログラムなので、絵板を設置をするだけなら関係ない。
そんな、お絵かき掲示板をいくつも設置しているサイトのトップページに使う事を想定したプログラムですが、せっかく書いたので、サーバから消す前にブログにまとめておこうと思いました。

お絵かき掲示板はこちら。

javaScriptでURIエンコードしてaタグのテキストリンクを作る

お絵かき掲示板にツイートボタンをつけました。
アイキャッチ画像が投稿したイラストになるのは、今のところPOTI-boardだけで、その他の掲示板は、固定されたOGPイメージの表示になりますが、お絵かき掲示板の個別スレッドのリンクを観てもらう事はできます。

以下は、お絵かき掲示板にツイートボタンを設置するために試行錯誤した記録です。ツイートボタンのカスタマイズ方法を探している方はこんな記事を読む暇があったら
ツイートボタンのカスタマイズまとめ。 - freefielder.jp
にいますぐ移動する事をおすすめします。(ダメじゃん
twitterのツイートボタンを作るためのリンクshareとintent/tweet

ツイートボタンをaタグで作成するための基本的な情報…なのですが、URIエンコード済みである事が前提なので、テキストがShiftjisだと文字化けします。

urlの途中に、&が入っていると正しく動作しません。Bracketsの右クリック拡張のURIエンコードを使えば対応できる場合もありますが…。

また、人から見るとURIエンコードされたURLは、文字化けした文字列になるので可読性がよくありません。
seesaaブログに「twitterにつぶやくボタン」を簡単に設置する方法 | kira-ism
URIエンコードができて、aタグでリンク。文字化けしないしURLに&が入っていてもURIエンコードされているので機能します。
<a href="javascript:window.location='https://twitter.com/intent/tweet?status='+encodeURIComponent('No.$LOGNO $TITLE by $NAME #お絵かき掲示板')+' '+encodeURIComponent('https://pbbs.sakura.ne.jp/cgi/relm/relm.cgi?mode=res&no=$LOGNO')+' (via @satopian)';" onclick="window.open(this.href, 'relmtweet$LOGNO', 'width=650, height=470, personalbar=0, toolbar=0, scrollbars=1, sizable=1'); return false;" rel="nofollow" class="twitter-link">
<span class="icon-twitter"></span>tweet</a>
ところが…ブラウザ側の問題なのか
href属性値にスクリプトは書けません(といっておく)
という事なのか、IE11とSafariでは動作しない事がわかりました。

ツイートボタンのカスタマイズ Javascript

javascript:window.locationで始まるリンクは動作しない?
ChromeとFirefoxでは動作するので、もしかするとレガシーなブラウザでは動作しないだけなのかもしれないのですが…。

URIエンコードをして、それをaタグのリンクにするには…。

URIエンコードはできるか?
できる。
それを文字列とつなげたら?
動かない。

文字列と変数を一緒に書く方法がわからなかったので、文字列も変数にして、変数+変数+変数のようにしてみました。
<script>
tweetmessage=encodeURIComponent('No.$LOGNO $TITLE by $NAME #お絵かき掲示板');
tweeturl=encodeURIComponent('https://pbbs.sakura.ne.jp/cgi/relm/relm.cgi?mode=res&no=$LOGNO');

//リンクのタグ
twlink1="<a target=\"_blank\" href=\"https://twitter.com/share?text=";
twlink2="&url=";
twlink3="&\""
twlink4="<span class=\"icon-twitter\"></span>tweet</a>"
tweettags=twlink1+tweetmessage+twlink2+tweeturl+twlink3+twlink4;

document.write(tweettags);
</script>

ツイートボタンのカスタマイズ Javascript

やった…動いた…と思ったのですが…。

ツイートボタンのカスタマイズ Javascript

左から1番めのようになりました。
twitterの鳥アイコンが2つならんでしまいます。

ツイートボタンのカスタマイズ Javascript

デベロッパーツールで問題の箇所を確認してみたりもしたのですが…。
なぜtwitterのアイコンが二重になるのか、さっぱり…。
<script>
(function(){
var url = encodeURIComponent('https://pbbs.sakura.ne.jp/cgi/relm/relm.cgi?mode=res&no=$LOGNO'); //ページURL。一応エンコード
var title = encodeURIComponent('No.$LOGNO $TITLE by $NAME #お絵かき掲示板'); //ページタイトル。同上。
document.write( '<a target="_blank" href="https://twitter.com/intent/tweet?&text=' + title + '&url=' + url + '"><span class="icon-twitter"></span>tweet</a> <a target="_blank" class="fb btn" href="http://www.facebook.com/share.php?u=' + url + '"><span class="icon-facebook2"></span>share</a>' );
})();
</script>

JavaScriptを使った原始的な方法ならばこんな感じ。ボタンを表示したい場所に以下のコードを書きます。を参考にして、書き換えたものですが99%コピペですね…。

functionとdocument.writeを組み合わせたらいいのかな…となんとなく思ってはいたのですが、そのものズバリの答え…でした。

Chrome、Firefox、IE11で動作する事を確認しました。
javaScriptが実行された結果HTMLに出力されるのはaタグのテキストリンクなので、facebookのシェアボタンにも使ってみました。

ツイートボタンのカスタマイズ Javascript

facebookのシェアのリンクも動作しているみたいです…。みたい…というのはfacebookのアカウントが無いので、おそらく動くはずの書き方をしただけだからです…。

ツイートボタンを設置したお絵かき掲示板はこちら。