やっほう。シノブです。
前回の記事ではnpmでcreate-react-appをインストールしようとしたんだけど、エラーがズラッと並んでたんですよ。こちらの記事ね。
エラーを全文翻訳してみらた、フォルダに権限を付与するのかもっていう仮設が出たんです。でもまだよくわからん。どーしよって思ってたんですけど、その時にふと自分が日本国民の義務を果たしていないことに気づいたんです。
そう。
ググってない。
こんな便利な時代に生きていてなんでそんなこともしていないのかと。メンターついてくれてるからって怠けてんじゃねぇぞと。そんな自分にサービス開発者としての基本的人権なんぞあるものかと。
答えを先に知って咀嚼する方が早いのかもだけど、今の時期はこうやって検索することもゼロイチには絶対必要なはず。そして、こういうことを知りたいプログラミング初心者も絶対にいるはず!フロンティアになってこう。どんだけ周回遅れのフロンティアかしらんけども
というわけで、エラー全文ぐぐってみよ。全部で19行。
まずはこちら
これのまんまググってみると、いくつか該当しそうな記事が出てきました。
たとえばこちらの記事
これによると「npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules」っていうのは、「 /usr/local/lib/node_modulesへ書き込みをする権限が無いよ」っていうことらしい。
そ、そうなんだ。権限ね。誰がなぜ君にその権限を付与していないのかも、どうすれば権限を付与できるかもわからないけど、理由だけはわかったよ。ありがとうGoogle先生。
おっしゃ、次いこ
調べてみるとEACCESというエラーの意味が書かれていたよ。これもどうやらアクセス権限が無いことを示しているらしい。
そしてcodeっていうのは、エラーコードを示しているらしくて「エラーコードはEACCESだよ」っていうことっぽい。こちらの情報が詳しそうだよ。
このエラーコードが意味するものは、まずパス名かuser authorityに原因があるらしい。
そしてそれにアクセス権限が無いか、ログインしたIDで、該当操作に対する資源配付の使用権限がない、とのこと。意味はわからん。
そしてそれを解消するには、ファイルをパーミッションモードで確認するか、ログインしたIDの権限の確認を行い、必要であれば、使用権限をACLマネージャに登録する必要があるらしい。こちらも同様に意味はわからん。
ただここでもやはりアクセス権限の話が出てきた。そういうことっぽいね。
これが今回のエラーの画面なんですけどね、よく見るとiterm2上でもcodeの部分色違うし、1つの文章じゃないっぽいよね。てことは次のsyscall accessもそういう感じ??
これも調べてみたら、「syscall」と「access」は別のものを意味しているらしい。バラバラに調べてみたらsyscallはシステムコールの意味だとわかったよ。
システムコールっていうのは、OSがカーネルにアクセスしてタスクを実行する方法を指しているらしい。いっこも意味はわからん。
んで今回の場合だと「syscallはaccessだよ」っていう意味っぽい。でこのaccessっていうシステムコールはユーザーのファイルに対するアクセス権をチェックするっていう意味らしい。ここでも出てきたアクセス権。もはや疑いの余地のないくらいアクセス権限がないらしいね。
おっしゃ次だ
これはもう1行目からの流れでわかった。というかさすがにこれはググっても回答のってなかったわ!
「アクセス権限が無いのはこのPATHですよ」っていう意味っぽいね。これはこれとして次いこ
これはなんだろね。この流れで行くと「errno」の値として「13」なのかなとは思うんですけども。なんだろね。
調べてみたらこのQiitaの記事があったよ。
おーなるほど!システムコールや標準ライブラリで、エラー原因を教えてくれるのがこのerrnoの値らしいですよ。そして見てみると、数字のパターンは133まであるらしい。波動球より多い。ためしに34までの値の意味を載せておくよ。
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */
おーこれで見ると、13はdefine EACCES 13 /* Permission denied */って書いてある!やっぱりこれもアクセス権限が無いよっていうことを表しているっぽいね。
ほんで改めてエラーの画像を見てみるとさ
errno -13より下の行は、なんかおんなじこと書いてあるっぽいね?
ただ唯一違う単語が並んでるのが「permission denied」だね。なのでとりあえずこれもググる。
これは直訳すると「アクセス拒否」らしい。
ただこれはこのキーワードでググるとしっかりと答えが書いてある記事がありました。こちらの記事。
この記事から引用させてもらうとこう。
linuxコマンドはプログラムを書く人とって切っても切り離せないものですよね。
そもそもLINUXは、サーバーでよく使われるOSですが、そのため1つのマシンへ複数のユーザーが同時にログインして操作することを前提として作られています。この際に、秘密のファイルを他のユーザーに見られてしまったり、誤って他のユーザのファイルを上書きしてしまうことを防ぐため、アクセス権限が必要でした。したがって一つ一つのファイルには、「誰に、どのような操作を許可するのか」という権限を規定する情報が設定されています。この情報のことを、パーミッションと呼びます。
https://qiita.com/takuyanin/items/18590600d077df707923
なるほど。そういえばMacOSはベースとなる部分がLINUXで動いているとメンターに聞いたことがあります。これが今回の答えなのだと思う。
If you beiveから先の部分は昨日の記事でも解説したけど、やはり言ってることは同じだったね。
ほんだら最後に1番下の2行を調べてみよかな
これはそのまま翻訳してみると「この実行の完全なログは、次の場所にあります。」って書かれてた。どんな意味なのかをさらにググってみたけど、よくわからんかったよ。とりあえず、エラーの内容に直接関係のあることではなさそうだよね。
その下の行はエラーのログが「/Users/shinobudaisuke/.npm/_logs/2020-06-17T15_12_21_920Z-debug.log」だよって言ってるんだね。
前回の記事の時点でわかっていた気がしないでもないけど!けど!
やはり特定のディレクトリかファイルかに、アクセスする権限がないってことだね。
でもこれ全文調べたことで、システムコールとかEACCESとかerrnoとかの言葉の存在と意味はなんとなくわかったし、やっぱググるの大切ね。
ほんだら次は、ここからどうやったらこの問題を解消できるかを調べていくぞー