トップページ » prog

int i の i ってなあに?

 ちょっと前に表題の質問を受けました。更にアクセス解析を見てると同じ質問でGoogleから飛んできてる人が少なからずいたのでお答えします。

 C言語なんかでプログラミングしてるとループカウンタとかでよく見る int i なんですが、回りのプログラマの皆様に聞いてみたところ、多くの人が「int の i なんじゃないの?」と返されました。なるほど確かに int の一時変数なんだから適当に int の頭文字でいいやというのもあるかもしれません。実際の由来も似たような発想なのである意味で正解でしょう。
 しかし実際にはこれC言語以前に発祥が確認されてます。
 今有力とされている由来としては、Fortranの整数型変数を宣言する為の規則が I で始まる識別子であることから来ています。Fortranが最もさかんに使われていた時代や環境では、長い識別子をサポートしていなかった為、識別子の長さも識別子のバリエーションを増やす為に利用されていたそうです。なのでとりあえずループカウンタに整数型が欲しいな程度の物に長い意味のある識別子を使うのはご法度だったので、ループカウンタには I を使うという慣習が出来たようです。

 ちなみにこの逸話はエキスパートCプログラミングにも載っています。このトピック以外の話題も為になる本なので、興味のある方はご一読してみては如何でしょうか。

by 長月葵  at 23:26  | Permalink  | Comments (0)  | Trackbacks (0)

1*10^-9秒の世界

 最近お仕事で数十~数百ナノセカンドの世界で戦ってます。

 守秘義務があるので詳しくはいえませんが、アセンブリとにらめっこでどうやれば一命令減るか。増えても良いから重い命令減らないか。ロードの直後に参照みたいな待ちの入る処理なくならないか。そんな事考えてます。
 今やっているのが組み込み機器向けの画像処理なので1クロック減るとずいぶん違うんですよね。画像のサイズが320*240だとしたら単純に1ピクセルずつコピーするだけでも76800回ループが回る訳です。組み込み機器ではPCと違ってまだ低クロックですから、割と高速で200MHzと仮定しても1クロックが2*10^-8秒。76800クロックなら384*10^-6秒。ループの中の処理が3クロック減ると1ミリセカンド速くなる計算です。
 素直に組んだルーチンと比べると既に四倍以上の速度向上を果たしてるんですが、それでもまだ足りてません。もうちょっとこの苦難は続きそうです。

 今週ずっとそんな感じなんですが、ひと段落したら家でVC相手に復習してわんくまの方にエントリこさえます。手動最適化に興味のある方お楽しみに。

by 長月葵  at 13:30  | Permalink  | Comments (0)  | Trackbacks (0)

わんくま同盟に参加しました

 実は数日前に参加受け付けメール着てたり、既にわんくまblogに初投稿済ませてたりするんで一部の方は知ってるかと思うのですが、わんくま同盟に参加しました。
 わんくま同盟で用意してもらったblogはこちらになります。webスペースもありますが、そちらは基本的に使う気はないです。わんくまblog用の画像置き場になるでしょう。

 備忘禄代わりにこれからのblogの住み分けについて書いてみます。
 今後も当blogではプログラミングなトピックを扱いますが、基本的というか軽く留めて詳しい事はわんくまblogに書くスタンスになる予定です。今までもあんまり濃い話題は載せてないので基本的に変わらないともいえます。また、書籍のレビュー関連はプログラミング関係であっても大体こっちに書くつもりです。わんくまblog側で書く場合はわんくま関係者のblogと関連する時になります。
 プログラミング以外のトピックに関してはこれまでどおりこちらで書きます。が、ぶっちゃけ最近プログラミング以外やってないので書く事ない気もします。

 という訳で此れまで以上に放置の予感がする事態になりましたが皆様今後ともよろしうおたのもうします。

by 長月葵  at 23:55  | Permalink  | Comments (0)  | Trackbacks (0)

わんくま同盟勉強会大阪#6に参加してきた

 わんくま同盟勉強会大阪#6に参加してきました。
 崇拝するεπιστημη (エピステーメ) さんが來阪されると事前に聞いていたのでサイン欲しさに特攻とミーハー丸出しで行って来ました。
 内容的には割と知ってる事だらけだったんですが、パネルディスカッションで久しく餓えていたオブジェクト指向絡みの宗教論争が出来たのは嬉しかったです。熱くバトルしたいというのも参加動悸の一つというか大きなウェイトを占めていた部分なので非常に堪能させていただきました。
 さらに、お土産じゃんけんで勝利してεπιさんの記事が丸ごと入った「まるごとεπιστημη特別編集号 (仮名)」も手に入れてきました。サイン二つ目ゲットです。本当にありがとうございました。
 懇親会でも恣意のさんTHREE-ONEさんをはじめとする方々と熱の篭もったお話を出来たのはいい刺激になりました。

 勉強会及び懇親会参加者の皆様お疲れ様でした。そして本当にありがとうございました。
 またの機会にお会いしましょう。

by 長月葵  at 04:45  | Permalink  | Comments (0)  | Trackbacks (0)

久しぶりに本屋へ行きました

 久しぶりに街中へ出てジュンク堂へ。立ち読みしてきました。
 とりあえず評判見て気になってた本を中心に立ち読み。その後、以前立ち読みで買うぞーと決めた本をもう一度品定め。
 結果以下の本が購入リストにリストアップされました。

 プログラムデザインのためのパターン言語―Pattern Languages of Program Design選集
 GoF本買うときには既に目をつけていた本。
 その後本のタイトルを忘れて思い出してからでいいやと放置されていたのが今回めでたく発掘されました。

 ピープルウエア―働きやすい職場をつくる人間関係の極意
 以前立ち読みしたときは買いだと思ってたんですが、昨日立ち読みした感じだとまだ早いって言うか優先度落としてもいいかなって感じになりました。
 なのでリストには入るものの優先度低で。

 プログラマの数学
 お値段ゆえに買いそうになりました。
 2000円台はお安いと感じるのはちょっと危険かもしれません。

 達人プログラマー―ソフトウェア開発に不可欠な基礎知識 バージョン管理/ユニットテスト/自動化
 今長月的に二番目欲しい本。
 長月の今現在の主な興味の方向であるバージョン管理、ユニットテスト、自動化が一冊に詰まってます。これでリファクタリングまで詳しく取り扱ってくれたら完璧だったんですけどね(´・ω・`)

 リファクタリング―プログラムの体質改善テクニック
 続いて今長月的に一番欲しい本。
 評判だけで欲しくてたまらなかったんですが、立ち読みしてみてより欲しくなりました。なんか今でも勢いで発注しそうです。

 ゲーム開発者のためのAI入門
 残念ながら時間切れでこれまで手が回らなかったんですが、久しぶりにタイトルを見かけて「あー、やっぱりこう言う分野すきだなぁ」と再確認した次第です。
 やっぱり長月はローレベル分野だいすきっこらしいです。

 Code Complete第2版〈上〉―完全なプログラミングを目指して
 Code Complete第2版〈下〉―完全なプログラミングを目指して
 第二版が出る前から欲しかった本。
 でも高いんですよね……今回二冊合計12000円超え……orz
 前の版でも8000円ぐらいしてましたしね……(´・ω・`)

 はじめて学ぶソフトウェアのテスト技法
 最近長月大注目のテスト技法周辺です。
 次のプロジェクトでは周りの誰が何を言おうとテストファースト開発をしてやる! ぐらいの勢いでテストの大切さを噛み締め中な長月なのです……orz

by 長月葵  at 02:14  | Permalink  | Comments (2)  | Trackbacks (0)

あー、なるほどー

 Google Mapsでレーシング公開! [tech.nitoyon.com]より。

 長月も技術者の端くれですから、新しい技術って言うのは少なからず気になります。
 その中でも流行り物だけにAjaxには注目してます。
 最近世間の熱も冷めてきたかなと思っていたAjaxなんですが、ここでまた盛り上がりそうな話題です。
 長月が今参加しているゲーム製作サークルでもAjaxを使おうかなんていう話になった(というか誘導した)んですが。あくまでHTTPのスタティックな遷移に縛られない為、或いはサーバサイドプロセスの負荷を軽減する為の技術としての提案でした。
 でもこれはもっとインタラクティビティとダイナミックさを意識した物です。ちゃんとゲームしてると言うといいですかね。アイデアも面白い。
 これに触発されてぐぐる地図を使わずにAjaxの限界を狙うような作りを目指す人も出てくるんでしょうね。

 新技術ではなくなりつつあるAjaxですが、もうしばらくは面白い話題を提供してくれそうです。

by 長月葵  at 00:38  | Permalink  | Comments (0)  | Trackbacks (0)

おー、ゲイシも太っ腹になりましたねー

 VS 2005のExpress Editionは事実上,無償提供へ:IT Proより。

 競合他社(某ランドとか)なんかは早々にIDEを無料にしちゃった訳ですが。EclipseやBCBX等の無料IDEに押されたのかMSもVisual Studioを無償提供する事にしたようです。
 まあ良くある話で実際便利なのはIDEじゃなくて付属ライブラリなんですが、ご多分に漏れずMFCやATLはついてこないらしいです。これは仕方ないですね。
 でも元々がフレームワークライブラリを使ってない長月の様な人にはこの状況は嬉しい訳です。
 一応VCのコンパイラは今までにも無償配布されていたものの、nmakeもついていないぐらいで環境構築が面倒でした。それが今回のIDE無償配布のおかげで楽にMS製コンパイラを試せます。
 実質使うのが特定のコンパイラだとしても、例えばライブラリなどを配布する人なら様々なコンパイラでコンパイルとリンクのテストが出来るのは大きいでしょう。

 そんな訳で試しに落としてみようかなとか思ったりする訳です。

by 長月葵  at 00:17  | Permalink  | Comments (0)  | Trackbacks (0)

まさに……

 BattleProgrammer?'s blog:ぶっちゃけプログラマーって何よ?を読んで。

 今まさに長月がそうですね。
 GUI プログラミングって訳ではないんですが、既に用意されたコンポーネントを利用してプログラムを作るという部分では GUI が絡まなくても同じですね。
 詰まり大規模なライブラリ或いはフレームワーク、もしくは過去の遺産を利用するようなプログラミングなら何でも同じって事です。
 ソフトウェアが大規模化している現代では職人的 PG だけではお仕事にならないと言う事ですね。
 長月も仕様確認しまくりの毎日です'`,、(´∀`)'`,、

 長月はどちらかと言うと職人側なので今の状況は割といやなんですけどね……orz

by 長月葵  at 00:59  | Permalink  | Comments (0)  | Trackbacks (0)

あー、ちょっと読んでみたいかも

 ネットワークマガジン - N-log : 『Winnyの技術』の発売が決まりましたより。

 これ、なんか興味引きますね。
 正味基本的な構造ってのは知れてる訳ですが、具体的な部分とか、何を考えて設計したのかなんてのが読めると楽しそうです。
 作った人が作った物をどう考えて作ったのか解説する本ってありそうでなかなかない物ですから、こう言う本増えて欲しいですね。

 #C++の設計と進化とか見てもそう言う感じの本って面白いとおもうんだけどなぁ。

by 長月葵  at 07:00  | Permalink  | Comments (0)  | Trackbacks (0)

あーなんか実物見てみたい

 言語を分析し、自律的に文法規則を推論するアルゴリズムなんつーのが発表されたとです。
 興味津々です。言語処理って割と萌えます。夢はコンパイラを作る事です。いえ、ちっちゃいのなら作れますけども……

 長月割と言語処理に興味あるみたいで、コンパイラだとか人工無能だとか作りたい人なんですね。
 なんだか随分前にモチベーション切れて以来あんまり触ってないんで忘れがちですが、一応色々勉強したようです。
 今回の技術、人工無能に搭載してみたい感じです。その内人工無能は考えるさんが取り上げそうな気がします(´ω`)

 綺麗にまとまるの期待して待ってるんで頑張ってくださいw>しまりすさん

by 長月葵  at 22:20  | Permalink  | Comments (0)  | Trackbacks (0)

長月葵->Status()->Perl

 てなわけで長月の Perl 力がどれぐらいなのか。
 最近マイブームの何とか判定をやった訳ではないので主観なんですが、とりあえず基準としては http://d.hatena.ne.jp/naoya/20050809/1123563794 で書かれている物を使います。

 レベル4: use strict はもう書き出したら自動書記するぐらいだけど use warnings なんてしてないなぁ。 -w スイッチじゃダメですか?w
 レベル6: CPAN はあまり使わないかなぁ。標準モジュールで足りる事も多いし。まあでも標準モジュールに欲しい物が無ければとりあえず CPAN 見に行くのはやるから○かなぁ。
 レベル7:オブジェクト指向で書くとかモジュール作るとかは CPAN あさる様になる前からやってますがね。なんか学習の順番も割と個人差あるはずだからこのレベル表割と違和感ある人多そう。
 レベル8: AUTOLOAD は知ってるけど使いこなすというかふと使おうと思うほどは習熟してないなぁ。CPAN にモジュール送ったりもしないし。初心者さんに教えたり CGI.pm 使って CGI 作ったりはするけどね。

 どうも当てはまりそうなのはここらまでかな? レベル8についてはちゃんと対応できてるとは思えないのでレベル7ぐらいかな。
 なんか割とやっと中の上ぐらいになったかなと思ってたのは大体あってたみたいです。
 なんだかんだで Perl 使いつづけて四年ですからそれぐらいにはなってても不思議じゃないですね。
 ここを見てる Perl 使いの皆さんは如何ほどでしょうか?

by 長月葵  at 06:16  | Permalink  | Comments (0)  | Trackbacks (1)

リアルタイム/マルチタスクシステムの徹底研究

 良書。
 もうすぐ組込みプログラムをお仕事で書く立場になるので勉強の為に買ってみました。どうやらこの選択は正解のようです。
 組込み系の世界で利用される技術を比較的わかりやすく読みやすくまとめています。
 専門分野の本だけあって少々前提知識を必要としますが、この本に興味を持つ人なら大丈夫でしょう。
 入門者向けの物をお求めなら「はじめて読む486」やなぜ動くのかシリーズをオススメします。

by 長月葵  at 02:58  | Permalink  | Comments (0)  | Trackbacks (0)

えーと、あれー? その後

 なんかどうも糞いMIME エンコード済み文字列を持ってるらしい携帯メールのデータに付いてあれこれ調べてたんですが、 「なんか自力でやらなくても携帯メーカにデータ取り込むソフトあるらしいぞ」と言う事が判明。出来るからって調べる前に動く無計画っぷりが知れます。とりあえずはメーカホームページへ直行。
 しかし眺めてみてもSDカード経由での操作が用意されてない模様。糞い。仕方ないのでUSB経由でと思って携帯を買った時にブツが入ってた袋を探ってみてもケーブルなんぞない。うわ、別売ですか?
 結局自力でやる事に決定……orz

 さらに調べて回って結局解らないので RFC を読みに行く。最初からやっとけよって話なんですが英語読むのめんどくさいんです。日本語訳済みは訳が好みじゃないとか、どこまで正確か信じられないとかの問題で読むなら原版って人なんで。原版でも自分訳がアレなら結局同じとか原版書いた人が間違ってたらって話は棚に上げときます。
 それで RFC 2045 読んで 6.7.5 Soft Line Breaks 辺りが怪しげに見えたりしてやってみました。ソフト改行用の等価記号削除。見事に文字化け解消。それぐらい対応しといてくれ MIME::QuotedPrint ……orz
 むぅ、ライブラリの類は普通それなりにブラッシュアップしてある物と思い込んでたのが敗因ですね。疑ってごめんなさいPで始まる某社の担当の人m(_ _)m

 こんな事だから「これからはモジュールを信用しないで、むしろモジュールまで自作で行くべき!」とか車輪の再発明好きに言い訳を与えるんですよね┐(´ー`)┌

by 長月葵  at 23:47  | Permalink  | Comments (0)  | Trackbacks (0)

えーと、あれー?

 以前書いたメールをうんちゃらのスクリプトなんですが。Perl で MIME::Base64 モジュールと MIME::QuotedPrint モジュール使って復号化してます。
 しかしなにやら文字化けなさるんですよね。んで元データ見てみたらなにやら微妙に不正なデータ。曖昧変換できたらまあいけるんだろうなって感じなんですが、MIME モジュールは割と厳密な変換をするようで化けます。
 これ何とかならないんですかね? オプションとかで曖昧変換出来たりとかしないんですかね?

 ああ、そう言えば use MIME::Explode; してる割に使ってないなw ヘッダの解析にせswitch 文でやっちゃってるよ'`,、(´∀`)'`,、

by 長月葵  at 22:21  | Permalink  | Comments (0)  | Trackbacks (0)

XSLよーわからん(´・ω・`) おかわり二杯目

 こんなとこ見っけた。検索で来た人、うち見てる暇あったらサンプル熟読!

by 長月葵  at 20:14  | Permalink  | Comments (0)  | Trackbacks (0)

XSLよーわからん(´・ω・`) おかわり

 いやもう大変でした。
 メッセンジャーのログ側が改行を <br /> に変換してくれてないので、何とかして改行を <br /> に変換しないと変な表示になる問題がありまして。
 昨日エントリを書いた時点では <pre> タグで囲んで誤魔化してたんですが、何か納得行かないので何とかしようと試みてみました。
 とりあえずは XPath 関数を調べてみて translate 関数が使えるかも? とやってみるも、第二引数と第三引数の扱いを勘違いしていて実は使えない関数だと発覚。
 仕方がないのでスクリプトでやるかとちょちょいと JavaScript を書き書き。しかし <xsl:value-of> タグはタグの位置に対応するテキストノードをべたっと展開するので改行が邪魔。これも上手く行きません。
 次の手をと <xsl:template> タグを用いて再帰的に substring-after 関数と concat 関数に突っ込む事で何とかしようと試みるも、<xsl:variable> は変数が const、これも断念。
 ひたすら悩んだ結果 translate 関数と JavaScript を組み合わせる事にしました。詰まり改行を translate 関数で他の文字に変換、その文字を <br />\\n に再変換です。異様にアドホックで気に入らない解決策ですが仕方ありません。特殊文字代わりとして出現頻度の低そうな半角鍵括弧でも使っときませう。
 しかしこれも問題あり。 JavaScript で定義した関数の呼び出し側でシングルクォートを使っている為、対象のテキスト内にシングルクォートがあるとそのシングルクォートが引数括りの終わりと認識されてそのテキストが表示されません。なんてこった、ここまで来て……orz
 まあでも、さっきと同じ方法でいけるだろと translate 関数の引数にシングルクォートの実体参照を追加、特殊文字代わりに半角鍵括弧の残りを使えばいいかとやってみる物の。実体参照部分が普通のシングルクォート扱いで translate 関数の引数が不正に。ぽまいクォートの実体参照ってクォート内でも同種のクォート使える様に定義されてるんちゃうんかいと、どないせーっちゅうねんヽ(`Д´)ノ
 仕方がないので気持ち悪い物の JavaScript で定義した関数を呼び出す側で引数を括ってるクォートをダブルクォートにする事で凌ぎました。引数で渡してる <xsl:value-of> でもダブルクォート使ってていやんなんですが(´・ω・`)
 多分対象テキスト内にダブルクォートがあるとおかしな動作をする事でしょう……orz
 でも良いんです、長月の場合 MSN でのチャットでは顔文字の関係でシングルクォートは頻出する物のダブルクォートはあんまり出てこないですから(´・ω・`)
 すでにアドホックだし今更気にしないことにします。

by 長月葵  at 20:19  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第四章その5: Decorator

 仕事中に右手人差し指の先を切り、さらに右手中指の爪が割れて先の方が五分の一ほど剥がれかけな長月です。皆様はご健勝でしょうか? 長月は本人も仮想世界への代理人も割と不健康な感じです。皆様はご自愛ください。
 さて、キーボードが少し打ちづらいながらも基本的に左利き寄りの両利きの為割と生活には支障ないのでいつも通りエントリは追加される訳です。今日はもうそろそろ見てる方々も飽きてきたであろう GoF本 第4章から Decorator パターンです。

 Decorator パターンはオブジェクトに動的に責任を追加するパターンです。ロジックとしては前回取り上げた Composite パターンと似ています。Composite パターンは、コンテナとプリミティブなクラスを同じクラス階層に置く事でツリー状にお互いを包含する構造を作り出し、部分と全体に差を無くすパターンでした。Decorator パターンの場合も、Composite パターンでも行われた様に、全体を俯瞰する為のルートクラスを用意し、Decorator に当たるサブクラスではルートクラスのオブジェクトへの参照を持つ事で連鎖します。Composite パターンとの違いはルートクラスのインターフェイスが最大化しない事ですかね。

 Decorator パターンは、個々のオブジェクトに責任を追加し、且つ他のオブジェクトへの影響を最小化すべき時。責任の追加に加えて、責任の削除が出来るべき時。サブクラス化による責任追加が現実的ではない時。等に利用されます。

 Decorator パターンは継承を用いた拡張よりも柔軟です。また、クラス階層の上位のクラスが、所謂「スーパーマンクラス」になる事を防ぎます。
 しかし、ある Decorator クラスが装飾しているクラスはその Decorator クラスと同一ではないので、同一性に期待したコーディングが出来ない。非常に似通った小さなクラスが氾濫する。と言う欠点も持ちます。

 前述の通り Decorator パターンは Composite パターンと似通っています。構造を良く見てみれば内部に持つオブジェクトが一つに制限された Composite パターンに見えます。しかし Decorator パターンはオブジェクトの集約を目的としている訳ではありません。Decorator パターンはオブジェクトに責任を追加します。

 長月は Decorator パターンを余り使った事がないんですよね。もしかしたらやってるかもしれませんが、意識して使った事って少ないです。なんと言うか、動的に責任を追加する場面が余りないというか。そんなトリックが必要になるほど複雑な物を作ってないというか。そもそも殆どプログラム書いてな……げふっ(吐血
 まあそんな訳で今回はここまで、次回はおそらく長月の理解度が本書中一番低い Facade パターンをお送りします。

by 長月葵  at 23:22  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第四章その4: Composite

 今日は構造に関するパターンの三つ目、Composite パターンをお送りします。
 Composite パターンは複数のオブジェクトを合成します。また、合成されたまとめオブジェクトを一様に扱えるのが特徴です。
 プリミティブなオブジェクトを組み合わせる事で複雑なオブジェクトを構成する事はままあると思います。しかし、その時にそれらのオブジェクトを一様に扱う事に困難を覚えた事はありませんか? 例えば、プリミティブなオブジェクトをまとめて扱う方法としてコンテナへの格納は一手でしょう。しかし、プリミティブなオブジェクトとプリミティブなオブジェクトを集めたコンテナは別物です。いくつかのオブジェクトをまとめた物と、単一のオブジェクトを区別なく扱う。それが Composite パターンの提供する合成です。

 Composite パターンでは、プリミティブなクラスとコンテナクラスを同じクラス階層に置きます。詰まり一つの抽象クラスがコンテナでも、プリミティブなクラスでもあるのです。
 例として GUI コンポーネントを考えてみましょう。GUI コンポーネントには、Button や Label、Inputbox の様なプリミティブなコンポーネントや、Window や Panel 等の、他のコンポーネントを内包するコンポーネントが考えられます。Window クラスや Panel クラスは他のコンポーネントオブジェクトを内包するコンポーネントなので ContainerComponent から派生します。Button クラスや Label クラスはプリミティブなコンポーネントなので PrimitiveComponent から派生します。さて、これらを統一的に扱うにはどうしますか? ContainerComponent と PrimitiveComponent に共通の親クラス Component があれば良いですよね。これで Composite パターンの言う形になりました。これは ContainerComponent をノード、PrimitiveComponent をリーフとしたツリー構造と言えます。Composite パターンは、再帰的に複合オブジェクトを構成していくパターンなのです。

 Composite パターンでは、その構成要素であるノードに当たるクラスも、リーフに当たるクラスも区別しません。その特徴によってクライアント側のコードはノードであるかリーフであるかを意識せずにコーディング出来るようになります。また、部分と全体に区別の無い構造なので、柔軟な構成の変更が出来ます。
 しかし、設計を過度に一般化するというデメリットも持ちます。

 実装の面で言えば、Composite パターンは、その構造上ツリー構造の持つメリットデメリットを同じように持つようです。また、ルートに当たるクラスは自らの子孫であるクラスのインターフェイスをほぼ全て持つことになります。これはインターフェイスの最大化と呼ばれる好ましくない設計の一つです。

 Composite パターンは Decorator パターンと共に良く使用されます。この場合、Decorator パターンは Composite パターン側のインターフェイスに合わせる必要があり、若干割を食うようです。
 Composite パターンを用いた構造では、内部の操作に Iterator パターンが良く用いられます。

 Composite パターンは割と良く使われているはずです。なんと言うか、オブジェクト指向の本を読むと必ずこういった感じの設計について書かれてますし。文中で挙げたコンポーネントクラスの様に、素直に考えれば Composite パターンになる場合も多いからです。
 しかしそれだけに、経験だけで書いている方も多いのではないでしょうか? Composite パターンが持つメリットデメリットを再確認する為にも一度勉強しなおしてみるのも一手ですよ。
 では今回はここまで、次回は Decorator パターンをお送りします。

by 長月葵  at 22:57  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第四章その3: Bridge

 構造に関するパターンの二つ目は、前回も書いた通り Bridge パターンです。
 Bridge パターンは Handle/Body とも呼ばれ、割と良く使われているパターンだと思います。Bridge パターンはパブリックなクラスの定義と実装を分離し、それらを独立に変更できるようにしたパターンです。

 実装の分離と言うと pimpl イディオムを思い出しますね。あれも Bridge パターンの一形態だと思います。しかし Bridge パターンでは、実装の分離に関する思惑が pimpl イディオムとは違います。Bridge パターンは、実装上の汎化関係にあるクラスの関係を意味上の汎化関係を分離します。一般的に汎化関係は抽象クラスと継承を用いて表現されますが、クラス階層の中に実装上の汎化関係と意味上の汎化関係が混在すると、それぞれを独立に変更する事が困難になります。
 そんな場合、Bridge パターンを用いて実装と意味の階層を分離します。クライアントが参照する物は意味の階層、意味の階層の中で実装上必要とする物は実装の階層で定義する事で、クラス階層単位でのインターフェイスと実装の分離を実現します。

 Bridge パターンは抽出されたクラスとその実装を分離し、実装を動的に選択したり交換したりしなければならない場合、抽出されたクラスとその実装を両方ともサブクラス化によって拡張可能にする場合、抽出されたクラスの実装が変更によってクライアントに影響を与えるべきではない時、C++のような言語で実装を隠蔽したい時、複数のオブジェクト間でクライアントから隠蔽した状態で実装を共有したい場合等に使用されます。
 C++のような言語で実装を隠蔽するというのはまさに pimpl イディオムですね。一番良く使われる Bridge パターンではないでしょうか。

 Bridge パターンと Adapter パターンはクラス同士を繋ぐという関係では同じです。しかし Adapter パターンは既にあるクラス等、設計後に適用される事が多いのに対し、Bridge パターンは抽出されたクラスと実装を分離する為に、言い換えれば外部に向けた設計と実装を分離する為に、設計の早期に適用されます。

 長月は割と最近まで Bridge パターンを軽視していました。Bridge パターンというより pimpl イディオムですね。Exceptional C++ を読んでからは考えを改めたのですが、実装の隠蔽以外の意味で使用する Bridge パターンも馬鹿に出来ませんね。解っているつもりでやっぱり「ああなるほど」と思う所もいくつかありました。いや、本は読むものです。
 では今回はここまで、次回は Composite パターンをお送りします。

by 長月葵  at 22:03  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第四章その2: Adapter

 今回から数回は構造に関するパターンのカタログです。今回は Adapter パターンを取り上げます。
 Adapter はあるクラスのインターフェイスを別のインターフェイスに変換します。変換と言うとなんだか齟齬があるように感じますね。なんと言うか、所謂ラッパクラスです。

 あるコードの中でクラス Hoge のオブジェクトが使われていた時。何らかの理由で関連性の無い Piyo を同じコードで使いたくなる事があったとします。その時、Hoge と Piyo のインターフェイスがたまたま一致していればコードの修正量は少なくて済みますが、そう言う事は稀で、どうしても Piyo のインターフェイスに合わせて修正する必要が出てきます。Adapter は、Piyo をラッピングしてインターフェイスを合わせる事で、そのジレンマを解消します。長月が実際に遭遇した例で言えば長月の書いた画像クラス AILImage を、とあるライブラリの DIBBitmap 操作関数に渡す為に AILImg2DIBWrapper クラスでラップして渡した事があります。その時は Adapter パターンとか意識してなかったんですが今考えると Adapter パターンですね。これはオブジェクトに対する Adapter パターンと呼ばれます。
 また、上記の例では AILImg2DIBWrappter の中に AILImage のインスタンスを持ち、転送関数で処理を委譲していましたが、向こうのライブラリで用意されている DIBBitmap クラスのインターフェイスと、AILImage の実装を多重継承した AILImg2DIBAdapter も考えられます。DIBBitmap クラスからの継承が必要な場面ではこちらを選ぶべきでしょう。こちらはクラスに対する Adapter パターンと呼ばれます。

 Adapter は再利用したいクラスが望んだインターフェイスを持たない場合や、既存の複数のサブクラスを利用したいが、さらにサブクラス化してインターフェイスを合わせる事が現実的ではない場合、等に活躍します。

 クラスに対する Adapter では、Adapter クラスが再利用されるクラスのサブクラスになる為、メンバ関数をオーバーライド出来ます。その代わり、クラス階層を見たとき、Adapter クラスが再利用されるクラスの下に来るので、再利用されるクラスとそのサブクラス全てを適合させたい場合にはクラスに対する Adapter では上手く行かないという事になります。
 オブジェクトに対する Adapter では、クラスに対する Adapter でのジレンマである、複数のサブクラスを賄う Adapter の構築が可能です。しかし、クラスに対する Adapter と違い、再利用されるクラスのメンバ関数をオーバーライドする事は出来ません。これを実現するには、再利用されるクラスのサブクラスを定義し、そのサブクラスで任意のオーバーライドを行い、サブクラスに対する Adapter を定義する事で実現できますが、余計な間接性を持たせる事にもなります。

 オブジェクトに対する Adapter パターンは Bridge パターンと良く似た構造を持ちます。しかし、Adapter が外部表現 (インターフェイス) に重点を置くのに対して、Bridge は内部表現 (実装) に重点を置きます。また、何らかのオブジェクトをラップする事に関して Adapter パターンは Decorator パターンと似ています。しかし Adapter がインターフェイスを変更するのに対して、Decorator ではインターフェイスを変更せずに機能を追加します。その結果、Decorator の方が透過性が高く、再帰的なオブジェクト構造の構築を可能としています。そして Proxy パターンも再利用されるクラスを自らの背後に隠す点では同じですが、Proxy はインターフェイスを変更しません。

 長月的に Adapter はとても便利です。特にジェネリックスプログラミングで威力を発揮すると思います。ジェネリックスプログラミングでは、ジェネリック関数の内部で特定のインターフェイスを必要とする事が多く、ジェネリック関数に放り込みたいクラスが必要なインターフェイスを持っていない事があります。そう言った時 Adapter はとても重宝します。
 個人的に便利な物が多い構造に関するパターン、次回取り上げるのは Bridge パターンです。所謂ハンドル-ボディイディオムって奴ですね。pimpl イディオムも Bridge パターンと言えますね。C++に於ける pimpl にはソースファイルの依存性軽減とか Bridge パターン本来の目的とは違う物も含まれるので Bridge パターンそのものとは言えないかも知れませんけどね。
 では、今回はここまで。(=゚ω゚)ノシ

by 長月葵  at 18:42  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第四章その1: 概要

 GoF本も割と久方ぶりに読んでる訳ですが、今読むと前よりちょっと理解できる感じです。一応腕上がってるんですかね?
 今回からは第4章に入ります。第4章は構造に関するパターンが詳解されています。構造に関するパターンの要点は二つ。オブジェクトやクラスを合成する事、まとめられたクラスやオブジェクト群がむやみに強く結合しない事です。「分割し、統治せよ」をオブジェクト指向の世界で如何に実現するか、その妙技を集めた章と言えます。
 いくつかのオブジェクトやクラスを合成したいと言う要求は良く発生します。また、それを前提として書かれるクラスやオブジェクトも多いでしょう。しかし、オブジェクトを合成するだけでは不満なのです。複数のオブジェクトやクラスを持ちつつも、それぞれの依存度を最小化したいのです。影響を局所化出来てこそ大きな構造には価値があります。
 本章では上記の様な要求に対する解が七つ詳解されています。その七つのパターンを列挙しておきます。

 構造に関するパターンはそれぞれいくらかの関連を持ちます。設計の軸になる部分で良く使用されたりするので、これらのパターンの複合的な物になる事が多いようです。それらの関連については本章の最後で語られます。本blogでも、最後に取り上げる予定の Proxy パターンのエントリかまとめのエントリで書く予定です。

 個人的に本章は割と好きです。いろいろなロジックに触れるのが楽しいのです。その意味で第5章の振る舞いに関するパターンも面白いトリックが満載で好きです。本章のパターンは割とどっしりとした印象で、第5章のパターンは派手な印象ですね。ぱっと見て効果が実感しやすい第5章のパターンも良いですが、最終的な開発コスト等、地味ながらも重要な部分で威力を発揮する本章のパターンも長月の脳の肉欲を大きく満足させます。
 ただ、これらのパターンは選択が重要になりますので、本章は特に精読して各パターンをしっかり把握しておきましょう。

by 長月葵  at 23:51  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その6: Singleton

 さて、今回は第3章最後のパターン、Singleton です。なんと言うかみんな知ってそうですが……
 Singleton はアプリケーション中にあるクラスのインスタンスが一つしか存在しない事と容易なアクセスを保証するパターンです。複数の選択肢はあれど、同時に一つしか存在してはいけない場合に威力を発揮します。グローバル変数のアクセシビリティにインスタンス数の制限を加えた物と言えます。

 Singleton はその簡単な構造とは裏腹に、インスタンスへのアクセスを制限したりコントロールしやすい、制限を掛ける数が任意に調整でき、状態を持て、C++等の静的メンバ関数の仮想化を許さない言語でも仮想関数を扱える等から、クラスメソッドだけのクラスを使うより柔軟性がある。と言うメリットがあります。

 今までに挙げてきた複合オブジェクトの生成に関わるパターン、Abstract Factory や Builder、Prototype 等はアプリケーション内で複数必要となる事が少なく、高いアクセシビリティを必要とするので、Singleton を用いて実装される事が多いでしょう。それで無くとも Singleton は割と便利なので使用する機会は多いと思います。しかし、Singleton は拡張されたグローバル変数なので、グローバル変数が持つ欠点は多くの場合 Singleton にも当てはまります。

 さて、今回まで何度かに渡って生成に関するパターンを扱いましたが、これらはシステムの構成に柔軟性を与える為の物です。Factory Method に代表されるサブクラス化や、Abstract Factory や Builder、Prototype が威力を発揮するオブジェクトコンポジション、これらは柔軟性を高める為の方法論です。それらを上手く使いこなしたアプリケーションに現れるオブジェクト生成の為の設計パターン、それが第3章で詳解されているデザインパターンなのです。
 デザインパターンは若干の複雑度と引き換えに柔軟性をもたらします。パターンの選択肢が増えれば増えるほど設計は洗練されるでしょう。この機にデザインパターンを勉強してみるのは如何でしょうか?

by 長月葵  at 23:56  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その5: Prototype

 今回は第3章に於ける複合オブジェクトの生成に柔軟性を持たせる為のパターンについての最後の項です。今回は Prototype パターンについてをお送りします。
 Prototype は生成するオブジェクトを雛型から複製する事で賄うパターンです。ですので、クライアントクラスでは生成過程で各部品の生成を各部品のプロトタイプオブジェクトが持つ複製メソッドに委譲します。詰まり、プロトタイプオブジェクトに生成を依頼するクライアントクラス側で適宜プロトタイプオブジェクトを挿げ替えれば様々な組み合わせの複合オブジェクトを生成する事が出来ます。

 Prototype は、インスタンシエートされるクラスがどの様に構成されるかが静的に決定しない場合、詰まり実行時に決定される場合の動的構成や、何らかのクラスに於てインスタンスの取り得る状態が少ない場合に、あらかじめ雛型を用意しておく事でインスタンシエートの手間を省く等の用途で使用されます。

 Prototype パターンも、Abstract Factory パターンや Builder パターンと同じく生成プロセスから生成の詳細を分離します。しかし他の生成に関するパターンよりも実行時の動作に重点を置いている為、他のパターンよりも柔軟性が高く、生成するオブジェクトの追加や削除が容易です。また、柔軟性が高い為、値や構造の組み換えによってオブジェクトの仕様を変更できます。
 構成の柔軟性に於て高いアドバンテージを持つのに対して、実装の面ではいくらかの不利な点を持ちます。Prototype はオブジェクトの複製によってインスタンスを生成するので、Prototype を適用するクラスには複製関数が必須となります。また、複製に掛かるコストが高い場合にも適さないでしょう。ただし、複製のコストは COW (Copy On Write) な実装をする事で軽減できます。しかしそれもまた複雑度を上げるので一つのトレードオフでしょう。

 Prototype は Abstract Factory の実装としても使えます。Abstract Factory に雛型の集合を持たせ、オブジェクトの生成は雛型の複製で行うのです。また、Composite パターンや Decorator パターンの様に、多くのオブジェクトを集約したり連鎖させるパターンとも相性が良いでしょう。これは複合オブジェクトの生成に関するパターンに共通していますね。

 長月は Prototype の理解度が低い上に、使用した記憶もありませんし、オブジェクトの構成は静的に決まって欲しいので動的な構成は注目度が低く、Prototype にはこれと言って言える事が無いんですが、これも何らかの事情で実行時までオブジェクトの構成が決定できない場面に出くわしたら重宝するんでしょうね。きっと、多分、おそらく。
 で、次回は第3章最後の項、生成に関するパターンの大トリ Singleton です。なんか Singleton だけは今更何を言うまでも無くみんな知ってるんじゃないかという気がしないでもないんですが、順番なので次は Singleton をお送りします。ではまた。

by 長月葵  at 23:57  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その4: Factory Method

 第三章のパターンも今回で半分以上をクリアですね。今回は Factory Method をお送りします。
 Factory Method はオブジェクト生成の為のインターフェイスだけを規定して、実際の生成はサブクラスに任せます。これは結構頻繁にやりますよね。本によっては仮想コンストラクタと呼んでいます。

 あるクラスの中で別のクラスのインスタンスを利用するが、実際に利用するクラスが事前に解らない状況は割と頻繁にあると思います。特にライブラリ等、後にも多用する予定のクラスなんかはそう言う状況も多いと思います。そう言うときには Factory Method の出番です。多くの場合コンストラクタの中で new すると思いますが、そこを生成関数に書き換えてしまいます。そして生成関数は仮想関数にしてしまうのです。後は違うインスタンスを返したい時には適宜欲しいインスタンスを返す生成関数を実装したサブクラスを用意するだけです。

 Factory Method は特定の実装をコードから分離します。これは Abstract Factory や Builder もそうであったように拡張や入れ替えを容易にします。
 ただし、Factory Method にはサブクラスの定義を強要すると言う欠点もあります。特にサブクラスを必要としていない時には一つの悩み所でしょう。これに対して、C++ではテンプレートを使うと言う選択肢があります。テンプレートパラメータによって返すオブジェクトを返す生成関数を持つクラスを用意するのです。或いは生成関数をファンクタにしてしまうのも良いでしょう。ポリシークラスという選択肢もあります。テンプレート様様ですね。

 Abstract Factory や Template Method は良く Factory Method を利用します。
 Abstract Factory は Factory Method を用いて実装されますし、Template Method は Factory Method を内部で呼び出します。Abstract Factory のエントリで書いた CreateWindow() 関数は Factory Method に当たります。

 Factory Method はそれなりに熟練した方なら言わずとも利用しているであろうパターンです。特にC++等ではコンストラクタを仮想にする事が出来ないので自然とこう言う手法を編み出す人も多いようです。長月は自力で編み出した訳ではありませんが、Effective C++ で仮想コンストラクタの手法を知って以来、GoF本を買うまで Factory Method とは知らずに利用していました。知らない方もこれを機に Factory Method を含めたデザインパターンを勉強してみては如何でしょうか?

by 長月葵  at 23:59  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その3: Builder

 今回は生成に関するパターンその2、Builder パターンです。
 Builder も Abstract Factory に似て、実装を差し替える為のパターンです。 Abstract Factory が利用するオブジェクトの実装を差し替える様に、Builder はオブジェクト生成の実装を差し替えます。詰まり、Abstract Factory がオブジェクトの実際を気にせずオブジェクトを生成出来るようにしたのと似て、Builder はオブジェクトの構成や、それを実現する為の機能を気にせずに生成出来るようにします。Abstract Factory が生成されたオブジェクトのインターフェイスの共通性に主眼を置いているのに対し、Builder は生成されるオブジェクトの生成過程の共通性に主眼を置いています。
 えーと、解りにくいですね。要するに、同じ生成ルーチンで色んなオブジェクトを生成出来るようにすると言う事です。

 これは生成したいオブジェクトがたくさんの部品や組み合わせで構成されている場合等に有効です。また、内部表現の差し替えが用意になります。これは生成の為の実装詳細が局所化されると言う事も意味しますし、詳細が局所化されるという事は、それらを利用する生成過程の細かいコントロールが可能になると言う事でもあります。

 Builder パターンはしばしば Composite パターンと共に使用されます。何らかの複合 (Composite) オブジェクトを生成する為に Builder が利用されるのです。また、Builder が必要とする部品を提供する為に Abstract Factory や Factory Method も利用できるでしょう。

 今回はジェネリックスプログラミングに近い立ち位置にあるパターンである Builder を紹介しました。生成に関する限り、Builder はポリシークラスの様な役割を果たします。個人的にはポリシークラスの方が好みなので余り出番がないんですが、ジェネリックスプログラミングのパラダイムをサポートしてない言語を使うときには便利そうです。
 さて、本エントリで Builder に興味を持たれた方、是非本書や増補改訂版Java言語で学ぶデザインパターン入門等でデザインパターンを勉強してみては如何でしょうか?

by 長月葵  at 23:26  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その2: Abstract Factory

 前回投稿後すぐに書き始めたのに途中で寝ちゃったおかげで結局この時間ですよ'`,、(´∀`)'`,、
 ついにパターンのカタログまで来ました。今回は Abstract Factory パターンです。

 Abstract Factory は何らかのインスタンスを必要とする時に、その実装に関わる具象クラスを明確にせずに生成する為のマネージャクラスを用意するパターンです。それなりに構造化された設計のプログラムなら、HogeManager とか HogeCreator 見たいなクラスがあったりするでしょう。そう言ったクラスは多くの場合 Abstract Factory を用いて設計されているのではないでしょうか。
 このパターンは、抽象クラスとサブクラスを用いて場合によって実装をスイッチする際等に活躍します。本書に載っている例で言えば、複数の look-and-feel 規格に対応したアプリケーションを書く場合、実際に使用する look-and-feel に拠らないウィジェットクラスを書くために Abstract Factory を利用しています。

 Abstract Factory を簡単にまとめると、何らかのオブジェクトの集合に対して複数の実装系がある時、生成用のアクセスポイントを持つマネージャクラスを用意し、実際の生成はサブクラスに任せる構造です。
 例えば、複数のプラットフォームに対応したアプリケーションを書く場合、各プラットフォーム向けのGUIコンポーネント群を定義するでしょう。その時、実装に拠らず同じオペレーションで同等の機能を呼び出す為に、各コンポーネントは抽象基底クラスから派生して実装するかと思います。しかし、生成する場面で特定の実装に触れたくないのです。Window* w = ComponentFactory::GetInstance()->CreateWindow(); で Win32 も Mac も X-Window もフォローしたいわけです。そこで生成の為のインターフェイスを持つマネージャクラスを用意し、それを派生して各実装のコンポーネントを生成するサブマネージャクラスを定義します。後はプラットフォームにあわせた具象クラスを抽象マネージャクラスに代入して、コンポーネントの生成は抽象マネージャクラスを通せばよいのです。また、Singleton パターンや Factory Method パターンとの併用も良く見られます。

 ただし、パターンもいい事づくめと言う訳ではありません。メリットがあればデメリットもあります。AbstractFactory に関しては、インターフェイスの追加や削除を含む変更に弱いと言うデメリットがあります。インターフェイスの追加や削除が行われるとサブクラスまで手を加えなければなりません。この問題に関しては Andrei Alexandrescu が Modern C++ Design にて一つの解答を示しています。

 生成に関するパターンはC++に於ける不可避の定数性、詰まり new 構文でクラス名が既知でならなければならない問題を最小化します。これは動的に型付けする言語では問題にならないのかもしれませんが、静的な型付けを行う言語ではまず確実に問題になる部分です。長月はC++ぐらいしかまともなOOPLに触れていないので他の言語の事情を知りませんが、生成に関するパターンはC++でそれなりに良い設計と実装を行いたければ必須の構造に思えます。
 今回はそれらの生成に関するパターンの中で、Singleton や Factory Method 等の小さい粒度のパターンを除けば最も頻出するであろう Abstract Factory を紹介しました。本エントリで Abstract Factory に興味を持たれた方、是非本書や増補改訂版Java言語で学ぶデザインパターン入門等でデザインパターンを勉強してみては如何でしょうか?

by 長月葵  at 23:51  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第三章その1: 概要

 改めて読むとGoF本結構退屈ですね。第2章は面白いのに(´・ω・`)
 今回から第3章に入ります。ここからはパターンのカタログなので、パターンの紹介の様な形になるかと思います。今回は第3章の概要です。続けて次のエントリで Abstract Factory パターンについて書きたいと思います。

 第3章では生成に関するパターンを扱っています。生成に関わるパターンのキモは二つ。生成されるオブジェクトの詳細を如何に隠蔽するか。そして実際の生成の詳細を如何に隠蔽するかです。
 あるオブジェクトのクライアントはオブジェクトに対する必要条件だけを持っていたいのです。言い換えるとインターフェイスの知識のみで必要なオブジェクト群を扱えるのが理想なのです。その為に、生成されるオブジェクトの詳細を如何に隠蔽するかが重要になります。
 また、クライアントではオブジェクトの生成をハードコードしたくないのです。具体的に言うと、new Hoge; 等とはしたくないのです。前述した方法の場合、Hoge の生成方法が new では無くなった場合ソースを書き換える必要があります。それは勘弁願いたいのです。なので、生成に関する知識の隠蔽も重要になってきます。
 本章では上記の様な要件を満たす為のパターンを五つ詳解しています。その五つのパターンを列挙しておきます。

 本章ではこれらの実装例として迷路生成プログラムを使います。迷路の生成エンジンを各種パターンを適用して設計する事でそれぞれの違いを明確にします。ここをそれなりにちゃんと読まないと実装の説明を見ても何の事やら判らないかも知れません。気合を入れなければならないと言う程ではないですが、油断はしないようにしましょう。

 本項は概要の説明なので、特に技術的な事は出てきませんが、生成に関するパターンの思想が解説されています。プログラミングに於て今実装中の物の目的や思想、そして理想がわからないのは無用の混乱を生みますから、生成に関するパターンが何をどの様に目指す物なのかをきちんと把握しておきましょう。

by 長月葵  at 23:26  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第二章

 と言う訳で、GoF本第二章です。なんか妙にだめだめな気分なのでさくっと行きます。
 第二章では実例を挙げてデザインパターンの使い方を解説しています。本章で実例として上げられているのはワープロソフトです。文章、絵、図を自由に配置でき、ウィンドウシステムや look-and-feel 規格への依存を最小化し、オペレーションを統一的なメカニズムで扱う、と言った設計上悩ましい部分にデザインパターンを適用する事で柔軟性を持たせます。
 本章で使われるパターンは、Composite パターン、Strategy パターン、Decorator パターン、Abstract Factory パターン、Bridge パターン、Command パターン、Iterator パターン、Visitor パターンの計八つ。それぞれのパターンについては今後のエントリに譲りますが、Composite パターンで内部表現を定義し、Iterator パターンで走査し、Strategy パターンで操作とデータ構造を分離し、Abstract Factory パターンでオブジェクトの生成とクラスの詳細を切り離し、Bridge パターンで概念と実装を分離し、Decorator パターンでUIに柔軟性を与え、Command パターンで操作に拡張性を与え、Visitor パターンで操作の実装への依存を最小化する実例を挙げています。
 なんと言うか、用意された綺麗な例である事は承知の上ですが、思わずお見事と誉めたくなる仕事です。読者をデザインパターンの世界に引き込みます。実際できるのであれば自分でもこういった綺麗な設計を行いたい物です。ですから、こういった綺麗な例を見せられると嫌が応にも期待が高まります。

 そんな訳で、第2章は割とへーと思うことが多いです。色々勉強できます。読む人のレベルによってはああ、そうそう、そうだよねと共感出来るでしょう。
 本章は読むのが楽しい場所でもありますから、カタログ部分が重いと感じる方はここから読んでみては如何でしょうか?

by 長月葵  at 23:56  | Permalink  | Comments (0)  | Trackbacks (0)

GoF本第一章

 なんていうか最近チョイスする本がC++ユーザに媚びてる感のある長月です。と言う事で今回は特定のプログラミング言語に拠らない物をとGoF本をチョイスしてみました。ていうかOS【第二版】はどうしたって? 避けてるんですよ、重いから。正直しょっぱなからあれは後悔しまくりです。とりあえずは今月中に何とか……orz

 そんな訳でGoF本です。Erich Gamma/ Richard Helm/ Ralph Johnson/ John Vlissides著、本位田 真一/ 吉田 和樹 監訳、オブジェクト指向における再利用のためのデザインパターン改訂版です。
 デザインパターンを簡単に説明すると、良い設計に現れる定石を一般化した物です。本書はそのデザインパターンと言う考え方 (定石を一般化、カタログ化して共通認識を作ると言う考え方) を提唱したガンマ先生以下四名、所謂 Gang of Four が世に送り出した論文や、パターンコミュニティで提案された、良い設計に頻出する厳選された23のデザインパターンの解説書です。今回から数回に分けて本書について書いていきます。
 なお、本書については、パターンの紹介に近い形になるかと思います。なんと言うか他に書き様が無いとも……げふんげふん。

 そんな訳で今回は第1章について書きます。
 第1章はデザインパターンとは何かから始まり、本書で用いられている、デザインパターンのカタログの一項目としての整理の仕方、小見出しとそれに対するトピックの意味等の説明、本書で扱うデザインパターンの列挙と軽い説明、デザインパターンを設計に適用する際の指針と注意等が書かれています。
 プログラミングを嗜んでる方ならデザインパターンと言う単語を見た/聞いた事がある方多いんじゃないかなと思います。でも単語は知っててもそれ何? と言う方も居られるんじゃないでしょうか? 本書で語られるデザインパターンとは、プログラミングの主に設計によく現れる定石の事、またはそれらの設計を一般化・カタログ化して共通認識を作ろうと言う考え方を言います。よく見る用法は前者ですかね。デザインパターンは粒度が様々なので、実装レベルに関わる事も多いのですが、デザインパターンは設計レベル、実装レベルの定石に関してはイディオムと呼ぶ事が多いようです。
 本章では定石をカタログ化する事の意味や Gang of Four の推奨するパターンのまとめ方等が解説されています。余り知られていないけどこれは割と応用が広くて良いんじゃないかと思うパターンをお持ちの方は、ここで提示されているフォーマットに従って文書化し、デザインパターンのコミュニティに投稿すると良いでしょう。
 また、本章ではデザインパターンを設計に適用する為のあれこれも解説しています。これはデザインパターンの適用と言う観点で書かれてはいる物の。デザインパターン自体が既に広く使われている設計の定石である事から、設計に関する一般的な考え方のトピックでもあります。個人的にパターンそのものよりもここで触れられている事をしっかり押さえる方が重要なんじゃないかと思います。デザインパターンを使いながら覚えるのが実践的ですかね。

 と言う訳で、もはやバイブルと化した感のある本書ですが、何気にデザパタ自体を知らない様な方もまだいます。そんな方には是非読んで欲しい本です。本書では重いと言う方は、結城浩氏の増補改訂版Java言語で学ぶデザインパターン入門辺りが割と易しくてオススメだそうです。長月は読んでないのでなんとも言えません。
 長月としてはデザパタはとにかく広まって欲しい物なので是非ご一読を。

by 長月葵  at 23:51  | Permalink  | Comments (0)  | Trackbacks (0)

Exceptional C++ 5~8章

 あ~もう眠い、だるい、やるせない、なんかお疲れ。だから今日の感想文なし。
 ……嘘です。書きます。読んだのに書かないのなんか勿体無いですから。貧乏性です。
 今日も今日とてC++、昨日に引き続いてハーブ・サッター著Exceptional C++ 47のクイズ形式によるプログラム問題と解法 5~8章です。

 え~、まず第5章はシグニチャの自動照合、ネームスペースに関しての規則に関するあれやこれやについての問題が収録されています。
 長月はネームスペース内で宣言・定義された関数の呼び出し順序とか規則とかを知っていても理解しきれてなかった様で、初めて本章を読んだ時「おぉ!?」と思った記憶があります。言ってしまえば重箱の隅をつついたトピックなんですが、今時のC++ユーザならネームスペースは極普通に使っているでしょう。そして普通に気を使っていれば大抵の場合問題は無いはずですが、レアなケースで厄介なロジックエラーを起こす場合があります。そう言った場合、殆どのケースでは本章で書かれている様な事が起きているんじゃないかと思います。そんな事例滅多に無いよと読み飛ばさずに、一通り頭に入れておきましょう。

 第6章ではメモリ管理にまつわる問題を取り上げています。
 言ってしまえばよく見かけるトピックです。配列とポリモルフィズムは相容れないとか、メモリ管理はポインタのラッパでやろうぜとかそう言ったトピックです。ただ、取り上げているポインタのラッパクラスが auto_ptr なのが特徴的と言えば特徴的です。この手の話題では大抵の場合 auto_ptr は使えない例として少しだけ書かれて本題は参照カウントとかリンクリストとかでスマートポインタを実装する事であったりするのですが、本書ではSTLに拘っているのか auto_ptr を上手く使おうぜと言った事が書かれています。
 また、本章では operator new や operator delete の自作に関しても触れていますが、これも多くの場合に見られるちょっ速なアロケータとか空間効率の良いアロケータと言ったトピックではなく、エラーを起こさない、例外安全で例外中立なアロケータを実装すると言う安全性を重視した内容になっています。

 第7章では、よく陥る罠、落とし穴、反イディオムと言った所謂アンチパターンについての問題を扱います。
 オブジェクトの生存期間に関するトピックは割とああなるほどと思えました。でも、他のトピックはああこれどこかで読んだなと言った感じでした。流石にもう自己代入チェックとか暗黙の型変換はだめぽとか飽きてきました、だって大抵の本に書いてあるんだもん(´Д`;)
 ああ、「例外安全で例外中立な代入演算子 (或いはコピーコンストラクタ) ならば自己代入チェックは要らない、自己代入チェックのメリットは本当に自己代入が起きた時にのみ効率的なだけ」と言う主張にはへーと思いました。が、長月は何故そう言えるのかをちゃんと理解出来てない気もします。

 そして最終章の第8章です。第8章は分類しにくいトピックをいくつか扱います。なんと言うか個人的には読み物的な章でした。他の章に比べて難易度設定も低いようです。
 長月は第8章最初の問題からしてやられました。T t(); と言う記述、これだけで冷静に見れば T 型の値を返す引数をとらない関数の宣言です。しかしこれが変数の宣言・初期化のすぐ下にあったら? 長月は思わず変数の宣言 (定義) に見えました。ばっちり引っかかって誤読です。
 本章では const についても扱っています。この const、エラーとかが沢山出るとめんどくさくなって思考停止に陥るんですよね、結果 const 外すとか安易な道に走るか、良く考えずに思いついた事やってみてより大きなエラーを作りこむか、なんにしても悲惨です。そんな const の使うべき時使わざるべき時を割と丁寧に解説しています。特に「例え内部状態を変更しても外部から見た状態が変わらなければその関数は const である」は目から鱗でした。mutable の存在理由がやっと理解できました。
 そして最後のトピックである制御フローも興味深いトピックでした。自分が意図した以上に多くのパスが存在する事もあると自覚させられました。もうちょっと注意深く読んだり書いたりしなければと思わせます。

 いつもの如く駆け足なのか鈍足なのか、参考になるのかならないのか良くわからない文章ですみません。参考意見が欲しくて立ち寄って下さった方の為に書いておきます。
 本書は初心者の方にはオススメしません (内心却って初心者の内に読ませた方が良いかもとも思いますが)。しかし、貴方が少しはC++を使えると言う自覚があるのならば一見の価値ありでしょう。また、効率の良いコーディングの本は読み飽きた、安全で頑強なコードの書き方が知りたいと言う方も読んでみるべきだと思います。
 解りやすい文章が書けないのが申し訳ないと思いつつ本書についてはここまでで筆を置きます。

 ――――誰かの参考になる事を祈りつつ。

by 長月葵  at 22:37  | Permalink  | Comments (0)  | Trackbacks (0)

Exceptional C++ 1~4章

 いやもういい加減囲碁関連のトピック書けっつーんですよね。ぽまいこのblogの閲覧者の8割が囲碁関連のページから来てるの知らんのかと小一時k(ry
 ああもう、解ってるんですよ? だからなんか書かなきゃナーとか思ってるんですよ? でもね、今月読書強化月間だし読みたい本がコンピュータ関連ばっかりだしで仕方ないんですよ。
 と、一通り言い訳した所で読書感想書籍紹介文へ。今回から2回に分けて紹介予定の本はハーブ・サッター著、浜田真理訳、浜田光之監修、 Exceptional C++ 47のクイズ形式によるプログラム問題と解法です。
 本書はクイズと言う形式にする事で、実際のプログラミング現場で求められる経験の学習を意図した物です。普通の学習書がボトムアップの発想であるのに対し、本書はトップダウンの発想で書かれています。その点で言えば以前紹介した Accelerated C++ と同じです。しかし二者には大きな違いがあります。はっきり言って Exceptional C++ は初心者さんにオススメできません。理由は追々述べます。

 さて、本書はクイズ形式を取っている訳ですが、第一章の項目一、詰まり一問目から飛ばしてます。
 第一章はジェネリックスプログラミングとSTLについての問題ですが、項目一のイテレータにまつわる間違いを探す問題からして割といやらしい問題です。長月は一応なんとか気付きましたが、e.insert( --e.end(), TodaysDate() ); これ、どこが何故間違いなのか解りますか? おそらく長月は問題として出されてなかったら気付きませんでしたし、怪しいと思っても Why? の部分が解るまで考える事は無かったでしょう。もうしょっぱなから難易度高いです。項目二で早速 char_traits いじってるのもうわーと思いました。
 この辺りが初心者さんにオススメできない理由です。文法や機能の理解であっぷあっぷしてる段階の人達には難しすぎるんです。

 では気を取り直して第2章へ進みましょう。第2章では例外に対して安全なコーディングについての問題です。
 C++で例外を駆使すると、何気に色々な所に潜在的な危険を孕む事になります。何気なく書いたコンストラクタは例外を投げてもリソースリークしない? 何気なく書いた関数はちゃんと例外を呼び出し元に投げる? 例外安全で例外中立なコードを書いたつもりで副作用を残してない? 第2章ではそう言った視点でコードを見つめなおす為の問題が出題されます。
 例外安全なコンストラクタと例外安全な swap メンバ関数で実装する例外安全な代入演算子なんかのテクニックは必見です。

 第3章では、クラス設計と継承についての章です。この章に出て来る問題は色々な書籍や掲示板やMLで見かけた事のある様な物でしょう。しかし、解決の為のテクニックに注目すべき物があります、理由や意味をC++で素直に表現する方法が書かれています。
 値のセマンティクスを持つクラスの型変換や演算子のオーバーロード、関数のオーバーロード・オーバーライドとそのどちらでもなく外部スコープの同シグネチャを隠す関数、public 継承と private 継承の違いとそれらの意味、Pimpl イディオムの効用と注意点、実装継承とコンポジション、本章ではこれらの問題を扱います。

 第4章では、依存性にまつわる問題を扱います。ヘッダのインクルードや Pimpl イディオム再び、前方宣言の駆使、継承からコンポジションへそして Pimpl の後ろ側へ、Pimpl イディオムを詳しく、Pimpl の最適化、等の問題が用意されています。
 ヘッダのインクルードに関しては目から鱗でした。考えてみれば目に見えない依存性を生み出している事にとても驚いた物です。また、Pimpl イディオムの有効性を軽視していた事も教えられました。お前は本当にデザパタを勉強してるのかと小一時間……orz

 本書は難易度が高いです。いや、難易度が高いのではなく、高級な話題が多いです。低レベル機能の実装でも高レベルの視点から考えます。実際、問題も難易度の高い物が多く、解説もいくらかの習熟と経験を必要としています。やはり初心者の方においそれとオススメ出来る物ではありません。しかし、だからこそ有益な情報が多かったと思います。
 中級以上だと自負する方、本書を読んで一歩先へ行ってみませんか?

by 長月葵  at 23:48  | Permalink  | Comments (0)  | Trackbacks (0)

Accelerated C++ 13~16章

 どもども、何気にまにあわなさげでひやひやな長月です。
 今日はアンドリュー・コーニグ、バーバラ・E・ムー著、Accelerated C++ の13~16章をお送りします。これで Accelerated C++ に関しては最終回となります。

 今回の一つ目は第13章、第13章では、ついにOOPの華である継承と動的バインド、所謂ポリモルフィズムを扱います。
 本章も基本的には普通にC++の勉強をしてきた人なら問題ないかと思います。退屈なクラスの説明を読んできた人でも、本章で語られる基礎は抑えているでしょう。ただ、13.4項のハンドルクラスに関するトピックは割と重要です。結構知っている人は多いはずですが、意外とこういう設計通りに実装出来てない (或いは設計の時点で出来てない) 事が多いようです。

 第14章では、メモリ管理の半自動化を行います。前章で製作したハンドルクラスを一般化して、所謂参照カウント式スマートポインタに仕立て上げます。
 それなりにC++を使った事があるなら、ポインタデータメンバを持ったクラスを書いた事がある人は多いでしょう。大抵の場合 "リソースの獲得は初期化" イディオムに従ってコンストラクタでインスタンスを得、デストラクタで解放すると思います。しかし、前章から本章までで扱ったようなハンドルクラスとかホルダクラスとか呼ばれるクラスを書く時に困った事はないですか? 長月はあります。どうしてもこう言う関数が欲しい、でも包みたいクラスの書き換えは出来ない。そんな時の一般的な解決法を知りたいなら14.4.1項を熟読しましょう。

 第15章では、第1~2章や第5章等で登場した文字列の入力を受けて、入力された文字列に装飾を施して出力するプログラムが再登場します。本章ではこのプログラムをデザインしなおす事で、ポリモルフィズムの実際への適用と、設計の基本に触れています。
 基本だけあって、既にC++をそれなりに学んだ方や他の言語での経験が十分な方には退屈かもしれません。そういう方が求めているのはもっと技術的な事でしょう。しかし、基本だけあって大切な内容なので、入門書として本書を読んでいる方は要熟読です。また、これぐらいの事は知ってると言う方も、復習の意味でそれなりに気をつけた方が良いかと思います。

 最後の章である第16章では訓戒を述べています。たった3ページの小さな章ですが、ここに書かれている事を心に留めておきましょう。

 さて、四回に渡ってレビューしてきた本書はここで終わりです。本書は入門書でありながら中級、もしかすると上級のC++使いにも有益な本です。C++をかじってみた物の教科書が悪くて食傷した方、なんとなく使ってきたけどもうちょっときちんと使っていきたい方、もう腕には自信があるけど基本を振り返りたい方、新人教育でお悩みの方はこの機に一読してみては如何でしょうか?

 <<8~12章 目次

by 長月葵  at 23:52  | Permalink  | Comments (0)  | Trackbacks (0)

Accelerated C++ 8~12章

 今日も今日とて読書の日々です。考えてみれば読書強化月間とか言わなくても本読んでるよなぁ普段から。とか思わないでもないのは内緒です。
 さて、今日の一冊はお馴染みアンドリュー・コーニグ、バーバラ・E・ムー著、Accelerated C++ 効率的なプログラミングのための新しい定跡 8~12章です。

 前回にも言ったとおり、8章からは抽象度の高いプログラムを自分で書く立場に変わります。その手始めとして第8章ではジェネリック関数の書き方を解説しています。
 ついに出ましたテンプレート。長月的にはもう無くてはならない物です。テンプレート大好き。
 この章では、テンプレート関数とイテレータを使って総称的な関数を書いていきます。実質各種イテレータの解説がほとんどです。

 第9章では、ついにクラスが登場します。ここから第12章まででユーザ定義型を定義する為に必要な事を解説していく展開です。
 今までにも実質的に同じ物である構造体は出てきていましたが、メンバ関数などは定義していない所謂POD (Plain Old Data) でした。今回は構造体ではなく、メンバ関数も含めてクラスを定義します。以前、第四章の所で少し書いたように、構造体と共にヘッダに追い出されていた関数群がメンバ関数になる流れです。
 この章の内容は普通にC++の本を読んでいたら当然の如く知っているはずの事ですね。要するにカプセル化に気を使えとかそう言った類の事です。

 第10章では、メモリとデータ構造の詳細に触れていきます。他にはファイルへの入出力も少し扱っています。
 ここでやっとポインタの登場です。ポインタが絡むと一気にややこしくなるのがC/C++なので、こうやってポインタを後回しにするのは良い方法だと思います。C言語ではそうもいきませんが(´・ω・`)
 内容としてはポインタの絡む事をあれこれ、関数ポインタや文字列リテラルなんかにも触れています。また、メモリにまつわるあれこれも解説しています。記憶域クラスに関することやコンストラクト・デストラクトに関する事なんかが主です。
 この章もまともに学習していれば問題ない所でしょう。

 第11章では、抽象データ型を定義します。具体的には vector のクローンを作成する事で、抽象度の高いコンテナ等の書き方を学びます。
 この章のキモはコピー絡みの部分でしょうか。代入演算子やコピーコンストラクタの定義にまつわるトピックスはしっかり理解しましょう。コンテナ型に限らず、値のセマンティクスを持ったクラスの定義に役立つ理論です。

 第12章では、値のセマンティクスを持ったオブジェクトの定義を学びます。値のセマンティクスを持つと言うのは、言い換えればプリミティブ型と互換の動作をするオブジェクトと言う事です。
 この章で気をつけるべきは、変換に関する問題と演算子ですね。これらの定義を誤ると構文は正しいのに意味が間違っていると言う見つかりにくいバグの元になります。この辺りの事はしっかり理解しておきましょう。

 今回読んだ部分は、基本でありながら重要な部分です。文法に関しては割とすぐ覚えられると思いますが、ユーザ定義型を定義する際に気をつけるべき事等、論理的な部分に関しては気が付けば間違っていたと言った事が良く起きる部分です。これらの部分は気をつければコーディングの手間を減らし、誤ると後に手痛いバグとして帰ってくる部分なので、しっかりと理解できるまで何度でも読むべき部分でしょう。
 とか言いつつ長月もそうしなければならない程度のヘボプログラマなんですが(´・ω・`)

 さて、長らく続いた本書のレビューも次で最終回です。次回は13~16章を取り上げます。本書のレビューが終わったらまた何かC++関連書籍のレビューをしたいと思っているのでC++使いの方お楽しみに。では今回はここまで、さようならノシ

 <<6~7章 目次 13~16章>>

by 長月葵  at 21:55  | Permalink  | Comments (0)  | Trackbacks (0)

オペレーティングシステム【第二版】 第2章 (後編)

 え~と、ごめんなさい。「今日は豪華三本立て」と言いつつ「今日」に間に合いませんでしたorz
 さて、あおいろ日記豪華三本立て読書感想文フェア最後の一本はここ数日ですっかりお馴染み、A.S.タネンバウム、A.S.ウッドハル著、オペレーティングシステム 設計と理論およびMINIXによる実装【第二版】 第2章の後編です。

 第2章の後半である第6項はプロセスの実装についての解説です。例としてMINIXのソースコードを挙げています。6.1項から6.4項では、ソースファイルやヘッダファイルを収めたディレクトリの構成を解説しています。また、重要なヘッダファイルに含まれる定数やマクロに付いても触れています。特に6.4項はプロセスのデータ構造体の定義が解説されているのでよく読みましょう。
 6.5項から6.7項は初期化に関しての解説です。6.5項でブートストラップ、6.6項で初期化ルーチンおよびルートプロセス、6.7項で割り込みベクタについて解説しています。ここらはとても重要です。ブートストラップコードがないと何も出来ませんし、少なくともキーボードとクロック割り込みに対応しないと何も出来ません。正直この辺り重い話題ですが頑張りましょう。
 6.8項と6.9項はIPCとスケジューリングについて。カーネルの特徴を大きく左右する部分です。マイクロカーネルを採用するのであればIPCには特に注意を払うべきでしょう。
 6.10項ではハードウェアに依存する部分を解説しています。理屈に関してはそう難解ではありませんが、設計や実装を行うとなると、ハードウェア依存の部分をどれだけ切り離せるかがほかに大きく影響します。ハードウェアを隠蔽できるのであれば他の部分を高レベルで一般化でき、多くのマシンアーキテクチャに対応できるでしょう。
 6.11項ではカーネルだけでなく一般にも公開されるユーティリティライブラリや、カーネルのみが参照するライブラリ等を解説しています。この項は関数の使い方を解説しているだけなのでさらっと読み下せるでしょう。

 第2章の後半は特に骨のある内容になっています。正直読んでて眠いです。重いです。しんどいです。気合が要ります。でもそれだけに重要で飛ばせない部分が多いので気合を入れて読みましょう。

 いい加減囲碁関連のエントリ書かないとお客さん減るなと思いつつ今回はここまで。ではまた。

by 長月葵  at 00:48  | Permalink  | Comments (0)  | Trackbacks (0)

Accelerated C++ 6~7章

 あおいろ日記豪華三本立て読書感想文フェア第二弾は、アンドリュー・コーニグ、バーバラ・E・ムー著、小林健一郎訳、 Accelerated C++ 効率的なプログラミングのための新しい定跡 6~7章です。
 今回はC++を便利に使う事に注力した前半部分の締めくくりです。8章以降は使うだけではなく、機能を提供する際に特に役立つ機能の解説へと移っていきます。それでも使う事に主眼が置かれている事には変わりませんが。

 まず第6章では、第5章までに学んで来たシーケンシャルコンテナに対して、STLに用意されているアルゴリズムを適用する事を解説しています。後、記憶域クラス指定子が初登場します。意外な事にここまで出てきてなかったんですね。
 この章は、言ってしまえばいくつかのアルゴリズム系関数の使い方を見ていくだけです。しかし、課題を工夫する事でイテレータアダプタやリバースイテレータ等、必要な事は大体網羅しています。
 私見ですが、コンテナやイテレータの扱いには慣れている人でも、意外とイテレータアダプタを知らなかったりする事が多いようです (使う必要が無い事も多いのは確かですが……)。心当たりがある人は本章で慣れておくと良いでしょう。

 第7章では、連想コンテナを扱います。連想コンテナの例題としてはお馴染みのワードカウントや対応表、英文の自動生成の製作を通して主に map の解説を行っています。
 例題のプログラムを見ていると、なにやら懐かしい気持ちになります。大抵の人は上記の様なプログラムで map の勉強をしたのではないでしょうか?
 すでに連想コンテナをバリバリ使ってる人は昔を懐かしみながら復習するのも良いでしょう。

 さて、第7章までで抽象度の高いライブラリを使う事に関しては学べました。次章からは自分が抽象度の高いプログラムを書くにはどうすべきかに注力して展開していきます。しかしOOPらしくなるのは13章まで待たなければならないのがにくいですね。
 ここまでは入門者さんにオススメの部分でした。今までの内容にも初~中級者が学ぶべき事は色々ありましたが、ある程度C++かじった人には次章以降を強くオススメしたいと思います。次章以降は今後二回に分けて書いていきたいと思います。

 <<0~5章 目次 8~12章>>

by 長月葵  at 23:52  | Permalink  | Comments (0)  | Trackbacks (0)

岩波講座 情報科学 22 人工知能

 本当は Accelerated C++ の6~10章を予定してたんですが、予想外の掘り出し物を見つけたので。そっちのけで買ってきた方を読んでしまいました。とは言え、一応6~7章は読んでるのでそれも後で書きます。さらに、仕事の休み時間にOS【第2版】も読んでるのでそれも。今日は豪華三本立てです(・∀・)
 その分一つ一つの分量少ないですが(´・ω・`)

 さて、あおいろ日記読書感想文フェア第一弾は白井良明、辻井潤一著、岩波講座 情報科学 22 人工知能 第1~2章です。
 第1章はご多分に漏れず本書の概要を述べています。人工知能という研究分野の成り立ちや応用分野をさらりと流した後、本書の構成を説明しています。
 この中で一つの分野として自然言語処理が挙げられています。長月が興味を持っている分野がこれです。本当はどちらかと言うと人工知能よりも人工無能に興味があるんですが(´・ω・`)

 第2章は問題の表現について。
 人工知能は極論すれば解法のない問題を解くためのプログラムです。これと言って適したアルゴリズムの無い問題を、いかに推測し、制限し、探索するかが主題となります。なので問題解決の方法を定める際に、問題自体の形式や構造が重要になります。
 本章では扱う問題を、解が曖昧でない、問題解決に探索を行う物と制限した上で、よく用いられる論理的な構造の理論を解説します。
 内容としては問題の整理の仕方と所謂データ構造の理論になります。
 問題を整理する方法の解説では、記法の正規化、操作の定義、制限条件の定義等に触れています。
 また、データ構造に関しては、目的は探索なので、主に扱われるデータ構造はマルチウェイなツリー構造やグラフ構造です。
 この辺りはアルゴリズム論やデータ構造に詳しい人は読み飛ばしても大丈夫でしょう。まださわりといった感触です。本格的になるのはもっと後の様で、少し物足りない感じでした。

 なんと言うか、やはり研究者の先生方が書かれた本なので、全体としてお堅い感じがしますね。読む人によっては眠いかもしれません。題材が題材なので仕方ないのかもしれませんが(´・ω・`)
 ということで、情報科学に興味があって睡眠薬を必要としている方は一読してみては如何でしょうか?(ぉ

by 長月葵  at 22:54  | Permalink  | Comments (0)  | Trackbacks (0)

Accelerated C++ 0~5章

 はい、早くも浮気です。OS【第二版】は読むのに気合が要るので疲れます。今日はさらっと流したかったので楽に読める本を。
 今日読んだのはアンドリュー・コーニグ、バーバラ・E・ムー著、小林健一郎訳、Accelerated C++ 効率的なプログラミングのための新しい定跡 0~5章です。全然軽くねぇ……orz
 この本は、C++とSTLを便利に使ってしまおうと言う所から始まる入門書です。文法や規則の説明は必要になってから、とりあえず使ってみようよと言うスタンスで書かれています。以前書いたエントリで長月が言っていたスタンスですね。事実この方法は良いと思いました。
 さて、この本は大まかに0~7章までの前半と8~10章の後半に分かれています。今回は前半の中でも0~5章について書きます。

 まず第0章はC++事始めとしてお決まりの hello, world! から始まります。単純な hello, world! にも実はこれだけの物が詰まってるんだよ? と言った風情で書かれています。この辺りは C/C++ 未経験者以外は読み飛ばしても大丈夫です。

 第1章では、早速 iostream を用いた入出力と string を用いた値の保存を行います。さらに、string のメンバ関数を使って、入力文字列に合わせて自動的にサイズを調整したフレームを表示したりもします。
 コンストラクタやメンバ関数を巧みに使っていて、初見の時になるほどと思わされた覚えがあります。C++経験者でも意外と知らない string の使い方かもしれません。

 第2章では、第1章で書いたプログラムを拡張します。第1章で書いたプログラムでは、フレームとして出力される文字列がそれぞれ string 型の変数としてハードコードされていました。それをフレキシブルな形に書き直すのが第2章の目的です。
 ここまで来てやっとループです。まあここまで来てと言っても20ページ無いんですが。
 残念なのが、コードが余り技巧的ではなくなって見ごたえが無い事です。必要な事に必要なだけ、そして解りやすく書かれているエレガントなコードなんですが、第1章で見たようなああなるほどと言った感動はありませんでした。

 続いて第3章では、たくさんのデータを扱うと言う題の通り、コンテナが登場します。
 これまでに学んで来た入出力やループを使って、生徒の宿題やテストの点数を入力し、学期の成績を計算するプログラムを作り、それを平均点の計算からメディアンを求めるプログラムに拡張すると言う段階を踏んで vector の使い方に繋いでいます。
 ここでのプログラムも何か引っかかる物があります。それが解決されるのが次章です。

 第4章に入ってやっと関数が登場します。前述した違和感の正体がこれです。既にプログラミングを嗜んでいる人間にとっては、長い main 関数が引っかかる訳です。
 第4章では、前章で作成したプログラムを、関数を用いた物に書き直していきます。さらに、複数の生徒の成績を扱う為に、データを構造体によって関連付けたり、ちらっと例外も顔を出します。それと構造体や構造体を利用する関数をヘッダファイルに追い出したりもしてますね。後にクラスの解説へと繋がりそうです (と言うか繋がります)。
 この章では sort や max 等のアルゴリズム系関数も出てきます。長月の私見ですが、どうも長月を含めた中途半端なレベルのC++使いは、STLのコンテナは良く知っていてもアルゴリズムを良く知らない様に思えます。本書を読んでいると、このやり方ならそういう偏りは出来にくいかもなあと思います。

 本日の締め、第5章ではイテレータが解説されます。前章のプログラムに合否判定の機能を加える為に、vector の巡回をすると言った感じです。
 イテレータは vector に特有の物ではありません。本章では、vector の部分削除や挿入に伴うコピーに起因する速度低下を不満として、list への差し替えを行います。
 さらに、イテレータで範囲指定する類の関数も使い始めます。
 なんと言うか、やっとSTLの本領が見えてきたと言った所でしょうか。C++はちょっと触っている人なんかはここら辺り方楽しくなってくるのではないでしょうか。

 上記のレビューにもちょこちょこと書かれていますが、本書は入門書で有りながら、経験者にも有益な本でもあります。文法や機能等に着目した従来の本と違い、問題解決に着目した作りであるため、意外な所で今までもやもやしていた物が解決したりします。
 自分はC++を使っているしそれなりに使えているからと思っている方も一度読んでみては?

 目次 6~7章>>

by 長月葵  at 22:53  | Permalink  | Comments (0)  | Trackbacks (0)

オペレーティングシステム【第二版】 第2章 (前編)

 え~と、タネンバウム本分厚いです。重いです。立ち読みには向きません。買った理由がちょっぴり解りました。
 さて、今日読んだのは、A.S.タネンバウム、A.S.ウッドハル著、オペレーティングシステム 設計と理論およびMINIXによる実装【第二版】の第2章前半です。ええ、前半です。2章全部じゃないです。2章だけで122ページ有りますから、流石にさらりとは読めません(´・ω・`) 3章に至っては180ページ超えてるありさまですから……orz

 そんな訳で今回は2章 (前) です。
 2章のテーマはプロセスです。2章ではプロセスの概念に始まって、複数のプログラムを制御する為の理論とMINIXでの設計、MINIXを例にした実装を解説しています。
 今回はMINIXでの設計の概要までを読んで思いつくまま書き殴ってみます。

 まず最初はプロセスと言う概念についての解説です。本書ではプロセスモデルの解説を通して概念の説明をしています。そしてプロセスに求められる物、必要な機能の実現等の理論の解説が続きます。
 プロセスと言うのは実行中のプログラムを指す言葉です。実際には千差万別であるプログラムを、統一的な方法で管理できるように抽象化した概念をプロセスと言います。
 この項で解説されている基本的な概念をしっかりと理解しておかないと後に混乱する事になります。プログラムとプロセスを混同するとスケジューリング辺りでパニックに陥るでしょう。

 第二項はプロセス間通信の解説です。
 マルチプログラミング環境に於いては、複数のプロセス間での通信が頻繁に行われます。第二項ではそのプロセス間に於ける通信方法や、それにまつわる問題、その解決法等を解説しています。
 プロセスは一つ一つ独立した物です。しかし完全に独立してしまうと、そのプログラムに必要な動作を全て実装しなければなりません。また、権限の問題で使用できない機能を利用しなければならない場合もあります。ですから、完全に独立させるよりは、必要な機能を持った別のプロセスに処理を委譲できる様にすべきなのです。そこで必要になるのがプロセス間通信であり、通信に際しての決まり事と方法なのです。

 第三項は典型的なIPC問題とその解決についてです。
 IPCとは InterProcess Communication の略で、プロセス間通信の事です。IPC問題と言うのは、デッドロックや同期化、競合状態に関する典型的でプリミティブな事例の事です。これを解決する事で、実際の利用時に起きる複雑な状態にも対応できると言う、不具合の最小構成の事だと考えれば良いでしょう。
 第三項では、IPC問題の中でも特にありふれた問題を三つ取り上げて、その問題点と解決方法を解説しています。

 第四項で解説されるのはスケジューラ、いよいよ大物登場です。
 これまでの解説で棚上げにされてきた、具体的なプロセスのスイッチングやその順位の決定についての理論、与える資源 (時間や機器や機能) の調整について等、プロセス管理の根本であり煩雑で難解な部分の解説を行っています。
 単に実行を開始された順で同じ量の資源を提供するのであれば複雑な事は有りません。しかし、処理には優先順位があり、実現すべき処理に必要な資源の量もそれぞれです。また、プロセスによってはスリープする事もあり、その間に何もしないのは資源の浪費になります。そう言った無駄を省き、必要な所に資源を回す為にもスケジューリングや資源の割り振りは慎重に行わなければなりません。
 第四項ではこう言った問題に対する今までに行われてきた提案を解説しています。

 第五項では、これまでに解説されてきた理論を元に、MINIXを題材とした設計の一例を解説しています。
 内部の構成、プロセス管理、プロセス間通信、スケジューリング等について、MINIXではどの様な理由でどの様な選択をしたのかが解説されています。ここで解説されているMINIXと言うOSのプロセスに関する思想を理解しておかないと、この後に続く具体的な解説で混乱します。

 ここまででも十分に厄介な第2章ですが、これまでの内容を理解していないと続く第6項で大変混乱します。
 プロセスはOSの根幹をなす概念です。他のほとんどの部分から依存される部分ですから、要点だけはしっかりと掴んでおきましょう。

 #(´ー`)oO(当blogのお客さんでこのエントリとかOS【第二版】に興味ある人っているのかしら? 興味ある人はコメントキボンヌ

by 長月葵  at 23:37  | Permalink  | Comments (0)  | Trackbacks (1)

オペレーティングシステム【第二版】 第1章

 のっけからごっつい本です。なんかこれが二冊あれば人を殴り殺すのも可能なんじゃないかって感じがします。と言うか、囲碁blogのアンテナから来る人が多い事を承知の上でこの本を選ぶ辺り、長月は捻くれ過ぎなんだなぁと他人事のように思うのでした。
 今日から読み始める本は、アンドリュー.S.タネンバウム、アルバート.S.ウッドハル著、千輝順子訳、今泉貴史監修、オペレーティングシステム 設計と理論およびMINIXによる実装【第二版】です。
 ページ数1200ページ越え、四割がソースコードとは言え、量も内容も大物です。正直長月なんでこんな物買ったんでしょうか? おかげさまで自作ソースコードを収めたディレクトリにFDとかHDDから起動するためのブートストラップコードとか転がってますよ'`,、(´∀`)'`,、

 さて、肝心の内容ですが、今回は第一章についてです。
 第一章はオペレーティングシステム概論と言うタイトルの通り、OSとは何であるかや、OSの歴史等が書かれています。また、歴史に沿って、現代のモダンなOSならばまず搭載している機能や概念等も説明されています。

 OSと言う概念やOSの歴史等は基本的に読み物です。技術的な面で見れば余り役立ちません。しかし、現在から見ればチープなハードウェアとソフトウェアしかなかった時代を思うと何とはなしに感慨深い物も有ります。テープメディアや8インチFDや5インチFDの時代を知る (当時年齢一桁) 長月はこの辺りを読むと、セピア色どころか思い出すのさえ苦労する時代の思い出が蘇ります。当時は父のひざの上で訳も解らずBasicのコードを眺めていた物です。

 さらに進んでMINIXの歴史を通り過ぎると、コンピュータ技術の進化を辿るように機能や構造、概念の説明が続きます。
 まずは概念の説明がなされ、プロセスやファイルシステム、メモリ管理やコマンドインタプリタ、システムコール等が解説され、OSの一般的な構造へと続きます。
 構造の解説では、モノリシックカーネルやレイヤ構造を持ったシステム、仮想マシン、クライアント/サーバモデル、所謂マイクロカーネルまで基本的な構造を割合丁寧に、且つ急ぎ足で説明しています。

 ここまでの内容は技術的な観点で見ると余り役に立たないものが多いでしょう。第一章は全体を俯瞰した物なので抽象度が高いのです。しかし、考え方を知らなければ設計や実相の段階で無用な悩みを抱えることになるので、こういった概念も無視できない物では有ります。
 本エントリを見てこの本を買おうと言う人は余り居ないと思いますが、この本を読むのであれば、まず第一章をしっかり読む事をオススメします。

by 長月葵  at 23:35  | Permalink  | Comments (0)  | Trackbacks (0)

やっぱり間違えてた(´・ω・`)

 なんかバージョンを変えたら解決しました。
 最初に試してた奴のバージョンは 1.99_06、今回のが 0.88。
 どうも新しいのは Perl 5.8.* で追加された Encode モジュールのラッパみたいで、一応 Jcode 0.88 相当のコードは含まれてる物の内部構造が大幅に変わってる模様。古いコードを Jcode::_Classic に押し込めたおかげでおかしな事になった様です。

 つーことで、同じような罠に引っかかってここにきた人、Jcode 0.* に差し替えましょう(´・ω・`)

by 長月葵  at 01:18  | Permalink  | Comments (0)  | Trackbacks (0)

むむ? 何かを間違えましたか?

 ちょっと入用になって Jcode.pm の OpenLab の Jcode.pm プロジェクトページから以前DLしておいた物をインスコ。といってもコピるだけ。インスコ用のスクリプトついてないし(´・ω・`)
 コピー終了して既に組んであるスクリプトを実行してみると。

Undefined subroutine &Jcode::_Classic::euc_utf8 called at <Perlのパス>/lib/Jcode/_Classic.pm line 255

 と出る。はて? インスコ失敗してたのけ? 該当個所を見てみる。よくわからん。load_module 関数が関係してそうだけど、load_module 関数を眺めてみても解らず。デバッグ表示ではパッケージはちゃんと require されてるっぽいしなぁ。
 といった所でふと気付く。ああ、パッケージ名の修飾がないんだ。自作ライブラリだとちゃんとパッケージ化せずに内部で使う変数だけ $Hoge::variable_ とかして関数は require だけで呼べるようにしてたせいで勘違いしてた。
 てことでパッケージ名を補ってやれば通るかな? パッケージ名は load_module 関数が返してるから、後は関数名を付け足してシンボリック参照辺りで何とかなるな。ってなんでそんなニッチな機能だけはすぐに思い出せるんだ俺……orz
 であ実行( ・∀・)σぽちっとな

Can't use string ( snip ) as a subroutine ref while "strict refs" in use at <Perlのパス>/lib/Jcode/_Classic.pm line 256

 ……orz
 もう訳わかんないんで誰か似たような事例と解決策教えてくだちぃ……orz

by 長月葵  at 00:57  | Permalink  | Comments (0)  | Trackbacks (1)

ぐぐるの頻出クエリを元にエントリを書いてみよう第一回

 ぐぐるからのお客さんの傾向を調べてたら頻出キーワードに「STL」があると判明。なのでSTLに関して何か書いてみようとおもいます。
 STLだけでは広すぎるので、STLと一緒に検索されたキーワードで最も多かった「スマートポインタ」を絡めてみます。

 さて、STLで検索してきてる人は、多分STLがなんであるかはご存知のはずですね。
 STLは標準C++に付属する標準ライブラリの一部で、テンプレートを用いたコンテナやアルゴリズムなんかのライブラリを指します。
 入門書の類などで特によく使われるのstringやvector、iostreamなんかもSTLに含まれるジェネリッククラスですね。
 さて、このSTLにはコンテナ、アルゴリズム、ユーティリティ、イテレータなどが含まれます。
 コンテナはデータ構造、アルゴリズムは言葉の通り、ユーティリティはちょっとした処理をテンプレート化した関数群、イテレータはデータ構造体を巡回する際などに使うポインタの代わりになるものです。
 最後に挙げたイテレータ、これってある意味スマートポインタなんですよね。
 スマートポインタと言えるほどの汎用性は無いんですが、STLコンテナの中を巡回することに関してはまさに「賢いポインタ」として動作してくれます。
 まずC言語での動的配列のイディオム。

    int *ida = (int*)malloc(sizeof(int) * 10);

 があった時、ポインタとポインタ演算を用いてこの配列の中身を頭から順番に設定していくコードは以下のようになります。
    int *ip = ida;
    int i;
    for(i = 0; i < 10; ++ip, ++i){
        /* something() はint型の何らかの値を返する関数 */
        *ip = something();
    }

 これを、C++での動的配列のイディオムで表現すると。
    std::vector<int> ida(10);
    for(std::vector<int>::iterator ip = ida.begin();
         ip != ida.end();
         ++ip){
        // something() はint型の何らかの値を返す関数
        *ip = something();
    }

 ipに対する操作に着目するととても似てますね。イテレータはポインタを模して作られているのです。
 しかしこれだけだとありがたみがわかりませんね。そこでリンクリストに関しても見てみましょう。
 C言語だと、典型的なリンクリストの巡回は以下のようになります。
    typedef struct list_tag{
        int value_;
        struct list_tag *next_;
    } List;

    /* (snip) */

    List *iter;
    for(iter = Data; iter != DataEnd; iter = iter->next_){
        /* something() はint型の引数を受け取る関数 */
        something(iter->value_);
    }


 C++で書いてみましょう。
    std::list<int> Data;

    // (snip)

    for(std::list<int>::iterator iter = Data.begin()
         iter != Data.end();
         ++iter){
        // something() はint型の引数を受け取る関数
        something(*iter);
    }


 iterに着目したとき、C言語版よりも楽になった感じです。なにより、C++版だと、iterに対する操作は本質的にvectorの場合と変わってません。
 ただのポインタの場合、データ構造ごとに違う探索操作をしなければならないところを、実際の動作を隠蔽して統一的な操作で行ってしまうのがイテレータの魅力です。ことコンテナの探索に関しては立派にスマートポインタと言えます。

 しかし、検索で来てる方々は、こういったものではなくて汎用のスマートポインタを探してますよね。
 STLにも一つ、汎用のスマートポインタがあります。auto_ptrがそれです。もちろんデストラクト時にちゃんとdeleteしてくれます。
 auto_ptrは破壊的スマートポインタと呼ばれる方法で実装されたスマートポインタです。あるポインタについて、一つだけ所有権を認めます。
 例えば以下のようにすると、aは0 (NULL) を指し、aの指していた領域をbが指すようになります。

    auto_ptr<int> a(new int(10));
    auto_ptr<int> b(a);
 あるいは
    auto_ptr<int> a(new int(10));
    auto_ptr<int> b;
    b = a;

 ソース側の状態を破壊するので破壊型という訳です。しかしこれなら確かにリークはありません。
 しかしこの方法、割と問題あるんですよね。例えば。
// 参照渡しのつもりでポインタ型引数を受け取って二倍にして引数経由で値を返す関数
void Double(int* ptr){ *ptr *= 2; }

// 生のポインタは怖いからスマートポインタ用にオーバーロード
void Double(auto_ptr<int> ptr){ *ptr *= 2; }

int main(){
    int i = 20;
    auto_ptr<int> ptr(new int(10));
    Double(&i);
    Double(ptr);
    cout << i << ", " << *ptr << endl; // 不正な参照はがし
    return 0;
}


 Double(int*)はうまく動きますが、Double(auto_ptr<int>)はうまく動きません。
 Double(auto_ptr<int>)では、auto_ptr<int>を値渡ししています。なので、実引数はコピーされるのです。auto_ptrではコピーが発生すると、ソース側が破壊されるので、関数本体に入った時点で既に呼び出し側のptrには0が設定されています。なので出力行での参照はがしは不正なメモリアクセスとなります。なので上記のような場合は参照で渡しましょう。
 また、ポインタを保持するコンテナではポインタの代わりにauto_ptrを使おうとすると痛い目に遭うかもしれません。
    vector<auto_ptr<int> > iapv1;
    vector<auto_ptr<int> > iapv2;
    iapv1.push_back(new int(10));
    iapv1.push_back(new int(20));
    iapv2 = iapv1; // ここでコピーが発生。iapv1の保持するポインタが破壊される
    *iapv1[0] = 100; // 既にiapv1[0]はヌルポインタなのでエラー

 正直知らないと気付きません(´・ω・`)
 破壊型という特性故にauto_ptrは使いづらいと言う評価を受けるようです。長月もスマートポインタをご所望の方はBoostのshared_ptrを使ったほうが良いかと思います。

 それでは今回はここまで。また気が向けばやってみます。当日記に出てきたキーワードで、何か知りたいことがある方はぐぐる経由でアクセスしまくるといいかもですよ? であであノシ

 #ちなみに最頻出クエリは「hidew」でした(絶爆) おめでたうw>hidewさん

by 長月葵  at 21:01  | Permalink  | Comments (2)  | Trackbacks (0)

第一章を読んで (Exceptional C++の場合)

 とりあえず第一章を読み終わっての感想。
 読んでみて長月はSTLのコンテナとイテレータに関しては問題ない程度、アルゴリズムがちょっと弱いらしい。と言う事が判った。
 ので、この本、クイズ形式になってるからか、傾向と対策本として使えそう。
 問題集になってる本のいい所はちゃんとやれば自分の弱点がわかる事。そう言った意味ではExceptional C++はちゃんと問題集として機能してそう。
 難易度に関しては、入門者や初級者にはちょっとオススメできない感じ。序文にもある通り、ある程度C++に触れた経験が無いと辛いと思う。
 かといってバリバリに使ってないと無理かと言われるとそれ程でもない。ちゃんと学習してそれなりに自分で何かを作ってれば経験してる事が書いてある様に見える。
 どこかのBBSやMLで相談されていて、解答を読んでなるほどと思っていた事なんかが載っていたので、割と多くの人が悩む所についての解法が書かれている感じ。
 物によってはそう言った場で挙げられた解法よりよさげな事なんかも書かれているので、ある程度「濃ゆい」C++コミュニティに参加してる人なんかは読んでみても良いんじゃないかと思う。

 cppll辺りに参加してる人は一読してみては?

by 長月葵  at 19:47  | Permalink  | Comments (0)  | Trackbacks (0)

今度はExceptional C++

 Exceptional C++が届きますた。
 これで気になってるC++本コンプまで二向聴。
 Exceptional C++を読み終わったらEfficient C++Boost本STL標準講座を買うつもり。
 どれにしよう?(´ワ`)

 その前に目の前の本をちゃんと読め? おっさる通り……orz

by 長月葵  at 21:43  | Permalink  | Comments (0)  | Trackbacks (0)

ちょっとC++使ってみない?

 最近割とちゃんとした文章書く気が起きなくて日記ばかり書いてた当blogですが。なんだかそろそろ文章短すぎてぐぐる広告様が臍曲げてるのでなんか書いてみようかと思うです。
 とりあえずプログラミングネタ行きますかね。一応うちのメインですから。ネタ取りはcppllの最近の投稿から。

 え~と、とりあえずまず質問。あなたはC++をやってみようと思いますか?
 C言語経験者とかプログラミング経験なしの人って上記の問いに「そう考えた事はあるけど難しいんでしょ?」という答えを返す事があるんですよね。つか最近そういう人多いらしい。
 そこで難しいんじゃないの? と思ってる方々に聞いてみたいのです。本当に難しいですか? って。
 わかんないですよね? まだやってないんですから。
 確かにちょっとかじって挫折した人もいるわけですよ。そういう人達は難しいからやだって言うんでしょうね。
 やっぱり聞いてみたいわけですよ。本当に難しいですか? って。
 まぁそんなこと言っておきながら長月も難しいと思ってるんです。けどね、使えないほどじゃないでしょ?
 使い切れないけど使える部分だけ使っても十分じゃないですか?
 cppllでも投稿されてたんですけど、C++のC言語部分とC++の便利な標準ライブラリ使うだけでずいぶん楽なんですよね。C言語より。
 正直文字列操作のためにmallocとかfreeとかreallocとかで頑張ってダングリングポインタに悩むの馬鹿らしいです。string使いましょ。
 ちょっとした事のために配列使いたいけど確保すべき量が決まってないからってmallocとかfreeとかreallocとかで頑張ってメモリリークに悩むとかやってられません。vector使おうよ。
 STLには他にもリストとかマップとかあってずいぶん楽。だって自分で作るの面倒でしょ?
 んで、自分で頑張って作ってもね。大抵ひとつの型にしか使えないんです。C言語感覚だとね。
 正直汎用性のためとか言ってvoid*とキャストの乱舞とかいやでしょ?
 C++ならテンプレートでそれ解決するんですよ。良いね、テンプレート。色んな意味で楽。
 バイナリサーチとか作ったことあります? クイックソートとか作ってみたことある人多いですよね? データ構造の中から特定の値を見つける関数とか作った事あるんじゃないですか?
 その辺りそう難しいこともない、入門書の類にも書いてありますしね。でもね、いちいちそのときそのとき作りたくはないですよね。STLにはその辺りもありますよ? 標準コンテナと組み合わせて楽チン楽チンですね。
 C言語ってポインタ怖いですよね。やろうと思えばWindowsのハンドル型みたいな似非スマートポインタも作れるけど面倒ですよね? 約束事も増えますし。
 でもC++ならスマートポインタありますよ? 標準ライブラリにもauto_ptrがあるし、Boost使えばもっと賢いのあります。凝ったやつならyaneSDK3rdとかLokiなんかにもありますね。ちょっとしたものなら自分で作ってもそんなに手間掛からないですし。

 C++の機能ってそれぞれひとつだけ見たらそんなに難しくないと思うんです。でもイディオムとして色々組み合わせる物だって言われるから難しい。
 じゃあもう難しいのは他人任せで行きましょう。C++って出来合いのライブラリが優秀なの多いですから。
 自分の手に負えない物使わなくても良いと思うんですよ。使いたくなってから頑張って考えてみれば良いんじゃないかな? やる気があるならなんとかなるでしょ?
 てな訳で食わず嫌いだったり食ってみた所が悪くて嫌いな方々。ちょっとC++使ってみませんか?

 お勧め書籍:Accelerated C++

by 長月葵  at 20:12  | Permalink  | Comments (0)  | Trackbacks (0)

Modern C++ Design5章辺りで訳わかんなくなってきた

 ので2~3章にトラックバック中……orz
 タイプリストがちゃんと理解できないorz

by 長月葵  at 22:04  | Permalink  | Comments (0)  | Trackbacks (0)

なんかちょっと画像を操作するプログラムが書きたくなったりしてみたり

 なんだか画像を操作するプログラムが書きたい気分です。Modern C++ Design読んでて何かを思いつきかけてる感じです。
 実際には画像の操作が本質じゃなくて、DIBとかDirectDrawとかDirect3Dとかをポリシーにまとめて云々みたいな事がしたい模様です。
 ぐだぐだいっておきながらしっかりModern C++ Designに毒されてる長月でした(´・ω・`)

by 長月葵  at 21:42  | Permalink  | Comments (0)  | Trackbacks (0)

う~ん……

 Modern C++ Design読んでて思ったこと。
 確かに斬新、トリッキーで解りにくいところはあるけど凄いのは凄い。でもちょっとやりすぎじゃないですか?
 なんかそこまでするの?(´Д`;) と思うところがいくつか。
 タイプリストとか便利そうだけど、コンパイルタイムはともかくランタイムは速そうだけどそこまでやりますか? って感じ。
 後を読んで必須だと思えたとしても、却ってLoki自体どうなの? と思うことになるかもしれなさげなトリッキーさ(´・ω・`)
 なんか2chとかで割とえらい言われ様だった理由が理解できた(´・ω・`)

by 長月葵  at 20:09  | Permalink  | Comments (0)  | Trackbacks (0)

経験不足を痛感(´・ω・`)

 Modern C++ Design手強し(´・ω・`)
 テンプレートはユーザとしては慣れてるけど実装者としては慣れてないので宇宙語に見える個所がちらほら出てくる(´・ω・`)
 まだ大して難しいところには入ってないはずなのにもうこんな状況で大丈夫ですか?>俺

 #それでも仕事の休憩時に読んでる中学レベルの英文法書よりは理解できる辺り何かを間違えてる……orz

by 長月葵  at 20:36  | Permalink  | Comments (0)  | Trackbacks (0)

Modern C++ Designを買った

 Modern C++ Designを買った。
 とりあえずまえがきをさらっと斜め読みしてポリシークラスの解説を読み始め。なんか大体のことは知ってるっぽい。どこで知ったのかな? と考えてみるとやねうらお氏のプロフェッショナルWindowsゲームプログラミングにもポリシークラスのことが載ってたことを思い出す (2のほうだったかもしれない)。Modern C++ Designよりあっさりしていて若干舌足らずな印象があった。そういえばプロフェッショナルWindowsゲームプログラミングにはほかにもパラメタライズドなSingletonやMediatorも載ってたはず、原点はModern C++ Designか元になったC++ジャーナルの記事なのかもしれない。

 まだちゃんと読んでないのでなんとも言えないけど。ポリシークラスの概念を鑑みるにこの本ではポリシークラスが大活躍するはず。この間接性が理解を妨げそうな予感がしないでもない。気合を入れないと読み下せなさそうなのは面倒だけど、身に付けると一歩先に行けそうな内容なので頑張ってみます(´・ω・`)

by 長月葵  at 22:06  | Permalink  | Comments (0)  | Trackbacks (0)

スキン対応CGIのススメ

 知り合いの日曜ぷるぐらまさんが「スキン対応CGIを計画中」とおっしゃって居たのでHTML::Templateモジュールを教えてさしあげました。
 で、ちょっと考えてみたんですが、自分も含めて作る立場から見て、スキン対応CGIの需要って高いんじゃないかと思うんですよ。
 使う側からしても面白いんですが、作る側から見るとUIとロジックの分離が出来るって事でお得なんですよね。本来アプリケーション構成の多層化って設計の基本なんですけど、CGIに於いては割と軽視されてると言うか、そう言う構成になっていないことも多いンじゃないかと思います。最近スタイルシートをいじってる所為か、見た目を変える為にソースをいじるのはナンセンスに感じるんですね。だからここ最近作ってるPerlCGIやPerlでHTMLを吐く類のプログラムではもっぱらHTML::Templateモジュールを使ってます。
 で、自分で便利だと感じる物は同じ事を考える人のために紹介しなきゃでしょと思ったので紹介してみようかと思います。

 まずはインストール、Perlのバージョンによっては入ってるかも知れませんが、うちのPerl環境 (ActivePerl 4.6.1) では入ってなかったのでCPANから落としました。ActivePerlを使ってる方ならPPMコマンドで適当に落として下さい。ppm install HTML-Templateでインストール出来ると思います。
 PPMコマンドの使い方はhttp://digit.que.ne.jp/work/index.cgi?Perl%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%2F%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB(PPM)を見れば詳しく書いてあります。
 Windows + ActivePerl 以外の環境の方は適当に何とかして下さい。Linux何かだとRPMパッケージも用意してあったかと思います。

 インストールが済んだら取り説をざっと見てみましょう。perldocコマンドで取り説を読むことが出来ますが、文章が英語なので長月の様な英語だめぽな方はperldocJPプロジェクトで公開されている翻訳済みドキュメントを読みましょう。
 PerldocJP: http://perldocjp.sourceforge.jp/

 さて、取り説の説明に拠ると、HTML::Templateモジュールで読み込むテンプレートファイルは基本的にHTMLの様です。これなら簡単です。まずはHTMLで実現したいページを書いてみます。例として自作のHTMLジェネレータで使っているテンプレートを晒してみます。


<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="Aoiro HTML Generator 1.0">
<title><!--TMPL_VAR NAME="title"--></title>
<link rel="stylesheet" type="text/css" href="<!--TMPL_VAR ESCAPE=HTML NAME="file_dir"-->CSS/base.css">
</head>
<body>
<div id="base">
<div id="main">
<div id="logo">
<img src="<!--TMPL_VAR ESCAPE=HTML NAME="logo"-->">
</div><!--/div id="logo"-->
<div class="navi">
<ul class="navi">
<!--TMPL_LOOP NAME="navi"-->
<li class="navi"><!--TMPL_VAR NAME="navi_item"--></li>
<!--/TMPL_LOOP-->
</ul>
</div><!--/div class="navi"-->

<!--TMPL_VAR NAME="body"-->

</div><!--/div id="main"-->
<div id="menu">
<!--TMPL_LOOP NAME="menu_captions"-->
<ul>
<li class="caption"><!--TMPL_VAR NAME="menu_caption"--></li>
<!--TMPL_LOOP NAME="menu_items"--><li><!--TMPL_VAR NAME="menu_item"--></li>
<!--/TMPL_LOOP-->
</ul><!--/TMPL_LOOP-->
</div><!--/div id="menu"-->
</div><!--/div id="base"-->
<div id="Copyright">
<hr>
Copyright (C) 2002-2005 September Software,<br>
長月 葵<aoi_nagatsuki@nagatsuki-do.net><br>
All Rights Reserved.<br>
<font style="color: red">スパム防止の為@を全角にしています。</font><br>
<img src="<!--TMPL_VAR NAME="file_dir"-->image/banner.gif">
</div><!--/div id="Copyright"-->
</body>
</html>


 なにやらHTMLにないタグがいくつか出てきてますね。<!--TMPL_VAR NAME="hoge"-->とか<!--TMPL_LOOP NAME="piyo"-->とか。これがHTML::Templateモジュール用テンプレートの制御タグです。詳しくはPODを読んで貰うとして、頻繁に使うであろう<!--TMPL_VAR NAME="hoge"-->と<!--TMPL_LOOP NAME="piyo"-->~<!--/TMPL_LOOP-->だけ解説してみます。

 制御タグの解説の前に、HTML::Templateモジュールを使う準備と、出力の方法を解説します。
 まず、モジュールを使うときにはお決まりのuseディレクティブを使います。


use HTML::Template;

 そしてHTML::Templateのインスタンスを作ります。

$tmpl = HTML::Template->new(filename => 'tmpl.html');

 newメソッドの詳しい使い方はPODを参照して下さい。一般的にはテンプレートファイルを読み込むでしょうから、 filename => ファイル名 として読み込むテンプレートを指定して下さい。
 これで準備が出来ました。後はparamメソッド経由で色々設定した後出力と言う流れでしょう。
 出力にはoutputメソッドを使います。outputメソッドは文字列を返すので、print関数なんかで受け取ってお好きな所に出力します。

# 標準出力への出力
print $tmpl->output();

# ファイルへの出力
open(FILESTREAM, ">hoge.html");
print FILESTREAM $tmpl->output();
close(FILESTREAM);

 次に制御タグの意味とスクリプト側での使用方法です。
 <!--TMPL_VAR NAME="hoge"-->は、この場所に文字列を挿入します。
 Perlスクリプト側では、HTML::Templateモジュールのインスタンスにparamメソッドを通してNAMEで指定した名前に対して文字列を設定します。


use strict;
use HTML::Template;
my $tmpl = new HTML::Template(filename => 'tmpl.html);
$tmpl->param(hoge => 'hogepiyofuga');

 <!--TMPL_LOOP NAME="piyo"-->はテンプレートにループ構造を与えます。<!--TMPL_LOOP NAME="piyo"-->と<!--/TMPL_LOOP-->で括られた範囲内にある物を反復表示する事になります。範囲内に<!--TMPL_VAR-->が無いと空ループになり何も挿入しないことになるようです。
 スクリプト側は<!--TMPL_VAR-->に比べると複雑になります。paramメソッド経由で設定した名前にオブジェクトを与える事自体は<!--TMPL_VAR-->と変わりませんが、<!--TMPL_LOOP-->に相当する名前に与えるオブジェクトは、<!--TMPL_LOOP-->内に置いた<!--TMPL_VAR-->に対応したハッシュへの参照の配列への参照になります。ややこしいですね。


# <!--TMPL_LOOP NAME="piyo"--><!--TMPL_VAR NAME="hoge"--><!--/
TMPL_LOOP--> に対するparamメソッドの例
use strict;
use HTML::Template;
my $tmpl = new HTML::Template(filename => 'tmpl.html);
my @tmpl_loop;
push(@tmpl_loop, { hoge => 'hoge' });
push(@tmpl_loop, { hoge => 'piyo' });
push(@tmpl_loop, { hoge => 'fuga' });
push(@tmpl_loop, { hoge => 'foo' });
push(@tmpl_loop, { hoge => 'bar' });
push(@tmpl_loop, { hoge => 'baz' });
$tmpl->param(piyo => \\@tmpl_loop);

 多重にループした場合とてもややこしくなるので気を付けましょう。多重ループの可能性が高そうなtableタグ関連にはHTML::Tableというモジュールもあるのでそちらを使っても良いかも知れません。

 以上ざっと説明しましたが、CGIを作ったりしてる方、この機にHTML::Templateを使ってみては如何でしょうか?

by 長月葵  at 20:10  | Permalink  | Comments (0)  | Trackbacks (0)

やっべぇ、しばらく日記書くの忘れるかも(・∀・)

 D&E。+.。゚:;。+゚(´Д`)゚+。::゚。:.゚。+。ィィ!!
 やっべぇ、ものすげぇ(´Д`*)ハァハァする。むっちゃC++で何か書きたくなってくる。
 日記書く暇ももどかしいほど中毒症状。何かC++で書くか。前からやりたかったBoostの隅っこな部分の勉強とか。

by 長月葵  at 21:22  | Permalink  | Comments (0)  | Trackbacks (0)

D&Eキタ Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!

 C++の設計と進化、所謂D&Eがやっと届いたヽ(´ワ`)ノ
 しばらく本の虫けってー(゚∀゚)Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)
 こうなるとARMも欲しくなってきたり。
 あぁでもModern C++ Designも欲しい。
 Exceptional C++も。
 あ~その前にGame Programming Gemsのvol.2も欲しい。
 ていうかAmazonのショッピングカートの後で買うリスト長すぎ。
 いくらお金があっても足りない予感(´・ω・`)

 追記:Modern C++ Design購入済み
 追記2:Exceptional C++購入済み

by 長月葵  at 10:52  | Permalink  | Comments (0)  | Trackbacks (0)

また余計なことを……orz

 何度か書いてるHTMLジェネレータなんですが。
 Wiki化だけでは留まらずクラス化までされてしまいました。
 コンストラクタかセッターを介して必要な情報を設定するか、情報を取得する為の関数をアタッチしてゲッターを呼び、print関数に出力メソッドの返り値を与えるとHTMLが吐き出される仕組みです。
 何でこんな事をするかというとUIとロジックを分離したかったからなんですね。所謂API化です。
 おかげさまで情報を入力する為のドライバつかラッパがコマンドラインでの対話とソーステキストを喰わせる形で実現されました。さらにCGIとPerl/TkなGUIも予定されてます。どうせ自分で使うのはソーステキスト版だけなのにね。
 ついでとばかりにソーステキストからの生成用にリストファイルを喰わすと自動的に全部トランスレートしてくれるトランスレータドライバとか作ってみたりもしてみたり。さらにリストファイルじゃなくてディレクトリ名喰わせるとサブディレクトリまで含めてソースファイルを探し出してトランスレートしてくれる機能も予定。
 なんだか楽しくて手が止まりません(´∀`)

 つかもう良いからさっさと移転作業しろよ……orz

by 長月葵  at 01:06  | Permalink  | Comments (0)  | Trackbacks (0)

switch文がほすぃ (perl)

 今までのエントリでも書いた様に只今Perlでもにょもにょしてるわけですが。
 なんかね、if-elsif-elseブロック書いてると欲しくなるんですよswitch文。
 そこで擬似的に実現する方法を考えてみますた。

  1.ブロックを利用する方法
my $var = 検査される値;
switch:{
  $var =~ /条件文字列/ && do{
    処理;
    last switch;
  }
}

 2.配列やハッシュを利用する方法
$var = 検査される値;
@switch_a = {
  &{ 処理; },
};
&{$switch_a[$var]};

%switch_h = (
  key => &{ 処理; },
);
&{$switch_h{$var}};

 ハッシュを使った方法なんかは割と多用しとります。
 例えばCGIなんかでモード毎の処理に飛ばすときなんかは以下の様にやります。
%command_do = (
  RSS => \\&do_RSS,
  write => \\&do_write,
);
&{$command_do{$mode}};

sub do_RSS{
  (snip)
}

sub do_write{
  (snip)
}

 これ割と重宝します。YukiWikiなんかでも使われてます。
 興味有る方お試しあれ。

by 長月葵  at 00:58  | Permalink  | Comments (6)  | Trackbacks (0)
2010年03月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31