海外で日本のお菓子が紹介されています。
日本のお菓子の定期購買サービスですね。全世界に送っているようです。
https://japanfunbox.com
記事もいっぱい書いていますが、海外の人に理解されるのでしょうか?
Boys’ Love with Pocky Game?! | Japan funbox
Rules for Playing the Pocky Game | Japan funbox
Playframework 2.xでslickを使用した場合にはまった…。
Playframeworkでslickをつかって1日はまったので、メモ。
could not find implicit value for parameter s: play.api.db.slick.Config.driver.simple.Sessionが発生する
controller
def authenticate = DBAction { implicit request =>
loginForm.bindFromRequest.fold(
errors => BadRequest(views.html.login(errors))
, user => {
if(UsersDAO.authenticate(user._1, user._2).isDefined) {
Unauthorized("ログインまたはユーザー名が違います。")
} else {
Ok(views.html.index("Your new application is ready."))
}
}
)
}
model
def authenticate(email: String, password: String)(implicit s: Session): Option[User] = {
users.filter(user => (user.email === email && user.password === password)).firstOption
}
slickのサンプルにある通りDBActionでSessionを確保しているはずなのにないといわれる。
試行錯誤でなにをやってもダメだったがインポート分を加えることで解消した。
Play frameworkでJPA2.0→2.1へ移行時のハマり
JPAってほんとに簡単なCRUD処理であればサイコーに気持ちいいんですけど、複雑なクエリや取得項目を色々変更すると一気にめんどくさくなりますね。
それでSqlResultSetMappingをつかったとしても、entityに対してしかマッピングできないもよう。。
俺のやり方が悪いのかな…。色々調べているとJPA2.1では@ConstructorResultが追加されて不要な項目は取得しなくてよさそうなので、バージョンアップしました。そしてハマりました。
NoSuchMethodErrorがthrowされる
play.api.UnexpectedException: Unexpected exception[NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:152) ~[play_2.10.jar:2.2.1]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145)[scala-library.jar:na]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112)[play_2.10.jar:2.2.1]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110)[play_2.10.jar:2.2.1]
at scala.util.Success.flatMap(Try.scala:200)[scala-library.jar:na]
Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936)[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762)[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final]
どうやらPlayのバージョンは2.0に依存しているみたいなので、Build.scalaを編集しAPI依存関係の新しいプラグインをリリースするまでこの対応でしのごうって書いてる。
val appDependencies = Seq(
javaCore,
javaJdbc,
javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"),
cache,
filters,
"org.hibernate" % "hibernate-core" % "4.3.5.Final",
"org.hibernate" % "hibernate-entitymanager" % "4.3.5.Final",
"org.postgresql" % "postgresql" % "9.3-1100-jdbc4",
"org.webjars" %% "webjars-play" % "2.2.1",
"org.apache.directory.studio" % "org.apache.commons.io" % "2.4",
"com.ning" % "async-http-client" % "1.7.22",
"org.apache.httpcomponents" % "httpclient" % "4.3.1",
)
javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api")を追記してようやく解消。
JPAは日本語文献があまりないので、色々苦労しますね。まぁこれはPlayの問題ですが…。
RUNNING LEAN 〜実践リーンスタートアップを読んで
ビジネスプランを文章化する。
事業計画書→リーンキャンバス
- 高速に
数ヶ月かかる事業契約書とは違い、半日もあれば複数のビジネスモデルの概要がかける。
→なれれば早くなりそうだが、何をどう書いたらいいか迷いそう。ただこの本は実際にあった著者の事例を参考にしてくれている。
- 簡潔に
ランディングページでは8秒で顧客の注意力を引かなければいけない。リーンキャンバスを使えば、言葉をうまく使って伝えられるようになる。
→確かにそのとおりだ。事業契約書はあくまで投資家や公庫向きなものであり、初めてサイトを訪れたときに存在意義を伝えなければ、ユーザーはすぐに離れてしまう。
- 携帯性
1ページのビジネスモデルであれば共有が可能。簡潔に更新する事が可能
→簡潔に更新する事が可能がとても重要。このリーンキャンバスをもとにPDCAを繰り返すので途中でピボットを大きく変えることになっても、すぐ変更できる。
IntellijでPlayFramework2.2
IntelliJでPlayFrameworkの環境構築手順を残しておこう。
■ scalaインストール
#brew install scala
#scala -version
■ play インストール
#install play 2.2.0
#play -version
■ 適当な場所でアプリケーション作成
#play new myapp
■ play からIntelliJのプロジェクトを作成
#cd myapp
#play
[myapp]idea
[myapp]idea with-sources=yes
■ IntelliJでプロジェクト作成
Create New Projectからmyappディレクトリを選択し、実行。
■ デバック実行
Edit Configurations>Add New Configurations>Play2 App
Name:テキトー
Play 2 install dir:$PLAY_HOME
以上
iDempiere Web services SOAP編
概要
外部サービスやシステムをiDempiereのWebserviceで連携させてみよう。 今回はADempiereから存在するSOAPでの実装方法となる。 iDempiereではRESTにも対応されたため、次回はRESTでの実装を行う予定。
参考リンク
iDempiere(アイデンピエレ)のWebサービス - OSS ERP Compiere Distribution Lab
Adempiere Web Services - ADempiere ERP Wiki
手順
- Web Serviceを確認。 メニュー>一般ルール>セキュリティ>Web Service Security 今回テストするWeb Service Typeを確認する
とりあえずsoapUIをダウンロード SoapUI - The Home of Functional Testing
インストール後、File>New soapUI Projectを選択。
Project Name「任意」 Inital WSDL/WADL 「$IDEMPIERE_HOME/org.idempiere.webservices/testScripts/iDempiereWebServices-soapui-project.xml」
- soapUIでxmlを修正 Web Service Type
<_0:serviceType>CreateBPartner <_0:TableName>C_BPartner <_0:RecordID>0 <_0:Action>Create
Login
<_0:user>WebService <_0:pass>WebService <_0:lang>ja_JP <_0:ClientID>11 <_0:RoleID>50004 <_0:OrgID>0 <_0:WarehouseID>0 <_0:stage>0
Parametar
<_0:DataRow> <_0:field column="Value"><_0:val>Create SOAP C_BPartner <_0:field column="Name"><_0:val>Create SOAP C_BPartner <_0:field column="TaxID"><_0:val>
- soapUIで実行ボタンを押下し200が帰ってきて、取引先が登録されていればOK
まとめ
サンプルクライアントのGardenWorldを使用すれば、動作確認ならすぐに可能。 当人はSOAPを構築したことがないので、比較ができませんが 単純なテーブルのCRUDなら素晴らしいくらい簡単と思います。 Adempiereの本ではsoapUIで実行確認をしていたが、今ならChromeのエクステンションなどでも 実行可能なのでお手軽なほうで試してみてね。