<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://b.l0g.jp/feed/index.xml" rel="self" type="application/atom+xml" /><link href="http://b.l0g.jp/" rel="alternate" type="text/html" /><updated>2025-04-23T06:11:22+09:00</updated><id>http://b.l0g.jp/feed/index.xml</id><title type="html">b.l0g.jp</title><author><name>doublemarket</name></author><entry><title type="html">10 Rules for Fast-Moving Dev Teams in the Age of AI</title><link href="http://b.l0g.jp/development/2025/04/22/10-rules-for-fast-moving-dev-teams.md/" rel="alternate" type="text/html" title="10 Rules for Fast-Moving Dev Teams in the Age of AI" /><published>2025-04-22T00:00:00+09:00</published><updated>2025-04-22T00:00:00+09:00</updated><id>http://b.l0g.jp/development/2025/04/22/10-rules-for-fast-moving-dev-teams.md</id><content type="html" xml:base="http://b.l0g.jp/development/2025/04/22/10-rules-for-fast-moving-dev-teams.md/"><![CDATA[<center><img border="1" style="width: 60%;" src="/images/2025-04-22-10-rules-for-fast-moving-dev-teams/human-and-ai.png" /></center>

<p>As AI continues to accelerate what’s possible in product development, the biggest bottleneck isn’t the technology—it’s us. Human coordination, communication, and decision-making often slow things down more than any technical limitation. To truly harness the power of AI, we must focus on minimizing friction for people just as much as we optimize for machines. This article outlines practical strategies to align teams, reduce cognitive load, and create a work environment where both humans and AI can operate at their full potential.</p>

<h2 id="ensure-everyone-understands-the-goal">Ensure Everyone Understands the Goal</h2>

<p>(Responsibility of the board, Product Managers, and Engineering Managers)</p>

<p>In today’s rapidly changing world, teams need to act more autonomously. They shouldn’t have to constantly ask what to do next. Clear alignment is more critical than ever.</p>

<ol>
  <li><strong>Clarify the north star</strong> at the company, department, and team levels.
If members don’t fully understand it, progress stalls.</li>
  <li><strong>Keep strategies up to date</strong> across all levels.
While not mandatory, shared understanding of strategy helps everyone move faster and make better decisions.</li>
</ol>

<h2 id="minimize-cognitive-load-for-both-ai-and-humans">Minimize Cognitive Load for Both AI and Humans</h2>

<p>(Organizational structure: VPs. Execution: PdMs, EMs, and ICs)</p>

<p>To enable close collaboration between AI and people, everything—products, code, and processes—must be designed to reduce complexity.</p>

<ol start="3">
  <li><strong>Keep product requirements as small as possible</strong>
  Write compact PRDs that can be used directly with AI coding tools. If it’s too large, break it into smaller parts.</li>
  <li><strong>Keep teams small</strong>
  Ideally 2–3 people, to minimize communication overhead.</li>
  <li><strong>Keep codebases small and focused</strong>
  Large codebases are harder for AI tools (and people) to navigate. When AI starts struggling to understand the architecture, it’s time to break things down.
  Always consider creating a new component before modifying an existing one.</li>
  <li><strong>Minimize dependencies between systems</strong>
Dependencies increase complexity. Don’t be afraid to reinvent the wheel when it reduces entanglement. If you must depend on another system, keep interfaces as simple as possible.</li>
  <li><strong>Deliver quickly</strong>
  Don’t wait for a sprint to end. Ship as soon as something is ready.</li>
  <li><strong>Start collecting feedback immediately</strong>
  It’s likely your first version won’t hit the mark. Gather user feedback or metrics right away, learn, and iterate fast.</li>
</ol>

<h2 id="minimize-and-optimize-human-communication">Minimize and Optimize Human Communication</h2>

<p>(Everyone, especially EMs and ICs)</p>

<p>Humans—not AI—are usually the bottleneck. The most time-consuming task is communication between people, so make it count.</p>

<ol start="9">
  <li><strong>Prioritize synchronous communication</strong>
  Meet in person or via Zoom as often as possible to quickly align and unblock.</li>
  <li><strong>Revisit architecture after PMF</strong>
  Once your product has found market fit, take time to reassess and optimize the system architecture holistically.</li>
</ol>

<h2 id="summary">Summary</h2>

<p>By aligning teams around a clear vision, minimizing complexity for both humans and AI, and streamlining communication, organizations can unlock faster delivery and better outcomes. These principles aren’t just about working more efficiently—they’re about creating a culture where high-performance teams can thrive. The companies that adopt these habits now will be the ones that lead tomorrow.</p>]]></content><author><name>doublemarket</name></author><category term="Development" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">『詳解 Terraform 第3版』を翻訳しました</title><link href="http://b.l0g.jp/books/2023/11/21/terraform-up-and-running-ja/" rel="alternate" type="text/html" title="『詳解 Terraform 第3版』を翻訳しました" /><published>2023-11-21T00:00:00+09:00</published><updated>2023-11-21T00:00:00+09:00</updated><id>http://b.l0g.jp/books/2023/11/21/terraform-up-and-running-ja</id><content type="html" xml:base="http://b.l0g.jp/books/2023/11/21/terraform-up-and-running-ja/"><![CDATA[<p>『<a href="https://www.oreilly.co.jp/books/9784814400522/">詳解 Terraform 第3版</a>』という本が本日2023年11月21日、オライリー・ジャパンから出版されました。米O’Reillyから出版されている『<a href="https://www.terraformupandrunning.com/">Terraform: Up and Running, 3rd edition</a>』を私が日本語訳したものです。この本は原著の初版が出版された頃からぜひ自分で翻訳したいと思っていたので、やっとここに至れて個人的にとても嬉しいです。</p>

<center><img border="1" src="/images/2023-11-21-terraform-up-and-running-ja/terraform-ja.jpeg" /></center>

<ul>
  <li>目次（詳細は<a href="https://www.oreilly.co.jp/books/9784814400522/#toc">オライリーのページ</a>へ）
    <ul>
      <li>第1章 なぜTerraformを使うのか</li>
      <li>第2章 Terraformをはじめよう</li>
      <li>第3章 Terraformステートを管理する</li>
      <li>第4章 モジュールで再利用可能なインフラを作る</li>
      <li>第5章 Terraformを使うためのヒントとコツ: ループ、条件分岐、デプロイ、その他のつまずきポイント</li>
      <li>第6章 シークレットを管理する</li>
      <li>第7章 複数のプロバイダを使う</li>
      <li>第8章 本番レベルのTerraformコード</li>
      <li>第9章 Terraformのコードをテストする</li>
      <li>第10章 チームでTerraformを使う</li>
    </ul>
  </li>
  <li><a href="https://www.amazon.co.jp/dp/4814400527/">Amazonの書籍詳細</a></li>
</ul>

<p>帯などにはTerraform 1.0対応とありますが、より詳しく言うと原著はTerraform 1.2までの変更が含まれており、かつ日本語版ではTerraform 1.5までの変更（原稿を仕上げたのが1.6発表の直前でした）に関しても訳注としてできるだけ情報を追加しています。ちなみに第3版とありますが、翻訳の元になった原著が第3版なためで、日本語ではこれが最初の版です。</p>

<p>基本的にはAWSにリソースを作るチュートリアル形式で、インスタンスを1台デプロイする非常に短いコードから始まり、徐々にそこにリソースを追加していくような流れで進んでいきます。</p>

<p>とは言え、目次を見ていただくと分かるように単に文法を学んでいくだけではなく、Terraformをチームで使ったり複雑な使い方をしていくと必ず突き当たるであろう問題に対するベストプラクティスを提示する流れにもなっています。この本で取り上げられているこういったテクニックやベストプラクティスの主な点をいくつか抜粋すると次のようなところでしょうか。</p>

<ul>
  <li>開発、ステージング、本番と環境が増えていくときのステートファイルの管理</li>
  <li>Terraformコードを保存するリポジトリのディレクトリ構造をどうするか</li>
  <li>モジュールはどういう時に使い、どう分けるべきか、どの程度の粒度にすべきか</li>
  <li>リファクタリングの注意点</li>
  <li>パスワードなどのシークレット管理</li>
  <li>AWSとAzure、あるいはAWSの複数のリージョンといった複数のプロバイダの扱い方</li>
  <li>テスト
    <ul>
      <li>1.6で導入されたterraform testは含まれませんが、プランテスト、terratest、インフラ(E2E)テストなどが含まれます。</li>
    </ul>
  </li>
  <li>開発プロセスあるいはCI/CDへの組み込み</li>
</ul>

<p>これに加え第10章の冒頭ではTerraformを使っていないチームにTerraformを導入する場合の根回しの流れが書いてあるのですが、この記述がTerraformに限らず新しいツールや技術をチーム内で導入しようとした時の一般的あるある例になっており、個人的には面白かったです。</p>

<p>著者のYevgeniy Brikman氏は、Terraformを活用したインフラの構築運用などを手掛けるGruntwork社の創業者でありCTOです。この本はそのビジネスを通じた経験を元にして書かれており、Terraform導入にかかるコミュニケーション的な側面も、Terraformを使って顧客に対しサービスを提供してきた経験からくる知識でもあるのでしょう。また、長年Terraformコミュニティに貢献してきた人でもあります。</p>

<p>一方で、最近のTerraformのライセンス変更から始まった論争の中では、いち早くライセンス変更に異議を唱えており、その論争に端を発しTerraformからフォークされたOpenTofuプロジェクトの発起人の1人でもあります。</p>

<p>そのあたりからもうかがえるように、Terraformとそれを取り巻くエコシステムはやや先が見えない時代を迎えているとも言えますが、以前と比べると多くの人に使われるようになっており、その意味ではこれまでにない安定した時期を迎えているとも言えます。この本は、現時点のTerraformを使いこなそうと考える人に対しては、幅広い分野をカバーしており決定版と言っていいでしょう。今まで、日本のTerraformコミュニティの広がりに比べると広い範囲をカバーした日本語書籍は少ない印象でしたが、この本がさらに日本のTerraformユーザを増やす一助になればと思います。</p>]]></content><author><name>doublemarket</name></author><category term="Books" /><summary type="html"><![CDATA[『詳解 Terraform 第3版』という本が本日2023年11月21日、オライリー・ジャパンから出版されました。米O’Reillyから出版されている『Terraform: Up and Running, 3rd edition』を私が日本語訳したものです。この本は原著の初版が出版された頃からぜひ自分で翻訳したいと思っていたので、やっとここに至れて個人的にとても嬉しいです。]]></summary></entry><entry><title type="html">『入門 監視』を翻訳しました</title><link href="http://b.l0g.jp/books/2019/01/18/practical-monitoring/" rel="alternate" type="text/html" title="『入門 監視』を翻訳しました" /><published>2019-01-18T00:00:00+09:00</published><updated>2019-01-18T00:00:00+09:00</updated><id>http://b.l0g.jp/books/2019/01/18/practical-monitoring</id><content type="html" xml:base="http://b.l0g.jp/books/2019/01/18/practical-monitoring/"><![CDATA[<p>サーバやネットワーク、セキュリティなどシステムの監視に関わる心構えや取り組み方を解説した「<a href="https://www.oreilly.co.jp/books/9784873118642/">入門 監視</a>」という本が、2019年1月17日にオライリー・ジャパンさんから出版されました。原書は「<a href="http://shop.oreilly.com/product/0636920050773.do">Practical Monitoring</a>」という本で、それを私が翻訳したものです。私が訳した本としては3冊目、オライリー・ジャパンさんから出版されるものとしては「<a href="https://www.oreilly.co.jp/books/9784873118406/">入門Kubernetes</a>」に続いて2冊目です。</p>

<center><img border="1" src="/images/2019-01-18-practical-monitoring/practical-monitoring.jpg" /></center>

<ul>
  <li><a href="https://www.oreilly.co.jp/books/9784873118642/#toc">目次</a></li>
  <li><a href="https://www.amazon.co.jp/dp/4873118646/">Amazonの書籍詳細</a></li>
</ul>

<p>私がこの記事を書くのにモタモタしているうちに、書評を書いてくださった方が早くもいらっしゃるのですが、いちおう翻訳者としてこの本について少し紹介しておこうと思います。</p>

<p>「入門 監視」のユニークなのは、監視と言うとどうしても特定の監視ツール（Nagios、Zabbix、Mackerelなどなど）の話になってしまいがちなのですが、そこをあえて特定ツールの名前をなるべく出さないようにしているところです。むしろ著者が冒頭の第1章から戒めているのは、ツール依存です。ツールから監視を考えると非効率な仕組みを作ってしまいがちであり、さらに監視とは単一の問題ではなく色々な問題が複雑に絡み合ったものなので、監視したいもの、監視すべきものを元にしてツールを選ぶという順番を取るべきであるという主張が書かれています。それ以降も、著者の経験を元にした監視のアンチパターン、デザインパターン、そしてサーバやネットワークからビジネスKPIの監視、セキュリティ監視などといった対象ごとの監視のポイントが書かれるという流れです。どの記述も著者の強い主張がにじみ出ているのですが、それでいて監視についての本質を突いたことが簡潔にまとめられています。</p>

<p>数年前私がとあるシステムの運用を引き継いだ時、監視は一通り設定されており、障害があれば気づける状態にはなってはいました。しかし、毎日大量のアラートメールが飛んできており、しかも大部分は無視してよいものでした。そのため、私の最初の仕事はそれらが自動的に既読になるようメールの設定をすることでした。その時点ではそんなものかなと思いつつ、あれこれ試行錯誤をしてそういった「慣れている人が見ないと本当に対応が必要かどうかわからないアラート」ばかりを生成する監視システムを改善していきました。初めてこの「入門 監視」の原書「Practical Monitoring」を読んだ時は、その時の試行錯誤の結果分かったことがほとんど書いてある！という驚きを感じたものです。この本を翻訳しようと思ったきっかけがこの驚きでした。とりあえず監視をしないといけないから監視ツールを導入したけれど本当に十分なのか分からない、意味不明なアラートメールがたくさん飛んできていて困っている、これからシステムの監視をしないといけないが何をしたらいいか分からない、といった監視の初心者の方が、監視に対する考え方を身につけるのにはとてもよい本です。</p>

<p>原文ではあえてツールに関する記述が少なくなっていますが、それだと監視に初めて触れる人にとっては抽象的な話ばかりになってしまうので、もう少し具体的な話を付録として付け加えればいいのになと、原書を読んだ時から考えていました。そこで、SaaS型サーバー監視サービスである<a href="https://mackerel.io/ja/">Mackerel</a>のプロダクトマネージャーである株式会社はてなの松木雅幸さん（<a href="https://twitter.com/songmu">@songmu</a>）に付録を書いていただきました。注意点などを含め分かりやすい解説を書いていただいたことで、本全体のバランスがずっとよくなったと確信しています。</p>

<p>ちなみに、「入門 監視」というどストレートなタイトル、短すぎるとは思ったものの特に違和感は感じませんでした。どうやら驚きを感じた人が多かったようですが。。</p>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">正直「入門 監視」というタイトルに違和感を抱かない程度には監視脳になっています。</p>&mdash; songmu (@songmu) <a href="https://twitter.com/songmu/status/1084820477434945536?ref_src=twsrc%5Etfw">2019年1月14日</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>私もまさにこの感覚でいました。</p>

<h2 id="謝辞">謝辞</h2>

<p>今回も、レビュアーの方々には丁寧に本文をチェックしていただき、技術的な指摘から日本語としての読みやすさまで、様々なアドバイスをいただきました。レビュアーのみなさま、そして付録の執筆をしていただいたsongmuさんにはここで感謝を表したいと思います。</p>]]></content><author><name>doublemarket</name></author><category term="Books" /><summary type="html"><![CDATA[サーバやネットワーク、セキュリティなどシステムの監視に関わる心構えや取り組み方を解説した「入門 監視」という本が、2019年1月17日にオライリー・ジャパンさんから出版されました。原書は「Practical Monitoring」という本で、それを私が翻訳したものです。私が訳した本としては3冊目、オライリー・ジャパンさんから出版されるものとしては「入門Kubernetes」に続いて2冊目です。]]></summary></entry><entry><title type="html">『入門Kubernetes』を翻訳しました</title><link href="http://b.l0g.jp/books/2018/03/12/kubernetes-up-and-running/" rel="alternate" type="text/html" title="『入門Kubernetes』を翻訳しました" /><published>2018-03-12T00:00:00+09:00</published><updated>2018-03-12T00:00:00+09:00</updated><id>http://b.l0g.jp/books/2018/03/12/kubernetes-up-and-running</id><content type="html" xml:base="http://b.l0g.jp/books/2018/03/12/kubernetes-up-and-running/"><![CDATA[<p>コンテナを管理するオーケーストレータとしてデファクトスタンダードになりつつあるKubernetesに関する入門書『<a href="https://www.oreilly.co.jp/books/9784873118406/">入門Kubernetes</a>』を翻訳しました。2018年3月22日に、オライリー・ジャパンから発売されます。原著は『<a href="http://shop.oreilly.com/product/0636920043874.do">Kubernetes: Up and Running</a>』です。</p>

<center><img border="1" src="/images/2018-03-12-kubernetes-up-and-running/kubernetes-up-and-running.jpg" /></center>

<ul>
  <li><a href="https://www.oreilly.co.jp/books/9784873118406/#toc">目次</a></li>
  <li><a href="https://www.amazon.co.jp/dp/4873118409/">Amazonの書籍詳細ページ</a></li>
</ul>

<p>Kubernetesの開発者たちが直接Kubernetesを解説した本で、Kubernetesでアプリケーションを動かすために必要な色々な概念を、実際にKubernetesクラスタ上で動かしてみながら学んでいくという構成になっています。</p>

<p>また、チュートリアルだけでなく「なぜコンテナを使うべきなのか」「どういう経緯でKubernetesが生まれたのか」「マイクロサービスの何がいいのか」といった、コンテナやマイクロサービスが広まって来た背景についても書かれています。そのため、コンテナはほとんど触ったことがないという人でも読み始められるようになっています。</p>

<p>入門書なのでKubernetesの機能のすべてが網羅されているわけではありませんが、Kubernetesを理解するための基本的な事項については一通り書かれています。Kubernetesの公式ドキュメントはとても丁寧に書かれているので(ただし英語)、まずこの『入門Kubernetes』を読んでKubernetesの仕組みと基本的なリソースを学び、さらにその先を知りたい場合には公式ドキュメントを読み込んでいくというのにぴったりだと思います。</p>

<h2 id="日本語版独自の改善点">日本語版独自の改善点</h2>

<p>原著はKubernetes 1.5あるいは1.6をベースに書かれています。日本語版には、翻訳完了時の最新版であるKubernetes 1.9までに加えられた変更などを、注釈などの形でできるだけ反映しました。チュートリアルを簡単に進められるように、原著の内容に合わせて<a href="https://github.com/kubernetes-up-and-running/examples">サンプルデータのリポジトリ</a>が用意されているのですが、これも日本語版に合わせて<a href="https://github.com/doublemarket/kuar-examples-1-9">Kubernetes 1.9対応データを含むリポジトリ</a>を用意しました。</p>

<p>また、原著への「内容はいいのに誤植が多すぎる」といった指摘に対しては、翻訳の際にできる限り修正を反映させるようにしています。</p>

<h2 id="翻訳の経緯と謝辞">翻訳の経緯と謝辞</h2>

<p>英語を日本語に翻訳することで日本語の情報量を増やしたいという思いで、<a href="https://yakst.com/ja">人力翻訳コミュニティYakst</a>というサイトを作って翻訳したり、<a href="http://b.l0g.jp/uncategorized/sql-performance-explained-ja/">『SQLパフォーマンス詳解』というデータベースに関する本の翻訳</a>などをしてきました。その先に、いつかは書店で売られる本の翻訳がしたいと思っていたところ、機会をいただいて実現することになりました。</p>

<p>私自身Kubernetesに関してはまだまだ経験が浅いこともあり、Kubernetesの運用経験豊富なレビュアのみなさまからの指摘無しにこの本は完成しなかったといっても過言ではありません。レビューしていただいた<a href="https://twitter.com/mahata">@mahataさん</a>、<a href="https://twitter.com/ladicle">@Ladicleさん</a>、<a href="https://twitter.com/superbrothers">@superbrothersさん</a>、<a href="https://twitter.com/strsk">@strskさん</a>、<a href="https://twitter.com/deeeet">@deeeetさん</a>(順不同)には本当に感謝するばかりです。</p>

<p>「私は『入門Kubernetes』でKubernetesを始めました」という人がたくさん現れて、日本のKubernetesコミュニティがさらに盛り上がっていくことにつながれば、翻訳者としてこの上ない喜びです。みなさんぜひ読んでみてください！</p>]]></content><author><name>doublemarket</name></author><category term="Books" /><summary type="html"><![CDATA[コンテナを管理するオーケーストレータとしてデファクトスタンダードになりつつあるKubernetesに関する入門書『入門Kubernetes』を翻訳しました。2018年3月22日に、オライリー・ジャパンから発売されます。原著は『Kubernetes: Up and Running』です。]]></summary></entry><entry><title type="html">Tokyo Rubyist Meetupでデータベースのインデックスについて英語で話した</title><link href="http://b.l0g.jp/databases/2017/02/12/giving-a-talk-at-trbmeetup/" rel="alternate" type="text/html" title="Tokyo Rubyist Meetupでデータベースのインデックスについて英語で話した" /><published>2017-02-12T00:00:00+09:00</published><updated>2017-02-12T00:00:00+09:00</updated><id>http://b.l0g.jp/databases/2017/02/12/giving-a-talk-at-trbmeetup</id><content type="html" xml:base="http://b.l0g.jp/databases/2017/02/12/giving-a-talk-at-trbmeetup/"><![CDATA[<p>The English version is at the end of this post.</p>

<p><a href="https://trbmeetup.doorkeeper.jp/events/56308">2月10(金)に開催されたTokyo Rubyist Meetup</a>というイベントで、自分が翻訳した<a href="http://sql-performance-explained.jp/">SQLパフォーマンス詳解</a>という本をベースにして「How indexes work in relational databases」という題で発表した。題名からわかるように、英語での発表。</p>

<script async="" class="speakerdeck-embed" data-id="a54c372ef22749ff9af1d235dcaa7fe8" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

<p><a href="https://trbmeetup.doorkeeper.jp/">Tokyo Rubyist Meetup</a>は、Doorkeeperの社長<a href="https://www.doorkeeper.jp/team/paul">Paul McMahon</a>さんが主催している、Rubyのことを中心にしつつも色々なトピックを取り上げている英語話者向けの勉強会。Paulさんからお声がけがあって、DBエンジニアからの知見はRubyistにもうけると思うよということで、英語の勉強と本の宣伝とデータベース知識の整理の意味で発表することにした。Paulさん貴重な機会をくれて本当にありがとうございました！</p>

<p>内容的には、<a href="http://sql-performance-explained.jp/">SQLパフォーマンス詳解</a>(の<a href="http://sql-performance-explained.com/">英語版</a>)の第1章の要約みたいな感じで、インデックスがなぜ必要なのか、Bツリーインデックスはどうやってデータを探すのに役立つのかといった基本的なところを書いた。Active Recordばっかり使ってて、SQLがどう動いているのかあまり意識していなかったり、高速に応答するクエリをどう書いたらいいのかわからない人に向けて、インデックスコワクナイヨ、ということを言ったつもり。しかし特定のDB(MySQLとかPostgreSQLとか)についてあえて触れなかったので、内容的に抽象的すぎたかもしれない。こういう発表って、どの程度の人をターゲットにするかブレないようにすること、そして抽象的すぎず突っ込みすぎずな内容にもっていくのが難しい。</p>

<p>今年は意識的に英語でアウトプットしていこうと思っているので、できる限り機会を見つけてこういう場で発表するつもり。</p>

<hr />

<p>I gave a talk “How indexes work in relational databases” based on the book <a href="http://sql-performance-explained.jp/">SQL Performance Explained</a> at <a href="https://trbmeetup.doorkeeper.jp/events/56308">Tokyo Rubyist Meetup held on Feb. 10</a>.</p>

<p>(See the material above.)</p>

<p><a href="https://trbmeetup.doorkeeper.jp/">Tokyo Rubyist Meetup</a> is a tech meetup for English speaking Ruby engineers organized by the CEO of Doorkeeper Inc. <a href="https://www.doorkeeper.jp/team/paul">Paul McMahon</a>. One day, he gave me an email and suggested me to talk about a topic related to databases. I decided to talk something to practice my English, to promote the book, and to reorganize my thought on databases. Thank you very much Paul, this was my precious experience!</p>

<p>The talk was basically the summary of the chapter one of <a href="http://sql-performance-explained.com/">SQL Performance Explained</a>, including basic topics like why indexes are needed and how B-tree indexes search a record. The talk was for developers who use Active Record and don’t have enough knowledge about indexes and what I wanted to say for them is that don’t be afraid of indexes. I intentionally avoid to write about a specific database management system (MySQL, PostgreSQL, etc.) to focus on how indexes work in general but because of that, the talk might be too abstract. Hopefully, the talk was a good introduction to the internal of databases for attendees.</p>

<p>I’m going to talk at some more events in this year to improve my English skill.</p>]]></content><author><name>doublemarket</name></author><category term="Databases" /><summary type="html"><![CDATA[The English version is at the end of this post.]]></summary></entry><entry><title type="html">AWS, GCP, Azureの障害情報の提供方法とTwitterボット</title><link href="http://b.l0g.jp/cloud/2016/10/24/aws-gcp-azure-status/" rel="alternate" type="text/html" title="AWS, GCP, Azureの障害情報の提供方法とTwitterボット" /><published>2016-10-24T00:00:00+09:00</published><updated>2016-10-24T00:00:00+09:00</updated><id>http://b.l0g.jp/cloud/2016/10/24/aws-gcp-azure-status</id><content type="html" xml:base="http://b.l0g.jp/cloud/2016/10/24/aws-gcp-azure-status/"><![CDATA[<p><a href="http://b.l0g.jp/misc/my-twitter-bots/">Twitterボットを作るのが趣味という記事</a>を以前書いたが、そのからみでAWS(Amazon Web Service)、GCP(Google Cloud Platform)、Microsoft Azureの主要3クラウドの障害情報Twitterボットを作った。面白いもので3サービスとも障害情報の提供方法やポリシーが違っていて、ボットのような障害情報を取ってきて通知する仕組みをつくるのはちょっと面倒。せっかくなのでボットの宣伝も兼ねて障害報告に関するサービス間の違いを挙げておく。自分で通知の仕組みを作ったり、サービスを選ぶときの参考に。</p>

<p>ちなみに、これらのサービスを既に使っている人は、単純にこれらのボットをフォローするか、Slack(<a href="https://get.slack.help/hc/en-us/articles/205346227-Add-Twitter-to-Slack">英語の公式ドキュメント</a>、<a href="http://qiita.com/YuukiOgino/items/54f427544fe2fa304a80">日本語記事</a>)やHipchat(<a href="http://www.e-agency.co.jp/column/zapier_twittertohipchat.html">Zapierを使った方法の日本語記事</a>)などにボットのツイートを通知するようにしておくと、障害検知の一環としても使えますのでぜひどうぞ。どのボットも障害発生時間などを日本時間に置き換えてツイートする仕組みです。</p>

<h1 id="aws">AWS</h1>

<h3 id="twitterボット">Twitterボット</h3>
<ul>
  <li>全リージョン対象 <a href="https://twitter.com/awsstatusjp_all">@awsstatusjp_all</a>
    <ul>
      <li>下のボットのツイートも包含されるので片方フォローすればOK</li>
    </ul>
  </li>
  <li>東京リージョン関連のみ <a href="https://twitter.com/awsstatusjp">@awsstatusjp</a>
    <ul>
      <li>東京リージョンのサービスと、S3やManagement consoleなどリージョンなしのサービスの障害が対象</li>
    </ul>
  </li>
</ul>

<h3 id="障害情報サイト">障害情報サイト</h3>
<ul>
  <li><a href="http://status.aws.amazon.com/">http://status.aws.amazon.com/</a></li>
  <li>大まかな地域ごとにタブが並んでおり、その中に地域内の全リージョン、全サービスが一列に並ぶ</li>
  <li>障害があると左端の緑の丸がオレンジになり、障害の詳細がDetails列に簡潔に書かれる</li>
  <li>他のサービスと比べると障害内容の記述はシンプルであまり詳細は書かれない</li>
  <li>過去の障害履歴は下半分に1週間分(それ以前にもさかのぼれる)表示されるが、サービス数が多すぎてやや見にくい</li>
  <li>比較的定型的な表現が多い</li>
  <li>タイムゾーンはPST/PDT</li>
</ul>

<h3 id="機械的に障害情報を取る方法">機械的に障害情報を取る方法</h3>
<ul>
  <li>全リージョンの全サービスの情報がそれぞれ1つずつRSSフィードで提供される</li>
  <li>その他に<a href="http://status.aws.amazon.com/rss/all.rss">全障害情報が含まれるRSSフィード</a>もある</li>
  <li>基本的には上記サイトに表示される内容がフィードにも書かれる</li>
</ul>

<h3 id="所感">所感</h3>
<ul>
  <li>いいところ
    <ul>
      <li>リージョン及びサービスごとにフィードがあるので特定サービスごとに監視したい時は楽</li>
      <li>定型的な表現が多いので訳したり表現を拾って処理を分岐したりしやすい</li>
    </ul>
  </li>
  <li>悪いところ
    <ul>
      <li>過去の障害情報が見にくいので他サービスのように時系列の一覧などが欲しい</li>
      <li>フィードの数が多すぎる(all.rssをうまく使えばいいが)</li>
      <li>他サービスと比べて障害情報の詳細さが足りない</li>
    </ul>
  </li>
</ul>

<h1 id="gcp">GCP</h1>

<h3 id="twitterボット-1">Twitterボット</h3>
<ul>
  <li>全リージョン対象 <a href="https://twitter.com/gcpstatusjp">@gcpstatusjp</a>
    <ul>
      <li>日本リージョンはまだない(<a href="http://googlecloudplatform-japan.blogspot.jp/2016/03/geo-tokyo-region.html">開設予定</a>)</li>
      <li>現状、障害がリージョンごとにうまく分けて通知されないので日本リージョンができても別ボットにしづらそう</li>
    </ul>
  </li>
</ul>

<h3 id="障害情報サイト-1">障害情報サイト</h3>
<ul>
  <li><a href="https://status.cloud.google.com/">https://status.cloud.google.com/</a></li>
  <li>地域ごとやリージョンごとの区分けはなく、横軸が日時、縦軸がサービスのグリッドのみ</li>
  <li>障害があるとグリッド状に赤(致命的障害)やオレンジ(一部障害)の丸が表示され、障害の詳細へのリンクが貼られる</li>
  <li>障害内容の記述は詳細で、次の報告をいつまでにするかが必ず併記される
    <ul>
      <li>ただし次の報告時刻は守られない時もある様子</li>
    </ul>
  </li>
  <li>過去の障害は<a href="https://status.cloud.google.com/summary">時系列に並んで表示</a>される</li>
  <li>タイムゾーンはPST/PDT</li>
</ul>

<h3 id="機械的に障害情報を取る方法-1">機械的に障害情報を取る方法</h3>
<ul>
  <li>サイトに掲載されている詳細情報や障害のレベル(Severity)、開始・収束時刻なども載ったJSONと、少し情報が少ないRSSの2つ</li>
</ul>

<h3 id="所感-1">所感</h3>
<ul>
  <li>いいところ
    <ul>
      <li>フィードの他に詳しい情報を含む<a href="https://status.cloud.google.com/incidents.json">JSONフィード</a>が提供されている。しかもちゃんと<a href="https://status.cloud.google.com/incidents.schema.json">スキーマ情報</a>も別にある</li>
      <li>Severityと障害の開始・収束時間があるのが非常にいい</li>
    </ul>
  </li>
  <li>悪いところ
    <ul>
      <li>リージョンが障害情報の詳細にしか書かれないので、特定リージョンの障害のみを検出したりするのが困難</li>
    </ul>
  </li>
</ul>

<h1 id="azure">Azure</h1>

<h3 id="twitterボット-2">Twitterボット</h3>
<ul>
  <li>全リージョン対象 <a href="https://twitter.com/azurestatusjp_a">@azurestatusjp_a</a>
    <ul>
      <li>アカウント名の文字数制限の影響で末尾がallじゃなくて悲しかった</li>
      <li>下のボットのツイートも包含されるので片方フォローすればOK</li>
    </ul>
  </li>
  <li>日本リージョン関連のみ <a href="https://twitter.com/azurestatusjp">@azurestatusjp</a>
    <ul>
      <li>日本のリージョンとグローバルサービスのみ</li>
    </ul>
  </li>
</ul>

<h3 id="障害情報サイト-2">障害情報サイト</h3>
<ul>
  <li><a href="https://azure.microsoft.com/ja-jp/status/">https://azure.microsoft.com/ja-jp/status/</a> (<a href="https://status.azure.com/">https://status.azure.com/</a>でもアクセス可)</li>
  <li>大まかな地域ごとにタブが並んでおり、その中に横軸リージョン、縦軸サービスのグリッドがある</li>
  <li>障害があるとグリッドに赤丸や黄色三角が表示され、障害の詳細がページ上部に書かれる</li>
  <li>障害内容の記述はGCPに近い詳細さで、今後の対応予定なども書かれる</li>
  <li>過去の障害は<a href="https://azure.microsoft.com/ja-jp/status/history/">時系列に並んで表示</a>される</li>
  <li>URLからすると障害内容は日本語で表示されそうに見えるが、リージョン名などのみ日本語であとは英語のまま</li>
  <li>タイムゾーンはUTC</li>
</ul>

<h3 id="機械的に障害情報を取る方法-2">機械的に障害情報を取る方法</h3>
<ul>
  <li>全リージョンの全サービスの情報が含まれるRSSフィードが1つのみ</li>
  <li>障害内容の記述はサイトに表示されるものと同じだが、Severityなどの情報は含まれない</li>
</ul>

<h3 id="所感-2">所感</h3>
<ul>
  <li>いいところ
    <ul>
      <li>かなり詳しい障害状況が報告される</li>
    </ul>
  </li>
  <li>悪いところ
    <ul>
      <li>RSSフィードのスキーマが微妙(リージョンとサービスが同じCategoryに列挙されている)</li>
      <li>障害がない時はRSSフィードの内容が空になる
        <ul>
          <li>どんな情報がどのように配信されるか分からない</li>
          <li>障害が終わった時の情報がフィードから得られない</li>
          <li>他サービスだと、障害収束後に「こんなのありました」という報告パターンがあるがそういうのをどう出すのか謎</li>
        </ul>
      </li>
      <li>サイト上には表示されるがRSSフィードに載らない情報が多い</li>
    </ul>
  </li>
</ul>

<h1 id="全体的に">全体的に</h1>
<ul>
  <li>利用者から見てもっとも丁寧な感じなのはAzureだが、フィードがいけてないので情報の加工は一番やりにくい</li>
  <li>AWSは情報の詳細さが他サービスと比べて全然足りない</li>
  <li>障害情報を加工して通知などに使いたい時には圧倒的にGCP。Severityや障害開始・収束時間など詳しい情報をパースしやすい形式で提供しているのはGCPのみ</li>
</ul>]]></content><author><name>doublemarket</name></author><category term="Cloud" /><summary type="html"><![CDATA[Twitterボットを作るのが趣味という記事を以前書いたが、そのからみでAWS(Amazon Web Service)、GCP(Google Cloud Platform)、Microsoft Azureの主要3クラウドの障害情報Twitterボットを作った。面白いもので3サービスとも障害情報の提供方法やポリシーが違っていて、ボットのような障害情報を取ってきて通知する仕組みをつくるのはちょっと面倒。せっかくなのでボットの宣伝も兼ねて障害報告に関するサービス間の違いを挙げておく。自分で通知の仕組みを作ったり、サービスを選ぶときの参考に。]]></summary></entry><entry><title type="html">英語をしゃべる機会を探して勉強会に行った話</title><link href="http://b.l0g.jp/english/2016/10/16/english-study-sessions/" rel="alternate" type="text/html" title="英語をしゃべる機会を探して勉強会に行った話" /><published>2016-10-16T00:00:00+09:00</published><updated>2016-10-16T00:00:00+09:00</updated><id>http://b.l0g.jp/english/2016/10/16/english-study-sessions</id><content type="html" xml:base="http://b.l0g.jp/english/2016/10/16/english-study-sessions/"><![CDATA[<p>いわゆる外資系企業に転職して半年、英語力の不足をひしひしと感じるのでさらにレベルアップすべく色々と試行錯誤中。お金をかけずに英会話の練習する機会は、探してみれば色々あるもの。最近行った英語に関する勉強会。</p>

<h2 id="1000-speakers-conference-in-english">1000 speakers conference in English</h2>

<p>金曜は<a href="http://1000-speakers.connpass.com/">1000 speakers conference in English</a>という、参加者全員が英語で3分のLTをするというイベントに参加、マイペースで続けている個人的な<a href="https://yakst.com/ja">翻訳プロジェクトYakst</a>について英語で話してきた。3分というのは非常に短いので、英語どころか日本語でもプレゼンしたことないという人でも、意外と話せてしまう時間。思ったよりゆるい雰囲気かつ参加者はエンジニアばかりではないというところが面白く、ネタがあるときには今後も積極的に参加してみたい。参加費無料。</p>

<script async="" class="speakerdeck-embed" data-id="50714901bdf948488a60ee93eaad0218" data-ratio="1.33159947984395" src="//speakerdeck.com/assets/embed.js"></script>

<h2 id="vital-japan--vital-english">Vital Japan / Vital English</h2>

<p>土曜は<a href="http://vitaljapan.com/">Vital Japan</a>という老舗かつ大規模な英語勉強会のイベントで、<a href="http://vitaljapan.com/event/20161015-vital-japan/">シリコンバレー企業のワークスタイルについての英語セッション</a>を聞いた。たった1000円で第一線で活躍するコンサルタントの英語のトークが聞け、さらに参加者同士で英語ディスカッションする機会もあるなんて、なんてお得な！</p>

<p>現職がシリコンバレー企業みたいなもの(本社はサンフランシスコ。SFもシリコンバレーに入る？)だし、<a href="https://www.amazon.co.jp/dp/B00OJVMK5O/ref=as_li_ss_tl?_encoding=UTF8&amp;btkr=1&amp;linkCode=ll1&amp;tag=l0gjp-22&amp;linkId=9bae2fda3db674521c7667455259760b">How Google Works</a>とか読んだ身としては特に目新しいトピックはなかったけれど、逆にディスカッションの時に他の参加者の話から日本企業の闇みたいなのを感じられて、その意味では興味深かった。</p>

<p>最後の質問時間に参加者から出た「シリコンバレー企業のやり方が非常にいいのはわかるが、既にルールでがんじがらめの日本企業を一般社員の力で変えていくにはどうしたらいいか？」という鋭い質問に対して、「日本企業でも、経営者と現場の社員は何が問題か既に気づいていて、中間管理職の存在がシステムを変えにくい原因になっているケースが多いように感じる。経営者が言っていることをよく聞いて、彼らと協力する方法を探せば道は開けるんじゃないか」とスピーカーのロッシェルさんが回答していたのが印象的だった。</p>

<p>また、Netflixに勤めているという日本人が、発音は日本人的だけれど的確な言葉を選んで非常に流暢に発言していて、まさに自分が目指すのはああいうレベルだよなと再確認。勉強会みたいなイベントは、何かの知識を得るために行くのだけでなく、自分よりできる人を目の前にしてその人に感化されてもっと頑張るモチベーションをもらいに行くところでもあるなと改めて思った。</p>

<p>ちなみに、いきなり全部英語は無理という人は、<a href="http://vitaljapan.com/vital-english/">Vital English 英語勉強会</a>というのもあり、こちらは説明が英語に加えて日本語でもされて、資料に従って会話の練習をするというような流れになっている。こちらも参加費1000円とは思えない非常に濃い内容。</p>

<p>他にもオススメの英語勉強会あったら <a href="https://twitter.com/dblmkt">@dblmkt</a> まで教えてください！</p>]]></content><author><name>doublemarket</name></author><category term="English" /><summary type="html"><![CDATA[いわゆる外資系企業に転職して半年、英語力の不足をひしひしと感じるのでさらにレベルアップすべく色々と試行錯誤中。お金をかけずに英会話の練習する機会は、探してみれば色々あるもの。最近行った英語に関する勉強会。]]></summary></entry><entry><title type="html">AWSのEBSボリュームのスナップショットを定期的に取る</title><link href="http://b.l0g.jp/aws/periodic-ebs-snapshot/" rel="alternate" type="text/html" title="AWSのEBSボリュームのスナップショットを定期的に取る" /><published>2015-10-19T22:33:30+09:00</published><updated>2015-10-19T22:33:30+09:00</updated><id>http://b.l0g.jp/aws/periodic-ebs-snapshot</id><content type="html" xml:base="http://b.l0g.jp/aws/periodic-ebs-snapshot/"><![CDATA[<p>小ネタだけど、久しぶりに技術的な内容の記事を書いてみる。最近はこういうのはQiitaに書くのが流行り？</p>

<h2 id="ebsボリュームのスナップショット">EBSボリュームのスナップショット</h2>

<p>インスタンスストレージ(インスタンスに無料で付いてくるローカルストレージ)と比べてEBSを使うことの利点の一つに、スナップショットを取れるというのがある。これはもちろん<a href="http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html">AWSのコンソールからの操作</a>でも、<a href="https://aws.amazon.com/jp/cli/">awscli</a>のようなツールを使ってもできるんだけど、いちいちこれらの操作をやるのは面倒になってくる。そうすると、</p>

<ul>
  <li>自動で定期的にスナップショットを取りたい</li>
  <li>古いスナップショットは自動的に消したい</li>
  <li>複数のEBSボリュームのスナップショットをまとめて取りたい</li>
  <li>全ボリュームのスナップショットを取る必要はなく、一部だけ取っておきたい</li>
</ul>

<p>みたいな話が出てくる。</p>

<p>そういう時にはもちろんawscliや各言語のSDKを使って自分でこれを実装してもいいのだが、<a href="https://github.com/colinbjohnson/aws-missing-tools">AWS Missing Tools</a>と言う、AWSに関するちょっと痒いところに手が届くツール集があって、これに含まれるEBSスナップショット取得用のスクリプト ec2-automate-backup.sh を使うと便利。</p>

<h2 id="ec2-automate-backupshの使い方">ec2-automate-backup.shの使い方</h2>

<p>拡張子でわかる通り単なるシェルスクリプトで、中ではawscliを駆使して処理を行っている。なので、前提としてawscliがインストールされていて、credentialの設定が終わっている必要がある。awscliのインストール方法については割愛。</p>

<p>awscliの用意が済んだら、リポジトリをクローンしてきてコマンドを叩けばよい。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  
git clone https://github.com/colinbjohnson/aws-missing-tools.git
  
cd aws-missing-tools/ec2-automate-backup
  
</code></pre></div></div>

<p>コマンドのオプションは<a href="https://github.com/colinbjohnson/aws-missing-tools/tree/master/ec2-automate-backup">README</a>に書いてあるが、イマイチわかりにくい。最低限以下がわかればとりあえずのバックアップは取れる。</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-s [volumeid|tag]</code> : バックアップ対象のボリュームをボリュームID指定するか、特定のタグが付いているもので指定するかを選択する。tagを選んでおくと、例えば「Backup=true」と付いているボリュームを一括でバックアップする、ということが可能。</li>
  <li><code class="language-plaintext highlighter-rouge">-v ボリュームID</code> : <code class="language-plaintext highlighter-rouge">-s volumeid</code>を指定した場合にボリュームIDを指定する。</li>
  <li><code class="language-plaintext highlighter-rouge">-t 'タグ名,Values=値'</code> : <code class="language-plaintext highlighter-rouge">-s tag</code>を指定した場合にタグ名を指定する。上の例のように「Backup=true」のタグが付いているボリュームをバックアップする場合、<code class="language-plaintext highlighter-rouge">-t 'Backup,Values=true'</code>と指定する。ここちょっとわかりにくい。なお、<em>タグはEC2インスタンスではなくEBSボリュームに付ける</em>。</li>
  <li><code class="language-plaintext highlighter-rouge">-r リージョン</code> : リージョン指定。ap-northeast-1とか。</li>
  <li><code class="language-plaintext highlighter-rouge">-n</code> : タグ指定でスナップショットを取った時、スナップショットのNameタグに、元のボリュームIDを入れる</li>
  <li><code class="language-plaintext highlighter-rouge">-k 日数</code> : 指定した日数以上経過したスナップショットは削除可能タグが付けられる</li>
  <li><code class="language-plaintext highlighter-rouge">-p</code> : <code class="language-plaintext highlighter-rouge">-k</code>で指定した日数以上経過したスナップショットを実際に削除する</li>
</ul>

<p>具体的には、以下のようにコマンドを実行する。これは「Backup=trueタグが付いたボリュームのスナップショットを作成し、7日以上経過したスナップショットを削除する」例。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  
bash ec2-automate-backup.sh -s tag -t 'Backup,Values=true' -r ap-northeast-1 -n -k 7 -p
  
</code></pre></div></div>

<p>実際の挙動的には、<code class="language-plaintext highlighter-rouge">-k 7</code>オプションがあるので7日経つとスナップショットにPurgeAllow=trueタグが付けられ、次の実行で<code class="language-plaintext highlighter-rouge">-p</code>オプションが効いてPurgeAllow=trueがついているスナップショットが消される、という流れになる。</p>

<p>これをcrontabに書いておくなりJenkinsで定期実行するなりしておけば、うっかりファイルを消してしまったとか、データベースがぶっ壊れたみたいな時にもサクッと戻せて幸せになれる。</p>]]></content><author><name>doublemarket</name></author><category term="AWS" /><summary type="html"><![CDATA[小ネタだけど、久しぶりに技術的な内容の記事を書いてみる。最近はこういうのはQiitaに書くのが流行り？]]></summary></entry><entry><title type="html">Twitterボットを作るのがひそかな趣味</title><link href="http://b.l0g.jp/misc/my-twitter-bots/" rel="alternate" type="text/html" title="Twitterボットを作るのがひそかな趣味" /><published>2015-05-22T22:26:26+09:00</published><updated>2015-05-22T22:26:26+09:00</updated><id>http://b.l0g.jp/misc/my-twitter-bots</id><content type="html" xml:base="http://b.l0g.jp/misc/my-twitter-bots/"><![CDATA[<p> </p>

<p>プログラミングの勉強にと思ってTwitterボットを作ってみたら、ことあるごとに「あっ、これもボットになってたら便利そう」と思うようになってしまって、さらにいくつか作るという流れ。それなりに便利なのができると、ほっといてもフォロワーが増えていくのが楽しくなってしまう。今まで作ったボットのまとめ。</p>

<h1 id="深田久弥bot-fukadakyuya_bot">深田久弥bot  <a href="https://twitter.com/fukadakyuya_bot" target="_blank">@fukadakyuya_bot</a></h1>

<p>TLでフォロワーのみなさまと盛り上がったのがきっかけで、初めて作ったTwitterボット。ボットをフォローしているユーザが深田久弥の著書「<a href="http://www.amazon.co.jp/gp/product/4101220026/ref=as_li_ss_tl?ie=UTF8&amp;camp=247&amp;creative=7399&amp;creativeASIN=4101220026&amp;linkCode=as2&amp;tag=l0gjp-22" rel="nofollow">日本百名山 (新潮文庫)</a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=l0gjp-22&amp;l=as2&amp;o=9&amp;a=4101220026" alt="" width="1" height="1" border="0" />」に含まれる山名を含んだつぶやきをすると、同書の中からその山の特徴などを表した部分をリプライする。また、1日1回7：00にはランダムに抜粋をつぶやく。</p>

<blockquote class="twitter-tweet" lang="ja">
  <p dir="ltr" lang="ja">
    <a href="https://twitter.com/doublemarket">@doublemarket</a> 夕方、日本海に沈む太陽の余映を受けて、白山が薔薇色に染まるひと時は、美しいものの究極であった。みるみるうちに薄鼠に暮れて行くまでの、暫くの間の微妙な色彩の推移は、この世のものとは思われなかった。
  </p>
  
  <p>
    — 深田久弥bot (@fukadakyuya_bot) <a href="https://twitter.com/fukadakyuya_bot/status/493185509611413504">2014, 7月 27</a>
  </p>
</blockquote>

<p>最初はPHPで書いたのだがいつの間にかうまく動かなくなったりして、Rubyで書き換えた。ソースコードは<a href="https://github.com/doublemarket/twitterbot.rb" target="_blank">Githubに上げてある</a>。作った頃はRubyのエコシステムが良く分かってなくて、bundler使わずにやってたりして、自分でもどうやって動いてるのか理解してなかったなあｗ リプライする山名にどういう傾向があるのか気になったので、<a href="http://f.l0g.jp/" target="_blank">山名ごとにリプライ数を集計する仕組み</a>も作ってみた。基本的に富士山がダントツに多いのだが、例えば最近だと吾妻山や蔵王山(火山活動活発化)、立山(アルペンルート開通)といったように、急にリプライ数が増えた山があると、大体そこでは何かあったということが分かって面白い。</p>

<h1 id="山の天気-yamatenki">山の天気 <a href="https://twitter.com/yamatenki" target="_blank">@yamatenki</a></h1>

<p>毎朝7：30前後に、その週末に天気がいい(登山日和になりそうな)山を地域ごとにツイートする。 土曜と日曜それぞれ分けて判断するようになっている。祝日などの連休にも対応させたいが、めんどくさそうなので先送りしてしまっている。</p>

<blockquote class="twitter-tweet" lang="ja">
  <p>
    【南アルプス】今週末、山に行くなら「甲斐駒ヶ岳」「仙丈岳」「鳳凰山」「北岳」「間ノ岳」、日曜日なら「塩見岳」「悪沢岳」「赤石岳」「聖岳」「光岳」の天気が良いようです。 <a href="http://t.co/YU8l9oRZUo">http://t.co/YU8l9oRZUo</a> — 山の天気 (@yamatenki) <a href="https://twitter.com/yamatenki/status/599341524011372545">2015, 5月 15</a>
  </p>
</blockquote>

<p>山名を含んだメンションを送ると、少し詳しい天気予報をリプライしてくれる。</p>

<blockquote class="twitter-tweet" lang="ja">
  <p dir="ltr" lang="ja">
    <a href="https://twitter.com/doublemarket">@doublemarket</a>【今週末の丹沢山】03/29土曜日は、くもり時々晴れ、降水確率は12時まで30%、18時まで30%。03/30日曜日は、くもり一時雨、降水確率は12時まで50%、18時まで50%。 (神奈川県西部) <a href="http://t.co/0Kh75x9Egg">http://t.co/0Kh75x9Egg</a>
  </p>
  
  <p>
    — 山の天気 (@yamatenki) <a href="https://twitter.com/yamatenki/status/448258476980981760">2014, 3月 25</a>
  </p>
</blockquote>

<p>こちらも最初はPHPで作ったが今はRuby製。<a href="http://t.l0g.jp/" target="_blank">天気が一覧で見れるページ</a>も定期的に生成している。 深田久弥botと違ってうざくない作りなのもあってか、フォロワーが4600以上(2015年5月)もいて、自分の作ったボットの中では一番多い。</p>

<h1 id="hatebu-english-hatebu_e">hatebu english <a href="https://twitter.com/hatebu_e" target="_blank">@hatebu_e</a></h1>

<p>はてなブックマークが一定数以上付いた日本語以外の(正確には、タイトルと本文に全角文字を含まない)記事をツイートする。<a href="http://yakst.com/ja" target="_blank">Yakstという主に英語のブログ記事などを翻訳して公開するサイト</a>を解説しているのだが、そのネタ探しの足しになるかと思って作った。</p>

<blockquote class="twitter-tweet" lang="ja">
  <p>
    GitHub Engineering (3 users) <a href="http://t.co/xWxAkjVCZI">http://t.co/xWxAkjVCZI</a> <a href="http://t.co/aDzjTh7OfY">http://t.co/aDzjTh7OfY</a> — hatebu english (@hatebu_e) <a href="https://twitter.com/hatebu_e/status/600682354470817792">2015, 5月 19</a>
  </p>
</blockquote>

<p>誰得なのかよく分からないボットなので、フォロワーは少ないw</p>

<h1 id="aws障害情報全リージョン-awsstatusjp_all">AWS障害情報(全リージョン) <a href="https://twitter.com/awsstatusjp_all" target="_blank">@awsstatusjp_all</a></h1>

<h1 id="aws障害情報東京リージョン-awsstatusjp">AWS障害情報(東京リージョン) <a href="https://twitter.com/awsstatusjp" target="_blank">@awsstatusjp</a></h1>

<p>仕事でAWSを本格的に使い始めたので、手軽にAWSのステータス情報を知れる手段がないかと思ったのだが、いい感じのボットがなかったので作った。時刻を日本時間に直し、定型的な文言はなるべく日本語に翻訳するようにしている。GCPとかのボットもなければ作ってみようかな。</p>

<blockquote class="twitter-tweet" lang="ja">
  <p lang="ja" dir="ltr">
    日本時間2015年05月19日(火) 07:46:53 EC2 (サンパウロ) お知らせ Network Connectivity <a href="http://t.co/LMkNfK2ZYm">http://t.co/LMkNfK2ZYm</a>
  </p>
  
  <p>
    &mdash; AWS障害情報(全リージョン) (@awsstatusjp_all) <a href="https://twitter.com/awsstatusjp_all/status/600433202222608384">2015, 5月 18</a>
  </p>
</blockquote>

<blockquote class="twitter-tweet" lang="ja">
  <p dir="ltr" lang="ja">
    日本時間2015年05月16日(土) 00:36:27 EC2 (東京) 正常稼働中 [復旧済み] Network connectivity <a href="http://t.co/aq5bOVSJ4H">http://t.co/aq5bOVSJ4H</a>
  </p>
  
  <p>
    — AWS障害情報(東京リージョン) (@awsstatusjp) <a href="https://twitter.com/awsstatusjp/status/599237837637062656">2015, 5月 15</a>
  </p>
</blockquote>

<p>ちなみに、プロジェクトでHipchatやSlackなどのチャットツールを使っている場合、それぞれのTwitter連携機能を使ってこのボットのツイートを拾うようにすれば、AWSの障害情報が流れてくるようになって便利。</p>

<p>ボットを作ると、プログラミングの基礎もだが、Twitter APIやスクレイピングのテクニックなど、作るボットに応じて色々な技術が必要とされるので、新しい言語を覚える人とか、そもそもプログラミング初心者にはもってこいの課題になる。オススメです。</p>]]></content><author><name>doublemarket</name></author><category term="雑記" /><summary type="html"><![CDATA[ ]]></summary></entry><entry><title type="html">「SQLパフォーマンス詳解」という本を翻訳しました</title><link href="http://b.l0g.jp/uncategorized/sql-performance-explained-ja/" rel="alternate" type="text/html" title="「SQLパフォーマンス詳解」という本を翻訳しました" /><published>2015-04-07T17:45:15+09:00</published><updated>2015-04-07T17:45:15+09:00</updated><id>http://b.l0g.jp/uncategorized/sql-performance-explained-ja</id><content type="html" xml:base="http://b.l0g.jp/uncategorized/sql-performance-explained-ja/"><![CDATA[<p> </p>

<p><a href="http://b.l0g.jp/wp-content/uploads/2015/04/sqlperformanceexplainedja.png"><img class="alignleft wp-image-1648 size-medium" style="border: 0px;" src="http://b.l0g.jp/wp-content/uploads/2015/04/sqlperformanceexplainedja-196x300.png" alt="sqlperformanceexplainedja" width="196" height="300" /></a>題の通り、「<a title="SQLパフォーマンス詳解" href="http://sql-performance-explained.jp/" target="_blank">SQLパフォーマンス詳解</a>」(原文タイトル<a title="SQL Performance Explained" href="http://sql-performance-explained.com/" target="_blank">SQL Performance Explained</a>)という本を翻訳しました。PDF版と印刷版が上記サイトから購入できます。</p>

<p>(追記 2017年9月から、渋谷の<a href="http://booklabtokyo.com/">BOOK LAB TOKYO</a>さんでも印刷版を販売していただいています。輸送コストの関係で、サイトから購入するより若干安くなっています)</p>

<p>リレーショナルデータベースにおいて、SQLとインデックスがどのように関連し、どのようにすればSQLのパフォーマンスを良くできるのかを解説した本です。特定のデータベース製品に焦点を当てた本は多数ありますが、この本ではOracle Database、PostgreSQL、MySQL、SQL Serverの4つのメジャーなリレーショナルデータベース製品を同時に扱っていて、それぞれのクセや特徴も分かるように書かれている点が非常にユニークになっています。また、ORMが生成するSQL文の違いなどにも言及されています。</p>

<p>前書きにもあるように、データへのアクセスパスを知っているのは他ならぬ開発者なので、開発者自身がSQLとインデックスについての知識を深めなければ本当の高速化はできない、というのが著者の考えのようですが、もちろんアプリ開発者だけでなくインフラエンジニア、データベースエンジニアの方々にもおすすめできる内容だと思います。</p>

<p>目次とそれぞれの内容は以下の通りです。</p>

<ul>
  <li>第1章 インデックスの内部構造
    <ul>
      <li>インデックスとはそもそも何か、インデックスはどのような仕組みか</li>
    </ul>
  </li>
  <li>第2章 where句
    <ul>
      <li>where句とインデックスの関連、例えば=を使った場合、likeを使った場合など演算子の違いによるインデックスの活用方法など</li>
    </ul>
  </li>
  <li>第3章 パフォーマンスとスケーラビリティ
    <ul>
      <li>インデックスの作り方の違いによるパフォーマンスとスケーラビリティの違い</li>
    </ul>
  </li>
  <li>第4章 結合処理
    <ul>
      <li>結合(join)とインデックスの関連</li>
    </ul>
  </li>
  <li>第5章 データのクラスタリング
    <ul>
      <li>データのクラスタリング(HAクラスタなどではなく、いわゆるクラスタリングインデックスのこと)</li>
    </ul>
  </li>
  <li>第6章 ソートとグルーピング
    <ul>
      <li>ソート(order by)やグルーピング(group by)とインデックスの関連</li>
    </ul>
  </li>
  <li>第7章 部分結果
    <ul>
      <li>MySQLで言うlimitやPostgreSQLのfetch firstのような、結果の一部分を取得するSQL文とインデックスの関連</li>
    </ul>
  </li>
  <li>第8章 データの変更
    <ul>
      <li>update, insert, deleteといった更新処理とインデックスの関連</li>
    </ul>
  </li>
  <li>付録A 実行計画
    <ul>
      <li>各データベース製品での実行計画の表示方法とその読み方</li>
    </ul>
  </li>
</ul>

<p>既にご存知の方もいるかもしれませんが、<a title="Use The Index, Luke日本語版" href="http://use-the-index-luke.com/ja/sql/table-of-contents" target="_blank">Use The Index, Luke</a>という名でほぼ全文がWeb上で公開されています。とはいえWeb上で通しで読むのはかなり辛いですし、PDFあるいは印刷版を購入いただければ、作者・訳者とも嬉しい限りです。</p>

<p>私は、<a title="Yakst" href="http://yakst.com/ja" target="_blank">Yakst</a>というサイトで海外のブログ記事などを翻訳して公開するというのをやっているのですが、原著者(<a title="Markus Winand" href="https://twitter.com/markuswinand" target="_blank">Markus Winandさん</a>)が書かれた<a title="Yakst - SQLに対するMySQLと、NoSQLに対するMongoDBは似ている――主に有害な意味で" href="http://yakst.com/ja/posts/74" target="_blank">ブログ記事を翻訳させてもらった</a>のがきっかけで、この本の翻訳をやることになりました。オンライン販売だけの予定なので書店に本が並ぶわけではないとは言え、自分が訳した本が人に読まれることになるというのは、不思議な感覚です。Markusさんはオーストリア人で英語のネイティブスピーカーではないこともあり、原文は非常に分かりやすい英語で書かれているのですが、それでも翻訳の難しさ、自分の未熟さをひしひしと感じました。素晴らしい本を書いてくださった原著者のMarkusさん、私のつたない訳を丁寧にレビューしてくださった<a title="matsuu" href="https://twitter.com/matsuu" target="_blank">@matsuu</a>さん、ありがとうございました！</p>

<p>訳の問題など、ご意見ご感想ありましたら<a title="doublemarket" href="https://twitter.com/dblmkt" target="_blank">@dblmkt</a>までいつでもご連絡ください。</p>

<p>ちなみに、海外の有益な技術系ブログを翻訳して公開している<a title="Yakst" href="http://yakst.com/ja" target="_blank">Yakst</a>で、翻訳を一緒にやっていただける仲間も募集しておりますので、良かったらそちらも是非よろしくお願いします。</p>]]></content><author><name>doublemarket</name></author><category term="未分類" /><summary type="html"><![CDATA[ ]]></summary></entry></feed>