タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2010/09/08/「確認」画面が必要な時 | msakamoto-sf | 2010-09-08 10:08:28 |
日記/2010/09/08/Webアプリの状態遷移と「戻る」ボタン | msakamoto-sf | 2010-09-08 09:57:58 |
日記/2010/09/06/「デバッガによるx86プログラム解析入門」読み終わった。 | msakamoto-sf | 2010-09-06 21:53:21 |
Emacs | msakamoto-sf | 2010-09-05 13:12:24 |
日記/2010/09/05/「やさしいEmacs-Lisp講座」読書メモ | msakamoto-sf | 2010-09-05 13:11:03 |
技術/vim/メモ2, ウインドウ, タブ | msakamoto-sf | 2010-09-04 13:43:46 |
C言語系/memos/VC++/11, 構造化例外処理と"/SAFESEH"リンカオプション | msakamoto-sf | 2010-09-02 18:23:02 |
技術/Windows/Matt Pietrek氏MSJ私家版PDF | msakamoto-sf | 2010-09-01 23:16:55 |
日記/2010/08/30/黒歴史の撲滅 | msakamoto-sf | 2010-08-30 22:08:19 |
PHP/Tips/parse_ini_fileで値に記号を使う時のPHP4<>5間の相違点 | msakamoto-sf | 2010-08-26 22:44:47 |
・入力フォームと、表示形式が大きく異なる時、「今入力した値が、実際はどう表示されるのか?」を確認してから保存したいので、「確認」画面が欲しい。
・入力内容を確認出来る、1クッションが欲しい。
・お金や個人情報のやり取りなどで、最終確認出来る1クッションが欲しい。
いずれにせよ、利用者の「不安感」を低減するためにも「確認画面」は有った方が良いと自分は思います。
最も、Twitterやチャットみたいな場面で「確認」画面を用意するのは冗長ですし利用者的にも煩わしさが先立つと思いますので、何が何でも「確認」画面が必要、というわけでは無いと思います。
Event-Drivenな状態遷移を管理する目的でXhwlayを作ったが、Webアプリケーションで使う上で一点だけ未解決の領域があります。
それはブラウザの「戻る」ボタンです。
「戻る」ボタンが押された時ですが、サーバーがクライアントキャッシュが効くようなHTTPヘッダーを送信していれば、ブラウザはHTTPリクエストは送信せず、自分で保存していたキャッシュを表示します。もしサーバーがキャッシュ無効なHTTPヘッダーを送信していれば、ブラウザはHTTPリクエストを再送信するでしょう。
ところがXhwlayの場合、「今どのページを表示しているのか」をサーバー側で保持することになります。
5画面に分かれたウィザード形式の入力フローを想定し、例えばユーザーが画面4まで進んだ後に画面2まで「戻る」ボタンで戻って入力をやり直したい、と思っても、Xhwlayの管理上はユーザーが今居る画面は画面4のままです。従って、画面2まで「戻る」で戻ったユーザーが入力値を修正して画面2の「次へ」ボタンをクリックしたとしても、Xhwlayの管理上では画面4に対して無効なイベントがリクエストされ、おそらくは無視され、ユーザーには画面4が表示されてしまいます。そのため、「前の画面に戻って入力をやり直す」イベントやそのためのボタンをアプリ側で用意する必要がありました。
これをどうやって解決するかですが、以前触ったAppleのWebObjectsにヒントがありました。
WebObjectsではURL構成要素の最後、fragment("#"以降)を使い、画面の履歴を裏側で保持しています。正確には画面表示に使う値をオブジェクトとして、fragmentの値に紐づけることが出来るようになっていて、WebObjectsが自動で管理してくれます。
これと「キャッシュ無効」を併せると、「戻る」ボタンでURLが再リクエストされると、そのfragmentから以前の画面表示に使われた値を取り出すことができ、以前の値を再表示可能になるという仕組みです。
・・・えっと、確かそんな感じでした。大筋は間違ってないと思います。とりあえずfragmentを履歴管理のIDとしているアイデアは間違ってないはず(;´Д`)。
もちろん、無限に履歴を保持することは出来ないので、上限数も設定出来るようになっていました(たしか50とかそれくらい。50ページも「戻る」で戻るのはレアケースなので実用上はこれでOKではないでしょうか。それ以上越えると、「これ以上戻れません」的なページが表示された記憶があります)。
つまり、「巻き戻し再生用のID」を用意すれば解決出来そうです。格好つけて「セーブポイント」と名付けてみましょう。この「セーブポイント」にその時点での「今居るページ」を保存しておけば、巻き戻しも出来るようになります。
さらにXhwlayの場合、ページフロー遷移中にフロート紐づけたいデータを「Bookmark Data」として保持していますので、これをその時その時の「セーブポイント」に履歴として保存しておく。
こうすれば、「戻る」で任意の「セーブポイント」まで戻り、その時点でのState, Bookmark-Dataに巻き戻し、なおかつそこから進め直す事が出来るようになる・・・筈、です。多分。
「セーブポイント」についてはBookmark-IDとは別でHTTPリクエストに含ませることになりますが、fragmentは避けたいです。JavaScriptや画面ナビゲーションで"#"以降を使いたい場合も有ると思いますので。
Bookmark-IDの後ろに、"."とか","で区切ってセーブポイントのIDを入れておくのが分かりやすいと思います。
しかしXhwlay単体だとやはり使いにくいです。毎回アプリ毎に作り込みが発生してしまう。
そろそろ、XhwlayのアイデアをCakePHPやSymfonyなど他のフレームワークに、プラグイン等の形式で移植するべきかも知れません。
ようやく読み終わりました。
OllyDbgなどデバッガを使ってWindows上のx86プログラムを解析するための入門書、まさしく名前の通りの内容です。一応前提知識についても網羅的に書かれていますが、個別の詳細までは解説されていません。本文中で詳解されている参考資料などを読み込んでおく必要があります。
少なくともPE/COFFフォーマットを理解し、アセンブラもある程度読むことが出来、Win32APIプログラミングの素養がないとキツイかも。というか自分は、そこまで勉強して、ようやく本書を読み終えることが出来ました。
Windows x86でのプログラム解析にまつわるトピックを広く浅く取りあげているので、さらにディープな領域に進みたいときの案内書として手元に置いておこうかと思います。
参考書籍:
※Emacsを使っていたのは2003年の1年間で、Emacs20/21時代の知識になります。既に古い知識になりますが、キーバインドの設定や、当時の.emacs.elに残された設定tipsはもしかしたらまた使うかも知れませんので、残しておきます。
「やさしいEmacs-Lisp講座」をさっくりと読み終えた。
これを最初に読んでいれば、Emacsを嫌いにならずに済んでいたと思う程の良書。
簡潔かつ明快に、Emacs-Lispの書き方のエッセンス、ポイント、基本的な概念を流れるようにスマートにコンパクトに学べる。
特に嬉しいのは、マニュアルやInfoだけでは分からない関数や構文の「つなげ方」を示してくれている点。
例えば"while"の説明では、「C言語のforやwhileのような繰り返しを行う時は~」で
(let ((i ?a)) (while (<= i ?z) (insert i) (setq i (1+ i))))
のような実践的なパターンを示してくれている。
個々の関数一つ一つの使い方を知るだけでは学べない、"Emacs-Lispならではの「お作法・パターン」"が随所に散りばめられており、ページ数に対する内容の濃さ・読みやすさは格別のものがある。
"Emacs-Lisp"というLisp言語の方言を解説してくれているのみならず、「Emacsというプラットフォーム」におけるEmacs-Lispの書き方のコツ・要点までを実にスマートに明快に示してくれている点が素晴らしい。
もしEmacsのカスタマイズ目的でEmacs-Lispの学習を始め、ASCIIやオライリーの分厚いEmacs(-Lisp)マニュアルに辟易しているのであれば、まずはこちらの一読をお奨めしたい。「なんだ、Emacs-Lispってこんなにコンパクトに学べるものだったんだ。」と目から鱗になるだろう。
Emacs-Lispを好きになりたい人全てにお奨め出来る、ピカイチの良著。
参考
・とりあえず編集中のウインドウを分割したい。
C-w s → 垂直方向 C-w v → 水平方向
・新しいファイルを開く時にウインドウを分割したい。
垂直方向 :new ファイル名
水平方向 :vnew ファイル名
・空っぽのウインドウで分割したい。
C-w n
個人的には「空っぽ」よりかは、":new ."でディレクトリ(Netrw)を開く方が好み。
・ウインドウを移動
C-w h/j/k/l
個人的には次の"C-w w"の方が単純で好き。
C-w w 次のウインドウに移動
基本的に垂直分割しか使ってないので。
・現在のウインドウを最大化
C-w _
・全てのウインドウサイズを揃える
C-w =
・新しいタブを開く
:tabnew (ファイル名) :tabedit (ファイル名)
・タブ切替
:tabnext or "gt" :tabprevious or "gT" :tabfirst :tablast
・タブ一覧と移動
:tabs :tabmove タブ番号
・オプション
set tabpagemax=15 ; 同時タブ表示数
set showtabline=0 ; タブバー非表示
(ファイル or ディレクトリ上で) "o" → ウインドウを分割し、新しいウインドウでファイル or ディレクトリを表示
(ファイル or ディレクトリ上で) "t" → 新しいタブでファイル or ディレクトリを表示
参考リンクのまとめメモです。
アセンブラ知識が必要。内容も非常に濃厚。
なぜ"/SAFESEH"を使うべきなのか?それはバッファオーバーフローを使ってスタック上に展開された例外ハンドラのアドレスを書き換える"SEH Overwiting Expoit"という攻撃を防止するためである。しかしロードされる他のモジュールの"/SAFESEH"有無やSoftwareDEPの有効・無効によって回避される場合もあり、万能ではない。
また"/SAFESEH"はx86のみ有効である点も注意が必要である。x64におけるSEHの仕組みについての解説記事へのリンクも載せているので、参照されたい。
Matt Pietrek氏のMicrosoft System Journalの記事で、個人的にPDFに変換した記事:
MSJのサイトは、フォントサイズが小さい/一行の幅が狭い/図やソースコードの一部が別ウインドウに開くなど、印刷してじっくり読みたい人には不向きなデザインになっています。tableタグを使ったレガシーHTMLなため、CSSを弄って全体のデザインを修正することも難しいです。
そこでOpenOffice Writerにコピペし、別ウインドウで開かれていた図やソースコードも本文に取り込み、印刷向けに整形してPDFに変換してみました。
著作権はMicrosoftにあるため、公開はしません、あくまでも私家版のPDFです。欲しい方はmsakamoto-sfまでその旨メール下さい。
思い出すだにおぞましい。
大学時代、2002年~2003年にかけてアルバイトで作成した某NPOサイトの某コンテンツ。
もう酒の席でのネタにしかならない、悪夢のような・・・いや、実際黒歴史のサイトが、つい一ヶ月前まで現役で動いていた。
ところが8月一杯でサイト全体がVPSに引っ越しとなり、ニート状態を良いことに二つ返事で引き受け、自分の黒歴史を滅殺せんがため、過去の自分の亡霊とおよそ3週間に渡り対峙してきたが、この度目出度く殲滅せしめた。
なんというか・・・こう、精神的に、いろいろ、疲れた。↑で書いたようなコードを直していくと、フレームワークを導入して、CSVで片づけていたN:M関係の管理もちゃんとテーブル切って・・・となって、「アレ?黒歴史のままの方が、汚いけど規模は小さくて済んでた?」という思いがわき上がってきて、「自分、「綺麗にする」とかいいつつ、規模を大きくしていくだけで何か下世話な事してる?」という疑問というか無力感というか単に自己満足なだけじゃねぇの的な厭な感情がわき上がってきて辛かった。
もう、Web開発に対して「ワクワク感」を感じられなくなってしまった。
parse_ini_file()の挙動がPHP4とPHP5の間で微妙に変わったりしています。自分は、値に記号(特に"$")を含んでいるケースで挙動の差異に遭遇しました。
php.netのマニュアル上では、「ini ファイル上の値に英数字ではないものがある場合、 ダブルクォート(")で囲う必要があります。」と記述されています。ところがPHP4の場合、特にダブルクォートで囲まなくとも読み込めるケースがあるため、マニュアルの記述に気づかずそのまま書いてしまい、PHP5に移行して上手く読めなくなりトラブルの原因となりました。
例:
test.ini:
key1 = value1 key2 = %value2% abc key3 = %1$s %2$s [%3$s] %4$s key4[] = E_USER_WARNING key4[] = "foo bar"
parse_ini_file.php:
<?php $r = parse_ini_file('test.ini'); var_dump($r);
PHP 4.4.9 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4[]"]=> string(7) "foo bar" }
※PHP4ではまだ配列形式のkeyがサポートされていない
PHP 5.2.10 (WinXP SP3):
> php parse_ini_file.php bool(false) ↓エラーメッセージ [26-Aug-2010 22:36:35] PHP Warning: Error parsing test.ini on line 3 \ in parse_ini_file.php on line 3
マニュアルの記述に従い、key3の値を""で囲めば、PHP5でも正常に読み込めます。
key1 = value1 key2 = %value2% abc key3 = "%1$s %2$s [%3$s] %4$s" key4[] = E_USER_WARNING key4[] = "foo bar"
PHP 4.4.9 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4[]"]=> string(7) "foo bar" }
PHP 5.2.10 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4"]=> array(2) { [0]=> string(3) "512" [1]=> string(7) "foo bar" } }
お察しの方もおられると思いますが、pear/LogのFileHandler、lineFormatをINIファイルで設定出来るようにしていたのです。PHP4の時代に作成したのをこの度PHP5に移し替えていたのですが、PHP4環境では問題なく出力されるのに、PHP5環境に移すとエラーになる、ということで調べてみた次第です。
他の言語と設定ファイルを共有したい場合はINIファイルが便利であることは確かですが、値のフォーマットについて今後のバージョンアップ時に何かしらトラブルが発生するかも知れないというリスクを考慮する必要がありそうです。
CakePHPやsymfonyなど、有名どころのフレームワークはいずれもINIファイルを使っていません。PHPだけで使うのであれば素直にPHPの配列を使うか、次点でYAMLなどを使う方向で今後は考えていきたいです。