Goのよくあるミスを発見する静的解析ツールを作った話
こんにちは @p1ass です。 Go のよくある間違いとして、ループのイテレーター変数の参照をループの中で使ってしまうという間違いがあります。 イテレーター変数のアドレスは 1 イテレーションごとに変わらないので、その参照をそのまま配列に append すると配列の結果が全て同じ値になるといったことが発生してしまいます。この問題はよくある間違いとして Go の wiki にも取り上げています。しかし、現状では公式でこの間違いを検出する静的解析ツールは用意されていません。
そこで、僕はメルカリのインターンで、イテレーター変数の参照をループ内で使っている箇所を検出する静的解析ツールを作成したのでそれを紹介したいと思います。
はてなブログからHugoに移行にして1年が経った
こんにちは、@p1assです。
ブログをはてなブログから移行して一年経ったので、色々感想や分かったことを書いていこうと思います。
pupeteer内のReactコンポーネントに変数を渡す
こんにちは、@p1assです。
タイトルの通り「pupeteer を動かしている Node が持っている変数を、pupeteer 内で動いている React コンポーネントに渡したい」という状況が発生したので、やり方をメモしておきます。
Twitterトレンド1位になった個人開発Webサービスの負荷対応記録
こんにちは、@p1assです。
この記事は、LT 会のために作った Web サービスが何故かバズって Twitter トレンド 1 位 になってしまい、ひぃひぃ言いながら行った負荷対応をまとめたものになります。 スケーラビリティを全く考慮していない LT 会用の雑な Web サービスを、どのように改善していったのかについてまとめることで、個人開発者の参考になれば良いなと思っています。
なお、ここで書かれている内容は Production Ready なサービスを作る上では当たり前なことがほとんどです。本当の高負荷トラフィックを裁くための知見は出てこないので、予めご了承ください。
プログラミングにおける「勘」とその鍛え方
チーム開発でレビューをしていると、「パット見は問題なさそうだが、なんかバグってそう」と感じることがあります。
これは全く理論的な気づきではなく、直感的な「勘」なのですが、意外と精度良くバグを発見できることが多いです。[^1]
[^1] 勿論杞憂である場合も沢山ありますが
ある時、友人に「そういう勘ってどうやって鍛えるんですか?」と聞かれました。とっさに「経験かな。」と答えたのですが、確信があるかと言われると微妙です。「どういう経験を積めばいいのか?」と聞かれると答えられなかったと思います。
最近、改めてこの話題について考える機会があったので色々考えてみたのですが、「良いコードを読んだ回数に比例して勘が冴えるようになる。」 という結論にたどりつきました。
このブログでは、その結論に至るまでの思考をメモしておこうと思います。
[Go] スライスのfor rangeループ内で新しいスライスにappendしたらバグらせた
久々にポインタ関連でバグらせてしまったので、自戒のためにメモしておく。
tl;dr
- for range ループの value は常に同じアドレス値を取る。
WebサーバをNginxから証明書自動更新に対応したCaddy 2に移行した
こんにちは、@p1assです。
最近、運用していた Web サーバを Nginx から Caddy に移行しました。この記事では Caddy の特徴や移行してみた感想などを書きたいと思います。
レイヤードアーキテクチャを採用した際のWebSocket実装例
こんにちは、@p1assです。
先日、レイヤーアーキテクチャを採用している Web API サーバに WebSocket を組み込むことになったのですが、コネクションの管理やどのレイヤーで各機能を管理するか悩んだのでブログにまとめておきます。
使用している言語は Go で、Web フレームワークは echo です。
Docker Contextsを使ってDocker Composeをデプロイする際の注意点
こんにちは、ぷらす(@p1ass)です。
先日、CAMPHOR- DAY 2020というオンラインのトークイベントで、「複数サービスを運用しやすい理想のコンテナ環境を VPS 上に構築する」というタイトルで登壇しました。
登壇資料は既にアップロードしていて見られるのですが、端折っている部分の補足をしたいと思います。また、当日頂いた質問についても回答します。
GitHub APIを使ってブランチを新規作成する
こんにちは、@p1assです。
先日、GitHub API を使用して git のブランチを作成しようとしたのですが、純粋にブランチを作成する API が生えておらず、色々調べた結果作成できることが分かってのでメモを残しておきます。