| タイトル/名前 | 更新者 | 更新日 |
|---|---|---|
| 日記/2010/09/09/「BINARY HACKS」読み終わった | msakamoto-sf | 2010-09-09 12:54:00 |
| 日記/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 |
| SideBar | msakamoto-sf | 2010-09-04 22:37:45 |
| 技術/vim/メモ2, ウインドウ, タブ | msakamoto-sf | 2010-09-04 13:43:46 |
| 技術/vim/メモ1 | msakamoto-sf | 2010-09-04 13:43:20 |
| C言語系/memos/VC++/11, 構造化例外処理と"/SAFESEH"リンカオプション | msakamoto-sf | 2010-09-02 18:23:02 |
初版購入して4年間本棚に積まれていたが、やっと読み終えた。
教科書的な書き方はしていないのである程度の予備知識は要求されたが、トリビア・豆知識・雑学をあれこれつまみ食いしたり、広範囲に散らばりやすいLinux/UNIX世界のバイナリレイヤーの入り口をこの本一冊に集約するのに便利。binutilsのハンドブックとしても使える。
「なんでsoファイルを作る時は"-fPIC"が必要なんだろう」とか、「ld.soが実行可能でなおかつsoファイルとしてリンク可能なのはなんで?」等の疑問も解決出来た。
・入力フォームと、表示形式が大きく異なる時、「今入力した値が、実際はどう表示されるのか?」を確認してから保存したいので、「確認」画面が欲しい。
・入力内容を確認出来る、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 ディレクトリを表示
基本:「名無しのvim使い」を見ておきたい。
http://nanasi.jp/
「vimエディタで「文字コード、改行コードを変更して保存する。」」からの抜粋:
・文字コードの変更
:set fileencoding=文字コード :set fenc=文字コード (上のコマンドの短い形式。こちらでも良い。) :set fileencoding=euc-jp (エンコーディングEUC-JPに変更。) :set fileencoding=shift_jis (エンコーディングSHIFT_JISに変更。) :set fileencoding=utf-8 (エンコーディングUTF-8に変更。)
・ファイルフォーマットの種類の変更
:set fileformat=ファイルフォーマットの種類 :set ff=ファイルフォーマットの種類 (上のコマンドの短い形式。こちらでも良い。) :set fileformat=dos (改行をWindowsの形式に変更。) :set fileformat=mac (改行をMacの形式に変更。) :set fileformat=unix (改行をUnixの形式に変更。)
・ファイルが文字化けしている場合のエンコーディングの修正の手順
:e ++enc=utf-8 ... まず、ファイルを文字化けしない、正しいエンコーディングで開き直します。 :set fileencoding=euc-jp ... 変更したいファイルのエンコーディングをセットします。 :w ... 最後にファイルの保存を行います。
基本:「vimエディタ・スターターマニュアル #6 (複数のバッファの管理)」
http://nanasi.jp/articles/howto/user-manual/user-manual-buffer.html
・バッファ一覧
:ls
・バッファ一覧で確認出来たバッファ番号を使って、バッファを切替
:b バッファ番号
・非表示のバッファも含めて全て表示する。
:buffers!
・バッファを完全に解放する。
:bwipe
・大文字V → 複数行選択開始
・小文字v → 通常のビジュアル選択開始
以下はvimオンリー
・C-v → ビジュアルな矩形選択開始
参考リンクのまとめメモです。
アセンブラ知識が必要。内容も非常に濃厚。
なぜ"/SAFESEH"を使うべきなのか?それはバッファオーバーフローを使ってスタック上に展開された例外ハンドラのアドレスを書き換える"SEH Overwiting Expoit"という攻撃を防止するためである。しかしロードされる他のモジュールの"/SAFESEH"有無やSoftwareDEPの有効・無効によって回避される場合もあり、万能ではない。
また"/SAFESEH"はx86のみ有効である点も注意が必要である。x64におけるSEHの仕組みについての解説記事へのリンクも載せているので、参照されたい。
最新コメント10件
2009-03-21 by msakamoto-sf