環境情報の書きかたまとめ

人によって書きかた・書いてある内容がまちまちな環境情報ですが、[Qiita のガイドライン](http://help.qiita.com/ja/articles/qiita-article-guideline)にもあるように、**環境や前提条件を説明する**というのは、非常に重要で、ここがズレていると、これから取り掛かろうとしている作業のすべてが、徒労に終わる可能性すら秘めているわけです。

そういうわけなので、環境情報にはもっと目を向けていただきたく。個人的に、マストで押さえてほしいものと、書きかた、および、その調べ方をまとめてみようと思います。

# 書くべき内容・書きかた

以下2つを順番に書くのみです。

* サマリ
* コマンドログ (出せるものはすべて)

単純な環境情報はサマリで判断でき、詳細な前提条件の差分はコマンドログから確認できる状態を目指します。

## サマリ

OS や、ミドルウェア、ソフトウェアの名称とバージョンを記載し、リストアップします。

## コマンドログ

サマリで挙げたものの根拠となる情報を、ターミナルや、コマンドプロンプトで出力した結果を貼り付けて記載します。

## 記述例

* Mac OS X EL Capitan 10.11.3
* IntelliJ IDEA 15
* Oracle Java 8

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21

$ osascript -e 'version of app "IntelliJ IDEA 15"'
15.0.2

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
```

# 調べ方 (随時アップデート)

ここで問題になってくるのが、コマンドログを取る際、何を発行したらよいか、です。自身がよく使用するものを中心に、リストアップし、随時アップデートしていこうと思います。

ここに載っていないものでも、アプリケーションの多くは、`--version`、`-v`、`-V` のいずれかで調べることができます。なお、`-v` や、`-V` には version 以外の意味のオプションが割り当てられている場合もありますので、オプションが不明な場合は、事前に `--help` などで、その意味を調べておくべきでしょう。

## カーネル

```shell-session
$ uname -a
Linux ubuntu14 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

## OS

### Mac OS X

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21
```

### Ubuntu

```shell-session
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
```

### CentOS

```shell-session
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

## ミドルウェア・ソフトウェア

### Java 

```shell-session
$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
```

### Maven

```shell-session
$ mvn -v
Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.2.0-27-generic", arch: "amd64", family: "unix"
```

### Node.js

```shell-session
$ node -v
v6.2.0

$ nodejs -v
v0.10.25
```

### NPM

```shell-session
$ npm -v
3.9.5
```

### Ruby

```shell-session
$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]
```

### Nginx

```shell-session
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
```

### Httpd (Apache)

```shell-session
$ httpd -v
Server version: Apache/2.4.16 (Unix)
Server built:   Jul 31 2015 15:53:26
```

### MongoDB

```shell-session
$ mongod --version
db version v3.2.3
git version: b326ba837cf6f49d65c2f85e1b70f6f31ece7937
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel70
    distarch: x86_64
    target_arch: x86_64

$ mongo --version
MongoDB shell version: 3.2.3
```

### OpenSSH

```shell-session
$ ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6, OpenSSL 1.0.1f 6 Jan 2014
```

### cURL

```shell-session
$ curl --version
curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
```

### Git

```shell-session
$ git --version
git version 2.5.4 (Apple Git-61)
```

### Bash

```shell-session
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
```

### Zsh

```shell-session
$ zsh --version
zsh 5.1.1 (x86_64-apple-darwin15.0.0)
```

## ウィンドウ アプリケーション

### Mac OS X

```shell-session
$ osascript -e 'version of app "Google Chrome"'
50.0.2661.102

$ osascript -e 'version of app "IntelliJ IDEA 15"'
15.0.2

$ osascript -e 'version of app "Parallels Desktop"'
11.2.0

$ osascript -e 'version of app "Kobito"'
2.3.5

$ osascript -e 'version of app "Microsoft Excel"'
14.5.2
```

# 補足

コメントでご指摘いただき、本当にそのとおりだなあと感じたので追記。

パッチの適用状況など、バージョンオプションで表示されない部分については、パッケージマネージャから詳細情報を取得することで、より厳密に前提条件を揃えることができます。

検証や、手順紹介などの多い Qiita では、あまり特殊な環境下で、記事を執筆することも多くはないかと思いますが、仮にそのような状況であったり、パッチ適用自体を主目的とするような執筆の場合には、パッチの適用状態なども、環境情報に含めるようにすると、記事の質がさらに高まりそうですね！

最後に、Ubuntu と、CentOS での調べ方を例示しておきます。

## Ubuntu

```shell-session
$ ssh -V
ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6, OpenSSL 1.0.1f 6 Jan 2014

$ dpkg-query -l 'openssh*'
dpkg-query -l 'openssh*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                              Version               Architecture          Description
+++-=================================-=====================-=====================-=======================================================================
ii  openssh-client                    1:6.6p1-2ubuntu2.6    amd64                 secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                    1:6.6p1-2ubuntu2.6    amd64                 secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server               1:6.6p1-2ubuntu2.6    amd64                 secure shell (SSH) sftp server module, for SFTP access from remote mach
```

## CentOS

```shell-session
$ ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

$ rpm -q openssh-server
openssh-server-6.6.1p1-25.el7_2.x86_64
```