7歳娘「パパ、数値をパーミッションに変換して？」

# ある日の我が家
娘「パパ、**数値**を**パーミッション**に変換する方法を教えて！」

ワイ「ん、どういうこと？」
ワイ「いきなりどうしたんや」

娘「えっとね」
娘「小学校でこんな宿題が出ちゃったの！」

> ### 宿題
> `0`〜`7`の数値をパーミッションの文字列に変換する関数を実装しなさい。
>
> ※以下のルールで変換すること
>
> `0` -> `"---"`
> `1` -> `"--x"`
> `2` -> `"-w-"`
> `3` -> `"-wx"`
> `4` -> `"r--"`
> `5` -> `"r-x"`
> `6` -> `"rw-"`
> `7` -> `"rwx"`

ワイ「お〜」
ワイ「娘ちゃんも、もう小学1年生やもんな」
ワイ「こんな宿題が出るんやなぁ」

娘「そうなの」

ワイ「パーミッションって確か・・・**権限**のことよな？」

娘「うん」

ワイ「難しそうやなぁ」
ワイ「それで、どこまでできたん？」

娘「えっとね」

# 娘ちゃんが分かったこと

娘「パーミッションについてググってみたんだけどね」
娘「どうやら──」

- `4`は`読み取り（read -> r）`を表す
- `2`は`書き込み（write -> w）`を表す
- `1`は`実行（execute -> x）`を表す

娘「↑こういうルールになってるみたい」
娘「だから、`5`の場合は`"r-x"`になるの」

ワイ「ええと・・・？」
ワイ「`5`は、`4 + 1`やから」
ワイ「`read`と`execute`の権限があるから」
ワイ「パーミッションの文字列に変換すると`"r-x"`になるってことか」

娘「そうそう」

ワイ「ほな、`3`の場合は`2 + 1`やから」
ワイ「`write`と`execute`の権限があるから」
ワイ「`"-wx"`になるってことか」

娘「そういうこと」

ワイ「おお〜、そこまで分かればパパでもできそうや」
ワイ「パパの得意なJavaScriptで実装していくで！」

娘「わ〜い！」

# ワイ、実装開始

ワイ「ほな、まずは`3`を`"-wx"`に変換する処理を書いてみるで！」

娘「うん！」

ワイ「まずは──」

```diff_javascript
  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
```

ワイ「↑こうやな」

娘「そっか！」
娘「`.toString(2)`ってすることで」
娘「`3`を**二進数の文字列**に変換したんだね！」

ワイ「せや」

娘「パパ、すご〜い！」

ワイ「グヘヘ」
ワイ「せやろ〜？」
ワイ「（でも、この後どうすればいいのか全然わからん・・・）」

娘「あとは簡単だね！」

ワイ「**！？**」
ワイ「（マジか！？）」
ワイ「お、おう！」
ワイ「ほ、ほな娘ちゃん、後は自分でやってみ〜」

娘「うん！」

# 娘ちゃん実装開始

娘「まずは──」

```diff_javascript
  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
+         .padStart(3, "0") // -> "011"
```

娘「↑こうだね！」

ワイ「なるほどな」
ワイ「3桁になるように**ゼロ埋め**したわけか」
ワイ「文字列が持ってる`padStart()`っていうメソッドを使うことで」
ワイ「指定した桁数になるまでゼロ埋めしたりできるんやな」

娘「え？」

ワイ「いや知ってたけどな？」

娘「そっか」
娘「そして、次はこう！」

```diff_javascript
  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
+         .split("") // -> ["0", "1", "1"]
+         .map(Number) // -> [0, 1, 1]
```

ワイ「ほ〜」
ワイ「文字列の`split()`メソッドを使って、`"011"`を分割して」
ワイ「`["0", "1", "1"]`という配列にしたんやな」
ワイ「そして、配列の`map()`メソッドを使って、全ての要素を数値に変換した・・・」

娘「そうだね」

ワイ「そんで、この後どうすんのや？」

娘「え、分からないの？」

ワイ「いや分かるけどな？」
ワイ「娘ちゃんがやって見せて欲しいなぁって」

娘「そっか！」
娘「えっとね──」

```diff_javascript
  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
          .split("") // -> ["0", "1", "1"]
          .map(Number) // -> [0, 1, 1]
+         .map((e, i) => e ? "rwx"[i] : "-") // -> ["-", "w", "x"]
```

娘「↑こうだね！」

ワイ「なるほどな」
ワイ「え〜と、これは・・・？」

- `1`だったら、`"r"`か`"w"`か`"x"`を返す
- `0`だったら、`"-"`を返す

ワイ「↑こういう関数を、配列の各要素に適用してるんやな？」
ワイ「せやから`[0, 1, 1]`が`["-", "w", "x"]`になると」

娘「そうだね！」
娘「ここまでくれば、あとは──」

```diff_javascript
  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
          .split("") // -> ["0", "1", "1"]
          .map(Number) // -> [0, 1, 1]
          .map((e, i) => e ? "rwx"[i] : "-") // -> ["-", "w", "x"]
+         .join("") // -> "-wx"
```

娘「↑こうするだけだね！」

ワイ「おお、配列を`join()`メソッドで連結して文字列にしたんやな」

娘「でも、ここからが分からないの」

ワイ「え・・・」
ワイ「あとはこれを関数にするだけやん」

娘「関数定義の仕方が分からないの・・・」

##### ワイ「いや、逆に！？」

# 関数にしてみる

ワイ「ほな、さっきの処理を`permissionNumberToText`っていう名前の関数にするで」

```diff_javascript
const permissionNumberToText = (permissionNumber) =>
    permissionNumber
        .toString(2)
        .padStart(3, "0")
        .split("")
        .map(Number)
        .map((e, i) => e ? "rwx"[i] : "-")
        .join("")
```

ワイ「↑こうやで」

# 実行してみる

ワイ「ほな、実行してみるで？」

```diff_javascript
console.log(permissionNumberToText(0))
// -> "---"

console.log(permissionNumberToText(1))
// -> "--x"

console.log(permissionNumberToText(2))
// -> "-w-"

console.log(permissionNumberToText(3))
// -> "-wx"

console.log(permissionNumberToText(4))
// -> "r--"

console.log(permissionNumberToText(5))
// -> "r-x"

console.log(permissionNumberToText(6))
// -> "rw-"

console.log(permissionNumberToText(7))
// -> "rwx"
```

娘「わ〜、できてる！」
娘「パパ、すご〜い！」

ワイ「せやろ！？」
ワイ「ゲヒャヒャ！」

##### よめ太郎「いやアンタ関数にしただけ！」

ワイ「調子に乗ってごめんやで・・・」

# まとめ
- 10進数の数値を、2進数に変換してゼロ埋めすると、`"011"`といった形式になる
- `"011"`は以下のように考えることができる
    - 1文字目が`"0"`
        - `4`（読み取り）のフラグが**OFF**になっている
    - 2文字目が`"1"`
        - `2`（書き込み）のフラグが**ON**になっている
    - 3文字目が`"1"`
        - `1`（実行）のフラグが**ON**になっている
- あとは、
    - **ON**になっているものは`"r"`か`"w"`か`"x"`に変換
    - **OFF**になっているものは`"-"`に変換
    - ↑こうすることで、パーミッションの文字列に変換できる

# その日の夜

ワイ「はあ、明日も仕事か〜」
ワイ「憂鬱やな〜」

娘「パパ、お仕事楽しくないの？」

ワイ「いや、それなりに楽しいんやけどな」
ワイ「パパ、空気を読むのが苦手やから」
ワイ「いっつも同僚との会話の中で空回ってしまって」
ワイ「そんな自分が嫌いなんや・・・」

娘「そっか・・・」
娘「でもね、パパ」
娘「人よりも空気が読めなかったり」
娘「人よりも傷つきやすかったり」
娘「人よりも感じる恐怖の量が多かったり」
娘「そんな特性を持ちながら、精一杯もがいてるパパは」
娘「とっても素敵だよ」

ワイ「うぅ・・・ありがとうやで、娘ちゃん・・・！」

娘「脳ガチャでハズれたからって、諦めないで・・・？」

ワイ「いや誰が脳ガチャのハズレやねん」
ワイ「しばくぞ」

**〜おしまい〜**

# 新しい記事もよろしくやで！

- [ワイ「z-index完全に理解した」](https://qiita.com/Yametaro/items/399a383b48ec2082997e)