Team Geek ―Googleのギークたちはいかにしてチームを作るのか を読んだ

Team Geek ―Googleのギークたちはいかにしてチームを作るのかを読んだときのメモ。

0章 – まえがき

・エンジニアリングの重要な要素であるが、忘れがちな存在の「人間」に焦点を当てている。
・技術集団を率いる人間は、技術への深い愛と造詣が必要。

1章 – 天才プログラマの神話

・リーナスもビル・ゲイツもチームとうまくやる才能があった。
・人は作業途中のコードは見せたがらず、完璧にしてから見せようとする。
 しかし、作業を隠すことで失敗のリスクが高くなる。すでに誰かが対応していたり、簡単なミスに気が付かなかったり、不要なものを作成している可能性がある。
 何度もコンパイルしながらプログラムするように、フィードバックされながら作業したほうがよい。
・チームで働くときのポイントはHRT。謙虚(Humility)・尊敬(Respect)・信頼(Trust)。尊敬は思いやり、その人を高く評価すること。信頼は正しいと信じ、仕事を任せること。
・世の中の関心は常に動く。専門家として新しいことを学ばないと置いていかれる。謙虚に常に学んでいかなければならない。
・弱さ(わからないこと)を見せることは信用を失うことではない。謙虚を見せて、他人の意見を信頼することで、その正直さと強さによって周りが尊敬してくれるようになる。

2章 – 素晴らしいチーム文化を作る

・文化はリーダーではなくチームメンバが作る。そのため強烈な個性をもった新人が現れると、彼の文化がチームに根付くことになる。それが健全な文化になることはとても少ない。
・エンジニアはコミュニケーションをできるだけ排除してコードを書こうとするが、コミュニケーションがないと自分が正しいコードを書いているという保証はない。
(チームと違う方向に進んでいるかもしれない)
・ミッションコミットメントは方向性と、制限されたスコープが必須。
・バグ管理ツールは優先度をつける必要がある。そうしないと、どうでもよいバグを修正して、重大なバグは放置される。
・コードコメントには「なに」は記載せず、「なぜ」を記載する。
・ソースコードは完成してからもさまざまな人によって変化を続けるため、作成者の名前を記載するべきではない。

3章 – 船にはキャプテンが必要

・伝統的なマネージャーはどうやって仕事を完了させるかを考える。リーダーは何ができるかを考える。(どうやって仕事を完了させるかはチームが考える)
・部下を子供として扱えば、部下は子供のように振る舞う。エンジニアを大人として扱うべし。
・マネジメントの仕事はチームの幸せと生産性を高めること。
・マネージャーとしていちばん大事なのは、執事や召使のようにチームに奉仕すること。HRTの雰囲気を出す必要がある。
・パフォーマンスが低い人は高い人の時間を奪う。結果としてパフォーマンスが高い人は流出し、どこにも行けない人たちチームに残る。
・パフォーマンスの低い人は早めに対策する必要がある。そのチームで仕事できなくても、違うチームだと役に立つ能力を持っているかもしれない。
 また向き合う場合は、目標と期日を設定して、毎週進捗確認をする必要がある。
・チームをマイクロマネジメントしなくなれば、メンバのほうがリーダーよりも仕事に詳しくなる。つまり、リーダーは合意形成や方向性の決定を支援することになり
 目標の達成方法はメンバが決定すべきこととなっていく。
・リーダーとしてチームを長期に渡って生産的にするには、チームの幸せを計測したほうがよい。
 1対1のミーティングの後に「何か必要なものある?」という質問をすると、そのメンバが生産的で幸せになるために必要なものを簡単に把握できる。

4章 – 有害な人に対処する

・相手にする価値のない人は無視がオススメ。リソースを食われてしまうため、言葉で言いくるめるよりも無視がよい。
・善人と悪人で分類して悪人を追い出すのではなく、問題ある振る舞いを追い出す必要がある。
・有害な振る舞いに対応する前に、短期的にチームの注意や集中を無駄にしても長期的にプロジェクトにメリットがあるか、衝突は有益な方法で解決できるかを考える。
・無能で十分説明されることに悪意を見出すな。よくわからない人を追放するのではなく、破壊的な振る舞いを受け入れず、HRTに対しての期待を明確にすることが仕事。
 (例えば、ある製品に欠陥が見つかった場合、製造した企業が無能であるか愚かであるということを示しているのであって
 消費者を困らせるために企業が悪意を持って欠陥を忍ばせたわけではない、という考え方のこと。)

6章 – ユーザも人間

・成功しているプロダクトは問題を限定して、それをうまく解決したもの。
 トースター(多くの食材を調理でき、ほぼすべての人が利用できる。ただしラジオ機能(余計な機能)はついていない。)のようなプロダクトを目指すこと。
・プロダクトのユーザが増えると、機能が増えることで複雑性が増す。しかしユーザの平均的な技術能力は低下するため、ユーザの不満が増えていく。
 開発者がユーザの声を聞けるような環境を用意しておくこと。またユーザはシンジられないかもしれないが、開発チームと関係を築きたいと考えている。

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ。
あまりPGしないので深くまでは理解できなかったが、良かった。知らなかったことをメモ。

・プログラムが実行される仕組みは、プログラムがコンパイルされてマシン語(レジスタを利用した演算処理)になり、マシン語がCPUによって実行される。
・アセンブリとマシン語は1対1で対応している。(マシン語にエイリアスとして英字を割り当てたものがアセンブリ)
・8桁の2進数をバイト(byte)と呼び、メモリやディスクはバイト単位で処理される。
・ICのもつピンは直流電流0Vか5Vのいずれかの状態になっている。
・マイナスは補数で表される。補数は反転して1を足した数。マイナスは同じ絶対値の正の数を足すと0になるという考え方。
・0.1という2進数は10進数だと0.5となる。10進数の0.1は2進数では表せない。
・プログラムでは小数点数を浮動小数点数として処理する。
・メモリはメモリICにアドレス信号、データ信号、制御信号を意味する足が複数あり、アドレスを指定してデータを読み書きする。
・スタックは干し草を積んだ山という意味で、つまりLIFO(LastIn FirstOut)形式。
・単なる配列を利用するよりも、リストを使ったほうがメモリの使い方がよいため、実行速度が高速になる。
・ランレングス法(Run Length Encoding)は、データと繰り返し数で圧縮する。(AABBBBCCCC→A2B4C4)
 画像ファイルなど同じデータが続く場合に高い圧縮率となる。
・ハフマン法は圧縮対象のファイルごとに符号体系を構築して、それをもとにして圧縮する。
・画像ファイルは非可逆圧縮であることが多い。
・動作環境に影響するのはOSとマイクロプロセッサの種類。OSごとに命令を受けるAPIが異なり、マイクロプロセッサごとに処理できるマシン語は異なるため。
・ソースコードをネイティブコードへ翻訳するのがコンパイラの仕事。
・インタプリタは実行時にソースコードを1行ずつネイティブコードへ翻訳する。
・コンパイルしただけではプログラムとしては利用できない。ソースコードで利用しているオブジェクトをまとめる作業(リンク)を実施する必要がある。
 (Windowsはこの作業をすることでEXEファイルとなる)
・EXEが実行されると、変数領域、関数領域、スタック領域、ヒープ領域(プログラム実行時に動的に作成される配列やオブジェクトを格納)がメモリに割り当てられる。
・1人前のプログラマとして、ハードを理解して、OSがハードを抽象化していることを理解するべき。
・OSがなかったころは、ディスプレイの表示や印刷のプログラムも自分で書く必要があった。
・C言語はコンパイルだけでなく、アセンブリに変換することもできる。
・アセンブリはネイティブコードに変換される命令と、_TEXTなどのプログラムの構造やアセンブル方法を表す疑似命令の2種類がある。
・アセンブリ言語の構文はオペコード(命令の動作)とオペランド(命令の対象)の組み合わせ。
・例えばキーボードは割込要求の01、マウスは02といった識別番号が割り振られており、割込が発生するとまずは割込コントローラーが処理を受け付け、順番にCPUに伝える。
・VRAMというメモリ領域にデータをINすると、ディスプレイに表示される。現在はVRMA用メモリと専用マイクロチップが載っているグラフィックカードがよく利用されている。

マスタリングTCP/IP 入門編 メモ

マスタリングTCP/IP 入門編を読んだ。
とても良かった。知らなかったことをメモ。

・1970年代、各メーカーが独自規格でネットワーク機器を作成していたため、ISO(国際標準化機構)はOSIと呼ばれる通信体系を標準化した。
 OSIの定めるプロトコルは普及していないが、OSIプロトコルの設計指針であるOSI参照モデルはとても有名。
・TCP/IPはIETF(Internet Engineering Task Force)にて提案されたプロトコルで、現在のデファクトスタンダード。
・探索MTUは10分しかキャッシュされない。
・IPパケットを利用した、ECN(Explicit Congestion Notification)という輻輳通知機能がある
・Mobile IPという移動時にネットワークが変わっても、IPアドレスが変えなくする技術がある
 内部的には変えたくないIPアドレスのネットワークに仲介エージェントを配置し、リバースプロキシするようなイメージ。
 IPv4だと仲介エージェントが必要だが、IPv6 Mobile IPだと不要になる。
・TCPとUDPは同じポート番号を別の目的で利用することが可能。
・ACKは肯定確認応答、NACK(Negative Acknowledgement)は否定確認応答。
・Nagleアルゴリズムのように、送信処理を遅らせることでネットワークの利用効率をあげる方法もある。ただし遅延につながることも。
・UDPパケットはチェックサムエラーがあるとパケットすべてを破棄する。UDP-Liteでは一部エラーでは破棄しないようにできる。
・TCPに追加してマルチホーミングに対応したSCTP(Stream Control Transmission Protocol)なるものがある。
・TCPのシーケンス番号の初期値は乱数値で決定される。
・経路制御アルゴリズムにはDistance-Vector(距離をが近いネットワーク情報を各ルーターがもつ)とLink-State(同じ経路制御表をすべてのルーターが保持する)の2種類が存在する。
・OSPFにはエリアという概念があり、管理する範囲をエリア内のみとすることで、経路制御情報や処理負荷をさげる。
・ISPや地域ネットワークなど組織を束ねるネットワーク集団を自律システム(Autonomous System)と呼ぶ。
 ASには16ビットのAS番号が割り当てられ、AS番号を使って経路制御される。
・インターネットは当初ARPANETがhostsファイルを一括管理していた。
・URIはあらゆるスキームに対応した識別子。
・POPは既読情報をメールクライアントで管理し、IMAPはサーバで管理する。
・SSHを利用してポートフォワード機能を利用可能。サーバAのポート1000へ接続すると、サーバBのポート110に接続するといったことが可能。
・MRTG(Multi Router Traffic GRAPHER)はネットワークトラフィックを収集して、グラフ化するツール。
・H.323やSIPは、呼制御(相手を呼び出し、どのような形式でデータのやり取りをするか)のプロトコル。
・広域イーサネットは通信業者が提供するVLANを利用者が専用で利用する。(データリンク層を利用するため、TCP/IP以外のプロトコルも利用可能)
・ITIL(Information Technology Infrastructure Library)はイギリス政府が策定したITシステムの運用や管理業務に関する階層・体系的なガイドライン。
・インターネットの最大の利点は「エンドツーエンド通信」。IPv4では枯渇によりこれを実現できない(NAPTなどで補っている状態)。

gulp で hello world!

概要

gulp入門を見たため、メモ。
gulpはフロントエンドのタスクを自動化するタスクランナーと呼ばれるもの。

インストール

dockerでcentosを用意して、gulpをインストールした。

PS C:\WINDOWS\system32> docker run -it centos:centos6
# yum -y install epel-release
# yum -y install nodejs npm
# node -v
v0.10.48
# npm -v
1.3.6
# npm install gulp -g
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair.<anonymous> (tls.js:1430:32)
npm ERR!     at SecurePair.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:1029:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:521:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:341:10)
npm ERR!     at EncryptedStream.write [as _write] (tls.js:418:25)
npm ERR!     at doWrite (_stream_writable.js:226:10)
npm ERR!     at writeOrBuffer (_stream_writable.js:216:5)
npm ERR!     at EncryptedStream.Writable.write (_stream_writable.js:183:11)
npm ERR!     at write (_stream_readable.js:602:24)
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 4.9.87-linuxkit-aufs
npm ERR! command "node" "/usr/bin/npm" "install" "gulp" "-g"
npm ERR! cwd /
npm ERR! node -v v0.10.48
npm ERR! npm -v 1.3.6
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /npm-debug.log
npm ERR! not ok code 0

# npm config set strict-ssl false
# npm install gulp -g
# mkdir mysite
# cd mysite/
# npm init
# npm install --save-dev gulp # フォルダにgulpをインストールする
# npm config set strict-ssl true

hello world!

gulpfile.jsをgulpをインストールしたフォルダに用意する。

var gulp = require('gulp');

gulp.task('hello', function() {
    console.log('hello world!');
});

gulp.task('default',['hello']);

gulpを実行する。

# gulp
[13:06:58] Using gulpfile ~/mysite/gulpfile.js
[13:06:58] Starting 'hello'...
hello world!
[13:06:58] Finished 'hello' after 289 μs
[13:06:58] Starting 'default'...
[13:06:58] Finished 'default' after 12 μs
# gulp hello
[13:07:01] Using gulpfile ~/mysite/gulpfile.js
[13:07:01] Starting 'hello'...
hello world!
[13:07:01] Finished 'hello' after

その他、プラグインをインストールしてwebserverを立ち上げたり、watch(更新を監視)などが可能。

参考

npm install で SSL Error になった時の対処法。

rfc5077をインストールできなかった話

第2回社内セキュリティ共有勉強会に参加した際に初めて知った単語

TLSのセッション情報を確認できるツールらしい
結論としてdebian8で使ってみようとしたが、できなかった話

以下を参考に実施してみた
サーバ側のSSL Session Cache状況を確認する「rfc5077」というツールが便利
rfc5077-clientをDebian上でビルドしたい
を参考に実施した

# git clone https://github.com/vincentbernat/rfc5077.git
# aptitude install libnspr4-dev libev-dev libssl-dev libnss3-dev make gcc
...
# git submodule init
Submodule 'http-parser' (https://github.com/joyent/http-parser) registered for path 'http-parser'
Submodule 'httpagentparser' (git://github.com/shon/httpagentparser.git) registered for path 'httpagentparser'
# git submodule update
Cloning into 'http-parser'...
remote: Counting objects: 1460, done.
remote: Total 1460 (delta 0), reused 0 (delta 0), pack-reused 1460
Receiving objects: 100% (1460/1460), 659.95 KiB | 341.00 KiB/s, done.
Resolving deltas: 100% (897/897), done.
Checking connectivity... done.
Submodule path 'http-parser': checked out '1ca7de52587f19cb87a28b8ace2e0f2e6cfcde7f'
Cloning into 'httpagentparser'...
remote: Counting objects: 591, done.
remote: Total 591 (delta 0), reused 0 (delta 0), pack-reused 591
Receiving objects: 100% (591/591), 630.40 KiB | 160.00 KiB/s, done.
Resolving deltas: 100% (265/265), done.
Checking connectivity... done.
Submodule path 'httpagentparser': checked out '920af88989f6dd8eb6f628505d039df8b65c880e'
# make
cc -g -Werror -Wall -ansi -std=c99 -D_DEFAULT_SOURCE -D_GNU_SOURCE   -c -o rfc5077-client.o rfc5077-client.c
rfc5077-client.c: In function ‘resultinfo_display’:
rfc5077-client.c:135:6: error: implicit declaration of function ‘SSL_SESSION_get0_cipher’ [-Werror=implicit-function-declaration]
      SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
      ^
rfc5077-client.c:135:26: error: passing argument 1 of ‘SSL_CIPHER_get_name’ makes pointer from integer without a cast [-Werror]
      SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
                          ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1834:13: note: expected ‘const struct SSL_CIPHER *’ but argument is of type ‘int’
 const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
             ^
rfc5077-client.c:154:5: error: implicit declaration of function ‘SSL_SESSION_get_master_key’ [-Werror=implicit-function-declaration]
     size_t master_key_len = SSL_SESSION_get_master_key(x, NULL, 0);
     ^
rfc5077-client.c:170:6: error: implicit declaration of function ‘SSL_SESSION_has_ticket’ [-Werror=implicit-function-declaration]
      SSL_SESSION_has_ticket(x)?"✔":"✘",
      ^
rfc5077-client.c: In function ‘resultinfo_write’:
rfc5077-client.c:207:33: error: passing argument 1 of ‘SSL_CIPHER_get_name’ makes pointer from integer without a cast [-Werror]
             SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
                                 ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1834:13: note: expected ‘const struct SSL_CIPHER *’ but argument is of type ‘int’
 const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
             ^
rfc5077-client.c: In function ‘main’:
rfc5077-client.c:381:3: error: implicit declaration of function ‘TLS_client_method’ [-Werror=implicit-function-declaration]
   if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL)
   ^
rfc5077-client.c:381:26: error: passing argument 1 of ‘SSL_CTX_new’ makes pointer from integer without a cast [-Werror]
   if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL)
                          ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1820:10: note: expected ‘const struct SSL_METHOD *’ but argument is of type ‘int’
 SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
          ^
cc1: all warnings being treated as errors
<builtin>: recipe for target 'rfc5077-client.o' failed
make: *** [rfc5077-client.o] Error 1

httpoxy

概要

HTTPアクセス時に”proxy:”ヘッダをつけると
サーバ側で HTTP_PROXY として認識される(ヘッダのproxyが大文字に変換され、HTTP_が付与される)
CGIアプリケーションはこの値をHTTPプロキシの値として認識し
例えばPHPは外部接続時にHTTP_PROXYを利用して通信する

影響

サーバから外部にHTTP通信時にプロキシを経由させることができる
つまり通信内容を傍受可能となる
2016-07-19_220225
Mitigating the HTTPoxy Vulnerability with NGINX

対策

・リクエストに含まれる Proxy ヘッダを無効にする
・CGI において、環境変数 HTTP_PROXY を使用しない
・ファイアウォールなどを用いて Web サーバからの HTTP アウトバウンド通信を必要最小限に制限する
CGI等を利用するWebサーバの脆弱性に関する注意喚起 – JPCERT/CC

nginx対策方法

リクエストに含まれるProxyヘッダを無効にする対応は
複数サイト運用だと複数のファイル変更が必要となり、キツイためCGIにてHTTP_PROXYを使用しないことで対応

### 設定追加してreloadする ###
root@debian9:/etc/nginx# vi fastcgi_params
=====
fastcgi_param HTTP_PROXY "";
=====
root@debian9:/etc/nginx# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@debian9:/etc/nginx# /etc/init.d/nginx reload

apache対策方法

検証環境が手元にないが、以下でリクエストに含まれるProxyヘッダを無効にすることが可能とのこと

RequestHeader unset Proxy

確認方法

PHPに関するHTTPOXY脆弱性の問題と対応方法より

curl -H 'Proxy: 127.0.0.1:12345' "http://localhost"

でアクセス。PHP側は

var_dump($_SERVER['HTTP_PROXY']);
putenv('HTTP_PROXY=');
var_dump(getenv('HTTP_PROXY'));
exit;

その他

主なディストリビューションの対応方法
httpoxy : CGI/言語などを利用したHTTP_PROXY書き換えの脆弱性(CVE-2016-5387 etc.)

Ethereumを使ってみた

Ethereumとは

・2015-7-30リリース
・Ethereum(パブリック型ブロックチェーン)
・マイクロソフトが開発環境を提供しているらしい
・スマートコントラクト・分散型アプリケーション(DApps)の構築プラットフォーム
・派生したプロジェクトにEris、HydraChain(エスタブリッシュ型ブロックチェーン)

ブロックチェーン情報

・ETHの残高情報等がブロックチェーンに直接記録されるアカウントがベースとなったシステム
 2種類のアカウントがある
 ・従来のビットコイン等の仮想通貨のアドレスと同様のアカウント
 ・「コントラクトアカウント(Contract Account)」と呼ばれるプログラムコードによって
  管理されるスマートコントラクト実行用のアカウント

インストール

debianで試そうとしたが、サポート外とのこと(公式フォーラムより)

root@ubuntu1404:/home/shimizu# bash <(curl -L https://install-geth.ethereum.org)
...

root@ubuntu1404:/home/shimizu# geth version
Geth
Version: 1.4.10-stable
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.5.1
OS: linux
GOPATH=
GOROOT=/usr/lib/go

テスト環境で採掘する

パーミッションド型ブロックチェーンを試せる(Ehterの挙動調査や個人的な作業に向いている)
ただしそこで得たEtherはパブリック型ブロックチェーン(Frontier)では利用できない

root@ubuntu1404:/home/shimizu# mkdir eth_data
root@ubuntu1404:/home/shimizu# geth --networkid "10" --datadir "/home/shimizu/eth_data" --olympic console
...
> personal.newAccount("shimizu")
"0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07"
> personal.newAccount("shimizu02")
"0x8e9b51319dc468e8c1ea55737ba3192f40693103"
> eth.accounts
["0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07", "0x8e9b51319dc468e8c1ea55737ba3192f40693103"]
> miner.start()
I0719 00:47:10.318491 miner/miner.go:119] Starting mining operation (CPU=1 TOT=2)
I0719 00:47:10.318831 miner/worker.go:573] commit new work on block 1 with 0 txs & 0 uncles. Took 204.305µs
true
> I0719 00:47:10.319500 eth/backend.go:454] Automatic pregeneration of ethash DAG ON (ethash dir: /root/.ethash)
I0719 00:47:10.319637 ethash.go:259] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000)
I0719 00:47:10.319935 eth/backend.go:461] checking DAG (ethash dir: /root/.ethash)
I0719 00:47:12.251590 ethash.go:291] Generating DAG: 0%
I0719 00:47:14.766994 ethash.go:291] Generating DAG: 1%
I0719 00:47:17.135879 ethash.go:291] Generating DAG: 2%
...

miner.stop()

### ブロックチェーンの長さ ###
> eth.blockNumber
937

### etherの持ち高確認 ###
> eth.getBalance("0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07")
1.40765625e+21

Frontierに接続してみる

アカウントの削除方法がわからなかったため、新しくディレクトリを作成して試してみた

root@ubuntu1404:/home/shimizu# mkdir eth_data_frontier
root@ubuntu1404:/home/shimizu# geth --datadir "/home/shimizu/eth_data_frontier"
...
I0719 02:01:41.677036 core/blockchain.go:963] imported 1906 block(s) (0 queued 0 ignored) ...
...

参考URL

Ethereum イーサリアム
Gethをインストールする
Ethereumをインストールしてみた。

crontab出力方法

デフォルトでは標準出力・標準エラー出力はメール送信される

送信先を指定

root@hostname:/home/shimizu# crontab -uroot -l
MAILTO=shimizu.test0@gmail.com
* * * * * echo "cron test"

2016-01-01_164444

日付をつけてファイル出力

root@hostname:/home/shimizu# crontab -uroot -l
* * * * * echo "cron test" >> /var/log/crontab/`date +\%Y\%m\%d`.log 2>&1

複数プログラムのログを出力する

root@hostname:/home/shimizu# crontab -uroot -l
LOGDIR="/var/log/crontab"
* * * * * echo "cron test1" >> $LOGDIR/`date +\%Y\%m\%d`.1.log 2>&1
* * * * * echo "cron test2" >> $LOGDIR/`date +\%Y\%m\%d`.2.log 2>&1

syslogに送る

root@hostname:/home/shimizu# crontab -uroot -l
* * * * * echo "cron test" 2>&1 | logger -t crontab -p cron.info

root@hostname:/home/shimizu# tail -f /var/log/syslog
Jan  1 17:17:01 hostname CRON[3070]: (root) CMD (echo "cron test" 2>&1 | logger -t crontab -p cron.info)
Jan  1 17:17:01 hostname crontab: cron test
...

参考URL

cron力をつけよう!全てのcrontab入門者に贈る9個のテクニック
cron で > /dev/null して椅子を投げられないための3つの方法

LAMPのEOL – 作成中 –

Linux

centos6(https://wiki.centos.org/FAQ/General#head-fe8a0be91ee3e7dea812e8694491e1dde5b75e6d)
2020.11.30
各OS(http://qiita.com/yunano/items/4757f86f9e92bb4f503f)

Apache

公式情報なし

MySQL/MariaDB

MariaDB(https://mariadb.com/kb/en/mariadb/mariadb-maintenance-policy/)
5.5は2017.4.11まで
MySQL(http://www.softagency.co.jp/products/mysql/support/・http://www.oracle.com/jp/support/lifetime-support/index.html)
5.5は2018.12まで

PHP

PHP(http://php.net/supported-versions.php)
5.4は2015.9.14まで