properties, yaml, and me
TRANSCRIPT
*.properties と *.yml と 私。
Java Casual #2LINE Corp@渋谷ヒカリエ2016-11-07@nabedge わたなべ
1
Who ?● わたなべ
○ twitter: @nabedge○ (株)ビズリーチ
○ Mixer2というOSSのテンプレートエンジンを作ってます
● 12月3日(Sat)のJJUG-CCC 2016 Fall で登壇します。
○ 「俺のコードがどこで使われているのかわからない
問題 - あるいはマイナーOSSの生存戦略」
2
Javaエンジニア
絶賛募集中www.bizreach.co.jp/recruit
3
本題
4
ある日見たプルリクエスト5
● native2asciiってやつ。
非ASCII文字をユニコードエスケープ表現に変換したもの。
● そのブランチを手元にcheckoutして
IDEで見ればいいじゃんってだけの話かもしれないけどさ。
6
別な日に見たプルリクエスト7
何が起きた?
● Aさんがeclipseでメンテしていたpropertiesファイル
● BさんがIntelliJ IDEAで開いて閉じて。
● eclipseのプロパティエディタプラグインは
小文字でエンコードする
● IntelliJのエディタの透過native2ascii設定は
大文字でエンコードする
● デコードされる文字は同じなのでアプリの挙動に問題はない
8
アンケート:普段使っているIDEは?
● IntelliJ IDEA
○ 透過的にnative2asciiする設定はオン?オフ?
■ (ちなみにデフォルトはオフのはず)
● Eclipse
○ プロパティエディタプラグイン入ってる?
9
どうする?
● IntelliJ IDEAが小文字でエンコードするように設定を追加する
○ IntelliJなメンバー全員がやらないと意味がない。
○ githubのプルリク画面でのレビューがしづらい問題は残る
10
どうする?
● propertiesファイルをUTF-8で書く。
つまりnative2asciiしない。
○ githubのプルリク画面でレビューしやすくなる!
○ Eclipse使っているメンバー全員がプロパティエディタプラグイ
ンをオフる必要あり。
○ そもそもJava6以降からnative2asciiは不要ですよ奥さん
11
まだ*.propertiesファイルで消耗してるの?
俺たちは、Java言語とIDEの、
それぞれの歴史的な事情に振り回されているだけだ。
12
YAML Ain’t a Markup Language 13
YAML Ain’t a Markup Language 14
*.propertiesから*.yamlへの書き換え
1. foo.bar=bazを
foo.bar: bazに書き換えて、ファイルの拡張子を*.ymlか*.yamlにする
2. あとは
SnameYamlYamlPropertiesFactoryBean (Spring使ってる場合)でググる
15
16
java.util.Properties
ではなく
java.util.ResourceBundle
として使いたいケースだったら?
例: messages.properties と messages_ja.properties をyaml形式にしたい
Locale, Properties, ResourceBundle
長くなるのでヒントだけ。
1. Java6以降での国際化リソースの記述方法は次の二つ
a. *.propertiesファイルで表現する foo.propertiesと foo_[ロケール名].properties
b. java.util.ListResourceBundleの派生クラスとして
Javaクラスで表現する
2. ListResourceBundleを継承したクラスの中で、SnakeYamlとかで*.ymlを読めるようにしておく
17
長くなるのでヒントだけ。
// 英語ロケールの場合の例. クラス名にロケールをつけるのがポイント.
public class FooProperties _en extends AbstractYamlResourceBundle {
public FooProperties _en() {
super("foo_en"); //これでfoo_en.ymlを読む
}
}
// ロケールを指定してリソースバンドルを取得
ResourceBundle.Control control =
ResourceBundle.Control.getControl(ResourceBundle.Control .FORMAT_CLASS);
ResourceBundle rb_english = ResourceBundle.getBundle(
com.example.FooProperties.class .getName(),
Locale.US,
control
);
18
java.util.ListResourceBundleを継承した共通クラスを自作
まとめ
● 10年も前からnative2asciiは不要のはず。
● しかし、道具(IDE)、知識、意識が置き去りのまま
● っていうか、まだ*.propertiesファイルで消耗してるの?
● いっそのこと *.yml の方が今風ですよね
● java.util.Propertiesにするのは簡単
● java.util.ResourceBundleにするのもそう難しくない
19