play2.1/scala2.10 のプロジェクトを play2.3/scala2.11 に変更した

いろいろ大変だった……

api が変わってる

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 でテストするように変更
  • 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スクリプトで行えるようになると

  • シングルサインオン(ではないが・・パスワードをawsgoogle appsの両方で管理、とかはしなくてなくてすむようになりますね)
  • 認証用のサーバが必要なくなる(google apps script がホストしてくれるので)
  • Google Group に所属しているかどうかなどの確認が簡単に行える。
  • それによって権限を変更したりできる

ので、Google Apps を導入している企業なんかでは非常に使い勝手があるんじゃないでしょうか。

gitでgoogle appsスクリプトを管理する方法が分からなかったのでコピペです……こうやるんじゃ!
というご意見・プルリクエストをお待ちしております。

Jsonを行ベースのデータ構造に展開する json2line

最近増えてきた json の扱いに困っていませんでしょうか? jqよくわからん、使い慣れたgrepawkperlワンライナー使いたい。

そこで 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が作れるようになっててすごい