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

やったことメモなどなど

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

JJUG 「Java エンジニアのためのJava(再)入門」に行ってきた

JJUG ナイトセミナー 「Java エンジニアのためのJava(再)入門」に行ってきました。

仕事で一番使っている言語はJavaなのですが、J2SE1.4、Java 6しか使ったことがないので、いい機会と思い参加しました。

Webシステムで使っていたのはJ2SE1.4で、 Java 6ではサーバ側のバッチ処理Webサービスで使っていました。

これが、5年前の話しですw

世間では、Java 7〜8と上がり完全に置いていかれた感がががが。

from old Java to modern Java

スピーカー:谷本 心 氏(@cero_t)

1.4時代のコードを、各バージョンごとに変遷した部分を解説したセッション。 Java 7から大きく変わった印象。 特に便利だなーと思ったが、try-with-resources と catch multiple exceptions の2つ。

try-with-resouces

Java 7より以前はこんな感じ。 割れが慣れ親しんだ内容・・・

  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    if (br != null) br.close();
  }

これがJava 7からは・・・

  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }

すげぇ!(イマサラ感)

これで、close()忘れの心配ないですね!!

なお、catchはなくても大丈夫とのことでした。

AutoCloseableのサブクラスは、そのオブジェクトが宣言されているtry-with-resourcesブロックの終了時に自動的に呼び出されるんだそうです。

AutoCloseable

Pythonでもできるんだから、当然Javaでもできるよねーというのは後から思いました。

with open('/tmp/weather.jpg', 'rb') as weatherfile:
    requests.post(slackbot_settings.API_URL, data=slackapi_params, files={
        'file': ('weather.jpg', weatherfile, 'image/jpeg')})

catch multiple exceptions

これも地味に便利だと思いました。 以下のように、catch後の処理が同じな場合に例外をまとめることができるという優れもの。

catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

↑が↓みたいに |で区切って書くことによって、 1つのブロックで処理できるということでした。

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

仕事では意外とこういう処理があったりするので、早速使ってみたいです。

ここまでで、だいぶ浦島太郎状態というかカルチャーショックというか。 Javaのバージョンアップ時に記事とかは読んだりしていましたが、 これまでプライベートでコードも書かずに仕事で必要な分だけ使ってたツケがきたというか。

これは、ちゃんと勉強しなくちゃだなーと感じた、1つ目のセッションでした。

数値計算をきわ、、、たしなむ

スピーカー:岡田 拓也 氏(@omochiya)

BigDecimalについてのセッションでした。

正直、BigDecimalだけで1つのセッションとは・・・と思っていたのですが、甘くみていました。申し訳ございません。

多分、この日のセッションの中では一番使っているクラスだったんですが、仕様があんなんなっているとは知りませんでした。

興味がある人は、ドキュメントを一度読んで見ることをオススメします。 とある基幹業務システムの会計機能の改修に携わっていた時に知っていたら、あんな不具合もなかった・・・かもしれない過去を思い出しましたw

割り算注意・・・そうですね・・・注意ですよね・・・

BigDecimal

Stream API入門

スピーカー:谷本 心 氏(@cero_t)

完全に未知の領域のセッションでした。

これは手を動かしてみてナンボかと思いましたので、このセッションを見ていた際のツイートを載せておきたいと思います。

別に書き疲れたとかではないですよ!ないですよ!

資料について

今回のセミナーの資料は一部公開されています。

speakerdeck.com

最後に

参加して良かったセミナーでした。帰りにJava本格入門を購入して帰りました。谷本氏のサイン入りですw

並んでる方がいらっしゃったので、便乗してみましたw

なお、Java本格入門の正誤表はサポートサイトにて公開しているとのことです。また、指摘についてはIssueに書けばよさそうです。

次回は上級者向けのセミナーを・・・とおっしゃっていたのですが、とりあえず参加してみようかなと思います。 それまでは写経して勉強でもしようかと思います。

ブログを始めてみた

はじめまして。

怒Mが通ると申します。通称「怒M」です。

 

都内でSE・PG(2017年現在10年目)として働いています。

経験値としては基幹業務システムの開発オンリーです。

 

ここ、3、4年はSEがメインとなり、

プログラミングをやる機会がめっきり減ってしまい、寂しい限りです。

ということで、改めてプログラミングの勉強をしたいと思い、

過程の記録用としてブログを始めた次第です。

 

これまではQiitaに結果だけ少しは書いていたのですが、

そちらは結果だけの記録にしていこうかと思います。

 

ブログの内容としては雑多になるかと思いますが、

以下のような内容が書くことになるのかなぁと考えています。

ただ、好奇心はあるけど飽きっぽいので、

続けて行く中で色々変遷する可能性はありますw

 

その他、記録用として私事(飯、FF14)なども残し行くかと思います。多分。

 

ということで、皆様よろしくお願いいたします。

更新頻度は2週に1回は頑張ってみたい。みたい。みたい。。。。