りんごとバナナとエンジニア

エンジニア修行の記録

【terraform】importコマンドでtfstateファイルを複数モジュールに分割する

「コンテナ時代のWebサービスの作り方」を読みながらterraformを触ってみている。 booth.pm その中で、terraformを使う例としてVPCとEC2を作成する項目があった。本ではまず1つのtfファイルに両方のリソースをまとめて記述した後、ec2とvpcでモジュールを分…

【bash】コマンドの戻り値をワンライナーで確認するときの注意

bashのスクリプトを書くとき、直前のコマンドの戻り値を見て条件分岐させたいことがよくある。戻り値は $? で取得できるのだが、このコマンドはいかなる場合でも直前のコマンドしか考慮してくれない。 例えば、以下は $? の誤った使い方である。 which aws |…

Kafka Dockerで$KAFKA_HOMEと$ZKの値を設定する

Kafka Dockerを使ってKafkaの実行環境を作っていたが、コンテナに接続してtopic一覧を表示しようとした際に、チュートリアルにある環境変数 $KAFKA_HOME と $ZK がどこで設定できるのかわからず詰まってしまった。 $KAFKA_HOME/bin/kafka-topics.sh --descri…

【Java】Nested Classの使いどころ

Javaで特定のクラスに強く紐づく小さなクラスがあるとき、それをネストさせている書き方と、ネストさせずに1ファイル内に並列して置く書き方の両方をよくみる。どちらを使うと良いのか迷うことが多かったので、Effective Javaの項目24にあたってみた。 www.a…

ファイルの1行目だけスキップして出力するコマンド

コマンドラインでCSVファイルを出力し、パイプで渡して処理を行うことが多いのだが、その際ヘッダ行が邪魔になることが多い。例えば以下のようなCSVファイルの場合、データ集計をする際にヘッダ行は必要ない。 $ cat filename.csv 会員番号,職業,スコア 1000…

【Docker】Volumeを使わない場合のデータ書き込みの仕組み

Dockerのcontainer上にS3等の外部サービスからファイルをダウンロードできないか考えたが、そもそもVolumeを使わない場合にContainer上で書き込みを行うとどこに保存されるのかよくわかっていなかったので、ドキュメントに当たり直してみた。 まずimageとcon…

【書評】「実践Vim」を読んだ

普段からエディタとしてVimを使っているが、ショートカットがなかなか身につかない。不便だと思ったときはその都度調べているので断片的な知識はあるが、もっとテクニックを体系的に身に着けて編集作業の効率を上げたいと思い、この本を読んでみた。 www.ama…

「DataDogで始めるモニタリング基盤」を読んだ

業務でDataDogを使っているのだが、今あるログやダッシュボードがパフォーマンス管理のために本当に十分なのか検証する必要性が生じてきた。その前提としてDataDog自体の知識を得たいと思っていたところ、 id:sadayoshi_tada さんのブログでこの本を知った。…

なるセミ「実践クリーンアーキテクチャ」に参加しました

nrs-seminar.connpass.com Youtubeのライブ配信で行われたイベントに自宅から参加。設計理論にとどまらない話を聞ければと期待していたが、予想以上に濃い2時間だった。 背景 nrsさんの開発チームでは、APIの定義やDBの選定すらそもそもできていない段階で先…

AWS上でRedashを動かす

普段業務でお世話になっているRedash。個人ではローカルで動かしたことはあるが、せっかくなのでちゃんとした環境に立ち上げてみたいと思った。 EC2インスタンスを作成 まずRedash用のVPCを作り、その中にEC2インスタンスを立ち上げる。 Redash公式サイトでA…

Google Documentに良い感じのスタイルをつけるtips

開発ドキュメントの執筆はesaやConfluenceを使うことが多いのだが、先日ビジネスサイド向けにどうしてもGoogle Documentを使ってドキュメントを作らなければいけないことになってしまった。Word系のツールは久しく触っていなかったので、Markdown系ツールで…

【Scala】A => B => C 型の関数の意味

Scalaのコードを読んでいると、時々 val f: A => B => C のような関数が出てくることがある。見るたびに少し混乱していたので整理。 この A => B => C は A => (B => C) と等しい。すなわち、型Aの引数を渡すと、 B => C である関数が返ってくるということ。…

【Scala】パターンマッチングでの "unbound placeholder parameter" エラー

「Scala関数型デザイン&プログラミング」を進めている。今は3章でデータ型を定義しているところなのだが、パターンマッチングを書いたときに凡ミスでエラーを起こしたのでメモ。 sealed trait List[+A] case object Nil extends List[Nothing] case class Co…

【kubernetes】last-applied-configurationの役割とConfigMapのマージ戦略

先日、テスト環境上のKubernetesで、アプリケーションがDBに急に接続できなくなってしまった。GitHubのmasterブランチで管理している設定ファイルには全く変更がなかったので、原因をどう調べようか迷っていたところ、まずConfigmapのlast-applied-configura…

【Scala】再帰処理を末尾最適化するための考え方をSICPに学ぶ

Scala関数型デザイン&プログラミングでScalaと関数型プログラミングに慣れようとしている。最初の練習問題はn番目のフィボナッチ数を出力する関数を作るというもの。 はじめは以下のように書いた。 object Main { //@annotation.tailrec def fib(n: Int): In…

【Kubernetes】nodeSelectorでPodがassignされるNodeを指定する

会社のアプリケーションをローカルの開発環境で走らせようとして、manifestファイルを開発環境のClusterにapplyしたのだが、いつまで待ってもPendingのまま。 kubectl describe で調べてみると、Event欄に以下の表示が出ていた。 0/9 nodes are available: 3…

【CircleCI】Pull Requestを出した時のみビルドを動かす

先日チームでのリリースフローが変わり、それに合わせてCircleCIの設定を変えようとしていた。やりたいことは、Pull Requestを作成・更新した場合と、masterブランチにタグを打ったときのみビルドを走らせることだったのだが、公式ドキュメントを見てworkflo…

【Git】過去のコミットのメールアドレスを全て変える

Git

先日、開発に使う用のメールアドレスを新しく作ったのだが、今コミットしている自分の個人用レポジトリを git log で見ると、プライベート用のメールアドレスも混じってしまっていた。なんとなく気持ち悪いというだけなのだが、統一する方法はないかと調べて…

【Spring Boot】OpenAPI GeneratorのType Mappingで自作のドメインオブジェクトを使用する

Spring Boot + OpenAPI GeneratorでTodoリストのAPIサーバを作っている。OpenAPIでエンドポイントやリクエスト・レスポンスを定義するところは楽だったが、 OpenAPIで定義したリクエスト・レスポンスの型は自動で生成されたコードの中に定義されることがわか…

【Scala】Futureの落とし穴と参照透過性

最近同じチームのメンバーからScalaを教えてもらっている。この前は並列処理について教えてもらう機会があったが、彼はScalaの教本で最初に出てくるFutureはなるべく使いたくないという。なぜだろうと思っていたが、実際に小さなサーバをチームで実装してみ…

dotfilesのためのmake入門

最近自分のdotfilesを整備しているのだが、強い人たちのdotfilesを見ると、 make コマンドで実行するようになっているものが多いことに気がついた。 make は難しそうで敬遠していたが、少し調べてみるとdotfilesを作る時にとても便利であることがわかった。 …

【Kafka】--bootstrap-serverと--zookeeperの違い

Kafkaのコマンドを扱っていると、コマンドの種類によって --bootstrap-server を指定する場合と --zookeeper を使う場合とがあって少し混乱する。どう違うのかを調べてみた。 bootstrap-serverとは bootstrap-serverとして指定するのは、他でもないKafkaのbr…

KubernetesのServiceAccountを触って学ぶ

udomomo.hatenablog.com 以前RBACについての記事を書いたが、Rolebindingで権限を付与できる対象は複数ある。以前の記事では人に対して与えられるUser Accountについて書いたが、Pod内で動くコンテナのプロセスに対して与えられるService Accountというもの…

OpenAPIでRestfulAPIの仕様を定義する

一時期会社の他チームで、OpenAPIを取り入れようと検討されていた時期があった。結局他の開発業務が立て込んだため採用はされなかったのだが、API開発の一手法として興味があったのでちょっと使ってみた。 OpenAPIとは OpenAPIは、RestfulAPIのインターフェ…

tmux 3.0でコピーモードの設定を行う

先日、tmuxを久しぶりに使う機会があった。 tmux.conf の中身は、以前ネットで拾ってきたものをそのまま使っていたのだが、設定内容を全然使いこなせていないうえ、あまりに久しぶりすぎて中身の意味もわからない状態になってしまっていた。そこで、思い切っ…

Kafkaのメッセージング方式の特長を学び直した

自社サービスでKafkaを使っており、自分でも少し触ったことがあるのだが、Kafkaというのがメッセージングにおいてどんな特長を持ったサービスなのかについては、topicを介してproducerとconsumerがメッセージをやり取りする、という程度の理解しかなかった。…

【Java】雰囲気でmockしていた自分のためのMockito再入門

Mockitoはテストの際に何度も使ったことがあるが、mockやspy, injectmocks等の用語の意味をなんとなくでしか理解しておらず、使う際に何度も詰まってしまっていた。このたび、公式ドキュメントを改めて読み直してみたのでまとめておく。 javadoc.io mockとは…

約1年間ブログを続けられている理由を振り返る

この記事は、write-blog-every-week Advent Calendar 2019の20日目の記事です。 ブログを定期的に書くようになって大体1年くらい経つ。このブログを作ったのは2017年のことだが、最初の頃はほとんど更新せず、2018年は月1回未満のペースだった。しかし2019年…

minikube Clusterをdeleteしたらkubectlが使えなくなった

ローカル環境でKubernetesのClusterを動かす方法はいろいろある。よく紹介されているのはminikubeを使う方法だが、自分の場合Docker Desktopを使っている。Docker DesktopにはKubernetesが付属しており、追加のインストールなしでClusterを立ててkubectlで操…

KubernetesのRBACを触って学ぶ

先日Kubernetesの特定のnamespaceでJobを実行しようとしたところ、権限がなかったため、まずClusterの管理者に権限を申請するところから始める必要があった。これを機会に、KubernetesのRBACについて学んでみた。 RBACとは RBACとは、Role-based access cont…