tanigonのS2部屋

メイン日記はこちら(tanigonの日記)

2004-09-13

くーす

くーすのポイントだと思っているのが「サービス指向」「客の視点でシステムを見る」というところだと思います。

造ろうとしているシステムが正しいことを検証するにはユーザのレビューしかない。まったく同感で、これを実現するためにあれやこれや考えられた仕組みがあります。逆に、ドメインモデルを否定しているのは、まさにこの点のみに依存しているのでしょう。

話は変わって、私の先輩、(なにもITだけが答えではない)というようなコンサルティング会社の方ですが『顧客が、自分の改善すべき点を知っている確率は高くない』というようなことを言ってました。まあ、その通り、ですよね。『顧客のビジネスについて顧客が一番知っているのは間違いないが、自身の問題点を理解できない。もしくは問題点を理解できても改善方法がわからない』と。そこをサポートするのがコンサルティングの役目ではないか、と言われていたわけです。

つまり、システムを造るかどうかも未定の段階において、顧客は自分がなすべきこと、平たく言うとソリューション…の輪郭ぐらいしか掴めていない可能性があるというわけです。

くーすは、顧客の目線からシステムの正しさを検証し、造る。結果として納品されるシステムは本当の意味で顧客が求めたものになる。そして、大きな意味で改善やソリューション(一部の人には怒られそうですが、BPRとかも意味が似ているかも)を捉えたときには、くーすの前に問題点の発見、解決、顧客ビジネスの理解、対策・解決すべきポイントについて合意をする必要がある、と。この一連のプロセスの中で、唯一開発者が突っ走りがちで顧客無視になりがちだったシステム開発のプロセスを「くーす」は変えようとしている。そう感じます。

もちろん、「顧客ビジネスの理解」のところで難解なビジネスモデリングをしたり、網羅性の低いモデリングをもって顧客にレビューをする。当該業務に詳しくない人間(というか、社内の人間に書いてもらったものを集積する以外には、社外の人間なんてことごとく当該業務には詳しくないはず)が造ったモデルの「正当性」のみを確認して、漏れについては検証できない。こんな問題点もあるわけで、システム開発が「くーす」によって改善されたら、今度はより上流の分野について同じような改革が必要なのだろうな、と思います。

で、から騒ぎの夜、はぶさんに見せてもらった数々のものをみながら考えました。顧客にモデリングをさせるカード的な手法(固有名詞出していいんですかね...?)なんかはコロンブスの卵というか、素晴らしいなあ、と思いました。

ビジネスモデリングや課題抽出・発見プロセスは形式知的にいろんな本が出てますし、あたりもはずれもあるのでしょうけど、ゴールはやはりその大きなフローの結果が本当に顧客の現状を改善し、利益に繋がる、というところなのだろうと思うので、これからだってどんどん新しい手法が出てくるし、何度でも改革されるのだと思います。そんな中で「手法側」のゴールとしては「正確さ」「精密さ」に加えて、顧客の視点から見たときの「正しさ?」というようなものが加えられるような気がします。

そういう意味では抽象的なパターンの、しかもUML図を持ち出してビジネスモデリングクラス図みたいなものでやっちゃって顧客レビュー、なんてほとんどあり得ないっすね…

habuakihirohabuakihiro2004/09/13 20:15マジカは名前を出しても全然OKっす(^^) 私の日記でも書いてますし。DIやくーすが当たり前になると、今度はここが主戦場になると思っているので、今から仕込みです。

JannikaJannika2011/09/30 08:31This piece was cogent, well-writetn, and pithy.

upeigdupeigd2011/09/30 20:1037d8IX <a href="http://amdtgbpjcamd.com/">amdtgbpjcamd</a>

kzteaqkzteaq2011/10/02 20:364cIYCG , [url=http://hjakvewfmevj.com/]hjakvewfmevj[/url], [link=http://byxarizbigjh.com/]byxarizbigjh[/link], http://grlzxjsdarhz.com/

vqawwdvqawwd2011/10/03 19:427Fnl59 <a href="http://tknnuapompvg.com/">tknnuapompvg</a>

xvsstwrhrxvsstwrhr2011/10/06 02:51YX5G2A , [url=http://ypiaqwdznpgc.com/]ypiaqwdznpgc[/url], [link=http://actxdlxnrrpr.com/]actxdlxnrrpr[/link], http://oejbcllbxvxw.com/

2004-09-10

[] ResultSetFactoryの置き換え

Seasar-users:800付近…で私が苦しんでいたOracle8iのunicodeのコンバートテーブルが…という話で、ResultSetをラッピングする仕掛けを用意してくだすった。というところで止まっていた。イカン!申し訳ない。

で、これでDbUtilsもいらんか、とばかりに当該の機能を物色。

多分これだ!

private static ResultSetFactory resultSetFactory_ = new BasicResultSetFactory();

[snap]

	public synchronized static void register(ResultSetFactory resultSetFactory) {
		resultSetFactory_ = resultSetFactory;
	}

なるほど。

これ、staticなのはやっぱりbasicSelectHandlerが複数インスタンス作成されるから、ということですよね?

複数のdataSourceを扱うケースもあり、適用したい場合としたくない場合もあるかと思うので、staticじゃなくする、というのはどうでしょう?

.diconが膨れあがるかもしれないですが setResultSetFactory()みたいな感じで、setter-injectionでもいいのではないかという気がしますです。

ちなみに、BasicResultSetFactory,

public static final ResultSetFactory INSTANCE = new BasicResultSetFactory();

これってコード上の残骸でしょうか? 何も考えず Eclipseで Ctrl+Shift+G してみましたが参照個所は見つかりませんでした。singletonのようにも見えないので、無視しておけばいいかな?

なんだかまた公開質問状・要望状みたいになってしまった。。。

明日は

明日は心斎橋でから騒ぎ@大阪。勉強するぞー

higayasuohigayasuo2004/09/10 20:16setter injectionに変えておきます。

tanigontanigon2004/09/10 20:22あ、ありがとうございます! 恐ろしく速いreplyでびっくりしました

2004-09-03

[] diconの読み込み

public class S2DjTestCase extends S2TestCase {
  .
  .
    protected void setUp() throws Exception {
        super.setUp();
        MockObjectManager.initialize();
        try {
            include(this.getClass().getName().replaceAll(".*\\.", "") + ".dicon");
        } catch (ResourceNotFoundRuntimeException e) {
        }
    }

これでincludeすら書かない超ズボラ

djunit+S2Unitで楽々テスト

MockInterceptorの実戦投入をしていて思ったこと。

	<component name="dao" class="SomeInterfaceOfDAO">
		<aspect>
			<component name="mock" class="org.seasar.framework.aop.interceptors.MockInterceptor">
				.
				.
			</component>	
		</asepect>
	</component>

こういう時にTestCase側からmockにverifyしにいく(呼ばれましたか? とか 引数どうでしたか?とか)時には、

MockInterceptorのインスタンスを参照できる必要があるので、

  MockInterceptor mock = (MockInterceptor)getComponent("mock")

とか書いて見ると参照できなかった。

	<component name="mock" class="org.seasar.framework.aop.interceptors.MockInterceptor">
		.
		.
	</component>	

	<component name="dao" class="SomeInterfaceOfDAO">
		<aspect>mock</asepect>
	</component>

これだといけました。

前者の方の name="mock" というのは有効なスコープがある、ということなのでしょうか?

分ければいいだけなのですが。ひょっとしてnamespaceみたくなってる、とか。。。?

S2ソースを追いかければいいのでしょうけども、いま体力がないので(言い訳)とりあえずメモってみた。

ちなみに参照できないと困るというわけではないのです。

higayasuohigayasuo2004/09/03 22:47マニュアルに書いてないので申し訳ないのですが、
components直下のタグでないと名前で参照できない
ですね。m(_ _)m

TelleyTelley2012/02/16 22:37Enlightening the world, one helpful atrilce at a time.

TelleyTelley2012/02/16 22:38Enlightening the world, one helpful atrilce at a time.

krnvmqkrnvmq2012/02/17 03:52koC4sd <a href="http://ykautzwdayhz.com/">ykautzwdayhz</a>

qtcdcfywqtcdcfyw2012/02/18 00:14oO7ZpE , [url=http://pwosfzdqwpii.com/]pwosfzdqwpii[/url], [link=http://tapdbaqronup.com/]tapdbaqronup[/link], http://tpxoakzvihot.com/

tlkodpwajytlkodpwajy2012/02/22 02:41lNMy0t <a href="http://csgwtdiydwhw.com/">csgwtdiydwhw</a>

2004-08-27

[] 気のせい?

<component class="com.dumbster.smtp.SimpleSmtpServer" name="dumbster">
  @com.dumbster.smtp.SimpleSmtpServer@start(12345)
</component>

みたいな感じでdiconを書いたときに

[component] 式言語class属性の両方が記述されています

と、ごもっともなのですが、まにあるを見ると

class属性(任意)
クラスの完全限定名を指定します。
ボディで、OGNL式を使ってコンポーネントを指定した場合は、class属性を省略することができます。
OGNL式を使った場合にclass属性を指定すると、型チェックを行います。

というわけで、型チェックを行ってくれる(素晴らしい)という機能があるようなので、この警告って「ほんとに意図してますか?」という警告なのかな.

切れると嬉しいなー...っていうか単純に私の勘違い!? そんな気がしてきた

Kijimunaメモ

<aspect>SomethingUnknown</aspect>

<aspect>タグの中身に指定している参照がcomponent宣言されていなくてもエラーにはならない。

っていうかこんな単純なミスすんなよ... > 自分

S2TestCase関係メモ

instance="singleton"

もしくはデフォルトの場合、これがコンテナによって解釈・インスタンス生成・存在する場合はfieldInjection...されるのはテストメソッドごと。なので"singleton"をちょいと誤解しやすい。テストメソッドの中で何回getComponent()してもsingletonですよ、ということで、テストメソッド間でsingletonというわけではない、ようだ。

instance="prototype"

しておけば、必要なときに取りにいけばそのときに生成される。ただしS2TestCaseでfieldInjectionしてもらう時はだめぽ(これは当たり前)

S2TestCase関係メモ

<component name="dumbster">
  @com.dumbster.smtp.SimpleSmtpServer@start(12345)
</component>

のようなケースのとき、getComponent()ならclasscastで何の問題もないが、

  SimpleSmtpServer dumbster;

のようにfieldInjectionを期待しているものがある場合、例外になってテストケースは全て失敗する。どうもAssignable関係でうんぬんかんぬん。これはcomponentタグにclass属性を付けてあげればもちろん解決する。それかgetComponent()をcastして使うか。前者がオススメ。

fieldInjectionについては別の日記でかなり否定していたがS2TestCaseはすでにコンテナに依存しているのでこれはアリだと自己解決。 fieldInjectionされますよ、というのはコンテナに依存するコンテナ(というかS2TestCase)の便利機能で、テストケースのクラスもこれに依存しているのでこれは無問題

BubuBubu2012/10/28 18:12Woot, I will cretialny put this to good use!

tpawxmtpawxm2012/10/29 05:22P9SeJF <a href="http://cuswananoudj.com/">cuswananoudj</a>

lktjhqmtjxrlktjhqmtjxr2012/10/30 18:07cEoAjN , [url=http://kzfmxhzujvxv.com/]kzfmxhzujvxv[/url], [link=http://jsfylyutoqbg.com/]jsfylyutoqbg[/link], http://rmizixsuyfjx.com/

luyukpbssskluyukpbsssk2012/10/31 00:58XbvxxX <a href="http://hmsexovcvvml.com/">hmsexovcvvml</a>

2004-08-24

LIKEを使う場合

OLTP型で検索がジャンジャン走るようなDB+Webアプリケーションを造った場合、SQLのコンパイルコストというのが結構無視できないものになります。

で、たとえば「人名検索」の場合に「●●を含む」「●●からはじまる」とかをユーザーに選んでもらって(協力してもらって)、動的に

 if (isStartWithOption) {
   likeClause = originalString + "%";
 } else {
   likeClause = "%" + originalString + "%";
 }
 statement.setString(1, likeClause);  // where hoge like ? 

なんてなことになったりするのですが、ここでポイントだと思うのは、likeに対してはバインド変数としておいて内容だけ変えることによってSQLのコンパイルコストを抑えることが出来る点だと思います。

ただし、これはRDBMSの種類、バージョンに強く依存しますし、Oracleの場合でもバインド変数の値の違いによってコンパイルバージョンが違う(少なくとも部分一致検索ならインデクスを使う使わないというプランテーブルが異なる)ので一概には言えないのですが、固定文字列が入るよりも"期待"がもてます。

そういう意味では

public abstract class EmployeeDaoImpl
  implements EmployeeDao
  extends AbstractDao {

  public List getEmployees(String ename) {
    return find("ename LIKE '%" + ename + "%'");
  }
}

というような形でLIKEを書いてしまうと ひょっとするとRDBMSがいい感じにしてくれるかもしれない、という望みが薄くなりそうです(カシコイやつならこのへんももちろんやってくれそうです)。

SQLキャッシュに限りがあるようなDBMSの場合は検索がガンガン違う条件で走ると、せっかくのコンパイル済みのものもどんどんパージされていきそうで、これもちょっと悲しいです(繰り返しますが、このへんはDBMSの仕事なので、DBMSに依存します。)

ほんなら LIKE ? にしておいて、S2DaogetEmployees(String partial);みたいなことにしておいて、partialに %を入れた文字列を渡せばいいのですが、これって SQLという世界に依存しちゃってます。 %とか_とかはSQLの仕様なので。

もちろん手足を動かして実験したわけではないので、ひょっとしたら間違ってるかもしれませんが。

なんかうまい解決法、ないんでしょうか。

higayasuohigayasuo2004/08/24 14:06例が悪かったです。m(_ _)m
find("ename LIKE ?",
new Object[]{'%" + ename + "%'"));
でいけます。

tanigontanigon2004/08/24 15:44なんですって! やっぱり手足を動かさずに書くのはNGでしたね。一度でもやってみればわかったことでした。スンマセン

higayasuohigayasuo2004/08/24 16:16いやいや、まだ未来の機能なので、手足は動かせません。(^^;

AndrewAndrew2013/11/23 12:45I went to tons of links before this, what was I thiiknng?

BesimBesim2013/11/24 02:48THX that's a great <a href="http://pyrxmjtpk.com">ansrew!</a>

DavidDavid2013/11/25 04:57Yup, that'll do it. You have my apritcpaeion. http://lwqbeevijvp.com [url=http://uwikcie.com]uwikcie[/url] [link=http://bnivfliu.com]bnivfliu[/link]