【42 Tokyo】課題の振り返り - minishellまで

42 Tokyo の First Circle を半分完了した。
42に感謝の気持ちを込めて課題を振り返る。
後学のため参考にしたリンクを添える。

![スクリーンショット 2024-02-21 105716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/f3316fcf-0fc0-1e7a-9c39-18699d59716c.png)

## Libft
標準Cライブラリの一部を再実装した。
文字列関数、メモリ関数、リスト関数などを自作した。
ft_atoi関数のフロー処理が大変だった。
※manを要参照

Makefileの書き方に苦労した。
再リンクすると課題は不合格なので依存関係に注意。
https://qiita.com/shwatanap/items/4032af12ddb074e5f27a
https://zenn.dev/pictogram/scraps/6d950680e55

下記のテストツールを使ってKO、セグフォを解消した。
https://github.com/usatie/libft-tester-tokyo
レビュー対策でNULLチェックも対応した。

"Libft-00"という課題もあり迷うが、そちらは無視してOK。
※少しずつ課題を進めたい人用の救済措置

## ft_printf
「printf」関数を自作した。
可変長引数を使って、指定されたフォーマットに基づいて文字列を構築した。
Piscine中から認知されていた「車輪の再発明」を代表した有名な課題。

ft_printfのMakefileからlibftのMakefileを実行するのに苦労した。
```
all: ${NAME}

$(NAME): $(LIBFT) ${OBJS}
	cp $(LIBFT) $(NAME)
	${AR} ${NAME} ${OBJS}

$(LIBFT):
	make -C $(LIBFT_PATH) all

```

使用したテストツール
https://github.com/Tripouille/printfTester
https://github.com/paulo-santana/ft_printf_tester

## get_next_line
ファイルディスクリプタを1行ずつ読み込む関数を自作した。
```
ファイルディスクリプタとは、プログラムがファイルを操作するための仕組みであり整数で表す
ファイル内の現在の位置を示すポインタが含まれており、このポインタの位置は読み書き操作のたびに変化する
この仕組みは、ファイルやデバイスとの対話やデータの読み書きなど、様々な入出力操作を可能する
```
下記の記事を参考にした。
https://koisuru-computer.hateblo.jp/entry/9937063
https://zenn.dev/misato23/articles/91ef34065446db
メモリがリークしないように苦労した。

BUFFER_SIZEをマクロ定義しないとレビューで落とされるので注意。
```
# ifndef BUFFER_SIZE
#  define BUFFER_SIZE 1000
# endif
```

使用したテストツール
https://github.com/Tripouille/gnlTester

## Born2beroot
VirtualBoxを使ってCUIなLinux OSを立ち上げて仮想マシンを設定する課題。
わからないことが多くて、本科が始まって最初の大きな壁。
まずは書架にあるLinuxの入門書を読んでほしい。

ローカルのストレージだと容量が足りないので、sgoinfreにISOファイルを保存した
※sgoinfreは、42の共有ストレージ(課題が終了したら格納したデータを削除する)

レビュー対策として、こちらの資料に大変お世話になった。
https://speakerdeck.com/love42/42tokyo-born2beroot-review

cornが停止していたのと、パスワードポリシーが不十分でレビューに落ちた。
レビューに時間がかかるのでエバポが2pt付与される珍しい課題。
最初は、メモを見ながらパスやコマンドを入力していたが、
最後のレビューでは、メモが要らなくなったことに感動した。

## push_swap
与えられた整数をソートするプログラムを実装した。
使用できるスタックは2つだけ。
整数が5つ以下なら最小手数でソートして、
6つ以上の場合は自作のアルゴリズムでソートする。

まずはソートアルゴリズムの勉強が必要。
https://qiita.com/drken/items/44c60118ab3703f7727f
クイックソートが人気だが私は基数ソートを選択した。
https://www.youtube.com/watch?v=nu4gDuFabIM

メモリリークしてレビューに落ちた。
ft_split関数で作成された動的メモリのfreeに注意。

使用したテストツール
https://github.com/nafuka11/push_swap_tester

## minitalk
シグナルを使ってクライアントが送信したメッセージをサーバーが受信するプログラムを実装した。
```
シグナルとは、割り込みによってプロセスに特定の動作をするように通知する仕組み
```
https://zenn.dev/hosu/articles/500079bf9be5fa
https://qiita.com/Kernel_OGSun/items/e96cef5487e25517a576

kill関数に0以下のPIDを渡さないようにエラーハンドリングする必要がある。
ft_atoi関数のフロー処理もminitalkに合わせて修正した。

サーバー側でアスキーアートを表示するとクライアントと見分けがついて良いかも。
```
static void	display_pid(int process_id)
{
	ft_printf("\t///////////////////////////////////////////////////\n");
	ft_printf("\t██////██//█//██///█//█/███████///█////█/////█///█//\n");
	ft_printf("\t██////██//█//██///█//█////█//////█////█/////█//█///\n");
	ft_printf("\t███//█/█//█//█/█//█//█////█/////█/█///█/////█/█////\n");
	ft_printf("\t█/█//█/█//█//█/██/█//█////█/////█/█///█/////███////\n");
	ft_printf("\t█/█//█/█//█//█//█/█//█////█////█///█//█/////█/█////\n");
	ft_printf("\t█//██//█//█//█///██//█////█////█████//█/////█//█///\n");
	ft_printf("\t█//██//█//█//█///██//█////█////█///█//█/////█///█//\n");
	ft_printf("\t█//////█//█//█////█//█////█///█/////█/█████/█///██/\n");
	ft_printf("\t///////////////////////////////////////////////////\n");
	ft_printf("\tPID: %d\n", process_id);
	ft_printf("\tWaiting for a message...\n");
}
```
https://rakko.tools/tools/68/


## so_long
プレイヤーがキャラクターを操作して特定の目標に到達する2Dゲームを実装した。
"minilibX"というライブラリの理解が必要。
https://aurelienbrabant.fr/blog/getting-started-with-the-minilibx
https://harm-smits.github.io/42docs/

"minilibX"の使い方として、
校舎PCだと下記のコマンドとmain関数で実行ファイルを作成する。
```
cc  main.c -Imlx -lmlx -framework OpenGL -framework AppKit
```
私用のLinux環境だと色々と準備が必要で苦労した。
https://qiita.com/yickey/items/fb07e06ea8a646335a5e

キャラクターは、下記のサイトを使ってXPMファイルで作成した。
```
XPM（X PixMap）とは、画像を表現するためのファイルフォーマット
テキストベースで、色や画像データを容易に表現できる
```
https://www.irasutoya.com/
https://www.iloveimg.com/ja/resize-image/resize-png#resize-options,pixels
https://miconv.com/ja/png-o-xpm/#google_vignette
https://poyopoyo.gifanimaker.com/
https://convertio.co/ja/

![so_long.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/5defc6d7-4b77-16c5-3914-d5fb3ec081ec.gif)

自作したget_next_lineプログラムのft_strjoin関数に動的メモリを渡すと
メモリリークするのでft_strjoin関数内で動的メモリをfreeする修正が必要。

## Philospphers
複数の哲学者が円卓に座って食事をするのをシミュレーションするプログラム。
https://en.wikipedia.org/wiki/Dining_philosophers_problem

下記の資料が大変参考になった。
https://docs.google.com/presentation/d/12-lAykLu-RVACE1gI2aP-uEYZoOaeeFVYGh8W4ttTNw/edit#slide=id.gd4524b1be8_0_253


マルチスレッド(マルチプログラミング)の理解が必要。
https://docs.oracle.com/cd/E19455-01/806-2732/index.html
https://daeudaeu.com/c_mutex/


使用したテストツール
https://nafuka11.github.io/philosophers-visualizer/

## minishell
本科最初のペア課題で簡素化したbashを実装した。
相方のスキルと秀逸な記事により予定より早く課題を完了した。
![minishellのフロー図(概要).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/0a10cc9c-5889-0590-8994-0ce4aa88144c.png)

下記のサイトから情報収集
･実装 (圧倒的感謝)
https://usatie.notion.site/minishell-29921d3ea13447ad897349acd5733d5e

･Bash
https://runebook.dev/ja/docs/bash/
https://www.tohoho-web.com/ex/shell.html

･Readline
https://tiswww.case.edu/php/chet/readline/rltop.html
https://qiita.com/keitean/items/7c77f501eab5440e9200

･Signal
https://zenn.dev/hosu/articles/500079bf9be5fa

･Redirect、Pipe
https://www.coins.tsukuba.ac.jp/~syspro/2005/No3.html
https://qiita.com/task4233/items/1f5ba68e8fed430f6f9f