😃

42Tokyoで学習したこと

2023/05/30に公開

転職活動用に42Tokyoで学習したことを簡単にまとめます

前提として

42Tokyoの課題はpdfが一枚渡されて、そこに書いてある文章を自分なりに解釈してソフトウェアに実装していくという形式で進めていきます。
例えばnginxの再実装の課題文の一例は以下です

  • We will consider that NGINX is HTTP 1.1 compliant and may be used to compare headers and answer behaviors.
  • Execute CGI based on certain file extension (for example .php).

このような箇条書きが30項目くらいあるpdfから仕様を読み取って実装をしていくので、ハンズオン形式よりも現場の設計書を元に1から実装していく形式に近い形になっています。
42Tokyoでは現場をかなり意識しているところがあり、課題達成も機械採点ではなく、生徒間でのレビューによって条件を満たしているかを判断します。これは現場のコードレビュー→リリースと同じ形式です。

1. C言語

42Tokyoの開発言語は8割C言語のため、C言語の仕様を知らないと実装ができません。
特に自分が学んでよかった部分は以下です

- 文字列の仕組み

文字列の終端はnull文字と呼ばれる、asciiコードの0x0で成り立ちます
基本的に文字は0x0で終わっていることで一つの文字列として認識することができます

- 型

数値を表す型は複数ありますが、それぞれ違いをちゃんと学びました。
C言語における型変換の仕組みを調べたときの記事
https://zenn.dev/pictogram/articles/e20f5aaf2eda04
また浮動小数点についても学びました。IEEE754という浮動小数点の標準を示した規格がどうなっているかを学びました(細かい計算方法は忘れてしまいました)

- メモリ管理

ポインタの概念を学び、malloc/freeなどを使い倒しました。
メモリリークの仕組みなどをトライ・アンド・エラーで学んでいきました。
特に印象に残ったのは以下の記事の課題で、いわゆる文字列を読み込んで改行までの部分を切り取って返すだけのコードです。
https://qiita.com/LabPixel/items/201c3f9824fae302971c

ただこの単純な関数を自作するのがとにかく難しく
mallocのお作法としてプロセス内で使えるメモリが枯渇した場合、malloc自体が失敗する可能性があります。
このときmalloc()がnullを返却するので、nullチェックを必ず入れないといけないのですが、もしnullだった場合ちゃんとそれまでに確保したメモリをfreeしてあげないとleakしてしまいます。
メモリ管理の初心者としては大変苦戦しました。

アルゴリズム/データ構造

簡単なデータ構造とクイックソートを実装で使用しました

2. システムコール

42Tokyoの課題は基本的にはC言語 + システムコールを駆使して車輪の再発明をするという課題がほとんどです
そのため多様なシステムコールについて学びました

  • io系 read/write
  • メモリ管理 malloc/free
  • シグナル処理 signal/kill
  • プロセス管理 fork/waitpid
  • fd管理 dup/dup2/pipe
  • execve
  • bashのbuilt-in用の関数 getcwd, chdir
  • 並行処理のpthread

etc..

3. インフラ/ネットワーク

debianをvirtualboxにinstallして設定を行う課題

  • sudo/sshのinstallや設定
  • ユーザー作成, パスワードポリシーなどの設定
  • cronでcpuやメモリなどのパフォーマンス監視を実行

ネットワークの課題

  • ルーターの仕組み
  • サブネットの切り分けなど

dockerの課題

  • debianのイメージからnginx, wordpress, mariadbをフルスクラッチで起動できるように
  • 3つのコンテナが疎通してアプリケーションが機能するように

4. 並行処理

並行処理で有名な問題である「食事する哲学者」を実装しました
https://ja.wikipedia.org/wiki/食事する哲学者の問題

5. ウェブサーバー

nginxのクローンアプリケーションを作成します

  • RFC7230など(HTTP/1.1)を基準にして、非同期ブロッキングI/Oのウェブサーバーを作成します
  • nginxのconfigを基準に設定ファイルを作成し、反映できるようにする
  • CGIなども実行できるようにする
    以下がソースコード
    チーム課題ですが、大体3ヶ月くらいかかりました
    https://github.com/42Student-July/webserv_star_of_july

6. その他

  1. CSAPP読破
    カーネギーメロン大学のCSで使用されている教科書を読みました
    https://zenn.dev/pictogram/articles/56f8aaad113ffb

  2. AWS Academy
    SAA相当の知識が得られるプログラムを受講しました
    以下は認定バッジ
    https://www.credly.com/badges/1055ef30-b9d8-4b3e-bfa5-85780af4fd96?source=linked_in_profile

  3. 英語
    そもそも課題はすべて英語です。
    なので英語でのドキュメント読み込みの勉強になりました。
    読解力がついたので、RFCや言語仕様書なども読めるようになりました(とはいってもDeepLは手放せないですが)

他にも色々勉強したことはありますが、まとめるとこのような感じになります。
2年間という月日、長い月日ではありましたがあっという間に過ぎました。
これが本業のweb開発のためになるのかはわからないですが、自分が改めて技術が好きだということを再認識できたよい機会だったと思います。

他の卒業した方の記事
https://note.com/u_yuu/n/n67b7bfca642b
https://note.com/kotabrog/n/n292c0b5ef071

Discussion