2021年に読んだ本

はじめに

この記事では2021年に読んだ本を紹介します。

読破していない本を含めて全部で17冊。42Tokyoの課題用に読んだ本が多かったです。

記事中リンクの注意書き

記事の中にAmazonアソシエイトを含むリンクがあります。

Amazonアソシエイトは、Amazonの商品リンクをクリックした方が商品を購入することで、収益を得られるプログラムです。 購入者に追加費用は発生しません。

発生した収益は書籍購入に使わせていただくつもりです。

リンクを踏みたくない場合、お手数ですが書籍名を検索して書籍の情報を収集していただければ……と思います。

読んだ本

読んだ本は、以下の3つのカテゴリに分けて紹介します。

  • 42Tokyoの課題関係
  • 数学関係
  • その他

42Tokyoの課題関係

詳解UNIXプログラミング 第3版

  • 幅広いトピックが載っていて42Tokyoの学習に役立ちました。
  • 特にBashの再実装の課題の際に、参考になりました。

アルゴリズムイントロダクション 第3版 第1巻

Pthreadsプログラミング

  • 食事する哲学者の問題の課題でpthreadを使う必要があり、読みました。
  • pthreadの実装方法、ロックの掛け方の改善方法が載っていて役立ちました。セマフォについては載ってないです。

プログラミング言語C++

  • STLコンテナ再実装の課題にあたり、enable_ifの実装が参考になりました。

新訂版MORE EFFECTIVE C++

  • 仮想関数テーブルの話、例外処理のコストの話が参考になりました。

ストラウストラップのプログラミング入門

  • プログラミング言語C++』より取っ付きやすい内容です。100ページくらいから電卓を実装していて、プログラミング初心者向けではないです。
  • STLコンテナ再実装の課題にあたり、STLの説明が分かりやすかった記憶があります。

コンピュータ・システム

  • 力こそパワー。42Tokyoで読書会が行われブームになった本です。
  • HTTPサーバを作る課題を取り組むために、「第11章 ネットワーク・プログラミング」を読みました。HTTPサーバの実装イメージをつかむのに役立ちました。

Linuxプログラミングインタフェース

  • HTTPサーバを作る課題を取り組むために読みました。
  • 「63章 高度なI/Oモデル」が特に参考になりました。

HTTP詳説―作ってわかるHTTPプロトコルのすべて

  • HTTPサーバを作る課題を取り組むために読んでます。
  • HTTPサーバの詳細な実装が載っていて参考になります。

数学関係

人工知能プログラミングのための数学がわかる本

  • 6月くらいから輪読会で読んでました。
  • 機械学習の部分は難しかったですが、それまでの章で数学をざっくり学べて良かったです。

数学ガールの秘密ノート/微分を追いかけて

  • 人工知能プログラミングのための数学がわかる本』で微分が出てきたので読みました。

数学ガールの秘密ノート/積分を見つめて

  • 10月から始まった統計WEBの輪読会で積分を学ぶ必要があり、読みました。
  • エピローグにあった、円周の長さを半径で積分すると円の面積になったり、円錐の底面積が円錐の体積になったりするの面白かったです。

その他

モダンC言語プログラミング

考える技術・書く技術―問題解決力を伸ばすピラミッド原則

  • 思考を整理する方法を学ぶために手に取ったのですが、途中までしか読んでないです……。

Team Geek

  • チームのコミュニケーションについて学びたくなり買いました。
  • 一回読みましたが、問題が発生した時に読み返した方が良さそうです。

エンジニアリング組織論への招待

  • HRTの精神を守ってたつもりが守れてなかった、何でだろう……と思った時に読んだ本です。
  • Chapter1と2を中心に読んでました。

アプレンティスシップ・パターン

  • XP祭り2021 で紹介され、興味を持ち読んでみました。
  • 壁にぶつかった時に読み返すと良さそうな気がします。

終わりに

今年読んだ本を紹介しました。

42Tokyoの課題では、ネットの資料を参照するよりも、本を読んだ方が効率よく情報収集できるように思います。

来年も本を読んでいけたらと思います。

42Tokyoの学生投票で1位になりました

先日、42Tokyoで学生投票が行われました。

投票は「2021年に最も42らしい学生」(MVS = Most Valuable Student)を選ぶもので、その投票でありがたいことに1位をいただきました。

この記事では、自分が行なったことを振り返りつつ、何故1位になったのか要因を考えていきたいと思います。

そもそも42Tokyoとは

フランス発のエンジニア養成機関です。2020年6月から開校しました。

学費無料、教師不在、生徒同士が教え合うP2Pラーニング、課題解決型学習が特徴です。

42tokyo.jp

私について

2020年6月から42Tokyoで学生をしている、nafukaという者です。

42Tokyoで行ったこと

42Tokyoで出される課題は学生が共通して行うので、課題以外について説明します。

課題以外で行ったことは、コーディング的なことと、その他のことに分かれているように思います。

  • コーディング的なことでは、課題用のプログラムを作成したり、42Tokyoでの学習生活が少し楽になるツールを作ったりしました。
  • その他では、スライドや記事を作成したり、イベントやタスクのリマインド、議事録を作成したりしてます。

以下で、それぞれのトピックについて詳細に説明します。

課題用のプログラム

課題用のテスターとビジュアライザを作成しました。

テスター

課題が正常に動作するかを手動でテストするのは大変なので、テスターを作ることが多いです。

テスターは以下の2つが比較的starが付いているようです。

github.com github.com

日本語でドキュメントを書いているせいか、日本の学生に使われているようです。

ビジュアライザ

f:id:nafuka11:20210503214018p:plain:w500

食事する哲学者の問題 をテーマにした課題のビジュアライザです。

課題では哲学者のログを標準出力に出力するのですが、ログから哲学者の行動が分かりづらいという問題がありました。

このため、Vue.js と Google Charts を使ってビジュアライザを作成しました。

nafuka11.github.io

このビジュアライザを海外の42のコミュニティで紹介したところ好評をいただき、現在は日本以外でも使われているようです。

課題以外の便利ツール

Discord bot

42TokyoではDiscordで学習を行っています(校舎でも学習可能です)。

42TokyoのDiscordサーバは、学生が作成したBotを追加できます。自分もBotを作成し、稼働させています。

自分のBotには以下の4つの機能があります。
(画像は全てテストサーバでのスクリーンショットであり、実際のサーバのデータは含まれていません)

  1. メッセージのブックマーク機能

    f:id:nafuka11:20201125233058p:plain:w500

    • メッセージに特定のスタンプを押すと、DMにメッセージのコピーを送る機能です。
      DiscordはSlackと違い、ブックマーク機能がないので作りました。
  2. イベント通知機能

    f:id:nafuka11:20210404195338p:plain:w300

    • イベントの新規追加時、イベントが翌日行われる時に通知します。
      イベントを忘れないように機能を作りました。
  3. 毎日のサーバ情報の通知

    f:id:nafuka11:20211230214951p:plain:w300

    • アクティブな学生数、総チャンネル数を毎日通知します。
      アクティブな学生数は、「何となく学生が多い/少ない気がする」を可視化するために通知しています。総チャンネル数は、チャンネル上限500を超えないように通知するようにしています。
  4. お遊び的な機能

    f:id:nafuka11:20201125235443p:plain:h220f:id:nafuka11:20211027162218p:plain:h220

    • 猫や犬の画像をテキストチャンネルに送信するコマンドがあります。

アウトプット

スライド

42Tokyoでは課題を提出する際、他の学生からレビューを受ける必要があります。レビューは基本オンラインで、Discordのカメラと画面共有を使って行います。

レビューの説明は、口頭ではなく図やテキストの方が理解しやすいことがあります。そのため、自分はスライドを作ってレビューに臨むことが多いです。

スライドは課題に取り組んだことのない学生を対象として作っているせいか、これから課題に取り組む学生が、自分の作ったスライドを参考に課題に取り組むことがあるようです。

自分が作ったスライドは以下のページから見ることができます。

nafuka11.github.io

ブログ記事

今ご覧になってるブログで記事を書いています。

書いている内容は、毎月の振り返り、課題の解説記事などです。

その他

イベント・タスクのリマインド

ボイスチャットで他の学生と話していて、イベントやタスクのことを忘れてしまう……という声を聞きました。

それもあり、テキストチャットに時々リマインドを書いてます(本当は自動化すべきなのですが、自動化できていません……)。

議事録の作成

42Tokyoで行われるイベントの議事録を今年5月からつけ始めました。

メモを取るのは好きなので、特に苦もなくやっています。

学生の進捗の可視化

毎週日曜日に、入学月ごとの進捗をテキストチャットで共有しています。

お互いの進捗が分からないという問題があったので作成しました。

f:id:nafuka11:20201231194442p:plain:w500

学生投票1位になった要因

正直、自分がやりたいことをやっていたら何故か1位になっていたという感じです……。

今後42Tokyoで学生投票1位になりたい方は、自分がやったことを参考にすると1位になれるかもしれません。

終わりに

投票1位になれたのは、P2Pラーニングで共に学ぶ学生の皆さん、学び場を提供してくださっている42Tokyo事務局があってのことと思います。改めて、この場を借りて感謝申し上げます。

来年も引き続きコミットしていけたらと思います。頑張ります。

C++98でSTLコンテナを再実装した話

こんにちは、42Tokyo Advent Calendar 2021 の6日目を担当する、在校生のnafukaです。

先日、42Tokyo の課題でC++STLコンテナを再実装しました。
この記事では、課題で学んだことを振り返りたいと思います。

どちらかというと42Tokyoの学生向けの内容となっていますが、学生以外の方でも42Tokyoでどんなことを行っているか、参考になるかもしれません。

課題の概要

C++98でSTLコンテナをいくつか再実装する課題です。

STLコンテナとは

STLとは「Standard Template Library」の略で、C++の標準ライブラリの1つです。
その名の通りテンプレートを使ったライブラリで、以下の機能を提供しています。

  • コンテナ:データの格納(データはテンプレート引数にし、格納方法だけクラスで定義する)
  • イテレータ:データの要素アクセス
  • アルゴリズムイテレータを介したデータの操作
  • 関数オブジェクト:処理のクラス(行いたい処理を引数に渡せる)

コンテナ、イテレータアルゴリズムの関係を図にすると、以下のようになります。

f:id:nafuka11:20211114225401p:plain:w540

今回は、コンテナ以外にも、コンテナに結びつくイテレータ、およびアルゴリズムの一部を再実装することになります。
また、コンテナの一部では関数オブジェクトを使用します。

再実装する内容

再実装するSTLコンテナは以下です。これらコンテナのイテレータも実装が必要です。

  • vectorvector<bool> 以外)
    • 要素の追加/削除によって再確保が起こる配列。
  • map
    • 辞書のような、キーとそれに対応する値を持ったデータ構造。
  • stack
    • 後入れ先出しのデータ構造。
  • set(ボーナス課題。やらなくてもよい)
    • 要素の重複のない集合。

STLコンテナ以外には、以下のクラス/構造体も再実装が必要になります。

  • iterators_traits, reverse_iterator
  • enable_if, is_integral
  • equal, lexicographical compare
  • pair, make_pair

その他の制約

再実装では実行速度の制限があります。実装元のSTLコンテナの20倍まで許容されます。

再実装にあたり、リファレンスが指定されています。
cplusplus.comcppreference.com(以下cplusplus、cppreferenceと略します)を参照できます。

課題で得られたこと

  • コンテナの内部実装、データ構造
    • 計算量を実現するための実装方法が分かりました。
  • 型から型を取り出す面白さ
    • enable_ifis_integral でテンプレート引数から型を取り出せるのがとても面白かったです。
  • リファレンスサイトではなく規格を読むことの大切さ

成果物

github.com

取り組み

流れ

いきなりコンテナから実装するのは実装量が多く大変そうだったので、最初はコンテナ以外の enable_if, is_integral などを実装しました。
enable_if, is_integral の実装には『プログラミング言語C++ 第4版』を参考にしました。

その後、vector→map→stack→setの順にコンテナを実装しました。

コンテナ実装にあたり、まず 江添亮の入門C++ の「vectorの実装」を読んで実装の大まかな流れを掴みました。
江添亮の入門C++では、イテレータがポインタになっているため、イテレータの実装について調査しました。reverse_iterator の実装が参考になりました。

コンテナの各関数については、cplusplusClangGCCのソースを参考にしました。

実装

各コンテナ

vector, mapについては記事を書いたので、そちらを参照ください。

nafuka.hatenablog.com

nafuka.hatenablog.com

stackはコンテナのラッパーです。コンテナの末尾に要素を追加/削除することで、スタックのような後入れ先出しのデータ構造を実現します。
実装はラップしたコンテナのメンバ関数を呼び出すだけです。

f:id:nafuka11:20211205234144p:plain:w300

setはmapのkeyがない版です。木を持ち、mapと同じように木のメンバ関数を呼び出します。

f:id:nafuka11:20211205234210p:plain:w600

テスト

f:id:nafuka11:20211205234224p:plain

C++でテストコードを作成し、それをShellScriptでラップしました。
テストでは、関数の出力、各関数の実行速度をSTLコンテナと自作コンテナとで比較します。

大変だったこと

リファレンスの差異と規格探し

リファレンスサイトは cpluspluscppreference が指定されているのですが、それぞれで関数定義が異なりました。

具体的には、map::atreverse_iterator::operator= など、cppreference にあって、 cplusplus にない関数がありました。

どちらが正しいのか知るため、C++98の規格を探しました。

cppmap.github.io

まず、こちらのサイトを参考に、C++03のJIS規格を見たのですが、英字が文字化けしていて読めませんでした。

次に、「ISO/IEC 14882:1998」でググって出てきたpdfを見ました。これは多分C++98の規格な気がします……がネットに落ちてるものなので、信頼できるものなのか分かりません。

とりあえず見たところ、 map::atreverse_iterator::operator= はpdfにありませんでした。

どちらかと言うと、cplusplusの方が規格に沿っている部分が多いのかもしれません。
ただ、全てが合っているわけではなさそうです。cplusplusだと iterator_traits はstructではなくclassになっていました。

レビューでの説明

42では、課題は学生同士のコードレビューで評価されます。

レビュー相手は誰になるか分かりません。C++を学んだことがない方とマッチする可能性もあります。

今回の課題は、

  • C++というC言語に似ているが違う言語を使う
  • 実装する関数が144個と多い

です。これにより、全体像を把握せずレビュアーがコードを見ると、どこに着目すればいいか分からない状態になることが予想されました。

そのため、全体像を把握するためのスライドを作成しました。テキストでもいいのですが、データ構造は図にした方が分かりやすいので、スライドにしました。

赤黒木についても、実装が複雑だったので別でスライドを作成しました。

42において、コードレビューはお互いの学びを深める場です。
課題の詳細を全て説明するよりも、ざっくり課題の概要を説明した後にMakefileC言語のことを話した方が、場合によっては相手の学びにつながることがあります。
(もちろん場合によります。相手の理解度に合わせて柔軟に説明内容を変え、学びをなるべく多くするのが大切だと思っています)

スライドが相手の学びを深めるためにも役立ったかなと思います。

レビュー用の資料を作っておくと、後で自分が忘れても読み返せたり、これから課題に取り組む人が参照できるのでとてもおすすめです。

参考にした書籍・URL

URL

書籍

コンテナ、イテレータアルゴリズムの説明が分かりやすいです。

enable_ifの実装が参考になります。

赤黒木の実装で参考にしました。擬似コードが載っています。オススメの読む順番は、付録 B.5 木 → 12. 2分探索木 → 13. 2色木 です。

終わりに

この記事がどなたかの参考になれば幸いです。

明日は、hosuzukiさんが

プログラミング未経験者が42Tokyoの入学試験「Piscine」に合格のするためにした「ありとあらゆる前準備」(39日間)

について書いてくださる予定だそうです。そちらの記事もお楽しみに!


追記

hosuzukiさんの記事が公開されました!以下からアクセスできます。 note.com

また、42Tokyoのアドベントカレンダーから他の方が書いた記事を見ることができます。こちらも是非参照ください。 qiita.com

42Tokyoでの2021年11月振り返り

エンジニア養成機関、42Tokyo での活動について知ってもらうために、11月に42Tokyoであったことについて振り返る記事です。

自分が取り組んでいる課題や、行われたイベント、課題外の活動について振り返ります。

今月はイベントが盛りだくさんの月でした。

やったこと

42Tokyoの課題

C++98でコンテナクラスの再実装をする課題をクリアした後、Webサーバを作る課題をメインで行っています。
たまにTypeScriptでオンラインゲームを作る課題に取り組んでいます。

C++98でコンテナクラスの再実装をする課題をクリア

f:id:nafuka11:20211204224652p:plain
自作テスターの出力

C++98でvector, map, stackなどを再実装する課題です。
8月から始めてようやくクリアしました。かかった時間は約121時間(11月で13時間)でした。

この課題では、以下のことを学べました。

  • STLコンテナのデータ構造と、計算量を実現するための実装方法
  • リファレンスサイトではなく、規格を読むことの大切さ

詳細については、後で振り返り記事を書けたらと思います。

C++98でWebサーバを作る課題

HTTP/1.1に準拠したWebサーバを作る課題です。複数のクライアントに対応するために、Apacheのようにプロセスをforkするのではなく、NginxのようにI/Oを多重化する必要があります。

この課題は2-3人で取り組む課題で、現在2人で取り組んでいます。

進捗は、echoサーバを試しに作った後、HTTPリクエストのパース処理を実装しています。

大変な点

  • HTTP/1.1の仕様を把握するために、RFCを読み込むのが結構大変です。

面白い点

  • echoサーバを作ってみて、ブラウザからHTTPリクエストを受け取った時は感動しました。Chromeデベロッパツールでも見れますが、自分が作ったサーバが文字列を受け取れると達成感がありました。
  • I/Oの多重化が面白そうです。I/Oを多重化するための関数はselect, poll, epoll, kqueueのいずれかを選択できます。kqueueを使う予定なのですが、ソケット以外にもファイル、プロセス、シグナルなど様々なイベントを受け取れてすごいです。Node.jsの非同期I/Oにも使われているそうで、ワクワクします。 engineer.recruit-lifestyle.co.jp

TypeScriptでオンラインゲームを作る課題

Pong というゲームをオンラインで遊べるWebサイトを作る課題です。

  • フロントエンド:TypeScriptならどのフレームワークでも可
  • バックエンド:NestJS
  • DB:PostgreSQL
  • 認証:42のOAuth認証, 2段階認証も有効にできる
  • その他:Pongをオンラインで遊べるだけでなく、フレンド機能やチャット機能等もあり

Webサーバを作る課題をクリアした後の課題なのですが、先に進んでいる学生とたまにモブプロをしていました。

イベント

5つのイベントに参加しました。

VR体験会

42Tokyoの学生が校舎にOculus Quest 2を持ち寄って、持っていない学生にVRを体験してもらうイベントです。

42TokyoにあるAssociation、42XRが企画しました。Associationは大学のサークルのような、学生の集まりです。昨今の情勢もあり、消毒対策などされた上で開催されました。

体験内容は はじめてのQuest 2 をやったそうです。

自分は機材トラブル用の予備要員として参加しました。 久々に校舎に行って、Discord以外で学生とお話できて楽しかったです。

コードゴルフ

Python3.9で eval を使わずに計算機を作りましょうというお題で1時間コードゴルフをしました。

愚直に正規表現を使って実装したのですが、後で exec が使えることに気づきました……。
優勝はなりませんでしたが、勉強になりました。

42Tokyoの学生が作ったアプリ・サービスを見たり体験談を聞く会

42Tokyoの学生が企画したイベントで、4人の学生にそれぞれのアプリ・サービスを作った背景などについて伺いました。

作ったものはWebアプリ、スマホアプリ、ECサイトと様々で、お話を聞いて刺激を受けました。自分も何か作りたいという気持ちになりました。

レバテックのポートフォリオ作成ガイダンス

全2回のガイダンスで、今月は第1回目が行われました。

今回の内容は

についてでした。

「選考通過のためのポートフォリオ戦略」はWebアプリにフォーカスした内容で、レベル別にどんな機能が必要か説明されていました。

次回はポートフォリオのより具体的な内容について説明いただけるそうで、楽しみです。

シュルレアリスト中野圭先生による『アート×プログラミング』講義

このイベントは校舎・Zoomの同時開催でした。校舎から参加しました。

f:id:nafuka11:20211204222019j:plain
講義の内容(許可を得て撮影しています)

オルゴールライブコーディングでは、Sonic Piとオルゴールを使って、その場で音楽を作られていました。

講義の内容は難しかったのですが、Processingが話に上がり、久しぶりにやってみたくなりました。

校舎・Zoomの同時開催は面白い試みだったので、またあるといいなあと思います。

その他の活動

統計WEBの輪読会(10月から継続)

10月から始まった 統計WEB の輪読会に参加しています。

今月はStep1. 基礎編の「10. 条件付き確率とベイズの定理」まで進みました。

自分の発表週では、「6. 分散と標準偏差」と「7. 場合の数」を担当しました。

f:id:nafuka11:20211204223451p:plain:h300
Notionで作成した資料の一部

発表はNotionを使って行っています。NotionはLaTeXを使って数式を書けるのですが、LaTeXをベタ書きするのが大変なので、数式は Mathcha を使って書き、LaTeXをNotionにコピペしています。MathchaはLaTeXを補完してくれるのでとても楽です。

SpeakerDeckのアカウントを作ってみた

今後Zennに記事を投稿する予定なのですが、ZennはGoogleスライドに対応していないので、SpeakerDeckのアカウントを作ってみました。

speakerdeck.com

42Tokyoの課題に特化したスライドではなく、より一般的な内容のスライドを上げられたらと思っています。


ちなみに、先月の記事 で就活したいと話していたのですが……課題やイベント、統計WEBの輪読会をやって全然できていないです。
来月以降はチーム課題にコミットしたいのと、新カリキュラム「Road to」が始まるので就活するのは難しいかもと思っています……。

42tokyo.jp

コミット時間

今月のコミット時間は178時間35分、1日平均5時間57分でした。

コミット時間の推移は以下です。

f:id:nafuka11:20211203213100p:plain
コミット時間の推移

チーム課題を始めてから、課題にコミットする時間が増えました。

今後やること

Webサーバを作る課題を引き続きやっていきます。12月か1月くらいに完成できたらと思っています。