怒Mは思いつきでモノを言う

やったことメモなどなど

Enum型を勉強してみた。

現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法を読んでいます。
「Chapter 2. 場合分けのロジックを整理する」でJavaの列挙型について書いてあったので調べてみました。

Enum型の使い方(1)

public enum MeatEnum {
    BEEF,
    PORK,
    CHICKEN,
    LAMB;
}

こんな感じで定数を定義します。 BEEFPORKなどは列挙子と呼びます。
Java言語仕様では "Enum Constant" と書かれていますね。 Enumは"enumeration" から来ているのですね。
「列挙」という意味の他に「一覧」とか「目録」という意味に訳せるようで、
プログラミング未経験の新人には、列挙型よりもEnum型を示す表現としては分かりやすい気がします。

public class Test {

    public static void main(String[] args) {

        String something = args[0];
        
        if(MeatEnum.BEEF.toString().equals(something)) {
            System.out.println("BEEF");            
        } else if(MeatEnum.PORK.toString().equals(something)) {
            System.out.println("PORK");            
        } else if(MeatEnum.CHIKEN.toString().equals(something)) {
            System.out.println("CHICKEN");            
        } else if(MeatEnum.LAMB.toString().equals(something)){
            System.out.println("LAMB");            
        } else {
            System.out.println("Something's Meat");
        }
    }
}

↑みたいにif文で使えますが、こういう使い方はしないですよね。

public class Test2 {

    public static void main(String[] args) {
        
        // 標準入力で BEEF/CHICKEN/PORK/LAMB が入力されレバー
        // 文字列に合致した定数で返してくれます。
        // 指定された文字列に合致しない場合は、IllegalArgumentExceptionが発生。
        MeatEnum meat = MeatEnum.valueOf(args[0]);
        
        // switch文だと以下のような感じで、シンプルに書けます。
        switch(meat) {
        case BEEF:
            System.out.println(meat);
            break;
        case PORK:
            System.out.println(meat);
            break;
        case CHICKEN:
            System.out.println(meat);
            break;
        case LAMB:
            System.out.println(meat);
            break;
        default:
            System.out.println("Something's Meat");
            break;
        }
    }
}

switch文で、こういう使い方は見ることがあります。
どちらも標準入力で適切な文字列を渡した場合は、どちらも同じ結果が出力されます。

Enum型の使い方(2)

public enum MeatEnumKai {
    BEEF(286),   //肩ロース、脂身付き
    PORK(386),   //豚バラ、脂身付き
    CHICKEN(200), //鶏モモ、皮付き
    LAMB;   //ラム肉、子羊の背肉

    // コンストラクタは private だけ宣言できます。
    // public, protected を指定するとコンパイルエラーとなります。
    private MeatEnumKai() {
        System.out.println("ラム肉は0Kcal!");
    }

    // 当然コンストラクタは複数定義できます。 
    private MeatEnumKai(int calorie) {
        this.calorie = calorie;
    }    

    private int calorie; // 単位:Kcal

    // Enum型はクラスなので、メソッドやフィールドを定義できます。
    public int getCalorie() {
        return calorie; 
    }
}

Enum型はクラスですので、コンストラクタもフィールドも、メソッドも定義できます。
Enum型には、その列挙子で定義されたもの以外のインスタンスは持ちません。
Enum型を明示的にインスタンス化するとコンパイルエラーとなります。

MeatEnumKai meat = new MeatEnumKai(); // コンパイルエラー

MeatEnumKaiを実際に使ってみます。

public class Test3 {

    public static void main(String[] args) {
        
        MeatEnumKai chicken = MeatEnumKai.CHICKEN;
        MeatEnumKai lamb = MeatEnumKai.LAMB;
        
        System.out.println("鶏肉は、" + chicken.getCalorie() + "Kcal");
        System.out.println("ラム肉は無敵の、" + lamb.getCalorie() + "Kcal");
    }
}
ラム肉は0Kcal!
鶏肉は、200Kcal
ラム肉は無敵の、0Kcal

コンストラクタやメソッドを定義することで、Enum型の使い方に幅ができますね。

Enum型の使い方(3)

「現場で役立つシステム設計の原則」に書いていた使い方です。
Enum型を使いこなせていなかったなーと反省です。

public interface MeatDish {
    public String cooking();
}

こんなインターフェースを用意します。
で、実装します。

public class BeefDish implements MeatDish {
    @Override
    public String cooking() {
        return "牛肩ロースの赤ワイン煮";
    }
}

public class PorkDish implements MeatDish {
    @Override
    public String cooking() {
        return "豚の生姜焼き";
    }
}

public class ChickenDish implements MeatDish {
    @Override
    public String cooking() {
        return "親子丼";
    }
}

public class LambDish implements MeatDish {
    @Override
    public String cooking() {
        return "ジンギスカン";
    }
}

肉料理を返すメソッドです。
これを使う、Enum型を定義します。

public enum MeatEnumHyper {
    BEEF ( new BeefDish() ),   //肩ロース、脂身付き
    PORK ( new PorkDish() ),   //豚バラ、脂身付き
    CHICKEN( new ChickenDish() ), //鶏モモ、皮付き
    LAMB ( new LambDish() );   //ラム肉、子羊の背肉

    private MeatDish dish;

    // BEEF,PORK,CHICKEN,LAMB のコンストラクタ
    private MeatEnumHyper(MeatDish dish) {
        this.dish = dish;
    }
    
    public String offerDish() {
        return dish.cooking(); 
    }
}

使ってみましょう。

public class Test4 {

    public static void main(String[] args) {

        // 標準入力で BEEF/CHIKEN/PORK/LAMB が入力されレバー
        MeatEnumHyper meat = MeatEnumHyper.valueOf(args[0]);

        System.out.println(meat.offerDish());
    }
}

標準入力で肉がちゃんと指定されれば、それぞれの肉料理が呼び出されます。
呼び出し側はMeatEnumHyperにマトンや鴨肉が追加されても意識することなく、
肉料理を表示することができます。

Enum型はもっと使いようがある

他にも、EnumSetEnumMapを使うことで、できることの幅ができます。
「現場で役立つシステム設計の原則」にもありますが、
Enum型を使うことによって、業務ロジックでよくある区分判断で複雑になりがちな、
if文やswitch文を簡素な表現にすることができそうです。

Javaのコンストラクタの挙動について確認した。

この記事はJava Advent Calendar 2017の18日目です。

はじめに

Javaについて勉強を初めて数ヶ月が経ちました。

私の所属している会社では1年目の社員はOracle Certified Java Programmer, Silver SE 8 認定資格を取得します。

新人の頃に受験し合格しましたが、Sun Certified Programmer for the Java 2 Platform 1.4です。

私のところにも新人が配属されるようになり、試験勉強の面倒を見る機会が増えてきている中でちゃんと教えれる必要があるなーと感じ、先日Oracle Certified Java Programmer, Silver SE 8 認定資格を取得してみました。

合格はできましたが試験結果のレポートには間違った問題の傾向をレポートで記載されていたので、その中でコンストラクタの動作についての項目がありました。

今回、自分自身の復習の意味を込めてコンストラクタの仕様について確認したことを残します。

確認方法

コンストラクタの仕様の確認方法は「The Java® Language Specification Java SE 8 Edition」を参照しています。

日本語訳のドキュメントは無いんですね・・・英語成績2の身としてはコンストラクタの章を読むのにも一苦労で、Google翻訳と英和辞典が大活躍です。高校の時の英語教師にテスト返却時に「なめてんのか」と言われたのはトラウマいい思い出です。

その他、手元にある書籍「Java本格入門」「Javaエンジニア養成読本」とか参考になりそうな箇所を探しながら、Google検索しながらです。

Java SE 9 Edition の内容は確認していません。

コンストラクタ(Constructor)

コンストラクタとはクラスのオブジェクトを作成するときに実行される処理のことです。

コンストラクタ宣言

コンストラクタ宣言にはいくつかの決まりがあります。


  1. コンストラクタの名前はクラス名と同一であること
  2. コンストラクタ宣言では戻り値は定義しないこと
  3. コンストラクタはオーバーロードできる
  4. コンストラクタのアクセス修飾子はpublic,protected,private,修飾子なし(パッケージプライベート)を指定できる
  5. コンストラクタにはthrowsを定義できる
  6. コンストラクタは継承できない

abstract public class Meat {

    // 1. コンストラクタの名前はクラス名と同一であること
    // 2. コンストラクタ宣言では戻り値は定義しないこと
    public Meat() { 
        System.out.println("Constructor Meat()");
    }

    // 3. コンストラクタはオーバーロードできる
    public Meat(int num) {
        System.out.println("Constructor Meat(int num)");
    }

    // 4. コンストラクタのアクセス修飾子は指定できる
    // public, protected, private, 修飾子なし
    protected Meat(int num1, int num2) {
        System.out.println("Constructor Meat(int num1, int num2)");
    }

    // 5. コンストラクタにはthrowsを定義できる
    Meat (String s1, String s2) throws RuntimeException {
        System.out.println("Constructor Meat(String s1, String s2)");
    }

    // 6. コンストラクタは継承できない(抽象化できないということで良い?)
    // コンパイルエラー
    abstract Meat(String s);
}

とりあえず、こんな感じでしょうか。

コンストラクタを1つも作らなかった場合は、コンパイラが自動でデフォルトコンストラクタを追加してくれます。 デフォルトコンストラクタは引数なし・処理なしのコンストラクタです。

注意点としては、1つでもコンストラクタを明示的に作っている場合はデフォルトコンストラクタは作られないということです。

コンストラクタの実装

コンストラクタの実装に関してもルールがあります。 試験問題で間違えていたのは、この辺りだったかと思います。


  1. クラス内の別のコンストラクタを呼び出す場合はthis()を使う(引数を渡せます)
  2. 子クラスから親クラスのコンストラクタを呼び出す場合はsuper()を使う(引数を渡せます)
  3. コンストラクタ内で別のコンストラクタを明示的に呼び出す場合は必ず一番最初に呼び出す
  4. 子クラスのコンストラクタ内で親クラスのコンストラクタを明示的に呼び出さない場合はsuper()が自動的に呼び出される
  5. コンストラクタは再帰的に呼び出せない

// 親クラス
abstract public class Meat {

    public Meat() {
        System.out.println("Constructor Meat()");
    }
    
    public Meat(int num) {
        System.out.println("Constructor Meat(int num)");
    }
    
    protected Meat(int num1, int num2) {
        System.out.println("Constructor Meat(int num1, num2)");
    }
    abstract public String toString();
}

// 子クラス
public class Beef extends Meat {

    public Beef() {
        // 4. 子クラスのコンストラクタ内で親クラスのコンストラクタを
        // 明示的に呼び出さない場合はsuper()が自動的に呼び出される
        System.out.println("Constructor Beef()");
    }
    
    public Beef(int num) {
        // 1. クラス内の別のコンストラクタを呼び出す場合は`this()`を使う(引数を渡せます)
        this();  
        System.out.println("Constructor Beef(int num)");
    }
    
    public Beef(int num1, int num2) {
        // 2. 子クラスから親クラスのコンストラクタを呼び出す場合はsuper()を使う(引数を渡せます)
        // 3. コンストラクタ内で別のコンストラクタを明示的に呼び出す場合は必ず一番最初に呼び出す
        super(10); 
        System.out.println("Constructor Beef(int num1, int num2)");
    }

    // 5. コンストラクタは再帰的に呼び出せない
    // コンパイルエラーになる
    public Beef(String s) {
        this(s);
    }

ルール3とルール4についての理解が足りていない感じです。
コメントをいただきまして、理解できました!(2017/12/24追記)

    public Beef(){
        super();
        this(10);  // ここでコンパイルエラー
    }

これはルール3に基づいているので理解はできます。

    public Beef(int num) {
        this();  
        System.out.println("Constructor Beef(int num)");
    }

けど、上記のコンストラクタの場合は、this()の前にルール4に基づきsuper()が自動的に呼び出されます。
上記のコンストラクタの場合は、this()の前にsuper()が呼び出されているように見えますが、
Beef()super()が呼ばれているだけなので、Beef(int num)super()が呼ばれているわけではありません。

実際の動きを確認します。

    public static void main(String[] args) {
        System.out.println("beef1 -------->");
        Beef beef1 = new Beef();
        System.out.println("beef2 -------->");
        Beef beef2 = new Beef(10);
        System.out.println("beef3 -------->");
        Beef beef3 = new Beef(30, 40);
    }
MacBook-Pro:bin $ java constructor.sample.Beef
beef1 -------->
Constructor Meat()
Constructor Beef()
beef2 -------->
Constructor Meat()
Constructor Beef()
Constructor Beef(int num)
beef3 -------->
Constructor Meat(int num)
Constructor Beef(int num1, int num2)

必ず、親クラスのコンストラクタが呼び出され、その後に子クラスのコンストラクタが呼び出されていることがわかります。

最後に

しかし、なぜthis()super()を2つ明示的に呼び出せないのか、その辺の仕様が記載されている箇所まで「The Java® Language Specification Java SE 8 Edition」を読めていません。・・・ちゃんと書いてあることを信じて、もう少し読み進めます。

今回、かなり中途半端に終わってしまったので、この記事は今後メンテしていく予定です。

JJUG CCC 2017 Fall に初めて参加してみた。

JJUG CCCに初じめて参加してきました。 ボランティアスタッフとして。

ボランティアスタッフってどんなのことやっているのか?を 次回以降に参加される方のために少しでも参考になればと思います。

スタッフとしての担当時間外であれば聞くことも可能だったのですが、 スタッフ仕事に一生懸命すぎて4つ聞くはずが2つだけだったので、聞いたセッションについての感想は控えめです。

↓に発表資料や参加された方のブログなどがまとめられていますので、ぜひ!

GitHub - jjug-ccc/slides-articles-2017fall: JJUG CCC 2017 Fallの発表資料およびブログ記事まとめ

参加経緯

8月のJJUGナイトセミナーに参加した時に知り合いと遭遇しまして、

そこでJJUG CCCの話しを聞いて1度ボランティア参加したということを聞き、

「それだ!!!」

ということで、調べてみたらあった。なので、即申し込み。

すでにいっぱいだったのでキャンセル待ちでしたが、 繰り上がりとなりました。

jjug.doorkeeper.jp

www.java-users.jp

参加まで

何にせよ、まずは聞きたいセッションのチェックを忘れずに!

ボランティア参加にあたり1度ミーティングを行います。 担当時間割や担当部屋は希望を聞いて話し合いで決められます。

前回のJJUG CCC 2017 Springでは、 来場者が多く会場が混乱気味になったとのことで、 動線(順路)を決めてそれに沿って、参加者の方々には動いてもらうという方針になったそうです。

私の担当は午前の遊撃。決まった仕事がなく臨機応変に動く感じになるということで、 会場の配置や、今回から取り入れられた動線を覚えて当日をむかえました。

スタッフの役割

部屋付き

各セッションの部屋に幹事とペアになって作業を行います。 基本的には幹事の指示に従って動くことになります。

  • タイムキーパー
  • 椅子が足りなくなった場合の椅子入れ
  • 入退出時の誘導
遊撃

基本的には指示は受付にいる幹事の方から受けます。

  • 椅子が足りなくなった場合の椅子入れ
  • 退出時の順路誘導
  • その他、必要そうなこと全般

JJUG CCC 2017 Fall 当日

f:id:do_m_gatoru:20171121013310j:plain

天気はあいにくの雨模様。気温も低く寒い日でした。

開場前にスタッフが集まり打ち合わせを行い、いざスタート!

連絡のやり取りや質問事項は、直接聞くかSlackに投げ込みます。

天気の影響か午前中は結構人の入りも落ち着いている印象でした。 午前一緒の遊撃ペアの方とゴミ捨て場の看板を段ボールの切れ端で作ったり、 動線をより確実に守ってもらえるように、出入り口の張り紙や、入口出口以外の部屋の鍵を掛けたり、 試行錯誤しながら作業を進めていいきます。

セッション中はやや暇なので、ちょっとセッションを覗いたりできます。

休憩時間中が忙しい時間帯となります。 主に退出者の順路への誘導と、椅子が足りない部屋への椅子運び込みなどです。

会場に関する質問をされることがありますが、 答えられないような内容は幹事の方々に聞くと教えてくれたり、 問い合わせたりしてくれます。

f:id:do_m_gatoru:20171121013255j:plain

午後になるにつれ来場者も増えてきて、部屋によっては立ち見が出てたりしていましたが、 情報を連携してスムーズに椅子の運び込みや誘導など行い、大きな混乱はなかったと思います。

夕方の懇親会は大部屋を使って行います。

椅子・机の片付け、飲み物、食べ物の運び込みもお仕事です。 この頃には、担当が違うスタッフの方とも一体感みたいなのが出てきていましたねー。 朝一は全員知らない人の中に飛び込んだので、結構緊張して話もできなかったのです。

聞いたセッション

www.slideshare.net

スピーカーはカサレアルの多田真敏さん(Masatoshi Tada (@suke_masa) | Twitter)。

Springとか仕事で使う機会がないので、個人的にSpring Bootを使ってHello Worldとかやってみているレベル。

そんな中、Springとはどんなものなのか、それを踏まえた上でSpring Bootとはをわかりやすく教えてくれました。

Spring 徹底入門を買っているので、ゆっくり写経してみようと思います。

docs.google.com

スピーカーはフリューの佐藤慧太さん(サトウジョン (@SatohJohn) | Twitter)。

フリューのサービス・ピクトリンの改善についてお話ししていました。

Webの仕事はこの6年一切していないのですが、 UIテスト自動化の話しは興味深かったです。

懇親会

f:id:do_m_gatoru:20171121013241j:plain

懇親会ではLT大会が開催されていましたね。色々聞いていましたが、慣れない早起きや肉体労働のせいか、疲れてしまってボーッとしてばっかりでしたw

空きっ腹にビールも効きましたねw

打ち上げ

f:id:do_m_gatoru:20171121013247j:plain

美味しい肉でスタッフみなさんで打ち上げです。(魚組もあったようです)

登壇した澁谷典明(よっちゃん (@yotchang4s) | Twitter)さん、幹事会の忘れbot (@deckeye) | Twitterさん(椅子を壊すことで有名とのこと)、ボランティアスタッフ仲間のビタミンC (@makimuti615) | Twitterさん、keni©️ (@keni_c9) | Twitterさんと、席をご一緒しました。 (まさか、北海道出身者が3人も集まっているとはw)

登壇した感想や、普段の仕事の話し、出身の話しなど楽しい時間を過ごすことができました。

席移動して、他の方と積極的に話すと良かったのにな、と少し後悔w

澁谷さんの発表資料はこちら。

www.slideshare.net

まとめ

前回までのJJUG CCCの雰囲気を知らないので若干不安がありましたが、 非常に楽しく参加できたと思います。

普段参加するときは、「一般参加」なので、 このような形で少しでも運営に関われたのはいい経験になりましたし、 思った以上に楽しかったです。

次回もスッタフ参加もありかと思っています。それくらい楽しかったです。

その際は、もう少し気持ちに余裕を持って、 セッション参加しようと思いますw

あとは自分のスキルのなさで、会話ができないのが残念なので、 もっと技術を学びたいなーと強く感じました。

あとはもう少し人見知りをなおしましょーねー

f:id:do_m_gatoru:20171123232320j:plain

JJUG「ビール片手にLT&納涼会 2017」 に行ってきた。

JJUG ナイト・セミナー 「ビール片手にLT&納涼会 2017」に行ってきました。

アジェンダはこちら。


  1. 山p 何かしなきゃと思ってるあなたにGroovy
  2. 小島直也 Selenium のこれまでとこれから(Selenium Comitter Day参加報告)
  3. 孫 東照 RMIを使ってみた
  4. fukushiw 仮題:インパス! あのこれダメッス!~Javaコードレビューの指摘ポイント10選~
  5. 前當 祐希 ぼっち開発からチーム開発へ(仮)
  6. 星野 優 未定
  7. KOMIYA Atsushi 未定
  8. 佐々木 真美 未定
  9. kitaji0306 未定
  10. 山本 裕介 未定
  11. つむらてんほ 「Javaで学ぶ魔法入門」ベンチマークテスト(仮)
  12. 杉山 貴章 バルセロナJavaコミュニティカンファレンスを覗いてみた(仮)

ルービー片手に、ピザをつまみながらLTを聞けました。

f:id:do_m_gatoru:20170824012118j:plain

iPad proを買ってから初めてApple Pencil を使って、メモを取ってみました。

紙に書いているみたいで、ストレスない感じでいいですね。

f:id:do_m_gatoru:20170824012512p:plain f:id:do_m_gatoru:20170824012532p:plain f:id:do_m_gatoru:20170824012548p:plain

なんだこのフォント、きたねーなー(白目


11月にJJUG CCCがあるそうなので、参加してみようと思います。

www.java-users.jp

NaNってなんなんだ?

先日、こんなツイートを見かけました。

NaNってなんだっけ?
どっかで見た記憶があるけどなんだっけなー。

NaN - Wikipedia

IEEE 754 - Wikipedia

なるほど。非数。
ついでにIEEE754についてもWikiレベルで確認。

解釈は納得。
NaNはJavaでも定義されている様です。
JavaScriptと同様に==ではfalseとなるのかが気になります。また、==では常にfalseとなる理由が気になるので少し調べてみました。

NaNとか意識したことないから、とりあえず比較してみました。

Double nan1 = Double.NaN;
Double nan2 = Double.NaN;
        
if(nan1 == nan2) System.out.println("nan1 == nan2 => true");
if(nan1.equals(nan2)) System.out.println("nan1.equals(nan2) => true");
if(nan1.doubleValue() == nan2.doubleValue()) 
    System.out.println("nan1.doubleValue() == nan2.doubleValue() => true");
        
System.out.println("Double.doubleToLongBits(nan1) => " + Double.doubleToLongBits(nan1));
System.out.println("Double.doubleToLongBits(nan2) => " + Double.doubleToLongBits(nan2));
        
System.out.println("nan1.hashCode() => " + nan1.hashCode());
System.out.println("nan2.hashCode() => " + nan2.hashCode());
nan1.equals(nan2) => true
Double.doubleToLongBits(nan1) => 9221120237041090560
Double.doubleToLongBits(nan2) => 9221120237041090560
nan1.hashCode() => 2146959360
nan2.hashCode() => 2146959360

==での比較はfalseになるけど、equals()を使うとtrueとなる、と。
なんなんでしょう、まったく。意味がわからないです。
equals()の結果がtrueとなるのは仕様のようです。

Double (Java Platform SE 8)

Javaの言語規格で==について調べてみました。

If either operand is NaN, then the result of == is false but the result of != is true.

Indeed, the test x!=x is true if and only if the value of x is NaN.

The methods Float.isNaN and Double.isNaN may also be used to test whether a value is NaN.

引用元:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.21.1

NaNの==での比較結果は無条件でfalseとなると解釈しました。

これはJavaScriptでも同様なようですね。

developer.mozilla.org

比較演算子 (JavaScript)

MATLABでも同じように記載されています。

jp.mathworks.com


NaNであるかのチェックは大体は、
isNaN()を使いましょうというのが常識なようです。
NaNがなんなのか知ることができて、スッキリしました。NaNの扱いについては言語が変わっても統一されているようですね。(当然か)

Spring Boot を初めて体験してみた①

はじめに

フレームワークは新入社員から3年触っていたStrutsだけなので、 よく耳にするけど、使ったことないSpring Bootを体験したいと思います。

まずは、環境構築編みたいな感じです。

動かしてみたプロジェクトはこちら

環境

Eclipse準備

Eclipse Marketplaceで「Spring Tools (aka Spring IDE and Spring Tool Suite) 3.9.0.RELEASE」をインストールします。

f:id:do_m_gatoru:20170715014703p:plain

f:id:do_m_gatoru:20170715015005p:plain

画面を進んでいってインストールが完了すると、以下の様なDashBoardが表示されます。

f:id:do_m_gatoru:20170715015251p:plain

環境の準備はここまでで完了しました。

プロジェクト作成

Spring Initializrにて雛形作成

Spring Initializrにてプロジェクトの雛形を作成します。

f:id:do_m_gatoru:20170715020350p:plain

私の場合は、

  • Gradle Project
  • Java
  • Web(Dependencies)

という内容で作成しています。

Project Metadata の Group はパッケージで、Artifact はプロジェクト名の指定です。

必要項目を入力し終えたら、「Generate Project」ボタンを押して、Zipファイルをダウンロードします。

雛形のインポート

私はダウンロードしたZipを解凍して、フォルダをEclipseワークスペースに移動をさせてからインポートしています。

f:id:do_m_gatoru:20170715021240p:plain

f:id:do_m_gatoru:20170715021257p:plain

f:id:do_m_gatoru:20170715021309p:plain

f:id:do_m_gatoru:20170715021322p:plain

f:id:do_m_gatoru:20170715021341p:plain

チュートリアル

Spring Bootのプロジェクトは作成できました。中身を作っていきます。

GETTING STARTED Building an Application with Spring Bootを参考にして、画面に「Greetings from Spring Boot!」と表示させて、コンソールにはSpring Framework に登録されている Bean の一覧を表示させます。

f:id:do_m_gatoru:20170715021951p:plain

DemoApplication.java

DemoApplication.javaはインポートした段階では存在するソースです。これに、 Bean の一覧を表示する処理を書いていきます。

package domgatoru.example.demo;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    
    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            System.out.println("Let's inspect the beans provided by Spring Boot:");
            
            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName);
            }
        };
    }
}
HelloWorldController.java

HelloWorldController.javaには画面に文字を表示させるだけの処理を書きます。

package domgatoru.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
    
    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }
}

こんだけで、動きました。

f:id:do_m_gatoru:20170715022743p:plain

f:id:do_m_gatoru:20170715022838p:plain

最後に

とりあえず、インストールから簡単な内容を動かすまではできました。

ただ、Spring Boot のフレームワークとしての特徴などは、ちょっとググったレベルなので、まだまだ理解していません。

とりあえずは、Spring Bootハンズオンで一通り動かしてみようと思っています。

他にSpring Bootに関する良さげな資料などありましたら、教えていただけると幸いです。

Developers.IO 2017 に行ってきた

dev.classmethod.jp

勉強会・イベントを探していたら、楽しそうなイベントがあったので参加してきました。 実はクラスメソッドという会社の存在も、何をやっているかということも最近まで知りませんでした。 AWS Summit Tokyo 2017の展示で可愛い女の子の絵(めそ子)がマスコットの会社なんだなーくらいの認識でした。

以下、参加したセッションの簡単な感想などと、思ったことでもメモります。

ポエムっぽくなっている箇所もありますので、その辺はご了承ください。

K-1】基調講演

スピーカー:佐々木 大輔 氏

dev.classmethod.jp

実は30分ほど遅刻しての参加でしたので、後半のみ聴いています。 AWSの今や未来の展望、クラスメソッドとして力を入れている Alexaの話しなど話しもためになりましたが、 個人的には、以下の3点が印象に残っています。

  1. 北海道出身
  2. エンジニアとしての危機感があり転職
  3. 発信する・アウトプットを出すことの大切さ

私も北海道出身ということで、それだけで親近感が湧いたという単純な話しでもあるのですがw 発信すること・アウトプットを出して見せて行くことというのは大事なんだと思います。

私が所属している会社では、なかなか技術情報の共有などがされないような文化になっています。 それを変えたくて、社内掲示板にちょっとした技術的な情報や、社内もくもく会(少人数ですが)の様子をレポートしたりし始めています。 反応してくれる人は見てくれたり、コメントしてくれたりしますが、大概の人は興味を持ってくれません。 それでも発信し続けることが大事だと信じて行動をしています。

ということで、自分がやっていることは大丈夫なんだ!と言い聞かせるいい機会になりましたw

L-1】ランチセッション

スピーカー:横田 聡 氏

クラスメソッドの会社の取り組みナドナドが内容でした。

これも、クラスメソッドの特徴や考え方というのが非常に伝わってくる内容でした。 きっと働いている人たちは楽しんでいるんだろうなと、思いました。 (仕事で辛いことがある場合があるのは当然として。)

【A-1】クラメソの請求を支える技術(サーバーレス編)〜40歳中年エンジニアの生存戦略

スピーカー:植木 和樹 氏

dev.classmethod.jp

サーバーレスの話と40歳中年エンジニアの生存戦略、どっちも興味があって参加しましたw

これまでの半生の振り返りから、いろいろ経験されて今クラスメソッドにいるんだなーと、 人の人生の話しを聞けて楽しかったです。

請求システム刷新の話しは、仕事として身近に感じられるような内容でした。 「EC2を使えって言われてカッとなった件」は笑いましたw

【A-2】 基礎からの OAuth 2.0 〜 認証と認可の概念、認可コードとアクセストークンの意味 〜

スピーカー:都元 ダイスケ 氏

OAuth 2.0。

見かけている単語だったんですが、よく知りませんでしたが、このセッションで概要が理解できました。すごくわかりやすかったです。

「認証」と「認可」の違いについて、今まで意識することがなかったのですが、正しく意味が理解できたのは良かったです。

技術的内容では、この日に聞いたセッションの中では1番収穫・勉強になったと思います。

【L-3】 コーヒーブレイク

興味本位で参加しました。

自分の所属している会社の考え方など聞けるのは非常に貴重な体験でした。

クラスメソッドが考える「B2B2C」の話しが1番共感しましたが、それ以外の思想というか取り組みについても「いい会社」なんだろうなと思わせる内容でした。

最後に質問で直接話しを振られたのは油断していたせいか、ちょっと焦ってオドオドしましたw

【A-4】 Amazon Elasticsearch Service の使いドコロ

スピーカー:藤本 真司 氏

dev.classmethod.jp

熱意が溢れるあまり、発表時間も溢れてしまったセッション。(スライド100枚オーバーw)

Elasticsearchが全文検索を扱うというの知っていましたが、詳細は知りませんでした。 セッションでは結構細い内容まで説明があったので、全文検索の概要を知ることができました。

Oracle Textは使ったことがあるので、そことの比較みたいな見方をしていました。 これは興味がある内容なので、個人的に調べて見たい内容です。

その他

dev.classmethod.jp

その他、セッションの内容は上記でブログが随時更新されているようです。

Twitterハッシュタグ「#cmdevio2017」で当日の様子も見れるかと思います。

最後に

単純に楽しめたイベントでした!

来年も開催されると思うので、ぜひ参加したいと思います!

20170719追記

レポートまとめ記事が上がっていましたのでリンクを貼っておきます。

dev.classmethod.jp