Somurie Engineer's Blog

今更ながらJava11の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java11newFunc/Java11sample.java 追加された機能 String isBlankの追加 isEmptyに加えて半角/全角スペースもtrueを返します。 (isEmptyは文字列の長さが0の場合のみtrueを返す) ※注意として、該当の変数がnullの場合はNullPointerExceptionを投げます。nullの場合もtrueを返してほしい場合はStringUtils.isEmpty()を使う必要があります。 String strBlank = ""; String strBlankChar = " "; String strJapaneseBlankChar = " "; // 全角ブランク // isBlankでは""、" "、" "の全てにおいてtrueを返す if (strBlank.isBlank() && strBlankChar.isBlank() && strJapaneseBlankChar.isBlank()) { System.out.println("These are judged as Blank"); } // isEmptyでは""のみtrueを返す if (strBlank.isEmpty()) { System.out.println("These are judged as Empty"); } // isEmptyでは""、" "の場合falseを返す if (!strBlankChar.isEmpty() && !strJapaneseBlankChar.isEmpty()) { System.out.println("These are NOT judged as Blank"); } Collection toArrayの追加 Collection型のクラスにtoArrayメソッドが追加されました。メソッド名の通り配列に変換して値を返します。

2019年8月振り返り

8月の振り返り 7月に続き、DDDの案件は平日夜と休日に継続して実施している。 AtCorderについては先月と状況は変わらず、毎週末の大会だけ参加している状況。 プラスアルファとして、JavaScriptとSpringBootの学習を実施している。 Achived 開発 DDD案件によるDDD経験アップ(今月は長めに時間を取ることができた) DDDの書籍「エヴァンス本」はDDDの実践開発で詰まった箇所を読んでいる。8月は5章を読んだ(3割完) Java9〜12の新規追加機能サンプルを作成。 Java9〜10はブログ記事作成。 SpringBootのサンプルシステム構築。SpringSecurityの実装が完了。 AtCorder大会に週1で参加。緑色ランクまであと一歩。 フロントエンド Vueの主要機能を使ったサンプルWebページを作成 ES6の学習。以下をハンズオン(第1部は8割完。全3部構成)https://ja.javascript.info/ インフラ なし Problem 新規 ビルド・デプロイツールの知識が少ない アーキテクト経験がない(1からシステム構成を検討) JSのフレームワーク1つも使えない(サーバ側に知識が偏りすぎている) 継続中 AtCorderで有向グラフが理解できていない AtCorderでDPのパターン経験が不足 解消 JSの最近のフレームワークであるVueとReactを多少なりとも触って感覚を掴めた Try for next month 次の案件に向けて事前準備を行う必要がある。SpringBootとDDDの学習が主。 ネットワークスペシャリスト試験が10月にあるため学習をする。 新規 SpringBootをゼロから一通りの機能を解説コメント付きで実装する DDD書籍(IDDDを読み解く本)を読む ドメイン駆動設計全体像をまとめる ネスペの解説ブログ記事を書く ネスペの過去問を解く(2週間で1年分解く) 継続中(前月中に達成できなかった) Java11、12の新機能サンプルプログラムのブログを書く JSの学習。以下サイトをハンズオンで進める https://ja.javascript.info/ 複雑な宿予約システムのDDD開発練習 ReduxのサンプルWebサイトを作成する(11月以降実施予定)

フリーランス歴8ヶ月の商談結果まとめ

はじめに 2019年2月にフリーランスになって現在の職場で半年ほど働きました。 10月から別の現場に挑戦しようと思い、いくつかの商談を行ったため気付きをまとめます。 フリーランスになったばかりの方、これからなる方の道標になれば幸いです。 現状のスキルと探した案件 現状のスキル プロフィールにまとめて書いてあります。 探した案件 SpringBootの現場経験が欲しかったため、SpringBoot案件を探しました。 プラスアルファとして、ドメイン駆動設計・FEフレームワーク(ReactかVueかAngular)、AWSが経験できると尚良の条件です。 案件の業界はバラバラですね。コンサル、金融、物流と、特に枠を設けずに探しました。 商談の反応 フリーランスデビュー時の商談では経験がないことがかなり不評だったのですが、今回の商談はガラッと変わって好印象な反応が多かったです。 前回は5案件の商談を行い2社からオファーを頂いていたのですが、今回は4案件の商談を行い4社共オファーを頂けました。(こんなに良い結果になるなら4社も受けなくて良かった・・・エージェントの方すみませんでした・・・) 評価された点 色々と評価された点はありましたが以下が主です。 モチベーション 通常の案件(平日の昼間の案件)だけでなく、空き時間にももう1つ案件を持っていたり、勉強に時間を費やしているエピソードはかなり反応が良かったです。趣味=仕事になっているので本音で話せるのは良いですね。 競技プログラミング まだスコアは高くないですが、趣味として競技プログラミングをやっている点も良い反応を頂けました。 関数型の書き方は問題なくできるかという質問に対してRubyで競技プログラミングやっているので問題ないという回答をして納得して頂けたようで良かったです。 少なくともやってない人より良いアルゴリズムを書けるようには見えますし、実際に競技プログラミングを初めてから仕事で書くアルゴリズムの質は良くなっています。空き時間にすぐできますし、趣味としておすすめです。 DBスペシャリスト SQLが書けるかという話になり、DBスペシャリストにギリギリ落ちた話をしたら反応が良かったです。(落ちたんですけどね・・・) 評価されなかった点 ビルド・デプロイ関連ツールの経験 ビルドツールやデプロイ関連の経験がないことは不評でした。案件で途中から入ると大体できあがっているんですよね・・・。個人活動としてでも良いのでゼロから作る経験は必須だなと思いました。 具体的にはGradle、CircleCI、Ansible、Chef(最近聞かないけど)などのキーワードが挙がりました。 アーキテクト経験 ゼロからの全体設計、インフラも含めた構成の検討の経験がないことは指摘されました。 新規構築案件でのみ指摘を受けています。 AWS未経験 AWS案件は多いですね。多少触っているだけでは評価されないなという印象です。 受けた質問 こんな質問されるんだという質問が多々あり、回答にやや困ったものもあったので備忘として残しておきます。 Java12の機能を使っていますか? SQLは複雑なものも書けますか? NoSQLの経験はありますか? ストレスはどういった時に感じますか? エンジニアとしてのキャッチアップの状況はどうか 今後に向けて 一旦商談はクローズしましたが、次回商談に向けて色々と課題が挙がりました。 今回受けた指摘を次回商談で受けなくするという目標に向けていくつかタスクを挙げました。次回いつになるかわかりませんが半年〜1年を目処に以下をこなしていきます。 ゼロからのシステム構築は必須。小さい案件でも良いので機会を探して試す ビルド・デプロイツール設定 development環境、production環境の分離設定 FEフレームワーク経験(多数は無理かと思うのでReactだけ試す) Java以外のサーバサイド言語経験の充足

今更ながらJava10の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java10newFunc/Java10sample.java 追加された機能 var型の追加 新しい型としてvar型が追加されました。型推論という機能を使って、コンパイル時に右辺の値から型を決定することができます。 略式記述(シンタックスシュガー)です。 var list = new ArrayList<String(); // listはArrayList<String型になる list.add("aaa"); list.add("bbb"); list.stream().forEach(System.out::println); // ローカル変数にのみ使用可能。インスタンス変数は不可 // ラムダ引数には使えないので注意 var i = 10; var s = "aiueo"; // プリミティブ型にも使える List copyOfメソッドの追加 Listを複製する。複製したListは修正不可(追加・削除不可)だが、各要素が参照しているオブジェクト内は修正可能であるため注意。 class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } }; var list = new ArrayList<Person(); list.add(new Person("personA", 1)); var list2 = List.copyOf(list); list2.stream().forEach(System.out::println); // コピー元のListが参照している先のオブジェクトを変更するとコピー元も変更される list.

今更ながらJava9の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java9newFunc/Java9sample.java 追加された機能 BigInteger sqrt()の追加 BigIntegerで平方根取得のメソッドが追加されました。四捨五入するようで、√2は1を返します。 BigInteger bi1 = new BigInteger("9"); System.out.println(bi1.sqrt()); BigInteger bi2 = new BigInteger("2"); System.out.println(bi2.sqrt()); // sqrt()の返り値はBigIntegerのため、四捨五入されて1が返却される Optional、Stream ifPresentOrElse()の追加 Java8で追加されたOptional、Streamですが、Java9以降にいくつかメソッドが追加されているようです。Java8が展開された後に不足していた機能を充足するメソッド追加のようです。 ifPresentOrElse()ではOptionalの値が存在する場合としない場合の処理をまとめて記載することができます。 Optional<String opt1 = Optional.ofNullable("hoge"); opt1.ifPresentOrElse( s - System.out.println(s + " is exist"), () - System.out.println("not exist") ); Optional<String opt2 = Optional.ofNullable(null); opt2.ifPresentOrElse( s - System.out.println(s + " is exist"), () - System.out.println("not exist") ); streamNullFilter()の追加 Optionalのstream処理をする際に、値がnullの項目を排除することができます。 List<String searchList = new ArrayList<(){ { add("

プログラムステップ数カウンタでシステム規模を確認する

背景 関わっている案件のシステムの規模や全体感を見るために拡張子別のステップ数を算出するプログラムを作成した。 指定ディレクトリ内の全ファイルに対して拡張子別に行数を算出し、全体に対して占める割合も合わせて表示する。 プログラム GitHub

MySQLの定期バックアップ

背景 MySQLを定期的にバックアップするためのシェルを毎回忘れるため備忘用にメモしておく。 cronやサーバ起動時のシェルに組み込んで使用する。 プログラム #!/bin/bash ntpdate ntp.nict.jp today=$(date "+%Y%m%d") mysqldump -u root -ppassword -h localhost dbname /vagrant/outputdirt/mysqlBackup${today}.dump

使用頻度の高いBulma機能を使ってWebページサンプルを作成してみた

背景 最近関わっている案件でBulmaを使用しているんですが、Bulmaの練習がてらBulmaを使ってWebページサンプルを作成してみました。 あまりHTML5のタグも気にする必要ないようですが(極端に言えばほぼ全部divタグでも動くが)、毎回悩むのもムダなので今回作成したページを今後のテンプレートとして使っていこうと思っています。 作成したサンプル Bulmaの機能がわかりやすいよう、余計な機能は極力外しています。 作成したWebページ ソースコード

2019年7月振り返り

7月の振り返り 6月に続き、DDDに力を入れた。 DDDの案件は平日夜と休日に継続して実施している。 SpringBoot、DDDはそれぞれ学習範囲が広いが、ベースは抑えることができた。指摘を受けることは多いが、開発が進められる状況になった。 AtCorderについては先月と状況は変わらず、毎週末の大会だけ参加している状況。腕はあまり落ちておらず、ABCでD問題が解けるか解けないかというレベル。 スキマ時間にJSを学習し始めた。ES6の仕様がわかっていないので体系的に学習中。 Achived 開発 AtCorder大会に週1で参加。400点問題までは解けるようになった。継続中。たまに解けない時があるせいでなかなか緑色ランクになれない・・・。 DDDの書籍「エヴァンス本」は読破は効率が悪いので中断。DDDの実践開発で詰まった箇所を読むようにしている(3割完) Springの勉強(SpringMVC、SpringBoot、SpringSecurity、SpringDataJPAの浅い所を一通り) Spring徹底入門を読破(10割完) 複雑な宿予約システムのDDD開発練習(5割完?) IntelliJ Ultimateの使い方。マルチカーソルを使いこなせるようになってきた思う。 デザインパターン(GoF23)の復習 SOLID原則を覚えた フロントエンド Bulmaの主要機能を使ったサンプルWebページを作成 Reactの主要機能を使ったサンプルWebページを練習作成 ES6の勉強。以下をハンズオン(4割完) https://ja.javascript.info/ インフラ なし Problem 新規 なし 継続中 AtCorderで有向グラフが理解できていない AtCorderでDPのパターンによっては解けない(パターンが色々あるのでももう少し経験を積みたい) 解消 Spring、SpringBootの知識不足→最低限の知識はついた 腱鞘炎は再発の心配なし。ここ2ヶ月程痛みなし! Try for next month 次の現場向けに何らかシステムを見せられる状態にしたかったが副業が開始したため一旦そちらに注力中。 前々月〜前月にかけて書籍の学習に時間を費やしすぎており、手を動かす時間が少なかった。前月の後半からサンプルコードを作成に時間を費やす始めており、8月もJSやJavaのサンプルコード作成を行うようにする。 新規 JSの学習。以下サイトをハンズオンで進める https://ja.javascript.info/ ReduxのサンプルWebサイトを作成する VueのサンプルWebサイトを作成する 継続中(前月中に達成できなかった) Java9、10、11、12の新機能サンプルプログラムを書く Springに関して記事を書く。始めてみて感じたことがテーマ DP、有向グラフは大会で確実に解ける状態にする

AWS+BitnamiWordPress環境でLet’sEncryptを更新した

はじめに AWS・BitnamiのWordpressを使っているんですが、Let’sEncryptの更新が失敗したので更新手順をまとめます。 急に安全ではない接続になった ある日ブログを見たらHTTPS対応しているはずなのに鍵マークに黄色い△マークが・・・。この接続は安全ではありませんとの表示もされているのでLet’sEncryptのはじめての更新(3ヶ月毎更新)に失敗したのだろうと察し、直しました。 更新をしてみるとエラーが発生 手作業で更新をしてみると以下のエラーが発生。初回の発行コマンドでもダメ。前回こんなの発生した記憶ないけど何か変わったんでしょうか。 ./letsencrypt-auto has insecure permissions! 修正手順 ほぼ こちらの手順通りでうまくいきました。 Let’sEncryptをキレイに再インストールしたかったのですが、既存のLet’sEncryptがインストールされた場所からの削除・今のドメインの失効コマンドは諦め(上記と同様のエラーが発生するため)。 やや汚いですが完了とします。次回更新うまくいくと良いな・・・

JSUG勉強会2019その7ビズリーチにおけるSpringの活用に参加した

ビズリーチ社内で実施されたJSUG勉強会に参加してきたのでまとめを書きました。 Contents 1 勉強会概要 2 1部 クラウド時代だからspring-retryフレームワーク。 2.1 プレゼン内容 2.2 所感 3 2部 フレームワーク移行で学ぶ Spring Boot のつまづきポイント 3.1 プレゼン内容 3.2 所感 4 3部 これで怖くない!?コードリーディングで学ぶSpring Security 4.1 プレゼン内容 4.2 所感 5 全体所感 勉強会概要 勉強会名: ブログ記事_JSUG勉強会2019その7ビズリーチにおけるSpringの活用 場所: ビズリーチ社(渋谷駅) 日時: 2019/7/12 19〜21時 1部 クラウド時代だからspring-retryフレームワーク。 渡邉 祐さん (株式会社ビズリーチ)による発表でした。

6月振り返り

総括 5月に続き、AtCorderとDDDに力を入れた。 AtCorderについてはABCでD問題までは普通に解けるようになってきた。競技プログラミングらしくDPが結構できるようになってきたのは実力がついてきたと実感している。 DDDについては副業として仕事を頂くことになったため、実践で学ぶ形になった。 新規開発であり、SpringBoot最新バージョンを採用している。ツール類もメインで入っている職場と異なる点が多く、キャッチアップに時間がかかっている。 Achived 開発 AtCorder大会に週1で参加。400点問題までは解けるようになった DDDの書籍「現場で役立つシステム設計の原則」を読み終えた DDDの書籍「エヴァンス本」は読み終えない。一旦実践を優先するため諦めた(3割完) Springの勉強(SpringMVC、SpringBoot、SpringSecurity、SpringDataJPAの浅い所を一通り) 「Spring徹底入門」の読書(6割完) GitHub上で複数人開発。Issue、ラベル、プルリク等の出し方 IntelliJ Ultimateの使い方。IntelliJ内の用語概念、ショートカット、LiveTemplate等(本格的なJava開発でIntelliJを使うのが初めて) 「IntelliJハンズオン」の読書(完読) Bulmaの概要理解(副業で扱うため) インフラ なし IT基礎 なし 英語 なし Problem AtCorderで有向グラフが理解できていない AtCorderでDPのパターンによっては解けない(パターンが色々あるのでももう少し経験を積みたい) Springの知識不足 腱鞘炎は椅子を変えたら調子よくなった。適切な位置に肘置きがあるだけで手首の負担が大幅に減る Try for next month 次の現場向けに何らかシステムを見せられる状態にしたかったが副業が開始したため一旦そちらに注力する DP、有向グラフは大会で確実に解ける状態にする Springの書籍を読破する(浅く広く大まかな構成とできることを頭に入れる) Java9、10、11、12の新機能サンプルプログラムを書く Springに関して記事を書く。始めてみて感じたことがテーマ 8月末にどういった状態でありたいか JavaかRailsの何らかのシステムが出来上がっていること → これは諦める(年内は無理そう) ブログが見せられる状態であること DDDに関する意見を書く 簡単なプログラムを書いて、ブログで説明する AtCorderとGitHubのリンクを貼る GitHubが見せられる状態であること → 簡単なプログラムのサンプルは上げたい AtCorderが見せられる状態であること

「プロダクトをつくるとはどういうことなのか? -正しいものを正しくつくる-」にZoom参加した

はじめに 以下セミナーに参加したので内容をまとめました。 セミナータイトル: プロダクトをつくるとはどういうことなのか? -正しいものを正しくつくる- 参加スタイル: Zoom参加 プロダクトづくりのためのソフトウェア設計スタイル(増田さん) メモ 創発的な設計活動では、局所的な仮設と実験を繰り返すことはできるが、全体に視野を広げる必要がある 答えがあるわけではない。仮設と実験を繰り返す 動いたから正解ではなく考察をすることが必要。 オブジェクト指向より前に型がある。 作っているうちにこの型よりこの型が良いねといった形で改善していく ビジネス活動の関心事夫々に対して設計実装の型とする データの重要度が見えてくる。処理の文脈から画面/テーブル間の関係性に気づくことができる 型や計算にフォーカスしてモジュールを作成すると、計算のタイミングやアウトプットの場所といった全体のデータの繋がりが見える 所感 最近DDDの開発に入らせて頂いているが、設計に答えがあるわけではないという言葉は常に頭の片隅に置いておく必要がありそう。 実際に何が答えかわからない中、これがベストと言えない状態で試行錯誤に時間がかかりすぎている。 まだ決まっていないことは仮の前提を立てるなど、一旦現時点でできるベストを選択し、スピード感を出すようにトライしていみる。 一旦はプロダクトをハリボテとして作り上げて、そこから新たな視点で見ることもできると思うので、考えすぎて作業が遅くなりすぎないように注意しなければならない。 アジャイル開発は2度失敗する(市谷さん) メモ 教科書通りに進めるのではなく、早く少しだけ形にする。新たに分かってきたことを現実的に受け止める方法を検討する 理想的な状況を前提に考えていてはダメ 理想的なプロダクトオーナーは都合の良い概念 所感 今の仕事ではプロダクトオーナーの理想を押し付けているなと思った。正解をプロダクトオーナーが持っているわけないし、協力して良いプロダクトを作るように意識を変えないといけない。 (多分もっと重要な話をしていたと思うんだけど聞き取れなかった・・・) QA 重要な20%の見極め方。相対的に比べてどちらが重要かを比べる。50:50、25:25・・・。一番大切なのは経験。お客さんの事業におけるマーケットでのポジションで見極める。リーダーは他社が追いつかないようにする策に特化。ニッチャーは得意な点。 最後に Zoom参加は初めてでしたが、音声はやや聞こえにくかったです。後半はかなり聞き取りが厳しかった・・・無念。

SOLID原則について調べてみた

はじめに オブジェクト指向プログラミングにおける有名な原則であるSOLID原則についてまとめました。 何番煎じかわかりませんが、自分の言葉で書いてみようと思います。 SOLID原則とは Single Responsibility Principle 単一責任の原則 Open / Closed Principle 開放閉鎖の法則 Liskov Substitution Principle リスコフの置換原則 Intarface Segmentation Principle インタフェース分離の原則 Dependency Inversion Principle 依存性逆転の原則 単一責任の原則 クラスを変更する理由は複数存在してはならない。役割が複数ある場合、それぞれの役割が変更理由になり得る(責任=役割=変更する理由になる元)。 具体的にはプロパティの管理やあるクラスのデータベース管理など。 細かく分ければ良いわけではなく、クラス名が一言で添えられる程度の分割が良さそう。 開放閉鎖の法則 既存のコードに修正を加えないで済む手法。 拡張に対してオープンであり、修正に対してクローズドである。 言い換えると、振る舞い方を追加することで変更に対応することができ、その変更は既存の振舞には影響しないこと。 方法論としては、呼び出し側が抽象を操作し、派生クラスの追加により変更を行う。 リスコフの置換原則 基本クラスを使っている箇所では基本クラスの代わりに派生クラスを使っても動かなければならない。 例えばスーパークラスが吐き出さないExceptionをサブクラスが投げてはいけないなど、派生クラス固有のプログラムはNG。 派生クラスは基本クラスより引数の条件が緩くなければならない。例えば基本クラスが正の整数を受け付けるのに派生クラスが100以上の整数しか受け付けないのはNG。 派生クラスは基本クラスより返り値の条件が厳しくなければならない。 インタフェース分離の原則 クライアントに、クライアントが利用しないメソッドへの依存を矯正してはならない。 インタフェースを分離することで修正範囲が狭くなる。 インタフェースの規模が大きくならないよう、異なる意味合いのメソッドはインタフェースを分ける。 依存性逆転の原則 上位のモジュールは下位モジュールに依存してはならない、どちらも抽象に依存すべきである。 下位モジュールを使用する箇所に直接型定義として記載するのではなく、上位モジュールとして振る舞えるように記載する。 具体的には下位モジュールから抽出されたインタフェースを型として持ち下位モジュールは注入する形にする(定義自体を外に記載するDIが良さそう)。 下位モジュールが上位モジュールの中で直接使用されている状態を「下位モジュールが上位モジュールに依存している」と言う。 まとめ 言葉こそ知らなかったものの、普段気にしている点ばかりでした。ちゃんとソフトウェアに落とし込めているかは別の話だけど・・・。 普段気にしていても改めて言葉で書いてみると難しいですね。自分の言葉で説明できるようにならないとと改めて思いました。 デメテルの法則など、上記以外の法則・原則もあるようなので調べる必要ありです。

Bulmaについて調べてみた

Bulmaを仕事で使うことになったのでさっくり概略を調べてみました。 Contents 1 Bulmaとは 1.1 Flexboxとは? 2 ノンデザイン? 3 プロジェクトへの取り込み方 4 気になったポイント 4.1 画面レイアウト 4.2 実装方法 4.3 モジューラビリティ 4.4 面白そうな細かい機能 5 所感 Bulmaとは オフィシャルサイトによると以下の通り。OSSのCSSフレームワークで。Flexboxをベースにしているようです。 Bulma is a free, open source CSS framework based on Flexbox モバイルファーストのレスポンシブデザイン。 モジュールとして組み合わせて使うことができるようです。 Flexboxとは? FlexboxはCSS3で採用された機能で、正式名称をFlexible Box Layout Moduleといいます。 名前の通り、フレキシブルなレイアウトを簡単に実現する仕組みで、親Box・子Boxにより構成されます。小要素のBoxを横並びで表示し、親要素と小要素の横幅に応じて自動的に折り返して次の行に表示するなど、閲覧するブラウザ・端末に応じて見やすいレイアウトを自動的に生成します。 ちなみにGridレイアウトと混同しがちですが、Flexboxは1次元レイアウト、Gridは2次元レイアウトです。