アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

GAFAより身近なスーパーエンジニアから学ぶ「Engineers in VOYAGE」まとめ

「Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち」は、VOYAGE GROUPのソフトウェアエンジニアたちが事業を成長させてきた奮闘について、テスト駆動開発の和田卓人さんがインタビューするという形で書かれています。

Googleやアマゾンなど、いわゆるGAFAと呼ばれる高度なテック企業の成功事例はWebでたくさん見つけることができますが、これらは参考にはなっても自社で実践できるかと言われると難しいことが多いです。

一方、この本に登場する事例は、日本のWeb企業で働くソフトウェアエンジニアにとってどれも「あるある」と思えるもので、そしてその気になれば明日からでも実践できるほど身近なものばかりです。

このエントリでは、「Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち」の中から印象に残った点をまとめます。

続きを読む

Elixir DateTime型での日時の大小比較に比較演算子(不等号)を使ってはいけない

f:id:otoyo0122:20201114105315p:plain:w300

いくつかの広く普及しているプログラミング言語において、日時型同士の比較に比較演算子 (==>など) を使うことはよくあります。

しかし、Elixirでは日時型の比較に比較演算子を使うと思いもよらない結果になります。下記の例を見てください。

iex> dt1 = %DateTime{calendar: Calendar.ISO, day: 12, hour: 0, month: 1, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC", microsecond: {878630, 6}, minute: 57, second: 59}
#DateTime<2017-01-12 00:57:59.878630Z>
iex> dt2 = %DateTime{calendar: Calendar.ISO, day: 12, hour: 0, month: 1, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC", microsecond: {481183, 6}, minute: 58, second: 2}
#DateTime<2017-01-12 00:58:02.481183Z>
iex> dt1 <= dt2
false

Elixirにおいて構造体は特殊なマップであり、日時を表すDateTimeも例外ではありません。

そのためDateTimeの比較にはDateTime.compare/2を使わなければなりません。

iex> DateTime.compare(dt1, dt2)
:lt

Elixir リストをマップに変換する方法(List to Map)

f:id:otoyo0122:20201114105031p:plain:w300

プログラミングにおいて、連想配列のリストをなんらかのプロパティをキーにした連想配列に変換したいということはよくあります。

ちょうど下記のようなイメージです。Elixirにおける連想配列はMapですね。

# before
users = [
  %{id: 1, name: "foo"},
  %{id: 2, name: "bar"},
  %{id: 3, name: "baz"},
]

# after
user_map = %{
  1 => %{id: 1, name: "foo"},
  2 => %{id: 2, name: "bar"},
  3 => %{id: 3, name: "baz"},
}

このエントリでは、Elixirでマップのリストをマップに変換する方法を紹介します。

続きを読む

GitHub コードレビューでサジェスション機能を使って差分を提案しよう

f:id:otoyo0122:20201109133251p:plain:w300

GitHubを使ったチーム開発では、コードレビューの際に「ここはこう書いた方が良いと思います」といったコミュニケーションがよく発生します。

そんなときはGitHubの差分のサジェスション機能を使うと、そのままコミット可能な差分を作成できるので便利です。

f:id:otoyo0122:20201109133049p:plain:w400

このエントリでは、GitHubのサジェスション機能を簡単にご紹介します。

続きを読む

NeoVim denite.nvimで自動プレビューするための設定紹介(auto preview)

f:id:otoyo0122:20201107135836p:plain:w300

denite.nvimを使うとファイル検索やgrepの使い勝手が劇的に向上します。

さらに下記のスクショのように、ファイル検索やgrep実行時のdenite-filter画面でプレビューを表示すると、使い勝手が良くなるのでおすすめです。

f:id:otoyo0122:20201107113312p:plain:w600
フローティングウィンドウで左側にgrep結果、右側に周辺のプレビューが表示される

そこでこのエントリでは、denite.nvimでフローティングウィンドウを使って自動プレビューするための設定を紹介します。

続きを読む

Vim 目にやさしいカラースキーム「Iceberg」をTrue Colorで使うための設定

f:id:otoyo0122:20201103152027p:plain:w300

職人が道具を大切にするように、プログラマも最高のパフォーマンスを発揮できるようエディタにこだわりと愛着を持つことは大切です。

Vimでのこだわりのひとつにカラースキームがあります。

カラースキームは単に見た目がかっこいいだけでなく、typoに気付きやすくしてくれたり、ディスプレイと長時間向き合うことによる眼精疲労を抑えてくれたりします。

f:id:otoyo0122:20201103151420p:plain:w400
Icebergカラースキームはかっこよくて目にやさしい

このエントリでは、目にやさしいだけでなくクールでかっこいいIcebergカラースキームを紹介し、カラースキームの良さを最大限活かすためのTrue Colorの設定方法を紹介します。

続きを読む

NeoVim ファイル検索もgrepもサクサクdenite.nvimの設定と使い方

f:id:otoyo0122:20201030091626p:plain:w300

Vimでファイル名をあいまい検索したり、ファイルの中身をgrepしたいと思ったときに、まず候補に上がるのがdenite.nvimだと思います。

denite.nvimを使えばファイルを開いたりgrepするだけでなく(私はそこまで使いこなせていないですが)カスタマイズしてもっといろいろなことがVimでできるようになります。

ちなみに、denite.nvimとよく比較されるプラグインとしてfzf.vimがありますが、fzf.vimはgrepすると頻繁に固まってしまったので個人的には安定してサクサク動くdenite.nvimがおすすめです。

そういうわけで、このエントリではNeoVimにdenite.nvimを導入する際の極めて個人的なおすすめの使い方と設定を紹介します。

続きを読む