GitHub Actions はいいですね。今更感w

urapico.medium.com

こちらの記事でも書いている通り自分がいなくなってもプロジェクトは、問題なく回るのかを常に考えてます。なので、チームに対してルールを新しく作るのではなく仕組みを作ることを常に意識しています。

すると開発プロセスにおいては、GitHub Actions の親和性が非常に高く感じており、色々と利用させてもらっています。

ただ、GitHub Actions を利用していると、Event の種類によって渡ってくるオブジェクト(github)の中身が変化するのが、なかなか分かりづらいと感じる時があります。これを上手く扱えると開発が捗ります。しかし、GitHub のドキュメントを見てもはっきりと記載がなく困っています。

そのため、私は以下の通り github という変数の中身を展開するジョブを1つ用意しておいて、開発を進めるようにしています。

name: demo

on:
  issue_comment:

  pull_request_review:
    types: [submitted]

jobs:
  debug:
    name: debug
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "${{ toJSON(github) }}"

  hoge:
    name: hoge
    ... 

また、Pull Request の情報、状態を取得するに、github という変数では不足する場合、APIから取得することが検索すると出てくることもありますが、最近は gh cliを利用するとシンプルで分かりやすく記載できるので、おすすめです。

cli.github.com

Gitで 過去ログを簡単に編集するために設定していること

Git を利用して開発をしていると、PRを公開する前にcommit を綺麗にしようとする時がありますよね。

そういった場合、私は git rebase を利用します。そして、同時にパラメータを確認する必要があります。どこのコミットまで対象なのか。

そんなときに config.fish に設定している以下の alias が役に立ちます。

alias glog="git --no-pager log -n 20 --oneline | nl"

直近で20件のcommit を取得して、行番号をふって画面に出力されます。 以下のように。

$ glog
     1  f0bddae Update zzz
     2  7ae4e3a Update yyy
     3  09e70c5 Fix xxx
     4  b3bb7cb Update xxx
     5  6dc198b First commit

この行番号が、git rebase の引数に利用できます。

$ git rebase -i HEAD~[行番号]

ちょっとしたチップスですがgit log で出力された内容を目視でカウントするのは、1回であればちょっとのストレスですが日々の作業としてありますので、かなり効果的だと思います。

初めて、VS Code の extension を作ってみたよ

普段、Markdown でメモを取っています。仕事でもプライベートでも。

その時に利用しているエディタは、VS Code なんですが、以前は、bear.app という Mac のアプリを利用していました。

bear.app

その bear.app で Markdown の拡張された文法がいくつかあるのですが、その中で、::hoge:: といった形で記載するとマーカーとして利用ができるものがありました。

よく使っていたので、VS Code でも使いたいなと思って extension を探していたんですが、==hoge== というイコールを活用するものは見つかったんです。

github.com

しかし、私の好み的にコロンの方がいいなと思い、自作の extension を作ることにしました。

他の extension を参考にさせていただきながら、やり始めて2、3時間ほどで作ることができました。

それが、こちらになります。

marketplace.visualstudio.com

ほぼ、==hoge== の extension のパクリです。 やはり、markdown-it というライブラリの挙動やそのpluginの書き方などは、この短期間ではしっかりと把握することができなかったためです。

ただ、動くものが手元にできましたので、これからは動作を確認しながら、extension や markdown-it の挙動を確認して、次は、Markdown に画像を簡単に挿入できる extension を作りたいと考えています。

💻 8年ぶりに、MacBook Airを購入しました。あと最近、利用しているアプリとかの話

8年ぶりに家のマックを新しくしました。それまでは、2012年に購入した MackBook Airを使っていました。 2012のAirは、かなりへばっていたので買い替えたいと、3、4年前ぐらいか思っていたんですが、家庭もありなかなか10万円以上するものを購入する気になれませんでした。 それにMackBookは、コストパフォーマンスが悪い印象が強かったのも購入に踏み切れなかった理由の一つでした。

そこに、Apple Silicon が登場してYoutuberの方々のレビューを見る限り、コストパフォーマンス的にも買って良さそうだと思え、一番安い MacBook Airを購入しました。 今のところ、問題なく順調に利用できています。🎉

いい機会なので、最近利用しているアプリをメモがわりに残しておこうと思います。

🧑‍💻 Mac app系

CleanShot X for Mac

チャット系ツールやドキュメントを残す際に重要な物として、スクリーンショットが1つあると思っています。 スクリーンショットを撮って、手軽に編集できるというのは、毎日の生産性やコミュニケーションを効率的にすることにつながると思っています。

このアプリは有料ですが、動画も含めて手軽にキャプチャすることが出来て、使っていて気持ちもいいので、仕事用と自宅用のMacで2つライセンスを購入して利用しています。

cleanshot.com

Bartender 4 - Take control of your Menu bar

macの上部にあるメニューバーにアイコンが大量に出てしまっていて、小さいモニターの時にアプリのメニューに隠れてしまうということで困っていたので、使い始めました。 気に入っているのは、通常だとメニューに並ぶアイコンの順番は起動したアプリの順番に依存していますが、このアプリを利用するといつも決まった順番に指定することが出来て、なかなか重宝します。

www.macbartender.com

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

以前は、プライベートではBearというアプリを頻繁に利用していたんですが、なぜか段々と辛くなっていき利用しなくなってしまいました。 最近は、このNotionに乗り換えて使ってみて、なかなか気持ちよく利用出来ています。特にカレンダーの機能でそこにメモを残せていけるのが良いですね。 日々、勉強したことや読書したことを残しやすいですね。

www.notion.so

Alfred - Productivity App for macOS

Hot keyの設定などは、この Alfred に集約しています。あと、クリップボードの履歴を管理できるのもなかなか重宝しますね。

www.alfredapp.com

iStat Menus

mac の状態を把握するために導入しています。 アクティビティモニタはなかなか重いアプリだと思うので、このアプリの方が軽く動作してくれていいかなと思っています。

bjango.com

Vimium - Chrome ウェブストア

アプリではなく、ブラウザの拡張機能ですね。 Chrome ブラウザ上でなるべくショートカットキーで、操作したいと思って、導入してみました。まだ、使い方になれているわけではなく探っている段階ですね。

chrome.google.com

📟 Terminal 系

iTerm2 - macOS Terminal Replacement

ずっと、利用させてもらっているTerminal

iterm2.com

fish shell

2,3年前までは、zshを利用していましたが fish に乗り換えました。色々とハマるところがありますが、動作が軽いのが嬉しいですね。

fishshell.com

plugin manager としては、fisher を利用させていただいています。 github.com

GitHub - tmux/tmux: tmux source code

いまだに、お世話になっている。これがないとターミナル上でどう生活していいか分からない。

github.com

GitHub - jonas/tig: Text-mode interface for git

git の log を見る際は、やはりtig を利用することが多いですね。

github.com

welcome home : vim online

今まで、長いこと Editor としてはEmacs を利用していましたが、最近特殊なキーボードを使い始めた関係で、vimに乗り換えました。 最初は、慣れるまで汗垂らしながら、強制しましたが、今はかなり気持ちよく打てるようになってきたかなと思います。 なれてくると、全部 vimキーバインドで打ちたくなってきますね。

www.vim.org

Terraform で構築前に知っておいた方が良いと思われる機能の紹介

qiita.com

HashiCorpTerraform を利用して、よくインフラ層の管理を行っています。 理由としては、いくつか考えられるます。

  1. 様々な IaaS に対応しているので、Terraform での書き方が分かっていれば、学習コストなどを抑えて新しい IaaS の導入ができる
  2. HCL (HashiCorp Configuration Language) は、人が読みやすい設定ファイルで初めての人が読んでもなんとなく理解ができるので、複数人で管理するDevOpsの場面に向いている
  3. Terraform Module Registry で他人が書いたソースを導入することができコストを抑えると同時に、学習することができる

などなど、様々なことがあります。(同時にデメリットの部分ももちろんあります。)

そこで、これから Terraform を導入しようとする人向けに知っておくと良いのではないかと私個人が考えている機能をユースケース別に紹介したいと思います。 (基本的には、ドキュメントを読めば書いてあることですが。。。)

似たような環境でちょっとだけ差異がある環境を作りたいのだけど…

State: Workspaces - Terraform by HashiCorp

Workspaces という機能を利用することで、だいたいの需要は満たせると思います。 必要な環境があれば、 terraform workspace new コマンドを利用して作成することができますし、定義ファイル内では、${terraform.workspace} という変数が使えるようになりますので、この変数をうまく使って環境毎の差異を吸収するようにすると良いかと思います。

ただ、Workspaces ではある処理をスキップする書き方がスマートにまだ書けないという問題があります。無理やりやろうとすると、Meta-parameterscount を使って、ある workspace の場合だけ、 countを0にするという方法で実現できると思います。

同じプロバイダー(GCP, AWS, etc.)だけど、別の設定のものを使いたいのだけど…

Configuring Providers - Terraform by HashiCorp

Terraform は複数のプロバイダーに対応しており、alias というフィールドを Provider に定義することによって、同じプロバイダーも利用することが可能になります。 GCPなどを利用している際は、環境毎にプロジェクトを分けて対応することが多いですが、DNSなどはプロジェクト横断的に利用することも多く、この機能は重宝しそうです。

複数人で実行したいのだけど…

State: Remote Storage - Terraform by HashiCorp

Terraform では対象のインフラがどのような状態であるか、Stateファイルというものを使って管理しています。この機能は事前に差分を照会したりするので、重要なファイルです。ただ複数人で実行する際は、このファイルを共有する必要があります。デフォルトではローカルにこのファイルは保存されてしまいますが、Remote state という機能を利用すれば解決できます。

Remote state で利用できる各サービスは、以下のページに記載されています。 Backend: Supported Backend Types - Terraform by HashiCorp

私個人の意見としておすすめは、S3 です。理由としては、バージョニングの機能が提供されていること、Dynamo DB と連携して実行中のロック機能を提供することが可能という点です。

既に構築済みのものがあるのだけど…

Import - Terraform by HashiCorp

import 機能を利用することによって、現在のインフラのリソースの状態をstateファイルに反映しTerraformの管理下にすることが可能です。 ただ、全てのリソースに対応が出来ていないので、PRを送るか、手動でstateファイルを編集するなどが必要になる場面もあります。

操作ミスで消えてしまうリソースがあると困るのだけど…

Resource Lifecycle - Terraform by HashiCorp

特定のリソースは、ある設定が変更された際に、作り直しが必要なものが存在します。たとえば、AWS の ec2 のインスタンスuser data などは変更があるとインスタンスを削除し新しく構築が行われます。ただ、今回は Terraform の設定ファイルのみの編集だけを行いインスタンスの再作成は、実行してほしくないという場合、以下のような書き方が可能です。

resource "aws_instance" "web" {
  ami           = "ami-408c7f28"
  instance_type = "t1.micro"
  user_data = "${template_file.userdata.rendered}"
  lifecycle {
      ignore_changes = ["user_data"]
  }
}

その他にも、lifecycle では削除することそのものを防ぐことも可能です。

さいごに

いくつか個人的に紹介したい機能を紹介させていただきました。 他にも様々な場面で有効な機能が存在します。 Terraform はインフラ系のエンジニアだけのツールではなく、様々なエンジニアとインフラ層を近づけてくれるツールだと思っています。 ちょっとでもインフラに興味があるエンジニアであれば、触ってみてください。

gRPC とは何か メモ

用語としては、ずっと前から知っていたが具体的にどのように、どのような利点があるのかなどが分かっていなかった。書籍の SRE の中でも Googleロードバランサーのシステム内で、この gRPC を利用しているとあったので、興味を持ったのでちょっと調べることにしたので、ブログに簡単にまとめておく。

www.amazon.co.jp

続きを読む