2014年7月11日金曜日

Dockerの用語とか

Docker使い始めて、悩むことがあったのでメモ。

用語とか


docker image?


read-onlyなテンプレート。docker containerを作る元になる。
dockerのbuild component。


docker registry?


docker imageを保持している場所。一番有名なpublicなdocker registryがDocker Hub
dockerのdistribution component。


docker container?


ディレクトリのようなもの。docker containerはアプリケーションを走らせるために必要なすべてを持つ。
コンテナはイメージから作られる。
それぞれのコンテナは隔離されてセキュアなアプリケーションプラットフォーム。
dockerのrun component。


参考


Understanding Docker

2013年6月2日日曜日

AWSのVPC内に踏み台サーバーを作ってVPC内のRDSインスタンスのメンテナンスをする。

いやもうこちらのクラスメソッドさんの記事に自分がはまったところだけを追記するという便乗記事なのですが。

Amazon VPC環境にメンテナンス用の踏み台サーバを構築する

背景

AWSのRDSでMySQLサーバーを立てたものの、MySQL WorkbenchのようなGUIツールでデータを見たり編集したりしたい!
でもインスタンスを"Publicly Accessible"にするのは怖い!

ということで、VPC内に踏み台サーバーを作って、そこ経由でRDSインスタンスに接続します。


実現方法の詳細

詳細は冒頭のクラスメソッドさんの記事を参照して頂くとして、
ちょっとはまった点を記述します。


Security groupの適用ではdefaultも忘れずに。

Webサーバであれば、webとdefaultを両方適用しましょう。 
とあるのですが、最初はdefaultのsecurity groupの適用を忘れており、
踏み台サーバー経由のssh接続ができずに悩んでました。

defaultのsecurity groupの設定は、

デフォルトセキュリティグループ

AWS アカウントには自動的に、Amazon EC2 インスタンスのデフォルトセキュリティグループが適用されます。インスタンスの起動時に別のセキュリティグループを指定しなかった場合、インスタンスは自動的にこのデフォルトグループで起動されます。以下は、このグループの初期設定です:
  • 着信トラフィックを許可しない
  • すべての発信トラフィックを許可する
  • グループ内のインスタンスの相互通話を許可する
となっており、最後の「グループ内のインスタンスの相互通話を許可する」が適用されないと、
Webサーバーのインスタンスが、踏み台サーバーからのアクセスを拒否しちゃう訳ですね。
これはRDSのsecurity groupを設定する際も忘れないように注意。





2013年5月18日土曜日

【追記あり】MyBatis Migrationsを触ってはまった。(複数のSQLを実行しようとするとSyntaxErrorException)

※2013/05/18 20:30頃追記1を追加。

DB Migration 入門 vol.1に参加して、MyBatis Migrationsを触ってみた。

はまった点


MySQLを対象にup/downにて、複数文を記述すると

ERROR: Error executing command.  Cause: org.apache.ibatis.jdbc.RuntimeSqlException: Error executing: --  add_data
-- Migration SQL that makes the change goes here.

insert into second_t values (1, 1000);

insert into second_t values (2, 2000);


.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into second_t values (2, 2000)' at line 7
のようなエラーが。

原因


{repository_root}/environments/development.properties
を見ると、

# This ignores the line delimiters and
# simply sends the entire script at once.
# Use with JDBC drivers that can accept large
# blocks of delimited text at once.
send_full_script=true
との記述。
send_full_scriptがtrueの場合、スクリプトをまるっと投げちゃうと。
JDBCドライバが対応していれば、それをデリミタ毎に分割して実行してくれるようですが、
今回使用したMySQLのドライバはそういうのに対応していないみたいで、
デリミタで区切られた複数の文も1つの文として 実行しようとするみたい。

解決策


上記のsend_full_scriptをfalseにしてやればok。エラーなく複数の文を実行できるようになりました。

勉強会に参加してみて


DB Migrationツールってたくさんあるんですね!
(Playだとevolutionsもありますが。 )
生SQLを都度実行するのは間違いが起こったり、どこまで適用したかわからなかったりするので、
今後とも積極的に使いたいです。

チームでの開発効率向上と、本番環境でのマイグレーションのオペミス削減に役立ちそう。


講師のきょんさん、参加者の皆さんありがとうございました!


追記1


MySQLの複数文実行について


MySQLはもともと複数文の実行に非対応だと教えて頂きました。


@lilyfanjpさんありがとうございます!


きょんさんの発表資料について


こちらにアップされてます。ツールの位置づけの図はあとでアップされるようです
http://kyon-mm.bitbucket.org/_static/slides/cdstudy-mybatis-migration/index.html

使っている言語やスタイルに応じてお好きなものをお使いください。


2013年4月3日水曜日

Scala SlickでIN演算子を実現するには?


Slickというか、ScalaQuery時代の記法のようですが、
Slick 1.0.0でも使えました。

書き方:

val ids = 1 :: 2 :: 3 :: Nil
for(u <- Users if u.id inSet ids) yield u.name
引用元: IN operator in WHERE clause 

※IN、ってググらビリティが低いので悩みました。

2013年3月26日火曜日

Tumblrってどうやってマネタイズしているの?

Tumblrってどうやってマネタイズしてるのかなーと検索して、下記の記事を発見。
2012年11月14日の投稿なので、内容的にはちょっと古いかも。



広告売上の大部分は以下の3点だとか。
  1. Tumblr Spotlight
  2. Tumblr Radar
  3. ポストへのピン付け ※多分2013年3月現在やっていないと思われる。

Tumblr Spotlight

Tumblr Spotlight
こういう画面。Web版でdashboardしか見ていないとあまり気づかないかも。

Tumblr Radar

Dashboardの右側に出てくる赤枠の画像のところ。

















 


広告以外の売上もありそうだけどなー。

2013年3月25日月曜日

『桐島、部活やめるってよ』鑑賞会@名古屋に参加しました。

3/21開催の『桐島、部活やめるってよ』を鑑賞する会に参加しました。

開催の流れ

  1. 大江戸Ruby会議03にてauthorNariさんが『桐島、Rubyやめるってよ』という発表をされた。http://d.hatena.ne.jp/authorNari/20130317/1363476355
  2. なんか名古屋界隈で「桐島、見てみたい」という流れになる。
  3. 名古屋のスタートアップ、スタンドファームさんにお邪魔して鑑賞会。 
※スタンドファームさん、ピザと映像と場所のご提供ありがとうございました!
あと某氏(名前出していいのやら?)飲み物ご提供ありがとうございました!

    感想とか

    自分は劇場で3回、BDで1回見て、今回が5回目の鑑賞になる訳ですが、
    初鑑賞の皆さんの感想が、また自分にはなかった視点で「ああ、そういう見方もあるのか!」と新鮮でした。
    ※個々人の感想はここでは引用しませんが。

    野球部キャプテンは、リアルにいたらアレかもしれない、というのは確かにあるかもなぁ。

    皆さんに一定以上の評価はしてもらえたようで、開催できて良かったなぁと。

    『桐島、部活やめるってよ』で描かれることについて

    群像劇だし色々な出来事が描かれるので、
    「『桐島、部活やめるってよ』は一言で言うとこういう話!」と表現しづらい。
    ネタバレにならない程度にぼかして、自分の考えるテーマ、と言うか軸を羅列してみる。
    • 「勝ち・負け」「将来につながる・つながらない」という軸と、「そうではない」軸
    • 同調圧力
    • 持つ者・持たざる者、スクールカースト
      • (スクールカーストの上にいる人達が必ずしも・・・?)
    • 分かり合えなさ感
    見る人によって他にも色々あるんだろうなぁ。

    次回?

    桐島に興味のある人がTL上にはみえるようなので、
    5月に今池のキノシタホールで上映されるので、お暇な人は行きましょう。
    ※個人的には、泣きのシーンで存分に泣きたいので、知り合いとは席を離しておきたいですが。

    未見の人向けアドバイス

    未見の人は、予告編を見ないようにおすすめします。
    あと桐島自身は基本出てこないです。
    あとポスターにてカメラ構えている人は桐島ではありません。

    2013年3月21日木曜日

    jacoco4sbtのバージョン2.0.0はPlay 2.1では動かない?

    背景

    Play 2.1でテストコードを書きながら、コードカバレッジを把握したいなーと思って調べていたところ、
    jacoco4sbtなるものを発見しまして。

    https://bitbucket.org/jmhofer/jacoco4sbt

    問題

    で最新が2.0.0ということで色々設定をした後、playコマンドでsbt起動後に
    jacoco:cover
     としてみると下記のエラーが。
    java.lang.IncompatibleClassChangeError: class org.jacoco.core.internal.flow.ClassProbesVisitor has interface org.objectweb.asm.ClassVisitor as super class

    で、どうも同じ症状が出ている人は世の中にいるらしく。
    https://bitbucket.org/jmhofer/jacoco4sbt/issue/18/the-conflict-about-asm-library-in-play

     上のリンクの方の推測によると、
    Playで使っているASMのバージョンと、Jacocoで使っているASMのバージョンが違うんじゃない?
    とのこと。

    回避策

    jacoco4sbtの1.2.4を使えばいいよ!とのことでした。

    pkugin.sbtはこんな感じ。
    //Jacoco
    libraryDependencies ++= Seq(
      "org.jacoco" % "org.jacoco.core" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.core", "jar", "jar")),
      "org.jacoco" % "org.jacoco.report" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.report", "jar", "jar")))
    
    addSbtPlugin("de.johoop" % "jacoco4sbt" % "1.2.4")
    


    その他

    ASMって初めて知ったのですが、Javaのbytecodeを操作したり分析したりするフレームワークだそうな。
    http://asm.ow2.org/

    2013年3月15日金曜日

    『北村、会社やめたってよ』

    2012年12月末を持って退職しました。 8年8ヶ月の勤務期間でした。

    退職する前は何してたの?


     新卒入社したSIerで主に設計と実装をやってました。
    あとは要件定義やら顧客との仕様詰めやらプロジェクト管理やら。

    企業の社内システムの開発が多かったので、
    新し目の技術や方法はあまり使ってなかったです。
    ScalaはJava使いの多いSIerが次に選ぶ言語として良いと思うんですけどね・・・。

    言語面では、Java/Webが一番多かったですねー。あとは.Net。
    (VB6は3年ぐらい書いてましたが。 )

    DBはOracleが多くて、本番環境にインストールしたりPL/SQLを書いたり。
    あとはPostgreSQLやMySQLとか。


    自分は大学は文系で、情報処理の経験もなかったのに色々と育ててくださったので前職の皆様には感謝感謝。
    支えてくださった皆様にも感謝。

    なんで会社やめたの?

     書きやすいことだけを書くと、
    • 2011年3月11日を経て、いつか突然死ぬこともあるんだよなー、このまま死んだら悔いが残るなー、とか。
    • そして原発事故があって、何かあった時にまずは安全のために逃げ出して、リモートで生きる糧を稼げるような働き方をしたいなー。
    • Excel方眼紙はもういいやー。
    • もっと良いスペックの開発マシンを使いたいなー。
    • 新しいことをやるための障壁が高すぎるなー。



    などなど。
    まぁ生々しい話が聴きたい方はオフラインででも。


    会社やめてどうするの?

     自分にとって「これがあると便利!」と思っているWebのサービスを作りたい、
    そしてそれでお金を稼ぎたい!
    と思って邁進しております。
      
    有り体に言うと今は無職です!無職ステータスは思ったより心身に良いです。

    その他


    本投稿のタイトルは、
    個人的2012年ベスト映画、かつ、自分人生に残る傑作『桐島、部活やめるってよ』の
    BD/DVDが発売されて、
    かつ、
    日本アカデミー賞優秀作品賞、優秀監督賞、優秀編集賞、新人俳優賞を受賞したので、
    それにちなんで。
    まじオススメの映画やで!


    2013年2月11日月曜日

    ScalaMock 3では、引数ありのコンストラクタのモックは作成できない

    背景


    Scalaでモックを作るには何がいいのかな~ってところで
    ScalaMock を使い始めました。

    困ったこと


    引数ありのコンストラクタのモックを作ろうとしても
    error: not enough arguments for constructor XXX.
    というエラーメッセージが出てコンパイルできません。

    引数ありコンストラクタを持つクラスはモックを作れないことが判明


    http://stackoverflow.com/questions/14274020/scalamock-mock-a-class-that-takes-arguments

    にて
    Right now, ScalaMock3 can only mock traits and no-args classes.

    今のところ、ScalaMock3ではトレイトと引数なしのクラスのみモックできるよ。

     てことで、少なくとも現時点では、引数ありのコンストラクタを持ったクラスのモックは作成できない模様。
    テスト対象のクラスを引数なしのコンストラクタにして、引数に渡したかったものはsetter使って渡す形ですかねー。
    Traitで定義しておいたほうが楽ですね。
    ※まぁscalamockのオフィシャルページにも似たようなことが書いてあったのでやっぱりかー、というところ。

    2013年2月4日月曜日

    Play ScalaでのカスタムPathBindableの作成方法(へのリンク)

    メモ。

    Play Frameworkで独自に作成したクラスなどを
    URLパスに指定したい場合、PathBindableを実装する必要があります。

    そのやり方を説明してくれているサイトを発見したので備忘録的に書いておきます。

    www.soutier.de/blog/2012/12/11/playframework-routes-part-2-advanced/

    implicit objectという手があるのかー、
    と自分のScala力の低さに悶々としてます。

    2013年2月3日日曜日

    sbtでscalacにコンパイルオプションを渡す方法。

    背景

    sbtでコンパイルを走らせた際にwarningが出で「-xxxっていうコンパイルオプションをつけてもう一度やってね」って言われるものの、
    そのコンパイルオプションの付け方がわからん!


    ということが起こった時にググって解決したものの、それを忘れていたせいで今日困ったので
    メモしておきます。

    設定の仕方

    sbtを起動したら、

    set scalacOptions += "-xxx"

    を実行。
    あとは普通にコンパイルするだけです。

    他のやり方は?

    build.sbtなどに設定する方法はあるのですが、
    ファイルを書き換えるのは手間なので、上記のやり方でやってます。


    2013年1月10日木曜日

    TypeScriptのtsc -wでコンパイルされない件。(TypeScript tsc --watch never compile)

    問題

    TypeScriptのtscコマンドにおける-w(--watch:ソースファイルの変更を検知して自動的にコンパイルしてくれるオプション)が、どうも効いていない。
    変更を検知するが、jsファイルを出力してくれない。

    ※環境
    • OS:Ubuntu 12.10 64bit
    • npm:1.1.69
    • TypeScript:0.8.1?

    実行すると

    $ tsc form.ts -w
    Recompiling(Thu Jan 10 2013 00:46:49 GMT+0900 (JST)): /usr/lib/node_modules/typescript/bin/lib.d.ts,/path/form.ts

    のような表示はされるが、form.jsファイルが出力されず。

    ソースを変更すると上記の"Recompiling xxx"というのは表示されるものの、やっぱりjsファイルは出力されず。

    回避方法

    どうもバグのようですが、2013/1現在、修正されていない模様。

    てことで
    Typescript watch compiler
    を使います。
    これは、tscコマンドのwatchを常に行うようにしたものです。
    インストールは以下の通り。
    sudo npm install -g tscw

     

    実行すると

    $ tscw form.ts
    TSCW is watching for changes, initializing first recompile.
      -> recompiling... done.
    となり、ディレクトリを確認すると無事form.jsファイルが作成されていました。
    ※tscw -w form.ts ではない点に注意。

    また、ソースを修正すると
    $ tscw form.ts
    TSCW is watching for changes, initializing first recompile.
      -> recompiling... done.

    [1:10:11]: change detected in file form.ts
      -> recompiling... done.
     となり、変更を検知してコンパイルされていました。

    tscwコマンドは、tscコマンドのオプションすべてが使えるようです。

    2012年12月31日月曜日

    2012年映画館で観た映画

    (多分)2012年初公開映画のうち、映画館で観たものを挙げます。大体観た順。
    1. 哀しき獣 
    2. 宇宙人ポール
    3. ゴモラ
    4. ドラゴン・タトゥーの女
    5. バトルシップ
    6. 戦火の馬
    7. ヒューゴ
    8. ドライブ
    9. スーパー・チューズデー
    10. アーティスト
    11. ル・アーブルの靴みがき
    12. 裏切りのサーカス
    13. わが母の記
    14. キツツキと雨
    15. ファミリーツリー
    16. 別離
    17. ロボット
    18. ネイビーシールズ
    19. アメイジング・スパイダーマン
    20. 隣る人
    21. ダークナイト・ライジング
    22. かぞくのくに
    23. アベンジャーズ
    24. プロメテウス
    25. トガニ
    26. 桐島、部活やめるってよ
    27. 最強のふたり
    28. まどかマギカ 前編
    29. まどかマギカ 後編
    30. アウトレイジ2
    31. 黄金を抱いて翔べ
    32. ザ・レイド 
    33. アルゴ
    34. エクスペンダブルズ2
    35. 高地戦
    36. ル・コルビュジエの家
    37. おおかみこどもの雨と雪
    38. 007 スカイフォール
    39. レ・ミゼラブル
    40. 2つの祖国で 日系陸軍情報部


    他、再上映なんかで劇場で観たのは
    1. マネーボール
    2. パーマネント野ばら 
    というところ。

     

    個人的総合1位

    『桐島、部活やめるってよ 』です。劇場で見て以来、学園モノとか青春モノ、さらに現実の高校生集団もすべて『桐島史観』でみてしまうほどの影響力がありました。

    誰もがそれぞれの視点で世界を見ていて精一杯で、他の人の世界の見え方に余裕がない感じとか青春だよなぁ、
    とか、
    登場人物の誰もが(観ている)自分のようであって自分でない、
    とか、
    ゾンビの「生きてもいないし死んでもいない」ってほんと「俺たち」にとってリアリティあるよなぁ、
    とか、
    「俺たちがこれをやってるのって、将来の何かに結びつくかどうかわかんないけど、『あの人たち』とつながった気がすることがある」ってこと、あるよなぁ、
    とか、
    傷心が芸術的なものに昇華する展開って、熱いし泣けるよなぁ、
    とか、
    「こういう生き方もあるんだ」と気づいた一人が、気づいてしまうがゆえに混乱しうろたえて、多分世界の見え方が変わっちまうんだろうなぁっていうシーケンス、しかもそれを映画的に最高に盛り上がるイベントの後に配置するってのがすごいなぁ、
    とか、
    その最後の最後、このキャラクターはAとBのどっちに行くんだ、というところで、Aの音声は小さくなっていき、Bの音声と視覚表現がだんだんと強くなっていく、という表現、
    とか、
    「それでもこの世界で生きていかなくてはならないのだから・・・」

    などがもうたまらなく好きになってしまったのですよ。

    青春映画のエポックメイキングだと思います。 日本に限らず、海外のティーンが見てもグッとくるんじゃないですかね?自分がぼんくら寄りだからそう思うだけ?

    涙腺がやばい部門

    • わが母の記 
    • ファミリーツリー
    • トガニ
    • レ・ミゼラブル
    『レ・ミゼラブル』のアン・ハサウェイの『夢破れて』はそこに至るまでの展開とアン・ハサウェイの演技がもう泣けて泣けて仕方なかったです。あのシーンを見るだけでももう一回見に行きたいぐらい。

    熱い!部門

    • バトルシップ
    • ネイビーシールズ
    • アベンジャーズ
    • ザ・レイド
    『ザ・レイド』はアクションシーン全編熱いのでおすすめです。続編も楽しみです。

    かっこいい!部門

    • ドライブ
    • 裏切りのサーカス
    • 007 スカイフォール
    『ドライブ』はオープニングから心を掴まれて、エレベーターでのキスシーンでもう頭がじんじんとしびれました。あの時間・空間・光も歪めるあのシーンは「すごいシーン」として今後も個人的に残りますね。
    『裏切りのサーカス』は、俳優・スーツ・小道具もかっこいい上に、過去のパーティシーンと現在の対比が涙を誘います。
    『007 スカイフォール』は、始まりからオープニングムービーまでが最高にテンション上がります。その後は随所に魅せ場があって良いですね。でも始まりからオープニングムービーまでがかっこよすぎてそれ以降はそこまでノれない感じ。

     

    もう勘弁してください!部門

    • プロメテウス
    監督が強い女性が好き過ぎるためか、主人公の女性に課す困難があまりにもあまりすぎて、
    「妊婦は見てはいけない」シーンはもうほんと勘弁してください!という感想でした。
    全体としては3Dが気持ちいいのとヌメヌメ感が気持ち悪くて好きだったのですが、 シャーリーズ・セロンだけは無駄使いだったのでもう少しなんとかして欲しかったです。シャーリーズからアレがどーんと出るのを観たかったですね。


    心に残った映画色々

    • 別離:
      それぞれの葛藤が描かれていてすごく切ない。
    • かぞくのくに:
      現実にこのような出来事があった、という点でやりきれない。
    • 隣る人:
      無邪気なようでいて無邪気でいられない子どもの姿がズシンと来ます。
    • 2つの祖国で 日系陸軍情報部:
      米国への忠誠を示すために日本との戦いに身を投じた日系の方々の記録。やりきれない・・・。

    最後に

    来年は諸事情であまり劇場で映画を見れなさそうなので、
    色々と厳選したいと思います。
    『ルーパー』とか『ライフ・オブ・パイ』とか、面白そうなのも一杯なので悩みますが。

    2012年12月8日土曜日

    eMacsでscaLaを書く準備

    この投稿はLL/ML Advent Calendarの12/8向けです。

    動機

    Scala基礎勉強会にて、Scalaを書くのにemacsを使っている人が多数いたので、
    エクなんとかというエディタのことはこの際忘れて、
    eMacsでscaLaを書くことに挑戦しようと思い、設定方法などを記事にする次第。


    環境

    • CentOS 6.3(64bit)
    • GNU emacs 24.2.2
    これらは既に入っている前提で。

    で何を入れるの?

    scala-mode2

    まずは、scala-mode2という、Scala用のメジャーモードを使用します。
    scala-mode2は下記の機能を提供してくれます。
    • インデント
    • シンタックスハイライト
    • モーションコマンド
    ※2012年12月8日現在のステータスとしては、
    • インデント:完成(finalized)
    • ハイライト:仕掛り中
    • モーションコマンド:emacsの標準的なものについては対応していますが、Scalaに特化したものはまだ対応できていない
    とのこと。

    scala-mode2はGNU emacsの24.2を対象に開発されています。
    24より過去にはない機能を使っているそうなのでご注意を。

    設定手順

    昔はScala本体と一緒に配布されて気もしますが、今はGithubからダウンロードするようです。

    ファイルをダウンロードします。
    git clone git://github.com/hvesalai/scala-mode2.git
    

    パスなどの情報をemacsの初期化ファイル(自分の場合は~/.emacd.d/init.el)に書き込んでやります。
    (add-to-list 'load-path "/path/to/scala-mode2/")
    (require 'scala-mode)
    

    基本的にはこれだけです。Emacsを起動して、.scalaファイルを開くと、Scalaモードになっていると思います。


    シンタックスハイライトが効いていますね。


    ENSIME

    が、これだけだとScalaをばりばり書くには物足りません。
    やはり補完とかリファクタリングしたいですよねー。
    ということでENSIMEを使います。
    ENSIMEとは"ENhanced Scala Interaction Mode for Emacs"の略称とのこと。
    えんざいむ、と読むそうな。

    ENSIMEを導入することにより、
    • ファイルを保存するたびにコンパイルエラーを確認できる
    • 補完
    • 基本的なリファクタリング
    • シンボルのインスペクション
    • パッケージ/型のブラウジング
    • デバッグ(※ステータスはwork in progress)
    などができるようになります。

    emacsの対象バージョンは22以降。23が推奨されています。
    が、私が試している限り、24.2でも問題なく動いています。


    設定手順

    Downloadサイトから適切なファイルを取得します。

    展開後、emacsの初期化ファイルに下記を追記します。
    (add-to-list 'load-path "ENSIME_ROOT/elisp/")
    (require 'ensime)
    
    (add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
    

    SBTから設定ファイルを作成


    ENSIMEを使うには、設定ファイルを作成する必要があります。
    設定ファイルを作成する方法は以下の2つの方法が用意されています。
    1. ウィザード形式で対話的に作成する
    2. SBTプロジェクトにて、ENSIMEプラグインを使って生成する
    ここでは、2の方法を採用します。
    今回は、Play Frameworkで新規作成したプロジェクトについて、ENSIMEの設定ファイルを生成してみます。

    ※Play Frameworkのバージョンは、2.1-RC1を使います。

    {プロジェクトルート}/project/plugins.sbt に下記の通り追記します。

    addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.0")
    

    その後、プロジェクトルートにて
    play
    ensime generate
    

    とやるとENSIMEの設定ファイル(.ensime)がプロジェクトルートに作成されます。

    ENSIMEの有効化


    {プロジェクトルート}/app/controllers/Application.scala をemacsで開いてみます。

    右下に[ENSIME: No Connection]というのが見えますね。


    M-x ensime
    

    としてやるとENSIMEの機能を有効にできます。


    ENSIMEを使った際の画面イメージは?


    totoshiさんが
    EmacsでつくるScala開発環境 後編(ENSIME)
    という分かりやすいポストを書かれているのでご参照ください。



    最後に


    正直、私のemacs力が低いため、未だemacsでScalaをバリバリ書ける!という状態ではないのですが、
    だんだんと慣れていけたらなぁと思います。

    明日は@youku_sさんと@kotashanさんが担当です。

    2012年12月3日月曜日

    Play Frameworkの2.1-SNAPSHOTでDoubleのformatterが追加されていた。

    Play Frameworkの2.1-SNAPSHOTでDoubleのformatterが追加されていたのでメモ。

    Play Frameworkでの入力フォームについて、2.0以前では、自分でDouble型のフォーマットを書かなくちゃいけなくて面倒でしたが、2.1からはデフォルトでフォーマットが提供されるようです。

    2.0の場合も、下記の実装をコピーしてフォーマッターを作れば簡単。

    https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/data/format/Format.scala#L117

     
    via http://stackoverflow.com/questions/12759430/play-bind-a-form-field-to-a-double


    使い方


    2012年7月15日日曜日

    ScalaでAndroidのAsyncTaskを使う際に可変長引数でAbstractMethodErrorが発生する件

    Androidアプリにて非同期処理を実現しようとするとAsyncTaskを使うわけですが、
    Scalaで書こうとすると実行時にAbstractMethodErrorが発生する訳です。
    で、これはどうもJava側での可変長引数をScalaでよろしく処理できないためのようで。

    てことで検索したら解決策を発見したのでメモ。

    https://gist.github.com/1175555

    @Override
       protected Result doInBackground(Params... params) {
          return doInBackground(params.length > 0 ? params[0] : null);
       }
    
       abstract protected Result doInBackground(Params param);
    


    AsyncTaskを継承したJavaクラスを作成し、可変長引数を受け取ったらその1個目の引数を使ってabstractメソッドに処理を移譲しています。

    2012年6月7日木曜日

    第2回 ドメイン駆動設計読書会@名古屋 のモデル

    第2回 ドメイン駆動設計読書会@名古屋 のモデル
    http://atnd.org/events/29529


    2012年4月25日水曜日

    jberkel / android-plugin とEclipse

    ScalaでAndroidコードを書きたいなぁ、ということで調べていたら下記のsbtのプラグインがヒットしました。

    / android-plugin

    Scala書くときにはEclipseのScala IDEがなかなか使えるし、
    Androidのリソースを編集するのにも向いていていいよねー、てことでEclipse用に環境を構築しました。
    結果的には、ほとんど下記の方の記事と一緒の設定になりました。

    sbteclipse を android-plugin に適用して eclipse で編集する


    ちょっと違うのは、私が使ったandroid-pluginが0.6.1だからか、sbteclipse-pluginが2.0.0だからなのか、
    Eclipseにインポートした後にしたことは、Build PathのSourceタブにおいて、
    • src/main/res をビルドパスに追加
    しただけでした。

    逆にしなかったこととしては、
    • src/main/resources、src/test/resources の削除は不要。
    • Librariesタブで、target[scalaバージョン]/classes の追加は不要。
    でした。


    ひとまず、Eclipse上でエラーが表示されることはなくなりました。

    2012年4月15日日曜日

    Play Framework 2.0を学ぶ:その2 テンプレートのi18nではまった

    Play Framework 2.0(Scala)のテンプレートの国際化ではまったのでメモ。

    やりたいこと

    テンプレートの文言を外部リソースに切り出したい。
    で、言語に対応した文言を表示したい。とりあえず今回は日本語で。


    やったこと

    Messages and internationalization を参考に、こんな感じで設定。

    1. application.confにて、日本語を使えるように設定。
    2. application.langs="en,ja"
      
      ダブルクオートで囲む必要があるそうな。
    3. conf配下にmessges.jaファイルを作成。
      key=メッセージです!
      
      という形式で登録。
    4. テンプレートを修正し、messagesファイルを参照するよう修正。

      @Mesasges("key")

      という形式で登録。
    とここで問題発生。
    「メッセージです!」と表示されずに、「key」と表示されてしまいました。

    messages.enファイル内でメッセージを定義しても「key」と表示されてしまう始末。

    HTTPヘッダーのAccept-Languageにもja、enが含まれているのになー。


    解決方法

    "play  framework i18n template"で検索したところ、下記を発見。

     i18n error: controller and templates uses different implicit Langs

    これによると、
    • Messagesは、implicit paramterとしてLang型の引数(lang)を取る。そのlangは、明示的に指定されない場合、JVMのデフォルトロケールを使う。
    • コントローラ内でMessagesが呼び出される際にimplicit requestが定義してあれば、そのrequestのHTTPヘッダーからAccept-Languageを取得してMessgesの引数langに暗黙的に値を設定してくれる。
    • が、テンプレート内ではスコープ内にlangを見つけられないからJVMデフォルトのロケールが使われるよ。
    とのこと。
    対応策としては、テンプレートの引数にimplicit parameterとしてLangを付与すれば良い、ということで、viewは下記の通りになります。
    (1行目が追加した箇所)


    @(implicit lang: Lang)
    
    

    @Mesasges("key")


    こうすると、Messagesの引数に暗黙的にlangの値が渡され、今回の日本語環境の場合はmessages.jaに定義された値を表示します。

    2012年2月7日火曜日

    Play Framework 2.0を学ぶ:その1 template engine

    このあたりを見ながら個人的に重要そうな部分を抜粋。
    https://github.com/playframework/Play20/wiki/ScalaTemplates

    Play Scalaテンプレート

    Play Scalaテンプレートは標準のScalaのfunction(以降、関数)にコンパイルされます。
    下記のようなconvention(規約)に基づきます。

    views/Application/index.scala.html
    

    というテンプレートファイルを作ると
    views.html.Application.index<
    
    という関数を生成します。
    上記ファイルの内容が以下のようだとすると

    @(customer: Customer, orders: Seq[Order])
     
    

    Welcome @customer.name!

      @orders.map { order =>
    • @order.title
    • }

    これはどのScalaコードからでも、下記のように呼び出せます。
    val html = views.html.Application.index(customer, orders)
    

    なお、テンプレートファイルの1行目に記載してあるものは、Scala関数の引数とのこと。テンプレートを呼び出す際にも、関数を呼び出すのと同じように、引数に値を渡すんですねー。


    "@"キャラクタ

    テンプレート上の@は、Scalaコードの始まりと見なされます。
    明示的に終了を記述する必要はありません。

    ただし、マルチトークン(?)なScalaコードを記述したい場合は、
    @(Scalaコード1 + Scalaコード2)のようにかっこでくくる必要があります。

    また、{}を使って、複数のステートメントを書くこともできます。

    @は特別なキャラクタなので、エスケープする場合は、

    @@

    と@を重ねる形でエスケープします。


    テンプレートパラメータ
    テンプレートは単純な関数であるため、パラメータが必要です。
    パラメータは、テンプレートファイルの1行目に記述される必要があります。

    デフォルト値も使えます。
    パラメータグループも使えます。
    インプリシットパラメータも使えます。


    ※その他は今のところ使わなさそうなので省略