<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2512452256115416753</id><updated>2011-11-20T18:21:37.345+09:00</updated><category term='dmg'/><category term='Grand Central Dispatch'/><category term='7 langs in 7 weeks'/><category term='論文'/><category term='pathway'/><category term='cappuccino'/><category term='dtraceソースコード'/><category term='MultiClutch'/><category term='probe point名の違い'/><category term='objective-j'/><category term='ps'/><category term='SQLite'/><category term='AOVCS-transport'/><category term='MegaZoomer'/><category term='Mercurial'/><category term='The Mac Hacker&apos;s Handbook'/><category term='bazaar'/><category term='xnu'/><category term='AOVCS-configuration'/><category term='git'/><category term='BitKeeper'/><category term='Bundle'/><category term='Solaris'/><category term='unescape'/><category term='vim'/><category term='eclipse'/><category term='file path'/><category term='launchpad'/><category term='hg'/><category term='TabMixPlus'/><category term='dtrace'/><category term='atlas'/><category term='x64'/><category term='Authorization Service'/><category term='d-script'/><category term='TLB'/><category term='binutils'/><category term='プロセスツリー'/><category term='sysctl'/><category term='Firefox 3.1'/><category term='Arch'/><category term='FullScreen'/><category term='Trace Optimizer'/><category term='AOVCS-web'/><category term='iAntiVirus'/><category term='Blogger'/><category term='coreutils'/><category term='AOVCS'/><category term='libxml2'/><category term='preview'/><category term='ovalenv'/><category term='io'/><category term='Google Analytics'/><category term='Firefox'/><category term='iPhone'/><category term='VCS'/><category term='posix_spawn'/><category term='mac'/><category term='fslogger'/><category term='mod_python'/><category term='vCard'/><category term='Emacs'/><category term='Intel'/><category term='Interface Builder'/><category term='ptex'/><category term='IA-32'/><category term='slides'/><category term='javascript'/><category term='tex'/><category term='Xcode'/><category term='テスト駆動'/><category term='Autotools'/><category term='ユーザ定義probe'/><category term='FSEvent'/><category term='アイコン'/><category term='Autodesk 123D'/><category term='xargs'/><category term='opensnoop'/><category term='x86'/><category term='execsnoop'/><category term='AOVCS-test'/><category term='AOVCS-GUI'/><category term='SystemTap'/><category term='Shark'/><category term='python'/><category term='Objective-C'/><category term='MPO'/><category term='AMD'/><category term='platex'/><category term='port'/><category term='OpenCL'/><category term='インストーラ'/><category term='fast strcmp'/><category term='AOVCS-bazaar'/><category term='gdb'/><category term='mount'/><category term='3DS'/><category term='コピーオンライト'/><category term='nib2cib'/><category term='AOVCS-benchmark'/><category term='volfs'/><category term='Snow Leopard'/><category term='PHP'/><category term='Carbon'/><category term='Google Chrome'/><category term='hello world'/><category term='bazaar plugin'/><category term='Ubiquity'/><category term='Linux'/><category term='Trace Reorderer'/><category term='雑記'/><category term='Cocoa'/><category term='CWD'/><category term='ソースコード'/><category term='fhopen'/><category term='Firefox 3.5'/><category term='論文調査'/><category term='キャッシュミス'/><category term='全画面'/><title type='text'>blog: pawo</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default?start-index=101&amp;max-results=100'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>241</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8815029192459703169</id><published>2011-11-20T15:58:00.003+09:00</published><updated>2011-11-20T18:21:37.449+09:00</updated><title type='text'>「Steve Jobs」を読んでの感想</title><content type='html'>ようやく「Steve Jobs」の上下巻を読み終えました。&lt;div&gt;MacBookAir と iPhone を使っているくらいには Apple 好きなので、この本にはだいぶ期待してました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ざっくりとした感想は、上巻は細かいジョブズの伝記という感じったのに対し、下巻はだいぶ Apple の歴史の方にシフトしていたのが残念だな、というところ。&lt;/div&gt;&lt;div&gt;上巻だったらジョブズはこう悩み、こう現実歪曲フィールドを展開し、こいつらと戦いという話が出ていたのが、下巻だと「悩み」の部分が少なかった印象です。&lt;/div&gt;&lt;div&gt;あと、下巻が時系列順ではなくて製品によって時期が転々と飛ぶのも、伝記としてはわかりづらいなーと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;逆にジョブズにあまり興味がない人も、下巻だけ読むと iPod とか iPhone の考え方がわかって良いと思います。&lt;/div&gt;&lt;div&gt;多分上巻は、ジョブズに多少なりとも興味がないと読めないと思いました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;下巻読んで、Apple だけじゃなくてジョブズにも興味持ったら上巻を読む、というのをお勧めします。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8815029192459703169?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8815029192459703169/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/11/steve-jobs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8815029192459703169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8815029192459703169'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/11/steve-jobs.html' title='「Steve Jobs」を読んでの感想'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2759618157344027855</id><published>2011-11-10T23:06:00.005+09:00</published><updated>2011-11-10T23:48:54.208+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xargs'/><title type='text'>コマンドラインでの並列実行: xargs</title><content type='html'>そこそこなシェルスクリプターなのですが、いまいち並列実行について知りません。&lt;br /&gt;make を使えば並列実行出来るのはわかるのですが、各ファイルに対して処理をするだけとかの場合にわざわざ Makefile を書くのもナンセンスだなと思います。&lt;br /&gt;&lt;br /&gt;そこで「シェルスクリプト　並列実行」あたりでググりました。&lt;br /&gt;そうすると、xargs とか GNU Parallels を使えばイー感じにできそうということです。&lt;br /&gt;&lt;br /&gt;■ xargs&lt;br /&gt;こことかで紹介されています。&lt;div&gt;&lt;span class="s2"&gt;技術メモ帳:&lt;/span&gt;&lt;span class="s2"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/lurker/20070117/1169039924"&gt;http://d.hatena.ne.jp/lurker/20070117/1169039924&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;xargs で順次実行する際に並列実行してくれるとのことです。&lt;/div&gt;&lt;div&gt;自分はよく -I を使うので、次の感じでやればいい感じです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;通常&lt;/div&gt;&lt;pre name="code"&gt;$ find . -type f | xargs -I {} shasum -a 256 {}&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;並列実行&lt;pre name="code"&gt;$ find . -type f | xargs -P 4 -I {} shasum -a 256 {}&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ためしに、Emacs.app 内の適当なelisp ディレクトリ内で上スクリプトを実行してみます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre name="code"&gt;$ time find . -name "*.el" | xargs -I {} shasum -a 256 {}&lt;br /&gt;..&lt;br /&gt;real 0m8.181s&lt;br /&gt;user 0m7.057s&lt;br /&gt;sys 0m0.938s&lt;br /&gt;&lt;br /&gt;$ time find . -name "*.el" | xargs -P 4 -I {} shasum -a 256 {}&lt;br /&gt;..&lt;br /&gt;real 0m3.642s&lt;br /&gt;user 0m11.469s&lt;br /&gt;sys 0m1.419s&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;find とかの時間もあるので単純な比較はできないですが、確かに早いです。&lt;/div&gt;&lt;div&gt;とりあえず、追加のインストールもなくさくっと使うにはよさそうです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;時間がなかったのでGNU Parallel はまた今度！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2759618157344027855?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2759618157344027855/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/11/xargs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2759618157344027855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2759618157344027855'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/11/xargs.html' title='コマンドラインでの並列実行: xargs'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-372291567879530724</id><published>2011-10-31T23:59:00.003+09:00</published><updated>2011-11-01T00:12:47.206+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emacs'/><title type='text'>Emacs + hi-lock 2</title><content type='html'>前回 hi-lock と isearch を統合するe-lisp をちょこっと書きましたが、これだと case-sensitive で使いづらいということに気づきました。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■例：runAsThread() という関数があり、それをハイライトしようとする&lt;/div&gt;&lt;div&gt;Ctrl-s Ctrl-w で現在位置の文字列を isearch すると、「runasthread」という文字列での検索になってしまいます。&lt;/div&gt;&lt;div&gt;これを、前回の e-lisp を使い、Ctrl-l でハイライトしようとすると、「runasthread」で登録されます。&lt;/div&gt;&lt;div&gt;しかし hi-lock だと case-sensitive なため、当初の目的である runAsThread がハイライトされません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■対処案&lt;/div&gt;&lt;div&gt;hi-lock.el を見ていると、hi-lock-process-phrase という関数があり、これは Capitalize (先頭文字だけ大小不問) でも大丈夫にするもののようです。&lt;/div&gt;&lt;div&gt;単に、「runAsThread」を「[rR]unAsThread」という正規表現に書き換えるだけですが。&lt;/div&gt;&lt;div&gt;ただこれを参考にすれば、case-insensitive という目的は、汚いですが「[rR][uU][nN]....[dD]」と書き換えてしまえば達成できます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、以下の e-lisp でゴリ押ししました。&lt;/div&gt;&lt;br /&gt;&lt;pre name="code"&gt;;; isearch-highlight&lt;br /&gt;(require 'hi-lock)&lt;br /&gt;&lt;br /&gt;(defun highlight-isearch-word ()&lt;br /&gt; (interactive)&lt;br /&gt; (let ((case-fold-search isearch-case-fold-search))&lt;br /&gt;   (isearch-exit)&lt;br /&gt;   (hi-lock-face-buffer-isearch isearch-string)))&lt;br /&gt;&lt;br /&gt;(defun unhighlight-isearch-word ()&lt;br /&gt; (interactive)&lt;br /&gt; (isearch-exit)&lt;br /&gt; (hi-lock-unface-buffer (highlight-to-ignore-case isearch-string)))&lt;br /&gt;&lt;br /&gt;(defun casemap (char)&lt;br /&gt; (replace-regexp-in-string&lt;br /&gt;  "\\&amp;lt;[a-z]" (lambda (m) (format "[%s%s]" (upcase m) m)) char))  &lt;br /&gt;&lt;br /&gt;(defun highlight-to-ignore-case (string)&lt;br /&gt;   (mapconcat (lambda (x) (casemap x)) (split-string string "") ""))  &lt;br /&gt;&lt;br /&gt;(defun hi-lock-face-buffer-isearch (string)&lt;br /&gt;   (setq face (hi-lock-read-face-name))&lt;br /&gt;   (or (facep face) (setq face 'hi-yellow))&lt;br /&gt;   (unless hi-lock-mode (hi-lock-mode 1))&lt;br /&gt;   (hi-lock-set-pattern (highlight-to-ignore-case string) face))  &lt;br /&gt;&lt;br /&gt;(define-key isearch-mode-map (kbd "C-l") 'highlight-isearch-word) &lt;br /&gt;(define-key isearch-mode-map (kbd "C-u") 'unhighlight-isearch-word) &lt;/pre&gt;&lt;br /&gt;&lt;div&gt;日本語、英語は確認しています。バックスラッシュが混ざるとアウトなのも確認済みです。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-372291567879530724?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/372291567879530724/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/10/emacs-hi-lock-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/372291567879530724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/372291567879530724'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/10/emacs-hi-lock-2.html' title='Emacs + hi-lock 2'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6338640574157581397</id><published>2011-10-29T21:19:00.009+09:00</published><updated>2011-10-31T23:59:37.508+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emacs'/><title type='text'>Emacs + hi-lock</title><content type='html'>vim を使う友人を見ていて羨ましいと思ったのが、検索文字列を強調したままにしておく機能です。&lt;div&gt;調べてみると、ちゃんと Emacs にもありました。hi-lock-mode だそうです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;        &lt;div&gt;&lt;b&gt;Meadow/Emacs memo&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;a href="http://www.bookshelf.jp/soft/meadow_35.html#SEC527"&gt;http://www.bookshelf.jp/soft/meadow_35.html#SEC527&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このサイトにはisearch との連携を良い感じにする e-lisp も置いてあり、そのまま使えばいいかと思ったのですが、どうもうまく動きません。&lt;/div&gt;&lt;div&gt;Wrong number of arguments: #[(regexp face) ... と言われてしまいます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;ということで、いー感じに e-lisp を修正する必要がありました。&lt;br /&gt;&lt;div&gt;どうせならということで、isearch したものを highlight から消すのもちょこっと追加しました。&lt;/div&gt;&lt;div&gt;それが以下です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;b&gt;(2011/10/31 追記)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;b&gt;この e-lisp だと、アルファベットの大小を区別してしまうため、あまりおいしくありません。&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" &gt;&lt;b&gt;ゴリ押しで対応した版の e-lisp を作成したので、そちらも参照ください。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre class="code"&gt;(require 'hi-lock)&lt;br /&gt;&lt;br /&gt;(defun highlight-isearch-word ()&lt;br /&gt;(interactive)&lt;br /&gt;(let ((case-fold-search isearch-case-fold-search))&lt;br /&gt;(isearch-exit)&lt;br /&gt;(hi-lock-face-buffer-isearch isearch-string)))&lt;br /&gt;&lt;br /&gt;(defun unhighlight-isearch-word ()&lt;br /&gt;(interactive)&lt;br /&gt;(isearch-exit)&lt;br /&gt;(hi-lock-unface-buffer isearch-string))&lt;br /&gt;&lt;br /&gt;(defun hi-lock-face-buffer-isearch (regexp)&lt;br /&gt;(interactive)&lt;br /&gt;(setq face (hi-lock-read-face-name))&lt;br /&gt;(or (facep face) (setq face 'hi-yellow))&lt;br /&gt;(unless hi-lock-mode (hi-lock-mode 1))&lt;br /&gt;(hi-lock-set-pattern regexp face))&lt;br /&gt;&lt;br /&gt;(define-key isearch-mode-map (kbd "C-l") 'highlight-isearch-word)&lt;br /&gt;(define-key isearch-mode-map (kbd "C-u") 'unhighlight-isearch-word)&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;hi-lock-set-pattern のパラメータを修正しただけですね。&lt;/div&gt;&lt;div&gt;あと、migemo を使っていないので、migemo を削ってあります。動作確認していないからなので、必要であれば追加してください。&lt;/div&gt;これで、isearch 中に Ctrl-l でその文字をハイライト、Ctrl-u でハイライトをキャンセルとなります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■便利な使い方&lt;/div&gt;&lt;div&gt;・カーソル位置の文字列を、バッファ全体で強調：Ctrl-s Ctrl-w で選択後、Ctrl-l&lt;/div&gt;&lt;div&gt;・カーソル位置にある強調文字列の強調をキャンセル：Ctrl-s Ctrl-w で選択後、Ctrl-u&lt;/div&gt;&lt;div&gt;・直前に強調した文字の強調をキャンセル：Ctrl-s Ctrl-s で直前のものを選択後、Ctrl-u&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-rcJeJ1rstqU/Tqv1cuSGx1I/AAAAAAAAE-s/7ByYJCfWoZ4/s1600/hi-lock.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 210px;" src="http://2.bp.blogspot.com/-rcJeJ1rstqU/Tqv1cuSGx1I/AAAAAAAAE-s/7ByYJCfWoZ4/s320/hi-lock.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5668894429785016146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6338640574157581397?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6338640574157581397/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/10/emacs-hi-lock.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6338640574157581397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6338640574157581397'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/10/emacs-hi-lock.html' title='Emacs + hi-lock'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-rcJeJ1rstqU/Tqv1cuSGx1I/AAAAAAAAE-s/7ByYJCfWoZ4/s72-c/hi-lock.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1746644984117539573</id><published>2011-09-06T00:16:00.012+09:00</published><updated>2011-09-06T00:58:49.809+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emacs'/><title type='text'>Emacs + hide-ifdef-mode の自分なりの使い方メモ</title><content type='html'>ifdef 多用なソースコードを多々見るので、ソースコードを見やすくしたいよねーという話をしました。Emacs で（大事）。&lt;div&gt;ということでちょっとググッてみました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;見つかったのはとりあえず２つ。&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;cpp-highlight-buffer&lt;/li&gt;&lt;li&gt;hide-ifdef-mode&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;どちらも、最初から Emacs に入っているもののようです。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ぐぐると cpp-highlight-buffer は設定が色々出来るようなのですが、わかりづらい！という印象。&lt;/div&gt;&lt;div&gt;ということで、単純な hide-ifdef-mode を使ってみました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■自分の目指す使い方&lt;/div&gt;&lt;div&gt;「どこかに利用する定数のリストを用意しておき、それを使って現在表示しているソースコードの ifdef 表示を切り替えたい！」&lt;/div&gt;&lt;div&gt;ということで、これをもう少し具体的な要求にすると次の形です。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ソースコードそれ自体には何も追加しない&lt;/li&gt;&lt;li&gt;何種類かの定数の組み合わせを簡単に切り替えられるようにしたい&lt;/li&gt;&lt;li&gt;ifdef が無効になっていることがわかりさえすれば、表示方法は気にしない&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを目指すと、以下の形で使うのが良さそうでした。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;予め hide-ifdef-mode、hide-ifdefs を有効にしておく&lt;/li&gt;&lt;li&gt;ザクッと切り替えられる elisp を書く&lt;/li&gt;&lt;li&gt;elisp をコピー(yank)する&lt;/li&gt;&lt;li&gt;M-: で、ミニバッファでの eval にして、コピーした elisp を eval&lt;/li&gt;&lt;/ul&gt;これで、ソースとは別に用意した elisp を使って定義する定数を切り替えられます。&lt;/div&gt;&lt;div&gt;例えば次の感じ。&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;;; .emacs に書く内容&lt;br /&gt;(add-hook 'c++-mode-hook&lt;br /&gt;    '(lambda ()&lt;br /&gt;       (hide-ifdef-mode t)&lt;br /&gt;       (hide-ifdefs)&lt;br /&gt;    ))&lt;br /&gt;;; 定数切り替えのスクリプト&lt;br /&gt;;; define-alist で定義しているのは、一時的に付けるリストの名前(l)と、define する定数(FOO, BAR2)&lt;br /&gt;((lambda () (setq hide-ifdef-define-alist '((l FOO BAR2)))(hide-ifdef-use-define-alist 'l)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;これでいい感じ。&lt;/div&gt;&lt;div&gt;もしソースコードをいじって良い環境であれば、上記の定数切り替えスクリプトをコメントとして貼っておいて、C-x C-e で eval するのが便利です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# 個人的には、define する定数が Emacs 内グローバルだと便利だと思うのですが、どうなんでしょうか？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1746644984117539573?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1746644984117539573/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/09/emacs-hide-ifdef-mode.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1746644984117539573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1746644984117539573'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/09/emacs-hide-ifdef-mode.html' title='Emacs + hide-ifdef-mode の自分なりの使い方メモ'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4387541761781943343</id><published>2011-08-18T23:21:00.003+09:00</published><updated>2011-08-19T00:04:27.398+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='7 langs in 7 weeks'/><title type='text'>自分なりのアクターモデルの解釈</title><content type='html'>７つの言語、７つの世界の Scala を読みました。&lt;div&gt;Ruby → Io → Prolog → Scala → ... なので、折り返しです。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;印象は、Ruby 並の動的な書き方を静的言語に持ってきているおかげで、「楽しくプログラミングできそう」というものでした。ちょっとシンタックスは不慣れですがｗ&lt;/div&gt;&lt;div&gt;あと、静的言語である以上、動的にクラスを書き換えるのは出来なさそうですが。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Scala の特徴で気になったのは、アクターモデルなるものです。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;これは、基本はスレッド間で共有する資源は無く、ただ必要なものだけは共有するという考え方のようです。&lt;/div&gt;&lt;div&gt;（アクターという考え方は Io にもあったのですが、Io は動的で遅めなのであまりクリティカルに見てませんでした・・）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最初の印象は「単にスレッドに制限入れただけじゃん」でした。それなら従来のスレッドで充分実現できるよね、って。&lt;/div&gt;&lt;div&gt;ただしばらくしてから、自分の恩師が「スレッドよりプロセスの方が安全でいいよね！」と言っていたのを思い出して、おっ！て。&lt;/div&gt;&lt;div&gt;つまりは「プロセスレベルのメモリ安全性をプログラミング言語が提供してくれてるんだ！」という気づきににやにやしてしまいました。あーなるほど、そう考えると凄い便利、って。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;原則共有で、たまにロックして守るというブラックリスト方式ではなく、原則非共有で、必要なものだけホワイトリストに追加して共有するという方が、確かに安全ですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、こうしたプロセスなどの OS が提供してきた機能を、プログラミング言語、コンパイラが提供してくれるようになるのかなという印象を、Scala を知ったことで持ちました。&lt;/div&gt;&lt;div&gt;次のパラダイムも OS の機能を考えたら視えるかもしれないですね。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4387541761781943343?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4387541761781943343/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4387541761781943343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4387541761781943343'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/08/blog-post.html' title='自分なりのアクターモデルの解釈'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8079320269189458426</id><published>2011-08-03T23:40:00.004+09:00</published><updated>2011-08-04T00:03:23.067+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='7 langs in 7 weeks'/><category scheme='http://www.blogger.com/atom/ns#' term='io'/><title type='text'>Io-language 二日目の課題</title><content type='html'>7つの言語 7つの世界を読み続けています。なかなか進まないですが。&lt;div&gt;今は Io-language の二日目です。課題やってます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;「シンタックスは15分で覚えられる」が確かに！と感動して、なかなか好きになりましたｗ&lt;/div&gt;&lt;div&gt;ということで、課題を真面目にやっています。でもなかなか難しい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;その自分なりの回答をメモっておきます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■フィボナッチ数列を、再帰とループを用いて解け&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;div&gt;FibRecursive := Object clone&lt;/div&gt;&lt;div&gt;FibRecursive fib := method(&lt;/div&gt;&lt;div&gt;        evaledArg := (call evalArgAt(0))&lt;/div&gt;&lt;div&gt;        if(evaledArg == 1 or evaledArg  == 2 ,&lt;/div&gt;&lt;div&gt;           1,&lt;/div&gt;&lt;div&gt;           (fib(evaledArg-1)) + fib(evaledArg-2)))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;FibLoop := Object clone&lt;/div&gt;&lt;div&gt;FibLoop fib := method(&lt;/div&gt;&lt;div&gt;        a := 1&lt;/div&gt;&lt;div&gt;        b := 1&lt;/div&gt;&lt;div&gt;        c := 0&lt;/div&gt;&lt;div&gt;        evaledArg := (call evalArgAt(0))&lt;/div&gt;&lt;div&gt;        i := 3&lt;/div&gt;&lt;div&gt;        while(i &amp;lt;= evaledArg, i = i + 1; c = a + b; a = b; b = c);&lt;/div&gt;&lt;div&gt;        b)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;f := FibRecursive clone&lt;/div&gt;&lt;div&gt;f := FibLoop clone&lt;/div&gt;&lt;div&gt;f fib(1) println&lt;/div&gt;&lt;div&gt;f fib(2) println&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いちおう解けてるはずです。&lt;/div&gt;&lt;div&gt;ただ、再帰でfib(25)位を計算すると随分時間がかかってしまいます。&lt;/div&gt;&lt;div&gt;再帰がここまで遅いのはちょっと残念。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに、eval しないと数値にならず Message のままであるというのがわからず、数時間はまってました・・&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■分母がゼロの時ゼロを返すように、/演算子を変換せよ&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;div&gt;origOp := Number getSlot("/")&lt;/div&gt;&lt;div&gt;Number / := method(number, if(number == 0, 0, (self origOp(number))))&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■二次元配列のすべての要素の総和を求めるプログラムを書け&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;div&gt;List dim2sum := method(&lt;/div&gt;&lt;div&gt;     result := 0&lt;/div&gt;&lt;div&gt;     foreach(i, v, result = result + (v sum));&lt;/div&gt;&lt;div&gt;     result)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;list(list(3, 3, 4), list(5, 5, 2)) dim2sum println&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;メソッド名を数字から始めることはできないんですね。最初 2dsum としていたらはまりました。&lt;/div&gt;&lt;div&gt;この場合、2 に大して dsum メッセージを送ることになります。&lt;/div&gt;&lt;div&gt;例えば 2type と打つと、Number と返ってきます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■リストに、そのリストのすべての数値の平均を算出するスロット myAverage を追加せよ&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;div&gt;List myAverage := method(&lt;/div&gt;&lt;div&gt;     foreach (i, v, ((v type) != (Number type)) ifTrue(Exception raise("Only number type acceptable")))&lt;/div&gt;&lt;div&gt;     sum / size)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■二次元リストを実現するプロトタイプを書け。また、転置メソッドを用意せよ&lt;/div&gt;&lt;div&gt;１次元配列にして、ゲッタ・セッタで隠蔽するようにしています。&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&lt;div&gt;Matrix := Object clone&lt;/div&gt;&lt;div&gt;Matrix dim := method(&lt;/div&gt;&lt;div&gt;       self x := (call evalArgAt(0))&lt;/div&gt;&lt;div&gt;       self y := (call evalArgAt(1))&lt;/div&gt;&lt;div&gt;       self l := list()&lt;/div&gt;&lt;div&gt;       for(i, 1, x * y, l append("")))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Matrix set := method(&lt;/div&gt;&lt;div&gt;       v := (call evalArgAt(0))&lt;/div&gt;&lt;div&gt;       w := (call evalArgAt(1))&lt;/div&gt;&lt;div&gt;       (v &amp;lt; x) ifFalse(Exception raise("Index error"))&lt;/div&gt;&lt;div&gt;       (w &amp;lt; y) ifFalse(Exception raise("Index error"))&lt;/div&gt;&lt;div&gt;       l atPut((v + w*x), (call evalArgAt(2))))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Matrix get := method(&lt;/div&gt;&lt;div&gt;       v := (call evalArgAt(0))&lt;/div&gt;&lt;div&gt;       w := (call evalArgAt(1))&lt;/div&gt;&lt;div&gt;       (v &amp;lt; x) ifFalse(Exception raise("Index error"))&lt;/div&gt;&lt;div&gt;       (w &amp;lt; y) ifFalse(Exception raise("Index error"))&lt;/div&gt;&lt;div&gt;       l at(v + w*x))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Matrix translate := method(&lt;/div&gt;&lt;div&gt;       result := Matrix clone&lt;/div&gt;&lt;div&gt;       result dim(self y, self x)&lt;/div&gt;&lt;div&gt;       tmp := 0&lt;/div&gt;&lt;div&gt;       for(i, 0, x-1, for(j, 0, y-1, tmp = get(i,j); result set(j, i, tmp)))&lt;/div&gt;&lt;div&gt;       result)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;評価を行うタイミングが、セッタを使うときになっているけど、それでいいのかな？と思っています。&lt;/div&gt;&lt;div&gt;ホントはゲッタでアクセスしたときでしょうか？&lt;/div&gt;&lt;div&gt;それとも eval せずに返すほうがいいのですかね？遅延評価の中で実際の評価をどこで行うべきかが難しいです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8079320269189458426?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8079320269189458426/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/08/io-language.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8079320269189458426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8079320269189458426'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/08/io-language.html' title='Io-language 二日目の課題'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8250299296774106288</id><published>2011-07-31T20:18:00.002+09:00</published><updated>2011-07-31T20:46:58.668+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='7 langs in 7 weeks'/><category scheme='http://www.blogger.com/atom/ns#' term='io'/><title type='text'>IO-language のビルド</title><content type='html'>今、「7つの言語 7つの世界」という本を読んでいます。&lt;div&gt;この本は、7つのプログラミングパラダイム (プログラミングの考え方、って考えればあっていると思う)を紹介する本で、なかなか楽しく読んでいます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;紹介している言語は、&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ruby&lt;/li&gt;&lt;li&gt;Io&lt;/li&gt;&lt;li&gt;Prolog&lt;/li&gt;&lt;li&gt;Scala&lt;/li&gt;&lt;li&gt;Erlang&lt;/li&gt;&lt;li&gt;Clojure&lt;/li&gt;&lt;li&gt;Haskell&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;です。&lt;/div&gt;&lt;div&gt;一言語あたり30ページ程度なので、一つあたりの説明がそこまで濃くないですが、自分にとっては目新しい言語ばかりでいい感じですｗ&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今 Io の章を読んでおり、せっかくなのでインストールして試しながらやろうと思っています。&lt;/div&gt;&lt;div&gt;で、インストールを試したのですが、なかなか苦戦しました。&lt;/div&gt;&lt;div&gt;そのメモです。環境は Mac OS X 10.6.8 + Xcode 3.2.6 で試しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■ リポジトリの取得&lt;/div&gt;&lt;div&gt;git-hub からリポジトリを取得します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;git clone https://github.com/stevedekorte/io.git&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■ Xcode で開く (extras/osxvm/osxvm.xcodeproj)&lt;/div&gt;&lt;div&gt;cmake と make でビルドしようとしましたが、どうもうまくいきません。&lt;/div&gt;&lt;div&gt;しかし Xcode で、次の修正をした上でビルドするとすんなり通ります。&lt;/div&gt;&lt;div&gt;なので自分は Xcode でのビルドのみ確認しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■Common_inline.h の修正&lt;/div&gt;&lt;div&gt;そのままビルドを行うと、以下のエラーがでます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;ld: duplicate symbol _List_size in &lt;/div&gt;&lt;div&gt;/Users/xxx/hobby/io/extras/osxvm/build/osxvm.build/Development/osxvm.build/Objects-normal/x86_64/Stack.o &lt;/div&gt;&lt;div&gt;and /Users/xxx/hobby/io/extras/osxvm/build/osxvm.build/Development/osxvm.build/Objects-normal/x86_64/List.o&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;List_size 関数が、List.o 上ではグローバルで、Stack.o 上では inline として定義されているみたいです。&lt;/div&gt;&lt;div&gt;inline なので static になってくれればいいのですが、どうも static にならないので、Duplicated になっているみたい。&lt;/div&gt;&lt;div&gt;なので、ただの inline ではなく static inline にすれば大丈夫だろう、と考えました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、libs/basekit/source/Common_inline.h を修正してみました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;diff --git a/libs/basekit/source/Common_inline.h b/libs/basekit/source/Common_in&lt;/div&gt;&lt;div&gt;index 1b122c1..3759d9f 100755&lt;/div&gt;&lt;div&gt;--- a/libs/basekit/source/Common_inline.h&lt;/div&gt;&lt;div&gt;+++ b/libs/basekit/source/Common_inline.h&lt;/div&gt;&lt;div&gt;@@ -46,7 +46,7 @@ Kudos to Daniel A. Koepke&lt;/div&gt;&lt;div&gt;        #else&lt;/div&gt;&lt;div&gt;                // in .h &lt;/div&gt;&lt;div&gt;                #define IO_DECLARE_INLINES&lt;/div&gt;&lt;div&gt;-               #define IOINLINE inline&lt;/div&gt;&lt;div&gt;+               #define IOINLINE static inline&lt;/div&gt;&lt;div&gt;        #endif &lt;/div&gt;&lt;div&gt; #elif defined(__MINGW32__)&lt;/div&gt;&lt;div&gt;        #ifdef IO_IN_C_FILE&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これで上のエラーは無くなります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;■ビルド&lt;/div&gt;&lt;div&gt;あとは、Xcode でビルドすれば、osxvm がビルド出来ます。&lt;/div&gt;&lt;div&gt;出来たバイナリを適当なディレクトリに突っ込めば終わり。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8250299296774106288?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8250299296774106288/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/07/io-language.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8250299296774106288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8250299296774106288'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/07/io-language.html' title='IO-language のビルド'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1096208158204805699</id><published>2011-07-18T19:00:00.009+09:00</published><updated>2011-07-18T19:39:03.089+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MPO'/><category scheme='http://www.blogger.com/atom/ns#' term='Autodesk 123D'/><category scheme='http://www.blogger.com/atom/ns#' term='3DS'/><title type='text'>Autodesk 123D でさるぼぼつくって、いろんな視点で MPO にして 3DS で表示できるようにしてみました</title><content type='html'>Autodesk さんが、Autodesk 123D なる無料で使える 3D CAD を出していて、大変使ってみたくなりました。&lt;div&gt;&lt;a href="http://www.123dapp.com/"&gt;http://www.123dapp.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あと、3DS を持っているのですが、そのブラウザで 3D 写真を見るのが案外楽しいです。&lt;/div&gt;&lt;div&gt;例えばこのサイトで、3DS の 3D 写真(MPOフォーマット)をアップロード出来、見ることが出来ます。&lt;/div&gt;&lt;div&gt;HAGERIUM &lt;a href="http://hage.my-sv.net/"&gt;http://hage.my-sv.net/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで。&lt;/div&gt;&lt;div&gt;Autodesk 123D でモデリングして、MPO を作ってみるしかない、と思いました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最初に今回 Autodesk 123D で作成したモデルである、さるぼぼくんを。&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-ndA8GEO0yas/TiQHXT54x6I/AAAAAAAADaM/mIpDgO073GE/s320/right.png" style="cursor:pointer; cursor:hand;width: 320px; height: 146px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5630633531181418402" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;機械設計は結構書いたことがあったのですが、こういうモデルは書いたことなくてむっさ苦労しました・・・。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;では、作り方とか解説は省略して、視点を表す図と MPO を上げておきます。&lt;/div&gt;&lt;div&gt;MPO の作成は、StereoPhoto Maker を使っています。&lt;/div&gt;&lt;div&gt;&lt;a href="http://stereo.jpn.org/jpn/stphmkr/"&gt;http://stereo.jpn.org/jpn/stphmkr/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 立体視なし&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/-A0f6P8k_u8U/TiQGYNEOPLI/AAAAAAAADZk/bHrNBIlLUQ4/s320/top-center-1.png" style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5630632447013960882" /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/544268/mpo/center-front.mpo"&gt;http://dl.dropbox.com/u/544268/mpo/center-front.mpo&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. 立体視あり&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-lKC0pbvk2Lg/TiQGYVUjMpI/AAAAAAAADZs/e3Kx8aENLRA/s320/top-center-2.png" style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5630632449229927058" /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/544268/mpo/center-angle1.mpo"&gt;http://dl.dropbox.com/u/544268/mpo/center-angle1.mpo&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3.さるぼぼが画面の奥にいる感じ&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-u-NuMouj9Qs/TiQGYnUawEI/AAAAAAAADZ0/yqaUJIsCPNM/s320/top-backword-2.png" style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5630632454061211714" /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/544268/mpo/backward-angle1.mpo"&gt;http://dl.dropbox.com/u/544268/mpo/backward-angle1.mpo&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. さるぼぼが画面から飛び出す&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-sPruMH47pKk/TiQGY735jKI/AAAAAAAADZ8/av1EYBBkO5s/s1600/top-forward-2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" src="http://3.bp.blogspot.com/-sPruMH47pKk/TiQGY735jKI/AAAAAAAADZ8/av1EYBBkO5s/s320/top-forward-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5630632459578739874" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/544268/mpo/forward-angle1.mpo"&gt;http://dl.dropbox.com/u/544268/mpo/forward-angle1.mpo&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;5.視点が並行&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/-uoW4RpeNsg0/TiQGZbnhtiI/AAAAAAAADaE/VptH6pPstkM/s320/top-center-flat.png" style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5630632468100003362" /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/544268/mpo/center-flat.mpo"&gt;http://dl.dropbox.com/u/544268/mpo/center-flat.mpo&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1096208158204805699?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1096208158204805699/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/07/mpo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1096208158204805699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1096208158204805699'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/07/mpo.html' title='Autodesk 123D でさるぼぼつくって、いろんな視点で MPO にして 3DS で表示できるようにしてみました'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ndA8GEO0yas/TiQHXT54x6I/AAAAAAAADaM/mIpDgO073GE/s72-c/right.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4694823874921986626</id><published>2011-05-24T23:32:00.010+09:00</published><updated>2011-05-25T21:39:46.678+09:00</updated><title type='text'>Emacs + auto-complete-clang</title><content type='html'>ちょっと Xcode について徘徊していたら、auto-complete-clang なるものを発見。&lt;div&gt;Emacs の auto-complete の補完を、Eclipse や Visual Studio のように候補となるメソッド名で出来るようにするものみたい。&lt;/div&gt;&lt;div&gt;次のが手元で試した際の動作例。たしかに、Hoge::Fugaなどが補完候補にでてきててすごい！&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/-SaOexOTOPp8/Tdz2RHieyiI/AAAAAAAADGI/yCbpv2v50mw/s320/clang.png" style="cursor:pointer; cursor:hand;width: 480px; height: 340px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5610630009738676770" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ひとまずこのサイト( &lt;a href="http://www.nomtats.com/2010/11/auto-completeelemacs.html"&gt;http://www.nomtats.com/2010/11/auto-completeelemacs.html&lt;/a&gt; )にしたがって、&lt;a href="https://github.com/brianjcj/auto-complete-clang/tree/"&gt;auto-complete-clang.e&lt;/a&gt;l をインストール。&lt;/div&gt;&lt;div&gt;.emacs に上記サイトの elisp をそのまま追記して試してみた。でも動かず。&lt;/div&gt;&lt;div&gt;エラーをみると、auto-complete-config (ac-configだったか?) が無いとのこと。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そういえば、手元の auto-complete.el は手動でインストールしたもので古いなーと思ったので、一度削除して、auto-install-batch を使って改めてインストールし直し。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;----------&lt;/div&gt;&lt;div&gt;auto-install-batch は、「Emacs テクニックバイブル」で紹介されている、auto-install.el の機能。Emacs Lisp プログラムを自動でインストールしてくれます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://d.hatena.ne.jp/rubikitch/20091221/autoinstall"&gt;http://d.hatena.ne.jp/rubikitch/20091221/autoinstall&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;M-x auto-install-batch  として、auto-complete を探せば見つかるはず。&lt;/div&gt;&lt;div&gt;----------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そしたら無事、clang がコンパイルを実行するところまでは動いたみたい。&lt;/div&gt;&lt;div&gt;でも、コンパイルでエラー。stdafx.pch を用意してないからいけない模様。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;先のサイトの"&lt;span class="Apple-style-span" style="font-family: 'Andale Mono'; font-size: 13px; "&gt;&lt;span class="s1"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;setq&lt;/span&gt; ac-clang-prefix-header &lt;span class="s3"&gt;"stdafx.pch"&lt;/span&gt;&lt;span class="s1"&gt;)&lt;/span&gt;&lt;/span&gt;" をコメントアウトすれば動くようになるので、ひとまずそうやって動作を確認。&lt;/div&gt;&lt;div&gt;ただ、補完しようとする際結構もさっとするので、やっぱプリコンパイルヘッダを用意しないと非効率みたい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、今度はプリコンパイルヘッダを使えるようにする。と言っても以下のサイトを参照するとすぐ。&lt;/div&gt;&lt;div&gt;&lt;a href="http://d.hatena.ne.jp/whitypig/20110306/1299416655"&gt;http://d.hatena.ne.jp/whitypig/20110306/1299416655&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;自分がよく使うヘッダファイルをずらずら書き連ねて、それをプリコンパイルするだけ。&lt;/div&gt;&lt;div&gt;その成果物として、stdafx.pch が出来る。&lt;/div&gt;&lt;div&gt;あとはこれを、clang がアクセスする場所においておけばいい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とりあえず、現在編集している*.cpp ファイルのある場所に置いておけば参照してくれる。&lt;/div&gt;&lt;div&gt;なので、*.cpp とか Makefile とかの、プロコン用 *.cpp のためのテンプレの中に、先ほど作成した stdafx.pch 突っ込んでおきました。&lt;/div&gt;&lt;div&gt;ひとまずこれで、単一ファイルの *.cpp は大変快適になったはず。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただ、複数ファイルに分かれる場合どうなるんだろう？プリコンパイルヘッダ使ってしまうと、それ以外のヘッダ読み込んでくれなかったりしないのかな？&lt;/div&gt;&lt;div&gt;冷静に考えると、プロジェクトごとにプリコンパイルヘッダをつくることになりそう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4694823874921986626?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4694823874921986626/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/05/emacs-auto-complete-clang.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4694823874921986626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4694823874921986626'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/05/emacs-auto-complete-clang.html' title='Emacs + auto-complete-clang'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-SaOexOTOPp8/Tdz2RHieyiI/AAAAAAAADGI/yCbpv2v50mw/s72-c/clang.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-9111053384732353624</id><published>2011-04-14T23:22:00.002+09:00</published><updated>2011-04-14T23:28:43.305+09:00</updated><title type='text'>ぼそっ</title><content type='html'>自分は、「自分に厳しく、人に厳しく」という感じで生きてきた。&lt;br /&gt;そのほうが、最終的に良い結果になると思っていたから。&lt;br /&gt;もちろん厳しいだけじゃなくって、その分助けて、助けてもらって、頑張ってきたつもり。&lt;br /&gt;&lt;br /&gt;気に入った人は、逆に、厳しくした気がする。&lt;br /&gt;&lt;br /&gt;でもそれじゃだめなんだ、ずっと後悔して、考えて。&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-9111053384732353624?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/9111053384732353624/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9111053384732353624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9111053384732353624'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post_14.html' title='ぼそっ'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-3160612826582529393</id><published>2011-04-13T22:43:00.002+09:00</published><updated>2011-04-13T23:50:59.143+09:00</updated><title type='text'>エコノムーブはこの先どーする？</title><content type='html'>地震とかで大変で、大会があるのかわからないけれども、二年前のエコノの知識をもってこの先どーなるのか考察してみる。&lt;br /&gt;実際作る時間とかは無いはずなので、あくまで妄想でしかないけれどｗ&lt;br /&gt;&lt;br /&gt;基礎知識。エコノムーブの三大損失。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;転がり抵抗[W] 速度の1乗に比例&lt;br /&gt;&lt;/li&gt;&lt;li&gt;空気抵抗[W] 速度の3乗に比例。風の方向から見たときの面積 (前方投影面積)の1乗に比例。形状に依存&lt;br /&gt;&lt;/li&gt;&lt;li&gt;電気損[W] その他&lt;/li&gt;&lt;/ul&gt;今後記録が伸びていくことを考えると、速度の3乗が問題の空気抵抗をいかに減らすかが課題。&lt;br /&gt;なので、多少重くなっても、いかに空気抵抗を減らすかの勝負になるはず。&lt;br /&gt;それで考えるのが、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;トレッドをせまく&lt;/li&gt;&lt;li&gt;外部はカメラで見る&lt;/li&gt;&lt;li&gt;全高はそのまま、地上高をがっとあげる&lt;/li&gt;&lt;/ul&gt;こんなところ。こうすると、きっと人を真上 or 真下から見たときの前方投影面積に近くなると思う。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;問題は、コーナーが圧倒的に脆弱になること。トレッドが狭く、地上高が高かったら、すぐに横転してしまうはず。&lt;br /&gt;これは、車体をかたむける機構を導入すれば万事解決でなかろうか？&lt;br /&gt;地上高が高いのも、傾けるの前提になればまがりやすさにつながりもするはずだし。&lt;br /&gt;&lt;br /&gt;# 2輪という選択肢もある&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-3160612826582529393?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/3160612826582529393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post_13.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3160612826582529393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3160612826582529393'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post_13.html' title='エコノムーブはこの先どーする？'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6881573784932156407</id><published>2011-04-10T23:29:00.004+09:00</published><updated>2011-04-11T00:10:02.978+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><title type='text'>Windowsでどーやってログをとる？</title><content type='html'>初期（評価）版AOVCSは、Mac で作った。&lt;br /&gt;これは、その時点で dtrace を知っていて、それを使えばほしいトレースが取れるとわかっていたから。（とは言っても、実際に本当に必要な情報を取得しようとしたら相当苦労したけれども）&lt;br /&gt;&lt;br /&gt;※ほしいトレース&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ファイルの操作ログ （どのファイルをどういう処理した？）&lt;br /&gt;&lt;/li&gt;&lt;li&gt;操作を行ったプロセス名、その親のプロセス名、親の親のプロセス名、、&lt;/li&gt;&lt;li&gt;プロセス系のシステムコール (親のプロセス名を取得するため)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Linuxに移植しようとしたら、同等、あるいはそれ以上の機能を提供するSystemTapを使えばOK。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回Windows に移植するとすると、このログ相当のものをどうやって取得するかが問題になる。&lt;br /&gt;Windowsのシステムコール監視とか、どうやってやるのか全然詳しくない。&lt;br /&gt;ということで調査しました。&lt;br /&gt;&lt;br /&gt;1. FileSystemWatcher&lt;br /&gt;http://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewatch.html&lt;br /&gt;指定したディレクトリ以下のファイル操作を、Notification として教えてくれる API。&lt;br /&gt;ファイル操作のログを取得するということであれば、これで充分だが、今回アプリケーション名を取得しないと意味がないため、不十分。&lt;br /&gt;(上記ページの、NotifyFilters 参照）&lt;br /&gt;&lt;br /&gt;2. Directory Change Notifications&lt;br /&gt;http://msdn.microsoft.com/en-us/library/aa365261(v=vs.85).aspx&lt;br /&gt;ちょっと良く調べてないけれども、機能的には上記FileSystemWatcher のC言語でのAPIに視える。&lt;br /&gt;要調査。&lt;br /&gt;&lt;br /&gt;3. tracelog&lt;br /&gt;http://msdn.microsoft.com/en-us/library/ff552961(v=VS.85).aspx&lt;br /&gt;いろんなところにtraceを仕掛けられるらしい、Windows Driver Kit の中のツール。&lt;br /&gt;dtrace 的なカンジがするので、現状これを調べているところ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;管理者権限で実行しないといけない（シェル起動を、右クリック-&amp;gt; 管理者権限）&lt;/li&gt;&lt;li&gt;プロバイダ (トレースポイント) に何があるかイマイチわからない&lt;/li&gt;&lt;li&gt;TraceView という、tracelog のGUI版でみる限り、あまり情報が取得できない？ (ファイル名が取れてない、Process ID が取れてない）&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;とかな状態。もっとこの機能は調べないとわからないですね。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ZfbGVGg5OcQ/TaHHwgTS4FI/AAAAAAAACto/PbIaQ4Fs0lg/s1600/traceview.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 151px;" src="http://4.bp.blogspot.com/-ZfbGVGg5OcQ/TaHHwgTS4FI/AAAAAAAACto/PbIaQ4Fs0lg/s320/traceview.png" alt="" id="BLOGGER_PHOTO_ID_5593971848289378386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;とりあえず上記の画面は、Create New Log Session -&amp;gt; Add Provider -&amp;gt; Kernel Logger (Process, File I/O ) -&amp;gt; OK でとっている情報。system.tmfは、 WinDDK/*/tools/tracing/amd64/内にあります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6881573784932156407?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6881573784932156407/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/windows.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6881573784932156407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6881573784932156407'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/windows.html' title='Windowsでどーやってログをとる？'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ZfbGVGg5OcQ/TaHHwgTS4FI/AAAAAAAACto/PbIaQ4Fs0lg/s72-c/traceview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-769795725265585599</id><published>2011-04-08T22:47:00.002+09:00</published><updated>2011-04-08T22:52:29.625+09:00</updated><title type='text'>ブログ復帰？</title><content type='html'>Windows版のAOVCSデーモンと、Git用のAOVCS拡張を作る計画をしています。&lt;br /&gt;夜とかにこつこつと調べてやるつもりですが、出来るかなー？&lt;br /&gt;&lt;br /&gt;■こんな感じ&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ファイルのメタデータとして、ファイル作成ログはつけたい。無理なら、汎用的なメタデータをつける仕組みを用意することにする。削除ログはどちらにせよメタデータの仕組みを用意しないといけない&lt;/li&gt;&lt;li&gt;GitのStaging Areaはひとまずあきらめる。従来と同じ全部コミット型。もったいないけど&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-769795725265585599?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/769795725265585599/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/769795725265585599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/769795725265585599'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2011/04/blog-post.html' title='ブログ復帰？'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1465681265954367802</id><published>2010-02-17T23:32:00.003+09:00</published><updated>2010-02-17T23:45:09.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='FSEvent'/><title type='text'>fsloggerの調査 (4)</title><content type='html'>fsloggerの調査その4．今度はFSEventによって取得した情報の解析方法．fsloggerのコードを読むと，次のコードで解析が出来る事がわかる．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fileTrace.h：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;#ifndef FILE_TRACE_H&lt;br /&gt;#define FILE_TRACE_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/sysctl.h&amp;gt; // uint32_t&lt;br /&gt;#include &amp;lt;sys/fsevents.h&amp;gt;&lt;br /&gt;&lt;br /&gt;const char *DEV_FSEVENTS="/dev/fsevents"; // fsevent device&lt;br /&gt;const int EVENT_QUEUE_SIZE=4096;          // limited by MAX_KFS_EVENTS&lt;br /&gt;const int FSEVENT_BUFFER_SIZE=131072;     // copied from fslogger.c&lt;br /&gt;&lt;br /&gt;// copied from fslogger.c&lt;br /&gt;// an event argument&lt;br /&gt;typedef struct kfs_event_arg {&lt;br /&gt; u_int16_t  type;         // argument type&lt;br /&gt; u_int16_t  len;          // size of argument data that follows this field&lt;br /&gt; union {&lt;br /&gt;     struct vnode *vp;&lt;br /&gt;     char         *str;&lt;br /&gt;     void         *ptr;&lt;br /&gt;     int32_t       int32;&lt;br /&gt;     dev_t         dev;&lt;br /&gt;     ino_t         ino;&lt;br /&gt;     int32_t       mode;&lt;br /&gt;     uid_t         uid;&lt;br /&gt;     gid_t         gid;&lt;br /&gt;     uint64_t      timestamp;&lt;br /&gt; } data;&lt;br /&gt;} kfs_event_arg_t;&lt;br /&gt;&lt;br /&gt;#define KFS_NUM_ARGS  FSE_MAX_ARGS&lt;br /&gt;&lt;br /&gt;// an event&lt;br /&gt;typedef struct kfs_event {&lt;br /&gt;int32_t         type; // event type&lt;br /&gt;pid_t           pid;  // pid of the process that performed the operation&lt;br /&gt;kfs_event_arg_t argHead; // head of event arguments, other events continue after this&lt;br /&gt;} kfs_event;&lt;br /&gt;&lt;br /&gt;#endif // FILE_TRACE_H&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fileTrace.c：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;#include "fileTrace.h"&lt;br /&gt;&lt;br /&gt;static int fseventFd;&lt;br /&gt;&lt;br /&gt;// event names&lt;br /&gt;static const char *kfseNames[]={&lt;br /&gt; "FSE_CREATE_FILE",&lt;br /&gt; "FSE_DELETE",&lt;br /&gt; "FSE_STAT_CHANGED",&lt;br /&gt; "FSE_RENAME",&lt;br /&gt; "FSE_CONTENT_MODIFIED",&lt;br /&gt; "FSE_EXCHANGE",&lt;br /&gt; "FSE_FINDER_INFO_CHANGED",&lt;br /&gt; "FSE_CREATE_DIR",&lt;br /&gt; "FSE_CHOWN",&lt;br /&gt; "FSE_XATTR_MODIFIED",&lt;br /&gt; "FSE_XATTR_REMOVED",&lt;br /&gt;};&lt;br /&gt;// argument names&lt;br /&gt;static const char *kfseArgNames[] = {&lt;br /&gt; "FSE_ARG_UNKNOWN", "FSE_ARG_VNODE", "FSE_ARG_STRING", "FSE_ARGPATH",&lt;br /&gt; "FSE_ARG_INT32",   "FSE_ARG_INT64", "FSE_ARG_RAW",    "FSE_ARG_INO",&lt;br /&gt; "FSE_ARG_UID",     "FSE_ARG_DEV",   "FSE_ARG_MODE",   "FSE_ARG_GID",&lt;br /&gt; "FSE_ARG_FINFO",&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void readFSEventLoop()&lt;br /&gt;{&lt;br /&gt;int ret, off, eoff;&lt;br /&gt;char buffer[FSEVENT_BUFFER_SIZE];&lt;br /&gt;kfs_event_arg_t *kea;&lt;br /&gt;int argID;&lt;br /&gt;&lt;br /&gt;while(1){&lt;br /&gt; if((ret=read(fseventFd, buffer, sizeof(buffer)))&amp;gt;0){&lt;br /&gt;   printf("Received %d bytes\n", ret);&lt;br /&gt; }&lt;br /&gt; off=0;&lt;br /&gt;&lt;br /&gt; while(off&amp;lt;ret){&lt;br /&gt;   struct kfs_event *kfse=(struct kfs_event *)((char *)buffer+off);&lt;br /&gt;   off+=sizeof(kfse-&amp;gt;type)+sizeof(kfse-&amp;gt;pid); // skip type &amp;amp; pid&lt;br /&gt;&lt;br /&gt;   if(kfse-&amp;gt;type==FSE_EVENTS_DROPPED){&lt;br /&gt;     printf("# Event\n");&lt;br /&gt;     printf("  %-14s = %s\n", "type", "EVENTS DROPPED");&lt;br /&gt;     printf("  %-14s = %d\n", "pid", kfse-&amp;gt;pid);&lt;br /&gt;     off += sizeof(kfse-&amp;gt;argHead.type); // FSE_ARG_DONE: sizeof(type)&lt;br /&gt;     continue;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   int32_t aType=kfse-&amp;gt;type &amp;amp; FSE_TYPE_MASK;&lt;br /&gt;   uint32_t aFlags=FSE_GET_FLAGS(kfse-&amp;gt;type);&lt;br /&gt;&lt;br /&gt;   if((aType&amp;lt;FSE_MAX_EVENTS) &amp;amp;&amp;amp; (aType&amp;gt;=-1)){&lt;br /&gt;     printf("# Event\n");&lt;br /&gt;     printf("  %-14s=%s", "type", kfseNames[aType]);&lt;br /&gt;     if (aFlags &amp;amp; FSE_COMBINED_EVENTS) {&lt;br /&gt;       printf("%s", ", combined events");&lt;br /&gt;     }&lt;br /&gt;     if (aFlags &amp;amp; FSE_CONTAINS_DROPPED_EVENTS) {&lt;br /&gt;       printf("%s", ", contains dropped events");&lt;br /&gt;     }&lt;br /&gt;     printf("\n");&lt;br /&gt;   } else { // should never happen&lt;br /&gt;     printf("This may be a program bug (type = %d).\n", aType);&lt;br /&gt;     exit(1);&lt;br /&gt;   }&lt;br /&gt;   printf("  %-14s = %d\n", "pid", kfse-&amp;gt;pid);&lt;br /&gt;   printf("  # Details\n    # %-14s%4s  %s\n", "type", "len", "data");&lt;br /&gt;&lt;br /&gt;   kea=&amp;amp;(kfse-&amp;gt;argHead);&lt;br /&gt;&lt;br /&gt;   while(off&amp;lt;ret){&lt;br /&gt;     if(kea-&amp;gt;type==FSE_ARG_DONE){ // no more arguments&lt;br /&gt;       printf("    %s (%#x)\n", "FSE_ARG_DONE", kea-&amp;gt;type);&lt;br /&gt;       off += sizeof(kea-&amp;gt;type); // no len field&lt;br /&gt;       break;&lt;br /&gt;     }&lt;br /&gt;     eoff=sizeof(kea-&amp;gt;type)+sizeof(kea-&amp;gt;len)+kea-&amp;gt;len;&lt;br /&gt;     off+=eoff;&lt;br /&gt;&lt;br /&gt;     argID=(kea-&amp;gt;type &amp;gt; FSE_MAX_ARGS) ? 0 : kea-&amp;gt;type;&lt;br /&gt;     printf("    %-16s%4hd\n", kfseArgNames[argID], kea-&amp;gt;len);&lt;br /&gt;     kea = (kfs_event_arg_t *)((char *)kea + eoff); // next&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;close(fseventFd);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;とりあえずこれで各イベントを読み込んで，その種類を書きだすことが出来る．読み込む情報の構造は次の図に示すとおり．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/S3v_JYty1OI/AAAAAAAAAOc/4vBGc0cxb7U/s1600-h/fsloggerStructure.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 209px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/S3v_JYty1OI/AAAAAAAAAOc/4vBGc0cxb7U/s320/fsloggerStructure.png" alt="" id="BLOGGER_PHOTO_ID_5439221511698437346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;1イベントの情報長は不定．&lt;span style="color: rgb(255, 0, 0);"&gt;kfs_event構造体でアクセス出来るのは，最初のkfs_event_argだけ&lt;/span&gt;である．それ以降のkfs_event_argについては，len情報を使って順に辿る必要がある．&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;kfs_event_argの終端は，そのtypeがFSE_ARG_DONEかどうかで判断&lt;/span&gt;する．もし&lt;span style="color: rgb(51, 51, 255);"&gt;FSE_ARG_DONEであった場合，そこにはlen情報やdata情報は存在しない&lt;/span&gt;．その点を間違えると，次のkfs_event情報が不正なものになるので注意．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1465681265954367802?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1465681265954367802/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1465681265954367802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1465681265954367802'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-4.html' title='fsloggerの調査 (4)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/S3v_JYty1OI/AAAAAAAAAOc/4vBGc0cxb7U/s72-c/fsloggerStructure.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6419997114637895087</id><published>2010-02-13T18:16:00.004+09:00</published><updated>2010-02-13T19:11:46.177+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='FSEvent'/><title type='text'>fsloggerの調査 (3)</title><content type='html'>fsloggerの調査その3．今回は，FSEventの初期化をどうするかの部分．&lt;br /&gt;&lt;br /&gt;fslogger.cのコードリーディングをすると，次のコードで大丈夫なことが分かった．&lt;span style="color: rgb(255, 0, 0);"&gt;このコードは，読み込みの部分まで実装し，正しく読み込めることを確認した上で掲載&lt;/span&gt;している．&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fileTrace.h：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="C"&gt;#ifndef FILE_TRACE_H&lt;br /&gt;#define FILE_TRACE_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/sysctl.h&amp;gt; // uint32_t&lt;br /&gt;#include &amp;lt;sys/fsevents.h&amp;gt;&lt;br /&gt;&lt;br /&gt;const char *DEV_FSEVENTS="/dev/fsevents"; // fsevent device&lt;br /&gt;const int EVENT_QUEUE_SIZE=4096;          // limited by MAX_KFS_EVENTS&lt;br /&gt;&lt;br /&gt;#endif // FILE_TRACE_H&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fileTrace.c：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="C"&gt;#include "fileTrace.h"&lt;br /&gt;&lt;br /&gt;static int fseventFd;&lt;br /&gt;&lt;br /&gt;int initFileTrace()&lt;br /&gt;{&lt;br /&gt;int fd;&lt;br /&gt;struct fsevent_clone_args fca;&lt;br /&gt;int8_t eventList[]={ // Which event to be traced&lt;br /&gt;FSE_REPORT, // FSE_CREATE_FILE&lt;br /&gt;FSE_REPORT, // FSE_DELETE&lt;br /&gt;FSE_IGNORE, // FSE_STAT_CHANGED&lt;br /&gt;FSE_REPORT, // FSE_RENAME&lt;br /&gt;FSE_IGNORE, // FSE_CONTENT_MODIFIED&lt;br /&gt;FSE_IGNORE, // FSE_EXCHANGE&lt;br /&gt;FSE_IGNORE, // FSE_FINDER_INFO_CHANGED&lt;br /&gt;FSE_REPORT, // FSE_CREATE_DIR&lt;br /&gt;FSE_IGNORE, // FSE_CHOWN&lt;br /&gt;FSE_IGNORE, // FSE_XATTR_MODIFIED&lt;br /&gt;FSE_IGNORE  // FSE_XATTR_REMOVED&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// confirm user ID (this requires root priviledge)&lt;br /&gt;if(geteuid()!=0){&lt;br /&gt;perror("This requires root priviledge.");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// open fsevents device&lt;br /&gt;if((fd=open(DEV_FSEVENTS, O_RDONLY))&amp;lt;0){&lt;br /&gt;perror("Open fsevents device.");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// create fsevents_clone_args (refer to bsd/fsevents.h)&lt;br /&gt;fca.event_list=(int8_t *)eventList;&lt;br /&gt;fca.num_events=sizeof(eventList)/sizeof(int8_t);&lt;br /&gt;fca.event_queue_depth=EVENT_QUEUE_SIZE;&lt;br /&gt;fca.fd=&amp;fseventFd;&lt;br /&gt;&lt;br /&gt;// control fsevent device&lt;br /&gt;if(ioctl(fd, FSEVENTS_CLONE, (char *)&amp;amp;fca)&amp;lt;0){&lt;br /&gt;perror("ioctl");&lt;br /&gt;close(fd);&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;close(fd);&lt;br /&gt;printf("FSEvents device is cloned\n");&lt;br /&gt;&lt;br /&gt;// set the format of fsevents output&lt;br /&gt;if(ioctl(fseventFd, FSEVENTS_WANT_EXTENDED_INFO, NULL)&amp;lt;0){&lt;br /&gt;perror("ioctl");&lt;br /&gt;close(fseventFd);&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;printf("Ready for events\n");&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;initFileTrace();&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;やっていることを簡単にまとめると次の通り．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;取得するイベントの指定 (FSE_IGNORE / FSE_REPORT)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ルート権限の確認&lt;/li&gt;&lt;li&gt;FSEventデバイスファイルのオープン&lt;/li&gt;&lt;li&gt;ioctl命令を用いて，FSEventデバイスの制御 (指定したイベントのクローン作成を指示)&lt;/li&gt;&lt;li&gt;ioctl命令を用いて，FSEventで取得する情報の形式をEXTENDEDに指定&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;以上．&lt;br /&gt;&lt;br /&gt;情報の形式がEXTENDEDの場合は，FSEventで取得出来るファイル情報が，細かく分かれて取得出来る．つまり，デバイスIDやinode番号が別々のフィールドとして取得出来る．&lt;br /&gt;一方，FSEVENTS_WANT_COMPACT_EVENTSを指定すると，デバイスIDやinodeがひとつのフィールド(FSE_ARG_FINFO)にごちゃっとまとめられる．この場合は，fse_info構造体を用いてその情報にアクセスすれば良い．その辺りの情報は，sys/fsevents.hの次の部分に書いてある．&lt;br /&gt;&lt;pre name="code" class="C"&gt;&lt;br /&gt;#define FSE_ARG_FINFO    0x000c   // next arg is a packed finfo (dev, ino, mode, uid, gid)&lt;br /&gt;#define FSEVENTS_WANT_COMPACT_EVENTS _IO('s', 101)&lt;br /&gt;#define FSEVENTS_WANT_EXTENDED_INFO _IO('s', 102)&lt;br /&gt;&lt;br /&gt;// misc utility functions for fsevent info and pathbuffers...&lt;br /&gt;typedef struct fse_info {&lt;br /&gt; ino64_t    ino;&lt;br /&gt; dev_t      dev;&lt;br /&gt; int32_t    mode;   // note: this is not a mode_t (it's 32-bits, not 16)&lt;br /&gt; uid_t      uid;&lt;br /&gt; gid_t      gid;&lt;br /&gt; uint64_t   nlink;  // only filled in if the vnode is marked as a hardlink&lt;br /&gt;} fse_info;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;初期化に必要なのはこの位のはず．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6419997114637895087?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6419997114637895087/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6419997114637895087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6419997114637895087'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-3.html' title='fsloggerの調査 (3)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5292928128462250243</id><published>2010-02-12T15:17:00.002+09:00</published><updated>2010-02-12T15:42:17.483+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='FSEvent'/><title type='text'>fsloggerの調査 (2)</title><content type='html'>fsloggerの調査つづき．とりあえず-m32をつければ正しくコンパイル出来る事を確認したので，ソースコードの中身を読むことにする．&lt;br /&gt;&lt;br /&gt;fsloggerが読み込んでいるヘッダは次の通り．&lt;br /&gt;&lt;pre name="code" class="C"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/sysctl.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/fsevents.h&amp;gt;&lt;br /&gt;#include &amp;lt;pwd.h&amp;gt;&lt;br /&gt;#include &amp;lt;grp.h&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この中で重要なのはsys/fsevents.h．なのでそちらのコードを参照してみる．このヘッダファイルは，xnuのソース内のbsd/sys/fsevents.hに存在する．そこの重要な所だけ抜き出してみる．&lt;br /&gt;&lt;pre name="code" class="C"&gt;// Event types that you can ask to listen for&lt;br /&gt;#define FSE_INVALID             -1&lt;br /&gt;#define FSE_CREATE_FILE          0&lt;br /&gt;#define FSE_DELETE               1&lt;br /&gt;#define FSE_STAT_CHANGED         2&lt;br /&gt;#define FSE_RENAME               3&lt;br /&gt;#define FSE_CONTENT_MODIFIED     4&lt;br /&gt;#define FSE_EXCHANGE             5&lt;br /&gt;#define FSE_FINDER_INFO_CHANGED  6&lt;br /&gt;#define FSE_CREATE_DIR           7&lt;br /&gt;#define FSE_CHOWN                8&lt;br /&gt;#define FSE_XATTR_MODIFIED       9&lt;br /&gt;#define FSE_XATTR_REMOVED       10&lt;br /&gt;&lt;br /&gt;#define FSE_MAX_EVENTS          11&lt;br /&gt;#define FSE_ALL_EVENTS         998&lt;br /&gt;&lt;br /&gt;#define FSE_EVENTS_DROPPED     999&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// These defines only apply if you've asked for extended&lt;br /&gt;// type info.  In that case the type field's low 12-bits&lt;br /&gt;// contain the basic types defined above and the top 4&lt;br /&gt;// bits contain flags that indicate if an event had other&lt;br /&gt;// events combined with it or if it represents a directory&lt;br /&gt;// that has dropped events below it.&lt;br /&gt;//&lt;br /&gt;#define FSE_TYPE_MASK          0x0fff&lt;br /&gt;#define FSE_FLAG_MASK          0xf000&lt;br /&gt;#define FSE_FLAG_SHIFT         12&lt;br /&gt;#define FSE_GET_FLAGS(type)    (((type) &amp;gt;&amp;gt; 12) &amp;amp; 0x000f)&lt;br /&gt;&lt;br /&gt;#define FSE_COMBINED_EVENTS          0x0001&lt;br /&gt;#define FSE_CONTAINS_DROPPED_EVENTS  0x0002&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Actions for each event type&lt;br /&gt;#define FSE_IGNORE    0&lt;br /&gt;#define FSE_REPORT    1&lt;br /&gt;#define FSE_ASK       2    // Not implemented yet&lt;br /&gt;&lt;br /&gt;// The types of each of the arguments for an event&lt;br /&gt;// Each type is followed by the size and then the&lt;br /&gt;// data.  FSE_ARG_VNODE is just a path string&lt;br /&gt;#define FSE_ARG_VNODE    0x0001   // next arg is a vnode pointer&lt;br /&gt;#define FSE_ARG_STRING   0x0002   // next arg is length followed by string ptr&lt;br /&gt;#define FSE_ARG_PATH     0x0003   // next arg is a full path&lt;br /&gt;#define FSE_ARG_INT32    0x0004   // next arg is a 32-bit int&lt;br /&gt;#define FSE_ARG_INT64    0x0005   // next arg is a 64-bit int&lt;br /&gt;#define FSE_ARG_RAW      0x0006   // next arg is a length followed by a void ptr&lt;br /&gt;#define FSE_ARG_INO      0x0007   // next arg is the inode number (ino_t)&lt;br /&gt;#define FSE_ARG_UID      0x0008   // next arg is the file's uid (uid_t)&lt;br /&gt;#define FSE_ARG_DEV      0x0009   // next arg is the file's dev_t&lt;br /&gt;#define FSE_ARG_MODE     0x000a   // next arg is the file's mode (as an int32, file type only)&lt;br /&gt;#define FSE_ARG_GID      0x000b   // next arg is the file's gid (gid_t)&lt;br /&gt;#define FSE_ARG_FINFO    0x000c   // next arg is a packed finfo (dev, ino, mode, uid, gid)&lt;br /&gt;#define FSE_ARG_DONE     0xb33f   // no more arguments&lt;br /&gt;&lt;br /&gt;#define FSE_MAX_ARGS     12&lt;br /&gt;&lt;br /&gt;// ioctl's on /dev/fsevents&lt;br /&gt;#if __LP64__&lt;br /&gt;typedef struct fsevent_clone_args {&lt;br /&gt;   int8_t  *event_list;&lt;br /&gt;   int32_t  num_events;&lt;br /&gt;   int32_t  event_queue_depth;&lt;br /&gt;   int32_t *fd;&lt;br /&gt;} fsevent_clone_args;&lt;br /&gt;#else&lt;br /&gt;typedef struct fsevent_clone_args {&lt;br /&gt;   int8_t  *event_list;&lt;br /&gt;   int32_t  pad1;&lt;br /&gt;   int32_t  num_events;&lt;br /&gt;   int32_t  event_queue_depth;&lt;br /&gt;   int32_t *fd;&lt;br /&gt;   int32_t  pad2;&lt;br /&gt;} fsevent_clone_args;&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#define FSEVENTS_CLONE  _IOW('s', 1, fsevent_clone_args)&lt;br /&gt;&lt;br /&gt;// ioctl's on the cloned fd&lt;br /&gt;#if __LP64__&lt;br /&gt;#pragma pack(push, 4)&lt;br /&gt;typedef struct fsevent_dev_filter_args {&lt;br /&gt;   uint32_t  num_devices;&lt;br /&gt;   dev_t    *devices;&lt;br /&gt;} fsevent_dev_filter_args;&lt;br /&gt;#pragma pack(pop)&lt;br /&gt;#else&lt;br /&gt;typedef struct fsevent_dev_filter_args {&lt;br /&gt;   uint32_t  num_devices;&lt;br /&gt;   dev_t    *devices;&lt;br /&gt;   int32_t   pad1;&lt;br /&gt;} fsevent_dev_filter_args;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちょっと多くなったが，fsloggerのソースコードを参照する上で必要なのはきっとこれで全部のはず．しかしenum使わないんだなーdefineなんだなー．&lt;br /&gt;&lt;br /&gt;これらの意味は，ソースコードの説明する際に必要に応じて示すことにする．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5292928128462250243?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5292928128462250243/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5292928128462250243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5292928128462250243'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger-2.html' title='fsloggerの調査 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2437601616261510899</id><published>2010-02-10T21:17:00.004+09:00</published><updated>2010-02-12T15:16:31.386+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='FSEvent'/><title type='text'>fsloggerの調査</title><content type='html'>fsloggerの調査を行う．&lt;br /&gt;&lt;br /&gt;前回，xnuのソースコードをダウンロードし，そのヘッダファイルを用いることでコンパイル出来ると述べた．これでコンパイルは正しく出来，実行も出来るのであるが，&lt;span style="color: rgb(51, 51, 255);"&gt;結果がおかしい&lt;/span&gt;事になる．&lt;br /&gt;&lt;br /&gt;次が実行例．&lt;br /&gt;&lt;pre class="prettyprint"&gt;# Event&lt;br /&gt;type           = FSE_CREATE_FILE&lt;br /&gt;pid            = 56878 (optimizer)&lt;br /&gt;# Details&lt;br /&gt;# type           len  data&lt;br /&gt;FSE_ARG_STRING    35  string = rs/hitoshi-s/.aovcs.db-journal&lt;br /&gt;FSE_ARG_DEV        4  dev    = 0x040007 (major 0, minor 262151)&lt;br /&gt;FSE_ARG_INO        4  ino    = 262154&lt;br /&gt;FSE_ARG_MODE       4  mode   = ?-----x---  (0x040008, vnode type VNON)&lt;br /&gt;FSE_ARG_UID        4  uid    = 262155 (?)&lt;br /&gt;FSE_ARG_GID        4  gid    = 524293 (?)&lt;br /&gt;FSE_ARG_INT64      8  tstamp = 197083164404091&lt;br /&gt;FSE_ARG_DONE (0xb33f)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;stringの先頭が切れていたり，アクセス権(mode)の表示がおかしかったり&lt;/span&gt;している．これはよろしくない．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで色々試行錯誤をした結果，64bitでコンパイルすると駄目，という事がわかった．つまり，コンパイルは次のとおりに行う必要がある．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ gcc -Ibsd -m32 fslogger.c&lt;br /&gt;(bsdは，xnuカーネルのソースコード内のディレクトリ)&lt;/pre&gt;&lt;br /&gt;こうすることでコンパイルが正しく出来，実行結果も正しくなる．その結果が次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;# Event&lt;br /&gt; type           = FSE_CREATE_FILE&lt;br /&gt;pid            = 56878 (optimizer)&lt;br /&gt;# Details&lt;br /&gt; # type           len  data&lt;br /&gt; FSE_ARG_STRING    35  string = /Users/hitoshi-s/.aovcs.db-journal&lt;br /&gt;&lt;br /&gt; FSE_ARG_DEV        4  dev    = 0xe000002 (major 14, minor 2)&lt;br /&gt; FSE_ARG_INO        4  ino    = 18352091&lt;br /&gt; FSE_ARG_MODE       4  mode   = -rw-r--r--  (0x0081a4, vnode type VREG)&lt;br /&gt; FSE_ARG_UID        4  uid    = 502 (hitoshi-s)&lt;br /&gt; FSE_ARG_GID        4  gid    = 20 (staff)&lt;br /&gt; FSE_ARG_INT64      8  tstamp = 397689684106485&lt;br /&gt; FSE_ARG_DONE (0xb33f)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちゃんとパスも全部表示され，modeも正しい．ユーザ名とかも表示出来た．とりあえず今回の場合は，&lt;span style="color: rgb(255, 0, 0);"&gt;-m32をつけてコンパイルすれば良い&lt;/span&gt;という事である．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;しかしこれでいつでも動くとは限らない．今回確認した環境はMac OS X 10.6で，アプリケーションのデフォルトコンパイル対象は64bit環境である．しかし，&lt;span style="color: rgb(255, 0, 0);"&gt;カーネル(PID:0, kernel_task)は32bit&lt;/span&gt;で動いている．これがもし64bitになると，-m64でないとむしろ正しく動かないという事は十分考える事が出来る．fsloggerが，カーネル内のFSEventという仕組みを用いている事を考えると，これは十分あり得る話である．&lt;br /&gt;&lt;br /&gt;これは，&lt;span style="color: rgb(255, 0, 0);"&gt;Mac OS Xのユニバーサルバイナリ/ファットバイナリではうまく対処出来ない&lt;/span&gt;．正しく対処するには，自分でkernel_taskのモード(32bit/64bit)を調べ，それに応じたバイナリを実行する等が必要であろう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2437601616261510899?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2437601616261510899/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2437601616261510899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2437601616261510899'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/fslogger.html' title='fsloggerの調査'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-3087077125212399983</id><published>2010-02-09T21:02:00.003+09:00</published><updated>2010-02-09T21:30:06.576+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='FSEvent'/><title type='text'>Mac用の高速デーモン作成計画</title><content type='html'>お久し振りです．まだこのブログは続きます．&lt;br /&gt;&lt;br /&gt;現在，ファイル操作を行ったアプリケーションが何かと言う情報を収集するために，dtraceを用いています．なお収集作業を行うデーモンを，ここではAOVCSデーモンと呼びます．&lt;br /&gt;&lt;br /&gt;dtraceを用いた実装方法では，&lt;span style="color: rgb(255, 0, 0);"&gt;収集する情報の正確性において問題はありません&lt;/span&gt;．しかし，&lt;span style="color: rgb(51, 51, 255);"&gt;速度という面では問題&lt;/span&gt;が有ります．configureを実行する場合，AOVCSデーモンを有効にしたか否かで実測時間が4倍ほど差が出てきてしまいます．&lt;br /&gt;現在の予想は，dtraceの出力を受け取るためのパイプ(pipe)がボトルネックになっているというものです．しかし，パイプサイズの変更は難しそうです．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(以下から丁寧語ではなくなります)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで，以前から調べてあった，&lt;span style="color: rgb(255, 0, 0);"&gt;FSEventという仕組み&lt;/span&gt;を用いることにする．これは，Mac OS X内のファイル操作のイベント情報を収集するための仕組みである．Spotlightがメタ情報を構築する際も，この仕組みを用いている．&lt;br /&gt;&lt;br /&gt;この方法は，Mac OS X Internalsで説明されており，Webサイトでも説明されている．&lt;br /&gt;&lt;a href="http://osxbook.com/software/fslogger/"&gt;http://osxbook.com/software/fslogger/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ソースコードもあるが，これをコンパイルするにはカーネルのヘッダファイルが必要である．これは，次のサイトからダウンロード出来る．&lt;br /&gt;&lt;a href="http://www.opensource.apple.com/"&gt;http://www.opensource.apple.com/&lt;/a&gt;&lt;br /&gt;xnu内のbsdディレクトリがそれである．そうしたら，"gcc -I/bsd/dir/path fslogger.c"とすることでコンパイル出来る．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，このFSEventという仕組みだが，&lt;span style="color: rgb(51, 51, 255);"&gt;上記で述べた仕組みはAppleは公開していない&lt;/span&gt;．Appleが公開しているのは同じFSEventという名前の，&lt;span style="color: rgb(51, 51, 255);"&gt;もう少し機能が制限された仕組み&lt;/span&gt;である．&lt;br /&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Darwin/Conceptual/FSEvents_ProgGuide/Introduction/Introduction.html"&gt;http://developer.apple.com/mac/library/documentation/Darwin/Conceptual/FSEvents_ProgGuide/Introduction/Introduction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;特定のディレクトリを指定すると，そこに何か変更が起こった場合に通知を行う&lt;/span&gt;という仕組みである．&lt;span style="color: rgb(51, 51, 255);"&gt;具体的なファイルやディレクトリの情報は取得出来ず&lt;/span&gt;，自分で調べる必要がある．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回実現したい機能に必要なのは，各ファイルがどのプロセスによって変更されたか，という情報である．上記の，ディレクトリ内に何か変更がある，という情報だけでは足りない．つまり，Appleが公開している機能では不十分なのである．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そのため，Appleが公開していない，FSEventのより細かい機能を利用する必要がある．利用方法は，先のfsloggerのソースコードを参照すればよい．本ブログでは以後，この利用方法を詳しく調べ，まとめていく．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-3087077125212399983?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/3087077125212399983/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/mac.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3087077125212399983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3087077125212399983'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2010/02/mac.html' title='Mac用の高速デーモン作成計画'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-278094722205332685</id><published>2009-12-13T17:35:00.002+09:00</published><updated>2009-12-13T17:38:48.321+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Mercurial'/><title type='text'>Mercurialのプラグイン作成方法 (2)</title><content type='html'>Mercurialのプラグイン，もうちょっとだけ調べた．とりあえず，AOVCSが状態をセットしなければならないファイルの一覧の取得をば．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;from mercurial import hg&lt;br /&gt;&lt;br /&gt;def tobeset(ui, repo, **opts):&lt;br /&gt;   """ just display files to be set status """&lt;br /&gt;   ui.write("Disappeared files:\n")&lt;br /&gt;   for filename in repo.status(unknown=True)[3]: # 3 is disappeared                               &lt;br /&gt;       ui.write("  "+filename)&lt;br /&gt;       ui.write("\n")&lt;br /&gt;&lt;br /&gt;   ui.write("Unknown files:\n")&lt;br /&gt;   for filename in repo.status(unknown=True)[4]: # 4 is unknown files                             &lt;br /&gt;       ui.write("  "+filename)&lt;br /&gt;       ui.write("\n")&lt;br /&gt;&lt;br /&gt;cmdtable={&lt;br /&gt;   "tobeset": (tobeset,&lt;br /&gt;               [],&lt;br /&gt;               "")&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;関数名が非常に適当だけど，これで一覧が取得出来る．実行例は次．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ hg tobeset&lt;br /&gt;Disappeared files:&lt;br /&gt; foo.o&lt;br /&gt;Unknown files:&lt;br /&gt; bar&lt;br /&gt; foofoo&lt;br /&gt; foofoo.o&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あとはこいつらの情報をAOVCSのDBから取得して，状態を決定して，設定すれば良い．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-278094722205332685?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/278094722205332685/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/mercurial-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/278094722205332685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/278094722205332685'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/mercurial-2.html' title='Mercurialのプラグイン作成方法 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2371861850716945659</id><published>2009-12-11T17:14:00.002+09:00</published><updated>2009-12-11T18:00:50.103+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='hg'/><category scheme='http://www.blogger.com/atom/ns#' term='Mercurial'/><title type='text'>Mercurialのプラグイン作成方法</title><content type='html'>今度はMercurialのプラグイン作成方法を簡単に調べた．&lt;br /&gt;&lt;br /&gt;MercurialはBazaar同様Pythonで書かれており，再コンパイルなどはする必要が無い．また，プラグインの作り方は，Bazaarほど詳しくはないが，次の2つのページを参照すると良い．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mercurial.selenic.com/wiki/WritingExtensions"&gt;http://mercurial.selenic.com/wiki/WritingExtensions&lt;/a&gt; (プラグインの書き方)&lt;br /&gt;&lt;a href="http://mercurial.selenic.com/wiki/UsingExtensions"&gt;http://mercurial.selenic.com/wiki/UsingExtensions&lt;/a&gt; (プラグインの設定方法)&lt;br /&gt;&lt;br /&gt;とりあえずGitと同様Helloを実装する．まずは，プラグインの設定．~/.hgrcに以下を記述．&lt;br /&gt;&lt;pre class="prettyprint"&gt; [extensions]&lt;br /&gt;hello=~/.hgext/hello.py&lt;/pre&gt;こうすることで，hello.pyをプラグインとして読み込む様になる．そしたら今度は，hello.pyの編集．プラグインの書き方を参照しながら，helloと言わせる多分最低限のコードを作った．&lt;br /&gt;&lt;pre name="code" class="python"&gt;from mercurial import hg&lt;br /&gt;&lt;br /&gt;def hello(ui, node, **opts):&lt;br /&gt;   """ Say hello """&lt;br /&gt;   ui.write("Hello\n")&lt;br /&gt;&lt;br /&gt;cmdtable={&lt;br /&gt;   # cmd  :  func, opts, help&lt;br /&gt;   "hello": (hello, [], "")&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;これを~/.hgext/hello.pyとして保存すると，何かしらのリポジトリ内であれば次の通りに動く．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ hg hello&lt;br /&gt;Hello&lt;/pre&gt;もし，リポジトリ内でなくても動く様にしたければ，上記のコードを次の通り修正する．&lt;br /&gt;&lt;pre name="code" class="python"&gt;from mercurial import hg, commands&lt;br /&gt;&lt;br /&gt;def hello(ui, **opts):&lt;br /&gt;   """ Say hello """&lt;br /&gt;   ui.write("Hello\n")&lt;br /&gt;&lt;br /&gt;commands.norepo+=" hello"&lt;br /&gt;cmdtable={&lt;br /&gt;   # cmd  :  func, opts, help&lt;br /&gt;   "hello": (hello, [], "")&lt;br /&gt;}&lt;/pre&gt;やることは，mercurial.commandsをインポートし，commands.norepoにhelloを追加し，hello関数からnodeを取り除くということである．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これでプラグインの作り方は分かったので，あとはGit同様に，ファイル状態設定のAPIを参照する事になる．Mercurialは，次のページにAPIのドキュメントがある．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mercurial.selenic.com/wiki/MercurialApi"&gt;http://mercurial.selenic.com/wiki/MercurialApi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今度はここを参照すれば良い．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2371861850716945659?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2371861850716945659/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/mercurial.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2371861850716945659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2371861850716945659'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/mercurial.html' title='Mercurialのプラグイン作成方法'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8722260542041177202</id><published>2009-12-10T23:07:00.006+09:00</published><updated>2009-12-16T15:32:19.020+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Gitのプラグイン？拡張コマンド？の作り方</title><content type='html'>AOVCSの拡張を，Bazaar以外に移植する事を考える．まずはGitが対象．&lt;br /&gt;&lt;br /&gt;Gitは，調べた限りプラグインを作成する方法は無い．そのため，Gitのソースコードを直接編集することになる様だ．まずは，Gitをコンパイルする環境を整える．今回は，Linux 2.6.27.38-170.2.113.fc10.x86_64にて行った．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(2009/12/16追記：コメントにもありますが，git-hogeというコマンド(バイナリ/シェルスクリプト)をパスの通ったところに作成すると，git hogeとすることで，gitが"git-hoge"を探索，実行してくれるというメカニズムがあります)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まず今回インストールしたコマンド達．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;git (リポジトリのダウンロードに必要)&lt;/li&gt;&lt;li&gt;autoconf (コンパイルに必要)&lt;/li&gt;&lt;li&gt;zlib-devel (コンパイルに必要)&lt;/li&gt;&lt;li&gt;perl-ExtUtils-MakeMaker (コンパイルに必要)&lt;/li&gt;&lt;/ul&gt;これらをyum経由でインストールすれば，コンパイル環境は出来た事になる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次にコンパイルの手順．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"git clone git://git.kernel.org/pub/scm/git/git.git"を実行，ソースのダウンロード (&lt;a href="http://git-scm.com/download"&gt;http://git-scm.com/download&lt;/a&gt; 参照)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;make configure (リポジトリ内のINSTALL参照)&lt;/li&gt;&lt;li&gt;./configure (INSTALL参照)&lt;/li&gt;&lt;li&gt;make (INSTALL)&lt;/li&gt;&lt;/ul&gt;多分これでコンパイルが成功する．そしたら次に拡張を作成する．拡張の作成は，次のサイトにあるapi-builtin.txtが非常に参考になる．&lt;br /&gt;&lt;a href="http://repo.or.cz/w/git.git?a=tree;f=Documentation/technical;hb=HEAD"&gt;http://repo.or.cz/w/git.git?a=tree;f=Documentation/technical;hb=HEAD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;やるべき事をまとめると次の通り．今回は，hogeという，helloを出力するだけのコマンドを作成してみる．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;builtin-hoge.cを作成し，int cmd_hoge(int argc, const char **argv, const char *prefix);を定義 (printfするだけ)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;builtin.hに，int cmd_hoge(int argc, const char **argv, const char *prefix);のプロトタイプ宣言を追加&lt;/li&gt;&lt;li&gt;git.c内のcommands[]に，{"hoge", cmd_hoge, 0}を追加 (0の意味はapi-builtin.txtを参照)&lt;/li&gt;&lt;li&gt;Makefile内のBUILTIN_OBJSに，builtin-hoge.oを追加&lt;/li&gt;&lt;/ul&gt;これでコンパイルをすれば，無事hogeを定義出来る．案外簡単．実行例は次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ ./git hoge&lt;br /&gt;hello&lt;br /&gt;&lt;/pre&gt;次は，cmd_hogeの中で使えるAPIが何かを調査する必要がある．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8722260542041177202?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8722260542041177202/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/git.html#comment-form' title='8 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8722260542041177202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8722260542041177202'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/git.html' title='Gitのプラグイン？拡張コマンド？の作り方'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-9166187680058982169</id><published>2009-12-07T22:33:00.006+09:00</published><updated>2009-12-07T23:12:48.481+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SystemTap'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-transport'/><category scheme='http://www.blogger.com/atom/ns#' term='CWD'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>AOVCSの移植性調査 - Linux with SystemTap</title><content type='html'>結構間が開いてしまいました．この間はずっと論文で評価の部分を書いてました．&lt;br /&gt;&lt;br /&gt;で，一応その辺の記述が一通り終わったため，今度はAOVCSを他の環境へ移植する方法の調査を行うことに．まずは，LinuxでSystemTapを用いた実装の調査．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SystemTapは，Solarisのdtraceを受けてLinux側がそれと同等かそれ以上の機能を持たせようとしたツール&lt;/span&gt;．というのが自分の解釈．なのでMac OS Xでdtraceを用いて実装したのとだいたい同じ方法で，Linuxでもデーモンを作成出来ると期待している．&lt;br /&gt;&lt;br /&gt;とりあえず，SystemTapのリファレンスを一通り読む．&lt;br /&gt;&lt;a href="http://sourceware.org/systemtap/documentation.html"&gt;http://sourceware.org/systemtap/documentation.html&lt;br /&gt;&lt;/a&gt;これの，Language Referenceという所．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さて，読んで見たところ，次のあたりがdtraceと違うようだ．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;スレッドローカル変数が無い(dtraceにおけるself-&amp;gt;．一応連想配列で代用は出来る)&lt;/li&gt;&lt;li&gt;ネイティブコードに変換し，カーネルモジュールとして読み込み，実行する(dtraceは，仮想命令をインタプリトする)&lt;/li&gt;&lt;li&gt;ネイティブコード(C言語)を直接記述出来る&lt;/li&gt;&lt;li&gt;カーネルのトレースには，デバッグ情報が必要(debuginfo-installコマンドを利用)&lt;/li&gt;&lt;li&gt;関数が定義可能&lt;/li&gt;&lt;li&gt;制御フロー命令が利用可能&lt;/li&gt;&lt;/ul&gt;案外違うところが多い．でもまあなんとかなるかな？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただ，リファレンスを読んでいると，dtraceにあるようなデフォルトで用意される情報群がどうも少ない．pidとかuidとかは取得できるのだが，&lt;span style="color: rgb(255, 0, 0);"&gt;Mac OS Xで苦しんだCWD (Current Working Directory)を取得するコマンドが，SystemTapにおいても見つからない&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;これは困った．これが取得出来ないと，SystemTapを使えば実装出来るよ！と主張するのは難しい．そこで，SystemTapの勉強もかねてCWDをどうにかして取得してみよう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まず，何かの情報からファイルのフルパスを取得出来ないものかとググってみた．すると，次のサイトを発見．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lwn.net/Articles/345341/"&gt;http://lwn.net/Articles/345341/&lt;/a&gt;&lt;br /&gt;ここの文章を引用したのが次．&lt;br /&gt;&lt;br /&gt;"The dentry tapset provides functions to map kernel VFS directory entries&lt;br /&gt;to file or full path names: d_path(), d_name() and reverse_path_walk()."&lt;br /&gt;&lt;br /&gt;どうやらdentryを与えればそのファイルのフルパスを取得出来るようだ．そこで次の戦略．&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;どうにかしてCWDへのdentryを取得して，reverse_path_walkを用いてフルパスを取得すれば良い&lt;/li&gt;&lt;li&gt;CWDの情報は，きっとプロセス情報か何かが持っているはず&lt;/li&gt;&lt;li&gt;プロセス情報っぽいのは，SystemTapのスクリプト内でtask_current()関数を呼べば取得出来る&lt;/li&gt;&lt;li&gt;task_current()で取得出来る情報は，task_struct構造体 (/usr/share/systemtap/tapset/task.stp参照)の模様&lt;/li&gt;&lt;/ul&gt;ここまで情報がわかったので，今度はLinuxカーネル第三版を参照して，task_structが何者かを見る．すると，3.2節にその大まかな構造が載っていて，&lt;span style="color: rgb(255, 0, 0);"&gt;その中のfsというメンバに，カレントディレクトの情報がある&lt;/span&gt;ということがわかった．あとはその中身をたどれば良さそう．そこで，リファレンスを読みながら次のコードを作成．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;probe syscall.open&lt;br /&gt;{&lt;br /&gt;     printf("%d\n", @cast(task_current, "task_struct", "kernel")-&amp;gt;fs-&amp;gt;pwd.dentry);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;しかしこれだとエラー．エラーメッセージは次の通り．&lt;br /&gt;&lt;pre class="prettyprint"&gt;semantic error: 'struct path' is being accessed instead of a member: identifier '@cast' at :3:17&lt;br /&gt;     source:  printf("%d\n", @cast(task_current, "task_struct", "kernel")-&amp;gt;fs-&amp;gt;pwd.dentry);&lt;br /&gt;    &lt;/pre&gt;&lt;br /&gt;最初はよくわからなかったが，これは，&lt;span style="color: rgb(255, 0, 0);"&gt;SystemTapには構造体の中身にアクセスするドット演算子が無い&lt;/span&gt;から起こるようだ．アロー(-&amp;gt;)はあるのに．ぬぅ．どうやらここは，Cを直接記述するしかない．そこで今度はインライン(?)Cの書き方を参照して，次のコードにする．&lt;br /&gt;&lt;pre name="code" class="c"&gt;function getCwdEntry:long (task:long)&lt;br /&gt;%{&lt;br /&gt;struct fs_struct *fs=((struct task_struct *)THIS-&amp;gt;task)-&amp;gt;fs;&lt;br /&gt;THIS-&amp;gt;__retvalue=(long)fs-&amp;gt;pwd.dentry;&lt;br /&gt;%}&lt;br /&gt;&lt;br /&gt;probe syscall.open&lt;br /&gt;{&lt;br /&gt;printf("%s\n", reverse_path_walk(getCwdEntry(task_current())));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで無事，CWDを取得することに成功した．実行例は次．-gオプションを付けないとインラインCの記述が通らない．これに結構はまった．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ sudo stap -g cwd.stp&lt;br /&gt;usr/share/systemtap/tapset/powerpc/&lt;br /&gt;usr/share/systemtap/tapset/&lt;br /&gt;usr/share/systemtap/tapset/s390/&lt;br /&gt;usr/share/systemtap/tapset/&lt;br /&gt;usr/share/systemtap/tapset/ia64/&lt;br /&gt;usr/share/systemtap/tapset/&lt;br /&gt;usr/share/systemtap/tapset/x86_64/&lt;br /&gt;usr/share/systemtap/tapset/&lt;br /&gt;usr/share/systemtap/tapset/test/&lt;br /&gt;usr/share/systemtap/tapset/&lt;br /&gt;usr/share/systemtap/tapset/i386/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これはtapsetディレクトリ内でfindした結果のトレース．うん，ちゃんと取れてる．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-9166187680058982169?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/9166187680058982169/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/aovcs-linux-with-systemtap.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9166187680058982169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9166187680058982169'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/12/aovcs-linux-with-systemtap.html' title='AOVCSの移植性調査 - Linux with SystemTap'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4288264294266349859</id><published>2009-11-24T23:39:00.002+09:00</published><updated>2009-11-24T23:43:49.338+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>AOVCSの実用性検証 - /usr/bin内，/Developer/usr/bin/内，/opt/local/bin/内編 (2)</title><content type='html'>/usr/bin内，/Developer/usr/bin/内，/opt/local/bin/内のコマンドの設定を作成する．前回示したコマンドを一応一通り作成した．それが次．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-configurations&amp;gt;&lt;br /&gt; &amp;lt;action-sets&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for primary-file-generate applications --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="primary"&amp;gt;&lt;br /&gt;     &amp;lt;create action="auto" type="weak" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="auto" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for do-fork and primary-file-generate applications such as shell script --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="primary-overridable"&amp;gt;&lt;br /&gt;     &amp;lt;create action="auto" type="middle" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="auto" type="middle" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for autotools --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="autotools"&amp;gt;&lt;br /&gt;     &amp;lt;create action="auto" type="middle" /&amp;gt;&lt;br /&gt;     &amp;lt;linkto action="auto" type="midlle" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="auto" type="middle" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for secondary-file-generate applications --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="strong" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="ignore" type="strong" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for symlik/link applications --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="symlink"&amp;gt;&lt;br /&gt;     &amp;lt;linkto action="auto" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuration for archiver/unarchiver, we cannot define the acts --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="archiver"&amp;gt;&lt;br /&gt;     &amp;lt;create action="prompt" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;!-- configuraiton for Version Control Systems, we cannot define the acts such as conflicted files --&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="vcs"&amp;gt;&lt;br /&gt;     &amp;lt;create action="prompt" type="weak" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="prompt" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt; &amp;lt;/action-sets&amp;gt;&lt;br /&gt; &amp;lt;app-configurations&amp;gt;&lt;br /&gt;   &amp;lt;!-- Finder --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Finder&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="strong" pattern=".DS_Store" /&amp;gt;&lt;br /&gt;       &amp;lt;remove action="ignore" type="strong" pattern=".DS_Store" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="strong" pattern="*/.DS_Store" /&amp;gt;&lt;br /&gt;       &amp;lt;remove action="ignore" type="strong" pattern="*/.DS_Store" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- IDEs --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Xcode&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;!-- Build Directory--&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="build" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*/build" /&amp;gt;&lt;br /&gt;       &amp;lt;!-- Not well-known --&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.swp" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*~.nib" /&amp;gt;&lt;br /&gt;       &amp;lt;!-- User configurations --&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.pbxuser" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.perspective" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.perspectivev3" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.mode1v3" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.mode2v3" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;eclipse&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;!-- java --&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="bin" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*/bin" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern=".classpath" /&amp;gt;&lt;br /&gt;       &amp;lt;!-- C++ --&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="Debug" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*/Debug" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="Release" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*/Release" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern=".cdtbuild" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern=".cdtproject" /&amp;gt;&lt;br /&gt;       &amp;lt;!-- General Configurations --&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern=".project" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern=".settings" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="prompt" type="weak" pattern="*/.settings" /&amp;gt;&lt;br /&gt;       &amp;lt;!-- EclipseUML Files can be version-controlled. So, no configurations here --&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- Editors, Shell Commands, Applications --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Emacs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;emacs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;       &amp;lt;remove action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;vi&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;vim&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;view&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;ex&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;nano&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Preview&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;touch&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;mkdir&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rmdir&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rm&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Icon Composer&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;OmniGraffle Professional&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Numbers&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Microsoft Excel&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- my Shell Script --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary-overridable"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;template.sh&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- Template Generators --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="autotools"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autom4te&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;automake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autoheader&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autoconf&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autoupdate&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autoreconf&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;aclocal&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="middle" pattern="autom4te.cache" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="middle" pattern="*/autom4te.cache" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary-overridable"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;autoscan&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.log" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;javah&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;mib2c&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- Compilers --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;llvm-cpp-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;llvm-g++&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;llvm-g++-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;llvm-gcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;llvm-gcc-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;c++&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;c++-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;c++-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;g++&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;g++-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;g++-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;c2ph&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;cc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;distcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;cpp&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;cpp-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;cpp-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcov&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcov-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcov-4.2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;bison&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;flex&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;flex++&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;as&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;javac&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;clang&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;javadoc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;ld&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;libtool&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;lipo&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;mkdep&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;nasm&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;osacompile&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;perlcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;perlcc5.8.9&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;phpize&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;pstopdf&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;pydoc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;pydoc2.5&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;pydoc2.6&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;strip&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;yacc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;dvipdfmx&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;ptex&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;tex&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;latex&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;platex&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- Files Generated by Interpreters cannot be defined the states--&amp;gt;&lt;br /&gt;   &amp;lt;!-- tag jump --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;ctags&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;etags&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;htags&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gtags&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- VCS --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="vcs"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;cvs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rcs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;svn&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;svnadmin&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- SCM Tools --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;configure&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;make&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gnumake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;bsdmake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;org.apache.tools.ant.launch.Launcher&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;xcodebuild&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- link command configuration --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="symlink"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;ln&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;link&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;!-- archivers --&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="archiver"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;bsdtar&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gnutar&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gzip&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gunzip&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;bzip2&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;compress&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;uncompress&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;zip&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;unzip&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;jar&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;tar&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;xar&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt; &amp;lt;/app-configurations&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-configurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;長い...疲れた...&lt;br /&gt;&lt;br /&gt;尚，この検証を行っている際に，&lt;span style="color: rgb(255, 0, 0);"&gt;Mac OS Xにおける濁音，半濁音を含むパスによる問題&lt;/span&gt;，というのに遭遇した．数時間修正を試みたが，上手く行かなかったのでとりあえず保留としておく．&lt;br /&gt;問題のキーワード：nfd, nfc, iconv&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4288264294266349859?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4288264294266349859/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-usrbindeveloperusrbinoptlocalbin_24.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4288264294266349859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4288264294266349859'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-usrbindeveloperusrbinoptlocalbin_24.html' title='AOVCSの実用性検証 - /usr/bin内，/Developer/usr/bin/内，/opt/local/bin/内編 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7386727866202635257</id><published>2009-11-23T21:35:00.005+09:00</published><updated>2009-11-23T22:33:32.786+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='Autotools'/><title type='text'>AOVCSの実用性検証 - autotools</title><content type='html'>前回示したツール一覧の，autotoolsの部分の調査．autotools対象のアプリケーションは次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;autoscan&lt;/li&gt;&lt;li&gt;aclocal&lt;br /&gt;&lt;/li&gt;&lt;li&gt;autoheader&lt;br /&gt;&lt;/li&gt;&lt;li&gt;autoconf&lt;/li&gt;&lt;li&gt;autom4te&lt;/li&gt;&lt;li&gt;automake&lt;/li&gt;&lt;/ul&gt;これらの自動化を試みる．各コマンドの関係は，&lt;a href="http://ja.wikipedia.org/wiki/Autotools"&gt;Wikipediaに掲載されている図&lt;/a&gt;が分かりやすい．その図を引用したのが下．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SwqEQMt2n8I/AAAAAAAAAOU/V1LNUs6g8hM/s1600/Autoconf.png"&gt;&lt;img style="cursor: pointer; width: 183px; height: 320px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SwqEQMt2n8I/AAAAAAAAAOU/V1LNUs6g8hM/s320/Autoconf.png" alt="" id="BLOGGER_PHOTO_ID_5407279716438024130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;この図を見ると分かるが，ユーザはconfigureから始めるべき，となっている．そして，それ以前のものは開発者が作るものである．つまり，&lt;span style="color: rgb(255, 0, 0);"&gt;autotoolsで作成したファイルはバージョン管理されるべき&lt;/span&gt;，となる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで，実際にautotoolsを使ってconfigureを作成し，どういったファイルが生成されるかの調査を行う．使い方をキチンと調べ，自分でゼロから作ればそれがベストだが，あまり時間もないのでそうはしない．ググって出てきたautotoolsの利用例に従ってみる事にする．&lt;br /&gt;&lt;br /&gt;参照したサイトは次．&lt;br /&gt;&lt;a href="http://shimaki-hp.hp.infoseek.co.jp/autoconf/book1.html"&gt;http://shimaki-hp.hp.infoseek.co.jp/autoconf/book1.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/chapter3.html"&gt;http://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/chapter3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今回は後者のサイトに置いてある，dicegame-0.1を使って検証する．ただし&lt;span style="color: rgb(51, 51, 255);"&gt;この記事が書かれたのが2001年であり，それ以降にautotoolsの挙動が変わっていたりする&lt;/span&gt;様である．そこは今回は検証しないとする．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dicegame-0.1展開し，&lt;span style="color: rgb(255, 0, 0);"&gt;なぜか作成されているconfigureを削除&lt;/span&gt;し，bootstrap(autotoolsコマンド一連)を実行したのが次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ ./bootstrap&lt;br /&gt;+ aclocal -I config&lt;br /&gt;+ autoheader&lt;br /&gt;+ automake --foreign --add-missing --copy&lt;br /&gt;+ autoconf&lt;br /&gt;$ bzr init &amp;amp;&amp;amp; bzr af --dry-run&lt;br /&gt;----&lt;br /&gt;No configurations for the following files/directories:&lt;br /&gt;autom4te.cache                 (Application names: autom4te, aclocal, bootstrap, bash, login, Terminal, launchd, launchd)&lt;br /&gt;config                         (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;dicegame                       (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;msvc                           (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;Makefile.am                    (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;Makefile.in                    (Application names: automake, bootstrap, bash, login, Terminal, launchd, launchd)&lt;br /&gt;aclocal.m4                     (Application names: aclocal, bootstrap, bash, login, Terminal, launchd, launchd)&lt;br /&gt;bootstrap                      (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;configure                      (Application names: autom4te, bootstrap, bash, login, Terminal, launchd, launchd)&lt;br /&gt;configure.in                   (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;stamp-h.in                     (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;config.h.in                    (Application names: autoheader, bootstrap, bash, login, Terminal, launchd, launchd)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;autom4te.cacheとかいうディレクトリは，&lt;span style="color: rgb(255, 0, 0);"&gt;オープンソースのリポジトリを見ても管理されていないので，無視していいディレクトリ&lt;/span&gt;．あとのファイルはバージョン管理するべきファイル．&lt;br /&gt;&lt;br /&gt;また，autoscanコマンドが実行されていないので，そちらは自分で実行して調査する．その結果が次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ autoscan&lt;br /&gt;$ bzr af --dry-run&lt;br /&gt;configure.scan                 (Application names: autoscan, bash, login, Terminal, launchd, launchd)&lt;br /&gt;autoscan.log                   (Application names: autoscan, bash, login, Terminal, launchd, launchd)&lt;br /&gt;(※一部略)&lt;/pre&gt;&lt;br /&gt;configure.scanは，編集してconfigure.ac(またはconfigure.in)として扱うので，&lt;span style="color: rgb(255, 0, 0);"&gt;configure.scanそれ自体はバージョン管理すべきでないものの，configure.acに名前変更した場合は管理すべき&lt;/span&gt;．そのため，configure.scanはバージョン管理対象とする．これは，名前変更トレースを行う関係で良い方法が無かったため．詳細は省くけどちょっと悔しい．&lt;br /&gt;autoscan.logは，バージョン管理不要．オープンソースのリポジトリにやはり無いので．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上の結果から，次のaovcs.confを作成．&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-configurations&amp;gt;&lt;br /&gt;&amp;lt;action-sets&amp;gt;&lt;br /&gt; &amp;lt;!-- configuration for do-fork and primary-file-generate applications such as shell script --&amp;gt;&lt;br /&gt; &amp;lt;action-set name="primary-overridable"&amp;gt;&lt;br /&gt;   &amp;lt;create action="auto" type="middle" /&amp;gt;&lt;br /&gt;   &amp;lt;remove action="auto" type="middle" /&amp;gt;&lt;br /&gt; &amp;lt;/action-set&amp;gt;&lt;br /&gt; &amp;lt;!-- configuration for autotools --&amp;gt;&lt;br /&gt; &amp;lt;action-set name="autotools"&amp;gt;&lt;br /&gt;   &amp;lt;create action="auto" type="middle" /&amp;gt;&lt;br /&gt;   &amp;lt;linkto action="auto" type="midlle" /&amp;gt;&lt;br /&gt;   &amp;lt;remove action="auto" type="middle" /&amp;gt;&lt;br /&gt; &amp;lt;/action-set&amp;gt;&lt;br /&gt;&amp;lt;/action-sets&amp;gt;&lt;br /&gt;&amp;lt;app-configurations&amp;gt;&lt;br /&gt; &amp;lt;!-- Template Generators --&amp;gt;&lt;br /&gt; &amp;lt;app-configuration action-set="autotools"&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autom4te&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;automake&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autoheader&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autoconf&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autoreconf&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;aclocal&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;exceptions&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="middle" pattern="autom4te.cache" /&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="middle" pattern="*/autom4te.cache" /&amp;gt;&lt;br /&gt;   &amp;lt;/exceptions&amp;gt;&lt;br /&gt; &amp;lt;/app-configuration&amp;gt;&lt;br /&gt; &amp;lt;app-configuration action-set="primary-overridable"&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autoscan&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;exceptions&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="weak" pattern="*.log" /&amp;gt;&lt;br /&gt;   &amp;lt;/exceptions&amp;gt;&lt;br /&gt; &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;&amp;lt;/app-configurations&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-configurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;automake --add-missingを実行すると，&lt;span style="color: rgb(255, 0, 0);"&gt;NEWSとかのシンボリックリンクを張ってくれたりするので，シンボリックリンクにも対応出来る様にaction-setを追加&lt;/span&gt;．また，サブプロセスに任せる場合も見られたので，type="middle"に調整．そして上で示したignore対象を追加すればOK．&lt;br /&gt;autoflagsを実行すると次の通り．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ bzr af --dry-run&lt;br /&gt;The following state will be set if execute autoflags(af) without --dry-run&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;Added files/directories:&lt;br /&gt;Makefile.in                    (automake)&lt;br /&gt;aclocal.m4                     (aclocal)&lt;br /&gt;configure                      (autom4te)&lt;br /&gt;configure.scan                 (autoscan)&lt;br /&gt;config.h.in                    (autoheader: renaming traced)&lt;br /&gt;----&lt;br /&gt;Ignored files/directories:&lt;br /&gt;autoscan.log                   (autoscan - pattern: *.log)&lt;br /&gt;autom4te.cache                 (aclocal - pattern: autom4te.cache)&lt;br /&gt;----&lt;br /&gt;No configurations for the following files/directories:&lt;br /&gt;dicegame                       (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;msvc                           (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;Makefile.am                    (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;bootstrap                      (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;configure.in                   (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;stamp-h.in                     (Application names: tar, bash, login, Terminal, launchd, launchd)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この程度であれば正しく動いている．多分これ以上の規模でも動くはずだが，実証は出来ない．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;尚，autotoolsの名前を取得するため，perlのパースが必要だった．とりあえず下ので対応．&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-daemonConfigurations&amp;gt;&lt;br /&gt; &amp;lt;parseConfigurations&amp;gt;&lt;br /&gt;   &amp;lt;parseConfiguration scriptName="perl" shortOptions="sTtuUWXe:"&amp;gt;&lt;br /&gt;   &amp;lt;/parseConfiguration&amp;gt;&lt;br /&gt; &amp;lt;/parseConfigurations&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-daemonConfigurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7386727866202635257?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7386727866202635257/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-autotools.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7386727866202635257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7386727866202635257'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-autotools.html' title='AOVCSの実用性検証 - autotools'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/SwqEQMt2n8I/AAAAAAAAAOU/V1LNUs6g8hM/s72-c/Autoconf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1341733391552338616</id><published>2009-11-23T18:56:00.002+09:00</published><updated>2009-11-23T19:10:15.647+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - /usr/bin内，/Developer/usr/bin/内，/opt/local/bin/内編</title><content type='html'>もう少しコマンドの検証を続ける．自分が知っているコマンドだけだと結果が偏るので，/usr/bin内のコマンド全部をざっと見て，ファイルを操作しそうなコマンドを絞った．それが次．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;ant@&lt;br /&gt;apt@&lt;br /&gt;as*&lt;br /&gt;autoconf*&lt;br /&gt;automake*&lt;br /&gt;automake-1.10*&lt;br /&gt;autoreconf*&lt;br /&gt;autoscan*&lt;br /&gt;autospec*&lt;br /&gt;autoupdate*&lt;br /&gt;batch*&lt;br /&gt;bison*&lt;br /&gt;bsdmake*&lt;br /&gt;bsdtar*&lt;br /&gt;bspatch*&lt;br /&gt;bzip2*&lt;br /&gt;c++@&lt;br /&gt;c++-4.0*&lt;br /&gt;c++-4.2*&lt;br /&gt;c++filt*&lt;br /&gt;c2ph*&lt;br /&gt;c2ph5.10.0*&lt;br /&gt;c2ph5.8.9*&lt;br /&gt;c89*&lt;br /&gt;c99*&lt;br /&gt;cap*&lt;br /&gt;cc@&lt;br /&gt;compress*&lt;br /&gt;cpp*&lt;br /&gt;cpp-4.0*&lt;br /&gt;cpp-4.2*&lt;br /&gt;csplit*&lt;br /&gt;ctags*&lt;br /&gt;cvs*&lt;br /&gt;defaults*&lt;br /&gt;diff*&lt;br /&gt;diff3*&lt;br /&gt;diffpp*&lt;br /&gt;distcc*&lt;br /&gt;erb@&lt;br /&gt;etags*&lt;br /&gt;ex@&lt;br /&gt;find*&lt;br /&gt;flex*&lt;br /&gt;flex++@&lt;br /&gt;ftp*&lt;br /&gt;g++@&lt;br /&gt;g++-4.0*&lt;br /&gt;g++-4.2*&lt;br /&gt;gcc@&lt;br /&gt;gcc-4.0*&lt;br /&gt;gcc-4.2*&lt;br /&gt;gcov@&lt;br /&gt;gcov-4.0*&lt;br /&gt;gcov-4.2*&lt;br /&gt;gdb*&lt;br /&gt;gem@&lt;br /&gt;gm4*&lt;br /&gt;gnumake*&lt;br /&gt;gnutar*&lt;br /&gt;gprof*&lt;br /&gt;gunzip*&lt;br /&gt;gzip*&lt;br /&gt;headerdoc2html*&lt;br /&gt;i686-apple-darwin10-cpp-4.2.1*&lt;br /&gt;i686-apple-darwin10-g++-4.0.1*&lt;br /&gt;i686-apple-darwin10-g++-4.2.1*&lt;br /&gt;i686-apple-darwin10-gcc-4.0.1*&lt;br /&gt;i686-apple-darwin10-gcc-4.2.1*&lt;br /&gt;idlj@&lt;br /&gt;indent*&lt;br /&gt;irb@&lt;br /&gt;jar@&lt;br /&gt;java@&lt;br /&gt;javac@&lt;br /&gt;javadoc@&lt;br /&gt;javah@&lt;br /&gt;javap@&lt;br /&gt;javatool*&lt;br /&gt;ld*&lt;br /&gt;libtool*&lt;br /&gt;lipo*&lt;br /&gt;m4*&lt;br /&gt;make@&lt;br /&gt;merge*&lt;br /&gt;mib2c*&lt;br /&gt;mkdep*&lt;br /&gt;nano*&lt;br /&gt;nasm*&lt;br /&gt;osacompile*&lt;br /&gt;patch*&lt;br /&gt;pear*&lt;br /&gt;pecl*&lt;br /&gt;perl*&lt;br /&gt;perl5.10.0*&lt;br /&gt;perl5.8.9*&lt;br /&gt;perlcc*&lt;br /&gt;perlcc5.8.9*&lt;br /&gt;php*&lt;br /&gt;phpize*&lt;br /&gt;pstopdf*&lt;br /&gt;pydoc*&lt;br /&gt;pydoc2.5@&lt;br /&gt;pydoc2.6@&lt;br /&gt;python*&lt;br /&gt;python-config*&lt;br /&gt;python2.5@&lt;br /&gt;python2.5-config@&lt;br /&gt;python2.6@&lt;br /&gt;python2.6-config@&lt;br /&gt;pythonw*&lt;br /&gt;pythonw2.5@&lt;br /&gt;pythonw2.6@&lt;br /&gt;rake*&lt;br /&gt;rcs*&lt;br /&gt;rsync*&lt;br /&gt;ruby@&lt;br /&gt;scp*&lt;br /&gt;sftp*&lt;br /&gt;sqlite3*&lt;br /&gt;srm*&lt;br /&gt;ssh*&lt;br /&gt;strip*&lt;br /&gt;svn*&lt;br /&gt;svnadmin*&lt;br /&gt;tab2space*&lt;br /&gt;tar@&lt;br /&gt;tclsh@&lt;br /&gt;tclsh8.4@&lt;br /&gt;tclsh8.5@&lt;br /&gt;touch*&lt;br /&gt;uncompress*&lt;br /&gt;unzip*&lt;br /&gt;vi@&lt;br /&gt;view@&lt;br /&gt;vim*&lt;br /&gt;xar*&lt;br /&gt;xcodebuild*&lt;br /&gt;xcodeindex*&lt;br /&gt;yacc*&lt;br /&gt;zip*&lt;/pre&gt;&lt;br /&gt;うーん，多い．ちょっとげんなりしてきた．/usr/bin内のコマンド，一通りmanを見るだけで1日費やしてしまった．ペースあげないとまずそう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1341733391552338616?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1341733391552338616/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-usrbindeveloperusrbinoptlocalbin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1341733391552338616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1341733391552338616'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-usrbindeveloperusrbinoptlocalbin.html' title='AOVCSの実用性検証 - /usr/bin内，/Developer/usr/bin/内，/opt/local/bin/内編'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5213979092729574341</id><published>2009-11-20T20:46:00.003+09:00</published><updated>2009-11-20T22:28:14.490+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - /bin/内編</title><content type='html'>/bin/内のコマンドについて確認．ユーザが直接操作する場合は自動管理対象となるはずなので，そう扱えば良い．&lt;br /&gt;&lt;br /&gt;lsで出たアルファベット順に．ちゃんとmanも確認している．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;[&lt;/span&gt; ：testと同じコマンド．ファイルは作成しないのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;bash&lt;/span&gt;：シェルが扱ったものを自動管理とすると，リダイレクトなどで実行結果を吐き出させたものも管理されてしまう．なので，&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理対象とすべきではない．スルー&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;cat&lt;/span&gt;：ファイルを作成しないのでスルー．リダイレクトは，シェルが扱う&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;chmod&lt;/span&gt;：ファイル属性を変更するだけなのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;cp&lt;/span&gt;：ファイルコピー．ユーザが直接操作する場合は&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理すべき&lt;/span&gt;．weakで自動管理と指定．シェルスクリプトで使われる場合はシェルスクリプトに依存するが，その場合はシェルスクリプトで挙動を指定すべきな&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;csh&lt;/span&gt;：シェルはスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;date&lt;/span&gt;：日付を色々なフォーマットで出力．/var/log に何か吐き出す様だが，バージョン管理に関係ない場所なのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;dd&lt;/span&gt;：全然使わないので分からないけど，&lt;span style="color: rgb(255, 0, 0);"&gt;ディスクのバックアップに使うコマンドとのことなので，それはバージョン管理する規模ではない．スルー&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;df&lt;/span&gt;：ディスクの空き状況を表示．ファイルを特に作成しないのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;domainname&lt;/span&gt;：ドメインネームを表示/指定するとの事だが，使わないしファイル操作もない模様なのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;echo&lt;/span&gt;：文字列出力．ファイル操作は無いのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ed&lt;/span&gt;：&lt;span style="color: rgb(255, 0, 0);"&gt;ファイルエディタらしいので，自動管理&lt;/span&gt;とするが，使った事は無い&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;expr&lt;/span&gt;：計算し，その結果を出力する．ファイルは関係ないのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;hostname&lt;/span&gt;：ホスト名を表示/指定する．ファイル操作は無いのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;kill&lt;/span&gt;：プロセスにシグナルを送信する．ファイル操作は無いのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ksh&lt;/span&gt;：シェルはスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;launchctl&lt;/span&gt;：launchdを操作するコマンド．オプションが多いが，ファイルを生成するような事は無いのでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;link/ln&lt;/span&gt;：リンクコマンド．&lt;span style="color: rgb(255, 0, 0);"&gt;場合によって管理すべき場合と管理すべきでない場合がある&lt;/span&gt;．例えばシンボリックリンクの場合，別の作業ディレクトリへの簡易アクセスという事がある．これはユーザによって違うので管理すべきでない．逆に，別ディレクトリで作ったファイルのコピーとして扱う場合，バージョン管理した方が良い．&lt;span style="color: rgb(255, 0, 0);"&gt;よってこれはprompt&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ls&lt;/span&gt;：ファイル一覧表示．lsがファイルを作成する事は無い(リダイレクトはあるにしても)のでスルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;mkdir&lt;/span&gt;：ディレクトリ作成．&lt;span style="color: rgb(255, 0, 0);"&gt;cpと同じ理論で自動管理すべき&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;mv&lt;/span&gt;：ファイル，ディレクトリ移動，名前変更．移動は何も指定しなくても自動管理するので，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;pax&lt;/span&gt;：アーカイブ操作コマンド．らしい．使わないので分からない．そもそも&lt;span style="color: rgb(255, 0, 0);"&gt;アーカイブ系のコマンドは扱いが難しい&lt;/span&gt;．これも&lt;span style="color: rgb(255, 0, 0);"&gt;prompt&lt;/span&gt;かな&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ps&lt;/span&gt;：プロセス情報の表示．ファイルは扱わないので，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;pwd&lt;/span&gt;：Current Working Directoryを表示．man的には，Pathname of current Working Directoryなのかな？スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;rcp&lt;/span&gt;：リモートファイルコピー．今だとscpを使う事がほとんど．ユーザが手動で行うファイル操作なので，&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;rm&lt;/span&gt;：ファイル削除．&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;rmdir&lt;/span&gt;：ディレクトリ削除．&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sh&lt;/span&gt;：シェル．スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sleep&lt;/span&gt;：一定時間スリープ．ファイル操作は無いので，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;stty&lt;/span&gt;：ターミナルのオプション指定．ファイル操作は無いので，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sync&lt;/span&gt;：ディスクキャッシュをディスクに書き出す．スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;tcsh&lt;/span&gt;：シェル．スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;test&lt;/span&gt;：[と同じで，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;unlink&lt;/span&gt;：rmと同じ．&lt;span style="color: rgb(255, 0, 0);"&gt;自動管理&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;wait4path&lt;/span&gt;：指定したパスのファイルが出来るまでsleep．ファイルを作成する訳ではないので，スルー&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;zsh&lt;/span&gt;：シェル．スルー&lt;/li&gt;&lt;/ul&gt;以上．長かった．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5213979092729574341?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5213979092729574341/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-bin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5213979092729574341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5213979092729574341'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-bin.html' title='AOVCSの実用性検証 - /bin/内編'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7592443379315767686</id><published>2009-11-19T22:43:00.004+09:00</published><updated>2009-11-19T23:30:11.643+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interface Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Interface Builder編</title><content type='html'>Xcodeを調査しておいて，Interface Builderの方を放置していた．なのでちょっとそれをやる．&lt;br /&gt;&lt;br /&gt;Interface Builderは，MacのGUIを作るソフト．*.xibという，クラスのインスタンス(GUIパーツ)とその包含関係とか色々を記述したXMLファイルを扱う．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえず操作をしてみてトレースを取得した．その結果が次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;sqlite&amp;gt; select filename1,processnames from trace where processnames like "%Interface%" group by filename1;&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.000|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.001|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.002|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.003|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.004|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.005|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/.dat3fa6.006|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/DTAssetLibraryAssetDates.plist|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Application Support/Interface Builder 3.0/Library/DTAssetLibraryGroups.plist|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Caches/com.apple.InterfaceBuilder3/Cache.db-journal|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/.GlobalPreferences.plist|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/.GlobalPreferences.plist.1gqgIii|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.0Cuq981|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.0RIoPn1|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.1ZxUuky|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.3negjI7|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.DauctxW|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.EP71K0s|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.F88PFyh|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.GpPreHT|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.JfqbVfj|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.Jwu02nl|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.LJg7La2|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.MHe0wXE|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.azzd0rq|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.bhJ2mWQ|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.i40xfr4|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.jWLiUCG|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.owuUHqA|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.t0K8XnA|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.vrjZvSi|Interface Builder launchd launchd&lt;br /&gt;/Users/hitoshi-s/Library/Preferences/com.apple.InterfaceBuilder3.plist.zwzKzku|Interface Builder launchd launchd&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;/Users/hitoshi-s/someDir/TestSvn/TestSvn/English.lproj/MainMenu.xib|Interface Builder launchd launchd&lt;/span&gt;&lt;br /&gt;/private/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/TemporaryItems/(A Document Being Saved By Interface Builder)|Interface Builder launchd launchd&lt;br /&gt;/private/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/TemporaryItems/(A Document Being Saved By Interface Builder)/MainMenu.xib|Interface Builder launchd launchd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;MainMenu.xib以外は操作してない．他のは，InterfaceBuilderそれ自体の設定だったり一次ファイルだったり．Save asを見ると，&lt;span style="color: rgb(255, 0, 0);"&gt;*.nibという形式も扱えるようなので，そっちも自動管理対象とすべき&lt;/span&gt;だな．そのくらい．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7592443379315767686?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7592443379315767686/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-interface-builder.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7592443379315767686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7592443379315767686'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-interface-builder.html' title='AOVCSの実用性検証 - Interface Builder編'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8352438218920418217</id><published>2009-11-19T19:23:00.002+09:00</published><updated>2009-11-19T20:48:49.550+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='Emacs'/><title type='text'>AOVCSの実用性検証 - Emacs版</title><content type='html'>エディタ編その2．今度はEmacs．&lt;br /&gt;&lt;br /&gt;今まで開発にガンガン使ってきたし，実際にautoflagsでファイルを自動管理出来てきているので，次の設定で今のところ問題は無い．&lt;br /&gt;&lt;pre name="code" class="xml"&gt;    &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;Emacs&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;emacs&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;exceptions&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;   &amp;lt;/exceptions&amp;gt;&lt;br /&gt; &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ちなみに自動保存(#*#)/バックアップ(*~)ファイルはBazaarが自動で無視してくれるので設定していない．他のVCSで利用する事を考えると，設定しておくべきか．&lt;br /&gt;&lt;br /&gt;ということで，Emacsのトレースを取得してみた．利用している設定/拡張は次の通り．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;バックアップファイルを，~/.bak/内に保存&lt;/li&gt;&lt;li&gt;flymake (オンタイムエラーチェック，g++を背後で起動)&lt;/li&gt;&lt;/ul&gt;これでC++のファイルを新しく作成，保存，終了，改めてファイルを開いて編集，保存，終了としてみた．その結果が次．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;sqlite&amp;gt; select filename1, processnames from trace where date&gt;1258625627 and processnames like "%Emacs%" group by filename1;&lt;br /&gt;/Users/hitoshi-s/.bak/!Users!hitoshi-s!someDir!helloEmacs.cpp~|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/.emacs.d/.#anything-c-adaptive-history|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/.emacs.d/auto-save-list/.saves-13354-hi-air.local~|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/.emacs.d/auto-save-list/.saves-15613-hi-air.local~|Emacs bash login Terminal launchd launchd&lt;br /&gt;/Users/hitoshi-s/.emacs.d/auto-save-list/.saves-15829-hi-air.local~|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/.emacs.d/auto-save-list/.saves-15869-hi-air.local~|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/#helloEmacs.cpp#|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/.#helloEmacs.cpp|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/.#helloEmacs_flymake.cpp|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/helloEmacs.cpp|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/helloEmacs_flymake.cpp|Emacs launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/helloEmacs_flymake.o|as as i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//cc0TAG5u.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//cc12Tenx.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//cc35ypEo.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//cc8Lconx.s|i686-apple-darw g++ Emacs baslogin Terminal launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccCSHFGg.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccLAVPFO.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccMpOrVS.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccPsVnpf.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccRfEUqN.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccUosBDf.s|i686-apple-darw g++ Emacs baslogin Terminal launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccfph8XQ.s|i686-apple-darw g++ Emacs baslogin Terminal launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccmPagRA.s|i686-apple-darw g++ Emacs baslogin Terminal launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccrQfKNq.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;/var/folders/QQ/QQA+ujrJFO43tJOv83wquE+++TM/-Tmp-//ccwFTcUY.s|i686-apple-darw g++ Emacs launchd launchd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;色々あるけど，後半の&lt;span style="color: rgb(255, 0, 0);"&gt;/var/folders/内のは全てg++の途中ファイルなのでスルー&lt;/span&gt;．仮にスルーしなくても，g++が無視設定を行っていれば問題は起こらない．&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;バックアップファイルである*~は，当然バージョン管理すべきではないので，ignore．#*#の自動保存ファイルも同様にignore&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;やや困るのは，*_flymake.cpp．これは，flymakeでg++を実行する為にEmacsが自動で作成するファイル．当然管理すべきではないし，flymakeが終わったら自動で削除されるので大して影響は無いはずのだが，もしflymake中にEmacsが落ちると残り，Emacsが作ったという理由から自動管理されてしまう．&lt;br /&gt;もしignoreとするのであれば，*_flymake.*をignoreに入れる事になる．が，後置型の*は危険なのであまりやりたくない．とりあえず&lt;span style="color: rgb(255, 0, 0);"&gt;リスクは低いので，スルーにしよう&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;他に，.#から始まるファイルが存在する．試しにトレースの詳細を見てみる．&lt;br /&gt;&lt;pre class="prettyprint"&gt;sqlite&amp;gt; select * from trace where filename1="/Users/hitoshi-s/someDir/.#helloEmacs.cpp";&lt;br /&gt;422616|5|/Users/hitoshi-s/someDir/.#helloEmacs.cpp|/Users/hitoshi-s/someDir/hitoshi-s@hi-air.local.15613|Emacs bash login Terminal launchd launchd|1258625746&lt;br /&gt;422640|1|/Users/hitoshi-s/someDir/.#helloEmacs.cpp||Emacs bash login Terminal launchd launchd|1258625766&lt;br /&gt;423292|5|/Users/hitoshi-s/someDir/.#helloEmacs.cpp|/Users/hitoshi-s/hitoshi-s@hi-air.local.15829|Emacs launchd launchd|1258627255&lt;br /&gt;423304|1|/Users/hitoshi-s/someDir/.#helloEmacs.cpp||Emacs launchd launchd|1258627262&lt;br /&gt;423364|5|/Users/hitoshi-s/someDir/.#helloEmacs.cpp|/Users/hitoshi-s/hitoshi-s@hi-air.local.15869|Emacs launchd launchd|1258627428&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5という数字は「リンク(シンボリック/ハード)」を指すので，何かのリンク(実際見るとシンボリックリンク)という事が分かる．ただ，&lt;span style="color: rgb(51, 51, 255);"&gt;リンク先のファイルの実体が存在しない&lt;/span&gt;．なんだろこれ？うーん，&lt;span style="color: rgb(255, 0, 0);"&gt;.#から始まるリンクファイルは，ignore&lt;/span&gt;するというのでいいかな．&lt;br /&gt;&lt;br /&gt;とりあえずこんなとこか．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8352438218920418217?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8352438218920418217/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-emacs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8352438218920418217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8352438218920418217'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-emacs.html' title='AOVCSの実用性検証 - Emacs版'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8491874087783356569</id><published>2009-11-19T17:55:00.004+09:00</published><updated>2009-11-19T23:36:29.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - vi版</title><content type='html'>Xcodeは昨日ので大体OKなので今度はviを検証する．&lt;br /&gt;Emacsはよく使うのだが，viはどんな拡張があるのか分からないので，デフォルトの状態で使う．&lt;br /&gt;&lt;br /&gt;とりあえずHelloWorldを作って，どんなファイル操作をしてるか見てみた．それが次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;sqlite&amp;gt; select filename1,processnames from trace where processnames like "vi%";&lt;br /&gt;/Users/hitoshi-s/someDir/.hellow.c.swp|vi bash login Terminal launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/.hellow.c.swx|vi bash login Terminal launchd launchd&lt;br /&gt;/Users/hitoshi-s/someDir/hellow.c|vi bash login Terminal launchd launchd&lt;br /&gt;/Users/hitoshi-s/.viminfo.tmp|vi bash login Terminal launchd launchd&lt;br /&gt;/Users/hitoshi-s/.viminfo|vi bash login Terminal launchd launchd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.swpファイル，.swxファイルが自動生成ファイルの模様．これらはignore対象．.viminfoは作業ディレクトリ内に出来る訳ではないので特に指定する必要も無いが，操作履歴なのでignore対象．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;統合開発環境と比べて，エディタは楽．ただ，SQLiteの内容を見るのがちょっと面倒だと感じ始めた．ビューアを作りたいがどうしようか．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2009/11/19 23:30追記&lt;br /&gt;vimでも同じトレースだった&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8491874087783356569?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8491874087783356569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-vi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8491874087783356569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8491874087783356569'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-vi.html' title='AOVCSの実用性検証 - vi版'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-172289558579379616</id><published>2009-11-18T23:21:00.004+09:00</published><updated>2009-11-18T23:36:04.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Xcode版</title><content type='html'>Eclipseの設定は後で記述するとして，今度はXcodeの調査を行う．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;といっても以前AOVCSのGUIを作成時に使っているし，こちらは比較的資料が多いので，実際に使うまでもなさそう．以前使った際には，buildディレクトリのみをignoreしていた．では，参考資料を示す．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;資料その1：「Xcode 3 UNLEASHED」という本&lt;br /&gt;&lt;br /&gt;P.97に，XcodeでSCM (Software Configuration Management)を使う方法として，Subversionが無視すべきファイルの設定がある．ここの記述は以下．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;build&lt;br /&gt;*.nib&lt;br /&gt;*.so&lt;br /&gt;*.pbxuser&lt;br /&gt;*.mode*&lt;br /&gt;*.perspective*&lt;br /&gt;&lt;/pre&gt;buildディレクトリだけでなく，nibファイルとかユーザの設定とかそういうのも無視すべきとの事．nibファイルもなのか．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;資料その2：&lt;a href="http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects"&gt;「Git ignore file for Xcode projects」&lt;/a&gt;という質問ページ&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;.DS_Store&lt;br /&gt;*.swp&lt;br /&gt;*~.nib&lt;br /&gt;&lt;br /&gt;build/&lt;br /&gt;&lt;br /&gt;*.pbxuser&lt;br /&gt;*.perspective&lt;br /&gt;*.perspectivev3&lt;br /&gt;&lt;br /&gt;*.mode1v3&lt;br /&gt;*.mode2v3&lt;br /&gt;&lt;/pre&gt;これらをignore設定すれば良いそう．上の参考資料よりも，こっちの方が良さげ．後置型の*を使ってないし．なので，下をデフォルト設定とすることにしよう．ただ，.DS_Storeを作成するのはFinderのはずなので，それをここで含める必要は無い．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-172289558579379616?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/172289558579379616/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-xcode.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/172289558579379616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/172289558579379616'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-xcode.html' title='AOVCSの実用性検証 - Xcode版'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6923284668579322067</id><published>2009-11-18T18:15:00.005+09:00</published><updated>2009-11-18T21:27:47.399+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Eclipse版 (4) - EclipseUML</title><content type='html'>AOVCSがEclipseで適用出来るかの調査第4回．これだけにそんな時間はかけられないので，これでEclipseの調査は終わり．あとはConfigurationを書き出して，どこまで上手く管理出来るかを述べる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まず，EclipseUMLをインストールして，クラス図を作ってみた．その際に作成されたファイルは次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;.umlproject&lt;/li&gt;&lt;li&gt;*.uml&lt;/li&gt;&lt;li&gt;*.ucd&lt;/li&gt;&lt;/ul&gt;またどれを管理したらいいか難しい．Code synchronizationを使う(むしろデフォルト)と，.javaファイルと.ucdが同期する事になるし．&lt;br /&gt;.javaファイルから.ucdを作る，と考えれば.javaだけ管理すれば良いとなる．しかし，UML内にメモなどを書き出すと，.ucdも管理すべき対象となる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;自分では分からなかったので，ちょっとググった．そーすると，次のページが見つかった．&lt;br /&gt;&lt;a href="http://www.forum-omondo.com/documentation_eclipseuml_2008/Team%20work/index.html"&gt;http://www.forum-omondo.com/documentation_eclipseuml_2008/Team%20work/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;EclipseUMLを開発しているomondoのドキュメント．ここによれば，Code Synchronizationを使う場合は次のファイルをバージョン管理すると良いらしい．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;java code&lt;/li&gt;&lt;li&gt;graphical diagram (e.g. .ucd, .usd, .uud etc..file)&lt;/li&gt;&lt;li&gt;model file (e.g. .uml file)&lt;/li&gt;&lt;/ul&gt;こうすると，上手くいくとある．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EclipseUMLの開発元が言うのだから正しいと思ったが，よく考えるとこれが上手く動くのは，最初にUMLを共同作業で作成する，の部分だけではあるまいか？この記事も，UMLを恊働で作る，という状況での指針となっている．&lt;span style="color: rgb(51, 51, 255);"&gt;そのため，実際にコーディングが始まると，どう考えても面倒なコンフリクトが起こる&lt;/span&gt;はず．&lt;br /&gt;&lt;br /&gt;ただ逆に考えれば，&lt;span style="color: rgb(255, 0, 0);"&gt;UMLを作る段階でコーディングをしないとすれば，この管理方法で良い&lt;/span&gt;という事にもなる．うーん，なるほど．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;だがやはり，AOVCSでどちらの挙動をすべきかは決められない．となるとやはりこれもpromptとしないといけない．ただ，どういう時に管理すべきでどういう時に管理すべきでないかは分かった．この情報を有効利用する為，AOVCSがpromptと表示する際に，どうすべきかの指針を示してあげる事が出来たらいいのではないかと考え中．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また，.javaファイルに影響しないファイルであれば管理出来るだろうと考え，同時に開発するという事をやろうとしたが，EclipseUMLの何かしらのライセンスが必要なようでストップ．学内で使えるところが無いか今度調べよう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6923284668579322067?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6923284668579322067/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-4-eclipseuml.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6923284668579322067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6923284668579322067'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-4-eclipseuml.html' title='AOVCSの実用性検証 - Eclipse版 (4) - EclipseUML'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5064548773994175722</id><published>2009-11-17T21:18:00.004+09:00</published><updated>2009-11-17T22:40:28.870+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Eclipse版 (3)</title><content type='html'>前回，EclipseのVCSプラグインが自動管理する/しないの調査を行った．今回は，Eclipseを用いて開発しているプロジェクトが，どのファイルをバージョン管理し，どのファイルをバージョン管理しないと指定しているかを調べる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前回調べたのがC++とJavaである以上，調査対象もC++とJavaの両方としたい．しかし，EclipseでC++を開発しているオープンソースのリポジトリに何があるか分からなかった為，今回はJavaだけとしている．&lt;br /&gt;&lt;br /&gt;例として扱うのは，Seasar2のリポジトリ．このリポジトリはsvnで管理されている．svnが何をignoreしているかを見るには.svn内の，dir-prop-baseとかdir-propsを参照すればよい．中に，以下の様に記述されている．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ cat diigu/org.seasar.diigu.eclipse.plugin/.svn/dir-prop-base&lt;br /&gt;K 10&lt;br /&gt;svn:ignore&lt;br /&gt;V 8&lt;br /&gt;&lt;br /&gt;target&lt;br /&gt;&lt;br /&gt;END&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;まず，リポジトリ内のdir-prop-baseとdir-propsの中身を拾ってくる．どっかのリポジトリに入って，次のコマンドを実行すると，catで連結したpropsを取得出来る．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ find . -name dir-prop-base -or -name dir-props | xargs -n 1 cat&lt;/pre&gt;この出力をファイルに保存して，Emacsで適当に編集してまとめたのが次．いくつものプロジェクトの混合体になっているので，全プロジェクトでこれがignoreされている訳ではない事に注意．&lt;br /&gt;&lt;pre class="prettyprint"&gt;build&lt;br /&gt;target&lt;br /&gt;release.properties&lt;br /&gt;cobertura.ser&lt;br /&gt;.classpath&lt;br /&gt;.project&lt;br /&gt;work&lt;br /&gt;bin&lt;br /&gt;classes&lt;br /&gt;dist&lt;br /&gt;result.txt&lt;br /&gt;classlist.txt&lt;br /&gt;objdbc5.jar&lt;br /&gt;xadatasource_oracle.dicon&lt;br /&gt;xadatasource_db2.dicon&lt;br /&gt;.settings&lt;br /&gt;ddl&lt;br /&gt;sql&lt;br /&gt;db2.dicon&lt;br /&gt;temp&lt;br /&gt;sqljdbc.jar&lt;br /&gt;main&lt;br /&gt;example&lt;br /&gt;&lt;/pre&gt;うーん．色々ignoreしている．.classpathとか.settingsとか.projectもignore対象になってたりもする．これは，&lt;span style="color: rgb(255, 0, 0);"&gt;.classpathと.settingsと.projectは，ユーザに入力を求めるしか無い&lt;/span&gt;な．&lt;br /&gt;&lt;br /&gt;また逆に，binディレクトリがバージョン管理されているという場合もあった．ベンチマークとかチュートリアルとか．これについては，レアなケースかつbinは通常.classファイルを置く場所なので，&lt;span style="color: rgb(255, 0, 0);"&gt;大半の人には自動管理しないのが妥当と判断し，binは無視する&lt;/span&gt;とすべき．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どれがどうしてignoreされているのか，その理由も調べたいが，その余力はちょっとなさそう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5064548773994175722?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5064548773994175722/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5064548773994175722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5064548773994175722'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-3.html' title='AOVCSの実用性検証 - Eclipse版 (3)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-9030848818152142051</id><published>2009-11-17T17:52:00.003+09:00</published><updated>2009-11-17T21:15:13.875+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Eclipse版 (2)</title><content type='html'>前回，Eclipse上でプロジェクトを作成してみて，どんなファイルが何によって作られているかを見た．&lt;br /&gt;&lt;br /&gt;今度は，どのファイルをバージョン管理すべきかを考える．アプローチは次の2つ．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;EclipseのVCSプラグインを入れて，何が管理されるかを観察する&lt;/li&gt;&lt;li&gt;Eclipseを用いて開発しているプロジェクトを見つけて，何が管理されているか確認する&lt;/li&gt;&lt;/ul&gt;まずは前者を行う．対象は，C++とJava．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まずC++．Standard Make C++ Projectは，管理すべきでないファイルを生成するのはmakeであり，makeはEclipseのサブプロセスとして実行される．よって，makeの生成物を管理しない，という設定をしてさえいればOK．&lt;br /&gt;問題は，Managed Make C++ Projectである．とりあえずhelloworldを作ってみて，バージョン管理をしてみた．使ったVCSは，SubversionとBazaar．管理対象ファイルは下の図の通り．.bzrディレクトリは無視してください．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SwKJAaXztVI/AAAAAAAAAOM/h6RD3bYgEck/s1600/091117-0003.png"&gt;&lt;img style="cursor: pointer; width: 291px; height: 243px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SwKJAaXztVI/AAAAAAAAAOM/h6RD3bYgEck/s320/091117-0003.png" alt="" id="BLOGGER_PHOTO_ID_5405033142970201426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，これをバージョン管理する．まずはBazaarがデフォルトで追加しようとしたもの．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SwKI_8rSj5I/AAAAAAAAAOE/VCCtKp9h-TU/s1600/091117-0002.png"&gt;&lt;img style="cursor: pointer; width: 219px; height: 320px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SwKI_8rSj5I/AAAAAAAAAOE/VCCtKp9h-TU/s320/091117-0002.png" alt="" id="BLOGGER_PHOTO_ID_5405033134998851474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;全部．拡張意味ないです．結局自分で選択しないといけません．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次．Subversion．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SwKI_glLIoI/AAAAAAAAAN8/L4xV17ZeykQ/s1600/091117-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 299px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SwKI_glLIoI/AAAAAAAAAN8/L4xV17ZeykQ/s320/091117-0001.png" alt="" id="BLOGGER_PHOTO_ID_5405033127457006210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;どうやって情報を取得しているかは知らないけど，&lt;span style="color: rgb(255, 0, 0);"&gt;Debugディレクトリは無視されている&lt;/span&gt;．.projectとか，.から始まるファイルは候補として表示されている為，管理してもいい様だ．&lt;br /&gt;&lt;br /&gt;Debugディレクトリはどうやって無視すると決めているのか気になったので，適当にリネームしてみた．しかしそれでもDebugは自動的に無視される．逆に，ソースディレクトリをDebugとかにリネームしても，きちんと管理候補として表示する．&lt;br /&gt;&lt;br /&gt;どうやってるかは分からないけど，&lt;span style="color: rgb(255, 0, 0);"&gt;Subversionの方はファイルパターンではなく，何かしらのファイル，ディレクトリの属性情報を用いているようだ&lt;/span&gt;．パターンでは駄目か？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さて次はJava．こっちはSubversionでもBazaarでも，両方大体おんなじ挙動をした．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;binは管理対象としない&lt;/li&gt;&lt;li&gt;それ以外は管理対象とする&lt;/li&gt;&lt;li&gt;binをリネームすると，管理対象にしたりしなかったりする (case by case)&lt;/li&gt;&lt;/ul&gt;まだEclipseのVCSプラグインがどこまでお膳立てしてくれるのかよくわかってないが，&lt;span style="color: rgb(255, 0, 0);"&gt;案外大した事はしてくれない&lt;/span&gt;様である．例えば，ファイル名を変更する場合，EclipseのRefactor -&amp;gt; Renameを用いる．だが，それを用いたからと言って，svn mvやbzr mvを実行したとは扱ってくれない．deleteとaddとして扱う．&lt;br /&gt;&lt;br /&gt;案外Control Integrationとか行ってないんだなーとかニヤニヤしながら，binをリネームする事は無いと信じよう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-9030848818152142051?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/9030848818152142051/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9030848818152142051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9030848818152142051'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse-2.html' title='AOVCSの実用性検証 - Eclipse版 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/SwKJAaXztVI/AAAAAAAAAOM/h6RD3bYgEck/s72-c/091117-0003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4320256589063893820</id><published>2009-11-16T21:23:00.004+09:00</published><updated>2009-11-16T22:46:39.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの実用性検証 - Eclipse版</title><content type='html'>AOVCSという手法がどこまで通用するかを検証する．まずは，Eclipse．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;自分はEclipseを全然使わない人間なのだが，EclipseでAOVCSが上手く動くとすれば，それはすばらしい．なぜかと言えば，専用のプラグインを使わなくても自動でバージョン管理が出来るからである．&lt;br /&gt;まーでもEclipseで使う場合は，一発で自動管理する，ってボタンが欲しいとこだろうし，どのファイルが管理されているかの視覚情報も必要だろうから，プラグインが不要，とはいかない．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，その自動管理が上手く動くかどうかを調査する為，Eclipseをインストール &amp;amp; 適当にファイルの作成を行った．そのトレース結果．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;java開発 (sqliteからクエリで取得)：&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/.classpath||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/.project||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/.settings||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/.settings/org.eclipse.jdt.core.prefs||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/bin||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/bin/root||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/bin/root/Controller.class||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/src|eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/src/root||eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestBazaar/src/root/Controller.java||eclipse launchd launchd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;全てがeclipseによって作られたという悲しい結果．コンパイルくらいコンパイラをサブプロセスとして立ち上げればいいのに&lt;/span&gt;．まぁそもそもファイル名のパターンによる例外処理を導入したのも，この理由なんだけど．&lt;br /&gt;とりあえずこんな小さい規模で，他のファイルも全然ないような状況であれば，bin内を無視とすれば良さげ．.settings内とか.classpathとか.projectをバージョン管理すべきかどうかはよくわからない．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次．C++開発．CDTをインストールして，Standard Make C++ Projectと，Managed Make C++ Projectの両方のトレースを取得した．まずはStandard Make C++ Project．自分でmakefileを作ってあげる必要がある．&lt;br /&gt;&lt;br /&gt;Standard Make C++ Project：&lt;br /&gt;&lt;pre class="prettyprint"&gt;/Users/hitoshi-s/Documents/workspace/TestC++/.project||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++/.cdtproject||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++/src||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++/src/controller.cpp||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++/makefile||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++/a.out||ld collect2 i686-apple-darw g++-4.2 make eclipse eclipse launchd launchd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こちらは&lt;span style="color: rgb(255, 0, 0);"&gt;サブプロセスとしてmakeを起動してコンパイル&lt;/span&gt;している．よって，AOVCSでmakeを設定してさえいれば自動管理が出来る．他のファイルの管理云々は，javaの場合と大体共通かな？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次．Managed Make C++ Project．こちらは，Eclipseが自動でmakefileを作ってくれるというもの．どうやって？って部分は気になるが気にしないとしておく．&lt;br /&gt;&lt;br /&gt;Managed Make C++ Project:&lt;br /&gt;&lt;pre class="prettyprint"&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/.project||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/.cdtproject||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/.cdtbuild||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/src||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/src/Controller.cpp||eclipseeclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/sources.mk||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/src||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/src/subdir.mk||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/makefile||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/objects.mk||eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/src/Controller.o||as as i686-apple-darw g++ sh make eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/src/Controller.d||sh make eclipse eclipse launchd launchd&lt;br /&gt;/Users/hitoshi-s/Documents/workspace/TestC++Version2/Debug/TestC++Version2||ld collect2 i686-apple-darw g++-4.2 make eclipse eclipse launchd launchd&lt;br /&gt;&lt;/pre&gt;こちらは，&lt;span style="color: rgb(255, 0, 0);"&gt;Controllerや バイナリ(TestC++Version2)はmakeサブプロセスによって作られている&lt;/span&gt;事が分かる．しかし，&lt;span style="color: rgb(51, 51, 255);"&gt;Debug内のEclipseによって自動生成されたファイル群は，Eclipseが作ったとしか分からない&lt;/span&gt;．そもそもDebugをバージョン管理しない，と決めない限り，これを上手く動かすのは難しそうである．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4320256589063893820?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4320256589063893820/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4320256589063893820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4320256589063893820'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-eclipse.html' title='AOVCSの実用性検証 - Eclipse版'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7264803350496650687</id><published>2009-11-11T16:48:00.004+09:00</published><updated>2009-11-11T17:45:27.844+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-benchmark'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='d-script'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>AOVCS benchmark (2)</title><content type='html'>とりあえず全部の測定結果を出したので，それを．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Svpso-ld3OI/AAAAAAAAANk/QmbAopRTUBQ/s1600-h/091111-0001.png"&gt;&lt;img style="cursor: pointer; width: 316px; height: 320px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Svpso-ld3OI/AAAAAAAAANk/QmbAopRTUBQ/s320/091111-0001.png" alt="" id="BLOGGER_PHOTO_ID_5402750154235043042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;やはり，forkだけが際立って消費時間の増加率が高い．&lt;br /&gt;&lt;br /&gt;次のグラフが，増加率をグラフで比較したもの．fork()は目盛りを振り切るけど無視．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SvpspvJu9nI/AAAAAAAAAN0/O77Yt102kUw/s1600-h/091111-0003.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 294px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SvpspvJu9nI/AAAAAAAAAN0/O77Yt102kUw/s320/091111-0003.png" alt="" id="BLOGGER_PHOTO_ID_5402750167272060530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SvpspQR237I/AAAAAAAAANs/3pGevl0yScY/s1600-h/091111-0002.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 294px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SvpspQR237I/AAAAAAAAANs/3pGevl0yScY/s320/091111-0002.png" alt="" id="BLOGGER_PHOTO_ID_5402750158984634290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;大体1.5倍から4倍の範囲&lt;/span&gt;となっている．ただしforkを除く．&lt;br /&gt;&lt;br /&gt;この結果から安直に，システムコールに1.5倍から4倍の時間が費やされる，と考えるのは間違っている．なぜなら，&lt;span style="color: rgb(255, 0, 0);"&gt;利用頻度が低いシステムコールが4倍になったところで，ユーザにとって大した問題とはならない&lt;/span&gt;からである．同様に，&lt;span style="color: rgb(255, 0, 0);"&gt;もともとわずかしかCPU時間を費やさないシステムコールの消費時間が4倍になっても，問題は無い&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで今度は，システムコールの頻度と，それぞれの消費時間を測定する．&lt;br /&gt;まず，システムコールの頻度は，dtraceを用いて非常に簡単に測定出来る．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo dtrace -n 'syscall:::entry{@counts[probefunc]=count();}'&lt;/pre&gt;&lt;br /&gt;これを実行して，適当なタイミングでCtrl-cで終了させると，次のような結果を取得出来る．この結果は，dtraceを20秒起動した場合の結果．&lt;br /&gt;&lt;pre class="prettyprint"&gt;  audit                                                             1&lt;br /&gt;audit_session_join                                                1&lt;br /&gt;chflags                                                           1&lt;br /&gt;connect_nocancel                                                  1&lt;br /&gt;ftruncate                                                         1&lt;br /&gt;getaudit_addr                                                     1&lt;br /&gt;getlogin                                                          1&lt;br /&gt;getpgid                                                           1&lt;br /&gt;listen                                                            1&lt;br /&gt;listxattr                                                         1&lt;br /&gt;setaudit_addr                                                     1&lt;br /&gt;sync                                                              1&lt;br /&gt;audit_session_self                                                2&lt;br /&gt;auditon                                                           2&lt;br /&gt;csops                                                             2&lt;br /&gt;fgetxattr                                                         2&lt;br /&gt;fstat                                                             2&lt;br /&gt;fsync_nocancel                                                    2&lt;br /&gt;getpeername                                                       2&lt;br /&gt;getsockname                                                       2&lt;br /&gt;rename                                                            2&lt;br /&gt;vfork                                                             2&lt;br /&gt;bind                                                              3&lt;br /&gt;chmod                                                             3&lt;br /&gt;chown                                                             3&lt;br /&gt;getpgrp                                                           3&lt;br /&gt;getsockopt                                                        3&lt;br /&gt;chdir                                                             4&lt;br /&gt;gethostuuid                                                       4&lt;br /&gt;setgid                                                            4&lt;br /&gt;setlogin                                                          4&lt;br /&gt;symlink                                                           4&lt;br /&gt;umask                                                             4&lt;br /&gt;fchdir                                                            5&lt;br /&gt;flock                                                             5&lt;br /&gt;fsctl                                                             5&lt;br /&gt;getpriority                                                       5&lt;br /&gt;recvmsg_nocancel                                                  5&lt;br /&gt;wait4_nocancel                                                    5&lt;br /&gt;flistxattr                                                        6&lt;br /&gt;kill                                                              6&lt;br /&gt;setsid                                                            6&lt;br /&gt;setuid                                                            6&lt;br /&gt;getdtablesize                                                     7&lt;br /&gt;posix_spawn                                                       7&lt;br /&gt;readlink                                                          8&lt;br /&gt;getppid                                                           9&lt;br /&gt;msync                                                             9&lt;br /&gt;poll_nocancel                                                     9&lt;br /&gt;workq_open                                                        9&lt;br /&gt;getgroups                                                        10&lt;br /&gt;kqueue                                                           10&lt;br /&gt;recvmsg                                                          10&lt;br /&gt;socketpair                                                       10&lt;br /&gt;statfs64                                                         10&lt;br /&gt;dup                                                              11&lt;br /&gt;connect                                                          12&lt;br /&gt;identitysvc                                                      12&lt;br /&gt;mkdir                                                            13&lt;br /&gt;sendmsg_nocancel                                                 13&lt;br /&gt;fchmod                                                           14&lt;br /&gt;fchown                                                           14&lt;br /&gt;sendto_nocancel                                                  14&lt;br /&gt;fsync                                                            17&lt;br /&gt;execve                                                           18&lt;br /&gt;adjtime                                                          20&lt;br /&gt;fsgetpath                                                        21&lt;br /&gt;initgroups                                                       21&lt;br /&gt;sigsuspend                                                       21&lt;br /&gt;unlink                                                           22&lt;br /&gt;setsockopt                                                       23&lt;br /&gt;shared_region_check_np                                           25&lt;br /&gt;pipe                                                             27&lt;br /&gt;ptrace                                                           28&lt;br /&gt;bsdthread_create                                                 29&lt;br /&gt;setegid                                                          29&lt;br /&gt;shm_open                                                         30&lt;br /&gt;socket                                                           31&lt;br /&gt;__pthread_canceled                                               32&lt;br /&gt;bsdthread_register                                               34&lt;br /&gt;getrlimit                                                        34&lt;br /&gt;settid                                                           34&lt;br /&gt;exit                                                             36&lt;br /&gt;lstat                                                            36&lt;br /&gt;fork                                                             37&lt;br /&gt;getgid                                                           42&lt;br /&gt;setpgid                                                          42&lt;br /&gt;seteuid                                                          43&lt;br /&gt;__pthread_fchdir                                                 58&lt;br /&gt;__pthread_sigmask                                                58&lt;br /&gt;getfsstat64                                                      60&lt;br /&gt;__disable_threadsignal                                           62&lt;br /&gt;bsdthread_terminate                                              62&lt;br /&gt;getegid                                                          62&lt;br /&gt;wait4                                                            65&lt;br /&gt;issetugid                                                        66&lt;br /&gt;setpriority                                                      66&lt;br /&gt;iopolicysys                                                      70&lt;br /&gt;getpid                                                           89&lt;br /&gt;recvfrom                                                         95&lt;br /&gt;sendto                                                           96&lt;br /&gt;getdirentriesattr                                               108&lt;br /&gt;writev_nocancel                                                 112&lt;br /&gt;recvfrom_nocancel                                               115&lt;br /&gt;sendmsg                                                         120&lt;br /&gt;accept                                                          131&lt;br /&gt;stat                                                            135&lt;br /&gt;pwrite                                                          136&lt;br /&gt;__semwait_signal                                                147&lt;br /&gt;__mac_syscall                                                   157&lt;br /&gt;setitimer                                                       159&lt;br /&gt;thread_selfid                                                   164&lt;br /&gt;select_nocancel                                                 184&lt;br /&gt;access                                                          224&lt;br /&gt;write                                                           280&lt;br /&gt;sigreturn                                                       307&lt;br /&gt;munmap                                                          379&lt;br /&gt;madvise                                                         464&lt;br /&gt;select                                                          471&lt;br /&gt;pread                                                           481&lt;br /&gt;kdebug_trace                                                    540&lt;br /&gt;mmap                                                            557&lt;br /&gt;write_nocancel                                                  648&lt;br /&gt;lstat64                                                         699&lt;br /&gt;gettimeofday                                                    767&lt;br /&gt;getattrlist                                                     772&lt;br /&gt;ioctl                                                           791&lt;br /&gt;fcntl_nocancel                                                  836&lt;br /&gt;getrusage                                                       838&lt;br /&gt;fstatfs64                                                       843&lt;br /&gt;sigaction                                                       906&lt;br /&gt;close_nocancel                                                 1078&lt;br /&gt;open_nocancel                                                  1082&lt;br /&gt;proc_info                                                      1135&lt;br /&gt;access_extended                                                1161&lt;br /&gt;fstat64                                                        1218&lt;br /&gt;getuid                                                         1237&lt;br /&gt;dup2                                                           1272&lt;br /&gt;open                                                           1432&lt;br /&gt;getdirentries64                                                1672&lt;br /&gt;workq_kernreturn                                               2680&lt;br /&gt;fcntl                                                          3234&lt;br /&gt;lseek                                                          4005&lt;br /&gt;read_nocancel                                                  4605&lt;br /&gt;__sysctl                                                       5005&lt;br /&gt;read                                                           5641&lt;br /&gt;stat64                                                         6775&lt;br /&gt;geteuid                                                        6910&lt;br /&gt;sigaltstack                                                    7252&lt;br /&gt;sigprocmask                                                    8740&lt;br /&gt;close                                                         12722&lt;br /&gt;kevent                                                        20917&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;分析はのちのち行う．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これに対し，システムコールの実行時間を測定するのは難しい．dtraceのリファレンスに，システムコールのaggregationの例がある．&lt;br /&gt;&lt;pre class="prettyprint"&gt;syscall:::entry&lt;br /&gt;{&lt;br /&gt;self-&gt;ts=timestamp;&lt;br /&gt;}&lt;br /&gt;syscall:::return&lt;br /&gt;{&lt;br /&gt;@time[probefunc]=avg(timestamp - self-&amp;gt;ts);&lt;br /&gt;self-&amp;gt;ts=0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;しかしこれだと，適切な値を取得出来ない場合が起こってくる．以下がその例である．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;システムコール実行中に，プリエンプションが起こった: entry時とexit時のタイムスタンプで判断しているので，プリエンプションは分からない&lt;/li&gt;&lt;/ul&gt;ディスクI/O等による消費時間が含まれるのも若干の問題である (最初に示した測定は，RAMDISK上で行ったのでI/Oの占める割合が低い)が，それ以上に上記の場合だと正確性に欠けてしまう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;システムコールの平均消費時間を正確に測定するのは難しそうなので，今回はシステムコールの頻度のみで考える事にしよう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7264803350496650687?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7264803350496650687/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-benchmark-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7264803350496650687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7264803350496650687'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-benchmark-2.html' title='AOVCS benchmark (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/Svpso-ld3OI/AAAAAAAAANk/QmbAopRTUBQ/s72-c/091111-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4467171193071902842</id><published>2009-11-07T20:48:00.005+09:00</published><updated>2009-11-07T21:43:15.794+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-benchmark'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>AOVCS benchmark</title><content type='html'>AOVCSの評価として，AOVCSデーモンによるオーバーヘッドを測定する．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;測定は，トレース対象となるシステムコールをそれぞれ10000回実行し，デーモンの有効無効でどれだけ時間に差が出るか，で行う．対象とするシステムコールは次の画像の通り．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SvVfdOvjaxI/AAAAAAAAANU/10GbPJcA-3k/s1600-h/091107-0001.png"&gt;&lt;img style="cursor: pointer; width: 256px; height: 320px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SvVfdOvjaxI/AAAAAAAAANU/10GbPJcA-3k/s320/091107-0001.png" alt="" id="BLOGGER_PHOTO_ID_5401328283879172882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まだ表を埋めきっていないが，対象となるシステムコールは分かる．で，現在コードを書いて計測中．とりあえずvforkまで測定．その結果が次．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SvVf6Wc479I/AAAAAAAAANc/A7xLpldQKA0/s1600-h/091107-0002.png"&gt;&lt;img style="cursor: pointer; width: 257px; height: 320px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SvVf6Wc479I/AAAAAAAAANc/A7xLpldQKA0/s320/091107-0002.png" alt="" id="BLOGGER_PHOTO_ID_5401328784164581330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;デーモンが有効だと，大体2倍 - 4倍程度の時間がかかる&lt;/span&gt;事が分かる．システムコールの頻度を考えれば，それほど酷い値ではない．例外はfork．無茶苦茶遅い．20倍近くかかっている．なんで？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;試しに，&lt;span style="color: rgb(255, 0, 0);"&gt;何もトレースを行わないdtraceを起動&lt;/span&gt;してみる．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ sudo dtrace -Z&lt;/pre&gt;この状態でforkのベンチマークを行うと，それでも7000[msec]くらいかかった．つまり，今回書いたd-scriptが悪いのではなく，dtraceのそもそもの仕様の様だ．こればかりはどうしようもない．今度，10.5でも同様の実験をしてみよう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4467171193071902842?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4467171193071902842/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-benchmark.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4467171193071902842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4467171193071902842'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-benchmark.html' title='AOVCS benchmark'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/SvVfdOvjaxI/AAAAAAAAANU/10GbPJcA-3k/s72-c/091107-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-3471696076469001120</id><published>2009-11-04T15:12:00.002+09:00</published><updated>2009-11-04T15:53:56.225+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>英数 / かな キーの問題</title><content type='html'>CarbonEmacsが，どうも最近フリーズする機会が多い．先日も論文を書いている際にフリーズしてくれて，2行程文章が失われた．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;しかしその際，どうやらCtrl - 英数を押しているという事に気づいた．&lt;span style="color: rgb(255, 0, 0);"&gt;試しに押してみると，CarbonEmacsが簡単にフリーズ&lt;/span&gt;する．ぬ？これはバグではないか？&lt;br /&gt;&lt;br /&gt;Emacs フリーズ 英数とかでググると，2chに同じ問題の情報がある．Cocoa Emacsでは問題ないとかどうとか．&lt;br /&gt;&lt;a href="http://pc11.2ch.net/test/read.cgi/mac/1228489176/l50"&gt;http://pc11.2ch.net/test/read.cgi/mac/1228489176/l50&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;でも，Snow Leopardにしてからの問題みたいだから，CarbonEmacsは悪くない気がする．Snow Leopardが悪い．そう考えて調査をすると，CarbonEmacsじゃなくても起こる事が分かった．多分発動条件は次の通り．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mac OS X 10.6以降&lt;/li&gt;&lt;li&gt;Cocoaのtextfield以外(文字が入力出来ない場所)にフォーカスを当てる&lt;/li&gt;&lt;li&gt;英数キーを押すと「ことえり」の英字入力になるか，かなキーを押すと「ことえり」のかな入力になるかの状態にする&lt;/li&gt;&lt;li&gt;Ctrl-英数 またはCtrl-かな を押す&lt;/li&gt;&lt;/ul&gt;そうすると，CarbonEmacsならば完全フリーズ，他のCocoaアプリケーションだとウィンドウとかは動くけどボタンとかは機能しない状態になる．そして，アクティビティモニタを見るとCPU消費が50%とかになる．&lt;br /&gt;Cocoaアプリケーションだと，Dockを右クリックするとかSpotlightを開くと回復するときもある．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;他のSnow Leopardユーザもなったというし，これは完全にバグ．Appleにバグレポートだしといた．ただ，&lt;span style="color: rgb(255, 0, 0);"&gt;バグレポートは英語で書いてくださいってのは酷い．何故そこで報告させない方に向かわせようとする？翻訳ぐらいそっちでやって欲しい&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえず次の通りに報告しときました．&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;Ctrl-EISUU / Ctrl-KANA (only in JIS keyboard) makes applications hang&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;Simply push ctrl-EISUU or ctrl-KANA in some applications, and the application hangs.&lt;br /&gt;I could cause the problem in the following applications:&lt;br /&gt;Mail, iCal, Activity Monitor, Adium, CarbonEmacs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Steps to reproduce:&lt;br /&gt;Setup input method to use Kotoeri when you push EISUU/KANA key.&lt;br /&gt;Then focus one of the above applications, whose active target shouldn't be Cocoa's text-field.&lt;br /&gt;Then push ctrl-EISUU or ctrl-KANA and the application will hang.&lt;br /&gt;&lt;br /&gt;The application won't accept any input.&lt;br /&gt;It MAY recover when ctrl-click Dock or open spotlight.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Expected result:&lt;br /&gt;Not hang.&lt;br /&gt;Simply treat it as EISUU or so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Actual result:&lt;br /&gt;Hang.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Regression:&lt;br /&gt;I confirm the problem in MacBook Air and MacBook KURO with Mac OS X 10.6.1.&lt;br /&gt;In 10.4.11, this problem doesn't occur.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;Attached file is a screen shot of hanged iCal.&lt;br /&gt;(Sorry, using language is Japanese)&lt;br /&gt;This figure shows that Kotoeri and iCal consumes a lot of CPU resources.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-3471696076469001120?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/3471696076469001120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3471696076469001120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3471696076469001120'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/blog-post.html' title='英数 / かな キーの問題'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-79695415760304978</id><published>2009-11-03T17:44:00.004+09:00</published><updated>2009-11-04T00:00:46.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>AOVCS-bazaarの修正 (3)</title><content type='html'>type="middle"の実装．目的は，&lt;span style="color: rgb(255, 0, 0);"&gt;Emacsのe-shellで作成したファイルが何でもかんでもバージョン管理されてしまうのを防ぐ事&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;実装した事．&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Before:&lt;/span&gt; (bazaar-ext/autoflags/aovcs.py)&lt;br /&gt;&lt;pre name="code" class="python"&gt;        for appName in appNames:&lt;br /&gt;       if self.data.has_key(appName) and self.data[appName][0][event][0]!="undef":&lt;br /&gt;           result=(self.data[appName][0][event][0],appName)&lt;br /&gt;           type=self.data[appName][0][event][1]&lt;br /&gt;           for exception in self.data[appName][1][event]:&lt;br /&gt;               if fnmatch.fnmatch(filename, exception[0]):&lt;br /&gt;                   result=(exception[1], appName+" - pattern: "+exception[0])&lt;br /&gt;                   type=exception[2]&lt;br /&gt;           if type=="strong": return result&lt;br /&gt;   return result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;After：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;        for i in xrange(len(appNames)):&lt;br /&gt;       appName=appNames[i]&lt;br /&gt;       if self.data.has_key(appName) and self.data[appName][0][event][0]!="undef" and (i==0 or self.data[appName][0][event][1] in ("middle", "strong")):&lt;br /&gt;           result=(self.data[appName][0][event][0],appName)&lt;br /&gt;           type=self.data[appName][0][event][1]&lt;br /&gt;           for exception in self.data[appName][1][event]:&lt;br /&gt;               if fnmatch.fnmatch(filename, exception[0]):&lt;br /&gt;                   result=(exception[1], appName+" - pattern: "+exception[0])&lt;br /&gt;                   type=exception[2]&lt;br /&gt;           if type=="strong": return result&lt;br /&gt;   return result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;変更点は，&lt;br /&gt;&lt;ul&gt;&lt;li&gt;イテレーションを配列に対して行うのではなく，添字で行うようにする&lt;/li&gt;&lt;li&gt;添字が0でなければ，weakは処理対象としない&lt;/li&gt;&lt;/ul&gt;これだけ．もうちょっとメンドクサイことになるかと思ったが，意外とここだけですんだ．実装が良かったのかな，とちょっとだけ喜ぶ．&lt;br /&gt;&lt;br /&gt;実際にEmacs上のシェルで実行すると次の通り．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ ls &gt; foobar&lt;br /&gt;$ bzr af --dry-run&lt;br /&gt;The following state will be set if execute autoflags(af) without --dry-run&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;No configurations for the following files/directories:&lt;br /&gt;testCase/foobar                (Application names: bash, bash, &lt;span style="color: rgb(255, 0, 0);"&gt;Emacs&lt;/span&gt;, bash, login, Terminal, launchd, launchd)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;確かに，Emacsがプロセス一覧に含まれていても勝手に管理する，という事は無くなった．目標達成．今までの挙動が必要(例えばシェルスクリプトとか)な場合は，type="middle"を使えば良い．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さて，多分Webページの修正の方が多いな．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-79695415760304978?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/79695415760304978/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-bazaar-3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/79695415760304978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/79695415760304978'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs-bazaar-3.html' title='AOVCS-bazaarの修正 (3)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6034075090153111631</id><published>2009-11-02T19:29:00.003+09:00</published><updated>2009-11-02T19:54:10.240+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSの修正案</title><content type='html'>現在AOVCSの評価を実行中．いずれまとまったらここに載せる予定．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，それとは別に，前々からAOVCSに対して修正した方がいいと思っていた点がある．評価をキチンとやるに辺り，やはり直しておくべきと思うようになった．その点のまとめ．&lt;br /&gt;&lt;br /&gt;直したい点は，&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;設定の強さにmiddleを用意する&lt;/span&gt;というもの．middleの意味と，それに伴う変更は次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;type="weak"は，&lt;span style="color: rgb(255, 0, 0);"&gt;そのプロセスが直接ファイルを操作した場合のみ&lt;/span&gt;，意味をなす．例えば，Emacsが直接ファイルを操作した場合は意味を為すが，Emacsがe-shellのサブプロセスを立ち上げて，その中で処理をした場合は意味を為さない&lt;/li&gt;&lt;li&gt;type="middle"は従来のweakと同じ意味を為す．これは，サブプロセスに処理を投げるアプリケーションの場合に設定すべきとなる．例えばシェルスクリプトはmiddleにすべきである&lt;/li&gt;&lt;li&gt;type="strong"は，従来と意味が変わらない．親プロセスが何かによらず，そこで挙動を決定する．ignoreが確定するコンパイラなどの場合に用いる&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;これを導入する目的は，weakで例に挙げたサブプロセスでシェルを立ち上げる場合に上手く対応する為である．これが無いと次の問題が起こる．&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Emacsを，create="auto" type="weak"とする&lt;/li&gt;&lt;li&gt;Emacsのe-shellを立ち上げる&lt;/li&gt;&lt;li&gt;適当な，AOVCSで未設定のシェルスクリプトを実行して，ファイル(file.txtとする)を作る&lt;/li&gt;&lt;li&gt;autoflags実行&lt;/li&gt;&lt;li style="color: rgb(51, 51, 255);"&gt;file.txtはEmacsが作成した事となり，自動管理される&lt;/li&gt;&lt;/ul&gt;これは非常に不適切な挙動である．file.txtはよくわからないスクリプトが作成しているのでユーザに設定を催すのが適切である．この挙動を修正する為に，&lt;span style="color: rgb(255, 0, 0);"&gt;weakの強さを弱くする&lt;/span&gt;必要がある．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;出来るだけ設定できるパラメータの種類は少ない方が良いのだが，今回は必要と判断し，導入することとした．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6034075090153111631?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6034075090153111631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6034075090153111631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6034075090153111631'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/11/aovcs.html' title='AOVCSの修正案'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7626804333497327392</id><published>2009-10-30T23:02:00.010+09:00</published><updated>2009-10-30T23:56:33.421+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='platex'/><category scheme='http://www.blogger.com/atom/ns#' term='port'/><title type='text'>Snow Leopard用のTex環境</title><content type='html'>Snow Leopardで日本語Texを使う方法のメモ．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Texのインストール&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Texのインストールはportを使って行う&lt;/span&gt;．以前の記事でも書いたが，次の通りのportコマンドを打てば良い．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ sudo port install ptex +utf8 +no_x11&lt;/pre&gt;Macだと大体UTF-8の文字コードなので，+utf8は付けておくと安心．あと，+no_x11を付けておくとX関係のライブラリが省略されてコンパイルが大幅に速くなる．これを付けて問題になるような事は今のところ無い．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;texのプレビュー&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;プレビューの方法は2種類ある．1つは，dviで閲覧する事，もう1つはpdfで閲覧する事である．&lt;br /&gt;自分はLeopardまではMxdviを用いてdviで閲覧していた．しかし，&lt;span style="color: rgb(51, 51, 255);"&gt;Snow LeopardになるとMxdviはデフォルトでは動かない．Rosettaをインストールする必要がある&lt;/span&gt;．Rosettaのインストール自体は簡単に行える．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Surz6VVN4JI/AAAAAAAAANM/Dtf_UMs_bMU/s1600-h/091030-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 167px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Surz6VVN4JI/AAAAAAAAANM/Dtf_UMs_bMU/s320/091030-0001.png" alt="" id="BLOGGER_PHOTO_ID_5398395286841057426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;しかし，わざわざAppleがRosettaをデフォルトでインストールしないようにしてきたという事は，&lt;span style="color: rgb(51, 51, 255);"&gt;いずれRosettaのサポートを切るぞ&lt;/span&gt;という事なはず．そのためRosettaは用いない事にした．&lt;br /&gt;&lt;br /&gt;もしRosettaでいーやという場合はMxdviを入れればOKとなる．しかし，&lt;a href="http://macptex.appi.keio.ac.jp/%7Euchiyama/macptex.html"&gt;Mxdviのオフィシャルページ&lt;/a&gt;が&lt;span style="color: rgb(51, 51, 255);"&gt;少なくとも2ヶ月間は404となっている&lt;/span&gt;ため，今からMxdviでやろうというのも無理となっている．そのため，次に示すpdfによる方法を推奨する．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;pdfによる方法では，dvipdfmxを用いてdviをpdfに変換し，プレビュー.appで確認する，という形式が良い&lt;/span&gt;．WindowsだとおなじみのAdobe Readerは，後述する理由(コンパイルの簡略化にて述べる)によりプレビューに劣る．&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;この方法では，貼付ける画像をepsではなくpdfで用意するとよい&lt;/span&gt;．そうすると，dviからpdfへの変換が高速になるからである．pdfの貼付け方法は次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mediabb.styをダウンロード (&lt;a href="http://www.ma.ns.musashi-tech.ac.jp/Pages/TeX/mediabb.sty.html"&gt;http://www.ma.ns.musashi-tech.ac.jp/Pages/TeX/mediabb.sty.html&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;適当な場所にmediabb.styを置き，texファイル内に\usepackage[dvipdfm]{graphicx}と\usepackage{mediabb}を記述&lt;/li&gt;&lt;li&gt;\includegraphics{hoge.pdf}&lt;/li&gt;&lt;/ul&gt;これだけ．epsだと滅茶苦茶時間がかかっていたのが，かなり高速に変換出来るようになる．@wtakuoの話によれば，&lt;span style="color: rgb(51, 51, 255);"&gt;用意したpdfファイルに相性があるらしい&lt;/span&gt;が，Omni Graffleで作成した画像は今のところ問題ないそうである．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;コンパイルの簡略化&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;あとはtexを用意してコンパイルするだけだが，毎回platexとかdvipdfmxと書くのは面倒である．簡略化はもちろんmakeで．&lt;span style="color: rgb(51, 51, 255);"&gt;@wtakuoによればomakeを使うとすばらしく快適になるとの事だけど，残念ながらport install omakeに失敗する&lt;/span&gt;ので，Makefileでなんとかする．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;TEX=platex&lt;br /&gt;PDF_CONVERT=dvipdfmx&lt;br /&gt;PDF_VIEW=open -a Preview&lt;br /&gt;TARGET=paper.pdf&lt;br /&gt;&lt;br /&gt;all: ${TARGET}&lt;br /&gt;&lt;br /&gt;%.pdf: %.dvi&lt;br /&gt;${PDF_CONVERT} $^&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;paper.dvi: paper.tex content/*.tex&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; ${TEX} $^ &amp;amp;&amp;amp; ${TEX} $^&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;%.dvi: %.tex&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; ${TEX} $^ &amp;amp;&amp;amp; ${TEX} $^&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;view: ${TARGET}&lt;br /&gt;${PDF_VIEW} $^&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;rm -f *.log *.toc *.aux *.dvi&lt;/pre&gt;(※タブが削除されてしまっているため，利用する場合は補完をお願いします)&lt;br /&gt;&lt;br /&gt;Texは経験によれば，2パスすれば大体ページ番号関係は解決する．そのため，&lt;span style="color: rgb(255, 0, 0);"&gt;dvi生成部分で2度platexを起動するようにする&lt;/span&gt;．本当に正確なものを生成するには，3パスが必要だったはず．でも自信が無いので自己責任で．この依存関係を正確に解決出来るのが，omakeとのこと．&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;paper.dviのルールは，texファイルを複数に分割している場合に便利&lt;/span&gt;．上記の例では，contentディレクトリ内のtexファイル全てに依存がある，としてある．特に分割がなければ，paper.dviのルールは削除して問題ない．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Makefileの使い方としては，&lt;span style="color: rgb(255, 0, 0);"&gt;プレビューが開いてないときはmake viewを実行，既に開いているときはmakeを実行するのが良い&lt;/span&gt;．プレビューは賢く，変更があったら変更後の表示に切り替えてくれる．&lt;span style="color: rgb(51, 51, 255);"&gt;Adobe Readerは，一応は変更後のやつに切り替えてくれるんだけど，レンダリングが怪しかったりする&lt;/span&gt;ので微妙．&lt;br /&gt;&lt;br /&gt;また，既にプレビューで開いているときにmake viewをやってしまうと，表示しているページが先頭に戻ってしまうので注意．レイアウトを確認しながらtexファイルを修正し，コンパイル，再確認をやる事が多いと思うので，&lt;span style="color: rgb(255, 0, 0);"&gt;確認していたページを見失わないためにもすでに開いているときはmakeで済ますのが良い&lt;/span&gt;．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7626804333497327392?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7626804333497327392/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/snow-leopardtex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7626804333497327392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7626804333497327392'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/snow-leopardtex.html' title='Snow Leopard用のTex環境'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/Surz6VVN4JI/AAAAAAAAANM/Dtf_UMs_bMU/s72-c/091030-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6820086724075326453</id><published>2009-10-29T21:54:00.002+09:00</published><updated>2009-10-29T22:09:10.902+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='binutils'/><category scheme='http://www.blogger.com/atom/ns#' term='port'/><title type='text'>MacPortsのメモ binutils</title><content type='html'>Snow Leopard移行直後にインストールしようとした際は失敗した，binutils．2ヶ月ぶりにコンパイルしてみた．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install binutils +universal&lt;br /&gt;---&gt;  Computing dependencies for zlib&lt;br /&gt;---&gt;  Fetching zlib&lt;br /&gt;---&gt;  Verifying checksum(s) for zlib&lt;br /&gt;---&gt;  Extracting zlib&lt;br /&gt;---&gt;  Applying patches to zlib&lt;br /&gt;---&gt;  Configuring zlib&lt;br /&gt;---&gt;  Building zlib&lt;br /&gt;---&gt;  Staging zlib into destroot&lt;br /&gt;---&gt;  Deactivating zlib @1.2.3_2+universal&lt;br /&gt;---&gt;  Computing dependencies for zlib&lt;br /&gt;---&gt;  Installing zlib @1.2.3_3+universal&lt;br /&gt;---&gt;  Activating zlib @1.2.3_3+universal&lt;br /&gt;---&gt;  Cleaning zlib&lt;br /&gt;---&gt;  Computing dependencies for binutils&lt;br /&gt;---&gt;  Fetching binutils&lt;br /&gt;---&gt;  Attempting to fetch binutils-2.20.tar.bz2 from ftp://ftp.dti.ad.jp/pub/GNU/binutils&lt;br /&gt;---&gt;  Verifying checksum(s) for binutils&lt;br /&gt;---&gt;  Extracting binutils&lt;br /&gt;---&gt;  Configuring binutils&lt;br /&gt;---&gt;  Configuring binutils for architecture x86_64&lt;br /&gt;---&gt;  Configuring binutils for architecture i386&lt;br /&gt;---&gt;  Building binutils&lt;br /&gt;---&gt;  Building binutils for architecture x86_64&lt;br /&gt;---&gt;  Building binutils for architecture i386&lt;br /&gt;---&gt;  Staging binutils into destroot&lt;br /&gt;---&gt;  Staging binutils into destroot for architecture x86_64&lt;br /&gt;---&gt;  Staging binutils into destroot for architecture i386&lt;br /&gt;Note: binutils installs files outside the common directory structure.&lt;br /&gt;---&gt;  Installing binutils @2.20_0+universal&lt;br /&gt;---&gt;  Activating binutils @2.20_0+universal&lt;br /&gt;---&gt;  Cleaning binutils&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;この通り，キチンとコンパイル出来た．実行するとこんな．&lt;br /&gt;&lt;pre name="prettyprint"&gt;$ gobjdump -t /bin/ls&lt;br /&gt;In archive /bin/ls:&lt;br /&gt;unable to read unknown load command 0x22&lt;br /&gt;&lt;br /&gt;/bin/ls:i386:x86-64:     file format mach-o-le&lt;br /&gt;&lt;br /&gt;SYMBOL TABLE:&lt;br /&gt;0000000005614542      d  3c OPT    00 0000 radr://5614542&lt;br /&gt;0000000100000000 g       03 ABS    00 0010 __mh_execute_header&lt;br /&gt;0000000000000000 g       01 UND    00 0200 __DefaultRuneLocale&lt;br /&gt;0000000000000000 g       01 UND    00 0201 ___assert_rtn&lt;br /&gt;0000000000000000 g       01 UND    00 0201 ___error&lt;br /&gt;0000000000000000 g       01 UND    00 0201 ___maskrune&lt;br /&gt;0000000000000000 g       01 UND    00 0201 ___stack_chk_fail&lt;br /&gt;0000000000000000 g       01 UND    00 0200 ___stack_chk_guard&lt;br /&gt;0000000000000000 g       01 UND    00 0200 ___stderrp&lt;br /&gt;0000000000000000 g       01 UND    00 0200 ___stdoutp&lt;br /&gt;0000000000000000 g       01 UND    00 0201 ___tolower&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_free&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_entry&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_flag_np&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_flagset_np&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_link_np&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_perm_np&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_permset&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_qualifier&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _acl_get_tag_type&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _atoi&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _compat_mode&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _err&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _exit&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fflagstostr&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fprintf&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fputs&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _free&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fts_children$INODE64&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fts_close$INODE64&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fts_open$INODE64&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fts_read$INODE64&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fts_set$INODE64&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _fwrite&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getbsize&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getenv&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getgrgid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getopt&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getpid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getpwuid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getuid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _getxattr&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _group_from_gid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _ioctl&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _isatty&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _kill&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _listxattr&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _localeconv&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _localtime&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _malloc&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _mbr_uuid_to_id&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _mbr_uuid_to_string&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _mbrtowc&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _memset&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _nl_langinfo&lt;br /&gt;0000000000000000 g       01 UND    00 0200 _optind&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _printf&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _putchar&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _readlink&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _realloc&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _setenv&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _setlocale&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _signal&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _snprintf&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _sscanf&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strchr&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strcoll&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strcpy&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strdup&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strerror&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strftime&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strlen&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _strmode&lt;br /&gt;0000000000000000 g       01 UND    00 0101 _tgetent&lt;br /&gt;0000000000000000 g       01 UND    00 0101 _tgetstr&lt;br /&gt;0000000000000000 g       01 UND    00 0101 _tgoto&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _time&lt;br /&gt;0000000000000000 g       01 UND    00 0101 _tputs&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _user_from_uid&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _warn&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _warnx&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _wcwidth&lt;br /&gt;0000000000000000 g       01 UND    00 0201 _write&lt;br /&gt;0000000000000000 g       01 UND    00 0200 dyld_stub_binder&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;otoolだとシンボルテーブルの参照がどうも出来ないので，gobjdumpが役に立つ．ディスアセンブルはotoolで事足りる(otool -tv /bin/ls)のだけれども．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6820086724075326453?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6820086724075326453/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/macports-binutils.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6820086724075326453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6820086724075326453'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/macports-binutils.html' title='MacPortsのメモ binutils'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-887532167520465709</id><published>2009-10-27T14:39:00.003+09:00</published><updated>2009-10-27T15:08:17.479+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fslogger'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><title type='text'>fslogger</title><content type='html'>Webページは大体出来たが，公開サーバが決まらないので保留．論文の方を始めた．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，そこは置いておいて，2chを見ているとこんなソフトウェアを発見．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;fslogger&lt;/span&gt;&lt;br /&gt;&lt;a href="http://osxbook.com/software/fslogger/"&gt;http://osxbook.com/software/fslogger/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mac OS X Internals関連の記事で，その本の中にも同じ情報がある．11.8.2節のThe Fsevents Mechanismって所．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;やっているのは，&lt;span style="color: rgb(255, 0, 0);"&gt;Spotlightがファイルシステム情報取得に使っている仕組みを用いて，ファイルシステムへの変更情報を取得する&lt;/span&gt;，ということ．変更情報とはファイル作成，削除，移動など．&lt;br /&gt;&lt;br /&gt;おや？&lt;span style="color: rgb(51, 51, 255);"&gt;AOVCSのデーモンがdtraceを使ってやっていることと同じ&lt;/span&gt;じゃないか？しかもシステムコールをフックしてやっているAOVCSに比べて，元々用意された仕組みを用いるので多分速い．情報のフィルタリングもd-scriptでなくCとかで記述出来るし．むぅ．&lt;br /&gt;&lt;br /&gt;一応dtraceを用いた場合のメリットもある．&lt;span style="color: rgb(255, 0, 0);"&gt;プロセスがすぐに終了するような場合に，プロセス名や引数リストを取得し損ねることを防げる&lt;/span&gt;点である．dtraceはfork/exec時にフックして処理するのに対し，fsloggerはカーネルが情報を送ってきた時点で処理する．この時点でプロセスが存在していないとアプリケーション情報が取得出来ない訳である．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とすると，デーモン実装については，dtrace+fsloggerの仕組みのハイブリッドがベストになるかな？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回の研究においては，「評価用」であること，「他への移植も念頭に入れてる」ことを理由として，全部dtraceで実装したと言い訳しよう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-887532167520465709?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/887532167520465709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/fslogger.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/887532167520465709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/887532167520465709'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/fslogger.html' title='fslogger'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1882440503332407071</id><published>2009-10-17T21:27:00.004+09:00</published><updated>2009-10-17T21:37:30.053+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (8)</title><content type='html'>やっとこさ，一通りアップロード出来るようになった．まだAutoflags Commad用しか出来てないけど，仕組み自体は同じだからデザインを考えるだけで出来るはず！&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;アップロードした設定の参照．&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Stm4jnpTTYI/AAAAAAAAAMs/WXW-Ov5XyX0/s1600-h/091017-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 310px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Stm4jnpTTYI/AAAAAAAAAMs/WXW-Ov5XyX0/s320/091017-0001.png" alt="" id="BLOGGER_PHOTO_ID_5393544950830026114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんな．情報の配置はこういう形にした．あとは，&lt;br /&gt;&lt;ul&gt;&lt;li&gt;App., Eval., Dateでソート出来るようにする&lt;/li&gt;&lt;li&gt;Eval. (その設定の評価)を加点出来るようにする&lt;/li&gt;&lt;li&gt;XMLにマウスをかざすと，XMLを表示するようにする (以前作ったやつ)&lt;/li&gt;&lt;li&gt;Delを押すと，削除を出来るようにする&lt;/li&gt;&lt;/ul&gt;この辺りをやる必要がある．細かいのがちょっと面倒だな〜．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;ファイル選択&amp;amp;アップロード部分&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Stm5ndmMlvI/AAAAAAAAAM0/MVeUb41bUtI/s1600-h/091017-0002.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 161px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Stm5ndmMlvI/AAAAAAAAAM0/MVeUb41bUtI/s320/091017-0002.png" alt="" id="BLOGGER_PHOTO_ID_5393546116363753202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こういう形．ファイルを選択する方法だけじゃなくって，コピペでもアップロード出来るようにする予定．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;アプリケーション選択部分&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Stm6Lwb9AGI/AAAAAAAAAM8/Cy-hI--q0lQ/s1600-h/091017-0003.png"&gt;&lt;img style="cursor: pointer; width: 310px; height: 320px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Stm6Lwb9AGI/AAAAAAAAAM8/Cy-hI--q0lQ/s320/091017-0003.png" alt="" id="BLOGGER_PHOTO_ID_5393546739896352866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/Stm6Mcu5ZSI/AAAAAAAAANE/83QNGBCU_Ws/s1600-h/091017-0004.png"&gt;&lt;img style="cursor: pointer; width: 310px; height: 320px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/Stm6Mcu5ZSI/AAAAAAAAANE/83QNGBCU_Ws/s320/091017-0004.png" alt="" id="BLOGGER_PHOTO_ID_5393546751786968354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ここは大体OK．XMLを同じようにホバーで表示するようにする予定だけど，正直不要な気もする．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1882440503332407071?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1882440503332407071/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-8.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1882440503332407071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1882440503332407071'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-8.html' title='AOVCSのwebページ作成中 (8)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/Stm4jnpTTYI/AAAAAAAAAMs/WXW-Ov5XyX0/s72-c/091017-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4286405615585857663</id><published>2009-10-14T21:18:00.002+09:00</published><updated>2009-10-14T21:31:14.163+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (7)</title><content type='html'>現在，設定をアップロードする部分製作中．&lt;br /&gt;&lt;br /&gt;やりたい事は次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;設定ファイルから，特定のアプリケーションを指定してアップロード出来る&lt;br /&gt;&lt;/li&gt;&lt;li&gt;他人がアップロードした設定を見れる&lt;/li&gt;&lt;li&gt;これを，「状態設定」「スクリプト名解析設定」「無視アプリケーション設定」それぞれに対して出来る&lt;/li&gt;&lt;/ul&gt;まあそれほど複雑ではない．とりあえずアップロードの為のサーバスクリプト(API by JSON)は実装し終わったので，それを利用するJavaScriptを実装中．&lt;br /&gt;&lt;br /&gt;アップロードの流れは次の形にする．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;アップロードするファイルを選択する / XMLをペーストする&lt;/li&gt;&lt;li&gt;サーバに一時アップロード&lt;/li&gt;&lt;li&gt;サーバでXMLを解析&lt;/li&gt;&lt;li&gt;正しく解析出来たアプリケーション名，および出力用のデータ，XMLをJSONで返す&lt;/li&gt;&lt;li&gt;クライアントはJSONデータを元に，アップロードするアプリケーションの選択ページを作成&lt;/li&gt;&lt;li&gt;ユーザは，アップロードするアプリケーションの選択，備考および削除キーを入力&lt;/li&gt;&lt;li&gt;サーバに本登録&lt;/li&gt;&lt;/ul&gt;XMLのパースはクライアントでも出来るだろうけど，今回はサーバにした．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで現在，クライアントの，アップロードするアプリケーションを選択するページ作成中．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/StXELHYGjiI/AAAAAAAAAMk/wJHWIKh-NrI/s1600-h/091014-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 310px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/StXELHYGjiI/AAAAAAAAAMk/wJHWIKh-NrI/s320/091014-0001.png" alt="" id="BLOGGER_PHOTO_ID_5392431824083783202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Webページ製作に結構時間がかかっていてやな感じ．&lt;br /&gt;あと，このWebページを公開するサーバがまだ決まってないのもやな感じ．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4286405615585857663?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4286405615585857663/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-7.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4286405615585857663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4286405615585857663'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-7.html' title='AOVCSのwebページ作成中 (7)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FhxNSpAa3Kg/StXELHYGjiI/AAAAAAAAAMk/wJHWIKh-NrI/s72-c/091014-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2699740581213594239</id><published>2009-10-08T13:47:00.008+09:00</published><updated>2009-10-08T22:12:53.067+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><title type='text'>AOVCSデーモンがkernel_taskを暴走させる？ (2)</title><content type='html'>暴走原因調査つづき．条件を探るのはひとまず置いておいて，&lt;span style="color: rgb(255, 0, 0);"&gt;Sharkで暴走時のシステムトレースを取得することにした&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;やり方．&lt;br /&gt;&lt;ol&gt;&lt;li&gt;暴走するのを待つ&lt;/li&gt;&lt;li&gt;暴走したら，Systemトレースを取得&lt;/li&gt;&lt;li&gt;暴走が終わったら，Systemトレースを改めて取得&lt;/li&gt;&lt;/ol&gt;ふたつのトレースを比べて，明らかな違いが見つかれば，そこに暴走原因が潜んでいる可能性が高い．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;リザルト．&lt;br /&gt;&lt;br /&gt;まずはSummary．左が暴走時，右が通常に戻った際．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Ss3Y_v0tWlI/AAAAAAAAALs/pwnXHkcx_Dg/s1600-h/091008-0003.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Ss3Y_v0tWlI/AAAAAAAAALs/pwnXHkcx_Dg/s320/091008-0003.png" alt="" id="BLOGGER_PHOTO_ID_5390202918713252434" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ZAExR8jI/AAAAAAAAAL0/NT5UNMaNZdI/s1600-h/091008-0004.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ZAExR8jI/AAAAAAAAAL0/NT5UNMaNZdI/s320/091008-0004.png" alt="" id="BLOGGER_PHOTO_ID_5390202924336017970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;KernelのCPU利用比率が高い以外は特に際立った差は見つからない．&lt;br /&gt;&lt;br /&gt;kernel_taskを展開して，何の処理がCPUを消費しているかを見れないかなー，と思ったのが次．どこを処理しているか全然分かんなくて意味無し．&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;mach_kernel    4606    1.2 s    255.7 μs    0.0 ns    10.1 ms&lt;br /&gt;0x4A393D4    160    516.0 ms    3.2 ms    4.3 μs    10.1 ms&lt;br /&gt;0x54A67A8    341    509.1 ms    1.5 ms    4.3 μs    10.1 ms&lt;br /&gt;0x4A817A8    802    33.9 ms    42.3 μs    4.3 μs    114.9 μs&lt;br /&gt;0x6D4A7A8    730    23.2 ms    31.8 μs    4.1 μs    495.4 μs&lt;br /&gt;0x7B17000    735    21.1 ms    28.6 μs    4.0 μs    467.8 μs&lt;br /&gt;0x513AB7C    729    20.7 ms    28.4 μs    4.0 μs    223.8 μs&lt;br /&gt;0x60423D4    719    20.3 ms    28.2 μs    4.0 μs    177.6 μs&lt;br /&gt;0x4BCC7A8    8    16.2 ms    2.0 ms    6.0 μs    4.5 ms&lt;br /&gt;0x4BC87A8    135    7.1 ms    52.8 μs    4.2 μs    156.6 μs&lt;br /&gt;0x863AA0    5    5.4 ms    1.1 ms    5.0 μs    1.8 ms&lt;br /&gt;0x4B0D000    104    2.2 ms    21.3 μs    4.1 μs    51.0 μs&lt;br /&gt;0x48FF7A8    60    861.3 μs    14.4 μs    4.1 μs    37.0 μs&lt;br /&gt;0x54B97A8    34    674.9 μs    19.9 μs    4.2 μs    116.4 μs&lt;br /&gt;0x54A37A8    19    365.5 μs    19.2 μs    4.2 μs    42.2 μs&lt;br /&gt;0x4A67B7C    11    361.4 μs    32.9 μs    5.0 μs    66.2 μs&lt;br /&gt;0x48FF3D4    13    198.7 μs    15.3 μs    4.1 μs    42.1 μs&lt;br /&gt;0x58AA000    1    45.3 μs    45.3 μs    45.3 μs    45.3 μs&lt;br /&gt;0x4A42000    -    -    -    -    -&lt;br /&gt;0x48FFB7C    -    -    -    -    -&lt;br /&gt;Idled Thread - CPU #2    -    -    -    -    -&lt;br /&gt;Idled Thread - CPU #1    -    -    -    -    -&lt;br /&gt;&lt;/pre&gt;見ても分からず．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Traceタブの結果は見ても対して意味が無いのでスルー．なので次は，Timeline．&lt;br /&gt;やはり左が暴走時で，右が平常時．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ekid51II/AAAAAAAAAL8/s-8MmL6Mdxw/s1600-h/091008-0005.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ekid51II/AAAAAAAAAL8/s-8MmL6Mdxw/s320/091008-0005.png" alt="" id="BLOGGER_PHOTO_ID_5390209048341238914" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ek9V-FCI/AAAAAAAAAME/j47IISCSSbw/s1600-h/091008-0006.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3ek9V-FCI/AAAAAAAAAME/j47IISCSSbw/s320/091008-0006.png" alt="" id="BLOGGER_PHOTO_ID_5390209055555720226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;暴走時の方，2つのkernel_task(上から5個目と6個目)がやたら同期取りながら実行している．なんだこれ？？&lt;/span&gt;&lt;br /&gt;拡大して調べると，ほぼ等間隔，だいたい30msec毎に処理しているみたい．暴走時はGUIとかのレスポンスが悪くなるんだけど，その原因がこれか．&lt;br /&gt;&lt;br /&gt;ちょっと拡大したのが次．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hQZnM-9I/AAAAAAAAAMM/6n5OkNon_Ro/s1600-h/091008-0007.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 242px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hQZnM-9I/AAAAAAAAAMM/6n5OkNon_Ro/s320/091008-0007.png" alt="" id="BLOGGER_PHOTO_ID_5390212000901823442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;実行時間はまちまちだけど，&lt;span style="color: rgb(255, 0, 0);"&gt;スケジューリングが等間隔っぽい&lt;/span&gt;のは分かる．&lt;br /&gt;&lt;br /&gt;さらに拡大．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hQ04OHHI/AAAAAAAAAMU/I1mhNdg5KSU/s1600-h/091008-0009.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 183px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hQ04OHHI/AAAAAAAAAMU/I1mhNdg5KSU/s320/091008-0009.png" alt="" id="BLOGGER_PHOTO_ID_5390212008220957810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hRBFuBAI/AAAAAAAAAMc/0Eme_WD9QC0/s1600-h/091008-0010.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 183px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/Ss3hRBFuBAI/AAAAAAAAAMc/0Eme_WD9QC0/s320/091008-0010.png" alt="" id="BLOGGER_PHOTO_ID_5390212011498800130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ほぼ同期しているのが確認出来る．&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;あと，2つのスレッドでCPU割当が終了する(スケジューリング対象外となる)理由が，上側スレッドは必ずBlockedなのに対し，下側はBlockedだったりUrgent Preemptionだったりする&lt;/span&gt;．Urgent Preemptionってのはよくわかんないけど．&lt;br /&gt;&lt;br /&gt;しかしこれ以外の情報はつかめず．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;分かった事まとめ．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;kernel_taskで2スレッドを同期して実行するヤツが居る&lt;/li&gt;&lt;/ul&gt;これ以外わからず．普通，何かを同期とって「同時に」処理するなんてやらないと思うんだけどなー．ちょっとカーネルを読んでみるか．それで分かるとは思えないけど．&lt;br /&gt;&lt;br /&gt;しかも，しばらく時間が経つとこの暴走が終わるから尚謎．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------------&lt;br /&gt;小テク(？)たち&lt;br /&gt;&lt;ul&gt;&lt;li&gt;root権限のプロセスをSharkで監視するには，Sharkをroot権限で立ち上げる．sudo /Developer/Applications/.../MacOS/Shark という形&lt;/li&gt;&lt;li&gt;なぜか2つ以上のトレース結果ファイルを，Sharkで同時に開けない．その場合は，別プロセスのSharkを立ち上げれば良い．open -n *.msharkという形で．&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2699740581213594239?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2699740581213594239/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcskerneltask-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2699740581213594239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2699740581213594239'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcskerneltask-2.html' title='AOVCSデーモンがkernel_taskを暴走させる？ (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/Ss3Y_v0tWlI/AAAAAAAAALs/pwnXHkcx_Dg/s72-c/091008-0003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7646608344989114751</id><published>2009-10-07T20:02:00.000+09:00</published><updated>2009-10-07T20:11:24.014+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><title type='text'>AOVCSデーモンがkernel_taskを暴走させる？</title><content type='html'>&lt;a href="http://aru-and-dhi.blogspot.com/2009/09/d-script.html"&gt;d-scriptの修正？ 調査&lt;/a&gt;のつづき．デーモンを動かしていると，突然Macが重たくなる，調べると&lt;span style="color: rgb(255, 0, 0);"&gt;kernel_taskがやたらCPUを消費している&lt;/span&gt;，という問題．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこまでは分かったのだが，それ以上が分からない．そもそも発動条件が分からないし，本当にデーモンのせいなのかも不明．&lt;br /&gt;&lt;br /&gt;そこで，現在試した条件で暴走を確認したかどうかをメモしていく．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;フルの状態：何回か確認&lt;/li&gt;&lt;li&gt;GUI無し，ターミナルで通常実行：確認出来ず&lt;/li&gt;&lt;li&gt;GUI付き，DBへの書き出し無し：確認出来ず&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;とりあえずこれくらい．&lt;span style="color: rgb(255, 0, 0);"&gt;「確認出来ず」というのは，ある程度長いスパン実行させっぱなしにしても暴走を確認出来なかった&lt;/span&gt;，ということ．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7646608344989114751?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7646608344989114751/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcskerneltask.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7646608344989114751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7646608344989114751'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcskerneltask.html' title='AOVCSデーモンがkernel_taskを暴走させる？'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1985702510830445365</id><published>2009-10-07T13:48:00.002+09:00</published><updated>2009-10-07T13:52:19.546+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (6)</title><content type='html'>とりあえず暫定として，自宅サーバに置くことにした．&lt;br /&gt;VM上なので，たまに落ちてたりするかもしれません．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hi.mydns.jp/aovcs/home"&gt;http://www.hi.mydns.jp/aovcs/home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;尚，まだ文章修正中&amp;amp;ハイライト調整中です．&lt;br /&gt;&lt;br /&gt;それらの指摘は，ここのコメントで頂けると幸いです．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1985702510830445365?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1985702510830445365/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-6.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1985702510830445365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1985702510830445365'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/10/aovcsweb-6.html' title='AOVCSのwebページ作成中 (6)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-3501678374137517834</id><published>2009-09-29T17:30:00.006+09:00</published><updated>2009-09-29T17:41:33.281+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (5)</title><content type='html'>言語選択表示の件，試行錯誤の末，次の場所にした．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SsHG_mNfJ5I/AAAAAAAAALg/o7oLTQItHgc/s1600-h/090929-0007.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 210px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SsHG_mNfJ5I/AAAAAAAAALg/o7oLTQItHgc/s320/090929-0007.png" alt="" id="BLOGGER_PHOTO_ID_5386805425202997138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ページを開いた時点で視界に入り，かつ区切られているためメインコンテンツを邪魔しない．かな．まあそれなりに満足．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;すでにPythonが必須となっている為，Dropboxとかで公開が出来ない．くっ．とりあえず自宅サーバで公開することにしようかな？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-3501678374137517834?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/3501678374137517834/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3501678374137517834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3501678374137517834'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-5.html' title='AOVCSのwebページ作成中 (5)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/SsHG_mNfJ5I/AAAAAAAAALg/o7oLTQItHgc/s72-c/090929-0007.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7161867437322177963</id><published>2009-09-29T13:16:00.006+09:00</published><updated>2009-09-29T14:06:39.171+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (4)</title><content type='html'>英訳に飽きたらWebページのスクリプトを書く，という作業をやっている．設定uploadページは置いといて，言語選択とかも出来る所まで作った．&lt;br /&gt;&lt;br /&gt;ただ，言語選択をどこに置くかがすごく悩ましい．とりあえず今は下に示す場所に置いている．デザイン的にも気に入っている．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SsGKmI8qTlI/AAAAAAAAAKU/Wia56LgPt-k/s1600-h/090929-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 203px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SsGKmI8qTlI/AAAAAAAAAKU/Wia56LgPt-k/s320/090929-0001.png" alt="" id="BLOGGER_PHOTO_ID_5386739017153400402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;でも，液晶の解像度によっては，&lt;span style="color: rgb(255, 0, 0);"&gt;開いた直後に目に入らない&lt;/span&gt;かもしれない．ちょっと良くないかな？悩ましい．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;多分，多くの人はこれが普通じゃないっていうのが次．&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SsGMR1P4eMI/AAAAAAAAAKc/BVqAzWPJl_U/s1600-h/090929-0002.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 62px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SsGMR1P4eMI/AAAAAAAAAKc/BVqAzWPJl_U/s320/090929-0002.png" alt="" id="BLOGGER_PHOTO_ID_5386740867291183298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;でも個人的には，&lt;span style="color: rgb(255, 0, 0);"&gt;タイトルと言語選択が同類に見えてしまう&lt;/span&gt;ところが好きじゃない．言語選択のとこだけ色を変えればまあでもいいか？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;他にも色々迷走中．デザイン的にはこれも好き．ただ，&lt;span style="color: rgb(51, 51, 255);"&gt;リンクを張るのが難しすぎる&lt;/span&gt;ので却下．そしてここで縦に書くのは，スペースが足りない．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SsGMTdtes1I/AAAAAAAAAK0/YUbqps3Ueu0/s1600-h/090929-0006.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 57px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SsGMTdtes1I/AAAAAAAAAK0/YUbqps3Ueu0/s320/090929-0006.png" alt="" id="BLOGGER_PHOTO_ID_5386740895332610898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;本文タイトルの上に入れてみた．&lt;span style="color: rgb(51, 51, 255);"&gt;多分本文タイトルが見づらく&lt;/span&gt;なって邪魔．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SsGMSqpYo2I/AAAAAAAAAKs/jd3w1NUeEkA/s1600-h/090929-0004.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 71px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SsGMSqpYo2I/AAAAAAAAAKs/jd3w1NUeEkA/s320/090929-0004.png" alt="" id="BLOGGER_PHOTO_ID_5386740881625228130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;メニューの脇に．でも&lt;span style="color: rgb(51, 51, 255);"&gt;本文を見るたびに言語選択が目に入る&lt;/span&gt;のは邪魔だと思うから駄目．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SsGMSaxXjbI/AAAAAAAAAKk/j-6I5tFLCZA/s1600-h/090929-0003.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 132px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SsGMSaxXjbI/AAAAAAAAAKk/j-6I5tFLCZA/s320/090929-0003.png" alt="" id="BLOGGER_PHOTO_ID_5386740877363744178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;色々考えて思ったけど，言語選択の理想はきっと次なんだろう．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;開いた際に，すぐに見つけられる&lt;br /&gt;&lt;/li&gt;&lt;li&gt;選択した後は，特に気にしなければ目につかない&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; 斜めとか縦書きにするのは，前者と後者を同時に満たせるいい方法だと思ってる．そうすることで「変な場所」として分離出来るから．でも，それを本文のあるセクションに用意するのは，本文が見づらくなって駄目．あーむずかし．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;こんなとこに時間かけすぎるのは駄目だと思いつつ，そこそこの使いやすさがないと中身が評価されないので悩みつつ．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7161867437322177963?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7161867437322177963/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7161867437322177963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7161867437322177963'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-4.html' title='AOVCSのwebページ作成中 (4)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FhxNSpAa3Kg/SsGKmI8qTlI/AAAAAAAAAKU/Wia56LgPt-k/s72-c/090929-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5997503894412825256</id><published>2009-09-28T01:00:00.004+09:00</published><updated>2009-09-28T01:30:52.522+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>d-scriptの修正？ 調査</title><content type='html'>どうもデーモンを動かしっぱなしにしていると，&lt;span style="color: rgb(51, 51, 255);"&gt;kernel_taskが突然重くなる(CPU100%使い始める)&lt;/span&gt;．多分，デーモンのせいなのだと思う．ただ原因も対処法も分からない．&lt;br /&gt;&lt;br /&gt;原因として考えられるのは，次の辺りか？&lt;br /&gt;&lt;ul&gt;&lt;li&gt;「SQLiteのファイルサイズが大きくなり，commitに時間がかかるから」&lt;br /&gt;でもkernel_taskが暴走するとは考えにくい&lt;/li&gt;&lt;li&gt;「メモリリークが起こって，何かしらの問題を引き起こしている」&lt;br /&gt;でもそれだとトレースの整合性が取れなくなり，デーモンの方にエラーが表示されるはず．現状kernel_taskがしんどくなっても，デーモンにエラーはほぼ出ない&lt;/li&gt;&lt;li&gt;「dtraceのガーベジコレクタが頑張ってる」&lt;br /&gt;GCの頻度がホントに少なければあり得るだろうけど，普通そんなこと無いはず&lt;/li&gt;&lt;/ul&gt;どれもkernel_taskが突然重くなる原因を綺麗に説明できない．仕方ないので，対症療法として，d-scriptを軽くするとかSQLiteのコンパクションを考えるとかが必要そう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また，GCが全然発動しないとかあり得るのか調べる為に，copyinに対してのGCが動いているっぽいかを調べてみた．&lt;br /&gt;copyinは，指定したユーザ空間アドレスからデータを引っ張り，カーネル空間にコピーしてそのアドレスを返す関数．&lt;span style="color: rgb(255, 0, 0);"&gt;GCが働かないとか働く頻度が低いとかあれば，最初にコピーしたアドレスを再利用するまで時間がかかる&lt;/span&gt;ということになるはず．なので，次のd-scriptを実行してみた．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="C"&gt;#pragma D option quiet&lt;br /&gt;syscall::open:entry{&lt;br /&gt;      printf("%p\n", (int *)copyin(arg0, sizeof(char *)));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;適当なシステムコールをフックして，その引数内のポインタの参照先をコピーし，そのアドレスを表示させている．んでこの実行例が次．&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96008&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96010&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96018&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96020&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96028&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96030&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96038&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96040&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96048&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96050&lt;/span&gt;&lt;br /&gt;4e396008&lt;br /&gt;4e396010&lt;br /&gt;4e396018&lt;br /&gt;4e396020&lt;br /&gt;4e396028&lt;br /&gt;4e396030&lt;br /&gt;4e396038&lt;br /&gt;4e396040&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96008&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96010&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96018&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96020&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4db96028&lt;/span&gt;&lt;br /&gt;4e796008&lt;br /&gt;4e796010&lt;br /&gt;4e796018&lt;br /&gt;4e396008&lt;br /&gt;4e396010&lt;br /&gt;4e396018&lt;br /&gt;4e396020&lt;br /&gt;4e396028&lt;br /&gt;4e396030&lt;br /&gt;4e396038&lt;br /&gt;4e396040&lt;br /&gt;4db96008&lt;br /&gt;4db96010&lt;br /&gt;4db96018&lt;br /&gt;4db96020&lt;br /&gt;4db96028&lt;br /&gt;4e796008&lt;br /&gt;4e796010&lt;br /&gt;4e796018&lt;br /&gt;4df96008&lt;br /&gt;4e396008&lt;br /&gt;4e396010&lt;br /&gt;4e396018&lt;br /&gt;4e396020&lt;br /&gt;4e396028&lt;br /&gt;4e396030&lt;br /&gt;4e396038&lt;br /&gt;4e396040&lt;br /&gt;4db96008&lt;br /&gt;4db96010&lt;br /&gt;4e796008&lt;br /&gt;4e796010&lt;br /&gt;4e796018&lt;br /&gt;4e796020&lt;br /&gt;4e796028&lt;br /&gt;4e796030&lt;br /&gt;4e796038&lt;br /&gt;4e796040&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;数秒実行させただけだけど，同じアドレスをちゃんと再利用している事が分かる．少なくともcopyinについては，GCはちゃんと動いているみたい．そうなると，他のGCもきっと大丈夫なんだろうな&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5997503894412825256?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5997503894412825256/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/d-script.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5997503894412825256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5997503894412825256'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/d-script.html' title='d-scriptの修正？ 調査'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-942315201403978596</id><published>2009-09-26T16:25:00.003+09:00</published><updated>2009-09-26T16:58:01.015+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_python'/><title type='text'>AOVCSのwebページ作成中 (3) - mod_python インストール to 10.6</title><content type='html'>現在アップロードをどうするか行き詰まり，Webページの英訳の方も進まないので，Webページのスクリプトを作成する方向に走ろうと思う．で，その言語としてPythonを使うこととした．正直Webページ製作であればPHPの方が慣れているのだけれど，まあ気分転換&amp;amp;勉強という事で．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;開発はもちろんSnow Leopard上．ただ，&lt;span style="color: rgb(51, 51, 255);"&gt;デフォルトで入っているApacheにはmod_pythonがインストールされていない&lt;/span&gt;．以前MAMPで入れたApacheにも．そのため，デフォルトで入っているApacheに，mod_pythonを自分でインストールすることにした．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参照したのは次のページ．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/namaniku206/20080601/p1"&gt;http://d.hatena.ne.jp/namaniku206/20080601/p1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mod_python.darwinports.com/"&gt;http://mod_python.darwinports.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;この辺のページを見れば分かるが，MacPorts経由でインストールすることも出来る．でも，そうするときっと&lt;span style="color: rgb(51, 51, 255);"&gt;flexとかapacheとか色々依存するものをコンパイル&amp;amp;インストールさせられて，時間が無くなる&lt;/span&gt;と思った．なので，&lt;span style="color: rgb(255, 0, 0);"&gt;MacPortsでコンパイルしない&lt;/span&gt;，を目標とした．&lt;br /&gt;&lt;br /&gt;で，色々格闘した所，次の流れでコンパイル&amp;amp;インストールすれば成功した．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ソースコードダウンロード&lt;/li&gt;&lt;li&gt;パッチダウンロード&lt;/li&gt;&lt;li&gt;コンパイル&lt;/li&gt;&lt;li&gt;インストール&lt;/li&gt;&lt;/ul&gt;とってもざっくり．重要なのは，&lt;span style="color: rgb(255, 0, 0);"&gt;パッチを当てないとコンパイルが成功しない&lt;/span&gt;って所か．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;ソースコード&amp;amp;パッチダウンロード&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ソースコードはここから．mod_python-3.3.1.tgzを落とせば良い．&lt;br /&gt;&lt;a href="http://httpd.apache.org/modules/python-download.cgi"&gt;http://httpd.apache.org/modules/python-download.cgi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;パッチはどこにあるかよくわからなかったので，MacPortsでダウンロードした．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ port fetch mod_python&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こうすると，自分の環境では/opt/local/var/macports/sources/rsync.macports.org/release/ports/www/mod_python/files にパッチファイルがダウンロードされる．あとはこれらをソースコードに適用すれば良い．ソースコードのアーカイブ，パッチが同じディレクトリにあるとすれば，次の通り．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ tar -zxf mod_python-3.3.1.tgz&lt;br /&gt;$ cp *.diff mod_python-3.3.1&lt;br /&gt;$ cd mod_python-3.3.1&lt;br /&gt;$ patch -p0 &amp;lt; patch-dist-Makefile.in.diff&lt;br /&gt;$ patch -p0 &amp;lt; patch-src-connobject.c.diff&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;コンパイル＆インストール&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;通常通りconfigure，make，sudo make installとすれば良い．&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ ./configure &amp;amp;&amp;amp; make&lt;br /&gt;$ sudo make install&lt;/pre&gt;&lt;br /&gt;そうすると，/Library/Python/2.6/site-packages/mod_python/と/usr/libexec/apache2/mod_python.soが出来る．あとは，httpd.confに次を記述してApache再起動．&lt;br /&gt;&lt;pre class="prettyprint"&gt;LoadModule python_module libexec/apache2/mod_python.so&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;終わり．動作確認は，&lt;a href="http://www.python.jp/doc/contrib/modpython/inst-testing.html"&gt;http://www.python.jp/doc/contrib/modpython/inst-testing.html&lt;/a&gt;&lt;br /&gt;辺りを参考に．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-942315201403978596?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/942315201403978596/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-3-modpython-to-106.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/942315201403978596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/942315201403978596'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-3-modpython-to-106.html' title='AOVCSのwebページ作成中 (3) - mod_python インストール to 10.6'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8694272358657149316</id><published>2009-09-25T17:18:00.003+09:00</published><updated>2009-09-25T18:08:32.630+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中 (2)</title><content type='html'>日本語ページの文章は大体出来た．今は，Configurationの投稿ページを作成中．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;AOVCSが良いデフォルト設定を提供できれば，ユーザはほとんど設定せずにバージョン管理を出来るようになるはず&lt;/span&gt;である．しかし，多様なアプリケーションの設定を用意するのは，個人では非常に難しい．そのため，&lt;span style="color: rgb(255, 0, 0);"&gt;ユーザが独自に設定したものをアップロード出来る&lt;/span&gt;ようにしたい．&lt;br /&gt;&lt;br /&gt;現状では，ユーザが手動でアップロードをする形とする．のちのち，AOVCS-daemonの方からアップ出来るようになれば尚良いが．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;この要求を単純に満たすだけであれば，掲示板を用意してそこにXMLの設定を貼付け&lt;/span&gt;られれば良い．でも出来れば，下で示す要求を満たしたい．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;アップロードされているアプリケーションが何かを一覧出来る&lt;/li&gt;&lt;li&gt;興味を持ったアプリケーションについては，設定を表形式およびXML形式で見れる&lt;/li&gt;&lt;li&gt;アプリケーション名や評価(「良」への投票数とか？)によってソート出来る&lt;/li&gt;&lt;/ul&gt;この辺を満たす方法は無いかと考えて，とりあえず次のWebページに示す形にしてみた．&lt;br /&gt;&lt;a href="https://dl.getdropbox.com/u/544268/aovcs-web/floatingTest.html"&gt;https://dl.getdropbox.com/u/544268/aovcs-web/floatingTest.html&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SryIe0P6Q-I/AAAAAAAAAKM/xTB6P0mKd9Q/s1600-h/090925-0002.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SryIe0P6Q-I/AAAAAAAAAKM/xTB6P0mKd9Q/s320/090925-0002.png" alt="" id="BLOGGER_PHOTO_ID_5385329317431100386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;一覧を表示する際には表やXMLを表示はしない．で，興味を持ったらマウスをShowに持ってく事で，フローティングウィンドウでその中身が見れる．&lt;br /&gt;&lt;br /&gt;興味を持ったところにマウスを持ってかないといけないのは，使いづらいかなー？とか，表形式とXMLはまとめて表示してもいいかなー？とか色々思う所はまだある．そのため，こういうデザインで行く，とは決めてない．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8694272358657149316?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8694272358657149316/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8694272358657149316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8694272358657149316'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb-2.html' title='AOVCSのwebページ作成中 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SryIe0P6Q-I/AAAAAAAAAKM/xTB6P0mKd9Q/s72-c/090925-0002.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5286036486735323793</id><published>2009-09-15T21:39:00.006+09:00</published><updated>2009-09-15T21:59:33.737+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-web'/><title type='text'>AOVCSのwebページ作成中</title><content type='html'>以前β版を公開する為に必要な事としてあげた，Webページの作成を実行中．とりあえずOmniGraffleで作成したデザインはこんな．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq-LXrngfvI/AAAAAAAAAJ8/KH0r-OKDf6w/s1600-h/090915-0004.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq-LXrngfvI/AAAAAAAAAJ8/KH0r-OKDf6w/s320/090915-0004.png" alt="" id="BLOGGER_PHOTO_ID_5381673318692716274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;カラフルなのはセンスが必要で自分には難しいので，インストーラの際にも使ったティールって色のみでほとんど構成する事にした．また，メニューとコンテンツの間は，現在今どこに居るかを示すインジケータ＆トップへジャンプ＆ボトムへジャンプ領域とした．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ほいでこれを，HTMLで書き直す．未だにHTMLは手打ちで，MacのhpDrafterってアプリケーションで行ってる．で，トップページまで作った(トップ/ボトムへジャンプ機能はまだ)のが次のURI．&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dl.getdropbox.com/u/544268/aovcs-web/index.html"&gt;http://dl.getdropbox.com/u/544268/aovcs-web/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まだどこのサーバに置くか決めていないので，とりあえずdropbox．スクショは次の通り&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Sq-OAEm90DI/AAAAAAAAAKE/eAcynlMtwWg/s1600-h/090915-0005.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 237px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Sq-OAEm90DI/AAAAAAAAAKE/eAcynlMtwWg/s320/090915-0005.png" alt="" id="BLOGGER_PHOTO_ID_5381676211619352626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これからしばらくは，この辺の文章を書く作業&amp;amp;英訳する作業&amp;amp;Configurationをアップロードするページを作る作業になるはず．英訳とか厳しいなー．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5286036486735323793?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5286036486735323793/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5286036486735323793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5286036486735323793'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsweb.html' title='AOVCSのwebページ作成中'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq-LXrngfvI/AAAAAAAAAJ8/KH0r-OKDf6w/s72-c/090915-0004.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8845430361500699801</id><published>2009-09-14T23:20:00.002+09:00</published><updated>2009-09-14T23:29:56.402+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>AOVCS-bazaarの修正 (2)</title><content type='html'>前回の，二段以上のディレクトリ名変更への対応，再帰で簡単に出来た．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def grabActionFromRenamingChain(self, path, events, depth=5):&lt;br /&gt;      """ define the action using renaming chain of parent directories&lt;br /&gt;      such as: mkdir hoge; touch hoge/foo; mv hoge fuga&lt;br /&gt;      without checking parent directories, the file 'fuga/foo' cannot be found out&lt;br /&gt;      any trace from DB.&lt;br /&gt;      To resolve the problem, we should check the parents.&lt;br /&gt;      This situation rarely causes, so check it too honestly.&lt;br /&gt;      """&lt;br /&gt;      originalPath=path&lt;br /&gt;      if depth==0: return None&lt;br /&gt;&lt;br /&gt;      while(1):&lt;br /&gt;          index=path.rfind("/")&lt;br /&gt;          if index==-1: break&lt;br /&gt;          path=path[0:index]&lt;br /&gt;          curpath=path&lt;br /&gt;          while(1):&lt;br /&gt;              result=self.db.search(curpath, [aovcs.DB_MOVETO])&lt;br /&gt;              if result==None: break;&lt;br /&gt;              curpath=result[3]&lt;br /&gt;&lt;br /&gt;              renamedPath=originalPath.replace(path, curpath)&lt;br /&gt;              result=self.db.search(renamedPath, events)&lt;br /&gt;              if result!=None:&lt;br /&gt;                  result=list(result)&lt;br /&gt;                  result[2]=originalPath&lt;br /&gt;                  return result&lt;br /&gt;&lt;br /&gt;              result=self.grabActionFromRenamingChain(renamedPath, events, depth=depth-1)&lt;br /&gt;              if result!=None:&lt;br /&gt;                  result=list(result)&lt;br /&gt;                  result[2]=originalPath&lt;br /&gt;                  return result&lt;br /&gt;&lt;br /&gt;      return None&lt;br /&gt;&lt;/pre&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;親ディレクトリの名前変更が見つかって，でもその名前変更を使ってもDBからトレースが見つからなかった場合，そこから改めて親ディレクトリを辿る&lt;/span&gt;，という事をする．それが，grabActionFromRenamingChainを再帰的に呼んでいる所．基本はこれだけ．&lt;br /&gt;ただ，これが無限ループになるとまずいので，depth変数で再帰回数を制限している．無限ループになる場合は，ディレクトリ名をAからBに変更し，またAに戻すような場合．もしその中のファイルが何かしらの理由でトレースを取り損ねていたとしたら，A→B→A→ ... を繰り返してしまう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8845430361500699801?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8845430361500699801/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcs-bazaar-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8845430361500699801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8845430361500699801'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcs-bazaar-2.html' title='AOVCS-bazaarの修正 (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4254217482660771553</id><published>2009-09-14T21:27:00.004+09:00</published><updated>2009-09-14T22:18:27.651+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>AOVCS-bazaarの修正</title><content type='html'>autoflagsの動作検証しつつ，OmniGraffleでAOVCSのWebページデザインをしていた．すると，&lt;span style="color: rgb(51, 51, 255);"&gt;現状のautoflagsコマンドでは，OmniGraffleで作成したファイルをうまくautoflagsできない&lt;/span&gt;という事が発覚．この修正を行った．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;現状うまく扱えない状況というのは，次の通りにして出来る．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;新規ディレクトリを作成，その中にファイルを作る (mkdir hoge; touch hoge/fuga)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;作ったディレクトリを何かしらに名前変更 (mv hoge foo)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;autoflagsの実行&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;こうすると，&lt;span style="color: rgb(255, 0, 0);"&gt;新規ディレクトリ内のファイルは，そのパス(foo/fuga)においてDBにトレースが存在しない&lt;/span&gt;．これにより，正しくautoflags出来ないという事になってしまう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これを正しく動作させるには，次の通りにする．前提条件として，あるパス(foo/fuga)でDBからトレースを取得出来なかったとする．&lt;ul&gt;&lt;li&gt;その親ディレクトリに名前変更操作(mv hoge foo)が無いか調べる&lt;/li&gt;&lt;li&gt;あったら名前変更前のパス(hoge/fuga)でDBから検索する&lt;/li&gt;&lt;/ul&gt;きちんとフローチャートで書くと次の通り．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq5Af48YFtI/AAAAAAAAAJ0/vtWbWBwjQ9Y/s1600-h/figs4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 223px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq5Af48YFtI/AAAAAAAAAJ0/vtWbWBwjQ9Y/s320/figs4.png" alt="" id="BLOGGER_PHOTO_ID_5381309521360066258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;赤字で，上で示した例を処理させた場合の挙動を示している．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただし，このフローチャートを書いていて気づいたが，&lt;span style="color: rgb(51, 51, 255);"&gt;ディレクトリの名前変更が二段以上になったら，これでも対応が出来ない&lt;/span&gt;．&lt;br /&gt;&lt;pre class="prettyprint"&gt;mkdir -p hoge/fuga/piyo; touch hoge/fuga/piyo/foo; mv hoge/fuga hoge/bar; mv hoge ooo&lt;/pre&gt;こんな感じ．上記のアルゴリズムだと，ooo/bar/piyo/fooは，ooo/fuga/piyo/fooとhoge/bar/piyo/fooは探索するが，hoge/fuga/piyo/fooは探索しない．&lt;span style="color: rgb(255, 0, 0);"&gt;再帰的に上記のアルゴリズムを適用してあげれば良さげ&lt;/span&gt;だが，果たして．(現状実装中)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;尚上記アルゴリズムをpythonで実装すると次の通り．&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def grabActionFromRenamingChain(self, path, events):&lt;br /&gt;      """ define the action using renaming chain of parent directories&lt;br /&gt;      such as: mkdir hoge; touch hoge/foo; mv hoge fuga&lt;br /&gt;      without checking parent directories, the file 'fuga/foo' cannot be found out&lt;br /&gt;      any trace from DB.&lt;br /&gt;      To resolve the problem, we should check the parents.&lt;br /&gt;      This situation rarely causes, so check it too honestly.&lt;br /&gt;      """&lt;br /&gt;      originalPath=path&lt;br /&gt;      while(1):&lt;br /&gt;          index=path.rfind("/")&lt;br /&gt;          if index==-1: break&lt;br /&gt;          path=path[0:index]&lt;br /&gt;          curpath=path&lt;br /&gt;          while(1):&lt;br /&gt;              result=self.db.search(curpath, [aovcs.DB_MOVETO])&lt;br /&gt;              if result==None: break;&lt;br /&gt;              curpath=result[3]&lt;br /&gt;&lt;br /&gt;              renamedPath=originalPath.replace(path, curpath)&lt;br /&gt;              result=self.db.search(renamedPath, events)&lt;br /&gt;              if result!=None:&lt;br /&gt;                  result=list(result)&lt;br /&gt;                  result[2]=originalPath&lt;br /&gt;                  return result&lt;br /&gt;&lt;br /&gt;      return None&lt;br /&gt;&lt;/pre&gt;フローチャートよりもコードの方がなぜか簡単に見える．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4254217482660771553?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4254217482660771553/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcs-bazaar.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4254217482660771553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4254217482660771553'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcs-bazaar.html' title='AOVCS-bazaarの修正'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq5Af48YFtI/AAAAAAAAAJ0/vtWbWBwjQ9Y/s72-c/figs4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2424438881800504522</id><published>2009-09-14T17:01:00.004+09:00</published><updated>2009-09-14T17:12:23.199+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><title type='text'>AOVCSにGUIをくっつける (7)</title><content type='html'>GUIのちょっとした修正．バグレポートを送ってもらう際に，Daemon Messageを添付してもらいたいのだが，そのメッセージをコピーする方法が無い．それを実装する．&lt;br /&gt;&lt;br /&gt;とりあえずGUIにメッセージコピーボタンを追加．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq34yC2cSMI/AAAAAAAAAJk/w_C3BPI0pg8/s1600-h/090914-0001.png"&gt;&lt;img style="cursor: pointer; width: 226px; height: 320px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq34yC2cSMI/AAAAAAAAAJk/w_C3BPI0pg8/s320/090914-0001.png" alt="" id="BLOGGER_PHOTO_ID_5381230668419975362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;次に，このボタンを押した際の動作．&lt;br /&gt;&lt;pre name="code" class="c"&gt;- (IBAction) copyErrors:(id)sender&lt;br /&gt;{&lt;br /&gt; NSPasteboard *pb=[NSPasteboard generalPasteboard];&lt;br /&gt; [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];&lt;br /&gt; [pb setString:errorMessages forType:NSStringPboardType];&lt;br /&gt;}&lt;/pre&gt;まずペーストボードのインスタンスを取得する．次に，declareTypes:owner:メソッドで，コピーしようとしているデータの種類(ここではNSStringPBoardType)を設定．最後に，setString:forType:で，実際にデータをコピーする．&lt;br /&gt;これだけ．これで，errorMessagesの内容をコピー出来る．あとは，Cocoa Bindingsをくっつけて終わり．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Sq36AIzL73I/AAAAAAAAAJs/xFumQfBoys4/s1600-h/090914-0004.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 223px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/Sq36AIzL73I/AAAAAAAAAJs/xFumQfBoys4/s320/090914-0004.png" alt="" id="BLOGGER_PHOTO_ID_5381232010046730098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;errorMessagesの更新部分は本質じゃないのでここでは触れない．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2424438881800504522?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2424438881800504522/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-7.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2424438881800504522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2424438881800504522'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-7.html' title='AOVCSにGUIをくっつける (7)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FhxNSpAa3Kg/Sq34yC2cSMI/AAAAAAAAAJk/w_C3BPI0pg8/s72-c/090914-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8452256394506077987</id><published>2009-09-09T00:55:00.005+09:00</published><updated>2009-09-09T01:48:25.489+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='Authorization Service'/><title type='text'>AuthorizationExecuteWithPrivilegesについて</title><content type='html'>以前，&lt;a href="http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-2.html"&gt;このエントリ&lt;/a&gt;でCocoaにおけるsudoのやり方を示した．しかしこの，&lt;span style="color: rgb(255, 0, 0);"&gt;AuthorizationExecuteWithPrivileges(AEWP)を直接使って実行するやり方は，セキュリティ的に良くない&lt;/span&gt;らしい．&lt;br /&gt;&lt;br /&gt;この代わりの手段として，次の２つをAppleは挙げている．&lt;br /&gt;&lt;ol&gt;&lt;li&gt;AEWPからhelper toolを起動し，それにsetuidさせる (2003, &lt;a href="http://developer.apple.com/legacy/mac/library/samplecode/MoreIsBetter/index.html"&gt;サンプルコード&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;launchdを通して起動する (2007, &lt;a href="http://developer.apple.com/mac/library/samplecode/BetterAuthorizationSample/index.html"&gt;サンプルコード兼ライブラリ&lt;/a&gt;)&lt;/li&gt;&lt;/ol&gt;基本的には，前者よりも後者を推奨とのこと．これは，&lt;span style="color: rgb(255, 0, 0);"&gt;helper toolの実行環境(環境変数とかかな？)は改変可能だが，launchdから起動した場合は改変不可能&lt;/span&gt;だから．&lt;br /&gt;(原文： In the BAS design, an attacker can't directly control the environment which the helper tool inherits, and that prevents a variety of potential attacks. 方法2&lt;a href="http://developer.apple.com/mac/library/samplecode/BetterAuthorizationSample/listing5.html"&gt;プロジェクト内のドキュメント&lt;/a&gt;より．BASとは，BetterAuthorizationSample，方法2のライブラリ名)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;となれば，推奨されている方法2を調べるのが筋．なのだが，これがなかなか難しい．使い方は&lt;a href="http://developer.apple.com/mac/library/samplecode/BetterAuthorizationSample/listing5.html"&gt;このドキュメント&lt;/a&gt;の通りなのだろうけど，「単に"sudo dtrace -C -s hoge.d"を実行して，その標準出力およびエラー出力を取得したい」というのを満たすにはオーバースペックに見えてしまう．&lt;br /&gt;&lt;br /&gt;ざっと読んだ感じ，実行は次の通りに行われるようだ．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;予め，または必要になった際に，システム内のlaunchdが管理する領域にhelper toolをコピー(/Library/LaunchDaemons/&amp;lt;bundleID&amp;gt;&lt;bundleid&gt;.plist, /Library/PrivilegedHelperTools/&lt;/bundleid&gt;&amp;lt;bundleID&amp;gt;&lt;bundleid&gt;&lt;bundleid&gt;)&lt;/bundleid&gt;&lt;/bundleid&gt;&lt;/li&gt;&lt;li&gt;これにより，launchdが/var/run/&amp;lt;bundleID&amp;gt;&lt;bundleid&gt;.socket を作成&lt;/bundleid&gt;&lt;/li&gt;&lt;li&gt;アプリケーションから上のソケットに接続すると，launchd経由で，/Library/PrivilegedHelperTools/&amp;lt;bundleID&amp;gt;が起動&lt;/li&gt;&lt;li&gt;起動した&amp;lt;bundleID&amp;gt;=helper toolが，元のアプリケーションから認証情報を取得し，認証を行い，成功したら指定のコマンドを起動&lt;/li&gt;&lt;/ul&gt;helper toolのインストールは，方法1で行う．これは，&lt;span style="color: rgb(255, 0, 0);"&gt;1度限りの実行は，方法1でもセキュリティリスクは高くない&lt;/span&gt;から．繰り返し実行されるものを方法1でやってしまうと，危険らしい．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;うーん，まだまだ使える気がしない．helper toolで実行したdtraceのstdout, stderrはどう取得するのかとか．helper toolインストール用のhelper toolを作らないと駄目だし．もちろんサンプルはあるけど．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8452256394506077987?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8452256394506077987/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/authorizationexecutewithprivileges.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8452256394506077987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8452256394506077987'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/authorizationexecutewithprivileges.html' title='AuthorizationExecuteWithPrivilegesについて'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1359819187326984055</id><published>2009-09-07T22:30:00.006+09:00</published><updated>2009-09-07T23:21:17.666+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='インストーラ'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='dmg'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>AOVCSにGUIをくっつける (6)</title><content type='html'>とりあえず出来た．まあ実を言うとAOVCS-GUI(1)の時点で，既に動くようにはなってたんだけど．&lt;br /&gt;&lt;br /&gt;実装してある機能は次．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;optimizer, reorderer, dtraceの起動/停止 (launch/stopボタンより)&lt;/li&gt;&lt;li&gt;ログの出力 (optimizerのみ，dtraceのstderrは取得出来ておらず)&lt;/li&gt;&lt;li&gt;Mac起動時の，自動起動(Dockにアイコンが出来る事で，Dockから選択出来る)&lt;/li&gt;&lt;li&gt;デフォルト設定ファイルの自動作成 (ファイルが無ければコピーする)&lt;/li&gt;&lt;/ul&gt;で，せっかくMacのアプリケーションを作ったので，インストーラ (.dmgを開くと出てくる，インストールのガイドライン付きディスクイメージ)を作った．それが次．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SqUM85ca2wI/AAAAAAAAAJc/Zf58HA8hWgk/s1600-h/090907-0001.png"&gt;    &lt;img style="cursor: pointer; width: 320px; height: 249px;" src="http://1.bp.blogspot.com/_FhxNSpAa3Kg/SqUM85ca2wI/AAAAAAAAAJc/Zf58HA8hWgk/s320/090907-0001.png" alt="" id="BLOGGER_PHOTO_ID_5378719570315631362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;結構頑張った！でも，Snow Leopardで作ったこのインストーラ(dmg)，&lt;span style="color: rgb(51, 51, 255);"&gt;Leopardで開くと何故か画像が表示されない&lt;/span&gt;．逆に，Leopardで作ったものをSnow Leopadで開くのは問題ない．うーん，原因が謎．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;インストーラの作り方は次の通り．&lt;a href="http://www.mhvt.net/quicktime/jpn/how_to/reviews/dmg_background.php"&gt;参照したのはここ&lt;/a&gt;．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ディスクユーティリティで，dmgを作成 (新規イメージを選択，作成)&lt;/li&gt;&lt;li&gt;dmgをマウント&lt;br /&gt;&lt;/li&gt;&lt;li&gt;必要なファイルをdmg内にコピー&lt;br /&gt;&lt;/li&gt;&lt;li&gt;インストーラ画像を作成&lt;/li&gt;&lt;li&gt;画像をdmg内にコピー&lt;/li&gt;&lt;li&gt;dmgのFinderメニューから「表示 -&gt; 表示オプションを表示」を選択 (command-jでも可)&lt;/li&gt;&lt;li&gt;背景：ピクチャを選び，先ほどdmg内にコピーした画像を選択&lt;/li&gt;&lt;li&gt;シェルか何かを用いて，&lt;span style="color: rgb(255, 0, 0);"&gt;コピーした画像をドットから始まるファイル名に変換&lt;/span&gt; (Finderに表示されないようにするため)&lt;/li&gt;&lt;li&gt;コピーしたファイルを適当にレイアウト&lt;br /&gt;&lt;/li&gt;&lt;li&gt;dmgをアンマウント&lt;/li&gt;&lt;li&gt;ディスクユーティリティで，今作成したdmgを選択し，変換，&lt;span style="color: rgb(255, 0, 0);"&gt;イメージフォーマットを読み出し専用に&lt;/span&gt;して，作成&lt;/li&gt;&lt;/ul&gt;以上．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，今回作成したインストーラは一応次の場所にからダウンロード可能．&lt;br /&gt;&lt;a href="http://dl.getdropbox.com/u/544268/aovcs-installer.dmg"&gt;http://dl.getdropbox.com/u/544268/aovcs-installer.dmg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LeopardおよびSnow Leopardで一応動作確認している．ただしx64が実行可能でなければならない(optimizer, reordererのFATバイナリ化をまださぼっている)&lt;br /&gt;&lt;br /&gt;ただ注意してもらいたいのは，まだα版という事．アクティビティモニタを見ると，リソースの無駄使いをしているという事も十分あり得る(実際何度もあった，修正したが)．&lt;span style="color: rgb(255, 0, 0);"&gt;くれぐれも試す場合は自己責任&lt;/span&gt;でお願いします．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;β版とするには，次の事が出来たらにしたい．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;数日間，複数台で動かしっぱなしでも暴走しない，Leopard，Snow Leopard両環境で&lt;br /&gt;&lt;/li&gt;&lt;li&gt;現状，状態自動設定に対応しているアプリケーションのまとめ (Emacs, Xcodeなど)&lt;/li&gt;&lt;li&gt;現状，スクリプト名抽出に対応しているアプリケーションのまとめ (bash, sh, python)&lt;/li&gt;&lt;li&gt;使い方まとめページ&lt;/li&gt;&lt;li&gt;Configurationをアップできるページ&lt;/li&gt;&lt;li&gt;バグ報告ページ (launchpadで十分か？)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1359819187326984055?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1359819187326984055/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-6.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1359819187326984055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1359819187326984055'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-6.html' title='AOVCSにGUIをくっつける (6)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FhxNSpAa3Kg/SqUM85ca2wI/AAAAAAAAAJc/Zf58HA8hWgk/s72-c/090907-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5228702382320974176</id><published>2009-09-06T07:09:00.007+09:00</published><updated>2009-09-06T07:54:09.277+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCL'/><category scheme='http://www.blogger.com/atom/ns#' term='Grand Central Dispatch'/><title type='text'>Grand Central Dispatch, リファレンスまとめ</title><content type='html'>時間がなくて詳しく読んではいないが，Grand Central Dispatch関係のリファレンスを色々探したので，それのメモ．&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Concurrency Programming Guide&lt;/h4&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html"&gt;http://developer.apple.com/mac/library/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Appleの，マルチコア，メニーコア，GPGPU戦略の方針と方法が大雑把に書かれている．Appleは基本的にスレッドの利用を極力減らし，その代わりにGCDを利用する事を推奨している．以下引用．&lt;br /&gt;-----&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Move Away from Thread: &lt;/span&gt;&lt;br /&gt;Although threads have been around for many years and continue to have their uses, they do not solve the general problem of executing multiple tasks in a scalable way. &lt;span style="color: rgb(255, 0, 0);"&gt;With threads, the burden of creating a scalable solution rests squarely on the shoulders of you, the developer&lt;/span&gt;. (...)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Instead of relying on threads&lt;/span&gt;, Mac OS X and iPhone OS take an &lt;strong&gt;asynchronous design approach&lt;/strong&gt; to solving the concurrency problem. (...) Typically, this work involves acquiring a background thread, starting the desired task on that thread, and then sending a notification to the caller (usually through a callback function) when the task is done. In the past, if an asynchronous function did not not exist for what you want to do, you would have to write your own asynchronous function and create your own threads. &lt;span style="color: rgb(255, 0, 0);"&gt;But now, Mac OS X and iPhone OS provide technologies to allow you to perform any task asynchronously without having to manage the threads yourself&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;One of the technologies for starting tasks asynchronously in Mac OS X is &lt;strong style="color: rgb(255, 0, 0);"&gt;Grand Central Dispatch (GCD)&lt;/strong&gt;. (...)&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Grand Central Dispatch (GCD) Reference&lt;/h4&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html"&gt;http://developer.apple.com/mac/library/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Grand Central Dispatchのリファレンス(そのまま)．GCDはC言語に対してBlock構文でクロージャ(と今のところ解釈)を追加し，それを利用する事で効果的な分散処理を可能にしている．その，クロージャを利用するAPIのリファレンスというのがより正確なところ．当然CにおけるAPIである．CocoaレベルのAPIは，先述のConcurrency Programming Guideにある．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Threading Programming Guide&lt;/h4&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html"&gt;http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;どういう場合にスレッドを利用しないといけないか，という観点で参照すべきはこれ．そういう観点で見る事で，GCDの長所(記述力)と短所(記述制限)が分かるはず．その辺の話はDesign Tipsにある模様．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;OpenCL Programming Guide for Mac OS X&lt;/h4&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Performance/Conceptual/OpenCL_MacProgGuide/Introduction/Introduction.html"&gt;http://developer.apple.com/mac/library/documentation/Performance/Conceptual/OpenCL_MacProgGuide/Introduction/Introduction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GCD以外の分散，並列処理技術．GPGPUの方．Appleとしては，GCDとOpenCLで並列分散を推進したいので，一応ここに挙げておこう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上が，今のところ見つけたリファレンス．サンプルコードとかは，Xcodeのヘルプから各技術名で検索をかければOK．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5228702382320974176?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5228702382320974176/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/grand-central-dispatch.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5228702382320974176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5228702382320974176'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/grand-central-dispatch.html' title='Grand Central Dispatch, リファレンスまとめ'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6744818344295089636</id><published>2009-09-05T22:16:00.005+09:00</published><updated>2009-09-05T22:57:54.861+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><title type='text'>AOVCSにGUIをくっつける (5)</title><content type='html'>第五回．今回は，&lt;span style="color: rgb(255, 0, 0);"&gt;optimizerが出力するメッセージをパイプから読み込み，一行ずつ処理する方法&lt;/span&gt;．C言語でいうfgets的な手段を探す．&lt;br /&gt;&lt;br /&gt;まず，&lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSFileHandle_Class/Reference/Reference.html"&gt;NSFileHandleのAPIを参照&lt;/a&gt;する．そうすると，データ読み込みとしては次のものがある事が分かる．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;- (NSData *)availableData&lt;/li&gt;&lt;li&gt;- (NSData *)readDataToEndOfFile&lt;/li&gt;&lt;li&gt;- (void)readInBackgroundAndNotify&lt;/li&gt;&lt;li&gt;- (void)readToEndOfFileInBackgroundAndNotify&lt;/li&gt;&lt;/ul&gt;最初の二つは同期読み込みで，読み込めるデータが無かったらすぐに返ってくる．これではfgets的な使い方は出来ない．なぜなら，&lt;span style="color: rgb(51, 51, 255);"&gt;データが来るまでポーリングでずっと参照し続けなければならない&lt;/span&gt;からである．また最後のメソッドも，&lt;span style="color: rgb(51, 51, 255);"&gt;End-of-Fileが返ってくるまで読み込む&lt;/span&gt;というものなので，パイプで少しずつ表示するようなものには適さない．&lt;br /&gt;よって，三番目の&lt;span style="color: rgb(255, 0, 0);"&gt;readInBackgroundAndNotifyを使う&lt;/span&gt;事になる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただ，readInBackgoundAndNotifyは，返り値はvoidである．これを実行したからといって，データが受け取れる訳ではない．ではどうやって受け取るかというと，NSNotificationCenterを使う．NSNotificationCenterは，アプリケーション内のNotificationを受信して，そのNotificationを必要としているオブジェクトに転送する，というものである．先にコードを示すと次．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;// launch dtrace, reorderer, and optimizer&lt;br /&gt;- (void) runDaemon&lt;br /&gt;{&lt;br /&gt; (略)&lt;br /&gt; // setup to read the optimizer's stderr&lt;br /&gt; NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];&lt;br /&gt; [nc removeObserver:self];&lt;br /&gt; [nc addObserver:self&lt;br /&gt;        selector:@selector(readAsync:)&lt;br /&gt;            name:NSFileHandleReadCompletionNotification&lt;br /&gt;          object:[messagePipe fileHandleForReading]];&lt;br /&gt; [[messagePipe fileHandleForReading] readInBackgroundAndNotify];&lt;br /&gt; (略)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void) readAsync:(NSNotification *)aNotification&lt;br /&gt;{&lt;br /&gt; NSData *aData=[[aNotification userInfo] valueForKey:NSFileHandleNotificationDataItem];&lt;br /&gt; if([aData length]){&lt;br /&gt;     [self addMessage:aData];&lt;br /&gt; }&lt;br /&gt; if([optimizer isRunning]){&lt;br /&gt;     [[messagePipe fileHandleForReading] readInBackgroundAndNotify];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;- (void) addMessage:(NSData *)aData&lt;br /&gt;{&lt;br /&gt; NSString *str=[messageBuffer stringByAppendingString:[[NSString alloc] initWithData:aData&lt;br /&gt;                                                                            encoding:NSUTF8StringEncoding]];&lt;br /&gt; NSArray *array=[str componentsSeparatedByString:@"\n"];&lt;br /&gt; NSString *message=nil;&lt;br /&gt; for(id elem in array){&lt;br /&gt;     if(message!=nil){&lt;br /&gt;         [aViewController sendDaemonMessage:message];&lt;br /&gt;     }&lt;br /&gt;     message=elem;&lt;br /&gt; }&lt;br /&gt; messageBuffer=message;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こんな感じ．まず，&lt;span style="font-weight: bold;"&gt;readInBackgroundAndNotify&lt;/span&gt;を実行する前に，&lt;span style="font-weight: bold;"&gt;NSNotificationCenter&lt;/span&gt;に，messagePipeから&lt;span style="font-weight: bold;"&gt;NSFileHandleReadCompletionNotification&lt;/span&gt;が来たら自分(self)に&lt;span style="font-weight: bold;"&gt;readAsync:&lt;/span&gt;メッセージを送ってくれと伝える(8-11行)．それを行った上で，messagePipeの&lt;span style="font-weight: bold;"&gt;readInBackgroundAndNotify&lt;/span&gt;を実行する．こうすると，何かしらデータを読み込んだら&lt;span style="font-weight: bold;"&gt;readAsync:&lt;/span&gt;を呼んでくれる．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;readAsync:&lt;/span&gt;は，引数からデータを読み込み，処理すれば良い．ただし，&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;readInBackgroundAndNotify&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;でNotification送るのは一度だけ&lt;/span&gt;である．そのため，一度データを読み取ったら改めて&lt;span style="font-weight: bold;"&gt;readInBackgroundAndNotify&lt;/span&gt;を送る必要がある．&lt;br /&gt;&lt;br /&gt;また，読み込んだデータは必ずしも改行で終わっているとは限らない．そのため，&lt;span style="color: rgb(255, 0, 0);"&gt;改行で終わっていなければ，その部分のデータは次のreadAsyncまで保持&lt;/span&gt;する必要がある．その保持を，messageBufferを使って行っている．for..in文で，最後の要素=改行を含まないデータを処理しないようにしているのはそのため．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NSTaskはすごく使いやすいと思ったけど，&lt;span style="color: rgb(51, 51, 255);"&gt;NSFileHandleでは行単位の読み込みがやりづらくてあまり好きにはなれなかった&lt;/span&gt;．NSFileHandleからファイルディスクリプタを取り出して，そこからFILE構造体を作り，fgetsを使うというのも出来るけど，それは最終手段だし．&lt;br /&gt;実は何かNSFileHandleをより使いやすくする何かがあったりするのかな？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6744818344295089636?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6744818344295089636/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6744818344295089636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6744818344295089636'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-5.html' title='AOVCSにGUIをくっつける (5)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8908336698831450450</id><published>2009-09-05T16:27:00.005+09:00</published><updated>2009-09-05T17:29:38.936+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Bundle'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><title type='text'>AOVCSにGUIをくっつける (4)</title><content type='html'>4回目．今回は，&lt;span style="color: rgb(255, 0, 0);"&gt;optimizerやreordererをどうアプリケーションに添付し，どう起動するか&lt;/span&gt;．また，&lt;span style="color: rgb(255, 0, 0);"&gt;dgen.pyで生成したd-scriptをどこに保存する&lt;/span&gt;のが良いか．この二つ．&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;まず前者．どうアプリケーションに添付するかは，既存のアプリケーションを覗いてみると分かる．例えばiCalで使われる画像データは，/Applications/iCal.app/Contents/Resources/内にある．&lt;br /&gt;XcodeはキチンとResourcesディレクトリを用意してくれるので，そこの中に入れてあげれば良い．こんな感じ．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SqIVgDEmBXI/AAAAAAAAAJU/EGCGqLop5nQ/s1600-h/090905-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 208px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SqIVgDEmBXI/AAAAAAAAAJU/EGCGqLop5nQ/s320/090905-0001.png" alt="" id="BLOGGER_PHOTO_ID_5377884545358366066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;こうする事で，ビルド後もキチンとResourcesにoptimizer等々が保存される．&lt;span style="color: rgb(255, 0, 0);"&gt;入れる際には，コピーじゃなくて参照としておく&lt;/span&gt;．そうすると，あとでoptimizerやreordererを再コンパイルしても，このプロジェクトを再コンパイルするだけで済む．もちろん，コンパイル時には参照じゃなくてコピーになるので安心．&lt;span style="color: rgb(51, 51, 255);"&gt;コピーにしてしまうと，optimizerとかを編集したら，あらためてコピーし直す必要がある&lt;/span&gt;．&lt;br /&gt;&lt;br /&gt;で，Resourcesに入れたファイルの利用方法．これは，NSBundleというクラスを使えばそのファイルのパスが取得出来る．例えば次．&lt;br /&gt;&lt;pre name="code" class="c"&gt;[reorderer setLaunchPath: [[NSBundle mainBundle] pathForResource:@"reorderer" ofType:nil]];&lt;/pre&gt;typeは拡張子の事．今回はバイナリで拡張子が無いため，nilを指定．これでOK．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;次．d-scriptをどこに保存するか．今まで通りホームディレクトリというのは悪くないし，そっちの方がd-scriptの状況を把握しやすいというメリットもある．でも，本質的にd-scriptは一時ファイルにすぎないという面もある．&lt;span style="color: rgb(255, 0, 0);"&gt;今回は後者の特徴をふまえて一時ディレクトリに作成する&lt;/span&gt;事にする．で，その使い方．次の通り．&lt;br /&gt;&lt;pre name="code" class="c"&gt;dscriptPath=[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];&lt;/pre&gt;&lt;br /&gt;一時ディレクトリのパスを取得し，その中にユニークな文字列でファイルを作成すれば良い．これだけ．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8908336698831450450?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8908336698831450450/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8908336698831450450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8908336698831450450'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-4.html' title='AOVCSにGUIをくっつける (4)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/SqIVgDEmBXI/AAAAAAAAAJU/EGCGqLop5nQ/s72-c/090905-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-2637209807814323832</id><published>2009-09-05T14:53:00.009+09:00</published><updated>2009-09-05T16:07:32.082+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='posix_spawn'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><title type='text'>AOVCSにGUIをくっつける (3)</title><content type='html'>GUIの実装3回目．今回は，&lt;span style="color: rgb(255, 0, 0);"&gt;Cocoaにおいてforkおよびexec, pipeをどうすればいいか&lt;/span&gt;．Objective-Cなので当然POSIX APIは使えるので，既存のlauncher.c同様fork/exec/pipeを使って行っても良い．しかし，どうせならCocoaのAPIを使おうと思い，そっちで実装することにした．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;調べていくと，NSTask, NSPipeというのがfork, exec, pipeを実現するAPIである事が分かった．リファレンスは次．&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Introduction to Interacting with the Operating System&lt;/span&gt;: &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/OperatingSystem/Concepts/task.html"&gt;http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/OperatingSystem/Concepts/task.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NSTaskで新規プロセスを作り，実行ファイルを起動するという事が出来る．また，NSPipeでpipeと同様の事が出来る，というものだった．これを参照しながら，POSIXでのfork/exec/pipeをCocoaで書き換えてみる．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;POSIX (posix.c):&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;pid_t pid=fork();&lt;br /&gt;if(pid==-1){&lt;br /&gt;perror("Fork failed");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;if(pid==0){&lt;br /&gt;// child process (execute: ls -l | grep -e "\.c$" )&lt;br /&gt;int fd[2];&lt;br /&gt;if(pipe(fd)!=0){&lt;br /&gt;perror("Pipe failed");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;// create grandchild&lt;br /&gt;pid=fork();&lt;br /&gt;if(pid==-1){&lt;br /&gt;perror("Fork failed");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;if(pid==0){&lt;br /&gt;// grandchild process (execute: grep -e "\.c$")&lt;br /&gt;char *args[4];&lt;br /&gt;&lt;br /&gt;args[0]=(char *)"grep";&lt;br /&gt;args[1]=(char *)"-e";&lt;br /&gt;args[2]=(char *)"\\.c$";&lt;br /&gt;args[3]=NULL;&lt;br /&gt;&lt;br /&gt;close(fd[1]);&lt;br /&gt;dup2(fd[0], STDIN_FILENO);&lt;br /&gt;execvp(args[0], args);&lt;br /&gt;}else{&lt;br /&gt;// child process (execute: ls -l)&lt;br /&gt;char *args[3];&lt;br /&gt;&lt;br /&gt;args[0]=(char *)"ls";&lt;br /&gt;args[1]=(char *)"-l";&lt;br /&gt;args[2]=NULL;&lt;br /&gt;&lt;br /&gt;close(fd[0]);&lt;br /&gt;dup2(fd[1], STDOUT_FILENO);&lt;br /&gt;execvp(args[0], args);&lt;br /&gt;}&lt;br /&gt;perror("Some error caused (maybe in exec)");&lt;br /&gt;exit(1);&lt;br /&gt;&lt;br /&gt;}else{&lt;br /&gt;// parent process&lt;br /&gt;int st;&lt;br /&gt;waitpid(pid, &amp;amp;st, 0);&lt;br /&gt;if(!WIFEXITED(st) || WEXITSTATUS(st)!=0){&lt;br /&gt;perror("Child caused some errors");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;return WEXITSTATUS(st);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;シェルで，&lt;span style="font-weight: bold;"&gt;$ ls -l | grep -e "\.c$"&lt;/span&gt; と入力した場合とほぼ同じ事を，Cで実装した．これを，Cocoaを用いた形式に書き換える．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cocoa(cocoa.m):&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;NSTask *lsTask=[[NSTask alloc] init];&lt;br /&gt;NSTask *grepTask=[[NSTask alloc] init];&lt;br /&gt;NSMutableArray *lsArgs=[NSMutableArray array];&lt;br /&gt;NSMutableArray *grepArgs=[NSMutableArray array];&lt;br /&gt;&lt;br /&gt;NSPipe *pipe=[NSPipe pipe];&lt;br /&gt;&lt;br /&gt;// configure ls&lt;br /&gt;[lsArgs addObject: @"-l"];&lt;br /&gt;[lsTask setLaunchPath: @"/bin/ls"];&lt;br /&gt;[lsTask setArguments: lsArgs];&lt;br /&gt;[lsTask setStandardOutput: pipe];&lt;br /&gt;&lt;br /&gt;// configure grep&lt;br /&gt;[grepArgs addObject: @"-e"];&lt;br /&gt;[grepArgs addObject: @"\\.c$"];&lt;br /&gt;[grepTask setLaunchPath: @"/usr/bin/grep"];&lt;br /&gt;[grepTask setArguments: grepArgs];&lt;br /&gt;[grepTask setStandardInput: pipe];&lt;br /&gt;&lt;br /&gt;// launch applications&lt;br /&gt;[lsTask launch];&lt;br /&gt;[grepTask launch];&lt;br /&gt;&lt;br /&gt;// wait applications&lt;br /&gt;[lsTask waitUntilExit];&lt;br /&gt;return [lsTask terminationStatus];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;コンパイル方法は，&lt;span style="font-weight: bold;"&gt;gcc -framework Foundation -fobjc-gc-only cocoa.m&lt;/span&gt;．前回同様ガーベジコレクタ必須．&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;NSTaskインスタンスに情報を全部設定しちゃった状態で，launchメソッドを実行すればいいだけ&lt;/span&gt;なので楽．POSIXの場合も，posix_spawn辺りのシステムコールを使えば，もう少しObjective-Cっぽくなるかもしれないけど．あと，わざわざpipeを閉じたりする必要がなく，またファイルディスクリプタではなくてNSPipeそのものを渡せばいいってのも楽．ただ，PATHの解決はNSTaskではやってくれない．そのため，実行アプリケーションはフルパスで設定してある．多分どっかにPATHを解決するAPIがあるとは思うけど．&lt;br /&gt;また，&lt;span style="color: rgb(51, 51, 255);"&gt;Cocoaの方は実行に失敗した場合のエラー処理をサボっている&lt;/span&gt;．処理する場合は，@tryで例外をハンドリングすればいい．&lt;br /&gt;&lt;br /&gt;一応述べておくと，&lt;span style="color: rgb(51, 51, 255);"&gt;POSIXの場合とCocoaの場合とで，プロセスの親子関係は同じになってない&lt;/span&gt;．POSIXの場合は子，孫だったけど，Cocoaでは二人の子供ってなっているので．実際のシェルは，後者の形で実装していると思うけど．&lt;br /&gt;&lt;br /&gt;また，コンパイル方法を見れば分かる通り，&lt;span style="color: rgb(51, 51, 255);"&gt;実際にはCocoaのフレームワークを使ってない&lt;/span&gt;．まあでも，Cocoa上でforkとかを実行する方法と捉えてもらえば，Cocoaっていうのは間違ってないはず．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-2637209807814323832?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/2637209807814323832/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2637209807814323832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/2637209807814323832'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-3.html' title='AOVCSにGUIをくっつける (3)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-8441246751878588027</id><published>2009-09-04T23:01:00.003+09:00</published><updated>2009-09-04T23:19:59.258+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><title type='text'>Bloggerのデザイン修正</title><content type='html'>前々から思ってたけど，直してなかったBloggerのデザイン．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;コンテンツの幅が固定で，いくらウィンドウが広くてもちっちゃくしか表示されない！&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ソースコードとか折り返しまくりだし，とても読みづらい．なのでテンプレートをいじいじして，今表示されている通りに変更した．コンテンツの&lt;span style="color: rgb(255, 0, 0);"&gt;元幅が480pxに対して，現状が720px．1.5倍！&lt;/span&gt;&lt;br /&gt;残念ながらウィンドウ幅に応じて自動的に，とまでは大変なのでしなかったが，今の環境(1280x800)で読むにはすばらしく快適．&lt;br /&gt;&lt;br /&gt;今回の変更で，解像度が横1000pxくらい無いと見づらいということになっていますが，ご了承ください．Google Analyticsを見る限り，最低でも1024あるので大丈夫だと思いますが．&lt;br /&gt;&lt;br /&gt;また，Firefox以外のブラウザで表示が大丈夫かを確認する，という事もやっていない為，変であればコメントください．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-8441246751878588027?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/8441246751878588027/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/blogger.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8441246751878588027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/8441246751878588027'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/blogger.html' title='Bloggerのデザイン修正'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7218398364446395386</id><published>2009-09-04T21:40:00.005+09:00</published><updated>2009-09-09T01:03:24.006+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='Authorization Service'/><title type='text'>AOVCSにGUIをくっつける (2)</title><content type='html'>GUIの作成その２．今回は，デーモンを起動する上で必須な，&lt;span style="color: rgb(255, 0, 0);"&gt;Cocoa上のsudoっぽいものの利用方法&lt;/span&gt;を調べる．インストーラを使うときに出る，「***に認証を許可するには，パスワードを入力してください」なアレ．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cocoa root権限辺りでググると，どうやらAuthorization Serviceというのを使えばいい事が分かった． (こことか &lt;a href="http://www.aynimac.com/p_blog/category.php?k=Cocoa"&gt;http://www.aynimac.com/p_blog/category.php?k=Cocoa&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Authorization Serviceのリファレンスは，Xcodeのドキュメントからすぐ見つかる．Webでは次．&lt;br /&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/03authtasks/authtasks.html"&gt;http://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/03authtasks/authtasks.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ここを参照しながらコーディングをすると，キチンと認証ボックスが表示され，正しくパスワードを入力する事でdtraceをroot権限で実行出来た．そのコードが次．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;aovcs-daemon/launcher.m：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;// launch dtrace with root privilege&lt;br /&gt;- (NSFileHandle *) runDtrace:(pid_t)pid&lt;br /&gt;{&lt;br /&gt; OSStatus myStatus;&lt;br /&gt; AuthorizationFlags myFlags=kAuthorizationFlagDefaults;&lt;br /&gt; AuthorizationRef myAuthorizationRef;&lt;br /&gt;&lt;br /&gt; myStatus=AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &amp;amp;myAuthorizationRef);&lt;br /&gt; if(myStatus!=errAuthorizationSuccess) return nil;&lt;br /&gt;&lt;br /&gt; do{&lt;br /&gt;     {&lt;br /&gt;         AuthorizationItem myItems={kAuthorizationRightExecute, 0, NULL, 0};&lt;br /&gt;         AuthorizationRights myRights={1, &amp;amp;myItems};&lt;br /&gt;         myFlags=kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;&lt;br /&gt;    myStatus=AuthorizationCopyRights(myAuthorizationRef, &amp;amp;myRights, NULL, myFlags, NULL);&lt;br /&gt;     }&lt;br /&gt;     if(myStatus!=errAuthorizationSuccess) break;&lt;br /&gt;  &lt;br /&gt;     {&lt;br /&gt;         char *toolPath="/usr/sbin/dtrace";&lt;br /&gt;         char *arguments[5];&lt;br /&gt;         FILE *pipe=NULL;&lt;br /&gt;      &lt;br /&gt;         arguments[0]="-C";&lt;br /&gt;         arguments[1]="-s";&lt;br /&gt;         arguments[2]=(char *)[dscriptPath UTF8String];&lt;br /&gt;         arguments[3]=(char *)[[NSString stringWithFormat:@"%d", pid] UTF8String];&lt;br /&gt;         arguments[4]=NULL;&lt;br /&gt;         NSLog(@"%s", [dscriptPath UTF8String]);&lt;br /&gt;      &lt;br /&gt;         myFlags=kAuthorizationFlagDefaults;&lt;br /&gt;         myStatus=AuthorizationExecuteWithPrivileges(myAuthorizationRef, toolPath, myFlags, arguments, &amp;amp;pipe);&lt;br /&gt;         if(myStatus==errAuthorizationSuccess){&lt;br /&gt;          NSLog(@"launch success");&lt;br /&gt;             AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults); &lt;br /&gt;             return [[NSFileHandle alloc] initWithFileDescriptor:fileno(pipe)];&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }while(0);&lt;br /&gt;&lt;br /&gt; AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults); &lt;br /&gt; return nil;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;認証に成功した場合はdtraceの標準出力ハンドラ(NSFileHandle)を返し，失敗した場合はnilを返す．ただし，正直&lt;span style="color: rgb(51, 51, 255);"&gt;サンプルコードをそのまま引っ張ってきただけで，詳しいとこは理解してない&lt;/span&gt;ので，細かい部分は上で示したリファレンスを参照してください．また，&lt;span style="color: rgb(255, 0, 0);"&gt;ガーベジコレクタ必須(-fobjc-gc-only)&lt;/span&gt;でコーディングしているので，そちらも注意．dtraceが使えるのが10.5以降で，それだとガーベジコレクタが存在しているから問題は無いはず．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;実行自体はこれで問題なく出来る．他の問題は，先ほど示したAuthorization Serviceを見つけたブログでも言及されていた内容．Authorization Service Programming Guide (P.33)に書いてある内容．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Important:&lt;/strong&gt; Because of the security risk, calling the AuthorizationExecuteWithPrivileges function is recommended only for special and infrequent use such as repairing setuid bits and installing your application. In the most secure computer systems, the right this function requests times out immediately so every time you call it, the user must authenticate.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Important:&lt;/strong&gt; You may be tempted to use the function AuthorizationExecuteWithPrivileges to perform privileged operations rather than creating and calling your own setuid tool. Although this might seem like an easy solution, using the AuthorizationExecuteWithPrivileges function without the rest of the Authorization Services functions produces a severe security hole because the function indiscriminately runs any tool as the root user. Setuid tools also have security risks, but they are far less severe than using the function AuthorizationExecuteWithPrivileges for purposes other than those described in this document. Read &lt;span class="content_text"&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/02authconcepts/authconcepts.html#//apple_ref/doc/uid/TP30000995-CH205-TPXREF22"&gt;“Factored Applications”&lt;/a&gt;&lt;/span&gt; for instructions on creating your own helper tool.&lt;/li&gt;&lt;/ul&gt;この二つの文章．すごく大雑把に日本語にすると&lt;span style="color: rgb(255, 0, 0);"&gt;「セキュリティの危険があるから，setuidを行うツール(ヘルパーツール)とインストーラ以外はAuthorizationExecuteWithPrivilegesで直接実行するのは推奨しない」&lt;/span&gt;というもの．ヘルパーツールが何なのかもこのリファレンス内に記述されているけれども，さらっと読んだだけではキチンと理解出来なかった．&lt;br /&gt;&lt;br /&gt;ただここで述べているのは，&lt;span style="color: rgb(51, 51, 255);"&gt;自分が作ったアプリケーションを直接root権限で実行すると，そこにセキュリティホールがあった場合大変．そのため，そのリスクを少しでも減らす為にヘルパーツールを使いましょう&lt;/span&gt;，というもの．&lt;br /&gt;今回実行するのはdtraceという予め用意されているアプリケーション．そこのセキュリティホールは知らないし，関与出来るものではない．むしろ&lt;span style="color: rgb(255, 0, 0);"&gt;間にヘルパーツールとかを噛ませる方が，セキュリティリスクは広がるはず&lt;/span&gt;である．なのでここでは，直接dtraceを実行しても問題ない，と判断する．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;もしこの利用法に問題がありましたら，ぜひともご指摘ください．これはあくまでも自分の解釈ですので．&lt;br /&gt;&lt;br /&gt;(2009/9/9追記　やっぱ使うのは怪しいみたい．調査中)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7218398364446395386?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7218398364446395386/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7218398364446395386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7218398364446395386'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui-2.html' title='AOVCSにGUIをくっつける (2)'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7888492072652214951</id><published>2009-09-04T18:19:00.005+09:00</published><updated>2009-09-04T23:00:26.132+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>AOVCSにGUIをくっつける</title><content type='html'>現状AOVSCのデーモンは，./launcherと実行すれば起動する．しかし，ログインの度にこれを実行するのは面倒であるし，このためにターミナルをひとつ立ち上げておくのも抵抗がある．&lt;br /&gt;&lt;br /&gt;そこで，Macのアプリケーションとしてまとめてしまう事を考える．こうすることで，Dockから&lt;span style="color: rgb(255, 0, 0);"&gt;「ログイン時に開く」を選択し，自動的に起動するようにも出来る&lt;/span&gt;．邪魔であれば，Cmd-Hで隠してしまえば良い．これはターミナルでも同じだけど．&lt;br /&gt;&lt;br /&gt;色々考えれば考える程GUIをくっつけるのがいー感じに聞こえてくるので，実装することにした．アイディアとしては，&lt;span style="color: rgb(255, 0, 0);"&gt;現状シェル上で動かしているlauncher (dtrace, reorderer, optimizerを起動)の代わりをObjective-Cで実装する&lt;/span&gt;だけ．それほど大変ではない．はず．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まずはGUIのデザイン．必要な機能はそれほど多くない．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;daemonの起動，終了&lt;/li&gt;&lt;li&gt;daemonの実行状態&lt;/li&gt;&lt;li&gt;daemonのログ表示&lt;/li&gt;&lt;/ul&gt;最低限はこれだけ．この他に，アプリケーション起動時に自動的にdaemonを実行する (ユーザの起動ボタンクリックを待たない)という事もオプションとしてあればいいが，それはまた後に．&lt;br /&gt;&lt;br /&gt;ということでInterface Builderでデザインを考えた．その結果が次．当然色々悩んだ末の，最終(?)案．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SqD5Np3Jp0I/AAAAAAAAAJE/I90jnJuOUe0/s1600-h/090904-0001.png"&gt;&lt;img style="cursor: pointer; width: 265px; height: 320px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SqD5Np3Jp0I/AAAAAAAAAJE/I90jnJuOUe0/s320/090904-0001.png" alt="" id="BLOGGER_PHOTO_ID_5377571968051160898" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SqD5OPiVX4I/AAAAAAAAAJM/WSn3ontygIQ/s1600-h/090904-0002.png"&gt;&lt;img style="cursor: pointer; width: 265px; height: 320px;" src="http://4.bp.blogspot.com/_FhxNSpAa3Kg/SqD5OPiVX4I/AAAAAAAAAJM/WSn3ontygIQ/s320/090904-0002.png" alt="" id="BLOGGER_PHOTO_ID_5377571978164395906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;左がデーモン起動前で，右がデーモン起動後．操作はLaunch/Stopボタンしか無し．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さて，これを実装していこう．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7888492072652214951?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7888492072652214951/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7888492072652214951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7888492072652214951'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/aovcsgui.html' title='AOVCSにGUIをくっつける'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FhxNSpAa3Kg/SqD5Np3Jp0I/AAAAAAAAAJE/I90jnJuOUe0/s72-c/090904-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-5406052722689855604</id><published>2009-09-02T16:33:00.003+09:00</published><updated>2009-09-02T17:03:22.117+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='d-script'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>d-scriptの修正 - 例外アプリの指定，LeopardとSnow Leopard間の調整</title><content type='html'>現状，トレースを取得しないアプリケーション名を指定するには，d-scriptを直接修正するしか方法が無い．しかし，&lt;span style="color: rgb(255, 0, 0);"&gt;ユーザに直接d-scriptを修正してもらうのは危険性が非常に高い&lt;/span&gt;．そのため，configurationファイルを読み込み，d-scriptを吐き出すというスクリプトを作成する事とした．&lt;br /&gt;&lt;br /&gt;やる事は非常に少ない．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;configurationファイルからトレースを取得しないアプリを取り出す&lt;/li&gt;&lt;li&gt;取得しないアプリを指定するd-scriptのコードを作成&lt;/li&gt;&lt;li&gt;もととなるd-scriptのテンプレートに上のコードをくっつけ，ちゃんとしたd-scriptを吐き出す&lt;/li&gt;&lt;/ul&gt;これだけ．また，取得しないアプリを指定するには，次の形式でd-scriptを書いてあげれば良い事になっている．&lt;br /&gt;&lt;pre name="code" class="c"&gt;ignoreExecs["iTunes"]=ignoreExecs["Evernote"]=ignoreExecs["mds"]=ignoreExecs["Mail"]=ignoreExecs["backupd"]=1;&lt;br /&gt;&lt;/pre&gt;テンプレートからこれを書き込む場所を検出し，そこに読み込んだ例外アプリ一覧を上記の形式で書き出すだけ．特にこった事をする必要も無いと思い，書き込む場所検出は&lt;span style="color: rgb(255, 0, 0);"&gt;"IGNORE_CONFIGURATIONS();"という文字列マッチを使う&lt;/span&gt;だけにした．&lt;br /&gt;&lt;br /&gt;configuration読み込みも大したコードではないので，テンプレートからd-scriptを生成するスクリプト(by Python)へのリンクだけ張っとこう．&lt;br /&gt;&lt;a href="http://bazaar.launchpad.net/%7Ehitoshi-s/aovcs-bazaar/main/annotate/head%3A/dtrace/dgen.py"&gt;http://bazaar.launchpad.net/~hitoshi-s/aovcs-bazaar/main/annotate/head%3A/dtrace/dgen.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;もうひとつ．Snow Leopardへの移行時に，引数リストを読み込んでも大丈夫そうかの判定方法を修正した．しかしこのままでは，&lt;span style="color: rgb(255, 0, 0);"&gt;Leopardユーザがこのアプリケーションを使えない&lt;/span&gt;ことになる．なので，&lt;span style="color: rgb(255, 0, 0);"&gt;LeopardかSnow Leopardかどうかで読み込んで大丈夫かの判定方法を変える&lt;/span&gt;，という事を考える．&lt;br /&gt;&lt;br /&gt;当初は，上で作ったスクリプトでSnow LeopardかLeopardかを判定させ，それに応じて出力を変えるという事を考えた．しかし，PythonからSnow LeopardかLeopardかを判定する方法がすぐには見つからず，挫折．そこで，&lt;span style="color: rgb(255, 0, 0);"&gt;cppを用いて判定させる&lt;/span&gt;事とした．その方法は次の通り．&lt;br /&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;_types.h&amp;gt;&lt;br /&gt;(略)&lt;br /&gt;#if defined(__DARWIN_10_6_AND_LATER)&lt;br /&gt;  // for Snow Leopard&lt;br /&gt;  this-&amp;gt;isClean=SELECT_64_86((curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint64_t)+sizeof(uint64_t))), (curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint32_t)+sizeof(uint32_t))));&lt;br /&gt;#else&lt;br /&gt;  // for Leopard&lt;br /&gt;  this-&amp;gt;isClean=SELECT_64_86(uregs[R_SP]==0x1f00000000LL || uregs[R_SP]==0x1f0000001fLL, (curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint32_t)+sizeof(uint32_t))));&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Leopardで検証出来てないけど，多分これで大丈夫なはず．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-5406052722689855604?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/5406052722689855604/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/d-script-leopardsnow-leopard.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5406052722689855604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/5406052722689855604'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/09/d-script-leopardsnow-leopard.html' title='d-scriptの修正 - 例外アプリの指定，LeopardとSnow Leopard間の調整'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6684623075664947033</id><published>2009-08-30T18:38:00.011+09:00</published><updated>2009-08-31T00:29:55.311+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='platex'/><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='binutils'/><category scheme='http://www.blogger.com/atom/ns#' term='ptex'/><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='coreutils'/><title type='text'>MacPortsのメモ coreutils, binutils, ptex</title><content type='html'>Snow Leopardになったので，portの入れ直しをやる．入れ直さなくても，i386のアプリは動くので問題ない気がする．しかし，&lt;span style="color: rgb(255, 0, 0);"&gt;portで入れた32bitのライブラリを用いる64bitのアプリケーションが動くとは思わない&lt;/span&gt;．なので，どうせならと全部入れ直す事に．&lt;br /&gt;&lt;br /&gt;MacPortsはそのままでは動作しないので，次のサイトに書いてある通りにやって再インストール．&lt;br /&gt;&lt;a href="http://forums.macrumors.com/showthread.php?t=720035"&gt;http://forums.macrumors.com/showthread.php?t=720035&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;   1. Open up the Terminal&lt;br /&gt;   2. svn co http://svn.macports.org/repository/macports/trunk/base/&lt;br /&gt;   3. Wait for it to finish checking out files&lt;br /&gt;   4. cd base&lt;br /&gt;   5. ./configure&lt;br /&gt;   6. make&lt;br /&gt;   7. sudo make install&lt;br /&gt;   8. sudo /opt/local/bin/port -v selfupdate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;portで入れているアプリケーションで再インスコしたいのは次のもの．結構少ない．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;coreutils (lsだけはGNU lsを使いたいので)&lt;/li&gt;&lt;li&gt;binutils (使い慣れたobjdumpを使いたいので)&lt;/li&gt;&lt;li&gt;bash-completion (コマンドライン補完)&lt;/li&gt;&lt;li&gt;ptex (修論)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;ということで，これらをインストールする．本文が長いので先に結果を示しておくと，&lt;span style="color: rgb(255, 0, 0);"&gt;binutils以外はインストール出来た&lt;/span&gt;．binutilsは敗北．コマンドは次の通り．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install coreutils +universal&lt;br /&gt; $ sudo port install bash-completion +universal&lt;br /&gt; $ sudo port install ptex +utf8 +no_x11&lt;/pre&gt;ptexはFATバイナリには出来なかった．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，長い本文の始まり．まずは，&lt;a href="http://twitter.com/wtakuo"&gt;@wtakuo &lt;/a&gt;に教えて頂いたSnow LeopardでMacPortsを使う際のアドバイスを示しておく．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;デフォルトは，64bit&lt;/span&gt;オンリーでのコンパイル&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;variantsで+universalを付けておく事(port install *** +universal)で，32bitと64bitのFATバイナリ&lt;/span&gt;になる&lt;/li&gt;&lt;li&gt;64bitが上手くコンパイル出来ない場合は，build_arch=i386として(port install *** build_arch=i386)32bitに指定すると大丈夫な事がある&lt;/li&gt;&lt;li&gt;ジョブ数(make -j2とか)によってコンパイルがミスる場合は，buildmakejobs=1と指定する(port install *** buildmakejobs=1)と良い&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;これらを参考にして，&lt;span style="color: rgb(255, 0, 0);"&gt;基本的にはFATバイナリを作成する&lt;/span&gt;という事にした．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まず，&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;今まで入れてたportの削除&lt;/span&gt;．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port -f uninstall installed&lt;/pre&gt;&lt;br /&gt;これで，インストールされたもの全削除になる．-fを付けないと，依存関係が解決出来なくて削除出来ない，と言われてしまうので付ける．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次．&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;coreutilsのインストール&lt;/span&gt;．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install coreutils +universal&lt;/pre&gt;特に問題なくインストール出来る．fileコマンドでFATバイナリである事を確認．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ file `which gls`&lt;br /&gt;/opt/local/bin/gls: Mach-O universal binary with 2 architectures&lt;br /&gt;/opt/local/bin/gls (for architecture x86_64): Mach-O 64-bit executable x86_64&lt;br /&gt;/opt/local/bin/gls (for architecture i386): Mach-O executable i386&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;次．&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;binutilsのインストール&lt;/span&gt;．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install binutils +universal&lt;/pre&gt;&lt;br /&gt;しかし，次の通りにWarningが出てコンパイルできず．&lt;br /&gt;&lt;pre class="prettyprint"&gt; ---&amp;gt;  Building binutils&lt;br /&gt;Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_binutils/work/binutils-2.19" &amp;amp;&amp;amp; /Developer/usr/bin/make -j1 all " returned error 2&lt;br /&gt;Command output: libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c corefile.c -o corefile.o&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c -o format.lo format.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c format.c -o format.o&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c -o init.lo init.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c init.c -o init.o&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c -o libbfd.lo libbfd.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././bfd -I. -I. -I.././bfd -I.././bfd/../include -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -arch i386 -c libbfd.c -o libbfd.o&lt;br /&gt;cc1: warnings being treated as errors&lt;br /&gt;libbfd.c: In function 'bfd_getb_signed_64':&lt;br /&gt;libbfd.c:708: warning: left shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:708: warning: left shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c: In function 'bfd_getl_signed_64':&lt;br /&gt;libbfd.c:731: warning: left shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:731: warning: left shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c: In function 'bfd_putb64':&lt;br /&gt;libbfd.c:763: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:764: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:765: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:766: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c: In function 'bfd_putl64':&lt;br /&gt;libbfd.c:781: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:782: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:783: warning: right shift count &amp;gt;= width of type&lt;br /&gt;libbfd.c:784: warning: right shift count &amp;gt;= width of type&lt;br /&gt;lipo: can't figure out the architecture type of: /var/tmp//ccLOcEia.out&lt;br /&gt;make[4]: *** [libbfd.lo] Error 1&lt;br /&gt;make[3]: *** [all-recursive] Error 1&lt;br /&gt;make[2]: *** [all] Error 2&lt;br /&gt;make[1]: *** [all-bfd] Error 2&lt;br /&gt;make: *** [all] Error 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;64bitになってsizeof演算子か何かの値が変わって，シフト演算がオーバーフローするようになったのか？まぁでもソースコードを直す訳にもいかない．なので別手段に．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install binutils build_arch=i386&lt;br /&gt;---&amp;gt;  Computing dependencies for binutils&lt;br /&gt;---&amp;gt;  Fetching binutils&lt;br /&gt;---&amp;gt;  Verifying checksum(s) for binutils&lt;br /&gt;---&amp;gt;  Extracting binutils&lt;br /&gt;---&amp;gt;  Configuring binutils&lt;br /&gt;---&amp;gt;  Building binutils&lt;br /&gt;Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_binutils/work/binutils-2.19" &amp;amp;&amp;amp; /Developer/usr/bin/make -j1 all " returned error 2&lt;br /&gt;Command output: make[4]: Nothing to be done for `all'.&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c -o dis-buf.lo dis-buf.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c dis-buf.c -o dis-buf.o&lt;br /&gt;/bin/sh ./libtool --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c  -DARCH_i386 -DARCH_powerpc -DARCH_rs6000 .././opcodes/disassemble.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c -DARCH_i386 -DARCH_powerpc -DARCH_rs6000 .././opcodes/disassemble.c -o disassemble.o&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c -o dis-init.lo dis-init.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c dis-init.c -o dis-init.o&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=compile /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd  -I./../intl  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c -o i386-dis.lo i386-dis.c&lt;br /&gt;libtool: compile:  /usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././opcodes -I. -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I./../intl -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch i386 -c i386-dis.c -o i386-dis.o&lt;br /&gt;cc1: warnings being treated as errors&lt;br /&gt;i386-dis.c: In function 'print_i386_disassembler_options':&lt;br /&gt;i386-dis.c:9776: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9780: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9781: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9782: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9783: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9784: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9785: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9787: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9789: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9790: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9791: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9792: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9793: warning: format not a string literal and no format arguments&lt;br /&gt;i386-dis.c:9794: warning: format not a string literal and no format arguments&lt;br /&gt;make[4]: *** [i386-dis.lo] Error 1&lt;br /&gt;make[3]: *** [all-recursive] Error 1&lt;br /&gt;make[2]: *** [all] Error 2&lt;br /&gt;make[1]: *** [all-opcodes] Error 2&lt;br /&gt;make: *** [all] Error 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;が，駄目．x64の方をターゲット(build_arch=i386を消す)にすると，今度は次のエラー．&lt;br /&gt;&lt;pre class="prettyprint"&gt;Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_binutils/work/binutils-2.19" &amp;amp;&amp;amp; /Developer/usr/bin/make -j1 all " returned error 2&lt;br /&gt;Command output: libtool: link: /usr/bin/gcc-4.2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -o objdump objdump.o dwarf.o prdbg.o rddbg.o debug.o stabs.o ieee.o rdcoff.o bucomm.o version.o filemode.o  -L/opt/local/lib ../opcodes/.libs/libopcodes.a ../bfd/.libs/libbfd.a ../libiberty/libiberty.a /opt/local/lib/libintl.dylib /opt/local/lib/libiconv.dylib -lc -lz&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c arparse.c -Wno-error&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c arlex.c -Wno-error&lt;br /&gt;arlex.c:1841: warning: no previous prototype for 'yyget_in'&lt;br /&gt;arlex.c:1849: warning: no previous prototype for 'yyget_out'&lt;br /&gt;arlex.c:1857: warning: no previous prototype for 'yyget_leng'&lt;br /&gt;arlex.c:1866: warning: no previous prototype for 'yyget_text'&lt;br /&gt;arlex.c:1877: warning: no previous prototype for 'yyset_in'&lt;br /&gt;arlex.c:1882: warning: no previous prototype for 'yyset_out'&lt;br /&gt;arlex.c:1887: warning: no previous prototype for 'yyget_debug'&lt;br /&gt;arlex.c:1892: warning: no previous prototype for 'yyset_debug'&lt;br /&gt;arlex.c:1898: warning: no previous prototype for 'yylex_destroy'&lt;br /&gt;arlex.c:1349: warning: 'yyunput' defined but not used&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c ar.c&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c not-ranlib.c&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c arsup.c&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c rename.c&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c binemul.c&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c emul_vanilla.c&lt;br /&gt;/bin/sh ./libtool --tag=CC --mode=link /usr/bin/gcc-4.2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64  -L/opt/local/lib -o ar  arparse.o arlex.o ar.o not-ranlib.o arsup.o rename.o binemul.o emul_vanilla.o bucomm.o version.o filemode.o ../bfd/libbfd.la ../libiberty/libiberty.a -lfl -lintl -liconv -lc  -lz&lt;br /&gt;libtool: link: /usr/bin/gcc-4.2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -o ar arparse.o arlex.o ar.o not-ranlib.o arsup.o rename.o binemul.o emul_vanilla.o bucomm.o version.o filemode.o  -L/opt/local/lib ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -lfl /opt/local/lib/libintl.dylib /opt/local/lib/libiconv.dylib -lc -lz&lt;br /&gt;/usr/bin/gcc-4.2 -DHAVE_CONFIG_H -I. -I.././binutils -I. -I. -I.././binutils -I../bfd -I.././binutils/../bfd -I.././binutils/../include -DLOCALEDIR="\"/opt/local/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -I/opt/local/include -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -O2 -arch x86_64 -c strings.c&lt;br /&gt;cc1: warnings being treated as errors&lt;br /&gt;strings.c: In function 'strings_file':&lt;br /&gt;strings.c:407: warning: 'stat64' is deprecated (declared at /usr/include/sys/stat.h:465)&lt;br /&gt;make[4]: *** [strings.o] Error 1&lt;br /&gt;make[3]: *** [all-recursive] Error 1&lt;br /&gt;make[2]: *** [all] Error 2&lt;br /&gt;make[1]: *** [all-binutils] Error 2&lt;br /&gt;make: *** [all] Error 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;うーん，無理．&lt;span style="color: rgb(51, 51, 255);"&gt;binutilsはあきらめる&lt;/span&gt;か．objdumpじゃなくて，otoolに慣れるようにしよう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次．&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;bash-completion&lt;/span&gt;．どうせシェルスクリプトか何かだろうけど，まあ一応+universalを付けてインストールしておこう．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install bash-completion +universal&lt;br /&gt;To use bash_completion, add the following lines at the end of your .bash_profile:&lt;br /&gt;&lt;br /&gt;if [ -f /opt/local/etc/bash_completion ]; then&lt;br /&gt;. /opt/local/etc/bash_completion&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;すぐ完了．bash_profileとかへの設定は，元々やってあったので不要．そして一応fileコマンドで確認すると，まあ当然シェルスクリプトファイルだった．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後．&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;ptexのインストール&lt;/span&gt;．これがインストール成功しないと卒業出来ないので超重要．まず次の通りに実行してみた．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install ptex +utf8 +universal +no_x11&lt;/pre&gt;texを入れる為だけにX関係のライブラリを入れるとホントに時間がかかって仕方なくなるので，&lt;span style="color: rgb(255, 0, 0);"&gt;no_x11ってオプションを試しに付けてみた&lt;/span&gt;．もし何か問題があったら，このオプションを外して再コンパイル．&lt;br /&gt;で，やっていくと，次のエラーが出た．&lt;br /&gt;&lt;pre class="prettyprint"&gt;---&amp;gt;  Configuring fontconfig for architecture x86_64&lt;br /&gt;---&amp;gt;  Configuring fontconfig for architecture i386&lt;br /&gt;Error: Target org.macports.configure returned: configure failure: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_fontconfig/work/fontconfig-2.7.1-i386" &amp;amp;&amp;amp; ./configure --prefix=/opt/local --disable-dependency-tracking --disable-dependency-tracking --with-docdir=/opt/local/share/doc/fontconfig-2.7.1 --disable-dependency-tracking --with-add-fonts=/usr/X11R6/lib/X11/fonts,/Library/Fonts,/Network/Library/Fonts,/System/Library/Fonts,/opt/local/share/fonts  " returned error 1&lt;br /&gt;Command output: checking for rand... yes&lt;br /&gt;checking for random... yes&lt;br /&gt;checking for lrand48... yes&lt;br /&gt;checking for a usable iconv... no&lt;br /&gt;checking for freetype-config... /opt/local/bin/freetype-config&lt;br /&gt;checking for FT_Get_Next_Char... yes&lt;br /&gt;checking for FT_Get_BDF_Property... yes&lt;br /&gt;checking for FT_Get_PS_Font_Info... yes&lt;br /&gt;checking for FT_Has_PS_Glyph_Names... yes&lt;br /&gt;checking for FT_Get_X11_Font_Format... yes&lt;br /&gt;checking for FT_Select_Size... yes&lt;br /&gt;checking for FT_Bitmap_Size.y_ppem... yes&lt;br /&gt;checking expat.h usability... yes&lt;br /&gt;checking expat.h presence... yes&lt;br /&gt;checking for expat.h... yes&lt;br /&gt;checking for XML_SetDoctypeDeclHandler... no&lt;br /&gt;configure: WARNING: Cannot find usable expat library. Trying to use libxml2 as fallback.&lt;br /&gt;checking for pkg-config... /opt/local/bin/pkg-config&lt;br /&gt;checking pkg-config is at least version 0.9.0... yes&lt;br /&gt;checking for LIBXML2... configure: error: Package requirements (libxml-2.0 &amp;gt;= 2.6) were not met:&lt;br /&gt;&lt;br /&gt;Libs.private field occurs twice in '/opt/local/lib/pkgconfig/libxml-2.0.pc'&lt;br /&gt;&lt;br /&gt;Consider adjusting the PKG_CONFIG_PATH environment variable if you&lt;br /&gt;installed software in a non-standard prefix.&lt;br /&gt;&lt;br /&gt;Alternatively, you may set the environment variables LIBXML2_CFLAGS&lt;br /&gt;and LIBXML2_LIBS to avoid the need to call pkg-config.&lt;br /&gt;See the pkg-config man page for more details.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(※ただしこの前に，pkgconfigが無いって言うエラーが出ていたので，port install pkgconfigを行っている．その出力は残ってないので書けず)&lt;br /&gt;&lt;br /&gt;libxml2のバージョンが古いとのことらしい．なのでportからlibxml2を入れる．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install libxml2 +universal&lt;/pre&gt;これでlibxml2自体のインストールは成功する．しかしこれでもptexのコンパイル時には相変わらず上記のエラーが出る．仕方ないので妥協．さっきのログを見る限り，&lt;span style="color: rgb(255, 0, 0);"&gt;32bitのconfigureに失敗しているだけで，64bitの方は成功している&lt;/span&gt;．そのため，FATバイナリはあきらめて64bitだけにしてみた．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ sudo port install ptex +utf8 +no_x11&lt;/pre&gt;こうすると，無事，インストール出来た．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ file `which ptex`&lt;br /&gt;/opt/local/bin/ptex: Mach-O 64-bit executable x86_64&lt;/pre&gt;ちゃんと出来てよかった．実際ptexを走らせると，次の感じ．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ platex report9.tex&lt;br /&gt;This is pTeX, Version 3.141592-p3.1.10 (utf8.euc) (Web2C 7.5.4)&lt;br /&gt;(./report9.tex&lt;br /&gt;pLaTeX2e &amp;lt;2006/11/10&amp;gt;+0 (based on LaTeX2e &amp;lt;2003/12/01&amp;gt; patch level 0)&lt;br /&gt;(/opt/local/share/texmf/ptex/platex/base/jarticle.cls&lt;br /&gt;Document Class: jarticle 2006/06/27 v1.6 Standard pLaTeX class&lt;br /&gt;(/opt/local/share/texmf/ptex/platex/base/jsize10.clo))&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/graphicx.sty&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/keyval.sty)&lt;br /&gt;(/opt/local/share/texmf/tex/latex/graphics/dvipdfmx-contrib-latex/graphics.sty&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/trig.sty)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/graphics.cfg)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/dvipdfm/dvipdfm.def)))&lt;br /&gt;(/opt/local/share/texmf/tex/latex/graphics/dvipdfmx-contrib-latex/color.sty&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/color.cfg)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/graphics/dvipsnam.def))&lt;br /&gt;(/opt/local/share/texmf/ptex/latex/url/url.sty) (../style/footmisc.sty&lt;br /&gt;&lt;br /&gt;LaTeX Warning: You have requested package `../style/footmisc',&lt;br /&gt;       but the package provides `footmisc'.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LaTeX Warning: Command \@footnotetext  has changed.&lt;br /&gt;       Check if current package is valid.&lt;br /&gt;&lt;br /&gt;) (../style/footStyle.sty) (../style/picins.sty&lt;br /&gt;Option `picins' Version 3.0 Sep. 1992, TH Darmstadt/HRZ)&lt;br /&gt;(/opt/local/share/texmf/ptex/platex/base/ascmac.sty&lt;br /&gt;(/opt/local/share/texmf/ptex/platex/base/tascmac.sty))&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/tools/bm.sty)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsmath/amsmath.sty&lt;br /&gt;For additional information on amsmath, use the `?' option.&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsmath/amstext.sty&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsmath/amsgen.sty))&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsmath/amsbsy.sty)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsmath/amsopn.sty))&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsfonts/amssymb.sty&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty)) (./report9.aux)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsfonts/umsa.fd)&lt;br /&gt;(/opt/local/share/texmf-dist/tex/latex/amsfonts/umsb.fd)&lt;br /&gt;&amp;lt;/Users/hitoshi-s/Library/BitMemo/capture/2008-06-19_16.45.40.png&amp;gt;&lt;br /&gt;&lt;br /&gt;LaTeX Warning: \oval, \circle, or \line size unavailable on input line 64.&lt;br /&gt;&lt;br /&gt;&amp;lt;/Users/hitoshi-s/Library/BitMemo/capture/2008-06-19_16.47.08.png&amp;gt;&lt;br /&gt;&lt;br /&gt;LaTeX Warning: \oval, \circle, or \line size unavailable on input line 71.&lt;br /&gt;&lt;br /&gt;&amp;lt;/Users/hitoshi-s/Library/BitMemo/capture/2008-06-19_16.48.08.png&amp;gt;&lt;br /&gt;&lt;br /&gt;LaTeX Warning: \oval, \circle, or \line size unavailable on input line 78.&lt;br /&gt;&lt;br /&gt;&amp;lt;/Users/hitoshi-s/Library/BitMemo/capture/2008-06-19_16.48.52.png&amp;gt;&lt;br /&gt;&lt;br /&gt;LaTeX Warning: \oval, \circle, or \line size unavailable on input line 86.&lt;br /&gt;&lt;br /&gt;[1] [2] [3] (./report9.aux) )&lt;br /&gt;Output written on report9.dvi (3 pages, 4740 bytes).&lt;br /&gt;Transcript written on report9.log.&lt;br /&gt;&lt;/pre&gt;ovalenv辺りで何かWarning食らってるっぽい．けど出力は出来た．で，&lt;span style="color: rgb(51, 51, 255);"&gt;Mxdviで開こうとしたら，Rosettaをインストールしますか？って言われてストップ&lt;/span&gt;．MxdviはPower PCバイナリだったのか！しかも今作者サイトつながらないし．今度にする事に．&lt;br /&gt;&lt;br /&gt;で，pdfの作成．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ dvipdfmx report9.dvi&lt;br /&gt;report9.dvi -&amp;gt; report9.pdf&lt;br /&gt;[1][2&lt;br /&gt;** WARNING ** Invalid ICC profile: Inconsistent checksum.&lt;br /&gt;&lt;br /&gt;pdf_color&amp;gt;&amp;gt; ICC Profile Info&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Size: 4380 bytes&lt;br /&gt;pdf_color&amp;gt;&amp;gt; CMM Type: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Version: 2.0.0&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Class: mntr&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Color Space: RGB&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Connection Space: XYZ&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creation Date: 2008:03:10:03:06:58&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Primary Platform: APPL&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Flags: 00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Mnfct: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Model: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Attr: 00:00:00:00:00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Rendering Intent: Perceptual&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creator: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Illuminant (XYZ): 0.964 1.000 0.825&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Checksum: 4f:00:ed:04:36:f6:95:15:52:44:e2:a2:ef:c1:af:f9&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Calculated: 88:de:7b:81:28:7b:77:7a:7d:12:c4:09:e8:9a:da:07&lt;br /&gt;&lt;br /&gt;** WARNING ** Invalid ICC profile: Inconsistent checksum.&lt;br /&gt;&lt;br /&gt;pdf_color&amp;gt;&amp;gt; ICC Profile Info&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Size: 4380 bytes&lt;br /&gt;pdf_color&amp;gt;&amp;gt; CMM Type: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Version: 2.0.0&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Class: mntr&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Color Space: RGB&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Connection Space: XYZ&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creation Date: 2008:03:10:03:06:58&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Primary Platform: APPL&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Flags: 00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Mnfct: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Model: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Attr: 00:00:00:00:00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Rendering Intent: Perceptual&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creator: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Illuminant (XYZ): 0.964 1.000 0.825&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Checksum: 4f:00:ed:04:36:f6:95:15:52:44:e2:a2:ef:c1:af:f9&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Calculated: b7:5e:70:78:94:28:79:8e:60:cc:6e:58:99:c8:fa:f9&lt;br /&gt;][3&lt;br /&gt;** WARNING ** Invalid ICC profile: Inconsistent checksum.&lt;br /&gt;&lt;br /&gt;pdf_color&amp;gt;&amp;gt; ICC Profile Info&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Size: 4380 bytes&lt;br /&gt;pdf_color&amp;gt;&amp;gt; CMM Type: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Version: 2.0.0&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Class: mntr&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Color Space: RGB&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Connection Space: XYZ&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creation Date: 2008:03:10:03:06:58&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Primary Platform: APPL&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Flags: 00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Mnfct: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Model: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Attr: 00:00:00:00:00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Rendering Intent: Perceptual&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creator: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Illuminant (XYZ): 0.964 1.000 0.825&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Checksum: 4f:00:ed:04:36:f6:95:15:52:44:e2:a2:ef:c1:af:f9&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Calculated: b7:5e:70:78:94:28:79:8e:60:cc:6e:58:99:c8:fa:f9&lt;br /&gt;&lt;br /&gt;** WARNING ** Invalid ICC profile: Inconsistent checksum.&lt;br /&gt;&lt;br /&gt;pdf_color&amp;gt;&amp;gt; ICC Profile Info&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Size: 4380 bytes&lt;br /&gt;pdf_color&amp;gt;&amp;gt; CMM Type: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Version: 2.0.0&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Class: mntr&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Color Space: RGB&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Connection Space: XYZ&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creation Date: 2008:03:10:03:06:58&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Primary Platform: APPL&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Profile Flags: 00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Mnfct: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Model: (null)&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Device Attr: 00:00:00:00:00:00:00:00&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Rendering Intent: Perceptual&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Creator: appl&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Illuminant (XYZ): 0.964 1.000 0.825&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Checksum: 4f:00:ed:04:36:f6:95:15:52:44:e2:a2:ef:c1:af:f9&lt;br /&gt;pdf_color&amp;gt;&amp;gt; Calculated: b7:5e:70:78:94:28:79:8e:60:cc:6e:58:99:c8:fa:f9&lt;br /&gt;]&lt;br /&gt;72300 bytes written&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;dviの時と同じくWarningが出た．でもpdf自体はちゃんと出来て，きちんとプレビューで見れる．しかも，&lt;span style="color: rgb(255, 0, 0);"&gt;前回上手くレンダリング出来てない！って言った，ovalenvが正しく表示出来るように&lt;/span&gt;なってるし．なぜ？&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SpqGJHSCkBI/AAAAAAAAAI8/PAfU52r1_zI/s1600-h/090830-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 220px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SpqGJHSCkBI/AAAAAAAAAI8/PAfU52r1_zI/s320/090830-0001.png" alt="" id="BLOGGER_PHOTO_ID_5375756596351766546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まぁということで，&lt;span style="color: rgb(255, 0, 0);"&gt;+no_x11オプションを付けても，今のところ問題ない&lt;/span&gt;．おかげで今回のでインストールされたportは次の通りで，かなり少なく済んでる．&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ port installed&lt;br /&gt;The following ports are currently installed:&lt;br /&gt;autoconf @2.64_2 (active)&lt;br /&gt;automake @1.11_0+universal (active)&lt;br /&gt;bash-completion @1.0_1&lt;br /&gt;bash-completion @1.0_1+universal (active)&lt;br /&gt;cairo @1.8.8_0+macosx+no_x11 (active)&lt;br /&gt;coreutils @7.5_0&lt;br /&gt;coreutils @7.5_0+universal (active)&lt;br /&gt;expat @2.0.1_0 (active)&lt;br /&gt;fontconfig @2.7.1_0+macosx (active)&lt;br /&gt;freetype @2.3.9_0+macosx+universal (active)&lt;br /&gt;gd2 @2.0.35_5+no_x11 (active)&lt;br /&gt;gettext @0.17_4 (active)&lt;br /&gt;ghostscript @8.70_0+no_x11 (active)&lt;br /&gt;ghostscript-fonts-hiragino @8.70_1+darwin_10 (active)&lt;br /&gt;gmp @4.3.1_1 (active)&lt;br /&gt;gperf @3.0.4_0 (active)&lt;br /&gt;help2man @1.36.4_1+universal (active)&lt;br /&gt;jpeg @6b_3 (active)&lt;br /&gt;libiconv @1.13_0 (active)&lt;br /&gt;libpixman @0.14.0_0 (active)&lt;br /&gt;libpng @1.2.38_0 (active)&lt;br /&gt;libtool @2.2.6a_0 (active)&lt;br /&gt;libxml2 @2.7.3_0+universal (active)&lt;br /&gt;lzmautils @4.32.7_1 (active)&lt;br /&gt;m4 @1.4.13_0+universal (active)&lt;br /&gt;ncurses @5.7_0+darwin_10 (active)&lt;br /&gt;ncursesw @5.7_0+darwin_10 (active)&lt;br /&gt;nkf @2.0.9-20090426_0 (active)&lt;br /&gt;p5-locale-gettext @1.05_0 (active)&lt;br /&gt;perl5 @5.8.9_0 (active)&lt;br /&gt;perl5.8 @5.8.9_3 (active)&lt;br /&gt;pkgconfig @0.23_1 (active)&lt;br /&gt;pTeX @20090703_0+no_x11+utf8 (active)&lt;br /&gt;t1lib @5.1.2_1 (active)&lt;br /&gt;texi2html @1.82_0 (active)&lt;br /&gt;texinfo @4.13_0 (active)&lt;br /&gt;zlib @1.2.3_2+universal (active)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;X関係が全然入って無いのは，すっきりしてていい．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6684623075664947033?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6684623075664947033/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/macports-coreutils-binutils-ptex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6684623075664947033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6684623075664947033'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/macports-coreutils-binutils-ptex.html' title='MacPortsのメモ coreutils, binutils, ptex'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/SpqGJHSCkBI/AAAAAAAAAI8/PAfU52r1_zI/s72-c/090830-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-528678616162872065</id><published>2009-08-29T18:58:00.002+09:00</published><updated>2009-08-29T19:56:01.687+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x64'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><category scheme='http://www.blogger.com/atom/ns#' term='d-script'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-test'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>Snow Leopardへの移行 - AOVCSの修正</title><content type='html'>Snow Leopardへの移行したために，今まで実装してきたAOVCSの一部を修正する必要があった．それでどこを修正したかのメモ．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;optimizerの修正&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;とりあえず再コンパイル(64bitでコンパイル)してそのまま走らせてみると，&lt;span style="color: rgb(51, 51, 255);"&gt;一瞬でメモリを食いつぶす&lt;/span&gt;ことが判明．メモリリークかなーと思いながら調べていくと，&lt;span style="color: rgb(51, 51, 255);"&gt;無限ループに陥っている&lt;/span&gt;事が分かった．64bitだとなかなかメモリアロケーションに失敗しないから，無限ループでもプログラムが全然落ちない模様．にゃるほど．&lt;br /&gt;&lt;br /&gt;で，問題のコードが次．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;optimizer/bufReader.cpp：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;vector&amp;lt;string&amp;gt; BufReader::explode(string&amp;amp; str,char delim)&lt;br /&gt;{&lt;br /&gt;vector&amp;lt;string&amp;gt; result;&lt;br /&gt;unsigned int curpos=0;&lt;br /&gt;unsigned int size;&lt;br /&gt;&lt;br /&gt;while((size=str.find_first_of(delim,curpos))!=str.npos){&lt;br /&gt; if(size&amp;gt;curpos){&lt;br /&gt;   result.push_back(str.substr(curpos,size-curpos));&lt;br /&gt; }&lt;br /&gt; curpos=size+1;&lt;br /&gt;}&lt;br /&gt;if(curpos!=str.length()){&lt;br /&gt; result.push_back(str.substr(curpos));&lt;br /&gt;}&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;sizeの型がunsigned intになっているのが問題．ついでにcurposの型もsize_tであるべき．&lt;span style="color: rgb(51, 51, 255);"&gt;32bitではたまたまfind_first_ofの正しい返り値の型size_type(size_t)がunsigned intと一致していたから問題なかった&lt;/span&gt;だけ．このままコンパイルすると，"bufReader.cpp:157: warning: comparison is always true due to limited range of data type"という警告が出る．whileの条件のところが常にtrueになるようだ．そのせいで，無限ループに陥ってたという事．しかしこれが何故常にtrueになるのかが分からない．なのでちょっと調べてみる．&lt;br /&gt;&lt;br /&gt;まず，string::nposはsize_t型で，値は-1，つまり&lt;span style="color: rgb(255, 0, 0);"&gt;64bitなら0xffffffffffffffff&lt;/span&gt;を持つ．これに対して，unsigned int型(32bit)を比較しようとすると，64bitへの変換が起こる．この際，unsignedなので&lt;span style="color: rgb(255, 0, 0);"&gt;符号拡張が行われず，そのため表現出来る最大値が0x00000000ffffffff&lt;/span&gt;となる．これにより，常に等しくない，!=の条件式を適用すれば常にtrueとなるのである．なるほどー．&lt;br /&gt;もし，unsignedが付いていないとすると，符号拡張で0xffffffffffffffffを表現出来てしまう為，上記のエラーは出ない(ただし次の行辺りでunsignedとsignedを比較しているというWarningは出る)．なるほどねー．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dtrace daemon (d-script)の修正&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;次が，d-scriptの修正．普通に実行する分にはエラーが出ていなくてなかなか気づかなかったのだが，&lt;span style="color: rgb(51, 51, 255);"&gt;引数リストを取得出来ないという問題&lt;/span&gt;がある事に気づいた．まず，テストケースが抜けてたってことが問題．あとで直さないと．&lt;br /&gt;で，テストの方は置いといて，この問題の対処法を検証する．問題となっていたのは次の部分．&lt;br /&gt;&lt;pre name="code" class="c"&gt;  // argv[0] may point invalid area. The way to check it is just a symptomatic treatment&lt;br /&gt;this-&amp;gt;isClean=SELECT_64_86(uregs[R_SP]==0x1f00000000LL || uregs[R_SP]==0x1f0000001fLL, (curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint32_t)+sizeof(uint32_t))));&lt;br /&gt;&lt;/pre&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;そのスタックから引数リストを読み込んでも大丈夫「そう」かを確認&lt;/span&gt;していた部分．これで&lt;span style="color: rgb(51, 51, 255);"&gt;だいたい動いていた&lt;/span&gt;からいいや，と思っていたら，Snow Leopardで全然駄目になった．&lt;br /&gt;&lt;br /&gt;調査の経緯は省いて解決法を示すと，次の通りにすればまた&lt;span style="color: rgb(51, 51, 255);"&gt;だいたい動く&lt;/span&gt;ようになった．&lt;br /&gt;&lt;pre name="code" class="c"&gt;this-&amp;gt;isClean=SELECT_64_86((curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint64_t)+sizeof(uint64_t))), (curproc-&amp;gt;p_dtrace_argv==(uregs[R_SP]+sizeof(uint32_t)+sizeof(uint32_t))));&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;32bitの場合と同じ確認方法を使えるようになった&lt;/span&gt;って事．dtraceで取得する引数リストへのポインタと，スタックポインタの値が同じ場所を指していればOKというものである．むしろLeopardの時，何故これが使えなかったかが謎．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dtraceのバージョンアップ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opensource.apple.com/release/mac-os-x-106/"&gt;http://www.opensource.apple.com/release/mac-os-x-106/&lt;/a&gt;&lt;br /&gt;ここからdtraceのコードを参照すると，バージョン(?)が78になってた．Leopardの時は48-1だったから，結構進んだ？なので，CWDとか引数リストとかが解決されてないか期待しながらソースを参照した．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;scripts/darwin.d：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c"&gt;pr_psargs = P-&amp;gt;p_comm; /* XXX omits command line arguments XXX */&lt;br /&gt;(略)&lt;br /&gt;/* XXX Really want vn_getpath(curproc-&amp;gt;p_fd-&amp;gt;fd_cdir, , ) but that takes namecache_rw_lock XXX */&lt;br /&gt;inline string cwd = curproc-&amp;gt;p_fd-&amp;gt;fd_cdir-&amp;gt;v_name == NULL ?&lt;br /&gt; "&amp;lt;unknown&amp;gt;" : stringof(curproc-&amp;gt;p_fd-&amp;gt;fd_cdir-&amp;gt;v_name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;変わってなかった．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-528678616162872065?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/528678616162872065/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/snow-leopard-aovcs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/528678616162872065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/528678616162872065'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/snow-leopard-aovcs.html' title='Snow Leopardへの移行 - AOVCSの修正'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-6612997348144143774</id><published>2009-08-29T16:23:00.005+09:00</published><updated>2009-08-29T20:02:04.336+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='tex'/><category scheme='http://www.blogger.com/atom/ns#' term='ovalenv'/><category scheme='http://www.blogger.com/atom/ns#' term='preview'/><title type='text'>Snow Leopardへの移行</title><content type='html'>先日Snow Leopardが発売されたので，早速インストールしてみた．今まで作ってたプログラムが，Snow Leopardでも動くのかを試す為に．クリーンインストールではなくて普通にアップグレードでインストール．およそ1時間でインストール完了．&lt;br /&gt;&lt;br /&gt;そこで起こった問題大きいのから小さいのまで．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;iStat menusが動かない =&gt; 日付を表示させる為に入れていたのだが，Snow Leopardからは環境設定の日付と時刻で表示出来るようになっているので，不要，アンインストール&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Growl Mailが動かない&lt;/span&gt; =&gt; 代替策無し，結構ショック．Growl自体は問題なく動く&lt;/li&gt;&lt;li&gt;64bitアプリに対してSIMBLが動かない =&gt; Safariやターミナルで&lt;span style="color: rgb(51, 51, 255);"&gt;Mega Zoomer，TerminalColoreopardが使えなくなる&lt;/span&gt;．痛い&lt;/li&gt;&lt;li&gt;Exposeの展開レイアウトが変わる =&gt; 今までのノリで使うと，ウィンドウ選択をミスる&lt;/li&gt;&lt;li&gt;locateコマンドが最初は使えない =&gt; DBが削除されているため．locateコマンドを実行すると出る方法に従って，DBを再構築すればOK&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;64bitカーネルで起動出来ない&lt;/span&gt; =&gt; MacBook Air(2008初期モデル)EFI自体は64bitに対応しているんだけど，Appleの戦略かなにかのせいで，64bitでは起動出来ず&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;プレビューの表示がおかしい時がある&lt;/span&gt; =&gt; 後述&lt;/li&gt;&lt;/ul&gt;1日触って出てきた不満はこんな感じ．&lt;span style="color: rgb(255, 0, 0);"&gt;ディスク容量が結構増えた以外は，軽くなったとかそういう印象も薄く(立ち上げてるアプリが少ないと軽いので，メモリか，またはグラボ辺りがネックか？)，あんま変わらない感じ&lt;/span&gt;．ベンチマークとかじゃなくてあくまでも体感でしか無いけど．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そして下の画像が，プレビューの問題．一緒に表示しているのは，Adobe Readerの結果．プレビューが問題って事が分かるはず．&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;プレビュー：&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpjdV_1M4cI/AAAAAAAAAIs/CGonP4wyJBM/s1600-h/090829-0001.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 220px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpjdV_1M4cI/AAAAAAAAAIs/CGonP4wyJBM/s320/090829-0001.png" alt="" id="BLOGGER_PHOTO_ID_5375289525248254402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adobe Reader：&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SpjdWKMckAI/AAAAAAAAAI0/gSc5mbuty3A/s1600-h/090829-0002.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 202px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/SpjdWKMckAI/AAAAAAAAAI0/gSc5mbuty3A/s320/090829-0002.png" alt="" id="BLOGGER_PHOTO_ID_5375289528030105602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ちなみにこれは，Texのovalenvって環境．picins.styを入れると使える．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※8/29 20:00追記&lt;br /&gt;32bitでプレビューを起動しても同じ現象が起こった．プレビューに入り込んだバグと考えればいいのかな．&lt;br /&gt;(32bitでの起動法：Finderからプレビューを選択，情報を見る，32ビットモードで開く)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-6612997348144143774?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/6612997348144143774/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/snow-leopard.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6612997348144143774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/6612997348144143774'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/snow-leopard.html' title='Snow Leopardへの移行'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpjdV_1M4cI/AAAAAAAAAIs/CGonP4wyJBM/s72-c/090829-0001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1379478390712123164</id><published>2009-08-27T18:36:00.003+09:00</published><updated>2009-08-27T20:59:46.949+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>ToDo処理 その5 - dry-runの実装</title><content type='html'>ToDo処理その5．今回は，&lt;span style="color: rgb(255, 0, 0);"&gt;autoflagsコマンドがどういう動作をする予定かを表示する，dry-run&lt;/span&gt;の実装．以前書いたToDo一覧に書き損ねていたものだけど．&lt;br /&gt;&lt;br /&gt;この機能は非常に重要．当然実際にautoflagsを実行する前に確認の意味を込めるというのもあるが，それ以上に，&lt;span style="color: rgb(255, 0, 0);"&gt;初めてautoflagsコマンドを使う人が正しく動作する事を確認するため&lt;/span&gt;に使うという意味がある．なので，この実装は結構前から必要だと思っていた．&lt;br /&gt;&lt;br /&gt;ただそう思っていたにも関わらずなかなか実装しなかったのは，&lt;span style="color: rgb(51, 51, 255);"&gt;面倒になりそうな部分があった&lt;/span&gt;から．嫌な事を後回しにするのは良くないけど，でも避けてた．それが次の部分．&lt;br /&gt;&lt;ul&gt;&lt;li&gt;自動設定すべきファイル・ディレクトリの取得は，BazaarのAPIを使う (WorkingTree.iter_changes)&lt;/li&gt;&lt;li&gt;新しいディレクトリがあったら，&lt;span style="color: rgb(255, 0, 0);"&gt;iter_changesはそのディレクトリだけを返し，その中のファイル名までは返してくれない&lt;/span&gt;&lt;/li&gt;&lt;li&gt;現在の実装ではまず自動設定すべきディレクトリが無くなるまで，ディレクトリの追加を行ってから，ファイルの自動設定を行う&lt;/li&gt;&lt;/ul&gt;この挙動の為，現状，あるディレクトリ以下のファイルを処理する為には，そのディレクトリが実際にリポジトリに追加されている必要がある．しかし，&lt;span style="color: rgb(51, 51, 255);"&gt;dry-runでは実際に追加する動作をしてはいけないので，ここでコンフリクトが起こる&lt;/span&gt;のである．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;しかしこれは案外単純にクリア出来ることに気づいた．&lt;br /&gt;新しく，&lt;span style="color: rgb(255, 0, 0);"&gt;状態を設定したファイル一覧と，ディレクトリの追加で新しく状態設定をすべきファイル一覧という二つの項目&lt;/span&gt;を用意する．そして，iter_changesの返り値に，後者の新しく状態設定すべきファイル一覧を加え，そこから前者の状態設定したファイル一覧を取り除く，とやるのである．こうすると，上で述べたiter_changesの挙動と同じになる．あとはこれを実装するだけ．&lt;br /&gt;&lt;br /&gt;単純なやり方としては，--dry-runオプションが付いていたらif文で各メソッドの挙動を変えるというものがある．しかし，コードの見通しが悪くなる．&lt;br /&gt;そこで，&lt;span style="color: rgb(255, 0, 0);"&gt;autoflagsクラスを継承したdry-run実行用のクラスを用意し，そこでメソッドのオーバーライドを行う&lt;/span&gt;という方法を取る事にした．--dry-runオプション付きで実行したら，autoflagsクラスが実行をdry-runクラスに投げ直すという形にするのである．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上記の実装を行ったのが次．まず，cmd_autoflagsクラスの変更点．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;bazaar-ext/autoflags/autoflags.py：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;from bzrlib.option import Option&lt;br /&gt;....&lt;br /&gt;class cmd_autoflags(Command):&lt;br /&gt;   ....&lt;br /&gt;   takes_options =[&lt;br /&gt;       Option('dry-run',&lt;br /&gt;              help="Show what would be done, but don't actually do anything.")]&lt;br /&gt;&lt;br /&gt;   ....&lt;br /&gt;   def run(self, dry_run=False):&lt;br /&gt;       if dry_run:&lt;br /&gt;           dryrunner=cmd_autoflags_dryrun()&lt;br /&gt;           dryrunner.run()&lt;br /&gt;           return&lt;br /&gt;   ....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;--dry-runオプションを有効にする為，takes_optionsの部分にdry-runを追加，またrunメソッドにdry_runという引数を追加する．これで--dry-runが指定されていたらTrueか何かになるので，その値でdry_runの方に分岐させればよい．&lt;br /&gt;&lt;br /&gt;次．dry-runの方の実装．&lt;br /&gt;&lt;pre name="code" class="python"&gt;class cmd_autoflags_dryrun(cmd_autoflags):&lt;br /&gt;   """ autoflags command implementation for dry-run&lt;br /&gt;   This command shows just what will be done, the state of files will never be changed&lt;br /&gt;   """&lt;br /&gt;   stateDefinedFiles=[]&lt;br /&gt;   newTargetFiles=[]&lt;br /&gt;&lt;br /&gt;   def add(self, files):&lt;br /&gt;       """ if new directory is added, we should determine&lt;br /&gt;       the state of files in the directory"""&lt;br /&gt;       self.addFiles[0:0]=files&lt;br /&gt;       self.stateDefinedFiles[0:0]=[self.wt.relpath(target[1][2]) for target in files]&lt;br /&gt;       for target in files:&lt;br /&gt;           if os.path.isdir(target[1][2]):&lt;br /&gt;               for filename in os.listdir(target[1][2]):&lt;br /&gt;                   filename=self.wt.relpath(target[1][2])+"/"+filename&lt;br /&gt;                   if os.path.isdir(filename):&lt;br /&gt;                       changeEntry=(None, (None, filename), True, (False, False), (None, None), (None, filename), (None, "directory"), (None, None))&lt;br /&gt;                   else:&lt;br /&gt;                       changeEntry=(None, (None, filename), True, (False, False), (None, None), (None, filename), (None, "file"), (None, None))&lt;br /&gt;                   self.newTargetFiles.append(changeEntry)&lt;br /&gt;&lt;br /&gt;   def delete(self, files):&lt;br /&gt;       self.deleteFiles[0:0]=files&lt;br /&gt;       self.stateDefinedFiles[0:0]=[target[1][2] for target in files]&lt;br /&gt;&lt;br /&gt;   def move(self, pairs):&lt;br /&gt;       self.movedFiles[0:0]=pairs&lt;br /&gt;       self.stateDefinedFiles[0:0]=[target[1][2] for target in pairs]&lt;br /&gt;       self.stateDefinedFiles[0:0]=[target[1][3] for target in pairs]&lt;br /&gt;&lt;br /&gt;   def ignore(self, files):&lt;br /&gt;       self.ignoredFiles[0:0]=files&lt;br /&gt;       self.stateDefinedFiles[0:0]=[target[1][2] for target in files]&lt;br /&gt;&lt;br /&gt;   def grabChanges(self, type='both'):&lt;br /&gt;       """ changes format:&lt;br /&gt;       (file_id, path, content_change, versioned, parent_id, name, kind, executable)&lt;br /&gt;       """&lt;br /&gt;       changes=self.wt.iter_changes(self.wt.basis_tree(), want_unversioned=True)&lt;br /&gt;       # filter each files&lt;br /&gt;       changes=[change for change in changes if self.isTreat(change)]&lt;br /&gt;       changes[0:0]=self.newTargetFiles&lt;br /&gt;       changes=[change for change in changes if not self.wt.is_ignored(change[1][1])]&lt;br /&gt;       changes=[change for change in changes if not change[1][1] in self.stateDefinedFiles]&lt;br /&gt;       if type=='file' or type=='directory':&lt;br /&gt;           changes=[change for change in changes if change[6][1]==type or change[6][0]==type]&lt;br /&gt;&lt;br /&gt;       return changes&lt;br /&gt;  &lt;br /&gt;   def showResult(self):&lt;br /&gt;       print "The following state will be set if execute autoflags(af) without --dry-run"&lt;br /&gt;       print ""&lt;br /&gt;       cmd_autoflags.showResult(self)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;案外これだけで実装出来てしまった．&lt;span style="color: rgb(255, 0, 0);"&gt;小細工が必要なのは，ディレクトリを追加する場合のnewTargetFilesへの操作，そこに追加する際のパスの形式(リポジトリルートからの相対パス)&lt;/span&gt;程度．&lt;br /&gt;もっともっとメンドクサイ事になると身構えてたのにな．ただ，楽になる方に読みが外れても，それはそれで問題．ちゃんとどのくらいの難易度かを判断出来るようになるべきだなー．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1379478390712123164?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1379478390712123164/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-5-dry-run.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1379478390712123164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1379478390712123164'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-5-dry-run.html' title='ToDo処理 その5 - dry-runの実装'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4118444103055006656</id><published>2009-08-27T16:47:00.009+09:00</published><updated>2009-08-27T18:10:00.111+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-test'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>ToDo処理 その4.5 - アプリケーション名+パスで動作を指定出来るようにする - 2</title><content type='html'>アプリケーション名+パス名のつづき．XMLの記述変更はやったので，それを読み込んで，例外動作処理をどうするか，の部分．&lt;br /&gt;&lt;br /&gt;XMLの読み込み方法は特に重要でもないので割愛．minidomでちょっとずつパースして処理しているだけ．&lt;a href="http://bazaar.launchpad.net/%7Ehitoshi-s/aovcs-bazaar/main/annotate/head%3A/bazaar-ext/autoflags/aovcs.py"&gt;ソースコードはここ&lt;/a&gt;にあるので，気になるならばそこで．メソッド名はinsertData．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で，XMLを読み込んだとして，その先の処理の部分．こっちもまぁ全然大した事はない．動作のフローチャートは次の通り．&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpZB5CnFyTI/AAAAAAAAAIk/7lYJasrD5JU/s1600-h/figs4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 241px;" src="http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpZB5CnFyTI/AAAAAAAAAIk/7lYJasrD5JU/s320/figs4.png" alt="" id="BLOGGER_PHOTO_ID_5374555653522442546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;赤い部分が，今回の拡張で追加された部分．まぁ普通の記述．ソースコードも次の通り．&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def getAction(self, filename, appNames, event):&lt;br /&gt;    """This gives the information of 'What to do for (App.Names, event)',&lt;br /&gt;    and returns one of 'auto/ignore/prompt/alert/undef'."""&lt;br /&gt;&lt;br /&gt;    result=("undef","undef")&lt;br /&gt;    if event==DB_MOVEFROM:&lt;br /&gt;        result=("auto", "renamed/moved file")&lt;br /&gt;    if event==DB_MOVETO:&lt;br /&gt;        result=("auto", "renamed/moved file")&lt;br /&gt;&lt;br /&gt;    for appName in appNames:&lt;br /&gt;        if self.data.has_key(appName) and self.data[appName][0][event][0]!="undef":&lt;br /&gt;            result=(self.data[appName][0][event][0],appName)&lt;br /&gt;            type=self.data[appName][0][event][1]&lt;br /&gt;            for exception in self.data[appName][1][event]:&lt;br /&gt;                if fnmatch.fnmatch(filename, exception[0]):&lt;br /&gt;                    result=(exception[1], appName+" - pattern: "+exception[0])&lt;br /&gt;                    type=exception[2]&lt;br /&gt;            if type=="strong": return result&lt;br /&gt;    return result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;for exceptionの節が，今回の拡張で追加された部分．それだけ．この実装では，&lt;span style="color: rgb(255, 0, 0);"&gt;例外パターンの優先度は，minidomで先に取得した方が優先度が低く&lt;/span&gt;なる．XMLの子要素には優先順位というものが無いはずなので，先に記述したものが優先されるとかはおかしいのである．&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;基本スタンスとして，重複する例外を書くとどっちで処理するかは分からない&lt;/span&gt;という事にする．優先度を数値で指定出来るようにするのもアリだけど，とりあえずはこのままにしよう．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そしてこの実装のテストコードが次．&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;function test20_setup {&lt;br /&gt; TEST_NAME="test20"&lt;br /&gt; TEST_DESCRIPTION="touch ignore pattern: .elc"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function test20_run {&lt;br /&gt; touch .aovcs.conf&lt;br /&gt; cat ${TEMPLATE_DIR}/.aovcs.conf &amp;gt;&amp;gt; .aovcs.conf&lt;br /&gt; touch hoge.c&lt;br /&gt; touch fuga.elc&lt;br /&gt; bzr init&lt;br /&gt; autoflags&lt;br /&gt; commit&lt;br /&gt; confirmFiles ".aovcs.conf .bzrignore hoge.c"&lt;br /&gt; confirmIgnores "fuga.elc"&lt;br /&gt;&lt;br /&gt; mkdir dir&lt;br /&gt; touch dir/poo.elc&lt;br /&gt; touch dir/poo.el&lt;br /&gt; autoflags&lt;br /&gt; commit&lt;br /&gt; confirmFiles ".aovcs.conf .bzrignore dir dir/poo.el hoge.c"&lt;br /&gt; confirmIgnores "dir/poo.elc fuga.elc"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function test21_setup {&lt;br /&gt; TEST_NAME="test21"&lt;br /&gt; TEST_DESCRIPTION="mkdir ignore pattern: bin"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function test21_run {&lt;br /&gt; touch .aovcs.conf&lt;br /&gt; cat ${TEMPLATE_DIR}/.aovcs.conf &amp;gt;&amp;gt; .aovcs.conf&lt;br /&gt; mkdir bar&lt;br /&gt; mkdir bin&lt;br /&gt; mkdir bar/bin&lt;br /&gt; mkdir bar/bin/foo&lt;br /&gt; touch bar/bin/bar&lt;br /&gt; bzr init&lt;br /&gt; autoflags&lt;br /&gt; commit&lt;br /&gt; confirmFiles ".aovcs.conf .bzrignore bar"&lt;br /&gt; confirmIgnores "bar/bin bin"&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このテストは，次の設定ファイルを読み込んで行う．&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-configurations&amp;gt;&lt;br /&gt;&amp;lt;action-sets&amp;gt;&lt;br /&gt; &amp;lt;action-set name="primary"&amp;gt;&lt;br /&gt;   &amp;lt;create action="auto" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;remove action="auto" type="weak" /&amp;gt;&lt;br /&gt; &amp;lt;/action-set&amp;gt;&lt;br /&gt; &amp;lt;action-set name="secondary"&amp;gt;&lt;br /&gt;   &amp;lt;create action="ignore" type="strong" /&amp;gt;&lt;br /&gt;   &amp;lt;remove action="ignore" type="strong" /&amp;gt;&lt;br /&gt; &amp;lt;/action-set&amp;gt;&lt;br /&gt;&amp;lt;/action-sets&amp;gt;&lt;br /&gt;&amp;lt;app-configurations&amp;gt;&lt;br /&gt; &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;touch&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;exceptions&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;   &amp;lt;/exceptions&amp;gt;&lt;br /&gt; &amp;lt;/app-configuration&amp;gt;&lt;br /&gt; &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;mkdir&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;exceptions&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="weak" pattern="*/bin" /&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="weak" pattern="bin" /&amp;gt;&lt;br /&gt;   &amp;lt;/exceptions&amp;gt;&lt;br /&gt; &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;&amp;lt;/app-configurations&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-configurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;touchが作成した*.elcは無視する，mkdirが作成したbinディレクトリは無視する，という設定．これはemacsやeclipseを見据えたもの．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4118444103055006656?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4118444103055006656/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-45-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4118444103055006656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4118444103055006656'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-45-2.html' title='ToDo処理 その4.5 - アプリケーション名+パスで動作を指定出来るようにする - 2'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FhxNSpAa3Kg/SpZB5CnFyTI/AAAAAAAAAIk/7lYJasrD5JU/s72-c/figs4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-3025169953771812536</id><published>2009-08-27T16:07:00.002+09:00</published><updated>2009-08-27T16:20:38.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><title type='text'>ToDo処理 その4 - アプリケーション名+パスで動作を指定出来るようにする</title><content type='html'>ToDoの処理第4回．今回は，アプリケーション名だけでは表現しきれない状況に対処する為，&lt;span style="color: rgb(255, 0, 0);"&gt;ファイル名のパターンで例外的に処理する&lt;/span&gt;部分を実装する．&lt;br /&gt;&lt;br /&gt;もう少し具体的な目標を示す．例えばEmacsで作成したファイル．これは&lt;span style="color: rgb(255, 0, 0);"&gt;通常バージョン管理するが，Emacsがコンパイルしたe-lispファイル(.elc)はバージョン管理すべきではない&lt;/span&gt;．こういう，基本的に〜だが，このファイル名/拡張子/ディレクトリ名については例外的に別の処理をする，というのを記述出来るようにしたい．&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;これに頼りすぎると従来のバージョン管理と同じ感じになってしまい嬉しくない&lt;/span&gt;のだが，一部の例外を処理するためには必要．eclipseのバイナリとかを排除する為にもね．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そうするとまずは，この例外記述をどう行うかから考えなければならない．現状Configurationは次のフォーマットで記述している．&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-configurations&amp;gt;&lt;br /&gt; &amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;create action="auto" type="weak"/&amp;gt;&lt;br /&gt;   &amp;lt;remove action="auto" type="weak"/&amp;gt;&lt;br /&gt;   &amp;lt;appnames&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;Emacs&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;Finder&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;vi&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;touch&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;mkdir&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;rmdir&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;rm&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;template.sh&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/appnames&amp;gt;&lt;br /&gt; &amp;lt;/configuration&amp;gt;&lt;br /&gt; &amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;create action="ignore" type="strong"/&amp;gt;&lt;br /&gt;   &amp;lt;remove action="ignore" type="strong"/&amp;gt;&lt;br /&gt;   &amp;lt;appnames&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;make&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gnumake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;javac&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/appnames&amp;gt;&lt;br /&gt; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-configurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configurationがあって，その中に，そのConfigurationに属するアプリケーション名を記述してくというもの．しかしこれだと，例外を記述する場所が難しい．例外は，アプリケーション名と同じ場所に書きたいものなので．そこで，記述を次の形式に大きく変える事とした．&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;aovcs-configurations&amp;gt;&lt;br /&gt; &amp;lt;action-sets&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="primary"&amp;gt;&lt;br /&gt;     &amp;lt;create action="auto" type="weak" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="auto" type="weak" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt;   &amp;lt;action-set name="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;create action="ignore" type="strong" /&amp;gt;&lt;br /&gt;     &amp;lt;remove action="ignore" type="strong" /&amp;gt;&lt;br /&gt;   &amp;lt;/action-set&amp;gt;&lt;br /&gt; &amp;lt;/action-sets&amp;gt;&lt;br /&gt; &amp;lt;app-configurations&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Emacs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;emacs&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;exceptions&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="weak" pattern="*.elc" /&amp;gt;&lt;br /&gt;       &amp;lt;create action="ignore" type="strong" pattern="*~" /&amp;gt;&lt;br /&gt;       &amp;lt;remove action="ignore" type="weak" pattern="*~" /&amp;gt;&lt;br /&gt;     &amp;lt;/exceptions&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="primary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;Finder&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;vi&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;touch&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;mkdir&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rmdir&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;rm&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;template.sh&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt;   &amp;lt;app-configuration action-set="secondary"&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gcc-4.0&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;make&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;gnumake&amp;lt;/name&amp;gt;&lt;br /&gt;     &amp;lt;name&amp;gt;javac&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;/app-configuration&amp;gt;&lt;br /&gt; &amp;lt;/app-configurations&amp;gt;&lt;br /&gt;&amp;lt;/aovcs-configurations&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最初に動作ルールを名前付きで記述し，次に，各アプリケーションの設定を例外付きで書く．&lt;span style="color: rgb(51, 51, 255);"&gt;それほど時間をかけて考えた訳ではないのでベストではない&lt;/span&gt;だろうが，&lt;span style="color: rgb(255, 0, 0);"&gt;記述力としては十分&lt;/span&gt;．のちのち拡張したくなったら，patternじゃなくてregexpとか追加すればいいし．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずXMLの記述方式の変更はこんな．次の投稿で，実際のコード変更の方を述べる．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-3025169953771812536?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/3025169953771812536/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3025169953771812536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/3025169953771812536'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-4.html' title='ToDo処理 その4 - アプリケーション名+パスで動作を指定出来るようにする'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-7497042761308476445</id><published>2009-08-25T17:09:00.002+09:00</published><updated>2009-08-25T19:48:52.524+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Trace Optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>SQLiteのBUSY問題</title><content type='html'>トレースは大方取れるようになった．しかし前回の日記の最後で触れた通り，&lt;span style="color: rgb(51, 51, 255);"&gt;SQLiteのデータベースのデータ競合でトレースがドロップする事がある&lt;/span&gt;，という問題が残っている．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;現状行っている操作は，&lt;span style="color: rgb(255, 0, 0);"&gt;optimizerでのデータ書き込みとautoflagsでのデータ読み込みだけなので，本当は競合が起こらなくて済む&lt;/span&gt; (読み込むデータの一貫性が失われるかもしれないけど)はずである．しかし，なぜかoptimizerでのデータの書き込み=トランザクションのcommitや，autoflagsでのselectの実行時に，SQLITE_BUSYエラーが返ってくる．&lt;br /&gt;&lt;br /&gt;とりあえずSQLiteのリファレンスを参照して，その辺の記述が無いかを探す．すると，トランザクションの項目に次の文章があった．&lt;br /&gt;&lt;br /&gt;An attempt to execute COMMIT might also result in an &lt;a href="http://www.sqlite.org/c3ref/c_abort.html"&gt;SQLITE_BUSY&lt;/a&gt; return code if an another thread or process has a &lt;a href="http://www.sqlite.org/lockingv3.html#shared_lock"&gt;shared lock&lt;/a&gt; on the database that prevented the database from being updated.  When COMMIT fails in this way, the transaction remains active and the COMMIT can be retried later after the reader has had a chance to clear.&lt;br /&gt;&lt;a href="http://www.sqlite.org/lang_transaction.html"&gt;http://www.sqlite.org/lang_transaction.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;shared lock (読み込み時のロック)がかかっているとcommitに失敗する事がある&lt;/span&gt;，とのこと．そして，その&lt;span style="color: rgb(255, 0, 0);"&gt;トランザクション自体はまだ有効だから，後で改めてcommitすれば大丈夫&lt;/span&gt;，とのこと．&lt;br /&gt;失敗するのには納得いかないが，SQLITE_BUSYが返ってきたら後で改めてcommitするということにしよう．本実装では1秒毎にcommitを実行しているけど，もしcommitに失敗したら，その次のcommitでまとめてやってしまう，という事にする．コードにすると次の通り．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;optimizer/dbWriter.cpp：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;bool DbWriter::syncDisk()&lt;br /&gt;{&lt;br /&gt; if(commitTransaction()){&lt;br /&gt;   return beginTransaction();&lt;br /&gt; }&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;commitに失敗したら，新しいトランザクションを開始せず，そのままトランザクションを利用するというものである．これで，トレースがドロップするという問題は解決した．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;しかし，まだ解決出来ていない問題もある．&lt;span style="color: rgb(51, 51, 255);"&gt;autoflagsがselect文を発行するとSQLITE_BUSYエラーが返ってくる&lt;/span&gt;というものである．これは，ロックのタイムアウトを大きな値に設定してあげれば良いらしい．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;bazaar-ext/autoflags/aovcs.py：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def createConnection(self):&lt;br /&gt;        self.connection=sqlite3.connect(self.dbpath, timeout=3000)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;とりあえず3秒にすると，SQLITE_BUSYエラーで動かないって事が無くなった．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-7497042761308476445?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/7497042761308476445/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/sqlitebusy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7497042761308476445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/7497042761308476445'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/sqlitebusy.html' title='SQLiteのBUSY問題'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-9089737687025421353</id><published>2009-08-24T19:15:00.003+09:00</published><updated>2009-08-24T20:33:34.702+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='Trace Optimizer'/><title type='text'>ToDo処理 その3 - optimizerの処理速度向上 - SQLite書き込み</title><content type='html'>optimizerの処理速度を上げないと，configureなどで負荷があがった際にトレースを取りこぼすという自体になっている．そこで，optimizerの処理速度を上げる．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どこの処理が重いのかを，コメントアウトしながら探すという原始的な方法で調べてみた (Sharkで測定する事を試したが，イマイチな結果)．そこでわかったのは，&lt;span style="color: rgb(255, 0, 0);"&gt;データベースSQLiteへの書き込みが重い&lt;/span&gt;という事．まぁそうだろうなー．&lt;br /&gt;その対策として前回上げていたのが，&lt;span style="color: rgb(255, 0, 0);"&gt;短時間での追加と削除はDBに書き出さない&lt;/span&gt;というものである．しかし，ググっていたら，それより簡単に処理速度を上げられそうな方法があった．&lt;br /&gt;&lt;br /&gt;「SQLite の処理は &lt;strong&gt;トランザクション&lt;/strong&gt; の中でないと著しく遅い」&lt;br /&gt;&lt;a href="http://www.randynetwork.com/blog/87"&gt;http://www.randynetwork.com/blog/87&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;トランザクションを使わないで処理すると，実際は&lt;span style="color: rgb(51, 51, 255);"&gt;毎回トランザクションを発行，毎回ファイルに書き込み&lt;/span&gt;を行うという事になるらしい．ここがパフォーマンスのボトルネックとなる．そこで，複数の処理をまとめて1トランザクションとすると，パフォーマンスが改善するとの事．&lt;br /&gt;そこで，&lt;span style="color: rgb(255, 0, 0);"&gt;1秒に1回の割合でトランザクションのcommitを行う&lt;/span&gt;事とした．別にcommit処理を正確に1秒毎に行う必要は無いので，time関数でゆるーく1秒毎に処理させた．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;optimizer/controller.cpp：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++"&gt;  int mainloop()&lt;br /&gt; {&lt;br /&gt;   time_t t=time(NULL);&lt;br /&gt;&lt;br /&gt;   while(true){&lt;br /&gt;     time_t t2=time(NULL);&lt;br /&gt;     if(t!=t2){&lt;br /&gt;       writer.syncDisk();&lt;br /&gt;       t=t2;&lt;br /&gt;     }&lt;br /&gt;     (ループ内処理)&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こうすると，&lt;span style="color: rgb(255, 0, 0);"&gt;configureのトレースを処理する際にもトレースのドロップが無くなった&lt;/span&gt;．当然より負荷の高い処理を行ったとすればドロップが起こるかもしれないが，現状では大丈夫．よし．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※しかし現在SQLiteのデータロック競合かなにかで，トレースがドロップする問題がまだ存在&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-9089737687025421353?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/9089737687025421353/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-3-optimizer-sqlite.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9089737687025421353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/9089737687025421353'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-3-optimizer-sqlite.html' title='ToDo処理 その3 - optimizerの処理速度向上 - SQLite書き込み'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1572041102763260403</id><published>2009-08-21T20:21:00.004+09:00</published><updated>2009-08-21T21:22:15.459+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>ToDo処理 その2 - moveしたファイルは，元々作成したアプリケーションで動作を決める</title><content type='html'>ToDoの処理その２．現在，次の操作を行った際にhogeというgccで生成したバイナリが追加として扱われるという問題がある．&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; $ emacs hoge.c&lt;br /&gt;$ gcc hoge.c&lt;br /&gt;$ mv a.out hoge&lt;br /&gt;$ bzr autoflags&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは，&lt;span style="color: rgb(51, 51, 255);"&gt;hogeを生成した(正しくは移動した)アプリケーションがmvであり，AOVCSはmvが操作したため自動的に管理すべき&lt;/span&gt;と判断するからである．しかしこの挙動は当然よくない．管理すべきでないファイルを，ちょっと名前変更しただけで管理するということになってしまうからである．&lt;br /&gt;&lt;br /&gt;よって，&lt;span style="color: rgb(255, 0, 0);"&gt;ファイルの移動元のファイルはどのアプリケーションが作ったか，という事を調べ，それにより動作を決める&lt;/span&gt;というのが適切となる．そこでAOVCS-bazaarをそのような動作に変更する．移動元を調査するアルゴリズムが次の図．&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FhxNSpAa3Kg/So6OtmiI_qI/AAAAAAAAAIc/BODI6jmRaOk/s1600-h/figs4.png"&gt;&lt;img style="cursor: pointer; width: 317px; height: 320px;" src="http://3.bp.blogspot.com/_FhxNSpAa3Kg/So6OtmiI_qI/AAAAAAAAAIc/BODI6jmRaOk/s320/figs4.png" alt="" id="BLOGGER_PHOTO_ID_5372388319588581026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;移動元を無限に辿り続けるのも問題なので，今回は5回までとした．ファイル名を決めるのに四苦八苦して，何度もrenameされると足りないかもだけど，とりあえずこんなもんとしておく．&lt;br /&gt;&lt;br /&gt;このアルゴリズムを実装したのが次のコード．&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;bazaar-ext/autoflags/autoflags.py：&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def resolveAlones(self, buffers):&lt;br /&gt;      """ Search original file from DB and define the actions of moveto files&lt;br /&gt;      """&lt;br /&gt;      for moveto in buffers["moveto"]:&lt;br /&gt;          curtarget=moveto&lt;br /&gt;          for x in range(5):&lt;br /&gt;              # we try 5 times for searching originally created application name&lt;br /&gt;              if self.wt.is_ignored(curtarget[1][3]):&lt;br /&gt;                  buffers["ignore"].append(("originally ignored file", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              curtarget=self.db.search(curtarget[1][3], [aovcs.DB_CREATE,aovcs.DB_MOVETO,aovcs.DB_COPYTO,aovcs.DB_LINKTO], date=moveto[1][5])&lt;br /&gt;              if curtarget==None:&lt;br /&gt;                  buffers["undef"].append(moveto)&lt;br /&gt;                  break&lt;br /&gt;              apps=curtarget[4].split("\t")&lt;br /&gt;              (action, appname)=self.conf.getAction(apps,curtarget[1])&lt;br /&gt;              if action=="auto" and (curtarget[1]!=aovcs.DB_MOVETO):&lt;br /&gt;                  buffers["add"].append((appname+": renaming traced", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              if action=="ignore" and (curtarget[1]!=aovcs.DB_MOVETO):&lt;br /&gt;                  buffers["ignore"].append((appname+": renaming traced", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              if action=="prompt" and (curtarget[1]!=aovcs.DB_MOVETO):&lt;br /&gt;                  buffers["prompt"].append((appname+": renaming traced", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              if action=="alert" and (curtarget[1]!=aovcs.DB_MOVETO):&lt;br /&gt;                  buffers["alert"].append((appname+": renaming traced", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              if action=="undef" and (curtarget[1]!=aovcs.DB_MOVETO):&lt;br /&gt;                  buffers["undef"].append((appname+": renaming traced", moveto[1]))&lt;br /&gt;                  break&lt;br /&gt;              curtarget=(appname, curtarget)&lt;br /&gt;              if x==4:&lt;br /&gt;                  buffers["undef"].append(moveto)&lt;br /&gt;      buffers["moveto"]=[]&lt;br /&gt;      return buffers&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;先にコードを書いて，その後で上のアルゴリズムをまとめたので，実装方法が若干違う&lt;/span&gt;部分がある．ただ，やっている事は上のアルゴリズムの通り．&lt;span style="color: rgb(255, 0, 0);"&gt;後で上の図の通りの形に実装し直そう&lt;/span&gt;．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1572041102763260403?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1572041102763260403/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-2-move.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1572041102763260403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1572041102763260403'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-2-move.html' title='ToDo処理 その2 - moveしたファイルは，元々作成したアプリケーションで動作を決める'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FhxNSpAa3Kg/So6OtmiI_qI/AAAAAAAAAIc/BODI6jmRaOk/s72-c/figs4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-4316203183313790690</id><published>2009-08-19T19:58:00.003+09:00</published><updated>2009-08-19T20:11:27.753+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>ToDo処理 その1 - 複数のConfigurationファイルに対応</title><content type='html'>随分と間が開いてしまったけど，実装の続き．前回示したToDoを片付けていく．&lt;br /&gt;&lt;br /&gt;まずは簡単なものから．複数のConfigurationを読み込めるようにする．&lt;br /&gt;AOVCSでは，&lt;span style="color: rgb(255, 0, 0);"&gt;ユーザ固有のConfiguration, リポジトリ固有のConfigurationがあり，優先度はリポジトリ固有のものが高い，という形式&lt;/span&gt;にする．しかし現状はホームディレクトリのみしか参照していないので，リポジトリルートの方も参照するように変更する．&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Configuration読み込み部分は予め，複数のConfigurationを読み込めるよう準備してある．なので，単にリポジトリルートを検出して，そこのConfigurationファイルを読み込めばいいだけ．ソースも簡単．&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;bazaar-ext/autoflags/autoflags.py：&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;    def run(self):&lt;br /&gt;        # user-specific configurations&lt;br /&gt;        self.conf=aovcs.Configuration(os.environ.get("HOME")+"/.aovcs.conf")&lt;br /&gt;        self.db=aovcs.Database(os.environ.get("HOME")+"/.aovcs.db")&lt;br /&gt;        self.wt,relpath=WorkingTree.open_containing('.')&lt;br /&gt;&lt;br /&gt;        # repository-specific configurations&lt;br /&gt;        if os.path.exists(self.wt.abspath(".aovcs.conf")):&lt;br /&gt;            self.conf.insertData(self.wt.abspath(".aovcs.conf"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ファイルの存在を確認して，存在したら読み込むというだけ．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-4316203183313790690?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/4316203183313790690/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-1-configuration.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4316203183313790690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/4316203183313790690'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todo-1-configuration.html' title='ToDo処理 その1 - 複数のConfigurationファイルに対応'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1733865932292970248</id><published>2009-08-05T19:38:00.003+09:00</published><updated>2009-08-05T19:48:00.058+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='Trace Optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS-bazaar'/><title type='text'>ToDos</title><content type='html'>AOVCS-bazaarの評価を行う為にまだ実装しなきゃいけない事のリストアップ．10月になる前にはこれらを終わらせたいところ．&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;プロセステーブルのリフレッシュ機能 (存在しないプロセス名の削除)&lt;/li&gt;&lt;li&gt;複数のConfigurationファイル読み込みへの対応 (ユーザホーム，リポジトリルート)&lt;/li&gt;&lt;li&gt;AOVCSが処理する際の，prompt, alert, undefのファイルへの対応&lt;/li&gt;&lt;li&gt;d-scriptの動的生成 (無視するアプリケーション名を指定出来るように)&lt;/li&gt;&lt;li&gt;DBから不要なデータの除去 (同じファイルのCREATEトレースは2つもいらないなど)&lt;/li&gt;&lt;li&gt;SQLiteの定期的な最適化 (vacuum, reindex，当然負荷が高くないときに)&lt;/li&gt;&lt;li&gt;シンボリックリンクを含むパスの扱い変更 (シンボリックリンクを展開したパスもDBに保存)&lt;/li&gt;&lt;li&gt;元々ignoreされていたものをmvした場合は，ignoreとして扱う&lt;/li&gt;&lt;li&gt;moveしてきて新しく作られたファイルは，元々のファイルを作成したアプリケーションによって追加か削除かを決める (move操作に対する指定は無くなる)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;optimizerの処理速度を上げる (短時間で追加と削除を行ったファイルは，DBに書き出す前に検出して書き出さないようにする)&lt;/li&gt;&lt;li&gt;アプリケーション名+パス(拡張子，ファイル名)で，動作を指定出来るようにする&lt;/li&gt;&lt;/ul&gt;うーん，いっぱいあるなー．順に処理していかないと．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1733865932292970248?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1733865932292970248/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todos.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1733865932292970248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1733865932292970248'/><link rel='alternate' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/todos.html' title='ToDos'/><author><name>Hi-Toshi</name><uri>http://www.blogger.com/profile/04434341439138300908</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_FhxNSpAa3Kg/SZp83uYRK5I/AAAAAAAAAAM/0powCFuh0vQ/S220/1042604542_246.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2512452256115416753.post-1984161279864806935</id><published>2009-08-02T17:34:00.003+09:00</published><updated>2009-08-02T17:43:14.935+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOVCS'/><category scheme='http://www.blogger.com/atom/ns#' term='slides'/><category scheme='http://www.blogger.com/atom/ns#' term='Trace Optimizer'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>中間発表</title><content type='html'>修士論文研究の中間発表用のスライド．最近更新が滞っているのは，これを作ったりこの練習をしているからです．&lt;br /&gt;&lt;br /&gt;どーゆうフォーマットで置くのがいいか分からなかったので，Keynoteの機能でFlash書き出しをして，それをここに貼付けるという事を試してみた．Flashのアップ先はおなじみDropbox．&lt;br /&gt;&lt;br /&gt;&lt;object height="288" width="384"&gt;&lt;br /&gt;&lt;param name="movie" value="intermediate.swf"&gt;&lt;br /&gt;&lt;embed src="http://files.getdropbox.com/u/544268/intermediate.swf" height="288" width="384"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;これでうまく張れてるのかな？見れない／見づらい時用に，pdfも一緒に．&lt;br /&gt;&lt;a href="http://files.getdropbox.com/u/544268/intermediate.pdf"&gt;http://files.getdropbox.com/u/544268/intermediate.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;デーモンが安定してきたと同時にoptimizerが抱える問題が分かってきたのでそっちをどうするか考え中．&lt;br /&gt;あと，dtraceが何なのかについてまとめる予定もあり．以前調査途中になっていた，dtraceの仕組みについても改めて調査して，９月のネタに使おうかな．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2512452256115416753-1984161279864806935?l=aru-and-dhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aru-and-dhi.blogspot.com/feeds/1984161279864806935/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://aru-and-dhi.blogspot.com/2009/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2512452256115416753/posts/default/1984161279864806935'/><link rel='self' type='application
