42 Tokyoというエンジニア養成機関が話題だ。私は42 Tokyoを受験しないのだが、選抜方法とその内容に関心があり調べていた。シリコンバレー校の資料がGitHubで公開されている。私が参照している資料は2017年のものだ。
コーディングを通じて何かが試され、判定される試験がPiscineとするならば、そのDay 00~01は、その作業環境を学習、理解し、整えることが試されているように感じられる。特にDay 00は、演習を伴いはするものの、ガイダンス的な要素が含まれている。具体的には、
- 42についての理解
- peer learningについての理解
- 学習環境(Git、イントラネット、シェルなど)についての理解
特に演習と直接関連する話題について、それらが既知の人にとって、それを実践するのは実に容易なことだろう。しかし、その実践したことを初心者、特に何の知見もない人に説明し、理解させようとすると、どうだろうか。
プログラムのような問題に対するアプローチ、ロジックというのは説明しようがあるものの、自然に習得、習熟したような知見ほど、相手に説明し、理解させるのは難しい。極端な例ではあるのだが、近い事例を挙げるとすれば、次のようなことだ。
- 高齢者のような、PCを利用したことのないユーザーに、マウスのダブルリックを説明し、理解させ、「できる」ようにする。
- 高齢者のような、スマートフォンを利用したことのないユーザに、タップと長押しの違いを説明し、理解させ、「できる」ようにする。
Day 00~01の内容を見ると、特に既知の受験者ほど、実践は容易だが、説明は「厄介」に感じられる話題が多く含まれているように感じられた。
一方、何の知見もない人は、これらを自分で「調べる」ところから始めなければならない。調べるには、調べるべき場所と調べ方、を知っておく必要がある。本題となるプログラミングを始める前から「試される」わけだ。
一からC言語の学習を始めるよりも、このような特定のテーマにまとめきれない、「初歩にして基礎にあらず」よりもさらに手前、に該当しそうな事柄というのは、自習しづらいものだ。
最終的に挫折するとしても、C言語という本題に到達する前、Day 00~01での離脱は無念なことだろう。この投稿が、予習の支援になればと思う。
ちなみに、ここで紹介する情報が東京校のPiscineに通用する保証はなく、内容の正しさを保証するものでもないことを申し添えておく。
- 雑感
- Exercise 01
- Exercise 02
- Exercise 03~06
- Exercise 07
- Exercise 08
- Exercise 09
- Exercise 10
- Exercise 11
- 参照
雑感
Day 00のExerciseではシェル操作でも特に、調べるだけで片が付く話題が中心だ。Day 00は、特に次の話題と関連している。どれもコマンドを調べ、実際に試すことで回答に通じるようになっている。
- ファイル操作
- LDAP
ちなみにシェル操作はDay 01でも出題される。こちらでは、ただ調べるだけでなく、頭を使うことも求められる。
Day 00では、Exerciseとは関係なく、次の資料を読み、理解することも求められている。
42's curriculum manual | Piscine以降の話題も含む、42の学習指針 |
the art of peer-evaluation | peer learningの説明 |
Vogosphere - Manual | Gitの話題は、ここに収録されている。 |
「42's curriculum manual」に掲載されている次の記述は、特に印象的に感じた。
”.6 Asynchronous curriculum”
Spending less than 70 hours per week at school is a solid indication that something is going horrifyingly wrong and that you are progressing towards critical failure. You have been warned.
”.11 Community services ? Punishment ? Exclusion ?”
We’ll check your progress on a regular basis and students who are really (like really) too slow will be excluded from the school. Three stages of black holes exist : 3 months to reach level 1 with at least 20 hours logged in per week, 12 months to reach level 5, and 18 months to fullfil the conditions to access the first internship.
1週間当たりの校舎滞在時間が70時間未満は少なすぎる。進捗の悪い学生には退学してもらうのだという。進捗の目安となるのは、1週間当たり、最低20時間ログインして、
- 3か月でレベル1に到達
- 1年でレベル5に到達
- 1年半で最初のインターン参加権に到達
これに相当する学習ペースが、Piscineでも評価されているのだろう。
Exercise 01
まずコマンド「ls」の出力を理解する必要がある*1。
次の条件に合致するファイル「testDay00」を作成し、提出することを要求されている。
参照権限 | r--r-xr-x | user:読み group:読み+実行 other:読み+実行 |
サイズ | 40バイト | 40文字 |
要件を満たすファイルを作る一連の作業は、
- ファイルを作る
- 参照権限を設定する
- 40バイトのデータをファイルに書き込む
コマンドにすると、
gist.github.com
Exercise 02
前問に引き続き、コマンド「ls」の出力を理解する必要がある。次の条件に合致するフォルダ、ファイル、リンクを作成する必要がある。
test0 | フォルダ | 参照権限:デフォルト |
test1 | ファイル | 参照権限:rwx--xr-- サイズ:4 |
test2 | フォルダ | 参照権限:r-x---r-- |
test3 | ファイル | 参照権限:r-----r-- サイズ:1 リンク数:2 |
test4 | ファイル | 参照権限:rw-r----x サイズ:2 |
test5 | ハードリンク | 参照先:test3 |
test6 | シンボリックリンク | 参照先:test0 |
test3、5は属性が共通しており、test3のリンク数は2だ。つまりtest5はハードリンクで、その実態としての参照先がtest3である、と解釈した。
これらを作成する一連のコマンドは、
gist.github.com
Exercise 03~06
Kerberos*2、LDAP*3環境の操作について問われている。42校舎の学習環境に依存する要素があるため、使用すべきコマンドしか特定できない。
Exercise 03 | kinit klist |
Exercise 04 | ldapwhoami |
Exercise 05 | ldapsearch |
Exercise 06 | ldapmodify |
Exercise 06は、ldifファイルを用いて携帯電話番号を登録することを求められている。資料に記載されているテンプレートに基づいて、課題に沿うよう編集すると、次のようになる。
dn: uid=pnom,ou=people,dc=42,dc=fr changetype: modify replace: mobile mobile: 05044442222
Exercise 07
課題が問うているのは、カレントフォルダの内容を一覧出力することだ。諸々の条件を満たす必要があるのだが、それらはコマンド「ls」のオプションを指定することで対応できる。
オプション | ||
---|---|---|
except for hidden files any file that starts by a dot |
隠しファイルは表示しない 「.」で始まるファイルは表示しない |
|
separated by a comma | 「,」区切りで出力する | -m |
by order of creation date | 作成日順に出力する | --time=ctime |
directories’ names are followed by a slash character | フォルダ名の末尾に「/」を付与する | -F |
この問題のポイントは作成日(creation date)をどのように解釈するかだろう。なぜならば3種類の時刻*4が該当するからだ。ここでは「ctime」とした。
atime | アクセス時刻 | 指定日数内にアクセスされた |
ctime | 作成時刻 | 指定日数内に属性変更された |
mtime | 修正時刻 | 指定日数内に更新された |
Exercise 08
課題が問うているのは、ファイルを一つ作成することだ。そのファイル名は「z」(zは小文字)、そのファイルには「Z」(Zは大文字)が一文字だけ記録されている。
Exercise 09
この課題は解釈の余地がある。次のように、コマンド「patch」を調べるよう、示唆されている。
man patch
もし2ファイルの差分が記録されているファイル「sw.diff」が存在しているのであれば、
diff a b > sw.diff
この課題は、与えられた差分ファイルを基に、コマンド「patch」を用いてファイル「b」を生成せよ、と解釈できる。もしその通りでああれば、コマンドは次のようになる。
Exercise 10
コマンド「find」を調べるよう、示唆されている。
man find
求められているのは、カレントフォルダ、その配下にあるフォルダにあるファイルのうち、条件に該当するものを一覧し、削除することだ。その条件に付いては、解釈の余地がある。
in its sub-directories - ending by ~, and/or all files that
start or end by #
この条件のうち「ending by ~」がフォルダ名に係るのか、ファイル名に係るのかによって、パターンが分かれる。フォルダ名に係ると解釈する場合をパターン1、ファイル名とするものをパターン2とする。
条件適用は、コマンド「find」へのオプションとして対応できる。
オプション | ||
---|---|---|
ending by ~ | 「~」で終わる | パターン1:-path "*~" パターン2:-name "*~" |
start or end by # | 「#」で始まる、終わる | -name "#*" -o -name "*#" |
次の制約が設けられているため、これらのオプションを次のように繋ぐ。
and | -a |
or | -o |
Only one command is allowed: no ’;’ or ’&&’ or other shenanigans.
次の指示により、コマンドの末尾に「-print -delete」を付与するのだが、一つ注意しなければならない。対象ファイルを確実に絞り込めるまで、「-delete」を付与しないこと。
The command line will show and erase all files found.
コマンドは次のいずれかになるだろう。
gist.github.com
Exercise 11
この課題で問われているのは、条件を満たすファイルの提出だが、コマンド「file」を調べるよう、示唆されている。
man file
コマンド「file」を使用するに際し、あらかじめ情報を定義しておいたファイルを併用する場合がある。これはmagicファイルと呼ばれており、定められたフォーマットがある*5。そして、このフォーマットは問題文では説明されていない。
つまり、コマンド「file」を調べているうちに、この課題が要求しているのはmagicファイルのことであり、そのフォーマットに沿ったファイルを生成する必要があることに、回答者は気付かなければならない。
magicファイルはタブ区切りのテキスト・ファイルで、4つのフィールドを持つ。そして、それぞれのフィールドが問題文の条件と、次のように整合している。
フィールド | 条件 |
---|---|
offset | the 42nd byte |
type | string |
test | 42 |
message | 42 file type |
解釈の余地があるのは、offsetだ。
"42" string at the 42nd byte
42バイト目に「4」が位置していると解釈するなら、offsetは41バイトだ。だとすれば、ファイル「ft_magic」の内容は、次のようになる。
41 string 42 42 File Type