豆無日記スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。読者です読者をやめる読者になる読者になる豆無日記この広告は、90日以上更新していないブログに表示しています。3開発する(エンコーディング地獄編)どうも、ひさしぶりにはてダで書きます。昨今、ソースコードはUTF-8で書くのがデファクトだと思うんですが、WindowsでのJavaはデフォルトエンコーディングが相変わらずwindows-31jなので、何をするにも明示的にエンコードを指定しないといけません。3向きに整理してみました。普段Windowsで開発していないので、もっといい方法があったら是非教えてください。ちなみに、Windowsのバージョンは未だ7です。10のbashがきたら、LANGとかうまくJavaに伝わっていい感じにデフォルトエンコーディング問題は解消するんですかね。(2016/06/03時点)仕込み以下を設定する。(ダブルクォートがポイント)を追加する。この変更は、Git/SVNにコミットしてWindows開発者向けに共有する。グローバルに設定する(コンパネ等)。開発時コマンドプロンプト上でアプリを実行する場合は、gradlewコマンドを使う。bootRunテストをする場合もgradlewがよい。testcreate-xxxxなどを使う場合は、grailsコマンドを使う。grailsコマンドを使ってアプリ実行やテストをする場合は、コマンドプロンプトへの標準出力が文字化けするが気にしなければOK。文字化けした内容が気になるのであればgradlewで再実行すれば良い。しないと、問題が切り分けられない。あと、環境変数は設定したら、次のを試す前にクリアすること。bootRun→×applicaiton.ymlに日本語がある場合起動時にエラーになる※実行時エラーではあるが、ビルド時に誤ったエンコーディング(windows-31j)でビルドされていると、実行時に正しいUTF-8を指定してもNGとなる(原因は後述)。(このような試行錯誤では、設定したと思っても設定方法自体が間違っていて効いていない、という何を確認しているのだかわからない残念な事故が多発するので、確実に効いて確実に確認できる方法がよい。(ダブルクォートがポイント)を追加する。bootRun→○ログファイル文字化けなし=アプリの動作としてOKコマンドプロンプト標準出力文字化けなし=開発しやすいgradlew編のまとめ基本は(B)でよい。毎回毎回打つのが大変なのでサボりたくなるのが正しい開発者の姿。安直に(C)のようにしても、挙動としては正しいのだが、コマンドプロンプト上の出力が化けるので若干使いづらい。結局、(D)が良さそう。(D)におけるポイントは、ダブルクォート。コマンドライン引数で指定した場合とまったく同じように動作させるには、このダブルクォートが必要。評価してしまうと、Gradleプロセス自体の文字エンコーディングがUTF-8になってしまう。一般的にはそれで良いのだが、そうなるとGradleはコマンドプロンプトへの標準出力もUTF-8として出力しようとしてしまうため、結果としてコマンドプロンプト上の出力のみ化けた状態になってしまう。渡してUTF-8として動作させる。することで、実際のワーカプロセスの動作はUTF-8となりつつ、Gradleがワーカプロセスの標準入出力とコマンドプロンプトへの橋渡しをするときに適切な変換を行うことで(要出典)、コマンドプロンプト上で文字化けせずに、しかも、ANSIカラー対応の出力すら可能となっている(※)。※動作上はこのようにみえるのですが、実装詳細については確認できていないので、あくまで想像です。間違ってたらすいません。-Dfile.encoding=UTF-8→×ログファイル文字化けあり=アプリの動作としてNGコマンドプロンプト標準出力文字化けあり=開発しづらいgradlewでは効果があったコマンドライン引数であるが、ビルド時には効果があるようだが(日本語含みのapplication.yml起因のエラーが出ていない)、実行時には効いていないようだ。使ってみたところ、期待通りアプリの動作としてはOKとなった。コマンドプロンプトの出力が文字化けするので、gradlewの(B)と比べると若干負けた気分。grails.batを直接変更してエンコーディング指定するインストール済みのgrails.batをいじるのであまりお勧めはできないが、gradlewでの成功体験から試してみる。(ダブルクォートがポイント)を追加する。run-app→×ログファイル文字化けあり=アプリの動作としてNGコマンドプロンプト標準出力文字化けあり=開発しづらいまったく無力だった。は強すぎるので、もう少し弱い環境変数ではどうか。うまいことバランスとれたりしないか。run-app→△ログファイル文字化けなし=アプリの動作としてOKコマンドプロンプト標準出力文字化けあり=開発しづらいやはりこんなところか...。grails編のまとめgrailsコマンドを使う場合は、コマンドプロンプト上の文字化けには目をつむって、(C)か(E)を採用するぐらい。使ってしまうと、gradlew編の(C)の条件を満たしてしまい、gradlewを使った場合にもコマンドプロンプト出力が文字化けしてしまう。使った設定をするのがバランスが良いと思う。FAILEDapplication.ymlに日本語が含まれる場合、このようにエラーになる。前後▒?▒半角スペ▒?▒スのトリ▒?はしな▒?他の差分箇所を見ればわかるが、アプリ名などをビルドによって置換されている。ファイルをそのままコピーするのではなく、いったん内容を解釈して文字列置換をしているのだ。ビルド時に適切なデフォルトエンコーディングを指定しない場合、実際はUTF-8であるgrails-app/conf/application.ymlをwindows-31jとして読み込んで置換処理してしまい、結果としてマルチバイト部分が壊れてしまうことになる。実行時に正しくデフォルトエンコーディングをUTF-8指定しても、すでに壊れたファイルを読み込むことになるため、当然エラーになる。結局、実行時だけではなく、ビルド時にも適切なデフォルトエンコーディングを効かせないといけないよ、という話であり、まあ、当たり前の話なのであった。bootRunコマンドプロンプト上では一件正常に起動して、文字化けもせずにログ出力できているように見える。ログファイルへの出力は文字化けしている。実行時デフォルトエンコーディングも当然重要ですよ、という話。Springで、Groovyについてお話ししてきました。CFPに応募するかしばらく迷ってたんですが、ネタが思いつかなかったので先送りしていたら、〆切最終日辺りにさくらばさんや複数の人から「初心者向けでいいんですよ、むしろいいんですよ」的なメッセージを受信したのと、その近辺で今回の発表ネタのようなことを業務的にやるために割と時間をかけて資料を作り込んだのでその余波で割とどうにかなるんではないかということで応募してみたところ、有り難いことにAcceptされたのでした。いうわけで、今回は「Groovy入門+小人さんスクリプト」という構成でお話ししました。Elf)」パターンにあたります。来ていただける方がGroovyをすでに使い込んでいることは基本的に期待できないですし、応用の話だけでは全員置いてけぼり必死と思われたので、「Javaは割と知っている人」に対して一歩ずつGroovyを理解していけるような構成にしてみました。色んな声を聞いた結果、割と成功したんではないかと思います。いうわけで、今回の資料は以下からご参照ください。これは144ページあるんですが、当日は時間の都合上絶対無理な感じだったので、50ページぐらい削りました*1。上記の公開版資料では削った分も含めて完全版にしてあるので、当日聞いていただいた方ももう一度頭から読み直す価値は結構あるかと思います。サンプルコードはこちらからどうぞ。GitHubそれにしても今回は参加者数が多くてすごかったですね。Javaに何が起こっているのか。僕のセッションも割と満員御礼な雰囲気だったので大変有り難かったです。基調講演から自分のセッション〜懇親会まで含めて最高にハイな一日でした。スタッフの皆さん、来場された皆さん、本当にありがとうございました。2014、10日目のエントリです。DAO的なものがサクッと実装できますよ、というお話です。何だ、とか、○○のFWでもできるぞこの野郎、といった苦情はご遠慮ください。実装するとりあえず、Grailsプロジェクトを作成して、ドメインクラス(Entityクラス)を作成します。grails-app/domain/rest/sample/Book.groovyBookドメインクラスの中身を以下のように修正しましょう。適当なtitleプロパティを追加して(制約はあってもなくても関係ない)、Resourceアノテーションを追加してるだけです。このResourceアノテーションがいわゆる魔法詠唱ポイントです。}}とりあえず実装はこれだけでOK。Grailsが手元にある状態からであればカップヌードルの待ち時間ぐらいでできますね。http://localhost:8080/rest-samplecURLでアクセスしてみましょう。/&gt;GETでリストを取得してみると、初期状態なので空ですね*1。本を2件登録してみます。ちまたで話題のアノ本ですね。id=&quot;2&quot;&gt;&lt;title&gt;Gradle徹底入門&lt;/title&gt;&lt;/book&gt;&lt;/list&gt;うまく入っていますね。DELETEもサポートしてます。id=&quot;1&quot;&gt;&lt;title&gt;プログラミングGroovy&lt;/title&gt;&lt;/book&gt;&lt;/list&gt;参照専用APIResourceアノテーションの引数にreadOnly=trueを指定すると、GETによる参照APIのみだけが提供されるようになります。Allowedになります。情報開示系APIならreadOnlyをつけておくと良さそうです。http://127.0.0.1:8080/rest-sample/books.json[{&quot;class&quot;:&quot;rest.sample.Book&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;プログラミングGroovy&quot;}]とJSON形式でレスポンスを受け取ることができます。classとか勝手に入っていて内部情報を暴露しすぎでアレなので、ドメインクラス→JSONへのマーシャル方法をカスタマイズした方がよいですね。方法についてはここでは割愛します。Content-typeの指定はAcceptヘッダでもOKです。&quot;Accept:application/json&quot;[{&quot;class&quot;:&quot;rest.sample.Book&quot;,&quot;id&quot;:1,&quot;title&quot;:&quot;プログラミングGroovy&quot;}]まとめデータ構造を表現するドメインクラスはとりあえず決める必要があるので、ドメインクラスを先に実装するわけです。APIとして提供するつもりならサクッとResourceアノテーションでAPIを実装しておきつつ、徐々に、制約とかJSONのマーシャライザとかを整えたり、RESTな自前コントローラも追加して、最終的にResoruceアノテーションを削除する、というようなステップを踏めそうなので、そういう意味では初期バージョンの素早いリリースのために使うというのはアリな気がします。自前のコントローラを実装する場合も、ドメインクラスのオブジェクトとJSON/XMLなどへのコンテントネゴシエーションに基づく変換機能はもちろんそのまま活用できます。Bootベースに大きく方向転換をする予定なのですが、このようなRESTサポートは多少形を変えつつ残っていくようです。http://www.slideshare.net/graemerocher/springone-2gx-2014-grails-30-preview/34といったところで。見る*1:プロキシ設定がある場合は、--no-proxyオプションを追加してプロキシをスルーする必要があるかも知れません。2014に来ています。さっきのセッションで「JDK8ではInvokeDynamic(以下、indy)の実装を一新したのですごく速くなったよ」という話を聞いたので、Groovyのindyモードで試してみました。Groovyは2.0(現在は2.3)でindy対応されています。それ以前はGroovy独自機構による性能改善が行われていました。JDK7からのホヤホヤなindyを前提にしてしまうと、JDK6で動かなくなってしまいます。Groovyは下位互換性が重視されているので、これは問題です。いうわけで、indyが使えないJDK上でも使えるように既存の独自機構もそのまま残っているし、indy不要バージョンが標準になっていて、indyオプションを利用可能にするには$GROOVY_HOME/lib配下を$GROOVY_HOME/indy配下にあるファイルで上書き置換してあげないといけません。言うぐらいに色々面倒くさいのですが、じゃあそこまでやってindyを使ったところでどれだけ嬉しいのかというと、JDK7までは「全然うれしくない」が答えでした。JDK7のindy実装がこなれてない&Groovyのindy対応もカリカリではないので、全然性能がでなかったんですね。独自機構の方が全然速かったわけです。「JDK8ではInvokeDynamic(以下、indy)の実装を一新したのですごく速くなったよ」という話を受けて試してみたんですが、indyモード&JDK8すごくヤバいことになってました。サンプルコードコードとしてはフィボナッチ数の算出です。ローカルにあったファイルを発掘したもなので、実装が云々というツッコミはこの際受け付けません。}}これをJDKの7u55と8u05で実行してtimeコマンドで計ってみました。厳密なベンチではないので参考ぐらいのやさしい気持ちで読んでください。ちなみにGroovyは最新ホヤホヤの2.3.0です。