play2.1/scala2.10 のプロジェクトを play2.3/scala2.11 に変更した
いろいろ大変だった……
- 参考資料は
- sbt/play → activator ( activator は sbt を含んでるっぽい )
- build.properties / build.sbt / Build.scala のバージョン番号を変えていくだけの簡単なお仕事……
- と思ったら groupID が play から com.typesafe.play に変わってる
- play.Project(...) を Project(...) にする方法は Migration23 ↑ に
api が変わってる
- Mapping の unbind → unbindAndValidate https://github.com/playframework/playframework/commit/a75981b24770d151b9a77cfe5135941d6b73a52c
- PlainResult/SimpleResult => Future[Result]
- とりあえず型を Result にして、エラーが出るなら Future(result) してやればよい
- Cannot find an implicit ExecutionContext なエラーが出る → import play.api.libs.concurrent.Execution.Implicits.defaultContext
- scalax.io への依存がなってエラーる → とりあえず scala.io を使うように変更した。
- specs2 のバージョンが変わって given/when/then のインタフェースが変わったのでむしゃくしゃして全部 scalatest にした(元々2/3くらいscalatestだった)
- scalatest のバージョンを 2.1.7 + scalautils を使う (2.3 から scalatest が公式サポートっぽい? https://www.playframework.com/documentation/2.3.x/ScalaTestingWithScalaTest )
sbt-web
The largest new feature for Play 2.3 is the introduction of sbt-web!!
- 基本 Migration23 のやり方でいいんだけど……
- The Closure Compiler has been replaced. ← これが死ねる。
- bootstrap 2.2.2 の less がコンパイルできなくなってる → bootstrap 2.3.2 にした → jquery のバージョンが上がって htmlunit 死亡 → phantomjs でテストするように変更
- htmlunit から phantomjs に変更したおかげで confirm ダイアログがでる場面でデフォルトfalseを返すようになった → https://github.com/detro/ghostdriver/issues/20
- sbt-rjs(requirejs) は勝手にwebjarsを使ってくれない => RjsKeys.mainConfig := "requirejs.conf" にして app/assets/javascripts/requirejs.conf.js に requirejs.conf({ paths: "jquery": "jquery/jquery"}) みたいなのを書く…
- 当然devモードで使うときもその requirejs.conf.js を読み込んでから requirejs を読み込む
- def requireJsLoad(main: String): Html = Html(s"""""")
- org.webjars.play.RequireJS.setup がよく似た事してて、たぶん将来的には手動でconf設定しなくても自動でできるようになると思われるが、今は無理
- 参考にした sbt-web/sbt-rjs を使ってるプロジェクト https://github.com/satoshi-m8a/play_eccube_api
なんとなく sbt-web/webjars/sbt-rjs は鬼門…… https://github.com/tuplejump/play-yeoman (sbt から外部プロセスとして node/yo/bower/grunt とか呼ぶ sbt プラグイン) か普通に bower/grunt 使ってjavascript界のやり方でライブラリ管理・アセットコンパイルやった方がいいんじゃないだろうか……
dist でできる成果物が違う
これが原因でデプロイスクリプトが死んだ
- 出力位置が dist じゃなくて target/universal
- start スクリプトがなくなって bin/プロジェクト名 みたいなのができてる。中身はactivatorの起動スクリプト
- jar が project_2.10-x.x.x.jar から project.project-x.x.x.jar と project.project-1.0-assets.jar に変更された(assets が別jarに)
- Build.scala の書き方によって conf がjarに含まれる場合と含まれない場合がある? 調査中……
- RUNNNING_PID のできる位置がシンボリックリンクなどを解決した先になった → -Dpidfile.path=${BASE}/RUNNING_PID のように自分で設定する
- javaオプションを勝手に設定してくれる → -Xms1024m なので t1.micro で二つ立てると死ぬ → -J-Xms5m とか自分で設定すると初期値設定が消える
- psコマンドで見たら恐ろしいことになってるのは相変わらず…
- start が消えるのと RUNNING_PID がシンボリックリンクたどるのを解決 https://gist.github.com/nazoking/78d05bb9a5674ef687f3
mysql で lower_case_table_names=0 で作ってしまったテーブルを lower_case_table_names=1 用にリネームする
lower_case_table_names=0 の時に
mysql DBNAME -e "show tables" -NB|ruby -p -e '$_.sub!(/.*$/){|a| "RENAME TABLE #{a} TO #{a.downcase};" }'|mysql DBNAME
すると全部小文字になるので、それから lower_case_table_name=0 する。
システム用テーブル以外の一覧は
mysql -N -e 'show databases'|grep -v -E '^(tmp|mysql|innodb|information_schema|performance_schema)$'
しないととれないのかな・・・?
既存のカラムのCHARACTER SETを全部utf8mb4に変更する
utf8 → utf8mb4 とか! 既存のフィールドが100とかあったりするとちまちまやってられないのでsqlを生成する。
まずこうして
ALTER DATABASE hogedb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
それから
mysqldump -d hogedb |grep -E ' CHARACTER SET |CREATE TABLE'|sed \ -e 's/CHARACTER SET utf8/CHARACTER SET utf8mb4/' \ -e 's/ `/ MODIFY `/' \ -e 's/CREATE TABLE/ DEFAULT CHARACTER SET utf8mb4;\nALTER TABLE/' \ -e 's/($//' > alter.sql
すると
DEFAULT CHARACTER SET utf8mb4; ALTER TABLE `ofBookmark` DEFAULT CHARACTER SET utf8mb4; ALTER TABLE `ofBookmarkPerm` MODIFY `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL, DEFAULT CHARACTER SET utf8mb4; ALTER TABLE `ofBookmarkProp` DEFAULT CHARACTER SET utf8mb4; ALTER TABLE `ofConParticipant` MODIFY `bareJID` varchar(200) CHARACTER SET utf8mb4 NOT NULL, MODIFY `jidResource` varchar(100) CHARACTER SET utf8mb4 NOT NULL, MODIFY `nickname` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
みたいなのが得られるので、それをいい感じに編集して実行するのじゃ
AWS コンソールの認証をgoogle appsスクリプトで行う
https://github.com/nazoking/aws-federation-goolge-apps-script
AWSコンソールの認証をgoogle appsスクリプトで行えるようになると
- シングルサインオン(ではないが・・パスワードをawsとgoogle appsの両方で管理、とかはしなくてなくてすむようになりますね)
- 認証用のサーバが必要なくなる(google apps script がホストしてくれるので)
- Google Group に所属しているかどうかなどの確認が簡単に行える。
- スプレッドシートで管理とかもできる
- それによって権限を変更したりできる
ので、Google Apps を導入している企業なんかでは非常に使い勝手があるんじゃないでしょうか。
gitでgoogle appsスクリプトを管理する方法が分からなかったのでコピペです……こうやるんじゃ!
というご意見・プルリクエストをお待ちしております。
Jsonを行ベースのデータ構造に展開する json2line
最近増えてきた json の扱いに困っていませんでしょうか? jqよくわからん、使い慣れたgrepやawkやperlのワンライナー使いたい。
そこで json2line を作りました。
https://github.com/nazoking/json2line
python 2.6 以上で動きます。たぶん
pip install https://github.com/nazoking/awsxx/wiki/dist/json2line-0.0.1.tar.gz
でインストール出来ます。
こんな感じ
$ aws ec2 describe-instances --filters name=tag:Name,values=ft02 | json2line --tsv -l Reservations.OwnerId 6765247xxxxx Reservations.ReservationId r-0c759cxx Reservations.Groups.GroupName hogehxxxx Reservations.Groups.GroupId sg-xxxxxx Reservations.Instances.Monitoring.State disabled Reservations.Instances.PublicDnsName ec2-123-224-111.ap-northeast-1.compute.amazonaws.com Reservations.Instances.KernelId aki-44992845 Reservations.Instances.State.Code 16 Reservations.Instances.State.Name running (中略) Reservations.Instances.AmiLaunchIndex 0 ResponseMetadata.RequestId c3cxxxxff-9xx-4axe-9xx0-f6a12f7axx
なのでgrepとかできます。
--help でオプション一覧出てきますが
--tsv でTSVっぽい
-l でリストのインデックスを表示しない
くらいをよく使うんじゃないでしょうか。
例えば awscli を使って Name:ft02 というタグのついたEC2インスタンスを route53 で hoge.example.com という名前で登録するには
route53 change_record hosted_zone_id hoge.example.com. CNAME `aws ec2 describe-instances --filters name=tag:Name,values=ft02 | json2line --tsv -l|awk '/PublicDnsName/{print $2}'`
という感じのワンライナーになります。
初めてくらいでpython書いたのでツッコミお願いします。
windows で ruby が実行されているウィンドウをアクティブにするgem
を作りました。
https://github.com/nazoking/win32-activate
gem install win32-activate
でインストール出来ます。
ruby -r rubygems -r win32/activate -e "system('notepad.exe');Win32::Activate.active"
と実行すると、メモ帳が立ち上がります。そのあと適当に作業とかしてコマンドラインが非アクティブになっても、メモ帳を閉じればrubyが動いていたウィンドウがアクティブになります。エディタとの連携をしたいスクリプトなどにご利用ください。
最近はbundle gem hogehoge だけで簡単にrubygemが作れるようになっててすごい