<<
2015.4
>>
[nao-pon/blog] |
||||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
2 | 4 | |||||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 16 | 18 | ||
19 | 20 | 21 | 22 | 24 | 25 | |
26 | 27 | 29 | 30 |
XOOPS の d3forum で二重送信してしまう場合が結構あったので、jQuery でちょっと対応してみた。
フォーム送信時に submit ボタンが disabled だと、そのボタンのデータが送信されず、例えば d3forum だと「プレビュー」を押してるのに「送信」扱いになってしまうので、setTimeout で、disable 属性の付与をちょっとだけ遅延させてあります。
また、別窓で開くフォーム用に target 属性を持つフォームは除外し、念のため 15 秒後に再活性化するようにしてあります。
これを、HypCommon の設定の「その他の設定」-「<head>内の最後に挿入するタグ」に記述しておくと XOOPS サイト全体にこの機能が追加されます。
1
2
3
4
5
6
7
8
9
| - - | | | ! ! |
|
長文の投稿を書いている時に、間違ってブラウザ閉じてしまったり、ページ移動してしまったり、送信したらサーバーとの接続が切れてしまった!
OH MY GOD!
会心の出来だ!と喜んだのも束の間、奈落の底に突き落とされるような思いをすることが、たまにありますよね。
このような事態にみまわれると、投稿分の出来がよければよいほど、立ち直るのにしばらく時間が掛かってしまいます。
そんな、思いをしないため、させないために、ちょっとゴリゴリ jQuery で書いてみました。
テキストエリアに入力中にページ移動しようとしたりしてページが閉じられる前にブラウザが閉じていいのかを聞いてくれます。
さらに、万が一閉じてしまったり送信時にサーバーと接続できなかったりした時でも、次に開いた時にテキストエリアの下に「復元」ボタンが表示されるので、それをクリックすれば、ほらっ元通り!
<script type="text/javascript" charset="utf-8" src="hyp_form_rescue.js"></script>
などと、UTF-8 指定で <head> 内の jQuery を読み込んだ後に置くだけで OK です。 :ok:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | - | | | | | ! - | - - | | ! ! - - - - | ! ! ! | | | ! | | | | | | | | | | | | | | | | | | - | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ! | | - | ! - | ! | | - | | - | | | ! | | ! - | ! - | ! - | | - | | | | - - | ! ! - | | - | | ! | ! - | | ! | | - | | | - | - - | | | | ! - - | | | ! ! ! | | | | - - | | ! ! - - - | | ! ! ! ! ! ! - ! - - | | - | - | | | ! ! ! | ! ! |
|
Raspberry Pi 2 をウェブサーバーに仕立てて、PHP 5.6 系で XOOPS X を動かしてみると、大量の "Unknown Condition [8192]: Non-static method 〜" というエラーが表示されます。*1
「ん〜これは修正したい!」という欲望に駆られて着手してしまいました。
まずは、コアと XOOPS X でメンテナンスしているモジュールから手を付けます。
一番多いエラーは、MyTextSanitizer::getInstance() のエラーです。
MyTextSanitizer クラスの getInstance() に static キーワードが付いていないのに、静的に呼び出しているのが原因です。PHP 5.6 以前は、E_STRICT エラーだったものが、5.6 以降は E_DEPRECATED エラーとして出力されるようになったので、5.6 以降の環境では、大量にエラーレポートされるようになったわけです。*2
当初は、"error_reporting(E_ALL ^ E_STRICT ^ E_DEPRECATED)" にしてしまおうと思いましたが、E_DEPRECATED を隠してしまうと、将来サポートされなくなる問題点がわかりづらくなってしまうので、error_reporting はそのままにして、コード修正を行うことにしました。
本来なら MyTextSanitizer::getInstance() に static キーワードを付ければいいのですが、MyTextSanitizer クラスはモジュール側で継承クラスを持っていることが多く、安易に static キーワードを付けてしまうと Fatal エラーになってしまいます。
そこで、新しく static なメソッド sGgetInstance() を作って対応することにしました。
モジュール側では、
$ts =& MyTextSanitizer::getInstance();
としているところを
(method_exists('MyTextSanitizer', 'sGetInstance') and $ts =& MyTextSanitizer::sGetInstance()) || $ts =& MyTextSanitizer::getInstance();
などとします。
正規表現で置換するなら
(\$[\w>-]+)\s*=(\s*&)?\s*MyTextSanitizer\s*::\s*getInstance\s*\(\s*\)
を
(method_exists('MyTextSanitizer', 'sGetInstance') and $1 =$2 MyTextSanitizer::sGetInstance()) || $0
に置換するとよいと思います。
これらの一連の修正を、コアに関しては XOOPS X の pilot ブランチ、そして XOOPS X リポジトリのモジュールに対して行いました。ただ、まだまだ修正漏れやその他のエラーが表示されますので引き続きひまひまに作業していきます。
X-update で更新できます*3ので、テスト環境をお持ちの方は、ぜひ問題点をレポートして頂けると助かります。
jQuery で、動的に追加される DOM に対して、onready 関数内で hover イベントで処理する関数を登録しようとして、何も考えずに
$(parent).on('hover', '[セレクタ]', function(){...});
って書いたけど、案の定全然動かなかった。そりゃそうだ、hover イベントなんてない、jQuery オブジェクトの関数だ。
で、今度はちゃんと考えて
ってやったらちゃんとできた。というメモ書き。
PHP 5.6 系での動作確認のため、Raspberry Pi 2 に XOOPS X を入れて快調に動いている Raspoops ですが、XOOPS 123 marine さん作のテーマも全部入れて、その中から Snowland をデフォルトテーマにしています。
Snowland は、画面上方に各モジュールへのメニューが表示され、画面を下にスクロールして隠れそうになると position: fixed に切り替わり、常に場面上部に表示されるのでとても使い勝手がいいです。
当初、数個のモジュールを入れた状態では問題なかったのですが、動作検証ということで X-update でどんどん入れたら、メニュー部がど〜ん!って感じになってしまいました。
まあ、こんなに節操もなく数多くのモジュールを入れる人は、そうはいないでしょうからね。まったく、イレギュラーの状況だと思います。
そこで、ちょっとだけ手を入れさせて頂きました。
と、だいたいこんな感じです。
すっきりして、本文表示部が広くなりました (∩´∀`)∩ワーイ
素敵なテーマを数多く公開されている marine さんに、感謝感激です。 :shy:
自分自身へのメモ書きとして、今回改造した内容の diff を置いておきます。
手を入れたファイルは、_style.css と theme_ext_js.html の2つです。(_style.css は style.css です。style.css を添付するとこのページのスタイルシートとして使用されてしまうのでリネームしています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
|
Raspberry Pi2 で動いている Raspoops ですが、宅外からのアクセスは、この xoops.hypweb.net が動いている Apache をリバースプロキシにして Raspi の Neginx に転送しています。
今日、出先からちょっと調べたいことがあって Raspoops にアクセスしたら、あれ〜? Protector に BAN されてる!
ん?おかしいな?と思い帰宅後、宅内の PC から Raspoops の Protector を確認してみたら、「拒否 IP リスト」に 1行だけ等よくされていました。
192.168.x.x:1432299382
って。
あ!リバースプロキシにしてる Apache のサーバー IP じゃん!
Protector の設定では、ローカル IP は BAN 対象から外しているので、HypCommonFunc のスパム対策で登録されたのだと思います。
あぁ、そうか! Nginx に通知される REMORT_ADDR は、リバースプロキシのそれなんだぁ!と今更気付きました。
ということで、対策。
Apache からは、 X-Forwarded-For ヘッダで、アクセス元の IP が通知されているので、Nginx のほうでそれを REMOTE_ADDR にアサインすれば OK です。
server ディレクティブで
set_real_ip_from 192.168.x.x; real_ip_header X-Forwarded-For;
ってして Nginx を再起動すれば OK :ok: これで REMOTE_ADDR に実サクセス元 IP がセットされるので、Protector, HypCommonFunc のスパム対策が正常に働きます。
あーよかった。 :shy:
リバースプロキシで転送している場合は、REMOTE_ADDR を正しくセットしないと XOOPS でのスパム対策が意味を成さないから気をつけましょうというお話でした。
Raspberry Pi2 に、早くなってると巷で噂の PHP 7.0.0 をインストールして確かめてみました。
Nginx + PHP-FPM でバーチャルホスト機能を使いドキュメントルートは共用にして、pi2.hypweb.net を PHP 5.6.7 で、phpng.pi2.hypweb.net を PHP 7.0.0 で同じコンテンツが動くようにしてあります。
まずは、自前のプログラムからということで、xpWiki のデフォルトページの中でレンダリングに時間が掛かる FormattingRules のページで見てみました。
管理者でアクセスするとページ下部に表示されるレンダリング時間での計測です。
まずは、PHP 5.6.7
xpWiki 5.02.19 Copyright © 2006-2014 hypweb.net. License is GPL. Based on "PukiWiki" 1.4.8_alpha. Powered by PHP 7.0.0-dev. HTML convert time: 0.255 sec.
次は、PHP 7.0.0
xpWiki 5.02.19 Copyright © 2006-2014 hypweb.net. License is GPL. Based on "PukiWiki" 1.4.8_alpha. Powered by PHP 7.0.0-dev. HTML convert time: 0.255 sec.
おお!早いですねぇ :ok:
ページを移動してると、体感できるぐらい早いです。本リリースが楽しみですね。
ただ、XOOPS Cube Legacy は、PHP 4 時代のコードが残っているところがあるので、PHP 7 になったことで、かなり Deprecated エラーがレポートされます。動くには動くのですが、PHP デバグが有効だとエラー表示をコントロールしないと厳しいですね。
PHP 7 から、クラスのコンストラクタとしてクラス名と同じメソッドは、非奨励となったのでそのレポートが多いですね。エラーがレポートされないようにコードを修正すべきですが、今回のはかなり大変そうです。
とりあえず、PHP 7 はえ〜! というお話でした。