cakePHP入門にEclipse+Composerにこだわり学習意欲を削がれる
6/19くらいにPHPに改宗せよという天啓を受けました。
始めてみると、まあうまくいかない。
PHPはperlの記法+Javaのようなクラス定義、といった印象。
( PHP5.5以降ではジェネレータがあったり、言語としても長短。
Javaネイティブなのでジェネレータはうまく使えないから微妙。
使いこなせるとかっこいいのでしょうね・・・。)
以前までEclipseでDropwizardを触っていたので異文化交流状態です。
インストールではこちらを参考にさせていただきました。
http://qiita.com/ysnsyks2/items/176cfddbdf1f79d65a75
現状で比較してみると以下。
言語 | Java | PHP |
フレームワーク | Dropwizard | cakePHP |
ライブラリ管理 |
pom.xml |
Composer composer.json |
ORM | Hibernate Dropwizard付属 |
???? |
DBマイグレーション | Liquibase Dropwizard付属 |
???? |
テスト | JUnit webアプリレベルではJettyを使用してテスト可能 |
|
実行(デプロイ) | デプロイ後、実行でポートのリッスンまで単独 |
他のサーバー(httpdなど)でポートフォワードすれば デプロイだけ、明示的な実行は不要? |
まだPHPサイドでは理解不足だったり、
Dropwizard目線で項目を出しているので不便な印象を受けます。
で、表題の話。
Composerを使用しようとするとだいたいコンソールで、Eclipseでの話はなかなか出てこない。
やっとこプラグインを見つけるもpackegistの検索で固まったり、
コンソール上で同じことをするとフォルダ構成が違ったり、修行が足りない。
特にフォルダ構成が違うのは初心者に厳しい。
フォルダ構成は、ざっと見た感じ以下の3種類があるっぽいです。
- php composer.pher create-project dev cakePHP/app
- composer.jsonを編集してcomposer install
- eclipseでcomposer.jsonを編集してinstallっぽいことを実行
eclipseでcakePHPを動かしている例を見たことがなく、またうまくいかない。
休日返上で格闘するもEclipseを見限ってコンソールでプロジェクト作成。
世間ではnetbeansとかPHPStorm+コンソールという体制なのか?(知ったか)
Eclipse上でデプロイ以外を賄えたDropwizardを思うと不便さを感じる。
で、やっと入り口に立ったわけで。
まあぼちぼちやるしかないですね。
Big Peat
国産ウイスキーが軒並み値上げとなる昨今(山崎、竹鶴派です)、いい機会なので
海外ものにも手を出してみようとポチってみました。
まとめサイトで見かけ、ちょっと調べると
- ピート臭がやばい
- 炭俵の香り
などと褒めてるのかどうか分からない(たぶん褒め言葉だと思う)意見。
いざ挑戦すると、国産ウイスキーやマッカランを全てと思い込んでいた私にとっては
カルチャーショックな香り。まさしく先に上げた意見の通り。
私の言葉でいうと、「燻製を飲んでいる」感じ。
製法を考えるとそのままなんですけどね。
手元にあったサイダーで割ってみるとこれがちょうどいい。
燻製+甘味=カラメルになり、燻製の香りが薄まってもともと持っている甘い香りが
炭酸で浮上してくる感じ。
他のスコッチもこんな感じなのかな。
とはいえ、これで満足してしまったので飲みきってから考えたいですね。
Liquibase、H2databaseでdropAll()できない
表題ままです。1週間悩んでました。
流れとして、
-
テストコード書きたい
-
DBにテストデータ入れたい
-
テストを独立させるため@Beforeでテーブル作成、@Afterで全て消したい
-
消えない(エラー終了)
最初はH2databaseとLiquibaseの相性とかいろいろ考えてました。
foreign key,view,tableを消す処理を自前で作ることも辞さない勢いでした。
が、落ち着いてログを見るとスキーマ名とテーブル名がダブルクオートで囲われている。
まさかと思ってソースを見ると、わざとそういった処理をしていました。
そのためそこだけオーバーライドしてよけたらうまくいっちゃった。
自己満足のためにgistで公開してみました。
Solve my way of exception on liquibase.dropAll(),using H2database(MODE=MYSQL)
Liquibase-3.1.1、 h2database-1.4で確認しています。
プロジェクトのソースに横槍を入れるなどおごがましいと考えているので、
絶対に他にやり方があると思います。
1週間の戦いに勝ったので、今日はマッカランで1杯やって寝ます。
DropwizardのテストからLiquibaseを知る
DropwizardのDAOテスト用DBをどうしようかと悩んでいたらこれを知りました。
最初はmockitoを使ってやりきろうと思ったけど、SQLのクエリも見たいのと
ログイン周りでSessionを使っているのでこれを選択。
DBをバージョン管理できるすごいやつ。
今回はMySQLの既存のスキーマをxmlにダンプして、h2 dabatase(in memory)に
再構築してテスト用DBを作ろうと頑張ってみました。
Dropwizardに食わせるDB設定は本番環境とテスト環境で設定ymlを分ければいいので楽です。
できたこと:
-
xmlのテンプレートを作っておく(Step 1参照)
Liquibase | Database Refactoring | Liquibase Quickstart<必要ないかもしれません
-
設定項目をliquibase.propertiesに記載
Liquibase使い方(基本)メモ - Qiita -
ダンプ
- java -jar [liquibase.jarのpath] --defaultsFile=[上記で作ったliquibase.properties] generateChangeLog
- liquibase.jarとDBドライバはDropwizardのプロジェクトで使用(依存)しているものにリンクを張るとバージョンで悩まない
- 上記だとログ作成時にymlパーサーが見つからないとINFOが出たが今回は無視
- クラスパスをきっちり指定している人は大丈夫だと思う
-
h2 databaseへの再構築(一部)、Dropwizardのテストでの使用
上記で作成したxmlをdropwizard-migrationで使用
Java - dropwizard-testingが便利でした - Qiita
できなかったこと:
目的は達成できたので満足です。
いずれバージョン管理にも手を出したいところ。
Dropwizardをデプロイ後、8時間後にDB接続エラー
デプロイしていよいよ起動、明くる日に様子を見るとページからログインできない。
ログインボタンを押してもレスポンスがない。
応答を見ると[500 Internal Server Error]。
バグ?ログを見てみると以下。
とか出ている。autoReconnect=trueにすると解決すると誘われている。
デフォルトでは最後の接続から8時間経つと切断されるらしい。
調べるとmysqlのpathの最後に?autoreconnect=trueで解決するとか。
しかし非推奨で、コネクションプーリングしなさいとのこと。
dropwizard特有のやり方とかあるんじゃないのとさらに調べる。
見つかる。例によって外人。
java - Broken Pipe exception in Dropwizard application - Stack Overflow
-
設定+αで解決した報告
- checkConnectionWhileIdle: true
- checkConnectionOnReturn: true
- checkConnectionOnBorrow: true
とソースのトランザクション境界で直ったらしい。(関係ない気がするけど)
自分のやつはユーザー認証と掲示板読み書き程度、それぞれでAbstractDAOの継承クラスによるアクセスと@UnitOfWorkをつけているのでいいはず。 -
コネクションプーリングしなさい
1の投稿のすぐ下にある。Manageを使おうとのこと。
ManagedPooledDataSource.javaとかいうド直球なソースが紹介されているけど、
これとdropwizard-hibernateを絡ませなきゃいけない。すぐには手が出せそうにないので後回し。
今回は1の方法で、最後の接続から8時間後に接続して解決したのでひとまず良しとします。
Dropwizardのassetsに/をmappingしたい
Dropwizardにおいて、静的なファイル(html, js, css…)はデフォルトでは
- http://{ドメイン}/assets/* → "src/main/resources/assets/*"
となっています。
ですが、トップページなどはURL直接指定でアクセスできると格好良かったりします。
先記のデフォルトは一応AssetBundleを使用することで変更できますが
ルートにはできない仕様らしいです。
Asset bundles not able to be served from root path. · Issue #661 · dropwizard/dropwizard · GitHub
Google先生に聞くと外人がたくさん困ってましたが、
ログを一生懸命漁っていると解決した声を見つけました。
上記リンクの下のほうにあり、まとめると
-
Application#initialize()において
bootstrap.addBundle(new AssetsBundle("/assets/", "/"));
-
Application#run()において
environment.jersey().setUrlPattern("/services/*");
1つめでやりたいことやって(従来はだめでしたが)、
2つめでjerseyのマッピングをしています(ここでは"/services/"以下)。
Dropwizardのjerseyはルートがデフォルトなので、
2つめがないと静的ファイルをjerseyで解決しようとして404になります。
( 2つ目の項目ですが、公式ドキュメントにあるように、
設定ファイルにapplicationContextPathを設定してもうまく動作しませんでした。)
日本語が少なくて大変…