プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

Apache Kafkaの触りだけ勉強してみた

仕事の関係でApache Kafkaを扱えるようになる必要がだんだん出てきたので、これを機会にしてKafkaについて学び始めました。実際私がどれだけKafkaの運用をすることになるかは分からないんですけどね。

以下、適当に調べたことを適当に書き散らして記録を残します。主に書くことによる備忘録。

そもそもApache Kafkaって何?

一言で言うと「とにかく凄いキュー」と理解。公式サイト曰く、"Apache Kafka™ is a distributed streaming platform"とのことで、キューとしてだけ使われているのではないのですが、取りあえずの理解としてはそんなに間違っていないはず。

元々LinkedInで開発されて、その後Apacheに寄贈されて今も活発に開発が続けられているようです。

大量のデータを(リアルタイムに近い形で)扱う必要のある企業がよく使っているようです。

概念とか構成とか

いきなり公式サイトに行っても意味不明だと思ったので、一旦以下のような記事を読んだり手を動かしてみて、だいたいの概念を掴んだ後に公式サイトを見ました。

これらを見た後、公式サイトのQuickstartをやってみて何となく理解。

今までキューとかpub/subシステムを扱ったことがなかったので、Producer, Broker, Consumerと言われても何のことだか分からなかったのですが、上記ステップを踏む中で一応の理解は得ました。

Kafkaの構成としては中心にBrokerというやつがいて、そこがhubになってデータをやり取りしていて、Kafkaにデータを送りたいときはProducerを介してデータを送り、Kafkaからデータを取り出したいときはConsumerを介してデータを取得するという感じみたいです。

Kafka側で一旦データを受け持ち、データを取得する側がKafkaに問い合わせてデータを取得するので色々都合がいいみたいです。

で、Kafkaはクラスタを組める作りになっていて可用性が高いよ、ということらしく、そういったクラスタの情報とか何たらのデータをクラスタ間で持つようにApache Zookeeperを利用しているとのこと。

おすすめ学習ソース

で、最初の一歩はネット上のソースで何となく理解したのですが、いまいち理解しきれなくて色々学習ソースを探している中、有料ですがいい学習ソースを見つけました。

https://www.udemy.com/kafka-cluster-setup

しょっちゅう90%近いセールを行っていることで有名なUdemy*1ですが、上記Udemyのコースをたまたま見つけてやってみたところ、かなりよかったです。AWS上にZookeeperとKafkaのクラスタを組んで、Kafkaの運用の仕方だけでなく、Zookeeperはどういう情報を持っているかとか、Kafkaのパフォーマンスを確保するときに注意した方がいいことなども含めて教えてもらえるので、初心者の私としては学びがありました。

仕事で既にKafka運用している人には当たり前すぎる内容しかないと思うのですが、これから学び始めようとする人にはオススメできると思います。

講座内の"Configuring Kafka in production is AN ART"という文言が非常に印象に残っています。

最後に

Apache Kafka、いじっていたら何となく面白くなってきたので、仕事のことも視野に入れつつ、趣味でも少しずつ触ろうかなと思いました。

*1:今回のコースは90%オフだかの時に見つけて、1200円でゲットしました

『SCRUM BOOTCAMP THE BOOK』を読みました

以前の記事でも書きましたが、セルフホスティングしているソフトウェアの中にプロジェクト管理ツールのTaigaがあり、これを有効活用したいと思いつつ、このTaigaはスクラムを知っていること前提のツールなのでメニューに出てくるものの意味が分からず、今までちゃんと使えていませんでした。

新年になり、新しい目標も立てたので、これを機会に少しスクラムのことを勉強してTaigaを上手く使えるようになろうかと思い、以下の本を読むことに。

SCRUM BOOT CAMP THE BOOK

SCRUM BOOT CAMP THE BOOK

結論から言うと、スクラムの全体像を少ない時間で把握するにはとてもいい本でした。

「スプリントをこなしていく中で、ベロシティを安定させていけるようにチームを育てていくのが重要だ」*1というようなことが書かれていたり、単に単語の説明とかで終わるのではなく、外すと致命的になりかねないポイントについても書かれていて、なるほどと思いながら最後まで読めました。

そもそもこれを読んだ目的は単に使われている用語とか概念が知りたかっただけなので、実際のチーム開発で起こりうる事例みたいな記述の箇所は自分にとっては特に必要なかったのですが、必要としている人にはちょうど良い分量なのではないかと思います。

本自体はマンガ部分含めて270ページなので、割合サクッと読める(割にちゃんと内容も書いてあった)のもよかったです。

あと、個人的な趣味嗜好の話しになりますが、こういう「マンガを挿入しながら説明していくスタイルの本」の中では、マンガで描写されるストーリーや説明、マンガ自体の絵柄が本自体の方向性から浮きすぎず、いい感じに作用していると思います。*2

*1:という風に私は理解した

*2:中には「これ、マンガを入れない方がいいだろ」と思えるような書籍もあるので。

『インフラエンジニアの教科書2』を読みました

前回のエントリから随分と期間が空いてしまってよくないなあと思ったので、最近勉強で読んだ本の感想を書くことでアウトプットの習慣を取り戻したいと思いながら書いてます。

インフラエンジニアの教科書2 スキルアップに効く技術と知識

インフラエンジニアの教科書2 スキルアップに効く技術と知識

今回読んだ本は『インフラエンジニアの教科書2』です。

読もうと思ったきっかけ

今年の4月に転職し、(ハードウェアを扱わない、クラウド寄りの)インフラエンジニアとして仕事をしていく中で痛感したのが、圧倒的な知識不足でした。

「知識不足」と一言で言ってもどの分野の知識が足りないのかによって取る行動は変わると思います。

ただ、私の場合、「何か全体的に分からないけど、具体的に何が分からないのか分からない…」という状態に陥っていました。

そんな中、チームリーダーや上司と別件で相談した時、「Linuxのプロセス処理とかファイル管理に対する知識が足りなそうだから、その辺りを何かで読んで勉強してみたら?」と言われたので、何かちょうどいい本無いかなと本屋で探してみたところ、内容のレベル・量ともにちょうど良い塩梅だなと思えたのが前述の『インフラエンジニアの教科書2』でした。

読んでみて思ったこと

分量的には2日あれば読み切れるくらい(早い人なら1日)の量だったので、最近書籍を読む週間がなくなりかけていた自分にとってはちょうどよかったです。

内容に関しても個人的にはChapter-02のOSの項目がとてもよく、これだけで買って読んだ価値があったと思いました。プロセスとスレッドに関する知識があやふやだったこともあり、このChapter-02で書かれていたことを読んで結構頭の中が整理できたように感じます。

この本を読む直前、SECTION 13の「インフラエンジニアのファイル管理」の項目内にある「ログ出力でディスク容量を使い果たした」事例と同じような事例を業務中に遭遇していたこともあり、実際の業務の内容と結びついて読める箇所が多かったことも理解を深めるのに一役買っていたと思います。

ただ、(この本の著者も意図しているのでしょうが)この本に書いてある内容の深さはどの項目も基礎となる部分に終始していると思われるので、読んだ後重要なのは、この本を読み終わった後、より深い内容を扱った書籍を読んだりすることが大切なのかなと感じました。

なので次は"Systems Performance"をちょびちょび読んでいます。

Systems Performance: Enterprise and the Cloud

Systems Performance: Enterprise and the Cloud

『インフラエンジニアの教科書2』で扱っている内容と地続きになっているわけではないのでしょうが、現在業務をしていく中で足りなそうな知識が丁度書かれていそうだなと思ったので、次はこれの読破(と得た内容の実践)に挑戦しています。

セルフホスティングに手を出してみた

種々様々な理由により、前からセルフホスティングとかその辺りに興味があった。

けど、何度か手作業で管理してみて運用に破綻して、たいしたデータではないから作り直しとかをしていていたりしていた。

そういうこともあり、OSS版herokuみたいな仕組みがないかどうかgithubのtrendingを見ながら何となく探したりしていて、最近Hacker Newsを見ていたらCloudronというものを見つけたので試してみることに。

公式のCLIがnode v6.5では動かなかったり、自分のPCのOpenSSLのバージョンが意図せず古いものを使っていたりで色々はまったけど、今はAWS上に一つ自分用のサイトを構築することには成功。

Cloudronを使うとghostMattermostとかTaigaといったアプリを簡単に複数構築できるようになるので、中々素性が良さそうだなというのが第一印象。

しばらく色々試してみたい。

El Capitanをクリーンインストールして入れ直してみた

ここ最近自分のPCが調子が悪くてしょっちゅう動かなくなり、強制的に再起動せざるを得ない状態が続いていて不便だったので、OSをクリーンインストールしてみたらとりあえず状態がましになって動くようになってよかったという話。

クリーンインストールを検討する前に何で動作がおかしくなってるのかアクティビティモニタと睨めっこしてましたが、原因が特定出来なかったのでやむなくこうした次第。

ただ、SSDの残り容量が3GBとかなりキツキツだったので、これが根本的な原因じゃないかなと思います。

バックアップを取った後、クリーンインストールをしてからデータ移行アシスタントを使いデータを戻してみたところ、特に何か減らしたわけでもないのに空き容量が3GB → 40GBになった。

37GB分もキャッシュが残ったりすることなんてあるのだろうかと思いつつ、とりあえずPCがまともに動くようになったので人権を取り戻せましたね。

人権を取り戻せたのでそろそろブログ更新も復活させたいなと思いました。

やりたいと思っていることを書き出してみる

2016年の抱負の記事で書いたことと被るけど、最近勉強していても色々なことに目移りして一つのことをやりきることが出来ていないように感じるのと、今自分がやりたいことの種類がどれくらいあるのかちゃんと把握してなかったので書き出してみようと思ったので書いてみる。

takuan-osho.hatenablog.com

基礎固め系

アルゴリズムやプログラミングの基礎作り

以下の本を読むだけでなく、中のコードをちゃんと書いて手を動かして理解してアウトプットすることを含んで取り組んでみる。

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)

これは最近取り組んでいるが、とてもいい本なので終わったら感想エントリ書きたい気持ちでいる。

オンラインジャッジではじめるC/C++プログラミング入門

オンラインジャッジではじめるC/C++プログラミング入門

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

これらは私のアルゴリズム周りの弱さを補強する目的で。特に『プログラマの考え方〜』はいい本なので今年半ばまでに最後までやりきって身につけたいと思ってる。

セキュリティ周り

一度最後までやったことはあるが、すっかり頭の中から抜けているので復習する必要がある。

コードを書く系

技術的な分野

今後のことを考えて以下のことを練習していきたい

  • ES2015を前提にしたJavaScriptを書く
    • ツールの使い方を覚えるというより、Web標準や仕様にのっとった知識に基づくモダンなJSを書けるようにする、ということ
    • fetch APIとかPromiseとかよく知らないので、そういう所を埋めていく。
  • 今時のCSSの書き方を学ぶ
    • IEのサポートポリシーが変わった現在、たとえばfloatレイアウトではなくてflexboxを活用していくなど、モダンかつ標準に則ったCSSを書けるように出来たらいいなと思っている。
    • どちらかというとCSSは設計力の方が問われると思うので、その辺りも埋めていきたい。
  • Node.js
    • Node.js自体やエコシステムの理解を深めるのも大切だけど、それよりかはコールバックによる非同期プログラミングのやり方とかイベント駆動のプログラムのやり方を学んでいきたいという意味で書いている。
  • iOSプログラミングとSwift
    • これは単純にアプリを作って「これ、自分で作りました」とアピールできるものが欲しいという意味。

あとPythonとかGoとか書こうと思えば色々あるけど、現状の仕事とか今後のことを考えたらJavaScriptCSS力高めた方がいい気がしているので、この2つを優先した方がいい気がしている。

読書系

基礎固め系よりかは優先順位下げるけど、実力をつけていくために読んで身につけておきたいものだったり、純粋に興味があるから読みたいもの。

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

EPUB 3 Best Practices

EPUB 3 Best Practices

基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版

基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

Code Reading―オープンソースから学ぶソフトウェア開発技法

Code Reading―オープンソースから学ぶソフトウェア開発技法

余力があればやる系

機械学習

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

取りあえず今手持ちのものでパッと思いついたものをリストアップしたので、コレヲ軸にして今月は勉強していこうと思った。最初の方に挙げたものは実際着手しているので

WEB+DB PRESS vol.80の特集「エンジニアの学び方」の書評を読んで気になったので該当書籍買って読んでみた

要約

  • はてなブックマークを眺めていたら、「エンジニアの学び方」というタイトルの書評エントリを見かけた。
  • 記事を読む限り、今の自分のニーズに合致しそうなことが書いてありそうだったので、該当書籍の「WEB+DB PRESS vol.80」を買ってみた。
  • 該当特集の「エンジニアの学び方」を読んだところ、この特集内で言うところの「深い理解」軸と「応用対象」軸の学びに関して2年間くらい悩んでいたため、今後の学習計画の糸口が出来て非常に良かった。

Web+DB PRESS vol.80を購入したきっかけと実際に特集を読んでみて

直接のきっかけは上記要約に書いたように「『エンジニアの学び方』というタイトルの書評エントリを見かけて、内容が気になったから」というものです。

「じゃあ、何で該当エントリを読んで特集の内容が気になったの?」というと、2年くらい前から「個別具体的な技術とか知識とかツールの使い方ばかり覚えてきたけど、そういったものを自分の作りたいものに上手く活かせない…どういう風にしたら学んできた技術なりツールの使い方を実際のプロダクトを作る際とか目の前に表れた問題を解決する時に応用できるんだろう?」という疑問を持っていたからです。

そんな疑問を持っていた私に、この「エンジニアの学び方」では以下の2つのモデルを教えてくれました。

  • 知識には3つの軸がある

    1. 「広い視野」軸
    2. 「深い理解」軸
    3. 「応用対象」軸
  • 学びには3つのフェーズがある

    1. 「知識収集」フェーズ
    2. 「抽象化」フェーズ
    3. 「応用」フェーズ

それぞれの詳細について書くと長くなってしまうので割愛しますが、上記のモデルで言うと私は知識も学びも1ばかりに偏ることをずっとしていて、2,3を疎かにしていることが特集を読んだ後はっきりしてきました。

2,3に当たる部分を疎かにしていることは何となく自覚していたのですが、「抽象化」フェーズといった明確な名前と位置づけを与えられたことで「今自分がしている学びはどのフェーズに当たるもので、現在の自分に足りない知識はどの軸のものか?」といった判断がしやすくなったと思います。

領域は多少違えど、デザインパターンの文脈やリーダブルコード的な文脈で良く言われている「名前重要!」という話しと被るところが多く、理解をモデル化して適切な名前を与えることの大切さを実感できました。

特集「エンジニアの学び方」の内容に関してもっと知りたい方は著者の西尾さん自身がブログに書いているので、それを読むといいと思います。

結論

非常に俺得な記事でしたので非常に幸せになりました。

特集記事を書いた西尾(@nishio)さん、書評エントリを書いたmarcoさん、ありがとうございました! 手を広げすぎると失敗するので後回しになると思いますが、この特集が生まれるきっかけになった『コーディングを支える技術』も良い本だと聞いているので、いずれ買って読んでみようと思います。

特集気になった人はWEB+DB PRESS vol.80買ってみるといいと思います。他の特集も「Web技術入門」だとか「テスト駆動インフラ」だとか「Courseraで計算機科学を学ぼう」だとかあるので、私みたいに基本的なところがボロボロ抜け落ちている人間にはオススメだと思いますよ。

WEB+DB PRESS Vol.80

WEB+DB PRESS Vol.80

電子書籍版もあるみたいですね -> 電子書籍版 Web+DB PRESS vol.80