sidewalkcafe blog

日々是好日

POTI-boardのコード編集

某所で設置しているPOTI-board
PHPスクリプト - お絵かき掲示板『POTI-board』 - ぷにゅねっと
お絵描き掲示板としては優秀なんだけど
2008年から更新が止まって色々と問題があるので
問題があるところを抜き出して変更して行くつもり

予定

  • ページ数が増えるとhtml書き出しが重くなるので2ページ目以降は動的に表示させる(済)
  • パスワードのハッシュ方式を最新のものに変える(済)
  • ログをデータベース化する(SQLite)
  • エラー(警告)が多いので改善する
  • セキュリティの向上
  • スマホ表示に対応する(テーブルレイアウトの削除)
  • 初期設定画面をつくる(パスワード等の設定)

変更点

  • ページャー作成
    • updatelog()をコピーしてpaging()をつくる
    • updatelog()の2ページ目以降の書き出し処理は消す
    • 前ページは $dat['prev'] = PHP_SELF.'?p='.$prev/PAGE_DEF;
    • 次ページは $dat['next'] = PHP_SELF.'?p='.$next/PAGE_DEF; に変更
    • 各ページリンクは$pformat = str_replace("", PHP_SELF.'?p='.$i/PAGE_DEF , $pno);
    • ページ数を取得し、echo( htmloutput(MAINFILE, $dat, true)); で表示する
    • 表示ページまで飛ばす処理 if($page != $p && $page < $p) continue ;
    • p=0でindexも表示出来る、表示出来ないページにエラー処理を入れる
  • パスワードハッシュ変更
    • md5をpassword_hash()に変更
    • CreatePass()をつくる
    • $p = password_hash($d, PASSWORD_DEFAULT); return $p;
    • パスワード比較用のVerifyPass()をつくる
    • if (password_verify($d, $p)) return true ;
    • 旧パスワードデータを流用する場合、md5との比較ができるようにする
    • if (OLD_HASH && $n <= OLD_HASH){ md5との比較 }として、指定noより前の書き込みについて比較できるようにする
    • 管理者パスワードはあらかじめハッシュ化したものをconfigに保存しておく
  • SQLite化する(予定)
    • テーブル作成処理を追加
    • 旧ログデータ変換用のスクリプトを別につくる
    • ツリーと表示順も同時に保存
    • テーブル:id番号,日時,Mail,題名,コメント,URL,host,USERID,Pass,拡張子,画像幅,画像高,ファイル名,サムネ,チェックデジット,描画時間,fontカラー,ツリー番号,表示順
    • 親はid番号=ツリー番号、子は表示順=0
    • "select * from bbs order by hyouji asc, tree desc, id asc"でデータ取得(予定)
    • 表示をまとめて関数化する(予定)
  • エラー改善
    • 変数宣言してないところでif(変数)としてる所が多いのでif(isset(変数))にする
    • if(isset(${$a}))${$a}=0; こういう関数つくっても良いかも?
    • テンプレートのifneを使ってる部分が良くエラーに成るのでndefに戻す
  • セキュリティの向上
    • パスワードハッシュ変更(済)
    • 埋め込みパスワードhiddenをセッションに変更
    • extract()をなんとかする
    • eval()もなんとかしたいけどどうすれば良いのかわからんw
    • 今どき管理人用リンクを一般公開してるところも無いのでphp?mode=adminとかでアクセスしてもらう
    • 初回のみ設定用スクリプトを走らせる?wordpressみたいにできたらよいけどめんどそうw
    • 文字コードutf-8固定で良くない? いまさらsjisとかeucとか文字化けのもとだし?
  • スマホ表示に対応する(予定)
    • テーブルレイアウト削除
    • CSSファイルをまとめる
  • 初期設定画面(予定)
    • 最初はconfigファイルを用意せず、config-defaultを入れておく
    • configファイルが無い場合、入力フォーム画面に飛ばす
    • 各項目をフォーム入力→config書き出し保存
    • パスワードは最初に計算、保存

SQLite :Fatal error: Call to a member function bindParam() on a non-object

SQlite使ってて文法は正しいのにエラーが出た件

$db->errorInfo() 

でエラーの内容を見てみると

 Array ( [0] => HY000 [1] => 1 [2] => no such table: テーブル名 ) 

テーブル名が無いと出た

原因

CREATE TABLEで「check」という名前のカラムを作ろうとしたのが原因らしい
適宜済みのキーは避けて別の名前にするか、''などで囲むと良いらしい


SQLiteで定義されているキーワードに関する注意点 - SQLite入門

神戸とか豚まん放浪記2017

さて、前の記事から随分時間が経ったので、備忘録として最近のお店とか覚えてる範囲で記入してみる。

sidewalkcafe.hatenablog.com
↑過去記事


ついでだし、個人的トップ10ランキング。

  1. 新開地 「春陽軒」
  2. 中華街 「老祥記」
  3. 元町商店街 「老祥紀
  4. 湊川 「とんとん餃子」
  5. 板宿 「餃子弁慶」
  6. 三宮 「太平閣」
  7. 王子公園 「ぶたまんや」
  8. 元町 「四興楼」
  9. 平野 「中央ベーカリー」
  10. 三宮・なんば他「551蓬莱
  11. 垂水 蒸龍
  12. 元町・三宮 「三宮一貫楼」

神戸市内

不明・閉店

jquery.xdomainajax.jsが動かなくなった

jsでクロスドメインのHTMLスクレイピングが使えるようになるjquery.xdomainajax.jsだけど、
しばらく前から使えないようになった。

結論

jquery.xdomainajax.jsの中身を以下のように変える

//古いデータ 18行目くらい
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
query = 'select * from html where url="{URL}" and xpath="*"';
//新しいデータ 18行目くらい
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys',
query = 'select * from htmlstring where url="{URL}" and xpath="*"';

解説

jquery.xdomainajax.jsがクロスドメインの壁を超えるために、Yahoo!YQL というサービスを使ってたのだけど、それが使えなくなったのでURLを書き換えることで使えるようになったみたい。
ただ、返ってくるデータが生テキストからタグエスケープ済みのテキストデータになってるので、このままではセレクタの呼び出しや検索ができない。なので読み出し側も修正が必要。

呼び出し側の修正

//古いデータ resspnseTextをそのままjQueryオブジェクトに変換すればHTMLタグ化できた
$.ajax({  
    url: 'http://yahoo.co.jp/',
    type: 'GET',  
    success: function(data) {  
        content = $(data.responseText);
        $('body').append(content);
    }      
});  
//新しいデータ resspnseTextの中に<result>があり、その中にエスケープされたテキストが入ってるので
//オブジェクト化→アンエスケープ→オブジェクト化という手順を踏んでみた
$.ajax({  
    url: 'http://yahoo.co.jp/',
    type: 'GET',  
    success: function(data) {  
        content = $($(data.responseText).text());
        $('body').append(content);
    }      
});  

もっと良い方法があったら教えて下さい。

正規表現チェックサイト

正規表現チェック
RegexPlanet - Online Regular Expression (Regex) Testing and Cookbook for: Go, Haskell, Java, JavaScript, .Net, Perl, PHP, Python, Ruby, Tcl & XRegExp

色んなスクリプトでのチェツクが出来るのでオススメ

管理ユーザがいなくなったので何もできない(Mac OS 10.6)

メインユーザの管理者権限が外れて通常ユーザーになってしまったため、諸々の操作(環境設定変更、インストール等)ができなくなった。
なんか他でも同様の症状が出てるみたい。で、対処法を見るがなかなか上手く行かなかった。
がちゃがちゃやって上手くいった時の対応。

<参考>
Macで管理者権限がなくなってしまった時の対処方法: おたくマニアのココロ

A-Liaison BLOG: パスワードが無くなってログインできない Mac に無理矢理ログインする方法

対処法:通常ユーザに管理者権限を与える

基本的には上のリンクの通りにすれば良いんだけど、「com.apple.DirectryServices.plist」が読み込めなかったので代わりに「com.apple.DirectoryServicesLocal.plist」を読み込んで事なきを得た。

シングルユーザーモードMacを起動

再起動+起動時に「コマンド(リンゴマーク)」+「S」キーでシングルユーザーモードを立ち上げる
真っ黒なコンソールっぽい画面になったらOK

ハードディスクを編集可能にする

/sbin/mount -uw /

と打ち込んでハードディスクを再マウント、編集可能にする

/sbin/fsck -fy

と打ち込んでディスクチェックをしても良いのだけど割愛。調子が悪ければ要チェック。

ディレクトリサービスを読み込み、起動

launchctl load /System/Library/LaunchDaemons/com.apple.DirectoryServicesLocal.plist

「DirectoryServices」がnot fileになるので「DirectoryServicesLocal」を読み込み。

dscl localonly

で起動。頭が「>」に変われば起動成功

ディレクトリを移動

cd /Local/Default/Groups/

目的のディレクトリ階層まで「cd」で移動

管理権限付与

append admin GroupMembership 'username'

ユーザーに管理者権限を与えるコマンド。
'username'の部分に自分のユーザー名を入れる

ちなみに、うちのキーボードがおかしいのか配列が変わってたので、「'」の文字は「*(け)」の位置になってた(シフトキー不要)

mac mini(Mac OS 10.6 Snow Leopard Server)の初期設定トラブル

手持ちのMacが壊れたので、周辺機器が使えるOS 10.6以下の中古Macを探しにソフマップへ。
ちょうどあったMac miniを購入。

サーバタイプは不人気だという事で少し安かった。
初期設定が特殊なんだろうか・・・、以下と同じ症状がでた。

mac mini 中古で購入したが「ようこそ画面」の「続ける」ボタンを押せない
https://discussionsjapan.apple.com/thread/10123941

https://discussionsjapan.apple.com/servlet/JiveServlet/showImage/2-100738175-16052/youkoso.jpeg
(上記フォーラムより転載)


・原因:システム時刻が初期化されているため地域設定が出ない

・対処方法:ターミナルからシステム時刻を変更

1.USBのDVDドライブを接続してインストールメディアから起動
 (Cキーを押しながら電源を立ち上げる)
2.メニューが表示されるまで進めて、上メニューの「ユーティリティ」から「ターミナル」を選ぶ
3.ターミナルが起動したらコマンド画面から時刻の変更をする。
(2016年1月1日12:00の場合は以下のように入力)
 date 010112002016
4.通常再起動

 OSはインストールされているので、そのままインストールを続けなくても大丈夫。
不具合があった場合は再インストールする。
システム時刻の確認は、ターミナルから「date」と入力すれば確認できる。
ターミナルで間違えた時刻を設定しても、地域を選べば自動的に現在時刻に変更される。