|
≪ CGI / SSI≫ |
簡単なCGIカスタマイズ |
≪
≪
≪ その他 ≫
CGIカスタマイズ
≫-
ここでは、簡単に出来るカスタマイズとして幾つかの例を上げます。
メールヘッダ 「subject:」「To:」「From:」 のデコード
メールヘッダ 「subject:」「To:」「From:」 のデコードをISO-2022-JP、MIME encoded-wordとして、メール文字化けを防ぐ方法です。
(A) 生田さん開発 mime_pls(Perlライブラリ)の mimew.pl を使った、メールフォーム
ダウンロード : mime_pls
(B) 当サイト配布の b64mclib.pl を使った、メールフォーム
ダウンロード : Base64 Mail Convert library
Web Mail [E]での例1
#日本語コード変換ライブラリの場所 require './jcode.pl'; require './mimew.pl'; (A)の場合 require './b64mclib.pl'; (B)の場合 # ・ 省略 ・ sub sendmail{ &timeget; $formco = @SNADATE; $formco -= 1; &jcode'convert(*subje,'jis'); (B)の場合削除可 $subje = &mimeencode($subje); (A)の場合 b64mc::Bace64Encode(\$subject, 'jis', 1); (B)の場合 &jcode'convert(*title,'jis'); &jcode'convert(*TIME,'jis');
・ 赤文字の部分が、追加する記述部分です。 ・ ディフォルトでは、jis変換でメールヘッダに書き込んでいる為、2byte文字(日本語)をタイトルに使用している場合はOS、メーラーによっては文字化けの原因となります。 ・ で、上記のようにデーコードをすると回避出来ますのでお試し下さい。
Web Mail [E]での例
次は、差出人メールにもこれを利用して、ニックネーム付きメールにしてみます。
#日本語コード変換ライブラリの場所 require './jcode.pl'; require './mimew.pl'; (A)の場合 require './b64mclib.pl'; (B)の場合 # ・ 省略 ・ sub sendmail{ &timeget; $formco = @SNADATE; $formco -= 1; $tomail = "佐藤 <$masmail>"; &jcode'convert(*subje,'jis'); (B)の場合削除可 ▼ (A)の場合 $subje = &mimeencode($subje); &jcode'convert(*tomail,'jis'); $tomail = &mimeencode($tomail); ▼ (B)の場合 b64mc::Bace64Encode(\$subject, 'jis', 1); b64mc::Bace64Encode(\$tomail, 'jis', 1); &jcode'convert(*title,'jis'); &jcode'convert(*TIME,'jis');
・ 赤文字の部分が、追加する記述部分です。 ・ そしてその下部の方にある「"To: $masmail\n";」となっている箇所を「"To: $tomail\n";」として終わりです。(2箇所あります。)
ファイルデーター消滅回避の強化
当方配布のCGIもロックファイルを利用した、データー消滅回避処理をしていますがサーバーによってロックファイルが使えない等色々な原因で消滅が多発する場合もあると思います。
下記方法等、色々と回避方法を見直すのも良いかと思います。
EasyBBS [E]での例1
-------------- ディフォルト ------------- sub filedisp { if (!open(FILE,">$bbsdate")) { &unlock;&massehtml($no = 0); } eval 'flock(FILE,2);'; print FILE @BDATE; eval 'flock(FILE,8);'; close(FILE); } -------------- 編集後 ----------------- sub filedisp { $temp = $bbsdate . "_tmp"; if (!open(FILE,">$temp")) { &unlock;&massehtml($no = 0); } eval 'flock(FILE,2);'; print FILE @BDATE; #eval 'flock(FILE,8);'; close(FILE); if($#BDATE >= 0){ rename($temp,$bbsdate); } }
・ 上記の例は、投稿書き込みの際、一度テンポラリファイルを作りそこにデーターを書き込みます。 ・ そのテンポラリファイルでのデーターが消滅されていない事を確認($#BDATE >= 0)し、通常のファイル名にリネームするといった処理です。 ・ #eval 'flock(FILE,8);';のロック専用関数によるファイルロック解除のコメントアウトは、close(FILE);において自動的に解除されますので古いバージョンのperlでは特にコメントアウトした方が良いでしょう。 ※ symlink及びopenによるファイルロック(2重ロック)は、サブルーチン「filedisp」の前でも処理していますがまだ色々と良い方法(truncate、seek等を用いたりとか)があると思いますので色々と考えてみましょう。但し、100%のと言う処理は不可能ですので大切なデーターのバックアップは不可欠です。
- シグナルを用いた処理例
- 良くファイルロックが残ってしまうと言う方は以下の方法等を試してみるのも良いでしょう。
$SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{PIPE} = $SIG{TERM} = $SIG{KILL} = "unlock"; sub unlock { if (-e $lockfile) { unlink($lockfile); } }
- アラームシグナルを利用する場合。
$SIG{'ALRM'} = "timeout"; alarm(5); 処理文 alarm(0); sub timeout { print "Content-type: text/plain\n\n"; print "タイムアウトになりました。\n" exit; }
- 良くファイルロックが残ってしまうと言う方は以下の方法等を試してみるのも良いでしょう。
スマートフォン・タブレットでの閲覧を見やすくする
- 当サイト配布 [ WEB Blog ] を例にします。
HTMLヘッダーの書き出し部分に<META>タグを付け加えるだけです。
<META name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
※ あくまでも見やすくする為で、これだけでスマートフォン・タブレット用CGIになるわけではありません。
カスタマイズ : ./data/template/MainBaseA or B.dat の METAタグと同じ並びにでも ...<HEAD><TITLE>#BLOG_TITLE#</TITLE> <META http-equiv=Content-Type content="text/html ... 省略 ... <META name="viewport" content="width=device-width, ... 省略 ... <META http-equiv="pragma" content="no-cache" />
- その他の配布CGIについては ...
CGI内のサブルーチン [ sub header ] に<META>タグの記述がありますのでそこに続けて差加えます。
1 . print "<html><head><meta ... 省略 ... \n"; となっている場合。
print "<META name=\"viewport\" content=\" width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1\">\n";
※ <META>タグ内の ["] の前に[\]マークを付けるのを忘れないで下さい。
又は、シングルクォート[']で print する
print '<META name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">' . "\n";
2 . print <<"CANCELL"; <html><head> <META http-equiv=Content-Type ... 省略 ... ... 省略 .. CANCELL
のようになっている場合はそのまま、<head>〜</head>内に書き入れる。
- viewport content属性に付いて
width device-width : 端末画面にあわせる (数値設定も可 px) height device-height : 端末画面にあわせる (数値設定も可 px) user-scalable ズーム操作 拒否:no 許可:yes initial-scale 初期表示の倍率数値 maximum-scale 最大倍率の数値指定(0〜10まで、デフォルト: 0.25) minimum-scale 最小倍率の数値指定(0〜10まで、デフォルト: 1.6)
- 当サイト配布 [ WEB Blog ] を例にします。
おまけ? カレンダーをポップアップメモに
- 当サイト配布 [ Mini Diary ] を使います。
当ホームページの左下にあるカレンダーのように、下線の付いた日付にマウスをあてると ステータスバー及びポップアップでその日のメモが表示されます。
カスタマイズ : calender.pl 214行目〜open(LOG, "<$url"); while (
){ $_ =~ ... 省略 ... #$link = '<a class=Ca href="javascript ... 省略 ... # '\',\'' . $log . '\')">' ... 省略 ... $link = '<u><font onmouseover="window.status=\'' . $log . '\';return true;" style="cursor:pointer;" title="' . $log . '">' . $lname . '</font></u>' . "\n"; ・ 現在のコメントデータがある場合の処理部分をコメントアウトし赤文字の部分を追加し入れ替えをします。( # はコメントアウト ) ・ title = ポップアップ表示、window.status = ステータスバー表示となります。 ※ style="cursor:pointer;" はポインターを矢印から指にする為の記述です。
- 当サイト配布 [ Mini Diary ] を使います。
≪
シグナル
≫-
カスタマイズの項「シグナルを用いた処理」に関連し、シグナルについて少々....
シグナル一覧を参照する
telnet 又は プロンプト等で、killコマンドを参照します。
$ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG S TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2
シグナルとシグナルナンバー
SIGHUP 1 ハングアップ SIGSTOP 17 中断 SIGINT 2 割り込み SIGTSTP 18 SIGQUIT 3 終了 SIGCONT 19 SIGSTOPを再開 SIGILL 4 SIGCHLD 20 SIGTRAP 5 SIGTTIN 21 SIGABRT 6 SIGTTOU 22 SIGEMT 7 SIGIO 23 SIGFPE 8 SIGXCPU 24 SIGKILL 9 強制終了 SIGXFSZ 25 SIGBUS 10 SIGVTALRM 26 SIGSEGV 11 SIGPROF 27 SIGSYS 12 SIGWINCH 28 SIGPIPE 13 無プロセスパイプ SIGLOST 29 SIGALRM 14 アラーム SIGUSR1 30 ユーザー定義1 SIGTERM 15 終了 SIGUSR2 31 ユーザー定義2 SIGURG 16
≪ その他 ≫
Perlバージョンアップに伴う jcode.plエラー
- Perlバージョンアップに伴い標準エラー出力を吐くようになりました。
defined(%hash) is deprecated at /home/pmcj/cgisub/jcode.pl line 684. (Maybe you should just omit the defined()?)
defined(%hash) is deprecated at /home/pmcj/cgisub/jcode.pl line 693. (Maybe you should just omit the defined()?)
以下2箇所を修正します。
修正箇所 jcode.pl 684行目、693行目の [ defined ] を削除します。sub z2h_euc { local(*s, $n) = @_; &init_z2h_euc unless defined %z2h_euc; ← 684行目 $s =~ s/($re_euc_c|$re_euc_kana)/ $z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1 /geo; $n; } 修正前 : &init_z2h_euc unless defined %z2h_euc; 修正後 : &init_z2h_euc unless %z2h_euc; sub z2h_sjis { local(*s, $n) = @_; &init_z2h_sjis unless defined %z2h_sjis; ← 693行目 $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ... 省略 ... $n; } 修正前 : &init_z2h_sjis unless defined %z2h_sjis; 修正後 : &init_z2h_sjis unless %z2h_sjis;
・ 修正に不安のある方は、修正したjcode.pl(著作権 Utashiroさん)
を、とりあえず ダウンロード出来るようにしました。
※ 配布CGIの更新等での修正jcode.pl含む同封が終えるまで。
※ 17/06/28追記 元ファイルと紛らわしくなるようですのでファイル名を変更しました。
- Perlバージョンアップに伴い標準エラー出力を吐くようになりました。
楽天売れ筋プログラミング入門書 etc ... | |
|
|
|