お絵かき掲示板交流サイトのSSL/TLS対応作業を行いました

お絵かき掲示板 SSLお絵かき掲示板 SSL

google Chrome。
左、保護されていません、右、保護された通信。

お絵かき掲示板 SSLお絵かき掲示板 SSL

Firefox。
左、この接続は安全ではありません、右、警告表示なし。

https;// なのに、 http:// の画像がまぎれこんでいると混在表示コンテンツになり、すりかえられた画像の可能性があるという警告がでますが、秀丸エディタのgrepして置換で処理。

アクセスログのための1pxの画像を、 http:// から、// に書き換えて、https:// でも、http:// でも対応できるようにしました。
何ページ分あっても、同じタグの書き換えなので、grepして置換すれば数秒で終わります。

さくらのブログはSSLに対応していませんが画像はhttps://でも呼び出す事ができるので、RSSからブログの画像を取得するphpを書き換えました。
<?php
//SSL対応 http:を取り除く
$image = $item->thumbnail;
$image = ltrim($image, "http:");
?>
PHP: ltrim - Manual

ltrim − 文字列の最初から空白 (もしくはその他の文字) を取り除く
ltrimで、画像のURLからhttp:を取り除きました。

何もかもスムーズにいく…と思ったのですが…。
TLS 1.0/1.1無効化のメンテナンスによる影響 – さくらのサポート情報

通信の安全性を確保するため、 「弊社レンタルサーバで運営されているお客様のウェブページ」
における「TLS1.0/1.1」による暗号化通信を無効化いたします。
.htaccessでリダイレクトをかけたところ、Mac OS10.6、Windows XPで投稿している方がアクセス不能に…。
リダイレクトをかけるのをやめました。

https://から、sを取ってもらい、http:// で掲示板を使ってもらう事に…。
でも、Windows7以降ならTLS1.2に対応したブラウザを使う事ができるから何も意識しなくても大丈夫…と思ったら、コメントの投稿時に「〜を待機しています」が長く続き「このページは動作していません」が頻発。

20回に一回の割合で画面がかたまってしまいました。
〜を待機していますが長時間続きエラーになる時は | 気軽にお絵かき | お絵かき掲示板交流サイト

セキュリティ対策ソフトの影響によりgoogle Chromeなどで、「pbbs.sakura.ne.jpを待機しています」という表示が長く続き、「このページは動作していません」というエラーになる事があります。
一部のSSLサイト(「https://」で始まるWebページ)が表示できない | ESETサポート情報
軽いから使っていたNOD32アンチウイルスが原因でした…。
「SSL/TLSプロトコルフィルタリング」機能からChromeを除外したところ、Pawooで頻発していたトゥートボタンを押した時に固まる事がある問題も解決しました。

他にもESETのセキュリティ対策ソフトを使っている方がいる筈ですから、設定の変更をお願いしなければならなくなってしまいました…。

そして、SSLにしたら、検索順位が下がって表示できなくなってしまったコンテンツ…。
いつかは元に戻るのでは?と思いながら何度も検索。

思っていたより労力が必要でした…。

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

BBSNoteから<center>を除去する

BBSNote8.0b19は、Perl5.12以上では動作しません。
つまり、今改造してもほとんどのサーバで動作しません。
さくらのレンタルサーバではPerl5.10が使えるので、とりあえずなんとかなっていますが…。
BBSNote後継のComet1.0をダウンロードしておくべきでした。
CometはPerlのバージョンがあがっても動作しているようです…。

そんなBBSNoteのメンテナンスを行いました。
<center>と、<div align="center">を取り除く作業…。
tableを完全に撤去するのは困難だったので、tableにCSSを適用してみたり<div class="hoge"> </div>で囲んでみたり…。
BBSNote8.0b19  center タグ除去作業BBSNote8.0b19 center タグ除去作業

tableにtext-align: centerを適用した箇所もありますが、あくまでもテキストの中央寄せのためで、tableそのものは、margin: 0 auto。左右のmarginを自動でというセンタリング。
divをセンタリングする時と同じ。

BBSNote8.0b19 center タグ除去作業BBSNote8.0b19 center タグ除去作業

text-align: centerを適用したくない箇所のテキストまでセンタリングされてしまったので、そのtableの中のさらにtableはtext-align: leftになるように…。
<center>なら簡単に指定でるきのに、CSSの行数が増えて行く。
そして、とうとうbbsnote.cgi本体の改造…。

BBSNote8.0b19 center タグ除去作業

ここを変更したらどこが変わるのかわからないからそれっぽいところを一箇所ずつ変更してソースを確認…という総当たり方式で問題の箇所を見つけ出し、tableにclass名をつけました。
場合によっては、tdだったりtrだったり…。

BBSNote8.0b19 center タグ除去作業

そこまでやっても、W3Cチェックで出るエラー1245…。
今のWebの基準を作っているのはW3Cなのか、googleなのか…。
google Chrome、IE、Firefoxで意図通りの表示、使う上でなにか問題がある訳ではないのですが…。

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

IE11だけmax-width: 100%;が効かない

お絵かき掲示板BBSNoteのカタログモードのモバイル端末対応作業を行いました。

BBSNote カタログモード iPhone iPad ScreenshotBBSNote カタログモード iPhone iPad Screenshot

iPad、iPhoneをChromeでエミュレート。

モバイル端末で問題なく表示できればそれでいいのかもしれないのですが、IE11で横幅を狭くしてみると…。

BBSNote カタログモード IE11

セルの幅に合わせて画像が小さくなる筈なのに…。
横スクロールバーがでてしまいました。
max-width: 100%;
が効かないようです。
width: 100%;
にすると…。

BBSNote カタログモード IE11

横スクロールバーはでなくなりましたが、元のサイズより大きく表示されてしまう画像が…。
max-width: 212px;
にすると…。

BBSNote カタログモード IE11

問題ないようです。

解像度が低い時は
width: 100%;
でも、元の画像より大きくならないし
max-width: 212px;
のように書く時は、CSS3で解像度別にセルの幅を決めてから、画像の最大幅を指定するようにすれば…。

IEで横幅を狭くした時にも、期待通りの表示になるようにCSSを書き直しました。

IEのようなレガシーなブラウザは切ってしまえばいいのに…と言われそうですが、お絵かき掲示板なのでJavaが使えるのはIEだけという事情も。
HTML5のPaintBBS NEOをつかっている方がほとんどなので、Java対応も切ってしまってもいいのかもしれないのですが…。

そして、その他のページでも…。

お絵かき掲示板交流サイト IE11

IEで横幅を狭くしてみたら…。表示が崩れて…。

お絵かき掲示板交流サイト IE11

max-width: 100%;
width: 100%;
に書き換えて対応しました。

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

隣接する1pxのborderを重ねると1pxのborderになる

設置しているお絵かき掲示板のうちのひとつ、relmのカタログモードのモバイル対応作業を行いました。
テーブルタグ5列表示で、768pxのiPadで縮小がかかる状態でした…。

テーブルタグを撤去して、tdだったところをdivで囲って、borderで枠線をつけてみたら…。

お絵かき掲示板 relm カタログモードモバイル対応作業

枠線が多くて目にうるさいような…。

お絵かき掲示板 relm カタログモードモバイル対応作業

divをくっつければテーブルタグの時と同じ見た目に…と思いましたが、1pxのborderが隣接すると1pxのborderが2本並んでしまうので…。

お絵かき掲示板 relm カタログモードモバイル対応作業

borderが完全に重なるように修正しました。
margin: 0 -1px -1px 0;

右と下のmarginを-1px。
1pxのborderが2本あっても、完全に重なれば1pxのborderしか見えない筈なので…。

最初からこうすれば良かったのですが…。
【CSS】tableのborderが一部だけ太くなるのを回避する
このあたりの記事をななめ読みして…。

お絵かき掲示板 relm カタログモードモバイル対応作業

右と、下のborderを消して…。
.catalog div:nth-of-type(5n)

5の倍数の時は、右のborderを表示。
.catalog div:nth-last-of-type(-n+5)

後ろから5個なら下のborderを表示。
.catalog div:nth-last-of-type(1)

最後の1個なら右側にborderを表示。

そんなCSSを書いていました。
解像度別に、もし4列表示なら、もし2列表示なら、もし1列ならと何時間もかけて書きました。
divでボックスを2つ用意し、floatで横並びさせています。その2... - Yahoo!知恵袋

あれ?もっとスマートな方法があるんじゃ…と思いながら検索して見つけた記事。

参考なったのは、ベストアンサーではなくて、他の回答者の方のコメントでした。
同じ太さの線が重なって太くなるはずがないんですよ。
あ…。
無駄な作業をしていた事に気が付きました…。
しかし…。
何番目系の便利なCSSまとめ
でできる事を知るよい機会だったのかもしれません…。

お絵かき掲示板 カタログモード モバイル端末対応作業お絵かき掲示板 カタログモード モバイル端末対応作業

iPad、iPhoneをChromeでエミュレート。
カタログモードだけモバイルに対応していなかったのですが何とかなりました。

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

お絵かき掲示板交流サイトのトップページに新着画像を表示

お絵かき掲示板交流サイトのトップページを改装して6つの掲示板を1ページにまとめました。

また、6つのお絵かき掲示板を横断して新着画像を呼び出し12枚分を表示。
掲示板を開かなくても、12枚の新着画像を確認できるようになりました。
もっと見るのリンクをクリックすれば52枚の新着画像を見る事もできます。

Screenshot PC Laptoppbbs.sakura.ne.jp_(iPad)_428_800.pngScreenshot iPhone

PC、iPad、iPhoneをChromeでエミュレート。

PCではディスプレイの幅が無駄になり、iPadでは高さが無駄になっていましたが何とか…。
そして、新着画像をクリックするとそのイラストが投稿された掲示板の返信画面になるように…。
PHP: glob - Manual
マッチするファイル/ディレクトリを含む配列を返します。
ディレクトリ名からどの掲示板なのか、掲示板のプログラムの種類は何かを判定する事はできるとして…。
POTI-boardのログファイルは1スレッド1ファイル形式ではないし、ファイル名の数字は13桁のUNIX timeなのでファイル名からレス先のスレッドの番号を取得するには…。

ログファイルを開いて画像とスレッドの番号が一致したら、返信先のリンクを作る?
掲示板の外部から掲示板のログファイルを開くなんてとても…と思いましたが、あれ?POTI-boardの改造の時におぼえたログファイルの解析方法を使えばいいのでは?
となりました。
<?php
//画像の13桁の数字
$imgno = 1529126099132;
$fp = fopen("cgi/hoge/img.log", "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桁のUNIX time
//と$timeが同じならスレッドの番号は$no?
if ($time == $imgno){
$resno = $no;
break;
}
}
//レス画像かもしれないので、tree.logを見に行く
fclose($fp);
$fp = fopen("cgi/hoge/tree.log", "r"); //ログファイルの場所
while ($line = fgets($fp)) {
//ログファイルの書式から変数を取得
list($oya,,,) = explode(",", $line);
//スレッドの番号は$resnoが含まれている行の$oya
if (preg_match("/$resno/", "$line")) {
$resno =$oya;
}
break;
}
fclose($fp);
//掲示板のレス送信画面にリンク
echo '<a href="cgi/hoge/potiboard.php?res='.$resno.'">掲示板</a></br>';
//タイトルを表示
echo "$sub</br>";
//投稿者名を表示
echo "$name</br>";
?>
もし、レスでお絵かきを許可する設定にしていたら、ここまでやらないとレス先がどこなのかわからないと思いますが、幸い、レスでお絵かきする機能を使っていなかったので、tree.logの確認をする必要はありませんでした…。

BBSNote、relm、らくがきひろば、POTI-board、4種類、6つの掲示板のログファイルを開いて、レス先やイラストのタイトル、作者名まで取得する作業…。

一度に全部やるのは無理なので、掲示板のログの処理をするプログラムを先に書いておいて、動く事を確認してから組みこみました。

手間暇をかけて見やすいサイトにしたつもりです。
よろしければご利用ください。

スマートフォンやタブレット端末でも動作するPaintBBS NEOを6つの掲示板すべてに導入済みです。

Windows10だからお絵かき掲示板が使えないとか、Javaが動かないからお絵かき掲示板が使えないという問題を解決してくれる新しく作られたHTML5のペイントツールですが、見た目と操作性はしぃお絵かきです。

気軽にお絵かき PaintBBS/しぃペインター | お絵かき掲示板交流サイト

POTI-boardのエラーを減らすために $mode編

POTI-boardのエラーを減らすために書き直した箇所。
//未定義エラー対策
if (isset($mode)){
switch($mode){
case 'regist':

(長いので省略)

default:
if($res){
updatelog($res);
}else{
echo "<META HTTP-EQUIV=\"refresh\" content=\"0;URL=".PHP_SELF2."\">";
}
}
}
//default:で処理していた箇所
else {
if($res){
updatelog($res);
}else{
echo "<meta http-equiv=\"refresh\" content=\"0;URL=".PHP_SELF2."\">";
}
}
POTI-boardの警告エラー修正 - sidewalkcafe blog

switch($mode){}
の前に
if (isset($mode)){}
を入れて囲む
こちらの記事を参考にさせていただきました。
未定義の時に、レス送信モードが表示される形になっていたので未定義の時の動作をelseで。

switchのdefaultも、$modeが予期しない値になった時にindex.htmlへ移動させるために必要なので残しました。
$mode が予期しない値になるのはどんな時かというと…。例えば
potiboard.php?mode=hoge
のような時です。
hogeという値が入っているので未定義ではないけれど、switchのどのケースでもない、レス送信モードでもない、だからindex.htmlを表示となります。

この対策で、レス送信モードの時に大量にでていた$modeのNoticeが解消されました。

お絵かき掲示板 POTI-board Noticeお絵かき掲示板 POTI-board Notice

左、$modeのNotice、右、それが解消された画面。

それでもまだたくさんNoticeがでてしまっているのですが…ログファイルが蓄積されると、1行だけになるようです。

php7.2でWarningが出るので調べてみたところ、コンティニューできるかどうかの判定に関係ない記述だったのでコメントアウト。
/* コンティニュー前画面 */
function incontinue($no){
global $addinfo;

$lines = file(LOGFILE);
//コンティニューの処理に関わっていない
// $countline=count($line);
未定義エラーがでるので、初期化。
function init(){
//未定義変数エラー対策
$err='';
$chkfile=array(LOGFILE,TREEFILE);
if(!is_writable(realpath("./")))error("カレントディレクトリに書けません<br>");
それから…画面を切り替えますの文字がスマートフォンでは小さく表示されるのでviewportを設定しました。
header("Content-type: text/html; charset=".CHARSET_HTML);
$str = "<!DOCTYPE html>\n<html><head><META HTTP-EQUIV=\"refresh\" content=\"1;URL=".PHP_SELF2."\">\n";
//$str.= "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=".CHARSET_HTML."\"></head>\n";
$str.= "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0\">\n<meta charset=\"".CHARSET_HTML."\"></head>\n";
$str.= "<body>$mes 画面を切り替えます</body></html>";
echo charconvert($str,CHARSET_OUT);
}
本文必須の設定の時しか日本語がなければ拒絶が有効にならなくなっていたので、
GitHub - funige/neo: PaintBBS NEO
のsamplebbsの記述に合わせました。
//本文に日本語がなければ拒絶
if(strlen($com) > 0 && strlen($com) == mb_strlen($com,'utf8')) error(MSG035,$dest);
これらの修正はPOTI-board改 v1.43 lot.180713に反映されました。

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

POTI-boardのNEOを使うをチェックした時の動作を変更

POTI-board NEOを使う テンプレート

POTI-boardのNEOを使うのチェックのあるテンプレート。

NEOを使うのチェックを外すとしぃペインターが起動するようにテンプレートを改造してみたところ…。

POTI-board NEOを使う テンプレートPOTI-board NEOを使う テンプレート

横幅が…。PaintBBSのアプレットの幅では表示されず、しぃペインターの設定になってしまいました。
NEOを使うのチェックが入っていても、
<!--{def useneo}--><APPLET-DUMMY <!--{/def}-->
も有効にならないので、テンプレート側の問題なのかなぁ…と思って調べてみましたが、NEOを使うにチェックが入っている時のpotiboard.phpの処理の問題のようでした…。
// if($w < 500 && $shi){$w = 500;}
// if($h < 500 && $shi==2){$h = 500;}
//NEOを使う時はPaintBBSの設定
if($w < 500 && !$useneo && $shi){$w = 500;}
if($h < 500 && !$useneo && $shi==2){$h = 500;}
// if($shi==1){ $dat['normal'] = true; }
// elseif($shi==2){ $dat['pro'] = true; }
// else{ $dat['paintbbs'] = true; }
//NEOを使う時はPaintBBSの設定
if(!$useneo && $shi==1){ $dat['normal'] = true; }
elseif(!$useneo && $shi==2){ $dat['pro'] = true; }
else{ $dat['paintbbs'] = true; }
NEOを使うのチェックが入っている時はPaintBBSの設定になるように…。
あまり需要がなさそうな改造なので、運営している絵板に入れて終わりになりそうですが…。

PaintBBS NEOお絵かき掲示板

ここのPOTI-boardに組み込んで、NEOを使うのチェックを外すとしぃペインター標準版が起動して、描画アニメも記録できるようにしてみました。
無料のJavaがいつまで使えるのかよくわからないのですが、2020年でサポート終了だったような?
OpenJDKなら使える?
WindowsでJavaが使えるブラウザはIEだけで、Windows10にも一応入っているようですが…。
Javaが使えない環境でも、PaintBBS NEOはHTML5なので、タブレット端末やスマートフォンでも描く事ができます。

結局のところ、しぃペインターも使えるように設定してもみんなNEOで描いてるのが現状なのですけれどね…。

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

Cannot modify header information の原因を突き止める

php.iniを
display_errors=on
error_reporting = E_ERROR | E_WARNING | E_PARSE
にして、Warningは表示するけれど、Noticeは表示しないように設定し、以下のようにページが切り替わる秒数を15秒に書き換えて確認しました。
$str = "<html><head><META HTTP-EQUIV=\"refresh\" content=\"15;URL=".PHP_SELF2."\">\n";
1秒で切り替わる設定のままだと何が表示されているのかわからない…。

POTI-board Warning

コメントを送信した直後の「画面を切り替えます」の時に表示されるエラーメッセージ。
Cannot modify header informationが6箇所。

POTI-board Warning

投稿直後に表示されるWarning。

POTI-board WarningPOTI-board Warning

POTI-boardのエラーを減らすために 数値以外の値編: STP^3の、数値が入るべきところに文字列が入っていた問題を解消すると…。Warningがでなくなりました。

POTI-boardのエラーを減らすために header編: STP^3を書いた時は、もしかしたら…という感じだったのですが、
Warning: Cannot modify header information
が出ていた原因は、phpのエラーメッセージがheaderより先に出力されていたから…だったようです。

Cannot modify header informationが出る原因を一生懸命調べても解決しなかったのに、きれいにエラーが消えたので思わず笑ってしまいました。

一箇所気になるところがあるといえばあるのですが…。さくらのレンタルサーバのphp7.1で確認した限りでは…POTI-board改のWarningはこれで解消されたような…気がします。

POTI-boardのエラーを減らすために 数値以外の値編

Warning: A non-numeric value encountered
警告:数値以外の値が発生しました
一体何が…。
数値以外の値がなんなのか中身をechoで表示してみる事に…。
echo $ltime; //問題の変数
echo '|'; //区切り
if(RENZOKU && $time - $ltime < RENZOKU){error(MSG020,$dest);}
if(RENZOKU2 && $time - $ltime < RENZOKU2 && $upfile_name){error(MSG021,$dest);}
出力された値とエラーメッセージ。
1528807931|1528805950|1528544331|1528530938|1528527552|1528520321|1528512258|
1528508742|1528505146|1528502788|OB1528490148|
Warning: A non-numeric value encountered in C:\xampp\hoge\potiboard.php on line 946
お絵かき機能を使って投稿するとログファイルの13桁のUNIX timeの先頭にKASIRAで設定したOBが入りOB1528490148799となる事が原因でした。

現在の時間からOB1528490148を引いても数字ではないので…。
if(strlen($ltime)>10){$ltime=substr($ltime,0,-3);}
でOB1528490148799の後ろからマイクロ秒の3桁を取り除いてもOB1528490148になりますが
if(strlen($ltime)>10){$ltime=substr($ltime,-13,-3);}
とすれば10桁のUNIX time、1528490148になりになります。
(Tips)これから100年のunix時間は10桁数字。5桁の固定長文字列でも表現できる。

21世紀ののUnix時間はほぼ10桁で表せる
10桁なら…という前提付きですが、これから先100年は大丈夫…という事で。
KASIRAを廃止すれば従来の
if(strlen($ltime)>10){$ltime=substr($ltime,0,-3);}
で、問題ないんですけどね。
futaba.phpがPOTI-boardになった時点で、
//連続投稿秒数
define('RENZOKU', '10');
//画像連続投稿秒数
define('RENZOKU2', '20');
の計算が正しくできなくなっていた可能性が高い…です。
例えば、画像連続投稿秒数を60秒に設定して、お絵かきだけを繰り返すとOBの付いた数字ではないものでは引き算ができないので、60秒経過しなくても投稿できていた筈です。
しかし、画像アップロードと、テキストの投稿の時には正常に動作していたので誰も困っていなかった…のかもしれません。

この問題は、POTI-board改 v1.42.2 lot.180614で修正されました。

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

POTI-boardのエラーを減らすために header編

headerのWarningを検証するため、正常に動作するとgoogleが表示されるように該当箇所を書き換えてみました。
// header("Content-type: text/html; charset=".CHARSET_HTML);
header("Location: http://google.com/");
XAMPPでphpのエラー表示ありで試してみると…。
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\hoge\potiboard.php:459) in C:\xampp\htdocs\hoge\potiboard.php on line 1123
になり、googleに推移しません。
しかし、phpのエラーを表示しない設定のサーバ上ではgoogleに推移します。
Warning: Cannot modify header information
というWarningがほかにも出ていましたが、headerの出力の前にNoticeが表示された事が原因でした。

POTI-boardのログファイルの上限を5MBに

簡単なテストしかできていないため、各自自己責任で…。
ぷち的ココロ♪

総レス数がまだ2800を超えた程度なのに、親記事のナンバーの低いスレが消えてしまっていました。
親記事ナンバー+5000レスをスレの消える寿命に設定するにはどうしたらいいのでしょうか?

バッファに1000000byte読み込む処理があったので
logファイルの上限がおそらく約1Mbyteだと思います。
その上限を超えたので2800でレスが消えたのではないでしょうか
調べてみると…。

$buf=fread($fp,1000000);
となっているところが7箇所
$buf=fread($tp,1000000);
1箇所

合計8箇所にログファイルに関するものと思われる1000000byteの指定がありました。
試しにここを

$buf=fread($fp,2000000);

つまり2倍にしてみたところ

POTI-boardのログファイルの上限

1.961kbまでログを保存する事ができるようになりました。

XAMPPでテストしたので、ログファイルのファイルサイズの確認がエクスプローラーになりましたが…。
2000000byte=1953kbなのでだいたいあってますね…。

XAMPPの次は、さくらのレンタルサーバで5MB保存できるかテスト。

$buf=fread($fp,5242880);
$buf=fread($tp,5242880);

に設定。

POTI-boardのログファイルの上限POTI-boardのログファイルの上限

テキストファイルのサイズが1MB〜3MBのものを数回投稿。
数発言で5MBを超える投稿を行ってみたところ…。

9601969byte…。
5MBを超えてしまいました。

ログファイルが4MBの時に、1発言5MBの投稿を行うと4+5=9MBとなるようです。
追加で短く一言書いてみると…。

5242824byte=4.999946594MBになりました。

$buf=fread($fp,5242880);
$buf=fread($tp,5242880);

この2つは、ログファイルを読み込む時の設定…なんでしょうね。
5MBしか読み込まなかったので9MBあったログが5MBに…。

ログファイルがどうなっているのか調べてみたところ、コメントが途中で切れて必要なログの形式もなくなっていました。
スレッドやレス単位ではなくファイルサイズの上限で切れるようです。

他のログはどうなるのかというと…。
途中で切れてしまったログ以外は問題なさそうな感じでした。

POTI-boardのログファイルの上限

ログファイルをダウンロードしてファイルサイズを確認してみたところ…。
ぴったり5MB…。

ログが5MBまで溜まった状態で書き込むと5MB読み込む処理が入る…。どの程度の負荷になるのかよくわからないのですが…。
5MBだと大きすぎるのかもしれないので…。

$buf=fread($fp,2097152);
$buf=fread($tp,2097152);

2MBなら…。どうなんでしょうね…。

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

P.S
POTI-board改 v1.45.5 lot.181129で、2MBになりました。

POTI-boardの頁リンクが増え続けるのを制御(その2)

POTI-boardの現在の仕様だと、300ページ分ログがあると、300ページ全部表示してしまうので、長く運用してログをストックしていくタイプの掲示板だと厳しい…。

だから、最新から19ページまでは古いログを表示しない、20ページになったら、21ページ以後のページがすべて表示される。20ページ分のログが存在しない時は、存在しているログの分だけ表示するようにプログラムを書き直して終わり…の筈だったのですが。

それだとログが20ページまでしか存在していないと思う人がでてくるという指摘がありました。

ログが21ページ分より多くかつ最新から20ページまで表示している時は、21ページを
[0][1][2](中略)[20][>>]
のように表示する事ができれば…。

直接テンプレートに[>>]といれて、21ページへのリンクを貼る事もできますが…。
それだと…ログファイルが少ない時と多い時とでテンプレートを書き直さなければならなくなるのでプログラムで対応したい…と思いました。

POTI-board

こんな感じになりました。
//下段ページリンクの出力をifで分岐
//0-21まで表示する事を想定
//カウントツリーが指定した数値より小さい場合は全件表示

if(220 > count($tree)){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//下段ページリンクの出力をifで分岐
//スレッド数が指定した数値より大きな時は全件表示
//数値を-1小さく設定しないとリンクが表示されないページができるかも。

elseif($i > 219 ){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//下段ページリンクの出力をifで分岐
//スレッド数が指定した数値より小さい時は任意の数値でページを表示

elseif($i < 220 ){
for($i = 0; $i < 220 ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
if($i==210){
$pno = str_replace("<PAGE>", ">>", OTHER_PAGE);
// $pformat = str_replace("<PURL>", PHP_SELF2, $pno);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}}
$paging.=$pformat;
}
}
//ここまで
21ページ目なら、[>>]にという記述が増えただけなんですけどね。
ページ番号20を表示させたかったので、ひとつ前の記事で書いたものより、+10スレッド数が多くなっています。
1ページ10件表示用なので、例えば5件表示で使うと [>>] が横並びの最後にならず、ひとつ手前に出てしまいます。

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

POTI-boardの頁リンクが増え続けるのを制御

POTI-boardは、1ページ10件表示で3000スレッドあったら300ページ分のリンクができる仕様…。

しかし、そんなに多くの古いログを見たい訳ではない時のほうが多いので…。
テンプレートで最初の20件だけ表示して、あとは頁へのリンク無しでもいいか…と思いましたが、それはそれで、古いログを見る時に…。

というわけで、以下の仕様になるようにPOTI-boardを改造してみました。

0から19ページまでは、
ページ番号0から20(0から20なので210スレッド分)までしか表示しない。
20ページになったら21ページ以後も表示。
3000スレッドあったら300ページ表示。
また、スレッドが210件未満の時は、存在しないページへのリンクができないように最初の条件分岐でログのカウントツリーをチェックして全件表示。
その場合は210スレッド未満なので、20ページ以下になります。

POTI-board

0-20ページまで表示。

POTI-board

20ページ以後を表示しているので、0-21ページまで表示。
もし300ページ分ログがあれば、0-300ページまで表示。

プログラムを書き換えた箇所
// for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
// if($st==$i){
// $pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
// }else{
// if($i==0){
// $pno = str_replace("<PAGE>", "0", OTHER_PAGE);
// $pformat = str_replace("<PURL>", PHP_SELF2, $pno);
// }else{
// $pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
// $pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
// }
// }
// $paging.=$pformat;
// }

コメントアウトしてあります。
//下段ページリンクの出力をifで分岐
//0-20まで表示する事を想定
//カウントツリーが指定した数値より小さい場合は全件表示

if(210 > count($tree)){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//スレッド数が指定した数値より大きな時は全件表示
//数値を-1小さく設定しないとリンクが表示されないページができるかも

elseif($i > 209 ){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//スレッド数が指定した数値より小さい時は任意の数値でページを表示

elseif($i < 210 ){
for($i = 0; $i < 210 ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}
//ここまで

書き換えた内容。

ちゃんとプログラムが書ける人なら、スマートにまとめる事ができる筈なのですが…。
とりあえず動いているからいいか…という…。

まともにプログラムが書ける方が見たら、うわっ…というプログラムになっていますのでご注意ください。
カタログページも対応させる場合は、該当箇所を同じように分岐させる事になります。

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

合作ができるようにPOTI-boardを改造しました

BBSNoteや、relmには、新規投稿ならパスワードがなくても続きを描く事ができる機能があります。合作の時に使う機能です。
もとの投稿を編集・削除する時はパスワードが必要なので、第三者による編集・削除を防ぐ事ができます。

POTI-boardでも似たような事ができるんだろうな…と思ったのですが…。

POTI-board 続きから描くPOTI-board 続きから描く
//コンティニュー時、削除キーを必要とする 必要:1 不要:0
define('CONTINUE_PASS', '0');
に設定すると、削除キーの入力欄が無くなり誰でも続きを描く事ができるようになりました。
しかし…。

POTI-board 続きから描くPOTI-board 続きから描く

差し換えなのにパスワードが無くても続きが描けるのはおかしい…と思ったら投稿エラーになりました。
これでエラーにならなかったら、知らないうちに投稿したイラストが別の何かになっていてもおかしくない…。

POTI-board 続きから描く

エラーになった画像が、アップロード途中の画像に残っていました。
コメントを入力すれば新規投稿になります。

という事は、削除キーがなくても続きを描く事ができる設定にすると、続きを描いて差し換える事ができなくなる仕様…という事になります。

投稿したあとでちょっとだけ直したくなった…という事があるので困ります。

差し換えと新規投稿で、異なる動作になるようにプログラムを書き変える事ができれば…。
//コンティニュー時のパスワード
// if(CONTINUE_PASS) usrchk($no,$pwd);
//パスワードが必要なのは差し換えの時だけ
if($type=='rep') usrchk($no,$pwd);
思ったより簡単だったというか…。差し換えの時はパスワードをチェックするけど、それ以外はパスワードをチェックしない。
新規投稿ならパスワードなしで、差し換えならパスワードが必要。
ここを書き直すだけで期待通りの動作をするようになりました。

ただし、削除キー不要の設定のところを、必要にしないと削除キーの入力欄が表示されなくなりますから、必要にしておかなければいけません。

config.phpで設定できるようにしてみました。
テンプレートの仕様変更も…。従来のテンプレートでも対応テンプレートで改造前のプログラムでもどちらでも問題がでないように何とか…。

config.php
//コンティニュー時、削除キーを必要とする 必要:1 不要:0
define('CONTINUE_PASS', '1');
の設定をそのまま使います。
説明文だけ変更して
//新規投稿でコンティニューする時にも削除キーが必要 必要:1 不要:0
define('CONTINUE_PASS', '0');
potiboard.phpの
1855行目付近
// if(CONTINUE_PASS) $dat['passflag'] = true;
//コンティニュー時はパスワード欄を常に表示
//従来のテンプレートとの互換性を保つため
//passflag を常に true にする。
$dat['passflag'] = true;
//ペイント画面のテンプレートで使う変数を追加
//新規投稿でパスワード不要の時 true
if(! CONTINUE_PASS) $dat['newpost_nopassword'] = true;
2680行目付近。
case 'contpaint':
//コンティニュー時のパスワード
// if(CONTINUE_PASS) usrchk($no,$pwd);
//パスワードが必要なのは差し換えの時だけ
if(CONTINUE_PASS||$type=='rep') usrchk($no,$pwd);
CONTINUE_PASSが 1 または、差し換えの時はパスワードが必要→差し換えでも、新規投稿でもパスワードが必要。

CONTINUE_PASSが 0 なら、パスワードが必要なのは差し換えの時だけになるので、新規投稿を選択すれば誰でもパスワード無しで続きを描く事ができる→合作可能。

お絵かき テンプレート
<!--{def newpost_nopassword}-->
<li>新規投稿なら削除キーがなくても続きを描く事ができます。</li>
<!--{/def}-->
<!--{ndef newpost_nopassword}-->
<li>続きを描くには描いたときの削除キーが必要です。</li>
<!--{/ndef}-->
従来のテンプレートを使う場合は
// passflag…削除キー入力を促す場合 true が入る
の箇所が、常に true となるので、
<li>続きを描くには描いたときの削除キーが必要です。</li>
という表示になる。

続きから描く時の挙動が、POTI-board、BBSNote、relmですべて同じになり設置しているすべてのお絵かき掲示板で合作が可能になりました。

P.S
この仕様はPOTI-board改 v1.42 lot.180507に組み込まれました。

コメントスパム対策のための.htaccess POTI-board用

長い間、掲示板へのコメントスパムをcgiの設定で防いで来ました。
「半角英数のみの投稿を許可しない」「NGワード機能を使用」「特定のIPをアクセスできないようにする」
BBSNotev8.0b19のモジュール、filter.cgi、ngword.cgi、security.cgiでフィルタリング。
それで十分…と思っていましたがBBSNoteはPerl5.12以上では動作しない事がわかり…。

他の掲示板には、BBSNoteのモジュールのような機能があるような、無いような…。
.htaccessによるアクセス制御 – さくらのサポート情報

特定のドメイン名やIPアドレスからの閲覧を【拒否】したい
設定ファイルの作成

メモ帳等のテキストエディタで、設定ファイルを作ります。

Order allow,deny
allow from all
deny from remote.host.com
deny from 192.168.0.
home/cgi/ のようなディレクトリ構成で、複数ある掲示板は cgi/ 以下にしか無いのであれば、cgiというディレクトリに.htaccessを設置すれば、cgi/ 以下の下位ディレクトリすべてへのアクセスを許可したり拒否したりできますから、掲示板が10種類あってもまとめて制御する事ができます。

こっちのほうが簡単…という事で.htaccessによる掲示板へのアクセス制限を使い始めて、約1年…。

コメントスパムのIPアドレス、ホスト名の記録を15年近く続けていましたから、それを.htaccessで拒否するように設定しました。
今のところコメントスパムを排除する事に成功しています。

しかし、拒否しなくてもいい人まで拒否してしまっている可能性も…。
登録しているIPアドレスが古すぎて、日本国内のIPアドレスになっていたら?
定期的に調べ直さなければならないのかもしれません。
それでも蓄積したブラックリストがあるのなら公開して欲しいという方のために、6800行あるファイルから必要最小限のものをピックアップしてzipファイルにまとめてみました。

POTI-boardと同じディレクトリに設置する事を想定したものですから、その他の掲示板にはそのままでは使えないかもしれません。

HTMLファイルをキャッシュさせないようにする設定と、POTI-boardの設定ファイルとログファイルへのアクセスを拒否する設定も入っているからです。

.htaccessの中を見て、何が書いてあるのかわかる方なら、IP、ホスト名だけコピペしていただければ…。
order allow,deny
allow from all

deny from .ru
deny from .ua
deny from .broadband.kyivstar.net
コメントスパムで埋まったお絵かき掲示板の投稿者のIP、ホストを調べてみた限りでは…。
.ua
.ru
.broadband.kyivstar.net
の3つを拒否するだけで海外からのコメントスパムの大半は拒否できるような気がします…。

配布するファイルにはもうちょっといろいろ入れてあります。

zipファイルには別の.htaccessも入れておきましたが…。
そのまま使うのは危険です。

何名かの国内の友人、そして全世界の友人を失っても構わない、とにかく海外からのコメントスパムを防ぎたい…という方のための設定になっています。
#phpファイルにアクセスできるのは.jpと.bbtec.netだけ
#そのほかの国内からのアクセスも弾いてしまうので
#実際に運用する場合は
#http://www.cgis.biz/tools/access/
#の日本国外からのアクセスを制限する.htaccessの内容を以下に追加

<Files ~ "\.php$">
order deny,allow
deny from all
allow from .jp
allow from .bbtec.net
</files>
海外からでも掲示板の投稿を読む事ができて、イラストを見る事もできるように、拡張子.phpのファイルへのアクセスだけ拒否するように設定してみました。
.jp
.bbtec.net
からのアクセスしか許可しない設定になりますから、学校の施設からアクセスしたら拒否されたとか…、国内で使っているけれど回線は米国の場合は書き込む事ができなくなります。
アクセス制限のかかっていない領域にメールフォームを設置して、書き込めないから許可する設定にしてください…という連絡をもらって許可するIP、ホストを追加していけばいいのかもしれませんが…。
IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI's
ここから.htaccessをダウンロードして、そのまま設置すれば、国内からしかアクセスできなくなる筈なので、こんな小さな個人サイトのブログが配布しているファイルよりよほど確実かもしれません。

しかし、日本以外からのアクセスを禁止するという事はGoogleからのアクセスも禁止する事になるようなので、いつまでたってもGoogleの検索結果に反映されないといった問題が起きるかもしれません。

アクセス制限は、できるだけ狭い範囲にかけるものだと思っています…。
たとえば、ただのHTMLファイルへのアクセスはできるけれど、掲示板の拡張子、cgi、phpにアクセスできるのは日本国内からだけといった設定をする事もできます。
上位ディレクトリへの設置ではなく、掲示板が設置されているディレクトリに設置すれば、掲示板以外へのアクセスは制限されないのでトップページも見る事ができないといった問題を回避する事ができると思います。
htaccess_for_POTI_board_181425.zip
二種類の.htaccessが入っています。あくまでもサンプルです。
実際に運用する場合は、記述されている内容をご自身で確認してくださいますようお願い致します。
また、サーバによってはうまく動作しないかもしれません。
そういった事も含めて、あくまでもサンプルであり無保証です。