Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

42 SILICON VALLEY Piscine 2017 Day00

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に通用する保証はなく、内容の正しさを保証するものでもないことを申し添えておく。

雑感

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文字

要件を満たすファイルを作る一連の作業は、

  1. ファイルを作る
  2. 参照権限を設定する
  3. 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*2LDAP*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 修正時刻 指定日数内に更新された

gist.github.com

Exercise 08

課題が問うているのは、ファイルを一つ作成することだ。そのファイル名は「z」(zは小文字)、そのファイルには「Z」(Zは大文字)が一文字だけ記録されている。

gist.github.com

Exercise 09

この課題は解釈の余地がある。次のように、コマンド「patch」を調べるよう、示唆されている。

man patch

もし2ファイルの差分が記録されているファイル「sw.diff」が存在しているのであれば、

diff a b > sw.diff

この課題は、与えられた差分ファイルを基に、コマンド「patch」と用いてファイル「b」を生成せよ、と解釈できる。もしその通りでああれば、コマンドは次のようになる。

gist.github.com

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