ある日の我が家
娘「パパ、数値をパーミッションに変換する方法を教えて!」
ワイ「ん、どういうこと?」
ワイ「いきなりどうしたんや」
娘「えっとね」
娘「小学校でこんな宿題が出ちゃったの!」
宿題
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"
に変換する処理を書いてみるで!」
娘「うん!」
ワイ「まずは──」
const permissionNumber = 3
const permissionText =
permissionNumber
.toString(2) // -> "11"
ワイ「↑こうやな」
娘「そっか!」
娘「.toString(2)
ってすることで」
娘「3
を二進数の文字列に変換したんだね!」
ワイ「せや」
娘「パパ、すご〜い!」
ワイ「グヘヘ」
ワイ「せやろ〜?」
ワイ「(でも、この後どうすればいいのか全然わからん・・・)」
娘「あとは簡単だね!」
ワイ「!?」
ワイ「(マジか!?)」
ワイ「お、おう!」
ワイ「ほ、ほな娘ちゃん、後は自分でやってみ〜」
娘「うん!」
娘ちゃん実装開始
娘「まずは──」
const permissionNumber = 3
const permissionText =
permissionNumber
.toString(2) // -> "11"
+ .padStart(3, "0") // -> "011"
娘「↑こうだね!」
ワイ「なるほどな」
ワイ「3桁になるようにゼロ埋めしたわけか」
ワイ「文字列が持ってるpadStart()
っていうメソッドを使うことで」
ワイ「指定した桁数になるまでゼロ埋めしたりできるんやな」
娘「え?」
ワイ「いや知ってたけどな?」
娘「そっか」
娘「そして、次はこう!」
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()
メソッドを使って、全ての要素を数値に変換した・・・」
娘「そうだね」
ワイ「そんで、この後どうすんのや?」
娘「え、分からないの?」
ワイ「いや分かるけどな?」
ワイ「娘ちゃんがやって見せて欲しいなぁって」
娘「そっか!」
娘「えっとね──」
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"]
になると」
娘「そうだね!」
娘「ここまでくれば、あとは──」
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
っていう名前の関数にするで」
const permissionNumberToText = (permissionNumber) =>
permissionNumber
.toString(2)
.padStart(3, "0")
.split("")
.map(Number)
.map((e, i) => e ? "rwx"[i] : "-")
.join("")
ワイ「↑こうやで」
実行してみる
ワイ「ほな、実行してみるで?」
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になっている
-
- 1文字目が
- あとは、
-
ONになっているものは
"r"
か"w"
か"x"
に変換 -
OFFになっているものは
"-"
に変換 - ↑こうすることで、パーミッションの文字列に変換できる
-
ONになっているものは
その日の夜
ワイ「はあ、明日も仕事か〜」
ワイ「憂鬱やな〜」
娘「パパ、お仕事楽しくないの?」
ワイ「いや、それなりに楽しいんやけどな」
ワイ「パパ、空気を読むのが苦手やから」
ワイ「いっつも同僚との会話の中で空回ってしまって」
ワイ「そんな自分が嫌いなんや・・・」
娘「そっか・・・」
娘「でもね、パパ」
娘「人よりも空気が読めなかったり」
娘「人よりも傷つきやすかったり」
娘「人よりも感じる恐怖の量が多かったり」
娘「そんな特性を持ちながら、精一杯もがいてるパパは」
娘「とっても素敵だよ」
ワイ「うぅ・・・ありがとうやで、娘ちゃん・・・!」
娘「脳ガチャでハズれたからって、諦めないで・・・?」
ワイ「いや誰が脳ガチャのハズレやねん」
ワイ「しばくぞ」
〜おしまい〜