カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2017年09月14日(木)

PHP user_error の処理を set_error_handler で置き替えてみた

phpseclib という PHP ライブラリーが
user_error という関数を呼んだ結果、
詳しいエラー情報が出力されちゃうのを
回避するために、set_error_handler を使って
標準のエラー処理を回避しました。

user_error は、trigger_error の別名だそうです。

set_error_handler の説明はかなりあいまいなので、
わかったことを書いときます。

まず、 trigger_error() にある「E_USER 関連の定数」というのは、
定義済み定数 のうち、E_USER から始まるものということのようです。

それ以外のエラーでは、set_error_handler で設定した
カスタムエラーハンドラはコールされないといいのですが
set_error_handler によると、E_STRICT もくるっぽいですね。

-- 2017/09/15 追記 --
E_NOTICE も来ました。set_error_handler
「以下のエラータイプは、ユーザー定義の関数では扱えません」
にあるタイプが来ないということのようですね。
--

きちんと、調べたわけではないのでわかりませんが、
少なくとも、構文エラーでは呼ばれませんでした。

set_error_handler の説明にある
「必要に応じて die() を コールする責任」は
E_USER_ERROR では die すべきという意味っぽいですね。

というのも、 定義済み定数 の E_USER_ERROR の説明には
「E_ERROR に似ている」とあり、E_ERROR の説明には
「スクリプトの実行は中断されます」とあるからです。

ちなみに、phpseclib の私が利用している部分のコードでは、
user_error を標準の引数、すなわち、E_USER_NOTICE で呼びだした後
エラーを返すみたいなコードになっていたので、
特に die する必要は無さそうでした。

-- 2017/09/15 追記 --
基本的には、定数名に ERROR がついている場合は、
die すべきということっぽいですね。
E_RECOVERABLE_ERROR は微妙ですが、
標準のハンドラーは die するみたいなことが書いてあります。
あと、E_NOTICE は配列の存在しない添字へのアクセスで
発生したので、die した方が安全かもしれません。
--

・・・

ちなみにテスト環境の php は、7.1.7 です。

ブログ著者のホームページはこちら です。


2017年09月12日(火)

PHP user_error どしよっかな?

今日も、新しいシステムのテスト、デバッグ中です。

だいたい、正常な入力に対してのテストは
終わって、単体テストをコツコツ書いたり
異常系のテストを開始したりしました。

で、今は、phpseclib という PHP ライブラリーが
user_error という関数を呼んだ結果、
詳しいエラー情報が出力されちゃうので
どうしよっかなーと考え中です。

認証系のプログラムなので、セキュリティの観点から、
あんまり詳細なエラー内容をユーザーに
見せるべきではないからです。

user_error は、trigger_error の別名のようです。
set_error_handler ってので置き替えるのがいいっぽいかな。

マニュアルには、必要に応じて die() を呼ぶ責任がありますって
あるけど、いつ呼ぶべきか、何も書いてないな〜。

あと「E_USER 関連の定数」って何やねん。
リストはどこにあんねん。

・・・

定義済み定数 の E_USER 接頭辞のやつってことかな。
うーん、色々、よくわからん。説明が足りなすぎる。

ブログ著者のホームページはこちら です。


2017年09月05日(火)

ホームページの文字コードを UTF-8 に変更

ホームページの文字コードを
Shift_JIS から、UTF-8 に変更しました。
改行コードも CR+LF から LF に変更しました。

S.S.Software ホームページ

文字化けする場合は、リロードしてみてください。

ただし、ウェブブラウザーが Chrome の場合は、
リロードだと、javascript とかが何故か更新されないので、
スーパーリロード (Ctrl + Shift + R) が必要です。たぶん。

スーパーリロードとかしても、
文字化けするページを発見した場合は、
連絡いただけるとありがたいです。

連絡先はこちら です。

・・・

連絡先ページは、テスト済みなので、
正しく動くはず・・・。

ブログ著者のホームページはこちら です。


2017年09月04日(月)

ホームページの文字コードを UTF-8 にする作業中

今日は、主にホームページの文字コードを
Shift_JIS から、UTF-8 にする作業をしとりました。

だいたい終わってたので、最後に
公開予定の HTML や css (スタイルシート) などの
文字コードが UTF-8 になっていることを
確認したかったのですが、まともに
動くソフトが見つかんなかったので
簡単なプログラムを書いたりしました。

必要なファイルをピックアップして、
nkf --guess すればよいので、まぁ、
sed とかを使ってやるのが普通かな。

自分の場合、自作のライブラリーが
揃ってきてるので、c++ で書きましたが、
あんまりおすすめではないですね。

ちなみに、
nkf --guess ファイルパス
では、文字コードと改行コードが、
nkf -g ファイルパス
では、文字コードが出力されるようです。

・・・

自分は、結局使いませんでしたが、
dir /b /s *.html *.css
とかやると必要なファイルパスのリストが取得できますよん。

ブログ著者のホームページはこちら です。


2017年08月29日(火)

javascript で jpeg アニメーション

もうそろそろ、Flash コンテンツとは
おさらばしといた方がよさそうですね。

私のホームページでは、ミルノ PC フォトフレーム とかで
使用しているアニメーションが Flash (swf) なので、
javascript で実行可能な形式に書き替えました。
(ローカルでの話。まだ、公開してません)

javascript がオフの場合は、先頭フレームが正常に表示できること。
できれば、img タグを使用したいってな要件で作りました。

ココ とかでも使われているように、
動画はフレームを横方向に連結した
普通の画像をスクロールさせることで実現すれば OK ですね。

ちなみに、画像を横方向に連結する方法はこちら に書いてあります。

で、最初のフレームだけを表示するには、
画像を html でトリミングすることで実現できます。

調べてみると、css の object-fit プロパティを使うと
img タグのみでできそうなのでよさそうですが、
IE とかが対応していないみたいなので却下です。

あんまり美しくないですが、img を 親要素で
トリミングする方法を採用しました。

やり方はここ にありますね。

で、あとは、img の位置 (left) を javascript の
タイマー処理で左方向にずらしていけば OK です。

とりあえず、img タグの onload プロパティで javascript
オジェクトのインタンスを作成して実行してみましたが、
このサイトで HTML を検証 してみると、
there is no attribute "ONLOAD"
っていわれるから、あんまよくないのかも。

・・・

IE でも chrome でもちゃんと動くけど、どしよっかな。

ブログ著者のホームページはこちら です。


2017年08月28日(月)

コマンドラインで画像を連結する方法、ImageMagick

ImageMagick というツールを使うと
コマンドラインで、画像を加工できます。

使用したバージョンは、ImageMagick-7.0.5-Q16 です。

典型的な使い方としては、C:¥Program Files¥ImageMagick-7.0.5-Q16
にパスを通して、コマンドウィンドウからコマンドを発行します。

で、画像を連結するためのコマンドの使い方は、

magick.exe *.png -append tate.png

で縦連結。

magick.exe *.png +append yoko.png

で横連結です。

append オプション引数を入力画像リストと
出力画像リストとの間に挟む必要があるようです。

ちなみに、append オプションを最初の引数として
実行すると下記のようなエラーが発生しました。

magick: no images found for operation `+append' at CLI arg 1 @ error/operation.c/CLIOption/5246.
magick: no image to apply a property "%w" @ warning/property.c/GetMagickPropertyLetter/2561.
magick: unknown image property "%w" @ warning/property.c/InterpretImageProperties/3499.
magick: no image to apply a property "%h" @ warning/property.c/GetMagickPropertyLetter/2449.
magick: unknown image property "%h" @ warning/property.c/InterpretImageProperties/3499.
magick: no image to apply a property "%m" @ warning/property.c/GetMagickPropertyLetter/2480.
magick: unknown image property "%m" @ warning/property.c/InterpretImageProperties/3499.

謎のエラーですね。

あ、上記コマンドを繰り返して実行すると *.png
に出力画像 (tate.png とか yoko.png) が
マッチしちゃうので、注意してください。

ブログ著者のホームページはこちら です。


2017年08月17日(木)

phpseclib、RSA の sign、verify の使い方

今日も、こつこつコーディングしてたのですが、
特に、書くことも無いので、php のサンプルでも。

phpseclib で、sign、verify するときの注意点。

RSA で、電子署名するときには、秘密鍵、
署名が正しいか検証するときには公開鍵を使います。

とはいえ、秘密鍵には、公開鍵の情報も含まれているので、
秘密鍵で署名し、秘密鍵で検証することもできそうですが、
phpseclib では失敗するようです。

<?php
require '../lib/vendor/autoload.php';
use phpseclib¥Crypt¥RSA;

$rsa = new RSA();
extract($rsa->createKey());

$data = 'abc';

$sk = new RSA();
$sk->loadKey($privatekey);
$sign = $sk->sign($data);

echo 'verify by same: ';
echo $sk->verify($data, $sign) ? 'verified' : 'not verified';
echo '<br>' . "¥n";

$pk = new RSA();
$pk->loadKey($publickey);

echo 'verify by public: ';
echo $pk->verify($data, $sign) ? 'verified' : 'not verified';
echo '<br>' . "¥n";
?>

ちょっち、面倒だけど、
そういう仕様もありかな。

ご意見・ご要望連絡窓口


2017年08月04日(金)

Composer で、phpseclib をインストールするには?

最新版の phpseclib をインストールするには、
Composer とかいうやつを使うのが標準っぽいので
それで、インストールしてみました。

で、 コンポーザーの使い方はココ にあるのですが、
色々、表現が足りてないので補足します。

まず、最初の方にあるように、Composer は
プロジェクト毎に、ライブラリーを管理します。

例えば、あるプロジェクトと別のプロジェクトで
同じバージョンの phplibsec を利用する場合は、
2 個所に同じファイルをダウンロードすることになります。

ディスク容量は無駄になりますが、プロジェクト
ごとに、利用するバージョンが異なる場合に
対応するためでしょうね。

まぁ、シンプルでいい仕様だと思います。

Composer のインストール

Windows では、ココ にリンクがある Composer-Setup.exe
を実行すればインストールできます。

最初に、忘れたけど as developer みたいな
チェックボックスがでますが、ディフォルトで
オフみたいなので、そのままで行きました。

たぶん、Composer の開発をする人用の
チェックボックスだと思います。

次に、php.exe のパスを聞かれるので入れます。
自分の場合は、xampp でインストールされたやつ
を指定しましたが、何の問題も無さそうです。

インストールが終わったら、環境変数が更新されるので、
ログオフ / ログイン などして反映させます。

で、Composer がインストールされたかチェックするには、
コマンドプロンプトから、composer とか、
composer -V とか打ってみればわかります。

Composer で、phpseclib をインストール

最初に書いたように、Composer は
プロジェクト毎にライブラリーをインストールします。

具体的には、インストールしたいフォルダーに、
composer.json ファイルを作成します。

composer.json は、普通のテキストファイルで
phpseclib をインストールするには、↓ のような内容にします。

{
    "require": {
        "phpseclib/phpseclib": "2.0.*"
    }
}

あとは、composer.json のあるフォルダーから、
コマンドプロンプトで、composer install すれば OK です。

ちなみに、エクスプローラーで json のあるフォルダを
開いて、Shift を押しながら、右クリックすると、
「コマンドウィンドウをここで開く(W)」
メニューコマンドが表示される場合は、
それを使うと簡単ですよ。

現在のバージョンでは、json のフォルダーの下に
vendor¥phpseclib¥phpseclib¥phpseclib¥Crypt¥RSA.php
がインストールされました。(RSA は例です)

phpseclib を使う

json の下にできた vendor フォルダーにある
autoload.php を require すれば使用できます。

require '/vendor/autoload.php';

↑ こんな感じですね。

RSA クラスを使うには続けて、

use phpseclib¥Crypt¥RSA;

すると便利でしょう。

Composer の実体は、

"C:¥ProgramData¥ComposerSetup¥bin¥composer.bat"
にありました。バッチファイルですね。

中身は、php "%~dp0composer.phar" %* みたいな感じです。

なので、composer ... は
php composer.phar ... みたいに
展開されて実行されるわけですな。

phar は php のプログラムをまとめたものなので、
composer の実体は、composer.phar となります。

ご意見・ご要望連絡窓口


2017年08月01日(火)

PayPal IPN のコーディング終了

一応、PayPal 即時支払い通知(IPN) 用の
php コーディングが終わりました。

最後にテーブルの構造を見直したり、
コードを適切な場所に再配置したり、
関数名に一貫性をもたしたりしたのですが
ローカルウェブサーバーによる
開発の効率化がきいたおかげで、
すみやかに終了したような気がします。

やっぱり開発サイクルを可能なかぎり短かくすると
モチベーションが維持しやすくなっていいですね。

ご意見・ご要望連絡窓口


2017年07月31日(月)

PayPal IPN の開発効率を改善

先日から、PayPal 即時支払い通知(IPN) 用の
php コードを書いているのですが、
いちいち PayPal Sandbox で購入してみて
結果をメールで確認とかしてると
効率が悪すぎるので、改善することにしました。

改善のポイントは 2 つ。

1 つは、php を更新するたびに、
サーバーにアップする作業を
スキップするために、ローカルに
ウェブサーバーを立ち上げます。

2 つめは、いちいち Sandbox で
購入してみるのは大変なので、
Sandbox で購入したかのような
post データーを php に与えることで
シミュレートしちゃいます。

とはいえ、ローカルの php を
PayPal sandbox の IPN として
指定するのは無理なので、1 つめの
ポイントを達成するのにも必要な作業ですね。

PayPal Sandbox から IPN を呼びだしてもらう
場合、php の出力を見ることができないので、
メールで結果を送信して確認していましたが、
普通の html フォームから IPN を呼び出せば、
画面出力で結果を確認できるようにもなります。

2 つめのポイントの方が説明は
長かったですが、実装は、簡単です。

普通に、IPN に送られてくるデーターを
ポストする html フォームを書くだけです。

この場合、Sandbox にポストデーターを送って
verify することはできないのでスキップしますが、
もちろん、デバッグが終わったらスキップを
やめないと、まずいので注意が必要ですね。

PayPal sandbox から送られてきた ポストデーターの名前と値の組から
html を作成するには、HTML 自動生成するノ を使用しましたが、
手作業で変換しても、それほど大変ではないでしょう。

1 つめのポイントである、
ローカルにウェブサーバーを立ち上げる作業は
なんだかんだで、必ずはまるので
あんまりやりたくはなかったのですが、
やっぱり今回もはまりました。残念。

とりあえず、インストールは、前に使ったことのある
XAMPP てのを使いました。XAMPP は、Apache、PHP、MySQL
をセットでインストールできるパッケージだったのですが、
現在は、MySQL のかわりに、MariaDB がインストールされるみたいです。

Web で調べてみると、MariaDB は MySQL の派生で
今のところはかなりの互換性があるみたいなので、
とりあえずは気にせず使ってみることにしました。

httpd.conf の変更

ドキュメントルートの書き替え。 DocumentRoot とかその下にあった、 <Directory> のパスを変更しました。

php.ini の変更

結論だけかきますが、Mercury での メール送信はうまくいかなかったので、 xamppのfake sendmailを使ってローカル開発環境からメールを送信する
を参考に、Fake Sendmail を設定しました。

my.ini の変更

my.iniファイルの確認と修正 を参考に、sql の文字コードを utf-8 に変更。

よくわかりませんが、コメントアウトされていた
init-connect=¥'SET NAMES utf8¥'
を生かすと、phpmyadmin でエラーが発生します。

また、データーベースのユーザーを作成して
ログインした場合も、MySQL server has gone away
のエラーが発生するように。← ここではまる。

¥ をはずさないといけないようです。しまった!

でもなー。そのエラーメッセージは不親切だよー。
全然、わからんかったわ。

ご意見・ご要望連絡窓口


| 1/12PAGES | >>