Thanks Driven Life

日々是感謝

2021年ふりかえり

昨年はお世話になりました。

仕事

引き続き SmartHR でやっております。

実は入社(2017年)以降、毎年*1年末調整機能開発を担当しておりまして、2021年もやっていました。その縁もあり、suzuri で年末調整関連グッズ(非公式)を出しています。是非お手にとっていただければ*2

配偶者控除がわかる奴 書類の歴史がわかるやつ
suzuri.jp
suzuri.jp

プライベート

引越ししました。新宿区から江東区へ。

初めての引越し*3だったので大変でした。そのリターンとして部屋が広くなったので、仕事環境(リモートワーク)と寝室がいい距離感となって、入眠に良い影響が出てきています。やはり空間は大事……

健康

2020年は良かったのですが、2021年で崩れました。2022年にまた良い結果が出せるようにがんばっていきます。

食事

基本は UberEats 使いまくり侍なのですが、前項のこともあり自炊していくぞーという気持ちが高まってストウブを購入しました。

何度か使った感想としては「便利&美味しい」なので、適度に自炊をやっていきたいです。

ゲーム

スマホ

前5つは昨年から引き続きプレイしています。2021年はやはりウマ娘の登場でしたね。僕はナイスネイチャ推しです。

据置き

  • Horizon Zero Dawn
    • 続編 (Horizon Forbidden West) が出ると聞いて、それじゃあやってみようかなと
    • 面白かった。続編にも期待
  • HADES
  • テイルズオブアライズ
    • ザ・王道というか、気持ちのいいストーリーでした。アクションもかっこよかった
    • 裏ダンジョンであの二人が共演していたのを見れただけでも満足
  • ゼルダの伝説 スカイウォードソード HD
    • なんかもう、よかった
    • ちなみにヌンチャクは使わずにずっとProコンモードでした

*1:2020年だけは別チームだったのですが、いろいろあって一ヶ月だけ年調開発に参加していたので、実質毎年やっています

*2:私への売り上げ(トリブン)は0円に設定しているので、収入とかは無いです

*3:前回は実家からの上京なので、引越し業者とやりとりしたり、退去的な作業は初めてだった

GitHub CLI 2.0 以降で gh pr checkout する時に使っているエイリアスやシェル関数

TL;DR

git alias 編

コード ( .gitconfig )

[alias]
  fpr = "!f(){ gh pr checkout $1 -b pr$1; }; f"

デモ

git alias で定義した gh pr checkout コマンドを実行している様子

shell function 編

コード

#!/bin/sh

gh_pr_checkout_peco() {
    (
        selected_number=$(gh pr list | peco | cut -f 1)
        if [ -n "${selected_number}" ] ; then
            gh pr checkout "${selected_number}" -b "pr${selected_number}"
        fi
    )
}

デモ

gh pr checkout と peco コマンドを組合せた様子

経緯

  • GitHub CLI 便利
    • gh pr checkout 便利
  • checkout (pull) したあとのブランチ名は Pull Request の番号を持たせたかった
    • (例) org/repo/pull/1234 だったら pr1234 っていうブランチ名にしたい
    • GitHub CLI 1.x まではコマンド1撃でできなかったけど、2.0 からは -b (--branch) が 搭載されて嬉しかった
  • せっかくなので peco と組み合わせようと思った
    • いろんな人が既にやってくれていたので、だいたいパクりました

おまけ

shell function のものは ShellCheck を pass しているので、gh や peco をインストール済みであれば、だいたいどこでも動くはず

参考

チェアマットと椅子のキャスターを買い替えた

チェアマット

f:id:gongoZ:20210809173441p:plain
チェアマットを敷いている様子

経緯

最近引越した影響でひたすら散財しています。これもその1つで、もともと使っていたものは既に疲弊しきっていたため、この機会に買い替えるぞという気持ちになりました。

買ったやつ

いろいろ探した結果、なんかシュッとしていたのでこれにしました。

www.vanilla-chair.com

足触りがよくて結構好きです。

椅子のキャスター

ついでに椅子のキャスターも交換しました。

f:id:gongoZ:20210809174009p:plain
チェアマットの上に椅子を載せている様子

この椅子は kaggレンタル でレンタルしているもの*1ですが、レンタル時に「フローリング用のキャスターを装着してくれ」というオプションにしていました*2。(前述の)旧居で使っていたチェアマットぐらいであれば問題なかったのですが、今回用意したやつだとかなりブレーキがかかってしまい、ふと椅子をずらしたい時にも結構な引っ掛かりが発生してそこそこストレスでした*3

というわけで本来初期装備である「カーペット用のキャスター」を購入し、装着しました。滑りが良くなっていい感じです。このままフローリングに飛び出さないように気をつけます。

*1:https://www.kagg.jp/office-chairs/hermanmiller/272349/961775/

*2:結局フローリングで生のまま使うことはほぼ無かった

*3:腰を浮かせれば問題ないのですが、ふとずらしたい時にまで意識は届きづらく

2020年ふりかえり

来年もよろしくお願い致します

仕事(業務)

引き続き SmartHR でやっております。

仕事(環境)

コロナ禍ということで3月末からリモートワークが始まりました。

shanaiho.smarthr.co.jp

これまでは自宅にこたつ机+座椅子しかなく、このままでは腰が爆発するだろうと想い、この機会にいろいろしました*1

before after*2
f:id:gongoZ:20200409190931j:plain:w400 f:id:gongoZ:20200410112815j:plain:w400

健康

10月頃まではイケイケでしたが、最近いろいろあってまた体重が増えてきました。 最近フィットボクシング2も購入したので、来年になったら本気出します。

食事

コロナ禍ということで外食の回数が激減し、代わりに UberEats が増えました。 そればかりだと健康が死ぬなと思い、時折自炊を挟みつつ、定期宅食サービスを契約して日々を過ごしています。

自炊は、だいたいカレーです

gongo.hatenablog.com

技術

プライベートではほとんど何もしていない一年でした。毎年の Emacs Advent Calendar も今回はネタが出せず不参加。

ゲーム

あいかわらずスマホゲーが中心です。去年から始めた メギド72は最近は手付かずで、代わりにDQウォークを始めました。

据置きゲーとしては以下をプレイしました。

アニメ・映画

  • ヴァイオレット・エヴァーガーデン
    • 「へぇ映画やるんだ。映像綺麗だな。試しにアニメ見てみますかねー」と軽い気持ちで Netlifx で見始めたらめちゃくちゃハマった
    • 泣きたい時に見ると良さそう
  • 鬼滅の刃
    • 漫画 & アニメともに未読状態で無限列車編から参入したところ、これもハマりました
    • 言ってしまえば Ufotable 最高
  • GREAT PRETENDER
    • なんかこう、良かった

*1:リモートワーク環境を整えるための支給があったりしました https://shanaiho.smarthr.co.jp/n/n3853908ba226

*2:4月時点での写真。今はもうちょいゴチャゴチャしている。マット敷いたり

*3:https://news.yahoo.co.jp/byline/konnoharuki/20200928-00200433/

*4:弁当の大きさと自宅の冷凍庫のサイズの関係上、一度の配達で数がなかなか増やせなかった + 送料ちょい高

データモデルをチームメンバーに共有する時に TypeScript の型定義風にしている話(お試し中)

SmartHR Advent Calendar 2020 の3日目です。

本記事の概要

例えばこういう感じでテーブル設計(物理データモデル)したものを

f:id:gongoZ:20201201192641p:plain

エンジニア含めデザイナーやプロダクトマネージャー(以下、PdM)に共有する論理データモデルは、以下のように TypeScript の型定義風にして共有するみたいなことをやってみている、というお話です。

type UUID = string

type Book = {
  id: UUID
  authorId: UUID
  publishedAt: Date
}

type Author = {
  id: UUID
  name: string
  penName: string | null
}

またはこんな感じ

type UUID = string

type Book = {
  id: UUID
  author: Author
  publishedAt: Date
}

type Author = {
  id: UUID
  name: string
  penName: string | null
  books: Book[]
}

TypeScript 風なので、なんだったらこれでも OK

type 書籍 = {
  id: uuid
  著者: 著者
  出版日: Date
}

type 著者 = {
  id: uuid
  氏名: string
  ペンネーム: string | null
}

補足

  • SmartHR 全体の開発フローとして採用(試用)しているものではありません。個人的な活動です 👍
  • この施策で何が変わったかとかまでは書いてないです。まだ始めたばかりなので 💪

経緯

1. 前提

SmartHR における開発の流れは、ざっくりこうなっています(本当にざっくりです)。

  1. なんやかんやあって、スタート 🏁

  2. 抽出されたユーザーストーリーから、PdM が *1 概念データモデル を作成する

    f:id:gongoZ:20201203003813p:plain

  3. チームメンバーでレビューしていく

  4. 設計していくぞー

  5. エンジニアが 物理データモデル を作成(テーブル設計)する

    f:id:gongoZ:20201201192641p:plain

  6. チームメンバーでレビューしていく

  7. 開発していくぞー

  8. なんやかんやあって、リリース 🎉

今回は 5 〜 6 のお話です。

2. 発端

ある日、とある新機能開発のテーブル設計をチームメンバーに共有する機会がありました。 ERD を見てもらい、共有会は無難に進み、なんやかんやありながらも最終的に GoGo の方針が固まりました。

その過程で、とあるメンバーとこういったやりとりがありました。

👳‍♀️ = 僕
👤 = フロントエンジニア

---

👳‍♀️ 「というわけで、こんな感じのテーブルにしようと思います」

    authors テーブル:
        t.string :name, null: false
        t.string :pen_name
        t.timestamps

    books テーブル:
        t.string :author_id, null: false
        t.datetime :published_at

👤 「null: false ってなんですか?」
👳‍♀️ 「データベースの NOT NULL 的なやつの ActiveRecord::Migration での記法ですね!」
👤 「ついてないやつは Nullable?」
👳‍♀️ 「です!」
👤 「t.timestamps って何ぞや」
👳‍♀️ 「created_at と updated_at を同時に生み出してくれるすごい奴です」
👤 「拝承」

何気ないやりとりでしたが、後日あらためて考えた結果、あまり私の共有の仕方が良くなかったなと思い至りました。

  • Ruby on Rails に(この時点ではまだ)不慣れだったメンバーを含めた共有会で、この見せ方は逆にわかりづらい
    • いずれは慣れていってもらうというのが理想系だが、そもそもスタートに見せる形ではなかった
    • そもそも詳細な実装については、このあとのコードレビューで見てもらうことになっている
    • スタートとしては、まずは認識の誤差を埋めるために イメージしてもらいやすい形 にすべきだった
  • 「どうせこのまますぐコードに写して commit するしな」みたいな気持ちで横着していた
    • どうせ詳細に書くなら SQL で書けば良かった
    • とはいえ、あまり物理層に近い書き方をすると、やはりそれもイメージしづらい形かもしれない

詳細な実装方針とか、言語としての仕様とか、いろいろな作業フェーズで必要な情報は変わってくると思います。 それでいうと、今回の発端となったフェーズでは

今から私たちが作ろうとする機能は、どんなデータを扱うのか

といった、より概念レベルでの、なんというか 身に沁みやすいもの で共有できるといいのだろうなと考えました。

TypeScript の型定義記法を選択した理由

特に深い意図はなくて、単純に「周りにそれを理解できる人が多かったから」です。

元々のきっかけとなった話し相手がフロントエンジニアだったということもあり

👳‍♀️ 「そういえば僕たちは TypeScript を使っています」
👤 「はい」
👳‍♀️ 「↓ こうじゃなくて……」

    authors:
        t.string :name, null: false
        t.string :pen_name

👳‍♀️ 「↓ これならどうよ」

    type Author = {
      name: string
      penName: string | null
    }

👤 「わかりやす! 特に `string | null` あたり」
👳‍♀️ 「なるほど。僕もそう思っていました」
👤 「せやったか」

TypeScript 風で良さそうだな? という気持ちになってきました。


また、デザイナーやPdM も、情報設計を TypeScript 風に記述していたことが判明しました。

新機能追加や改修のための概念データモデルを作成する際にも、既存のテーブル構成に対して積み重ねているため、この時点で既に TypeScript 風になっていると楽してもらえそうだなと考えました。


つまり

f:id:gongoZ:20201203021601p:plain

👳‍♀️ 「みんな TypeScript いけるじゃん! これにしよ!!」

まとめ

(論理)データモデルの共通言語として TypeScript は結構書き心地が良いなと感じました。

気合いが入っている時は図でしっかり書いた方が視覚的にモチベーションが高まりやすいこともあるので、ある程度いい感じに選んでいければと考えています。

今回の試みはまだ試行回数が少ないので何とも言えませんが、これをきっかけとしていい感じになっていけば嬉しい。嬉しい。

*1:"ユーザーストーリーをどのように実現するのか、デザイナーおよびエンジニアと仕様を検討します。概念データモデルの作成や、ワイヤの作成など、作るために必要な仕様の具体化を行います。" https://tech.smarthr.jp/entry/2020/01/23/141628

フォームローラーを使い始めました

f:id:gongoZ:20201027130732j:plain

毎日グリグリして一ヶ月以上経過しました。体の好調度が増した気がします。

※ 使う時はヨガマットを敷いています

経緯

一ヶ月前、会社の Slack ワークスペースでこんな発言をしました。

f:id:gongoZ:20201027130906p:plain

これ以前から、寝起き直後や仕事終わり後の体バキバキ状態をなんとかしたいなと思っていました。 特に肩や首周りは日常的に死んでおり、(最近は更新していませんが)フィットボクシングやリングフィットアドベンチャーを続けていなければ更に破壊されていたのではないかと思えるぐらいです。

そんな中、上の発言後に同僚から「これめっちゃいいですよ」と教えてもらったのが、フォームローラーでした。

amzn.to

「筋膜リリース」というワード自体は何度か耳にしたことがあり、とはいえ「筋膜をリリースってなんやねん」と思ってこれまでは手を出していませんでした。が、せっかくお勧めされたのでこの機会にやってみるかーとやってみました。

効果

ここからは完全に雰囲気の感想です。

  • 肩や首周りの、なんかこう稼動域が広がった気がする
    • 動かしづらいとか、なんか詰まってる感っていうのが柔らいだ
  • 背中がすごいスッキリする
    • 背中こんなに凝ってたのかってぐらい
    • なので、使い始め当初は動かしづらくてそこそこ痛かった
    • 今は気持ちいい
  • 時間はそんなに取られないため、気軽にできる
    • 仕事中に「ちょっと体固まってきた気がするから、ちょっとやるか」みたいな
    • そういう意味ではリモートワークのこの環境も適していたと言えるかも

とりあえず「良き」という感想です。

参考にした動画

「どうやって使えばいいんだ?」「効果的な動きは?」といったことについては、これも同僚から勧められた、以下の Youtube チャンネルが参考になりました。

www.youtube.com

チャンネルの中で、僕が普段のルーチンにいれている奴は以下の奴です。いろいろ合体しているやつなので便利。

www.youtube.com

まとめ

フォームローラーを習慣付けした結果、「それでも肩甲骨が痛くなったら、前日暴食しすぎて肝臓に負担がかかったんだな」って原因の切り分けが可能となりました。

PHPerKaigi 2020 に参加 & register_globals についてトークしました

phperkaigi.jp

経緯

新卒の頃から携わってきた PHP。しかし書かなくなって数年が経過し、そんな僕が PHP にできる恩返しといえば、 register_globals についての記録を後世に伝えることだと日々考えていました。

こんなこともあり、後日 PHPerKaigi の存在を知ったので、Proposal を出してみました。

発表資料

speakerdeck.com

YAPC::Asia Tokyo 2015 で発表した時 の内容と基本的には同じですが、加えて register_globals の歴史みたいなものも記載しました。昔話として読んでいただければ幸いです。

参加者としての感想

さらっと

  • そういえば PHP 系?のカンファレンスに出るの始めてかも
  • ビールがデプロイされる時刻が他イベントよりかなり早い気がした
  • PHPer Kaigi ということで、PHP そのものよりも PHPer がどうやって生きているかみたいな話が多かった
  • 長谷川カスタムバーガー美味しかった
  • トレーディングカードありがとうございます!
  • ゲリラLTで10分ぐらい喋ってる方がいて、後続の人の分が無くなってちょっと残念
    • ゲリラだしちゃんとしたレギュレーションも無かったと思うので、まあそういうものかという感想
  • Tシャツやパーカーは痩せたら着ます

おわり

おつかれさまでした!