2013年2月3日日曜日
2012年12月6日木曜日
一人Advent Calendar 5日目
5日目といいつつ6日の朝です。
4日目の記事も完成してないんですけどとりあえず5日目書きます。
1,2,3日とひたすらYAMLファイルを解析していたのですが実際はどうやって解析するかというのをJYamlのソースを少し見てみます。
Yamlの解析はデータの種類を把握しないといけないので流れしては
1 データ読み込み
↓
2 データ構造理解
↓
3 データを理解した構造に合わせて変換
でいいと思います
今回は
まずはYamlクラスのloadメソッドです
YamlConfigのloadメソッドに処理を委譲しているようなのでそちらへ。
YamlConfig
どうやら複数データをシリアライズしている時と1つのデータをシリアライズしている時で呼ぶ方は違っても結局内部では同じメソッド使ってるみたいです。
(落ち着いて考えたら当たり前だった・・・)
次はYamlDecoderクラスのreadObjectメソッドですね。(setConfigメソッドはYamlConfigを渡してYamlDecoderクラスから参照できるようにしているだけだったので省略)
YamlDecoderクラス
解析としてはやっていることは同じはずなのでfirstDocument側だけ追います
headerメソッドは---から始まるかどうかを判定してました。
まだここまでしか見れてないですが、ここから先は実際にデータを読み込んで解析してデータを指定されている構造に直せば解析は終わりだと思います。
とりあえず今日はここまでで。
4日目の記事も完成してないんですけどとりあえず5日目書きます。
1,2,3日とひたすらYAMLファイルを解析していたのですが実際はどうやって解析するかというのをJYamlのソースを少し見てみます。
Yamlの解析はデータの種類を把握しないといけないので流れしては
1 データ読み込み
↓
2 データ構造理解
↓
3 データを理解した構造に合わせて変換
でいいと思います
今回は
Yaml.load(new File("test.yml"));
を呼び出したとして処理を追ってみます。
まずはYamlクラスのloadメソッドです
public static YamlConfig config = YamlConfig.getDefaultConfig();
public static Object load(File file) throws FileNotFoundException{
return config.load(file);
}
loadメソッドは様々な引数に対応してましたが、今回はFileを引数に取るのだけを追っていきます。YamlConfigのloadメソッドに処理を委譲しているようなのでそちらへ。
YamlConfig
public Object load(File file) throws FileNotFoundException{
return load(new YamlDecoder(new FileInputStream(file), this));
}
public Object load(YamlDecoder dec){
dec.setConfig(this);
Object ret = null;
try {
ret = dec.readObject();
} catch (EOFException e) {}
return ret;
}
どうやらloadメソッドにYamlDecoder以外の引数を渡すとYamlConfigクラスの中でYamlDecoderに変換してYamlDecoderを使ってloadを行っているみたいです。どうやら複数データをシリアライズしている時と1つのデータをシリアライズしている時で呼ぶ方は違っても結局内部では同じメソッド使ってるみたいです。
(落ち着いて考えたら当たり前だった・・・)
次はYamlDecoderクラスのreadObjectメソッドですね。(setConfigメソッドはYamlConfigを渡してYamlDecoderクラスから参照できるようにしているだけだったので省略)
YamlDecoderクラス
public Object readObject() throws EOFException{
try {
JYamlParserEvent event = new JYamlParserEvent(createLogger(), this);
if (parser == null){
parser = new YamlParser(in,event);
firstDocument(parser, event);
}else{
parser.setEvent(event);
if (!nextDocument(parser, event))
throw new EOFException();
}
Object ret = event.getBean();
if (ret == null)
throw new YamlException("Document is empty.");
return ret;
} catch (EOFException e) {
throw e;
} catch (YamlException e){
e.setLineNumber(parser.getLineNumber());
hrow e;
}
}
最初に呼ばれた時、YamkParserを初期化してfirstDocumentメソッドをそれ以外はnextDocumentメソッドを呼ぶ出しているみたいです。解析としてはやっていることは同じはずなのでfirstDocument側だけ追います
void firstDocument(YamlParser p, YamlParserEvent event){
try {
while (p.comment(-1,false));
if (!p.header())
p.document_first();
else
p.value_na(-1);
}catch (SyntaxException e){
event.error(e,e.line);
}catch (IOException e){
throw new YamlException(e);
}
}
ここから先はすべてメソッド追っていくと長くなるのでそれぞれのメソッドでなにをしていたかだけ書いていきます、まずはcommentでコメントかどうか判定します。またコメントの前にもtabが使われていたらエラーがでるようになってました。headerメソッドは---から始まるかどうかを判定してました。
まだここまでしか見れてないですが、ここから先は実際にデータを読み込んで解析してデータを指定されている構造に直せば解析は終わりだと思います。
とりあえず今日はここまでで。
2012年12月4日火曜日
一人Advent Calendar 4日目(アノテーション)
4日目
三日坊主にはならなかったですね。
今日はJavaでコメントの一種?であるアノテーションの使い方です。
アノテーションはソースコードにプログラム以外で情報を与える時に使用します。
普通のコメントで違い、アノテーションはコンパイラに意味のある情報を与えることが
できるのでしっかりと使えばすごく便利です。
まずはアノテーションの種類ですが、これは3種類あります
マーカーアノテーション : アノテーションがついていることに意味があるもの
例) Deprecated、Override
単一アノテーション : データを1つだけ持っている
例)SuppressWarnings
フルアノテーション : データを複数持つ
例)Test
時間がないので今日は種類の紹介だけです、時間があれば後で追記します。
ごめんなさい
三日坊主にはならなかったですね。
今日はJavaでコメントの一種?であるアノテーションの使い方です。
アノテーションはソースコードにプログラム以外で情報を与える時に使用します。
普通のコメントで違い、アノテーションはコンパイラに意味のある情報を与えることが
できるのでしっかりと使えばすごく便利です。
まずはアノテーションの種類ですが、これは3種類あります
マーカーアノテーション : アノテーションがついていることに意味があるもの
例) Deprecated、Override
単一アノテーション : データを1つだけ持っている
例)SuppressWarnings
フルアノテーション : データを複数持つ
例)Test
時間がないので今日は種類の紹介だけです、時間があれば後で追記します。
ごめんなさい
2012年12月3日月曜日
一人Advent Calendar 3日目(JavaでYamlファイル読み込みその3)
毎日ブログ書くのがこんなにも大変だとは思ってなかったです。
今日はホント少ないけど継続は力なりってことで書きます。
前回まででYamlで様々なオブジェクトが扱えるようになったので今日は複数のオブジェクトを扱います。
まずはシリアライズ
シリアライズにはYamlEncodeクラスを使います
次はこのファイルをデシアライズします。
デシリアライズにはYamlDecoderクラスを使います
サンプルには2種類やり方があったので2種類載せときます
まずは1種類目
2番目のほうが要素の数がわかってなくてもエラーがでないから良い感じ。
基本的にはこっちを使えばよさげ。
3日間もYamlファイルでお茶を濁した間はありますがこれでYamlはひと通り終わりです。
明日からなに書こうかな・・・
今日はホント少ないけど継続は力なりってことで書きます。
前回まででYamlで様々なオブジェクトが扱えるようになったので今日は複数のオブジェクトを扱います。
まずはシリアライズ
シリアライズにはYamlEncodeクラスを使います
List <Integer> list1 = new ArrayList < >();
list1.add(10);
list1.add(11);
list1.add(12);
List <Integer> list2 = new ArrayList < >();
list2.add(0);
list2.add(1);
list2.add(2);
YamlEncoder enc = new YamlEncoder(new FileOutputStream("hoge.yml"));
enc.writeObject(list1);
enc.writeObject(list2);
enc.close();
シリアライズした結果のファイルは以下です。
--- - 10 - 11 - 12 --- - 0 - 1 - 2
次はこのファイルをデシアライズします。
デシリアライズにはYamlDecoderクラスを使います
サンプルには2種類やり方があったので2種類載せときます
まずは1種類目
YamlDecoder dec = new YamlDecoder(new FileInputStream(new File("hoge.yml")));
while (true) {
Object object = dec.readObject();
System.out.println(object);
}
こっちが2種類目
for (Object object : Yaml.loadStream(new FileInputStream(new File("hoge.yml")))) {
System.out.println(object);
}
2番目のほうが要素の数がわかってなくてもエラーがでないから良い感じ。
基本的にはこっちを使えばよさげ。
3日間もYamlファイルでお茶を濁した間はありますがこれでYamlはひと通り終わりです。
明日からなに書こうかな・・・
2012年12月2日日曜日
一人Advent Calendar 2日目(JavaでYamlファイル読み込みその2)
1日目はJavaでYamlファイルを扱いましたが、リスト形式のデータを読み込んでいるだけでした。
今日はリスト形式だけじゃなく、Mapや自分で定義したオブジェクトのデータをシリアライズとデシアライズしてみます。
まずはシリアライズ
昨日に引き続きまずはlistをシリアライズしてデシアライズします
今回読み込みyamlファイル
読み込んだyamlファイルこちら
今回扱いクラスはこれ(すげー適当に作ったのは気にしない方向で)
--- !test.Hoge
num: 10
str: test
普通に出力すると!test.Hogeといったふうオブジェクトの情報が入ってしまいます。
これはこれでデシアライズする時にオブジェクトを特定できて便利なんですけど他の言語で扱えなくなってしまいます。
このオブジェクトの情報を表示しなくするためにはYaml.dumpの第2引数にtrueを設定すれば表示されなくなります。
---
num: 10
str: test
で次はデシアライズです
読み込みファイルは先ほど出力した結果をファイルにしたものです
オブジェクトの情報が無い時のデシアライズのサンプル
こんな感じでYamlは様々なオブジェクトを扱えるので便利そうです。
今回は日本語は扱ってないですけどどうやら日本語も普通に使えるようです
公式のJavadocはこちらhttp://jyaml.sourceforge.net/javadoc/index.html
明日も引き続きYamlファイルの扱い方に付いてになる予定です
今日はリスト形式だけじゃなく、Mapや自分で定義したオブジェクトのデータをシリアライズとデシアライズしてみます。
まずはシリアライズ
Yaml.dump(シリアライズしたいオブジェクトや文字列);でこれがデシアライズ
Yaml.load(デシリアライズしたいファイルや文字列);まあシリアライズとデシアライズしたいだけならこの二つだけで充分ぽいので早速サンプルです。
昨日に引き続きまずはlistをシリアライズしてデシアライズします
今回読み込みyamlファイル
- hoge - fuga - mofu - - fufu1 - fufu2たいしたことしてないけどサンプル
//yamlファイルの読み込み(デシアライズ)
try {
List <Object> list1 = (ArrayList<Object>) Yaml.load(new File("list.yml"));
System.out.println(list1.get(0));
System.out.println(list1.get(1));
System.out.println(list1.get(2));
System.out.println(list1.get(3));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println();
System.out.println("==============");
System.out.println();
//リストのシリアライズ化
List<Integer> list2 = new ArrayList<>();
list2.add(0);
list2.add(1);
list2.add(2);
System.out.println(Yaml.dump(list2));
続いてMapを扱います読み込んだyamlファイルこちら
Name: Andre Agassi Birthplace: LasVegas Height: 5'11'' (180 cm) Turned Pro: 1986でサンプル
try {
Map<Object, Object> map1 = (HashMap<Object, Object>) Yaml.load(new File("map.yml"));
System.out.println(map1.get("Name"));
System.out.println(map1.get("Birthplace"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "hoge");
map2.put("age", 20);
map2.put("height", 180);
map2.put("weight", 70);
System.out.println(Yaml.dump(map2));
次は自分で作成したクラスを扱います今回扱いクラスはこれ(すげー適当に作ったのは気にしない方向で)
package test;
public class Hoge {
private int num;
private String str;
public Hoge(){
}
public Hoge(int num, String str) {
this.num = num;
this.str = str;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
さっそくシリアライズしてみます
Hoge hoge = new Hoge(10, "test"); System.out.println(Yaml.dump(hoge));出力結果
--- !test.Hoge
num: 10
str: test
普通に出力すると!test.Hogeといったふうオブジェクトの情報が入ってしまいます。
これはこれでデシアライズする時にオブジェクトを特定できて便利なんですけど他の言語で扱えなくなってしまいます。
このオブジェクトの情報を表示しなくするためにはYaml.dumpの第2引数にtrueを設定すれば表示されなくなります。
Yaml.dump(シリアライズしたいオブジェクトや文字列, true);第2引数を設定した出力結果
---
num: 10
str: test
で次はデシアライズです
読み込みファイルは先ほど出力した結果をファイルにしたものです
Hoge hoge1 = (Hoge)Yaml.load("object.yml");
System.out.println(hoge1.getNum());
System.out.println(hoge1.getStr());
オブジェクトの指定がある時はこの方法でうまくいくのですが、情報がない時失敗していまします。オブジェクトの情報が無い時のデシアライズのサンプル
Hoge hoge1 =Yaml.loadType(Yaml.dump("object.yml"),Hoge.class);
System.out.println(hoge1.getNum());
System.out.println(hoge1.getStr());
情報がないなら渡してあげればいいってだけですね。こんな感じでYamlは様々なオブジェクトを扱えるので便利そうです。
今回は日本語は扱ってないですけどどうやら日本語も普通に使えるようです
公式のJavadocはこちらhttp://jyaml.sourceforge.net/javadoc/index.html
明日も引き続きYamlファイルの扱い方に付いてになる予定です
2012年12月1日土曜日
一人Advent Calendar1日目(JavaでYamlファイル読み込み)
何かきっかけがないとブログを更新しないんで一人Advent Calendarをやってみることにしました
普通のAdventCalendarだとテーマが決まってたりするんですけど一人でやるんでテーマも特にないです。
test2.yml
で実際に読み込むプログラムがこれ ReadYaml.java
普通のAdventCalendarだとテーマが決まってたりするんですけど一人でやるんでテーマも特にないです。
目標は「継続して更新する癖を付けること」
1日から頑張ったら途中で辞めるのが目に見えてるので1日目は控えめにJavaでYamlファイルを読み込みます
Yamlファイルはマークアップの形式の1つでもとはRubyで使われていたとか
XMLの変わりはJSONかYamlのどちらかになると思ってます。
YamlはJSONよりも様々な形式に対応しているのでYamlの方が少し複雑な印象
JavaでYamlを解析して読み込み時は「JYaml」というライブラリは使います
公式サイトの「Click here」からjarファイルをダウロードして読み込みをしたいプロジェクトのビルドパスに配置します
ちなみに今回読み込んでみるYamlファイルはこの2つで両方共プロジェクトのルートにおいてあります。
test.yml
- hoge - fuga - mofu - - fufu1 - fufu2
test2.yml
- 1 - apple - orange
で実際に読み込むプログラムがこれ ReadYaml.java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import org.ho.yaml.Yaml;
public class ReadYaml {
public static void main(String[] args) {
try {
List
今回のYamlファイルはリスト構造なので読み込むときもリストで読み込んでます。
でリストの中にMapやまたListが入ってるのかわからないのでObjectのリストになってます。
読み込んだらあとは表示しているだけです。
出力
[hoge, fuga, mofu, [fufu1, fufu2]]
[1, apple, orange]
1日目はただ読み込んだだけで終わりです。
明日はリスト以外の形式も読み込んでみたりと引き続きYamlと弄ることになる予定
なんかシンタックスハイライトが機能してないみたいなんで時間ある時に直しておきます
2012年11月10日土曜日
gitのインストール
去年ぐらいから流行っている印象のgitの導入手順を書いときます
(流行っているのはgitというかgithubな気がするけどgithubについては今回はふれません)
gitで何ができるのかは「Pro Git」の日本語訳が公開されているのでそちらを参照
http://git-scm.com/book/ja
gitの導入手順
① 「http://git-scm.com/downloads」
アクセスして使ってる端末に合わせてインストーラをダウンロード
(今回はwindowsでインストールします)
②インストーラを起動して画像にしたがってインストール
ここまで終わるとインストールが始まる
③インストールが終わったら「git bash」で
「git --version」コマンドでgitのインストールを確認
(流行っているのはgitというかgithubな気がするけどgithubについては今回はふれません)
gitで何ができるのかは「Pro Git」の日本語訳が公開されているのでそちらを参照
http://git-scm.com/book/ja
gitの導入手順
① 「http://git-scm.com/downloads」
アクセスして使ってる端末に合わせてインストーラをダウンロード
(今回はwindowsでインストールします)
②インストーラを起動して画像にしたがってインストール
![]() |
| 「Next」をクリック |
![]() |
| 利用規約に同士して「Next」をクリック |
![]() |
| 今回はデフォルトの設定で問題ないので「Next」をクリック |
![]() |
| 今回はGit Bashから利用するので一番上を選択して「Next」をクリック WindowsのcmdからGitBashを使う場合は2番目を選択でいいはず |
![]() |
| 改行コードを設定する 今回は一番上を選択し「Next」をクリック |
③インストールが終わったら「git bash」で
「git --version」コマンドでgitのインストールを確認
登録:
投稿 (Atom)







