リモートワークのコツ

所属している会社が全社レベルの在宅勤務中で、現在3週間目である。僕はその前から割と自宅で仕事をしているので、リモートワークするコツを書いておく。

普段と同じルーティーンで生活する

在宅勤務だと通勤がないため、ギリギリまで寝て、起きたらそのまま仕事ということがあるかもしれない。しかし、個人的にはいつもと同じルーティーンで行動するのが良いと考えている。僕の場合は朝食をちゃんと食べてシャワーを浴びて、髭剃りなどをする。オフィスに行く日と同じ行動をすることで、自宅にいても仕事モードに切り替えることができる。在宅勤務だと1on1やミーティングでビデオカンファレンスを使うことが多い。家で仕事をしているからといって、休日のような見た目だとお互い気も入らないし、音声だけだとコミュニケーションに必要となる情報が落ちてしまい、仕事がやりにくくなると考えている。

歩き回る

在宅勤務していると思ったより動かない。ずっと座って仕事をしていると体が鈍るし疲れ切ってしまう。そこで、意識して立ったり少し歩いたりしている。AppleWatchだと定期的に歩行を促してくれるので、それを使うこともある。コーヒーを買いにコンビニやカフェまで散歩することもある。リモートワークだとPCの前に張り付いていないといけない気がしてくるが、オフィスにいても少し散歩したりコンビニに行ったりはするので自宅でも同じようにすれば良いと思う(離席していることがわかるようにしておくとGood)。

Slackで雑談する / 反応速度を上げる

リモートワークだと、どうしてもコミュニケーションの量は減る。他愛のない雑談からアイデアが生まれたり、気分転換になったりすることもあるだろう。そこで、少しだけ意識してSlackで雑談をするようにしている。とはいえ、Slackで会話ばかりしていても仕事は進まない(特にコードを書くような仕事はそうだね)ので、メリハリが大事だろう。

また、SlackやGithubでメンションをもらった時の反応速度は意識して上げるようにしている。リモートだと状況が見えないので、気づいていないのか、気づいてるけど後に回しているのかなどがわからず不安になる可能性があるかもしれない。ミーティングなどでどうしても手が空いていない時を除き、まずは返信して見ていることを伝えることが大事だと思い、出来るだけ早く反応することを心がけている(できないことも多いけど)。

作業環境を整える

作業用のデスクとチェアを専用に用意して、生活空間からは見えにくい場所に置いている。リモートワーク云々とは別に、個人的にコードを書いたり現像したりと作業するときに使うために用意していたものを使っている。また、ビデオカンファレンスもやりやすいよう、カメラから見える範囲に生活空間が含まれないようにも工夫している。

オフィスと同等レベルの作業環境を整えようとするとかなり金銭的な負担も大きい(まずスペースが必要だし、デスクにチェア、モニター、ネット回線など色々必要となるだろう)ので誰にでも薦められるものではないが、参考となれば幸いである。

おわりに

他にもコツがあれば書き足していこうと思う。あなたのリモートワークのコツは何ですか?

「Kubernetesで実践するクラウドネイティブDevOps」のレビューをした

2020年2月19日に「Kubernetesで実践するクラウドネイティブDevOps」という書籍が発売されるのだが、レビュアーとしてお手伝いした。レビューとはいえ、雑誌ではない商業誌に関わったのは初めてなのでいい経験ができたと思う。ぜひ読んでみてください。

Kubernetesで実践するクラウドネイティブDevOps
John Arundel Justin Domingus
オライリージャパン
売り上げランキング: 1,870

GolandのSplitterをキーボードからリサイズする

Goland、というかJetbrainsIDEはデフォルトだとSplitterのリサイズをするにはマウスを使うしかない。しかし、Tab Shifter というプラグインを使うとSplitterのリサイズをキーボードからできるようになる。

僕はキーマップを以下のように変更していて、Tmuxのresize-paneと揃えている。これによりTmuxを使っている時とGolandを使っている時で同じ体験を得ることができる。

Stretch Splitter Down⌥ z
Stretch Splitter Left⌥ ,
Stretch Splitter Right⌥ .
Stretch Splitter Up⌥ a

なお、このキーマップは https://github.com/ssh0/dotfiles/blob/master/tmux/tmux.conf を参考にした。

沖縄に行ってきた

沖縄県の名護でHerdening2020BOというイベントが開催されるので行ってきた。イベントの内容については所属している会社のブログに書くので、ここでは綺麗な景色や行った場所について書いていく。

イベント会場が万国津梁館でリゾート地なので宿泊場所もそれっぽくなり、今回泊まった部屋は窓から海が見えるというロケーションだった。テラスでビール飲みながらダラダラしたかった…

会場の万国津梁館に向かうとこんな感じ。周囲にはロッジが点在していて、いい雰囲気。

なんでもない長椅子から見える景色がいい。ずるい。

Herdening競技が8時間あるのでどうなるかわからなかったけど、なんとか夕日を見ることができた。ここは朝日も夕日もみえてよいね。

チームメンバーとペンションで交流していたところに猫が。ペンションの客からご飯もらってるのかなあ。iPhoneのポートレートモードで撮ったけど、ブログとかに載せるなら十分だねえ。

2日目もいい天気で、ホテルから歩いて会場まで向かう。30分弱、のんびり移動。昼休みが長めだったので1日目にはできなかった付近の散策をする。これはブセナテラスホテル。良い場所にあるなあ。

海底展望台なるものがあるらしく、こんな感じで橋で灯台みたいなところまで歩いて行ける。しかし水の色が綺麗。今日は少し濁っていたらしいけどそれでこれか。

自動車で移動していたので沖縄に来てからお酒は飲んでなかったのだけど、2日目は徒歩移動したのでパーティではビールなどをいただいた。ヘリオス酒造のクラフトビール。泡盛もめちゃ美味しかった。

これはホテルに戻ってから食べたアイス。

Herdeningの翌日は日曜だったので、せっかくということで美ら海水族館へ。天気が下り坂で曇ってしまった。

屋内なら関係ないぜ、と満喫。大水槽すごすぎる…

やー、名護いいね。この季節だと泳ぐのは厳しいと思うけど、のんびりするのにはむしろちょうど良いかもしれない。次来るときは完全にオフで来たいなあ。

Go製ソフトウェアのCIやリリースをGithubActionsで行う

Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり を読んで、自分もどうやっているのか書いておこうと思ったので書く。

CIでテストを実行する

これはまあ、素朴にやる。テスト自体はMakefileに隠蔽しておくと手元でもCIと同じテストを実行できて便利。

---
 name: CI
 on: [push]
 jobs:
 
   run_test:
     name: Go Test
     runs-on: ubuntu-latest
     steps:
 
       - name: Set up Go 1.13
         uses: actions/setup-go@v1
         with:
           go-version: 1.13
         id: go
 
       - name: Check out code into the Go module directory
         uses: actions/checkout@v1
 
       - name: Run Test
         run: |
           make test

タグを打ってリリースする

masterブランチに対してタグを作成すると、Actionsで自動的にリリースされるようにしている。

 ---
 name: Release
 on:
   create:
     tags:
       - v*.*.*
     branches:
       - master
 
 jobs:
   release:
     name: Release on GitHub
     runs-on: ubuntu-latest
     steps:
       - name: Check out code
         uses: actions/checkout@v1
 
       - name: Validates GO releaser config
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: check
 
       - name: Create release on GitHub
         uses: docker://goreleaser/goreleaser:latest
         with:
           args: release
         env:
           GITHUB_TOKEN: ${{secrets.GORELEASER_TOKEN}}

リリースにはGoReleaserを使っている。これはtakaishi/kelmの.goreleaser.yaml。バージョンの埋め込みなども行なっている。

 # This is an example goreleaser.yaml file with some sane defaults.
 # Make sure to check the documentation at http://goreleaser.com
 before:
   hooks:
     # you may remove this if you don't use vgo
     - go mod download
     # you may remove this if you don't need go generate
     - go generate ./...
 builds:
   - env:
       - CGO_ENABLED=0
     ldflags:
       -X github.com/takaishi/kelm/config.Version={{.Version}}
 archive:
   replacements:
     darwin: Darwin
     linux: Linux
     windows: Windows
     amd64: x86_64
 checksum:
   name_template: 'checksums.txt'
 snapshot:
   name_template: "{{ .Tag }}-next"
 changelog:
   sort: asc
   filters:
     exclude:
       - '^docs:'
       - '^test:'
 brew:
   github:
     owner: takaishi
     name: homebrew-fomulas
   commit_author:
     name: goreleaserbot
     email: goreleaser@carlosbecker.com
   description: "CLI tool to Generate and insert markdown's table of contents"
   homepage: "https://github.com/takaishi/kelm"
   install: |
     bin.install Dir['kelm']
   test: |
     system "#{bin}/kelm"

このように、環境ごとのアーカイブファイルやチェックサム、チェンジログを作ってくれる。Homebrew用のfomulasも更新する機能があって便利。

コンテナイメージをビルドする

ソフトウェアによってはコンテナイメージをビルドしたいことがある。この場合も、ActionsでビルドしてDockerHubにプッシュしている。これはtakaishi/openstack-sg-controller の例。

 ---
 name: Docker Image CI
 on:
   push:
     tags:
       - v*.*.*
 env:
   DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN}}
 jobs:
   build:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v1
       - name: Build the Docker image
         run: |
           tag=$(echo ${{ github.ref }} | sed 's/refs\/tags\///g' | tr -d '\n')
           docker login -u rtakaishi -p $DOCKER_HUB_TOKEN
           docker build . --file Dockerfile --tag rtakaishi/openstack-sg-controller:${tag}
           docker push rtakaishi/openstack-sg-controller:${tag}

タグの作成はlinyows/git-semvを使っている

linyows/git-semv というgit pluginがあって、これを使ってタグを作っている。major/minor/patchのタグ作成以外にもpre-releaseタグの作成ができたりして便利。

課題:リリース時にChangeLogをどう作るか

今の方法だとコミットログが羅列してあるだけなので、ちょっと読みにくいかなあと思っている。また、PullRequestがある場合はそちらの情報を表示したい。CHANGELOGファイルに自動追記されると変更を追いかけやすくて嬉しいと思うが、どうやるのがいいのか悩み中である。