NHN Japan ディレクターブログ

Open & Shareを実践中! Webサービスの開発・運営のノウハウを公開します。

2008年05月23日 17:13

Linuxのススメ

番外編
こんにちは、ライブドアでディレクターをしている河野です。

今回はディレクターという立場で、Linux のススメについて書きたいと思います。

ライブドアで使用しているサーバは、基本的に「LAMP」(Linux+Apache+MySQL+PerlorPHP)の構成です。そして、私の所属しているモバイルメディアグループでは、今までの経緯やモバイルの特徴から、HTML やテンプレートエンジンである Template-Toolkit などのフロント周りのコーディングやディプロイ作業はディレクターの担当のため、Linux サーバ上で操作することが少なくありませんが、これは他のグループのディレクターと比べ珍しいかもしれません。詳しくは、「livedoor「モバイルディレクター」のご紹介」「【座談会】 livedoor ディレクターの実態とその業務」をご覧下さい。

早速ですが、本ブログをご覧の皆さんは、Linux コマンドを使っていますか?

コマンドライン型のユーザインターフェイスというのは取っ付きにくく、よくわからないという方、Windows 上に様々なツールがあるからと必要性を感じない方、Linux コマンドが必要になるような作業はプログラマにお任せすればいいと考えている方など様々でしょう。確かに Linux を覚えることはディレクターとして必須ではなく、プロジェクトマネージメント能力を高める方が大切です。

【01】Linuxを使えることのメリット

ただ、ディレクターが Linux コマンドを扱えることには、2点大きなメリットがあると思います。

1.ディレクター業務の効率化

Windows 上では時間が掛かったり、プログラマに依頼しないとできなかったことが自身で手軽にできるようになることで、開発フェーズではデバッグに利用できます。
また運用フェーズでは調査や自動化に使えるため、ディレクター業務の効率化やプロジェクトのコスト削減に役立ちます。後ほど具体例を書きたいと思います。

2.プログラマの負担軽減

トム・デマルコの書いた「ピープルウェア」にもありますが、プログラミングという作業は集中力を必要とするため、思考の中断を極端に嫌います。そのため、依頼する内容が実際の作業時間としては数分でお願いできるものでも、プログラマーへの依頼のタイミングによってはそれが数分のロスではなくその数倍〜数十倍のロスであるかもしれないことをディレクターは意識しておくべきだと思います。

その場合に、開発へのロスを勘案しても割り込みの作業を依頼するか、それとも開発に影響のないタイミングまでその作業を待つかの2つの選択肢の他に、Linux を扱えることで自分で作業するという選択肢が出てきますので、開発スケジュールがタイトであるほど、これが大きなメリットになると思います。また、普段でも軽い Linux 系の作業がディレクターで巻き取れればプログラマーへの負担も軽減し、本来の開発業務に専念してもらえます。

プログラマーがメインの業務の場として使っているLinuxについて、ディレクターが習得する姿勢こそが、以前のエントリー「“できるディレクター”になるための心構え」で書かれている「自分の思っている職域より一回り大きい範囲まで踏み込む」ことの1つであると私は思います。

それでは、実際にディレクターが覚えておくと便利な Linux のコマンドと具体例を書いていきます。Linux の初歩の初歩は割愛します。必要な方は、触りで構いませんのでLinux入門再入門 体で覚えるLinuxの基本をご覧下さい。

【02】ディレクターオススメのコマンド

Linuxのコマンドは数百とありますが、ディレクターとしてよく使うものは限られます。
ディレクターとしては、
・テキストを処理するコマンド(cat, tail, cut, grep, wc, sort, uniq)
・コマンドを組み合わせて使用するパイプ(|)
・複数のファイルを表現する際に使用するワイルドカード(*,?)
を押さえておけば、それだけで十分なメリットを享受することができると思います。

以下にオススメのコマンドを紹介します。詳細は、コマンドマニュアルなどを見て下さい。
コマンド名内容ディレクタの活用法
cat,zcatファイルの内容を標準出力に出力大抵コマンドの起点になります。catコマンドの後にファイル名を複数スペース区切りで続けて書くことで、それらのファイルを結合することができます。これだけでも使えます。また、zcat は gzip や compress で圧縮されたファイルの内容を表示できるので、わざわざ解凍することなく内容をチェックすることができます。
tailファイルの末尾部分を表示します-fというオプションを付けるとファイルの最終部分の文字を読み続けようと無限にループするので,ログを垂れ流して見たい時など,リアルタイムにファイル出力を監視することができます。
cutテキストファイルから一部を選択フォーマット化されたファイルから必要なものを抜き出すのに便利です。区切り文字を-dオプションで指定できるので、例えばApacheのログでは、「cut -d " " -f X番目」としてアクセスパス部分であったり、日時であったり、ユーザエージェントであったりを抽出できます。
grepパターンにマッチする行を表示します後ほど書くパイプを何度も連結させて大量のデータやログから欲しい情報だけを抜き出すのに使います。逆にパターンにマッチしない方を表示する-vというオプションもあり、こちらも良く使います。
wcファイル中のバイト数、単語数、行数を出力-lというオプションで行数を出力します。1行=1件(1アクセス,1PV,1人)であるデータが多いため、後述するパイプ(|)の最後にwc -lと付けることで数を知りたいという時に使います。
uniqソートされたファイルから内容の重なった行を削除重複を除いたユニークな値が欲しいケースはままあると思います。またオプションも豊富にあり、-c オプションを付ければ、それぞれの行が何回現われたかを行の内容とともに表示することができます。注意としては入力がソートされていなければならないので、次の sort コマンドと合わせて使うことが多いです。
sortテキストファイルの行をソート昇順/降順で並べたい時に重宝します。-kというオプションでソートするキーを選べます。
パイプ(|)あるコマンドの標準出力を別のコマンドの標準入力を連結最近の Windows のエディタは grep が出来たり、矩形選択ができたりなど高機能になっており、 Linux のコマンド単体ではそれほど魅力を感じないですが、このパイプは Windows の GUI のツールにはない特長であり、組み合わせることで可能な処理が増えるようになります。「ある英文ファイルから最もよく使われた単語をn番目まで抜き出して、出現回数と合わせて降順で出力する」という処理をしようとした時にコマンドとパイプを使えば、わずか6ステップ(6つのコマンド)でできるというエピソードがあることからも伺い知ることができます。(詳しくは「詳解 シェルスクリプト」のP.109をご覧下さい)
ワイルドカード(*,?)検索でどんなパターンにもマッチする特殊文字「*」は文字数不定の文字列、「?」は1つの文字の代用として使うことが出来ます。例えば、Apacheのアクセスログがログローテートしていてそれら全部のファイルを対象にしたい時は、access.log.*とできます。


それでは最後に上記を使っていくつか実用例をあげていきたいと思います。

【03】Linuxコマンドを使った場面例

1.特定の動画ファイルダウンロード数の算出

DoCoMo には amc, 3gp という2種類の拡張子の動画ファイルがあります。amc ファイルは初期の FOMA でのみ使用していたファイルです。今後もこのファイルをサポートするかを判断するため、2008年4月の1ヶ月でどのくらいダウンロードがあったのか調べるとしましょう。

アクセスログは1日ごとに access_log.20080401.log.gz という圧縮ファイルの形でありました。4月1ヶ月のため、30個ファイルがあります。圧縮ファイルの内容をまとめて読み込み、その内容をフィルタすることはWindowsのGUIツールでは難しいと思います。Linux では zcat を使い、
$ zcat access_log.200804??.log.gz | cut -d ' ' -f 7 | grep .amc | wc -l

と1行で調べることができます。

2.会員データスクリーニングのための会員リスト作成

携帯の公式サイトでは、会員情報のデータベースはキャリア側とサイト運営側のそれぞれが持っていますが、公式サイトを退会をしないまま携帯電話を解約するなどで非会員になるユーザーがいるため、会員情報のデータベースの整合性を合せるため定期的にキャリア側データをサイト運営側データと付き合わせするスクリーニング処理を行う必要があります。

例えば au の場合、キャリアの管理システムから現在会員データをダウンロードします。そのデータには1行に1会員のデータとしてスクリーニングに必要なサブスクライバ ID の他、プロバイダ名やサービス名、入会日などの情報が決められたフォーマットに従って入っているため、そこから必要なユーザ ID だけを抽出する作業が必要になります。弊社で使用しているユーザ D は上記サブスクライバ ID の中の先頭から14桁を使用していますので、それを抽出します。data.tsv がキャリアフォーマットに従った現在会員データであるとして、その中のタブ区切り5番目にサブスクライバ ID があるので、Linux では、
$ cat data.tsv | cut -f 5 | cut -c 1-14

で抽出することができます。
また、こうして抽出したファイルを ember_list.txt とします。一方で削除対象のユーザ ID のリストが elete_list.txt としてあったとします。削除対象ユーザリストの中に会員リストがあると問題ですのでチェックしてみましょう。
正攻法で考えれば、会員の ID がもう片方の削除対象リストに入っているかをループなどで1つ1つ照合することが考えられますが、データが多い際には時間が掛かりそうです。ですので、ちょっと見方を変えて重複がないということは、それぞれのユーザ ID はユニークであるはずという考えから、重複をチェックしてみます。以下のようにしてみました。
$ cat member_list.txt delete_list.txt | sort | uniq -c | sort -k1,1n | tail

会員リストと削除対象リストを連結し、それを uniq -c でそれぞれの行が何回現われたかを行の内容とともに表示させます。ここで重複があるとカウント数が2となるので、それを再度 sort で並べて表示させます。カウント数が1であれば大丈夫です。

3.アクセスログのリアルタイム監視

ディレクターとして Web の動作をチェックする際に単純に Web ブラウザだけを見て進めるのと、Apache のログやアプリケーションのログを見ながら進めるのでは、得られる情報には差があります。また、プログラマに不具合を報告する場面でも、例えば単純に「Web の画面が真っ白になります」という報告よりも、その際の Apache のログやアプリケーションのログを一緒につけてあげた方が問題解決の助けになると思います。

ログを見る際には先ほども書きました"tail -f"コマンドを使用します。
$ tail -f access_log
$ tail -f error_log
$ tail -f app.log (アプリケーションログがapp.logの場合)

更に与えられたパターンにマッチする部分を含む行を抽出する grep というコマンドを併用することで、
自分が求めているアクセスやログだけを抽出することもできます。
例えば、同時に複数の人からのアクセスがある状況で、自分のアクセスのログだけを見たい時も grep やパイプを使ってフィルターを掛けることができます。

・PCで自分のIPがXXX.XXX.XXX.XXXの時
$ tail -f access_log | grep XXX.XXX.XXX.XXX (DNS逆引きをしていない場合)

・UserAgentもアクセスログに出ている場合に自分だけがDoCoMoのN904iを使っている時
$ tail -f access_log | grep N904i

いかがでしょうか。言葉の説明のため分かり辛かったと思いますが、具体的な内容よりも、やりたい作業が Linux のコマンドで、しかも10個足らずのコマンドの組み合わせで実現できていることを感じて頂ければ充分です。

ライブドアでは、Linux の得意なディレクターも募集しています。


この仕事をもっと知りたいあなたは、こちらをチェック

トラックバックURL

コメント一覧

  1. 1.
    • ひろつぐ
    • 2008年05月24日 08:43

    4 Linuxコミュニティ以外では「ここまでWinと遜色なく使える」記事が多いので、こんなところでパイプに出あえるとは思いませんでした(^^;
    押し着せられた機能だけでなく、組み合わせで自分だけの便利コマンドが作れるのは、目立たないけど大きなメリットですよね。
    これからもどんどん記事を増やして欲しいです。
    もうひとつのメリット、ひとつの機能を実現するのにたくさんの選択肢があることとか…

    関係ないですが、自分はLAMPよりL2P2 (Linux, Lighttpd, PostgreSQL, PHPorPython)が好みです。

  2. 2.
    • waqs
    • 2008年05月27日 01:22

    LINUXコマンド、さくっと打てるとかっこいいですよねー
    私は、ちょっと怖いです。

    とりあえずrootでrmだけは避けましょうw

コメントする

名前:
メール:
URL:
  情報を記憶: 評価:  顔   星
 
 
 
特集記事
連載「ディレクターのためのスマートフォン講座」

連載「ロケタッチのつくりかた」
記事検索
アーカイブ
人気の記事
Facebook
プロフィール
訪問者数

    • ライブドアブログ