homie Tech Blog | homie株式会社エンジニアブログ

homie株式会社エンジニアによる不動産テック領域のプロダクト開発を支える技術や取り組みについて発信しています。

【Golang/Go言語】Goのホットリロードライブラリをrealizeからairに移行しました

f:id:pointenko:20210105150323p:plainはじめまして

homie株式会社のエンジニア池見です。

先日、Goのホットリロードライブラリをrealizeからairに移行したので、移行した理由やairについて調べたことを記載します。


realizeからairに移行した理由

今までの開発において、ホットリロードライブラリにはrealizeを使っていました。 しかし、メンテナンスが止まっており、issues/253のようなエラーでハマることがありました。 他のライブラリを調べたところ、airというライブラリが現在も開発されており、star数も多かったので、こちらを利用することにしました。 github.com

docker imageも用意されています。

airのメリット

airGithubリポジトリをざっと見て、以下のメリットがあると思いました。

  • 設定ファイルの記述が簡単
  • build/binaryコマンドをカスタマイズできる
  • air起動後に作成したディレクトリも監視できる
  • ログが色付けされていて見やすい

airの導入方法

以下のようなサンプルを用意して説明します。

$ tree -a         
.
├── .air.toml
└── main.go

0 directories, 2 files

main.goは以下の通りです。

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("HelloWorld\n"))
    })

    http.ListenAndServe(":8080", nil)
}

1. airのインストール

$ go get -u github.com/cosmtrek/air

2. airの設定ファイル(.air.toml)作成

$ touch .air.toml

基本的に公式のサンプルファイルair_example.tomlを参考に、自身の環境に合わせて設定します。

今回はair_example.tomlをほぼそのまま流用します。

# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main ."
# Binary file yields from `cmd`.
bin = "tmp/main"
# Customize binary.
full_bin = "./tmp/main"
# Watch these filename extensions.
include_ext = []
# Ignore these filename extensions or directories.
exclude_dir = ["tmp"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# Exclude unchanged files.
exclude_unchanged = true
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true

設定項目は難しくなく直感で分かると思います。

重要な項目を簡単に説明します。

1. cmd

アプリケーションをコンパイルするコマンドを記述します。

[build]
//...
cmd = "go build -o ./tmp/main ."
//...

makeコマンドも使えます。

cmd = "make build"

2. bin

cmdでbuildしたbinaryのpathを指定します。

[build]
//...
bin = "tmp/main"
//...

3. full_bin

アプリケーションの起動方法を設定できます。 例えば以下のように起動時に環境変数や引数を渡すことができます。

[build]
//...
full_bin = "APP_ENV=dev tmp/main foo"
//...

4. tmp_dir

airのログファイルが出力されるパスです。ビルド生成物置き場としても使用できます。

air起動時に作成され、終了時に削除されます。

[build]
//...
tmp_dir = "tmp"
//...

5. exclude_dir

exclude_dirは、監視対象外のディレクトリを指定します。

[build]
//...
exclude_dir = ["tmp"]
//...

6. delay

delayコンパイルの実行タイミングを遅らせることができます。 ファイルを頻繁に変更する場合に、コンパイル回数を減らすのに役立ちます。

[build]
//...
delay = 1000 # ms
//...

アプリケーションの起動

airコマンドで起動できます。

$ air

  __    _   ___  
 / /\  | | | |_) 
/_/--\ |_| |_| \_  // live reload for Go apps, with Go 

mkdir /Users/ryoikemi/work/air_sample/tmp
watching .
!exclude tmp
building...
running...

リクエストを飛ばすとレスポンスが返ってきます。

$ curl localhost:8080
HelloWorld

main.goHelloWorldGoodbyeWorldに変更してみると、再コンパイルされます。

main.go has changed
building...
running...

レスポンスも変わっています。

$ curl localhost:8080
GoodbyeWorld

まとめ

  • realizeはメンテナンスされてなく、開発中にバグを踏んで生産性低下の原因になる
  • realizeの代替手段としてairが良さそう

GolangでTwiMLを生成するライブラリを作った話

f:id:pointenko:20201223172243p:plain はじめまして

homie株式会社でエンジニアをやってる石橋(@b0941015)と申します

この記事は、twilio Advent Calendar 2020の18日目の記事です

qiita.com

弊社ではHOTLEADという不動産営業における支援ツールを作成しています

homie.co.jp

このHOTLEADというプロダクトでは、反響と呼ばれる問い合わせメールからお客様と会うまでのアポイントメント数を最大化するための一次対応を行っています

エンジニアリングとコールセンターの力を最大限発揮し、お客様にも導入したクライアント様にもメリットを提供できるようなプロダクト開発に日々取り組んでいます

今回はコールセンターを構築するにあたってTwilioの導入を検討していて、その開発の中でGolang用のTwiMLを生成するライブラリを作った話をしたいと思います

  • Twilio・TwiMLとはどういうものか
  • GolangでTwiMLを生成するライブラリを作成した経緯
    • encoding/xml を使ったTwiMLの生成
    • TwiMLを生成する既存ライブラリ
  • ライブラリgotwimlの紹介
  • まとめ
続きを読む

会社立ち上げ初期でやったこと

f:id:pointenko:20210105140420p:plain はじめまして、エンジニアリングマネージャーの片田です。

めちゃめちゃ頭をフル回転させて技術的な話が書けないか考えたんですけど、 最近コードを一切書いてないので当然ネタがありませんでした…

なので、homieの立ち上げからやってきた身として、 一番最初の記事では技術者として立ち上げ初期でやったことを書こうと思います。

自分自身、事業の立ち上げは経験したことがあるものの、 会社の立ち上げとなると全く経験がなく、全然違うものだと感じたのでその部分が伝わればと思います。



立ち上げとはどんな状態か

弊社homie株式会社は2019年4月に設立したゴリゴリの不動産テック系スタートアップ企業です。

一番初めは、アイディアベースで話が始まり、不動産の知識もないまま不動産テックのプロダクト開発をすることになりました。

ただ知識はないもののプロダクトを形にできればちゃんと収益が出ると確信していたので、 あとはサービスローンチまでにどこまで作り込むかという点でした。


仕様を詰めて、UI/UXデザインをして、そこから優秀なエンジニア達に実装してもらって、 PDCAガンガン回して、そのプロダクトの価値と魅力が伝われば収益が出る…!

っとスムーズにはいかないんですね、これが。


不動産の知識がないのにどうやって仕様作るのか。

デザイナーがいないのにどうやってデザインするのか。

エンジニア1人なのにどうやって開発するのか。てか「優秀」ってなにか。

この時点でのPDCA回すは論外。

プロダクトの価値と魅力ってな〜んですか〜。


そんな状態です。

とりあえずやんなきゃいけないこと

まずはサービスの剪定やらメールどうするかやら技術者がやるべきとこはそこです。

弊社で導入したサービスはありきたりですけど下記です。

コミュニケーション:Slack
メール・文書等の管理:GSuite
ドメイン:お名前.com
インフラ:AWS
リポジトリ:Github

つまり、これぐらいはITの会社を立ち上げる時ミニマムでもコストが発生するものです。

その会社によってかけていいコストが変わってくるので、この部分は料金を概算してどれを使うのか決めましょう。


あとはそれぞれの運用ルールをゼロにするとめちゃくちゃ荒れるし、後からあの時のドキュメントないってなるので、イチぐらいでいいので運用ルールはあったほうが良いかもしれないです。

例えば、資料等はSlackに流すんじゃなくGoogle Driveに置いてから共有するとか。

社内でスプシ使う時はGoogle Sheetsにするとか。(営業の人はすこぶるOfficeつかうので互換性なくて禿げますw)


まあこれでざっくりではありますが、会社を前進させる準備は整いました。

さっそくプロダクト作るぜ!

ってなりますが、プロダクトにおいて絶対外せない軸を1つだけ決めたほうがいいです。

「プロダクトの価値と魅力」この部分ですね。


ローンチ前はいろんなことできないし、ブレまくるのでこれがまじで大事です。

「MVP作れ!ちっちゃく作ったほうがええんや!」って起業の本によく書いてありますが、 他職種の人がいる場合はどこまでをMVPとするかを決定するのがそれ以前に重要になります。


コツとしては、やることもですけど、やらないことを特に伝えましょう。

例えば、デザインはガン無視します!とか分析はいたしません!とかですね。

もし万が一これを言って、ギクシャクするぐらいだったら弊社で一緒に働きましょうw

いつでもご連絡ください。

その後のフェーズ

ここからは実際にプロダクト開発をしていくことになります。

このフェーズはエンジニア採用できないとか、組織開発が進まないとか色々あると思いますが、その部分はまた別の記事で書きたいと思います。

つかれたので今日はこれぐらいにします。


また会いましょう!



片田 雄樹 
homie株式会社 エンジニアリングマネージャー