<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>凪瀬 Blog</title><link>http://blogs.wankuma.com/nagise/</link><description>Programming SHOT BAR</description><managingEditor>凪瀬</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>凪瀬</dc:creator><title>わんくま同盟 富山勉強会レポート</title><link>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx</link><pubDate>Wed, 12 Nov 2008 01:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/161028.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/11/12/161028.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/161028.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/161028.aspx</trackback:ping><description>&lt;p&gt;11/8(土)にわんくま同盟 富山勉強会が開催されました。&lt;/p&gt;

&lt;p&gt;参加いただいた皆様、スピーカーを引き受けてくださった皆様、ネットから視聴していただいた皆様、どうもありがとうございました。&lt;/p&gt;

&lt;h4&gt;Wicketで変わるウェブ・アプリケーション開発&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野勉&lt;/a&gt;氏のWicketのセッション。私が忘れ物をしたせいで、セッション時間を入れ替えてもらったという経緯あり。そんなわけで、自分はほとんど見ることができなかったのが悔やまれます。&lt;/p&gt;

&lt;h4&gt;RIAことはじめ&lt;/h4&gt;

&lt;p&gt;3月まで自分一緒にプロジェクトをやっていたhikaru氏に頼んでFlexの紹介セッションをやってもらいました。
初スピーカーで緊張気味でしたが、セッション狙い（「Flexで作ったアプリは簡単なのにリッチだ!!」といった部分を伝える）は達成できたんじゃないかな。&lt;/p&gt;

&lt;h4&gt;おひるごはん&lt;/h4&gt;

&lt;p&gt;私を含む8人で県民会館から少々歩いたところにあるうどん屋（本当は蕎麦屋なんだけど、最近蕎麦を出していない）「鶴喜」にて。富山の名店。平日と土曜の昼しか開いていないのでなかなか食べに行けない。&lt;/p&gt;

&lt;h4&gt;Javaのこれまでとこれから&lt;/h4&gt;

&lt;p&gt;本当は最初にやるはずだったセッション。この日の勉強会の各種セッションの土台となる部分を統括的に。Javaの歴史のおさらいと、最近の方向性を提示して、各セッションで具体的なところを見てもらうというつもりだったのですが。&lt;/p&gt;

&lt;p&gt;最近は、システム開発の環境改善には経済的側面をちゃんと考えないとうまくいかないよというのを痛感しているので、そちらの比重が高めにしてみました。&lt;/p&gt;

&lt;h4&gt;部屋移動&lt;/h4&gt;

&lt;p&gt;会場の都合で連続して部屋を確保できなかったので部屋移動が入ってしまいました。後半の部屋の方が椅子とか座り心地が良かった。富山県民会館を使うなら7Fの部屋の方がグレードが高いよ！&lt;/p&gt;

&lt;h4&gt;ライトニングトーク&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/katzchang/"&gt;katzchang氏&lt;/a&gt;による&lt;a href="http://ja.wikipedia.org/wiki/Io_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)"&gt;プログラミング言語Io&lt;/a&gt;の話。言語としてなかなか面白そう。&lt;/p&gt;

&lt;p&gt;daisuke氏によるメールサーバの管理の話。スパムのリレーが多くて挙句スパムのブラックリストに載せられてしまった！スパム対策どうしよう！といった話題。スパム対策は本当に頭の痛い問題です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野勉&lt;/a&gt;氏が飛び入りで１つやってくれました。業務で使うちょっとしたツールもJavaで書いちゃうぜってときに短く楽に書くためのコツみたいな話。潔い割り切りが重要。時間が余って晒し者タイムになったのでjava-jaでのLTの雰囲気とかそんな話も少々。&lt;/p&gt;

&lt;h4&gt;JavaからScalaへ&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://cappuccino.jp/keisuken/logbook/"&gt;keisuken氏&lt;/a&gt;のScalaセッション。と見せかけて本題は氏の開発する&lt;a href="http://webflavor.sourceforge.net/index_ja.html"&gt;Web Flavor&lt;/a&gt;だったりしたセッション。手続き型のプログラム言語しかやったことない人にはかなりのデカルチャーだったのではないでしょうか。自分もチャンスがあったらScalaを採用したいなぁ。&lt;/p&gt;

&lt;h4&gt;やっぱAppletやちゃ&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/yone098/20081109/1226201544"&gt;米林正明氏&lt;/a&gt;によるセッション。Java SE6 update10のドラッガブルアプレットとかそのあたりの話題。(&lt;a href="http://www3.atword.jp/jacksparrow/2008/10/09/java-se6-update10-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-applet-%E3%81%A7%E9%81%8A%E3%81%B6%EF%BC%81/"&gt;参考：Java SE6 update10 を使って Applet で遊ぶ！&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;これはデモのインパクトが大。会場が沸きました。JavaScript - Applet間での呼出しは実務でも応用が効きそうですね。注目すべき技術の一つでしょう。&lt;/p&gt;

&lt;p&gt;なお、タイトルの語尾「～やちゃ」は「～だよ」の富山弁表現。氏は富山の出身だそうで、今回の勉強会もスケジュールの厳しい中駆けつけてくれました。感謝！&lt;/p&gt;

&lt;h4&gt;懇親会&lt;/h4&gt;

&lt;p&gt;近くのお店に移動して懇親会。掘りごたつ型の座敷だったんだけど、席移動がしにくいのが難点かな。各所で話が盛り上がっていたのはいいのだけど、話す人が偏ってしまいましたね。&lt;/p&gt;

&lt;h4&gt;1.5次会&lt;/h4&gt;

&lt;p&gt;数名はラーメンの富山ブラックの大喜（富山駅前店）に吸い込まれていきました。県外の人は一度食べておくと話のネタになるかもしれない。個人的には、一度だけでいいんじゃないのとも思う。&lt;/p&gt;

&lt;h4&gt;2次会&lt;/h4&gt;

&lt;p&gt;白馬館という老舗バー。富山駅前の近くなので、電車やバスなどの人がいる場合には最適。自分は思い切り面が割れているので悪いことはできません。えぇ。&lt;/p&gt;

&lt;h4&gt;3次会&lt;/h4&gt;

&lt;p&gt;代行運転を捕まえて凪瀬邸へ。矢野氏は前日からの疲れからか付いた早々に爆睡。もうひとりのメンバーkeisuken氏としばらく話をして就寝。&lt;/p&gt;

&lt;h4&gt;翌日&lt;/h4&gt;

&lt;p&gt;朝に二人を送って富山駅へ。お土産を購入。富山の黒作り（イカスミ入りのイカの塩辛）を勧める。関西方面のkeisuken氏を見送った後、東京方面の電車の発射まで時間があったので矢野氏と朝食。話し込んでいたら時間ぎりぎりになってしまった。無事に乗れたようでなにより。&lt;/p&gt;

&lt;h4&gt;月曜日&lt;/h4&gt;

&lt;p&gt;気が緩んだのか風邪をひいたらしく、寒気がしてヤバい。夕方に早退して実家で養生。レポートが遅れてすいません。&lt;/p&gt;

&lt;h4&gt;関連記事&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/20081109/1226260475"&gt;わんくま同盟 富山勉強会に参加してきました&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/yone098/20081109/1226201544"&gt;わんくま富山勉強会#01で発表してきました&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/katzchang/20081109/p1"&gt;わんくま富山勉強会&lt;/a&gt;
&lt;li&gt;&lt;a href="http://cappuccino.jp/keisuken/logbook/20081111.html#p02"&gt;わんくま同盟 富山勉強会 #01 まとめ&lt;/a&gt;
&lt;/ul&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/161028.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>今週末は富山勉強会#1</title><link>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx</link><pubDate>Thu, 06 Nov 2008 01:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/160554.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/11/06/160554.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/160554.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/160554.aspx</trackback:ping><description>&lt;p&gt;いよいよ今週末土曜日が&lt;a href="http://www.wankuma.com/seminar/20081108toyama01/Default.aspx"&gt;わんくま同盟 富山勉強会 #01&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;場所は富山県民会館です。当日参加も可能ですが、出来るだけ事前登録をお願いします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10:40 ～ 10:50 わんくまについて&lt;/li&gt;
&lt;li&gt;10:50 ～ 11:40 「Javaのこれまでとこれから」&lt;a href="http://blogs.wankuma.com/nagise/"&gt;凪瀬 悠輝&lt;/a&gt;Lv2くまー&lt;/li&gt;
&lt;li&gt;11:50 ～ 12:20 「RIAことはじめ - Flex-Javaで簡単なアプリを作成してみる -」hikaru&lt;/li&gt;
&lt;li&gt;12:20 ～ 13:20 おひるごはん♪&lt;/li&gt;
&lt;li&gt;13:20 ～ 14:20 Wicket関連&lt;a href="http://d.hatena.ne.jp/t_yano/"&gt;矢野 勉&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;14:20 ～ 14:50 部屋移動&lt;/li&gt;

&lt;li&gt;14:50 ～ 15:20 ライトニングトーク&lt;/li&gt;
&lt;ul&gt;
	&lt;li&gt;katzchang&lt;/li&gt;
	&lt;li&gt;daisuke&lt;/li&gt;
	&lt;li&gt;スピーカー募集中！&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;15:20 ～ 16:10 「JavaからScalaへ、ScalaからJavaへ(仮)」&lt;a href="http://cappuccino.jp/keisuken/logbook/"&gt;keisuken&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;16:20 ～ 17:10 Teeda、Applet関連&lt;a href="http://d.hatena.ne.jp/yone098/"&gt;米林正明&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;17:40 ～         懇親会&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;わんくま勉強会全般がそうですが、&lt;b&gt;懇親会がメイン&lt;/b&gt;です！&lt;/p&gt;
&lt;p&gt;いろんな人といろんな話ができるのはこうした勉強会の大きなメリットですね。
懇親会に参加される方はお店の予約の関係もあるので、できるだけ早く登録をお願いします。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/160554.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Eclipseのリファクタリング機能を極める その１</title><link>http://blogs.wankuma.com/nagise/archive/2008/11/03/160414.aspx</link><pubDate>Mon, 03 Nov 2008 23:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/11/03/160414.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/160414.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/11/03/160414.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/160414.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/160414.aspx</trackback:ping><description>&lt;p&gt;Eclipseにはリファクタリングという便利な機能があります。このシリーズではその使い方をお送りしたいと思います。&lt;/p&gt;

&lt;p&gt;まずは手始めにrename機能からです。&lt;/p&gt;

&lt;h4&gt;Eclipeのリファクタリング リネーム機能&lt;/h4&gt;

&lt;p&gt;リファクタリングの初歩としてリネーム（名称変更）が挙げられます。&lt;/p&gt;

&lt;p&gt;Eclipse3.4では以下の要素に対してリネームを行うことができます。&lt;/p&gt;

&lt;p&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;コンパイル単位(.javaファイルのこと)
&lt;li&gt;パッケージ
&lt;li&gt;ソースフォルダ
&lt;li&gt;プロジェクト
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Eclipse3.4ではリネームの際にテキストフィールド上で操作を完結することができますが、オプションを指定したい場合は▼をクリックすることでダイアログを開くことができます。&lt;/p&gt;

&lt;img src="http://nagise.wankuma.com/image/rename02.png"&gt;

&lt;p&gt;"Open Rename Dialog"を選択します。すると、選択中の要素に合わせたダイアログが表示されます。以下は特殊なオプションの存在する要素についての補足です。&lt;/p&gt;

&lt;h4&gt;型の場合&lt;/h4&gt;

&lt;p&gt;型のリネーム機能では、近い名前のフィールド名やメソッド名をリネームさせることができます。
Rename Typeダイアログで"Update similarly named variables and methods"「同名の変数・メソッドも更新する」を選択してください。
"Configure ..."を選択することで、型名のマッチング方法を設定することができます。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;"Find exact names only"「完全に一致する名前だけを対象とします」
&lt;li&gt;"Also find embedded names"「語中に埋め込まれた名前も対象とします」
&lt;li&gt;"Also find name suffixes"「語尾が同じものを対象とします」
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;"Update textual occurrences in comments and strings"&lt;br&gt;
「コメント・文字列中にある型名を更新する」&lt;br&gt;
ではコメントやStringリテラル中にある型名を変更してくれます。
ただし、英文を前提にしているのか型名はスペースで区切られていないとうまく識別できません。
語と語の間に空白が入らない日本語のような環境下ではうまく機能しないことがあります。&lt;/p&gt;

&lt;p&gt;"Update fully qualified names in non-Java text files"&lt;br&gt;
「非Javaのテキストファイル中の完全名を更新する」&lt;br&gt;
では.javaファイル以外のテキストファイル中に現れる、完全名（パッケージ名の記述を省略しないクラス名表記）を更新します。
"File name patterns"で対象となるファイル名を絞り込むことができます。&lt;/p&gt;

&lt;h4&gt;メソッドの場合&lt;/h4&gt;

&lt;p&gt;"Keep original method ad delegate to renamed method"&lt;br&gt;
「オリジナルのメソッドを残して名称を変更したメソッドに処理を委譲します」&lt;br&gt;
Adapterパターンなどの実装時に便利です。&lt;/p&gt;

&lt;h4&gt;フィールドの場合&lt;/h4&gt;
&lt;p&gt;"Update textual occurrences in comments and strings"&lt;br&gt;
クラスに同じ&lt;/p&gt;

&lt;p&gt;"Rename getter: 'getHoge' to 'getPiyo'"&lt;br&gt;
"Rename setter: 'setHoge' to 'setPiyo'"&lt;br&gt;
getter/setterを併せてリネームします&lt;/p&gt;

&lt;h4&gt;列挙の場合&lt;/h4&gt;
&lt;p&gt;"Update textual occurrences in comments and strings"&lt;br&gt;
クラスに同じ&lt;/p&gt;

&lt;h4&gt;コンパイル単位の場合&lt;/h4&gt;
&lt;p&gt;"Update similarly named variables and methods"&lt;br&gt;
"Update textual occurrences in comments and strings"&lt;br&gt;
"Update fully qualified names in non-Java text files"&lt;br&gt;
クラスに同じ&lt;/p&gt;

&lt;h4&gt;パッケージの場合&lt;/h4&gt;
&lt;p&gt;"Rename subpackages"&lt;br&gt;
「サブパッケージも併せてリネームします」&lt;/p&gt;

&lt;p&gt;"Update textual occurrences in comments and strings"&lt;br&gt;
"Update fully qualified names in non-Java text files"&lt;br&gt;
クラスに同じ&lt;/p&gt;

&lt;h4&gt;機械的なリファクタリングの力&lt;/h4&gt;

&lt;p&gt;いかがでしょうか。これらの変更は、コンパイルと同じく静的に機械的に行われるもので、現在ではかなりの信頼性を持っています。
手作業でこういった作業を行う場合、時間がかかることもありますが、ヒューマンエラーによるミスの混入を防げません。
その点からしても、これらの機能を使わない手はないでしょう。&lt;/p&gt;

&lt;p&gt;過去にはこうした作業はヒューマンエラーによるバグ混入を恐れて、「極力行わないこと」としていたかもしれませんが、
機械的に相当の精度で行われると言う前提のもとでは、そのリスクも再評価せねばなりません。&lt;/p&gt;

&lt;p&gt;少なくとも、これらの要素の名称変更に対して昔ほどリスクを負わなくなったと言うことは把握しておいてください。
名称変更がそれほどリスキーではなくなった今、名称未確定のまま開発を進めることは難しくなくなったということでもあります。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/160414.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ジェネリックなクラスの階層を遡って適用された具象型を得る</title><link>http://blogs.wankuma.com/nagise/archive/2008/10/29/160075.aspx</link><pubDate>Wed, 29 Oct 2008 00:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/10/29/160075.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/160075.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/10/29/160075.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/160075.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/160075.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/10/13/158708.aspx"&gt;イレイジャではジェネリクスの何が消えるのか&lt;/a&gt;にて親クラスを継承する際に投入しているジェネリクス型パラメータはclassの情報として残っていることを述べました。&lt;/p&gt;

&lt;p&gt;これを利用すると、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;A&amp;lt;X&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;B&amp;lt;Y&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;A&amp;lt;Y&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;C&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;B&amp;lt;String&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といった継承階層があった場合に、C.classからA.classの&amp;lt;X&amp;gt;にどのような具象型が適用されているのか(上記例ではString型)をリフレクションで取得することができます。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aの型パラメータのプレースホルダ&amp;lt;X&amp;gt;を取得&lt;/li&gt;
&lt;li&gt;Bでsuper-classの型パラメータに渡されたTypeを取得&lt;/li&gt;
&lt;li&gt;2のTypeが具象型ではなく型パラメータ&amp;lt;Y&amp;gt;なのでさらにサブクラスを走査&lt;/li&gt;
&lt;li&gt;Cでsuper-classの型パラメータに渡されたTypeを取得&lt;/li&gt;
&lt;li&gt;B&amp;lt;Y&amp;gt;のYにString型が渡されていることが分かるのでA&amp;lt;X&amp;gt;のXがStringであることが分かる&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;といった感じです。型階層がいくらあるのか分からないので再帰で処理するとよいでしょう。&lt;/p&gt;

&lt;h4&gt;サンプルプログラム&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;渡された型から継承階層を登って、&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;指定の親の型の指定の名前のジェネリクス型パラメータが&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;継承の過程で何型で具現化されているかを走査して返す。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;clazz&amp;nbsp;走査開始する型&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;targetClass&amp;nbsp;走査する対象のジェネリクス型パラメータを持つ型。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;走査開始型の親である必要がある。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;targetTypeName&amp;nbsp;何型で具現化されたを確認したい型パラメータのプレースホルダ名&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@return&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;具現化された型&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;T&amp;gt;&amp;nbsp;Class&amp;lt;T&amp;gt;&amp;nbsp;getGenericType&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;?&amp;gt;&amp;nbsp;clazz,&amp;nbsp;Class&amp;lt;?&amp;gt;&amp;nbsp;targetClass,&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;targetTypeName&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;!targetClass.isAssignableFrom&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;clazz&lt;/font&gt;&lt;font color="#000000"&gt;))&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;IllegalArgumentException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;型&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;clazz.getName&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;は、型&amp;#34;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;targetClass.getName&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;を継承していません&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Stack&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;&amp;nbsp;stack&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Stack&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;while&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;!targetClass.equals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;clazz.getSuperclass&lt;/font&gt;&lt;font color="#000000"&gt;()))&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;stack.push&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;clazz&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;clazz&amp;nbsp;=&amp;nbsp;clazz.getSuperclass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;getGenericTypeImpl&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;clazz,&amp;nbsp;targetTypeName,&amp;nbsp;stack&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;型パラメータの具象型取得の実装。再帰処理される。&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;clazz&amp;nbsp;現在の走査対象型&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;targetTypeName&amp;nbsp;現在の走査対象のジェネリクス型パラメータ名&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@param&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;stack&amp;nbsp;現在の走査対象型以下の継承階層が積まれたStack&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@return&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;該当型パラメータの具現化された型&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#646464"&gt;@SuppressWarnings&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;unchecked&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;T&amp;gt;&amp;nbsp;Class&amp;lt;T&amp;gt;&amp;nbsp;getGenericTypeImpl&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;?&amp;gt;&amp;nbsp;clazz,&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;targetTypeName,&amp;nbsp;Stack&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;&amp;nbsp;stack&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;TypeVariable&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;?&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;[]&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;superGenTypeAray&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;=&amp;nbsp;clazz.getSuperclass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;.getTypeParameters&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;走査対象の型パラメータの名称(Tなど)から宣言のインデックスを取得&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;index&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;boolean&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;existFlag&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;TypeVariable&amp;lt;?&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;?&amp;gt;&amp;gt;&amp;nbsp;type&amp;nbsp;:&amp;nbsp;superGenTypeAray&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;targetTypeName.equals&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;type.getName&lt;/font&gt;&lt;font color="#000000"&gt;()))&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;existFlag&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;index++;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;!existFlag&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;IllegalArgumentException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;targetTypeName&amp;nbsp;+&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;に合致するジェネリクス型パラメータがみつかりません&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;走査対象の型パラメータが何型とされているのかを取得&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;ParameterizedType&amp;nbsp;type&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ParameterizedType&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;clazz.getGenericSuperclass&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Type&amp;nbsp;y&amp;nbsp;=&amp;nbsp;type.getActualTypeArguments&lt;/font&gt;&lt;font color="#000000"&gt;()[&lt;/font&gt;&lt;font color="#000000"&gt;index&lt;/font&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;具象型で継承されている場合&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;y&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;instanceof&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Class&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;y;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;ジェネリックパラメータの場合&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;y&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;instanceof&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;TypeVariable&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;TypeVariable&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;&amp;nbsp;tv&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;TypeVariable&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;y;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;再帰して同名の型パラメータを継承階層を下りながら解決を試みる&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;?&amp;gt;&amp;nbsp;sub&amp;nbsp;=&amp;nbsp;stack.pop&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;getGenericTypeImpl&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;sub,&amp;nbsp;tv.getName&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;,&amp;nbsp;stack&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;ジェネリック型パラメータを持つ型の場合&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;y&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;instanceof&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ParameterizedType&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;ParameterizedType&amp;nbsp;pt&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ParameterizedType&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;y;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Class&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;pt.getRawType&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;throw&amp;nbsp;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;IllegalArgumentException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;予期せぬ型&amp;nbsp;:&amp;nbsp;&amp;#34;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;y.toString&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;&amp;nbsp;(&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;y.getClass&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;+&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;)&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/160075.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Seasarなど命名規約ベースのDIではリネームに気をつける</title><link>http://blogs.wankuma.com/nagise/archive/2008/10/22/159408.aspx</link><pubDate>Wed, 22 Oct 2008 09:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/10/22/159408.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/159408.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/10/22/159408.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/159408.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/159408.aspx</trackback:ping><description>&lt;p&gt;Seasarでは命名規約に則ったクラス名のクラスのインスタンスを、同名のフィールドにインジェクションしてくれる機能があります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SampleService&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;DIコンテナがインジェクションしてくれるフィールド&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;HogeLogic&amp;nbsp;hogeLogic;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;exec&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.hogeLogic.hoge&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;これは命名規約を理解して使っている分には便利なのですが、Eclipseのリファクタリング機能などで
クラス名をリネームすると突如動かなくなることがあるので注意が必要です。&lt;/p&gt;

&lt;p&gt;上記例で、HogeLogicをPiyoLogicにリネームするとしましょう。HogeLogicのクラス名を選択して、Refactor → rename を選択します。
すると以下のようなバルーンが表示される(以下はEclipse3.4のスクリーンショット。確か3.2以前ではリネームは必ずダイアログでの入力だったはず)
ので新しい名前―ここではPiyoLogicとしましょう―を入力します。&lt;/p&gt;

&lt;img src="http://nagise.wankuma.com/image/rename01.png"&gt;

&lt;p&gt;すると、Eclipseのリファクタリング機能でクラス名をリネームすると、参照している箇所を網羅的に探してリネームしてくれるため、
プロジェクトの全ソース中でHogeServiceがPiyoServiceに変わります。&lt;/p&gt;

&lt;p&gt;この際、クラス名は変更されますが、同名のフィールド名まではリネームしてはくれません。
そのため、SampleServiceでのフィールド宣言は以下のようになります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;DIコンテナがインジェクションしてくれるフィールド&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PiyoLogic&amp;nbsp;hogeLogic;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;フィールド名が元のままですね。これにより、命名規約違反が生じてうまくインジェクションされなくなります。
コンパイルエラーは起きませんが、実行時にインジェクションを期待したフィールドがnull値となり
NullPointerExceptionを発生させることになります。&lt;/p&gt;

&lt;p&gt;デフォルトのリネーム操作だとこのような問題が起きるのですが、Eclipseにはフィールド名を含めたリネームがサポートされています。
リネームの際に▼をクリックし、"Open Rename Dialog"とします。(キーボードショートカットのAlt+Shift+Rも活用しましょう)&lt;/p&gt;

&lt;img src="http://nagise.wankuma.com/image/rename02.png"&gt;
&lt;img src="http://nagise.wankuma.com/image/rename03.png"&gt;

&lt;p&gt;"Update similarly named variables and methods"にチェックを入れます。
同名の変数とメソッド(getter,setterなど)を更新する、という意味合いですね。
そうすると、以下のように変数名も同時にリネームしてくれます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SampleService&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;/**&amp;nbsp;DIコンテナがインジェクションしてくれるフィールド&amp;nbsp;*/&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;PiyoLogic&amp;nbsp;piyoLogic;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;exec&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.piyoLogic.hoge&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Seaserなどを利用している場合は、クラス名のリネームの際にはこの点に気を付けて作業しましょう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/159408.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>イレイジャではジェネリクスの何が消えるのか</title><link>http://blogs.wankuma.com/nagise/archive/2008/10/13/158708.aspx</link><pubDate>Mon, 13 Oct 2008 20:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/10/13/158708.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/158708.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/10/13/158708.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/158708.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/158708.aspx</trackback:ping><description>&lt;p&gt;Javaのジェネリクスはコンパイル時に解決され、classファイルになった時にはジェネリクスの型情報は残されていません。そのためイレイジャ（型消去：type erasure）方式と呼ばれます。&lt;/p&gt;

&lt;p&gt;と、ひとくちで言っても意味がよく分からないのでちょっと掘り下げてみましょう。&lt;/p&gt;

&lt;h4&gt;インスタンスからジェネリクスの型情報は拾えない&lt;/h4&gt;

&lt;p&gt;リフレクションを用いたとしても、インスタンスからジェネリクス型パラメータが何であるかを取得することはできません。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#000000"&gt;List&amp;lt;String&amp;gt;&amp;nbsp;stringList&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ArrayList&amp;lt;String&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;のような変数stringListがあったとして、ここから&amp;lt;String&amp;gt;を取得するということができないのです。これが消えてしまった部分。&lt;/p&gt;

&lt;p&gt;この変数stringListに対する各種操作において、その型の安全はコンパイル時に精査され、
実行時にはあくまでObject型引数のメソッドを通したやりとりで動くのです。&lt;/p&gt;

&lt;h4&gt;クラス宣言に関わるジェネリクス型情報は拾える&lt;/h4&gt;

&lt;p&gt;しかし、型の宣言に関する部分はリフレクションで拾うことができます。ここが混乱する部分ですね。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;親クラスを継承する際に投入しているジェネリクス型パラメータ
&lt;li&gt;インターフェースを実装する際に投入しているジェネリクス型パラメータ
&lt;li&gt;メソッドの引数・戻り値に用いられているジェネリックな型とそこに渡される型パラメータ
&lt;li&gt;フィールドに用いられているジェネリックな型とそこに渡される型パラメータ
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;といった情報は拾えるわけです。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Piyo&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Hoge&amp;lt;String&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;implements&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;IHoge&amp;lt;String&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;String&amp;gt;&amp;nbsp;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;String&amp;gt;&amp;nbsp;get&lt;/font&gt;&lt;font color="#000000"&gt;()&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;return&amp;nbsp;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;void&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;List&amp;lt;String&amp;gt;&amp;nbsp;value&lt;/font&gt;&lt;font color="#000000"&gt;)&amp;nbsp;{&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;.value&amp;nbsp;=&amp;nbsp;value;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;
&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といったコードがあった場合、リフレクションで親クラスがHoge&amp;lt;String&amp;gt;型であることを拾えます。インターフェースも同等。
また、フィールドやメソッドの戻り値・引数がList&amp;lt;String&amp;gt;型であることも拾うことができます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/158708.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>11/08は富山勉強会</title><link>http://blogs.wankuma.com/nagise/archive/2008/10/07/158353.aspx</link><pubDate>Tue, 07 Oct 2008 09:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/10/07/158353.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/158353.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/10/07/158353.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/158353.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/158353.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/naka/archive/2008/10/02/158024.aspx"&gt;中さんのところ&lt;/a&gt;でも告知がでていましたが、
&lt;a href="http://www.wankuma.com/seminar/20081108toyama01/Default.aspx"&gt;わんくま同盟 富山勉強会 #01&lt;/a&gt;の募集が始まっています。&lt;/p&gt;

&lt;p&gt;2008/11/08(土)で場所は富山県民会館です。富山駅近辺ですので近県の方も是非いらしてくださいね。&lt;/p&gt;

&lt;p&gt;LT(ライトニングトーク)の登壇者募集中です。発表時間は5分きっかり。こちらはテーマも自由ですよ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/158353.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アーキテクチャ選定を考える</title><link>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx</link><pubDate>Sun, 28 Sep 2008 14:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/157667.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/157667.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/157667.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx"&gt;アーキテクチャ選定ではメリットとデメリットを考える&lt;/a&gt;
ではフレームワークやアーキテクチャの選定は合目的でなくてはならない、ということを言いましたが、
「システムの贅肉」という曖昧な概念を説明できていませんでした。&lt;/p&gt;

&lt;p&gt;なんとなくイメージはできるんだけど、論理的な定義をうまくあたえれていない…。&lt;/p&gt;

&lt;h4&gt;骨格 ＝ 要件の大きさ&lt;/h4&gt;

&lt;p&gt;まず、確認しておくことは、システムの規模そのものの大きさです。
要件定義・要件開発において、スマートになるように要件を決めよう、という話題ですね。&lt;/p&gt;

&lt;p&gt;お客さんに「ちょっとここはこうなるようにしてほしい」とか言われたときに気にするのがこの点。
今の設計に無理なく乗るなら軽く「いいですよ」と返せるところですが、その一見小さく見える事象に対応するために
骨格がいびつになるような場合は悩んでしまいますね。&lt;/p&gt;

&lt;p&gt;さて、そんな要件開発ですが、絶対値というか、要求される事象の大きさの下限は決まっていて、
目的を達成するために必要な最低限の骨格を作るだけでも、とても大きな骨格になってしまうものもあります。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/Nagise/20080915/1221462208"&gt;ネズミかゾウかではなくて、肥満か筋肉質かだろう&lt;/a&gt;が言っているのは
この骨格の大きさと、プログラミングのまずさからくる贅肉を混同するな、ということですね。&lt;/p&gt;

&lt;h4&gt;体の大きさ ＝ 実装の大きさ&lt;/h4&gt;

&lt;p&gt;要件を実装するにあたって、実装手段によってソースコード、つまるところ実装の大きさが異なります。
大雑把にいえばステップ数ですね。
(ステップ数という単位は誤差が酷いのであまり使いたくないですが、プログラムの大きさと正の相関を持つのは事実)&lt;/p&gt;

&lt;h4&gt;成長の早さ ＝ リリースまでの期間&lt;/h4&gt;

&lt;p&gt;システムを完成させるまでの期間、というのはゾウなりネズミなりが成人するまでの期間に相当するでしょう。&lt;/p&gt;

&lt;p&gt;ゆっくり時間をかけて成長（プログラミング）が進み、完成までに数年の歳月を費やすシステムもあれば、
非常に高速で成長しわずかに数か月で稼働にこぎつけるシステムもあることでしょう。&lt;/p&gt;

&lt;p&gt;一般には、小さなシステムの方が、リリースまでの期間は早く、大きなシステムほどリリース時期は遅い。&lt;/p&gt;

&lt;h4&gt;養育費用 ＝ 開発コスト&lt;/h4&gt;

&lt;p&gt;成人までの間にどれだけの費用を投入したのかという数値ですね。&lt;/p&gt;

&lt;h4&gt;成人後の成長 ＝ アジャイル性&lt;/h4&gt;

&lt;p&gt;アジャイルなシステムというのは成人が早い。割と未熟なうちにリリースしてしまう。
リリース後の成長も大きく、成人してからも代謝が高いのですね。&lt;/p&gt;

&lt;p&gt;対してウォーターフォール式のシステム開発などは、成人後にほとんど成長は止まってしまう。
下手をすると成長などまるでなくて、「老後の介護」にばかり手間がかかるということもありえるのです。&lt;/p&gt;

&lt;p&gt;代謝を高めるための設計手法と言うのもあります。こうした後の変更がある場合にそれは活きてくる。
でも、いざそのときが来ない限りはそうした設計の良さというのは日の目を見ない。
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx"&gt;ソフトウェアの保守性はアップサイドリスクである&lt;/a&gt;
で言ったのはそういう事情のことなのですね。&lt;/p&gt;

&lt;h4&gt;寿命 ＝ システムの寿命&lt;/h4&gt;

&lt;p&gt;システムは改修をしつつ、使われるわけですが、やがて寿命を迎えます。死因はさまざまですが、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;土台となるOSやミドルウェアが死んだ
&lt;li&gt;要求の変更に対応できなくなった
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;というのが大きいかなと思います。&lt;/p&gt;

&lt;p&gt;システムというのは設計時に、いろんな前提条件を加味します。こういう部分は変更が容易なように、この辺は変えなくてもよい、とかいろいろ。
「全部対応できるように」だといくらカネがあっても足りません。&lt;/p&gt;

&lt;p&gt;それらの前提が覆ってしまったとき、それがシステムが死ぬべき時だと私は考えます。&lt;/p&gt;

&lt;h4&gt;贅肉・筋肉 ＝ ？？？&lt;/h4&gt;

&lt;p&gt;さて、問題となるのがここですね。「実装の質」と言いたいところですが、ひとことに「質」と言っても質にも種類があるので混乱しやすい。&lt;/p&gt;

&lt;p&gt;例えば、高い処理効率（パフォーマンス）をたたき出すようなカリカリにチューニングされたソースコードというのは、
変更に対してとても弱い。柔軟性に欠けるわけですね。&lt;/p&gt;

&lt;p&gt;逆に抽象化を施し、仕様変更などにも柔軟に対応できるようなコードというのはパフォーマンスで劣る。柔軟だけど速度は遅い。&lt;/p&gt;

&lt;p&gt;なので、これらのメリット・デメリットを考えた上で適度なところでバランスする必要があります。赤筋（反応が遅いが持続力がある）と白筋（反応が速いが持続力がない）みたいなもんですね。ハンマー投げの室伏広治氏は白筋が多く、マラソンは苦手だというエピソードもあります。状況を見て合致する「質」を選ばなくてはいけない。&lt;/p&gt;

&lt;p&gt;ただ、一見して贅肉と分かるものも中にはあって、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;コードクローン。要するにコピー＆ペーストによって冗長なコードになっている状態
&lt;li&gt;構造化がうまくされていない
&lt;li&gt;データ構造が非効率
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;といったところはかなり目立つ贅肉ですね。データ構造が悪いと、それを処理するプログラムも煩雑になって贅肉が贅肉を呼ぶ状態。&lt;/p&gt;

&lt;p&gt;こうした、明らかな贅肉はそぎ落とすことでコードが数分の一になることがありますが、経験則からして1/10を超えない。
どんだけ贅肉で太らせようとても骨格が支えられないほどには大きくなる前にシステムが破たんするのではないかと思います。
人間の体重も世界記録では700kgぐらいらしく、限界までいっても10倍そこそこのようですね。&lt;/p&gt;

&lt;h4&gt;体脂肪を落とす効率&lt;/h4&gt;

&lt;p&gt;システムの贅肉を落とし、体脂肪率を10%にするためのコストと、体脂肪率10%から1%に落とすコスト、1%から0.1%に落とすコストが概ね等しいと思います。(&lt;a href="http://d.hatena.ne.jp/katzchang/20080925"&gt;無責任な社会、限定責任な社会&lt;/a&gt;から着想)&lt;/p&gt;

&lt;p&gt;まぁこれは概念的な話なので数字が正確かというと怪しいのだけども、指数関数的だよね、というのは理解いただきたい。
過度なダイエットは費用ばかりが嵩むので、ほどほどの贅肉は許容せざるをえないというわけです。&lt;/p&gt;

&lt;p&gt;とはいえ、このほどほどの贅肉はコードが数分の一に縮むほどの贅肉じゃない。人間だって体脂肪率が0%になることはないでしょう？多少の脂肪に病的に神経質になっても仕方がない。&lt;/p&gt;

&lt;h4&gt;合目的なアーキテクチャ選定&lt;/h4&gt;

&lt;p&gt;フレームワークやアーキテクチャの選定は合目的でなくてはならない。そこで取り上げられる評価軸は「小規模 - 大規模」なんて単純な1軸ではないわけです。&lt;/p&gt;

&lt;p&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;&lt;/p&gt;

&lt;p&gt;「時間、品質、料金」のうちから、2つを選択できる、なんてジョークがあるのですが、示唆深いと思いませんか？&lt;/p&gt;

&lt;p&gt;これらのうち、何を活かして何に目をつぶるのか、その比率はどの程度にするのかというのが、アーキテクチャ選定で悩む部分です。
小さなシステムは、使い捨てにすることもできる。リリースまでの期間が短くコストも小さいなら、定期的に使い捨てにするという方法論もアリでしょう。
過去のリソースを使いたいからCOBOLで開発というのもコスト・リスクが見合うならあるいはアリでしょう。&lt;/p&gt;

&lt;p&gt;コンセプトは前提条件の上に繰り広げられるものです。コンセプトだけ聞くと「ないわー」と思うようなことでも、特定のシチュエーション下では「そうせざるを得ないね」という合理的なものであったりするのです。&lt;/p&gt;

&lt;p&gt;目的があってその実現手段としてアーキテクチャを選ぶのですから、アーキテクチャ単体だけを取り上げて安易に良しあしと言ってはいけない。&lt;/p&gt;

&lt;p&gt;出来ることなら、技能あるチームで今風のアーキテクチャで今風の設計をするようなシステム開発をやりたいものですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/157667.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アーキテクチャ選定ではメリットとデメリットを考える</title><link>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx</link><pubDate>Thu, 25 Sep 2008 23:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/157505.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/157505.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/157505.aspx</trackback:ping><description>&lt;p&gt;アルゴリズムであるとか、アーキテクチャというのは、必ずメリットとデメリットがあります。&lt;/p&gt;

&lt;p&gt;プログラマは前提条件に合わせてメリットが活き、デメリットは表に出ないように考えアルゴリズムの選定します。アーキテクトがフレームワークやアーキテクチャを選定する時も同等です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kwatch/20080912/1221174865"&gt;「大規模プロジェクトではどうするか」を考えるより、「大規模にしないためにはどうするか」を考えよう&lt;/a&gt;というエントリに対し、私は&lt;a href="http://d.hatena.ne.jp/Nagise/20080915/1221462208"&gt;ネズミかゾウかではなくて、肥満か筋肉質かだろう&lt;/a&gt;と答えたわけですが、さて、では筋肉質なシステムとはどんなシステムか？という話になります。&lt;/p&gt;

&lt;p&gt;思うに、筋肉質なシステムというのは、選定したアーキテクチャなり、フレームワークなりのメリットが活き、デメリットが隠れるようになっている、そんなシステムのことではないでしょうか。&lt;/p&gt;

&lt;p&gt;だから、それが例えばCOBOLで新規開発という話だったとしても、「過去資産を活用する」というメリットが大きく、その過去資産の活用のための工数がデメリットにならず、過去資産を流用することで未来の保守の工数が嵩むといったデメリットもでない、というなら筋肉質と言えましょう。&lt;/p&gt;

&lt;p&gt;通常は、このメリット・デメリットを秤にかけて、相応にメリットが大きいという状況でないといけないわけで、&lt;a href="http://itpro.nikkeibp.co.jp/article/NEWS/20080906/314277/"&gt;東京海上の例&lt;/a&gt;では、本当にデメリットは小さいの？と疑問に思うわけです。&lt;/p&gt;

&lt;p&gt;さて、ではJavaのフレームワークの中ではすっかり枯れた技術という評判のStrutsはどうなのでしょうか？Strutsは初出が2001年と古く、近年のAJAXなどの対応を盛り込むにはマッチしないフレームワークだと私は評しています。非同期通信を伴わない、単純なWebシステムで工数を抑えて機能を量産するというなら、それなりにメリットは活きるでしょうし、デメリットは隠れるのではないかと思います。&lt;/p&gt;

&lt;p&gt;これはStrutsに限らず、PHPやRubyでの開発でも、状況によってはメリットは活きず、デメリットが表出することになります。そうしたミスマッチな選択をしたプロジェクトは、その無理から脂肪のような無駄なソースが膨らみ、デメリットだらけとなってしまうことでしょう。私が選定するならFlexなどのリッチクライアントとかかなぁ。ユーザ容貌的にそちらの方がマッチして贅肉が少なくなる気がしますね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/157505.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>9/13は「エンジニアの未来サミット」</title><link>http://blogs.wankuma.com/nagise/archive/2008/09/12/156362.aspx</link><pubDate>Fri, 12 Sep 2008 14:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/12/156362.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/156362.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/12/156362.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/156362.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/156362.aspx</trackback:ping><description>&lt;p&gt;明日は&lt;a href="http://gihyo.jp/event/2008/engineer"&gt;「エンジニアの未来サミット」&lt;/a&gt;ですね。
私も参加します。会場では名札さげるようにしますので、お気軽に声をおかけください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/higayasuo/20080529/1212036046"&gt;
「IT業界の重鎮に期待せず、アルファギークと学生の討論会はいかが」&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/higayasuo/20080623/1214197466"&gt;
「アルファギークと学生の討論会 - 速報」&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/higayasuo/20080717/1216258104"&gt;
「アルファギークと学生の討論会 - 続報」&lt;/a&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/higayasuo/20080912/1221194101"&gt;
「小飼弾とひがやすをは仲が悪い?」&lt;/a&gt;
&lt;/ul&gt;

&lt;h4&gt;そもそも何のイベントなの？&lt;/h4&gt;

&lt;p&gt;ことの始まりは10年泥で話題になったIPAX2008。情報処理推進機構（IPA）が開催したものだったのですが、
いろいろ議論を呼ぶ展開になりました。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/news/200805/28/ipa.html"&gt;
「10年は泥のように働け」「無理です」――今年も学生と経営者が討論&lt;/a&gt;
&lt;li&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/NEWS/20080528/304458/"&gt;
「IT技術者はやりがいがある仕事か」---学生とIT産業のトップが公開対談 &lt;/a&gt;
&lt;/ul&gt;

&lt;p&gt;これを受けて、Seasarで著名なひがやすを氏が
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080529/1212036046"&gt;
「IT業界の重鎮に期待せず、アルファギークと学生の討論会はいかが」&lt;/a&gt;にて&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
とはいえ、重鎮たちと学生を討論させても、学生がIT(SI)業界に夢を持ってくれるとは思えないので、ここで1つ提案をしたい。&lt;br&gt;
小飼弾のアルファギークに逢ってきたのメンバーと学生会の討論会を開くのだ。&lt;br&gt;
もちろん、司会は、ダンコーガイ。いいよね、弾さん。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;と言いだしたのが始まり。本当に実現させちゃうんだからひがさんは凄いですよね。&lt;/p&gt;

&lt;p&gt;自分はアルファギークと言うほどでもありませんが、会場をうろついているので学生の参加者の方は
気軽に質問をぶつけてみてくださいね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/156362.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>