木曜日, 10月 17, 2013

小規模企業によるFOSS開発のモデルケースになりうるかもしれない事例

最近は企業によるFOSS活動も活発になっています。
そんな中で、今注目している一連の流れ。


そもそもの発端。20人/月のほとんどはサーバではなくアプリ側に使われているのだろうか。
世界初 メッセンジャーアプリ「Spika」を完全オープンソースで公開、フロントからバックエンドまで提供


問題点の指摘。最大の問題点である問題が指摘されているDBの部分は2013/10/16時点のコミットで完全に消去されているみたい。
レガシーズ公式ブログ PHPerはSpikaのどこを見たのか?


そして有志?によって直す会が開かれるらしい。
spika hackathon Spika-Server のコードを15年ぐらい若返らせます

行数は少なめでやる事は決まっているので、設計上の問題が無ければ割と簡単なはずだけど、モダンになった後のコードで、元の企業の人たちがカスタマイズやコンサルティングができるようになるのかが気になるところ。

一番最初の記事中で、WordPressのような存在になりたいと言っているけど、WordPressもこんな問題を抱えている。せめてPSRの議論と投票には参加して欲しい。
レガシーズ公式ブログ 活動報告 「レガシーコード in WordPress」

日曜日, 8月 04, 2013

夏の日に道を教える

今回は新宿で若い男女の観光客。
以前、外国人の方に聞かれたのと同じホテルの場所を聞かれる。有名なホテルなのかな?
今回は歩道沿いにある地図でご案内。

道を聞かれたのは日本人だけど、最近外国人観光客が多い印象。それもどうみてもお金の無さそうな大学生っぽい人たちとか、割と普通な家族。
円安の効果?

水曜日, 6月 05, 2013

exportsされていないjavascriptやCoffeeScriptのメソッドをテストする。

半分以上、自分向けメモ。 

exportsされていないjavascriptのメソッドをテストするにはどうするか。
理屈としては、以下の記事2つを読めばOK。要はjsを別コンテクストにロードして、その時にプライベートなメソッドを引き上げるわけですね。

Testing Private State and Mocking Dependencies
Nodeでプライベートな(exportsされてない)メソッドのテスト

不思議なのは、どちらの記事でも、node-mocksに触れられていない事(一番目の記事のコメントで触れられているだけ)。
これは一番目の記事のvojtajinaさんが作ったライブラリで、ざっくり言えば、解説されている内容が実装されているテスト用のライブラリ。
これを使えば、いちいち上記解説記事のコードを書かなくて済むわけですね。めでたしめでたし。

と思ったのですが、このライブラリ、JSは読み込めるのだけど、CoffeeScriptを直接読み込むことが出来ません(README.mdのサンプルテストコードはCoffeeScriptで書かれているのに)。
もちろん、JSにコンパイルすればよいのだけど、面倒なわけです。

というわけで、CoffeeScriptをロード出来るようにしてみました。

https://github.com/kmtr/node-mocks/tree/coffeescript

npmでインストールするなら、以下を実行。

npm install https://github.com/kmtr/node-mocks/tarball/coffeescript --save-dev

可能な限りCoffeeScriptから出ずに、開発したい私みたいな人におすすめです。

一応、pull requestを送ってみたけどどうだろうか。
オリジナルと比べてcoffee-scriptへの依存が増えてしまったし。

土曜日, 5月 04, 2013

雨の日に道を教える

今回は夜に家の近所。 雨が降る中、傘もささず(酔って?)ふらふらしているお爺さんから、橋の方に行きたいと聞かれる。 歩けない距離ではないけど、大丈夫だったろうか。

木曜日, 12月 27, 2012

DBFluteをCDIで使ってみる(適当レベル)

Javaでは当たり前になったDI。SpringやSeasar2、Guiceが有名ですが、JavaEEにもCDIというDIシステムがあります。今年出たばかりとかではなく、2009年に出ています。標準規格なのにあまり注目されていない、というかSpringやSeasar2は知っていても、CDIは知らないというケースもままあるという。
でもJavaEEの一部という事は、JavaEE対応のアプリケーションサーバなら追加のjar無しで使えるわけで、依存するjarを減らせるわけです。

一方、これまた当たり前になったORMはhibernateの方向性が主流になりつつあるも、やはりSQLで書きたいケースも多く、というかRDBに問い合わせるならSQLを使うのが結局楽だったりするわけです。とはいえSQLを生で書くというのもあり得ないですよね。結果はオブジェクトとして受け取りたいし。という要求の元、DBFluteやDomaやMyBatisと言った、SQLと親和性のあるORMも根強い人気があります。
私も基本的にはSQL大好きなので、これらのORMを使いたいわけです。

DIは標準規格のCDIを、ORMは手のひら返してJPA系ではないものを使うわがままをなんとか実現したい。で、幸いにもDBFlute、Doma、MyBatisのどれもCDIで使えるらしい。という事でDBFluteでCDIを試してみました。DBFluteを選んだ理由は最近1.0になったからというだけ。
ちなみにCDIも初体験。
とりあえず深く考えずに、GlassFish 3.1.2 + DBFlute 1.0 + Derbyでやってみる事に。

DBFluteのドキュメントを見つつ、以下のようにセッティング。

mvn dbflute:download
mvn dbflute:create-client
#DDLを書いたり、dfpropを編集したり
mvn dbflute:replace-schema
mvn dbflute:jdbc
mvn dbflute:generate

これでDBFlute側の準備は完了。WEB-INFの下にbeans.xmlという名前のファイルを置いて、CDIを有効にする。これで設定はすべて完了したはず。という事でGlassFIshに乗せてみると、こんなエラーが発生。

 デプロイメント中にエラーが発生しました: Exception while loading the app : Exception List with 5 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [EmployeeBhv] with qualifiers [@Default] at injection point [[field] @Inject com.example.servlet.EmployeeServlet.employeeBhv]. Possible dependencies [[Managed Bean [class com.example.dbflutecdi.db.exbhv.EmployeeBhv] with qualifiers [@Any @Default], com.example.dbflutecdi.db.allcommon.DBFluteModule$DBFluteBean@422f8df7]]
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:314)
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
 at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143)
 at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:163)
 at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:382)
 at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
 at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
 at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
 at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
 at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
 at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
 at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
 at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
 at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
 at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
 at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
 at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
 at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
 at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
 at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
 at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
 at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
 at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
 at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
 at java.lang.Thread.run(Thread.java:722)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DataSource] with qualifiers [@Default] at injection point [[parameter 1] of [method] @Inject public com.example.dbflutecdi.db.allcommon.ImplementedInvokerAssistant.setDataSource(DataSource)]
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:311)
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
 at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143)
 at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:163)
 at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:382)
 at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
 at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
 at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
 at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
 at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
 at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
 at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
 at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
 at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
 at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
 at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
 at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
 at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
 at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
 at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
 at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
 at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
 at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
 at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
 at java.lang.Thread.run(Thread.java:722)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [CommonColumnAutoSetupper] with qualifiers [@Default] at injection point [[parameter 1] of [method] @Inject public com.example.dbflutecdi.db.bsbhv.BsEmployeeBhv.setCommonColumnAutoSetupper(CommonColumnAutoSetupper)]. Possible dependencies [[Managed Bean [class com.example.dbflutecdi.db.allcommon.ImplementedCommonColumnAutoSetupper] with qualifiers [@Any @Default], com.example.dbflutecdi.db.allcommon.DBFluteModule$DBFluteBean@14423bc8]]
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:314)
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
 at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143)
 at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:163)
 at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:382)
 at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
 at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
 at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
 at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
 at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
 at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
 at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
 at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
 at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
 at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
 at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
 at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
 at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
 at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
 at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
 at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
 at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
 at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
 at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
 at java.lang.Thread.run(Thread.java:722)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DataSource] with qualifiers [@Default] at injection point [[parameter 1] of [method] @Inject public com.example.dbflutecdi.db.allcommon.ImplementedInvokerAssistant.setDataSource(DataSource)]
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:311)
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
 at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143)
 at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:384)
 at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
 at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
 at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
 at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
 at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
 at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
 at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
 at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
 at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
 at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
 at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
 at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
 at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
 at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
 at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
 at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
 at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
 at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
 at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
 at java.lang.Thread.run(Thread.java:722)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [CommonColumnAutoSetupper] with qualifiers [@Default] at injection point [[parameter 1] of [method] @Inject public com.example.dbflutecdi.db.bsbhv.BsEmployeeBhv.setCommonColumnAutoSetupper(CommonColumnAutoSetupper)]. Possible dependencies [[Managed Bean [class com.example.dbflutecdi.db.allcommon.ImplementedCommonColumnAutoSetupper] with qualifiers [@Any @Default], com.example.dbflutecdi.db.allcommon.DBFluteModule$DBFluteBean@14423bc8]]
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:314)
 at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
 at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:143)
 at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:384)
 at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:367)
 at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:380)
 at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:199)
 at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
 at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:313)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
 at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
 at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
 at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
 at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
 at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
 at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
 at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
 at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
 at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
 at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
 at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
 at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
 at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
 at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
 at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
 at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
 at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
 at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
 at java.lang.Thread.run(Thread.java:722)
weldというのはGlassFishが使っているCDIの実装。CDIのリファレンス実装でもある。
どうやらweldが何をInjectionしたら良いのか分からなくてエラーになっている様子。
残念ながら、DBFlute 1.0.0でCDIをそのまま使う事は出来ないようです。

ここで諦めても良かったのですが、悔しいので解決策を探る事にしました。
まずAmbiguous dependenciesという例外に対応する事に。
エラーログを読む限り、それぞれのクラスのインスタンスとDBFluteModuleクラスのsetupDfComponentsメソッドで生成されているインスタンスが競合している様子。

おそらく解決策は2つあり、DBFluteModuleのsetupDfComponentsの一部をコメントアウトするか、QualifierアノテーションというInjection対象を指定するためのアノテーションを作って、Injectionして欲しい方に付与する必要がある。
とりあえずDBFluteModuleがなにしているのか調べるのが面倒なので、DBFluteGenerateというQualifierアノテーションを作ってInjection対象になってほしいクラスにつけてみたところ成功。
DBFluteGenerateのソースはこんな感じ。

//import 省略

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, METHOD, PARAMETER, TYPE})
public @interface DBFluteGenerate {
    
}



エラーログにはもう一つUnsatisfied dependenciesというものがあり、これはdatasourceのインジェクションのところで起きています。たぶんインジェクション対象が見つからないという事なのだと思うのだけど、どうすればいいのかさっぱり分からない。仕方ないのでsetDatasourceについていた@Injectを外して、_datasourceフィールドに@ResourceでDatasouceの名前を直接指定。
よくないやり方とは思うのだけど、これでデプロイし直すと動作するようになりました。

ここまでの対応+実際に動く例としてのソースコードをbitbucketに上げてみました。もっとエレガントな解決策があれば誰か教えてください。
なおDBFluteのgenerateタスクはソースコードの上書きをするので、根本的に対応するにはDBFlute側のテンプレートなどを変える必要があります。

ただJavaEE7の足音が聞こえてきているので、これ以上追求する元気が失われつつもあり。

水曜日, 8月 22, 2012

初めて道案内にiPhoneを使う

最早、道案内の記録になりつつこのブログ。

今回は、新宿で外国人(おそらく韓国の方)にホテルの場所を英語で聞かれたので、手にしていたiPhoneで素早く地図を出して方角を伝えました。
タイトル通り、今回初めてiPhoneで道案内をしました。
いつも道案内した後に、iPhoneがあるのに!と思っていたので、今回は大きな進歩。

とはいえ、ホテルまではそれなりに歩く距離だったので、無事辿り着いていればよいけど。

日曜日, 4月 22, 2012

たのまれごと2012 春と日記的な


いろいろ忙しくて全然更新していない。TwitterとGoogle+はやたら使っているので、長い文章を書く元気と時間が無いとも言える。
去年の12月から3ヶ月ほどプログラミングHaskellの練習問題を解いたりして楽しんでいたので、それを書けば良いのだけど、パラダイムチェンジしたいという曖昧なリクエストを持っていた人に本をあげてしまったので、それも書けない。買えばいいだけではあるけど。

とはいえ、関数型言語熱は引いていなくて、Erlangとかを経由しつつ、一応お仕事ではJavaが多いので、それをScalaで置き換えられないか、少なくともHaskellよりは導入が楽だろうと、Scalaを調べつつ、引越しもしなきゃだったりでバタバタしている今日この頃。
Scalaスケーラブルプログラミング第2版てのを読めば良いのだろうけど電子書籍版が無いのよね。収納の都合上、これ以上物理本は増やしたくないのだけど。
章毎に分解して、読んだ端から捨てるという読み方を実践してみるか。勿体無いけど、その方がちゃんと覚える気もする。
読書記録はここに書けば良いし。


さて、最近の頼まれ事は、新宿で親子連れにあるスタジオの場所を聞かれたので応えたのと、外国人の女性(おそらく旅行者)に新宿中央公園の場所を聞かれた。
iPhoneを持っているので、それを出せばきちんと場所を伝えられるのだけど、そういう場面になるとそれを忘れてしまう。

頼まれ頻度は最近落ちてきたかな?