この記事を書いた人
machida

早いところKUROIGAMENの本来の目的であるデザインテロ活動をガシガシやって、そのレポートを書いていきたいところなのですが、その前に「黒い画面はデザイナーでも出来ちゃうんですよ」とか「黒い画面って楽しいよ」とか「プログラマーってこんな楽しいことやってるんですよ、俺らデザイナーもそれに入れてもらおうぜ」…といったいことも知らせておきたくて、まぁ、KUROIGAMENの予備軍育成というか、布教活動というか、まぁ、しばらくの間はその辺に注力していきたいと思います。

それにしても、今回記事を書くに当たって、Webデザイナーの為の「本当は怖くない」”黒い画面”入門 を読みながら復習したり、知らなかったことを覚えたり、なんとなく使ってたけどちゃんと理解していなかったり、という感じで記事を書いているのですが、これはいい勉強になりますね。デザイナーの方もどんどん勉強したことをブログを書くのをおすすめします(別に黒い画面に関することじゃなくても)。

「こんな記事書いたよ」とか、「黒い画面やってみたよ」とか、「あの記事間違ってるよ」とか、「この記事を読んでやってみるのがデザイナーにおすすめ」とかがあったら、お気軽にtwitterやブログのコメント欄やメール(machida@fjord.jp)でメッセージください。あと、仕事の依頼も。

Package Managerの導入

三回に渡って黒い画面での基礎的なコマンドを実際にやってみるのシリーズもやっと終わり、今回は新しいことに挑戦です。

今回はPackage Manager(パッケージマネージャー)の一つである「Homebrew」の導入に挑戦していきたいと思います。今回は Webデザイナーの為の「本当は怖くない」”黒い画面”入門 Part.06のエントリーを読みながら進めていきます。

さて、突然「Package Manager(パッケージマネージャー)」なんていう新しい言葉が出てきましたが、Webデザイナーの為の「本当は怖くない」”黒い画面”入門にその説明がありましたのでコピペをします。

“黒い画面”では以前紹介したlsやcurlなど、単機能のコマンドを組み合わせることで複雑な処理を実現します。一つのソフトが複数のソフトを利用するため、”ソフトAをアップデートしたらソフトB、ソフトCが動かなくなった”という状況が発生します。”ソフトB 5.0にはソフトA 2.0以上が必要”といった関係があるためです。これをソフトの依存関係と言います。

無数のソフトの依存関係を手動で管理するのは面倒過ぎるのでPackage Manager(パッケージマネージャー)と呼ばれる種類のソフトがよく使われます。Package Managerは”そのソフトにどのソフトのバージョン何以上が必要か”、”今インストールされているソフトは何か”といった情報を持っているため、必要に応じてソフトを勝手にダウンロードしてきてインストールしてくれます。便利過ぎますね。今回は最近Macで人気のあるPackage ManagerのHomebrewを使ってみます。(“黒い画面”のテーマ名”Homebrew”とたまたま同名ですね。)

ふむふむ、Package Managerとはソフトを管理するソフトのことのようですね。「Manager」とは「管理するもの」という意味だから、Package Managerの「パッケージ」とは「ソフト」を指しているようです。つまり、「ソフト」を管理するソフトという意味ですね。
それにしても「ソフト?」、「パッケージ?」、「プログラム?」、「コマンド?」…ちょっと用語について混乱してきました。一旦整理しておきたいと思います。

ここで一旦、用語のまとめ

コマンド
黒い画面を使ってコンピューターにやらせる命令のこと
プログラム
コンピュータが行うべき処理を順序立てて記述したもの。言い換えると「コンピュータがやる命令を受けた際に行うこと」。コマンドとプログラムはほとんど同じ意味。
ソフト
コンピュータを動作させる手順・命令をコンピュータが理解できる形式で記述したもの。つまり「コマンド」、「プログラム」、「ソフト」はほとんど同じ意味。
パッケージ
ソフトを動かすにはそのソフト以外の別のソフトを必要とすることが多い。そういったソフトを動かすためのソフト群をまとめたもの。

Package Managerとは何なのかというのは大事っぽいので、Package Managerとは何か、についてちょっと詳しくまとめておきたいと思います。

Package Managerとは?

  • ソフトとはその他のソフトから成り立っている。
  • そのため、「ソフトA」を動かすためには「ソフトB」と「ソフトC」が必要ということが起こる。
  • しかも、「ソフトA」を動かすためには「ソフトBのバージョン2.0」と「ソフトCのバージョン3.0」が必要というバージョンまで合わせる必要がある。
  • そこで登場するのが「Package Manager」。「Package Manager」に「ソフトA」が欲しい、と命令をすれば、「ソフトA」に必要な「ソフトBのバージョン2.0」と「ソフトCのバージョン3.0」も一緒に用意してくれる。そういう意味で「Package Manager」はソフトをパッケージとして扱う(例で言うと「ソフトA」は「ソフトA」と「ソフトBのバージョン2.0」と「ソフトCのバージョン3.0」のパッケージ)。
  • また、「ソフトA」を削除する場合は「ソフトA」を動かすために一緒に付いてきた「ソフトB」、「ソフトC」も削除してくれる。

…ということで、Package Managerとは名前の通りで「ソフトのパッケージの管理をしてくれるソフト」ですね。

Homebrewのインストール

説明だけでずいぶん長くなってしまいましたが、いよいよPackage Manager「Homebrew」のインストールに挑戦したいと思います。

では、Webデザイナーの為の「本当は怖くない」”黒い画面”入門に載ってるHomebrewのインストールの手順をコピペ。

Homebrewのインストール方法は斬新です。

$ sudo chown -R `whoami` /usr/local

まずは/usr/localディレクトリの所有者を自分のユーザーに変更します。

sudoは引数に渡したコマンドを管理者権限で実行するコマンドです。suはSuper Userの略で管理者の事です。Super Userで実行するからsudoです。sudoは起動に必要なファイルを消すとか致命的なコマンドでも実行できてしまうので注意して扱いましょう。

chownはCHange OwNerの略でファイルやディレクトリの所有者を変更するコマンドです。所有者のユーザー名と変更したいファイル・ディレクトリ名を指定します。-Rは指定したディレクトリより下全部を変更するというオプションです。

whoamiは自分のユーザー名を表示するコマンドです。Who am I?(私は誰?)なのでそのままですね。

`(バッククォート)は”黒い画面”に備わってる特殊な機能です。バッククォートで文字を囲うとその文字をコマンドとして実行して、出力結果に置き換えます。

$ ls `pwd`

つまり上記を実行すると、 バッククォートで囲われたpwdコマンドが実行され、その出力結果である/Users/komagataに置き換わるので最終的には

$ ls /Users/komagata

と入力したのと同じことになります。

最初のコマンドをもう一度見直してみましょう。

$ sudo chown -R `whoami` /usr/local

僕の環境で言えば、”/usr/local以下全てのディレクトリの所有者をkomagataに変更する”という動作になります。

これならばみなさんそれぞれの環境、例えばユーザー名がmachidaだったとしても同じ1行のコマンドで実行できて便利というわけです。”黒い画面”は単機能のコマンドを組み合わせて複雑な動作をするという意味がおわかりいただけたでしょうか。

これから/usr/local以下に色々入れるのでディレクトリの所有者を自分に変更しました。次でHomebrewを実際にインストールします。

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

上記はrubyコマンドとcurlコマンドを組み合わせています。上記のURLにはrubyプログラムでHomebrewのインストールプログラムが書かれています。それをcurlで取ってきてrubyで実行しているわけです。(curlの-f -s -S -Lオプションをそれぞれmanで調べてみましょう。)

これならば1行”黒い画面”にコピペすればインストールが完了するのでユーザーは簡単ですし、ソフトの提供側もインストールプログラムに変更があっても上記のファイルの中身を変えればユーザーに気付かれずに対応できます。

Homebrewをインストールするための最初のコマンド

では、実際にやってみたいと思います。まず最初のコマンドは、

$ sudo chown -R `whoami` /usr/local

おっと、いきなり知らないコマンドとオプションがバババッと登場ですね。なんか怖い感じになってきました。ここで登場したやつを一個一個見ていきたいと思います。

  • sudo
  • chown
  • -R
  • `whoami`

まずは「sudo」から。

sudo

  • 引数に渡したコマンドを管理者権限で実行するコマンド
  • super userの略

黒い画面で使うコマンドの中で、そのディレクトリの場所やファイルによっては、普通に使うことが出来ない場合があります。
例えば、「/usr」の中で「mkdir」をしようとしても出来ません。「/usr」自体が隠しフォルダになっているのですが、その中には大事なコマンドやらが入ってる場所なので、その中で好き勝手されるとコンピューター自体がおかしくなる可能性があるので出来ないようになっています。
こんな感じで特定のディレクトリ内、特定のフォルダ、特定のファイルに対してコマンドを実行できないものがあります。そういった、ディレクトリやファイルに対してコマンドを強引に実行してしまえるってのが「sudo」コマンドです。つまり、一時的に何でも出来る管理者権限を持ってコマンドを実行させるためのコマンドですね。俺が買ったMacの分際で許可とか何様のつもりだ、と思ってしまいそうですが、安全のためにそうなってるのです。

コマンドを実行させるためのコマンドなので、「sudo」に入力する変数にはコマンドを入れます。

$ sudo mkdir adult_pictures

…と、このように使います。

POINT!

今、「こんな感じで特定のディレクトリ内、特定のフォルダ、特定のファイルに対してコマンドを実行できないものがあります。」…という文章を書いていて気がついたのですが、「ディレクトリ」と「フォルダ」は同じ意味だけど、「ディレクトリ」は階層をさして、「フォルダ」は階層を持つファイルの入れ物って感じで使い分けるとすっきりする(僕だけだったらごめんなさい)。これは僕が日本人だからなのか、windowsを使ってた期間が長かったからなのか…。

chown

  • 引数に渡したコマンドを管理者権限で実行するコマンド
  • change ownerの略

次に出てきたのは「chown」ですね。チョ…ウン?中国の方かしら?と思ってしまいそうな名前のコマンドですが、change ownerの略だそうです。

ファイルやディレクトリの所有者を変更するコマンドで(名前のままですが)、このコマンドを実行できるのは、管理者(sudoで出てきたsuper userですね)か、その所有者だけになります。だれでも所有者を変更できたら所有者ってもの自体の意味もなくなってしまうから、当然といえば当然ですね。なので、「chown」にはいつも「sudo」がセットです。

「chown」「ユーザーまたはグループ」「ファイルまたはディレクトリ」と、書きます。

$ sudo chown machida adult_pictures

これで「adult_pictures」は「machida」のものになりました。

今回の場合、「chown」の後に「-R」というオプションが付いてますね。これは「ディレクトリの所有者を変更する際に、そのディレクトリだけでなく、中のファイルやサブディレクトリの所有者変更を適用する」というオプションです。

例であげた「adult_pictures」がフォルダだった場合、

$ sudo chown -R machida adult_pictures

とすれば、「adult_pictures」内のもの全てが「machida」のものになります。

whoami

  • Who am I?(私は誰?)…そのまま
  • 自分のユーザー名を表示するコマンド

「whoami」コマンドは自分のユーザー名表示するだけのコマンドです。こんなコマンドまであるんですね。実際やってみます。

「whoami」をやった結果20110106015425

うわ、地味に「machida」って表示されました。はい、確かに私はmachidaです。

` (バッククォート)

ただ、この「whoami」は普段見慣れない「 ` (バッククォート)」で囲われてますね。このバッククォートにも意味があるようです。

`(バッククォート)は”黒い画面”に備わってる特殊な機能です。バッククォートで文字を囲うとその文字をコマンドとして実行して、出力結果に置き換えます。

なるほど、先にそのコマンドをやっておいて、その結果を元のコマンドの引数として使う、という意味ですね。これを使えばコマンドの引数を動的することが出来る。

これは元のコマンド全体を見ながら確認した方がわかりやすそうです。

$ sudo chown -R `whoami` /usr/local

これを日本語にしてみると、管理者権限を持って「/usr/local」とその中身すべての所有者を「whoami」で出した結果のユーザーのものにする、というコマンドだったんですね。

「whoami」を使わない場合、[ この部分にuser名を入れる ] みたいな注意書きをしないといけないところをバッククォート付きの「whoami」を使うことによって、誰でも同じ一行で済んでしまう、という。「whoami」?ユーザー名なんか表示しなくてもわかってるよ、なんてなめてましたが、バッククォートと組み合わせた「`whoami`」ってすごく便利!

やっと、最初のコマンドの意味がわかったところで、早速、黒い画面にそのコマンドを打ってみたいと思います。

$ sudo chown -R `whoami` /usr/local

「sudo」を使ったのでパスワードを聞かれました。

Passwordを聞いてくる黒い画面Passwordを聞いてくる黒い画面

「sudo」のパスワードはMacを立ち上げるときや、アプリをインストールする際に聞かれるパスワードです。それを入力して「enter」キーをポチッ。

「sudo chown -R `whoami` /usr/local」をやった結果「sudo chown -R `whoami` /usr/local」をやった結果

何っ!「/usr/loca」なんていうファイルもディレクトリもないよ、って言ってきた!これはWebデザイナーの為の「本当は怖くない」”黒い画面”入門に書いていなかった展開。

ここは思い切って、「ないなら作ったらいいじゃない」と、ディレクトリを作成するコマンド「mkdir」を使って自分で作ることにしました。

$ mkdir /usr/local

「mkdir /usr/local」をやった結果「mkdir /usr/local」をやった結果

むむっ、今度は「permission denied」…アクセス拒否がされました、と出た。パーミッションということは権限関係のこと、「sudo」を付けたらOKなんじゃないの?

$ sudo mkdir /usr/local

「sudo mkdir /usr/local」をやった結果「sudo mkdir /usr/local」をやった結果

よし、出来たみたい。一応「ls」で確認。それにしてもこっちは苦労してるのにやっぱり黒い画面は何にも言ってくれないです。

$ ls ../../usr

「ls ../../usr」をやった結果20110106020607

おおっ!ちゃんと「usr」の中に「local」がいました。

では、改めて、

$ sudo chown -R `whoami` /usr/local

「sudo chown -R `whoami` /usr/local」をやった結果「sudo chown -R `whoami` /usr/local」をやった結果

はい、黒い画面は何にも言ってくれませんが出来たっぽいです。とりあえずこれで一つ目のコマンドは終了。

Homebrewをインストールするコマンド

いよいよ次のコマンドはHomebrewをインストールするコマンド。Homebrewのインストールもう目の前です。では、コマンドを見てみましょう。

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

また新しいコマンドが!あのイケてるってプログラマーの間で人気の言語でおなじみの「ruby」が出てきました。「ruby」はプログラム言語だけじゃなくて、「ruby」自身のコマンドもあったんですね。「ruby」コマンドについては「ls」や「cd」のような単純なコマンドではなさそうなので、ここで説明はしないことにします。一応、ちょこっと調べたところ、「ruby 」に「-e」というオプションを付けると、その後の引数に書かれたスクリプトを「ruby」で実行するそうです。おっと、「ruby」は飛ばしましたが「script」という言葉については気になるので調べたい思います。

script(スクリプト)とは?
機械語への変換作業を省略して簡単に実行できるようにした簡易プログラムのこと。

プログラムは人間が読める形(数字と一部英字を使い2進数や16進数などで表現されたもの)から機械が読める形に変換する作業を行ったものと、その変換作業を省略した人間が読める形のまま実行できるものがあるようです。で、scriptとは後者のプログラムを指すようで、まぁ、プログラムの種類の一つのことですね。また、scriptを書くための言語をスクリプト言語と言うそうです。
デザイナーがよく触る、Wordpressでお馴染みの「php」やMovable Typeでお馴染みの「Perl」、このサイトでも使われてるCMS、Lokkaの「Ruby」、Googleが使ってるってことで何だか良さそうな気がしてくる「Python」、いつもお世話になってる「JavaScript」もスクリプト言語です。

もしかしたら、「あいつのせいでJavaのコンパイルが通らない」なんていう言葉をプログラマーから聞いたり、プログラマーのtweetで見かけたりしたことがあるかもしれません。コンパイルとは、人間が読める形のものを機械が読める形に変換する作業のことで、人間が読める形でプログラミングをしていたときに、そのプログラマーの同僚が間違えを犯したまま帰宅してしまい、そのせいで機械語に変換できなくて同僚の犯したミスを見つけて解決するまで帰宅できないという状況下のプログラマーのぼやきですね。

さて、本題に戻って、次は「"$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"」の部分です。

「curl」はよそから取ってくるコマンドでしたね。「https://gist.github.com/raw/323731/install_homebrew.rb」を取ってきて、それを「ruby」で実行するっていうのは何となくわかりますね。でも、「curl」に付いてるオプションたち「-fsSL 」ってそれぞれどんなことをするオプションなんだろう?

curlの-f -s -S -Lオプションをそれぞれmanで調べてみましょう。

と、komagataさんも書いているので、ここは言われるままにmanで調べてみますか。

$ man curl

「man curl」をやった結果「man curl」をやった結果

はい、英語がバーっと出てきました。「man」で表示されるマニュアルは長いのでオプションの説明が出てくるまでカーソルの「↓」キーを押し続けます。

「↓」キーを押し続けてオプションが出現「↓」キーを押し続けてオプションが出現

では、-f -s -S -Lのオプションの説明を読んでみたいと思います。

-f/--fail

(HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when a HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22.

This method is not fail-safe and there are occasions where nonsuccessful response codes will slip through, especially when authentication is involved (response codes 401 and 407).

-s/--silent

Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

-S/--show-error

When used with -s it makes curl show an error message if it fails.

-L/--location

(HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from all requested pages will be shown. When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different host, it won't be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to follow by using the --max-redirs option.

When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following request using the same unmodified method.

おっ、ちょっとググッたらcURL - How To Use (マニュアルページ日本語訳)を発見!今回はここのを引用させていただきます。

-f/--fail

(HTTP) サーバエラーが生じたときに黙って(何も出力しないまま)終わらせます。これはスクリプトなどが失敗した試行をより扱いやすくするためによく利用されるものです。一般的に HTTP サーバは文書の配信ができない場合、その旨を記載した HTML 文書を返信してきます(多くの場合、その理由その他の情報も含まれます)。このオプションは、その出力を止めてエラー番号 22 を返すようにします。

この方式は確実性に欠けます。特に認証が絡んでいる場合、失敗した試行に対する応答コード(401 と 407)が無視されてしまうことがあります。

-s/--silent

沈黙モードにします。プログレスメータやエラーメッセージは表示されません。 curl の出力を止めます。

-S/--show-error

-s/--silent と伴用すると、失敗時にはエラーメッセージが表示されるようになります。

-L/--location

(HTTP/HTTPS)要求したページが別の場所に移動していた場合に(サーバからの Location: ヘッダ行と 3XX 応答コードで検知されます)、このオプションにより、新しい場所に対して要求を再試行するようになります。 -i/--include または -I/--head と伴用された場合、要求したページすべてのヘッダが示されます。認証を用いている場合、 curl はその信任状( credentials )のみを最初のホストに対し送信し、異なるホストにリダイレクトされても、ユーザ名+パスワードは傍受されません。このふるまいの変更については --location-trusted をご覧ください。リダイレクト追跡の回数は --max-redirs オプションで制限することができます。

リダイレクトを追跡する際にリクエストが単なる GET でない場合(例えば POST や PUT など)、 HTTP 応答コードが 301, 302, 303 のいずれかならば、リクエストは GET メソッドで再試行されます。応答コードが他の 3xx コードであったならば、前と全く同じメソッドでリクエストが再試行されます。

引用元:cURL - How To Use (マニュアルページ日本語訳)

日本語の方を読んでみたけど、ちょっと日本語でも難しい。とりあえずざっとまとめてみました。ざっと過ぎて「cURL」に詳しいプログラマーから怒られそうですが…。

  • 「-f」はサーバエラーで「cURL」が失敗したときにおかしくならないように何もしないまま終わらせるオプション。
  • 「-s」は沈黙モードというモードがあって、それにするオプション。沈黙モードにすると、プログレスメータやエラーメッセージが表示されない。まぁ、そのまま黙って「cURL」をやらせるオプションですね。
  • 「-S」は「-s」と併用すると、プログレスメータなどは表示せずに黙ってるけど、エラーメッセージだけは出させるというオプション。「-S」と「-s」って大文字と小文字の違いだけでわかりずらいのに、それを併用して使うなんて。
  • 「-L」は「cURL」で取ってくる先が引っ越していた場合、そのリダイレクト先で「cURL」をやるというコマンド。

やっとひと通りの「Homebrew」インストールのコマンドの確認が終わりました。一応まとめると、

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

「https://gist.github.com/raw/323731/install_homebrew.rb」というファイルを取ってくるが、もし、取ってくるときに失敗したら何もせずに終了し、プログレスメーターなどは表示せず、でもエラーが出たときはエラーメッセージだけは出し、取ってくる先のhttps://gist.github.com/raw/323731/install_homebrew.rbのURLが引越してた場合は、そのリダイレクト先から取ってくること。で、取ってきたらそれを「ruby」で実行しなさい。

というコマンドでした。

ちなみに、https://gist.github.com/raw/323731/install_homebrew.rbはどんなことをするscriptなのか、直接見に行けば確認できます。

では、いよいよ「Homebrew」のインストール。

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

を黒い画面に打ちます。

続けるなら「enter」キーを押して

続けるなら「enter」キーを押してって言ってきましたので、「enter」キーをポチッ!しばらくたったら「successful」の文字が。インストール成功!

「successful」

ちゃんと、「Instalation Successful !」なんて文字を出すなんて、「Homebrew」はなかなか気がきくやつだ。

これでHomebrewの導入は完了です。次回はHomebrewを使ってソフトをインストールするっていうのに挑戦したいと思います。

最新の実績

  • Remember The Wordpress
  • happy1000days
  • happy1000days
  • happy1000days

こちらも合わせてどうぞ

  • webデザイナーの為の「本当は怖くない」“黒い画面”入門

アフィリエイト