みなさんこんにちは。

花粉症に悩まされる季節、3月になりました。出会いと別れの時期ともいいますね。

4月になると、新入社員が入ってくる会社も多いことでしょう。

新入社員だけでなく、経験者採用で転職されたも含め、新たなフィールドでスタートする方々は、新しい業務、新しい業界でのルール、新しい技術的な知識、新しい会社内のルールなど、たくさんの新しいことを覚えなければならない時期だと思います。

一般的な社会人としての振る舞いなど、社会共通の常識は外部の研修を利用して学習することも多いと思いますが、その会社独自で蓄積されてきたノウハウや、会社独自のルールなどは、会社内で知識や情報共有をするために、標準化を行うのがよいとされています。

具体的には自社独自のガイドラインを作成したり、マニュアルを作成したり、ナレッジベースを構築することで、後から入ってきた人にもスムーズに知識やルールの共有ができるという訳です。

今回紹介するのは、オープンソースなシステムではなく、そういった特定のノウハウを体系的にまとめて、オープンソースとして公開しているプロジェクトです。

知識をオープンにしたり、ノウハウを体系的にまとめて公開するようなサービスといった意味では、「NAVERまとめ」や「Qiita(プログラマの技術共有サービス)」、「Quora」など、まとめサイト、知識共有サイトとして様々なものがあります。

これらのプロジェクトはオープンソースで構築されており、他サービスと違う点は、公開された後に不特定多数の人から修正のリクエストを受け、良いと思われるものはマージされて、どんどん進化するノウハウ集であること。
ノウハウが日々バージョンアップするともいえるでしょう。

また、これらノウハウが、本来ソースコードの分散型バージョン管理システムであるgithubで管理されているという点も特徴的でしょう。

The Art of Command Line

このプロジェクトでは、主にLinuxのコマンドラインを学ぶときに役立つ情報がまとめられています。

Linuxを初めて触るとき、特に抵抗があるのはコマンドラインでの操作だと思います。

そんなときに最短距離でよくつかうコマンドや役に立つコマンドを効率的に学ぶには良いガイドラインだと思います。

最初に以下のような説明が書いてあります。

コマンドラインで流れるように操作ができるということは、軽く見られたり他人から理解されないスキルだとみなされることもあるだろう。
しかしそのスキルは、明らかにかすぐ分かるようかは問わず、エンジニアとしてのあなたの柔軟性や生産性を改善してくれるものだ。
ここでは、Linuxでコマンドラインを使う上で便利だと思ったメモやTipsの数々を挙げてみる。
あるものは基礎的だが、非常に詳しいもの、洗練されたもの、曖昧なものもある。このページはそんなに長いものではないが、ここに書いてあることの全てを使ったり思い出すことができれば、かなり詳しくなれるだろう。

この通りプロジェクトの文章は多国語化され、日本語にもなっています。

次に、文章の対象:初心者向けでもあるし、経験者向きでもあると書いてあります。

私もLinuxコマンドラインとは10年来以上のつきあいですが、知らないコマンドややり方のノウハウが結構あります。

例えば

moshはUDPを使ったsshの代替で、(サーバー側での設定は必要であるが)断続的な接続時に便利。

■カレントディレクトリ(とサブディレクトリ)全体を、ネットワーク内に公開されたWebサーバにするなら、python -m SimpleHTTPServer 7777 (ポート7777で公開。Python 2の場合)あるいはpython -m http.server 7777 (Python 3の場合)。

■改良版tracerouteとしてmtrを使ってネットワークの問題を調査しよう。

■ディスクがいっぱいになっている理由を調べるには、ncduを使うとdu -sh *より時間が節約できる。

■帯域を使っているのがどのソケットやプロセスなのかを見つけるには、iftopあるいはnethogsを試そう。

■ab(Apacheに付属)は、Webサーバのパフォーマンスをざっくりチェックするのに便利。より複雑なテストにはsiegeを試そう。

等々、知らなかったけど便利そうだな、試してみようかなと思いました。

さらに、基本、日常的に使うもの、ファイルとデータ処理・・・とLinuxでコマンドラインを習得するのに役立つ情報が書いてあります。それぞれの章と一部ノウハウを紹介します。

【日常的に使うもの】

■Bashでは、引数を補完、または利用可能なコマンドを列挙するのにタブを使い、コマンド履歴から検索するのにctrl-rを使う。(検索キーを入力した後、ctrl-rを繰り返し入力することで次から次へと検索結果を送ることができる。

Enterで見つかったコマンドの実行となり、Enterではなく右カーソルキーを押した場合は見つかったコマンドが入力された状態になる。)

【ファイルとデータの処理】

■カレントディレクトリ以下のファイルをファイル名で探したいなら、find . -iname ‘*something*’。

場所を指定せずにファイル名で検索したいなら、locate something使おう(ただしupdatedbは最近作られたファイルはインデックスしていないであろうことに注意)。

【システムのデバッグ】

■Webのデバッグならcurlやcurl -lが便利で、wgetも同様、よりモダンなのはhttpie。

【ワンライナー】

コマンドをまとめて使う例をいくつか。

■sortやuniqを使ってテキストファイルの共通部分、結合、差異を求める時に特に便利なのが以下のやり方。

aとbはそれぞれ内容に重複のないテキストファイルとする。この方法は高速で、数GB程度までの任意のファイルサイズで動作する(/tmpが小さなルートパーティションにある場合は-Tオプションをつける必要があるが、ソートはメモリ内で行われるとは限らない)。上述のLC_ALLとsortの-uオプションも参照のこと。

cat a b | sort | uniq > c # cはaとbの和集合
cat a b | sort | uniq -d > c # cはaとbの共通部分
cat a b b | sort | uniq -u > c # cはaとbの差異

【目立たないが便利なもの】

■expr: 算術演算、論理演算、または正規表現の評価を実行

■m4: シンプルなマクロプロセッサ

【OS X用のもの】

これらはMacOS用の項目です。

■パッケージ管理はbrew (Homebrew)やport (MacPorts)を使う。上記の多くのコマンドをMacOSにインストールできる。

等々あります。

最後に、Linuxでコマンドラインを覚える際のノウハウ集以外のまとめリンク集を。

awesome-shell: シェルのツールやリソースのまとめ

awesome-osx-command-line: より詳しいMac OSのコマンドラインガイド

Strict mode: よりよいシェルスクリプトを書くために

shellcheck: シェルスクリプト(本来、bash/sh/zsh用)の静的解析ツール

Filenames and Pathnames in Shell: シェルスクリプトでファイル名を正しく扱うために

前回紹介したのは、プログラミングを無料で学習できるシステムが提供されさらにそのシステムがオープンソース化されたもの。
今回は、コマンドラインを覚えるためのノウハウがオープンソース化されたまとめをご紹介しました。

オープンソースのメリットは、無料で使える、カスタマイズできるというだけでなく、一度公開されたものが様々な文化の国の参加者によって、洗練され続けていくということ。

今回のまとめ集で、そういったリソースを知っている人はオープンソースを有効活用できるということがお分かり頂けたかと思います。

実際に利用することで、自分の知識の偏りを知り、今回ご紹介したようなノウハウ集などで補うことができます。

ITの技術者を目指していく方々は、アンテナを広げるために利用してみてはいかがでしょうか?私も勉強しなおしてみたいと思います!