Somurie Engineer's Blog

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

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java12newFunc/Java12sample.java 追加された機能 switch文の追加(プレビュー版) switch文の新たな使い方が追加されました。右辺として使うことができるようになります。 具体的には以下の通りです。 System.out.println("-- アロー構文 --"); int num = 4; switch(num) { case 1, 2, 3 - System.out.println("複数条件を記述できます"); case 4, 5, 6 - { System.out.println("複数行の処理を書くときには"); System.out.println("ブロックで書きます"); } default - System.out.println("条件に合致しない場合"); } System.out.println("-- switch式 --"); String message = switch (num) { case 1, 2, 3 - "複数条件を記述できます"; case 4, 5, 6 - { System.out.println("ブロックの場合はbreakにより値を返却する"); break "ブロックによる記述もできます"; } default - "条件に合致しない場合"; }; System.out.println(message); String transform()の追加 今まで処理メソッドに対してStringの文字列を引数で渡していた処理に対して、transform()を使うとStringの文字列に対して処理を記述することができます。

今更ながら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メソッドが追加されました。メソッド名の通り配列に変換して値を返します。

今更ながら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ページ ソースコード

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フレームワーク。 渡邉 祐さん (株式会社ビズリーチ)による発表でした。

「プロダクトをつくるとはどういうことなのか? -正しいものを正しくつくる-」に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次元レイアウトです。

動的型付言語と静的型付言語

背景 今までJavaの開発が多く、Javaは静的型付言語であった。最近Railsの開発に携わっており、静的型付言語と動的型付言語の違いを実感することがあったため雑ですが今思うことを以下に備忘メモとして残しました。 静的と動的型付言語の違い Rubyは動的型付言語であり、開発時にカルチャーショックを受けることが多い。 簡単な書き方であれば困ることはあまりないが、メタプログラミング要素を含む書き方になると調査難易度が格段に上がる。 現場で感じた動的型付言語のメリット・デメリットは以下の通り。 大規模になればなるほどメリデメは顕著に現れるように思える。現に現在参画している案件は大規模のため、以下の特徴を強く感じている。 静的型付言語のメリット (慣れると)開発生産性(メンテナンス性含む)は高い 静的型付言語のデメリット 慣れない間は遅い Ruby初学者 可読性が低い 静的コードチェックができないため、メソッド呼び出し可否が不明確 プロジェクト新規参入者の学習コストがかかる 影響範囲調査に時間がかかる(対応箇所の検討は付くが、裏取りに時間がかかる。CircleCIなど自動的に回帰テストを行える環境が整っていると良い) (雑な言い方だが)頭が良くないときつい。抽象的思考能力と大きめの脳内キャッシュ(短期記憶能力)があると良い プログラマの使い方を制限しないため空気を読んだコーディングが必須(コードレビューは必須) 最後に RubyはDDDと相性が良いように思える。 ドメインを明確に決めることで役割が明確化し、可読性、メンテナンス性が高まる。(デグレも起きにくい) Rubyの設計スキルを上げるためにDDDを学ぶ必要がある。 Railsの場合、ControllerとModelが確実に分割されるが、Modelが複雑化した時の書き方は追って学習する必要がある(ActiveRecord::Concernやmix-in、他にもある?) 大規模のプロジェクトでRails(動的型付言語)を使っている場合は序盤は全体構成の理解に徹するべき。 SOAによるサービス単位での分割など、大規模になりすぎないようにシステムを分割することを検討した方が良い。

Rubyのよく使う定義メソッド確認コード

よく使うメソッドの確認方法をまとめました。 クラスメソッドとインスタンスメソッドを両方出力するメソッドは見当たらないです。欲しかった・・・ class Test class << self def class_method1 end end def instance_method1 end end puts "--- class ---" t = Test.new p Test.methods # クラスメソッドのみ p Test.methods(false) # クラスメソッドのみ(親クラスを除外) p Test.public_methods(false) # publicなクラスメソッドのみ(親クラスを除外) p Test.instance_methods # インスタンスメソッドのみ p Test.instance_methods(false) # インスタンスメソッドのみ(親クラスを除外) puts "--- instance ---" p t.methods(true) # インスタンスメソッドのみ p t.methods(false) # インスタンスメソッドのみ p t.method(:instance_method1).source_location p t.methods(true).grep(/method1/)

AWS Lambda&Rails5.2.3で格安サーバレス運用をする

背景 RailsでWebシステムを公開したい時、どこのレンタルサーバを使用していますか? Railsが動作する前提で探すと(PHPと比較して)どうしても高くなってしまい、遊び程度のシステムを作成するにはどうも気が引けます。 簡単なWebサービスであればAWSのサーバレスアーキテクチャがかなり安く運用できそうなので、簡単な運用費計算と簡単な動作確認までを記事にまとめました。 環境 MacOS Mojave 10.14.4 Homebrew 2.1.0-27 Ruby 2.5.3p105 Rails 5.2.3 作業日 2019/4/14 運用費計算 王道ですが以下3つの構成から成る簡単なWebアプリを作成するとします。大まかな料金表は以下の通り。 Route53 ホストゾーンの登録 0.5USD/Month 標準クエリ100万件毎 0.4USD/Month (日割りされるみたい。少なければ0USD?) S3 ストレージ料金 最初の 50 TB/月 0.023USD/GB リクエスト料金 S3 Select によって返されたデータ 0.0007USD/GB lambdac 1,000,000 件のリクエストか400 GB-秒まで 超ざっくりですが、皮算用は0.5USD/月程度です。内訳は以下の通り。 Route53 1万アクセス/月の場合、登録料0.5USD+0.004USD S3 0.5GBのコンテンツの場合、0.00000023USD -20GBのリクエストの場合 (1アクセス2MB×1万アクセス)、0.014USD/GB lambda 無料 安すぎるけど計算間違えてないかな・・・。 既に計算している人を見ると、やや違うけど、とんでもない金額にはならなそうなのでとりあえず進みます。 AWS SAM CLIのインストール $ brew tap aws/tap $ brew install aws-sam-cli $ sam --version SAM CLI, version 0.