cookie の処理の問題、解決 2019-08-14 (水) 18:47:06+09:00

ソフトウェア

もう解決しました(笑)。

管理画面用プラグイン化した rnotepad.php のクラスの冒頭で <script> タグで直書きされていた javascript コードを、丸ごと変数に代入しておき、 disp() メソッドで作られるページの中身に javascript 部分を追加する形にすることで、他のプラグインの実行時に影響しないようにすることができた。

直書きされているとなぜ、動作設定プラグインの実行時にも javascript が出力されてしまうかというと、動作設定プラグインで「この内容で設定する」ボタンを押した場合に、値が post され ranoteadmin.php が読み込み直されるときに、ボタンの表示部分の処理で、全てのプラグインの require_once での読み込み処理が走り、そこで javascript が読まれて出力されてしまっていた。

今回は、これを、 rnotepad クラスの disp() メソッドが呼ばれたときにだけ出力するようにしたので、他のプラグインへの影響をなくすことができたというわけだ。

意外と早く完全な解決方法が見つかってよかった。

同時に、 config.php (動作設定プラグイン)のバグも修正することができた。

こちらは、setcookie() で cookie が設定されたときに、その設定内容がリロードされるまで $_COOKIE に変更内容が反映されないことに気づかず、 filter_input(INPUT_COOKIE,COOKIE_TESTFLAG) を実行して cookie の値を取得してしまっていたため、リロードがかかるまでラジオボタンの位置の変更が反映されなかった。 $_COOKIE[COOKIE_TESTFLAG] で読み取る方法に戻すことで、修正することができた。( setcookie() 直後に $_COOKIE に変更後の値を直接代入しておく処理はオリジナルの状態から書かれていた。)

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190814_184706405292.htm


うーん、困った 2019-08-14 (水) 14:37:23+09:00

ソフトウェア

rnotepad を管理者画面に組み込んだのは良かったが、問題が起きた。

「動作設定」を実現させているプラグイン config.php 内で cookie を使用しているのだが、 setcookie() 関数が動作しなくなってしまった。

理由を調べて分かったが、「setcookie」によると setcookie() は、

ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 や タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。

ということだが、 rnotepad.php では、 javascript を使用している。

それのどこがいけないかというと、 rnoteadmin.php の動作として、管理画面用のプラグインを順にファイルから require_once() で読み込む。そのとき読み込んだプラグイン内に javascript のコードが含まれていると、その場で

<script type="text/javascript"> 〜 </script>

が出力されてしまうのだ。その結果、 setcookie() は失敗する。

動作設定の画面で「この内容で設定する」ボタンを押すと、 config.php が呼ばれ、毎回上のような動作になるので、必ず setcookie() は失敗してしまう。

これを回避するには、先日実装したコールバックプラグインの機能を使い、新たに「 rnoteadmin.php が読み込まれ、管理画面用プラグインが読み込まれる前に実行するコールバック」を追加し実装するしかないが、そうすると、 config.php の処理が2つのファイルに分かれてしまい、見通しが非常に悪くなるのでやりたくない。

いっそ、 config.php の今の実装を見直し、「携帯用ページをテスト」のフラグを他の項目同様 cookie ではなく config.ini を用いるように変更してしまえば cookie を使わないので、とりあえず問題は回避されるが、 cookie を使わずに特定のブラウザからのみ携帯用ページを表示させてテストするという動作を実現させる方法が分からない。それに、 cookie の使用をやめて回避したのでは、今後 cookie を使用したくなったときに困るので、これは単なる逃げであり解決ではない。

う〜ん、これは困った・・・。どうすべきか。

この記事のリンク元 | 10 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190814_143723512439.htm


Linux で使える XML-RPC API を使って投稿ができる WYSIWYG エディタ付きの blog 投稿クライアントを探したのだが、 blogilo しか見つからなかった。

ところがこの blogilo 、 ubuntu ではディストリビューションのパッケージから既に削除されており、削除されていないディストリビューションのものを試してみたが、 WYSIWYG エディタが使えないほかにエラーを起こす部分が多数あることもわかった。これでは使えない。

wine を使って Open Live Writer を使えないかも調べたが、そもそも .Net アプリ自体が wine では壊滅状態で、まともに動作するものはないようだった。

こうなったら自作するしかないと思い、開発ツールを探したのだが、 .Net で GUI アプリを開発できる環境が monodevelop しかなかった。

で、 monodevelop でデザインモードを使用して GUI アプリを作れるのが Mono + GTK#2.0 という構成のみだった。

ところがこの構成で開発を試してみると、簡単なサンプルを作っただけで、自動的に作成されるソース generated.cs でエラーが起きる。

private void OnSizeRequested(object sender, Gtk.SizeRequestedArgs args)

というメンバ関数が自動生成されるのだが、このパラメータ args について、「 Gtk に SizeRequestedArgs が存在しない」というエラーなのだが、参照を開き gtk-sharp の中にある Gtk を見てみると、しっかり SizeRequestedArgs は存在しているのだ。なので間違いなく monodevelop のバグであり、ネットで検索するともう何年も前から、発生条件は違うようだがこのエラーが報告されているようだが、一向に修正されている様子がなかった。なのでコンパイル不可能という問題にぶちあたったため、ここで開発を断念することになった。

他にも monodevelop にはいろいろバグがあって、例えばデザインモードだが、新規プロジェクト作成で雛形を作ると MainWindow.cs でデザインモードが使えるのだが、一度プロジェクトを保存して開き直したり、それ以前に MainWindow.cs のタブをダブルクリックして何度か触ったりしただけで、もうデザインモードを開くことができなくなってしまうのだ。、裏技としてそれでも開く方法が見つかったが、それは、一度開いている MainWindow.cs のコードを閉じ、ファイルのツリーにあるファイル名を右クリックして「開く」を選ぶ方法でだけデザインモードが開くというやり方だ。他には、なんの前触れもなく突然終了することが非常に多いので、何かするたびに保存しておかないといけない。

Linux の開発環境って、思っていた以上にダメダメである。

1: 冬星 (08/08 00:38)
これは、新しい captcha image のテストです。
2: 冬星 (08/10 21:39)
2個目のコメントのテストです。
3: 冬星 (08/10 23:11)
3個目のコメントのテストです。
4: 冬星 (08/10 23:17)
2個目のコメントのテストです。
5: 冬星 (08/10 23:24)
5個目のコメントのテストです。
6: 冬星 (08/10 23:33)
6個目のコメントのテストです。
7: 冬星 (08/10 23:38)
7個目のコメントのテストです。
8: 冬星 (08/10 23:40)
8個目のコメントのテストです。
9: 冬星 (08/10 23:44)
9個目のコメントのテストです。
10: 冬星 (08/10 23:47)
10個目のコメントのテストです。
11: 冬星 (08/10 23:51)
11個目のコメントのテストです。
12: 冬星 (08/10 23:55)
12個目のコメントのテストです。
13: 冬星 (08/11 00:08)
13個目のコメントのテストです。
14: 冬星 (08/11 00:10)
14個目のコメントのテストです。
15: 冬星 (08/11 00:11)
15個目のコメントのテストです。
16: 冬星 (08/11 00:13)
16個目のコメントのテストです。
17: 冬星 (08/11 02:19)
17個目のコメントのテストです。
18: 冬星 (08/11 02:23)
18個目のコメントのテストです。
19: 冬星 (08/11 02:26)
19個目のコメントのテストです。
20: 冬星 (08/11 02:31)
20個目のコメントのテストです。
21: 冬星 (08/11 02:33)
21個目のコメントのテストです。
22: 冬星 (08/11 02:37)
22個目のコメントのテストです。
23: 冬星 (08/11 02:42)
23個目のコメントのテストです。
24: 冬星 (08/11 02:46)
24個目のコメントのテストです。
25: 冬星 (08/11 02:50)
25個目のコメントのテストです。
26: 冬星 (08/11 02:51)
26個目のコメントのテストです。
27: 冬星 (08/11 02:56)
27個目のコメントのテストです。
28: 冬星 (08/11 03:01)
28個目のコメントのテストです。
29: 冬星 (08/11 03:07)
29個目のコメントのテストです。
30: 冬星 (08/11 03:09)
30個目のコメントのテストです
31: 冬星 (08/11 03:10)
31個目のコメントのテストです。
32: 冬星 (08/11 03:11)
32個目のコメントのテストです。
33: 冬星 (08/11 03:13)
33個目のコメントのテストです。
34: 冬星 (08/11 03:16)
34個目のコメントのテストです。
35: 冬星 (08/11 03:19)
35個目のコメントのテストです。
36: 冬星 (08/11 03:22)
36個目のコメントのテストです。
37: 冬星 (08/11 03:29)
37個目のコメントのテストです。
38: 冬星 (08/11 03:42)
38個目のコメントのテストです。
39: 冬星 (08/13 00:42)
39個目のコメントのテストです。
40: 冬星 (08/13 13:46)
40個目のコメントのテストです。
41: 冬星 (08/13 14:39)
41個目のコメントのテストです。
42: 冬星 (08/13 14:52)
42個目のコメントのテストです。
43: 冬星 (08/13 14:53)
43個目のコメントのテストです。
44: 冬星 (08/13 14:56)
44個目のコメントのテストです。
45: 冬星 (08/13 15:00)
45個目のコメントのテストです。
46: 冬星 (08/14 14:00)
携帯からのコメント投稿のテストです。
この記事のリンク元 | 9 | 9 | 1 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190807_203947918314.htm


既に、記事の右上部分に表示されているカテゴリの表示名では対応していたが、画面上部にバー状態で表示しているカテゴリメニューと、画面左側に「コーナー」としてツリー形式で表示しているカテゴリの表示名も、 'works/software' を「冬星のソフトウェア」、 'works/novel' を「冬星のノベル」と表示できるようにした。

navitools.php を修正し、カテゴリキーをキーにとり、表示名を値に持つ連想配列を利用するようにした。

この記事のリンク元 | 14 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190805_002932804640.htm


php で、バッククォートとシングルクォート、ダブルクォートとの違いを知りたくなり、検索してみたのだが、なんと、この3つを比較し紹介しているサイトが一件も存在しなかったので驚いたので、下に紹介しておく。

・シングルクォート…文字列内の変数は展開しない。内部にあるダブルクォートはそのまま表示できる。内部にシングルクォート自身を表示する必要がある場合は '\' を前につける必要がある。

(例)

$foo="bar";

echo ’nakami=$foo’;

とすると、"nakami=$foo"と表示される。

・ダブルクォート…文字列内の変数を展開する。内部にあるシングルクォートはそのまま表示できる。内部にダブルクォート自身を表示する必要がある場合は '\' を前につける必要がある。

(例)

$foo="bar";

echo "nakami=$foo";

とすると、"nakami=bar"と表示される。

・バッククォート…文字列内の変数を展開し、バッククォートで囲まれた文字列をシェルコマンドとして実行し、結果の出力をすべて返す。

(例)

function foo()

{

$addr="xxx.xxx.xxx.xxx";

$ret=`nslookup -timeout=1 -retry=1 $addr`;

if (preg_match('/name = (.*).\n/', $ret, $out)){

return $out[1];

} else{

return $addr;

}

}

とすると、この例では nslookup -timeout=1 -retry=1 xxx.xxx.xxx.xxx の結果の出力が $ret に文字列として返される。結果に name = に続く部分のある行があった場合、その部分を表示し、なければアドレスをそのまま返している。

どのサイトも、ダブルクォートとシングルクォートの違いしか記載されておらず、バッククォートの比較がすっぽり抜けていることに大変驚かされた。それは不十分な解説というものだろう。

この記事のリンク元 | 15 | 11 | 2 | 1 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190801_153323728309.htm