play!frameworkで勝手にDBが更新された!


仕事でplay!frameworkを使っている。
2.Xはwarがうまく作れなかったので1.2.5を使うようになった。

非常に軽量なフレームワークで、作り始めるまでに数分。。
書き方も数日で覚えることができた

「こりゃ良いや!!」ってことでバリバリソースを書いていたのだが。。。

あるとき、ふとDBを見るとなんだか見慣れないテーブルが、、、
不思議に思いちょっと調べてみる。。

少し前に、テスト用に作ったModelがテーブル名称になっている

もしや!と思いModelを作ってみる





やはり。。

playはテスト環境にしていると
DBに見当たらないテーブル、フィールドを勝手に作ってしまうようだ
ドキュメントにしっかり書いてありました。。。

解決方法は
conf/application.conf内の

jpa.ddl=update

jpa.ddl=none

とするとテーブルは勝手に作られなくなる

おー怖い!きちんとドキュメントは読みましょう。。

CSS3を勉強したいなと思った

http://codepen.io/chinchang/pen/ygHBc

を見て、CSS3ってすごいなと。。
これだけでアニメーションとか作れたりするんだろうな。

上記サイトは自分でcssを修正して、動作を見れるので
とても勉強になりました。

ソース自体は結構簡単で短いのですが
イデアというか、発想次第でいろいろ応用できそう!

今度、じっくり触ってみたいな。口だけになりそうだけど。。

javaでBlowfishを使う

仕事で暗号化を使う必要があったので
やった事をメモ

まず、Blowfishで暗号化する為に最初に決めないといけない事は

  • 暗号化方式(CBC or EBC)
  • パディング方式
  • IV(初期ベクトル)

を決める事

暗号化方式

CBCとEBCというものがあるらしい。

ECB

初期ベクトルが固定で同じ文字を同じキーで暗号化した場合は同じ結果になる

CBC

暗号化する時に初期ベクトルがランダムで設定されるらしい
同じ文字を同じキーで暗号化しても毎回異なる結果になる
複合化する為には初期ベクトルが必要になる
※初期ベクトルについては後で書きます

パッディング方式

Blowfishでの暗号化は8byte単位でされるので、足りない場合は文字埋めされる
その方式がいろいろあるようなのでそれをここで指定する

PKCS5Padding

というのが主流らしい。
Javaのドキュメントもそうなっていたのでそうなんだろう

IV(初期ベクトル)

後で書きますといったもののよくわからない。
一番最初に使うキーらしい、こちらのサイトを参照してください

日々是妄想 : 初期化ベクトルってなに?(解決編)

暗号化

例えば、暗号化される文字列が
=1234567890

KEY(秘密鍵)が
=testkey

だった場合

String algorithm = "Blowfish";
String mode = "Blowfish/CBC/PKCS5Padding";
String target = "1234567890";
String key = "testkey";

SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm);
Cipher cipher = Cipher.getInstance(mode);

cipher.init(Cipher.ENCRYPT_MODE, sksSpec); // 暗号化モード

// 結果
System.out.println(cipher.doFinal(target.getBytes()));

byte[] iv = cipher.getIV()

// 実際に送る場合はBase64エンコードをする
// Base64.encode(hogehoge.getBytes());

となる

初期ベクトルは

cipher.getIV();

で取得できる
ECBの場合はNULLみたい

**複合化

byte[] encrypted = Base64.decode(target); // BASE64エンコードされてい売る場合
byte[] ivByte = Base64.decode(iv);

SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm);
Cipher cipher = Cipher.getInstance(mode);

// (1)
IvParameterSpec ips = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, sksSpec, ips);

// 結果
System.out.println(cipher.doFinal(encrypted));

(1)でもらったIVで初期ベクトルを指定している
初期ベクトルがない場合は

cipher.init(Cipher.DECRYPT_MODE, sksSpec);

という呼び出しで複合化ができる

PHPとやり取りをする場合は↓こんな感じらしい。
http://d.hatena.ne.jp/pasela/20100612/crypto

今回は暗号化部分のみだったのであんまり見てません

自己紹介

最初なのでまずは簡単に自己紹介をしようと思います。

現在社会人8年目。
社員400人くらいの会社で7年間働き、様々な職場を点々としていました
ついこないだ転職し、モノを売ってる会社でECサイトを作る仕事をしています。優秀かどうかは怪しいですが、なんとか頑張っています。

仕事ではJavaを使っています。
趣味はゴルフとスノーボードです。

至らないながらも仕事で気がついたことや、学んだことを書いていこうと思っています。