Javaでファイルやディレクトリを扱う
Java8以降でファイルとディレクトリを方法には大きく2パターンが存在します。
Fileクラスを使う
Fileという名前ですが、実際にはディレクトリもこのクラスで扱います。
以下のようなディレクトリ構造があったすると
/hoge/huga/sample2.txt /sample.txt
File file = new File("/hoge/huga"); System.out.print(file.list()); // ['sample2'] System.out.print(file.getParent().list()); // ['huga', 'sample.txt']
親ディレクトリを辿ったり、ディレクトリに存在するファイルやディレクトリを羅列したりすることができます。
当然、ファイルやディレクトリの作成、削除、権限変更なんかもできます。
FilesとPathクラスを使う
Java7で新しく追加されたクラスです。
Pathはファイルやディレクトリを、Filesはそれらに対する操作を責務とします。
Fileのときの例と比較してみましょう。
Path path = Paths.get("/hoge/huga"); Files.list(path).forEach(System.out::print); // sample2 Files.list(path.getParent()).forEach(System.out::print); // huga sample.txt
Files.list(Path)はStreamオブジェクトを返すのでStreamAPIが使えます。
配列やListで扱いたい場合は、それぞれのオブジェクトに変換する必要があります。
相互に変換する
PathオブジェクトとFileオブジェクトはそれぞれPath.toFileとFile.toPathメソッドで変換することができます。
両方入り混じっていると分かりづらいので、スクラッチで組む部分はFilesとPathで書いて、外部ライブラリなどがFileオブジェクトを要求している場合などに変換すると良いと思います。
git rebaseって結局なんなの(1)
初心者の壁rebase
git add, commiit, checkout, mergeは怖くない! でも rebaseは怖い。
rebaseを理解するために必要なもの
rebaseを理解する前にcommitとbranch、HEADの関係性についてきちんと理解できているか再確認しましょう。
詳細な説明は公式ページ等を参照するのが良いと思うので、ここでは簡潔な説明に留めます。
誤解を恐れず、それぞれについて一言で表現するならば以下のようなイメージでしょうか。
commit リポジトリの履歴(スナップショット)
branch 枝分かれしたcommit
HEAD 現在のcommit位置
で結局rebaseとは
私はcommitを付け替える操作のことだと理解しています。
以下のようなリポジトリがあったとします。
Branch A 1 → 2 → 3 → 4 ↘ Branch B 3' → 4'
BをAにrebaseすると次のようになります。
Branch A 1 → 2 → 3 → 4 → 3' → 4'
Aの先頭にBのcommitが上乗せされた状態ですね。
一方、merge(non fast-forward)では
Branch A 1 → 2 → 3 → 4 → 5 ↘ ↗ Branch B 3' → 4'
merge commitが発生するためこのようなcommitになります。 実際にはmerge後にはBranch Bが削除されてmerge commitだけが残ることが多いでしょう。
もう一つのrebase
rebaseにはもう一つ大きな役割があります。 それはcommitの改変です。
詳細は割愛しますが、複数のcommitをまとめて一つにするなどの操作ができます。 試行錯誤した跡をそのままpushするとcommit logを汚してしまうため、 自分だけが作業しているbranchでcommitの整理を行ってからpushするといったことができます。
注意点としては、他の人が作業しているbranchで安易な改変を行うと大変なことになるので絶対やめてください。(特にmaster) どうしても実施する必要のある場合は、必ずメンバーに合意を取ってから作業するようにしましょう。
これであなたもrebaseマスター
commit logをきれいに保つために便利なrebase。 不安な場合はローカルブランチで色々と練習してはいかがでしょうか。
wordpressからはてなブログに移行しました
背景
もともとこのブログはAWS Light Sailで運用を行っていました。 レンタルサーバーではなく、あえて自前のサーバーを利用することで、AWS周りの知識を身につけることができると考えたからです。
現状
特にアクセス数の多いブログでもないため、上記の環境で十分に運用ができていました。 一方で、wordpressは脆弱性対応のアップデートがかなりの頻度で求められるため、そこに運用コストがかかっていました。
また、この先のスケーリングを考えた際にも、LightSailでの運用は割高に感じられたため、新規一転、はてなブログへの移行を行うことにしました。
選定
はてなブログを選んだ理由は主に下記の2点です。
技術ブログでの採用実績が多い
SEO対策に向いている
実作業
移行はかなりスムーズに行うことができました。
wordpressのダッシュボードからexportをして、ドメインを付け替えて、はてなブログにimportするだけ。
情報もたくさん転がっているので、ググればすぐに出てくると思います。
Javaで正規表現を扱うときの注意
エスケープを忘れない
特定の記号を文字として扱いたい場合は、バックスラッシュでエスケープする必要があります。
例えばexample(comをマッチさせたい場合、正規表現としては example¥(comのようにしてあげる必要があります。 記号によってエスケープが必要かどうかが異なるため、注意してください。
String.matches()とMatcher.find()の違い
String.matches()は与えられた正規表現が文字列全体に対して一致するかどうかを判定します。 一方でMatcher.find()は与えられた正規表現が文字列の一部に対して一致するかどうかを判定します。
つまり、aaabbbaaaという文字列があった場合
"aaabbbaaa".matches("bbb") # false Pattern.compile("bbb").matcher("aaabbbaaa").find() # true
となります。
Java最新フレームワーク特集@関ジャバ参加レポ
関Java初参加でした。
テーマ
テーマは最近注目のマイクロフレームワークであるQuarkusとMicronaut。 どちらもクラウドネイティブ環境向けのspringライクなフレームワークです。
特徴
GraalVMに対応していてnativeコンパイルができることと、SpringBootの組み込みサーバーと比較して起動が非常に早いこと。 これにより非常に少ないメモリ量で高速に起動することができるため、コンテナ環境向きというわけ。 Quarkusについては、説明ではメモリ10分の1、起動時間200分の1という恐ろしい数字がでていました。 また、起動中にそのまま再コンパイルが実行できるため再デプロイの必要なし、しかもだんだんコンパイルが最適化されて早くなるという夢のような仕様。
エコシステム
SpringData,MVCのAPIで記述すると裏でQuarkusのコードに変換できるpluginもあるみたいです。
これから大注目のフレームワークですね。
go言語の学習をはじめました
ツールづくり
現在SREに近いところの業務を担当しているのですが、どうしても運用系のツールをbashで書くには限界があります。 世の中的にはCLIはgoで作るのがトレンドらしい。 著名な製品だと、dockerやterraformなんかはgoで作られているらしいです。 開発元がgoogle先生のため、保守面も安心。
Udemyで検索
ちょうどUdemyがセールをやっていたので、いい感じにgoを学べる講座はないかと検索していると、 よくトップに上がってくる、現役シリコンバレーエンジニアが〜シリーズのgoバージョンがあるではありませんか。 現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
早速購入してHello World
講座のソースは投稿できないので手元で試してますが特に詰まることなくHello Worldできました。
最終的には
株の自動売買ツールとか組めたらいいなぁ。。。 あ、金融ネタ最近全然投稿してない。