ソースをビルドするために必要なパッケージをインストールする

Ubuntu, Debian

apt-get build-dep <package>

エラーになる場合

$ sudo apt-get build-dep ruby
パッケージリストを読み込んでいます... 完了
E: sources.list に 'ソース' URI を指定する必要があります

/etc/apt/sources.list で dep-srcを有効にする必要がある。
debを有効にしているURLは、対応するdeb-srcのコメントを外して有効にする。

deb http://jp.archive.ubuntu.com/ubuntu xenial main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu xenial main restricted
...

CentOS, RHEL

yum-builddep <package>

SSHでパスワード認証が無効になっていることを確認する

SSHで公開鍵認証にしてパスワード認証を無効に設定した後、確かにパスワード認証が無効になっていることを確認するため、あえてパスワード認証での接続を試行したい。

-o オプションで、PreferredAuthentications=passwordを指定する。

$ ssh -o PreferredAuthentications=password xxxx@example.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

Permission deniedになればOK。

Ubuntu(14.04 LTS)のEmacsでC-M-sが効かない

Ubuntu(14.04 LTS)のEmacsで、C-M-s(デフォルトではisearch-forward-regexp、ぼくはvisual-regexp、visual-regexp-steroidsのvr/isearch-forwardに割り当てている)を押しても効かない。代わりにウィンドウが隠れてしまう。

原因は、Ubuntuのキーボードショートカットで、Ctrl+Alt+Sがウィンドウのシェードの状態の切り替えに割り当てられているためだった。

toggle_shared_state

解決方法

「システム設定」> 「キーボード」の「ショートカット」タブで、「ウィンドウ」の「シェードの状態の切り替え」を無効にするか別のキーボードショートカットを割り当てる。

navigator.userAgentを偽装してくれるFirefoxのアドオン User-Agent JS Fixer

Extends the functionality of other User-Agent addons, allowing them to modify the User-Agent for JavaScript code.

情報源: User-Agent JS Fixer :: Add-ons for Firefox

Javascriptのnavigator.userAgentを偽装してくれるFirefoxのアドオン。
このアドオンは、navigator.userAgentを、送信したHTTPヘッダーのUser-Agentと同じにする(だけ)。
HTTPリクエストヘッダーのUser-Agentを変更するアドオンと一緒に使う。
FireMobileSimulatorと一緒に使うと便利。

Ubuntuでコアダンプが出力できないことがある

Ubuntu(14.04 LTS)で、コアダンプが出力できない場合があるという現象が発生した。
できる場合もある。プログラムによる。

以下のように、ulimitは問題ない。

$ ulimit -c unlimited
$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15739
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15739
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

コアダンプの出力先を確認。

$ sudo sysctl -a | grep core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P

Ubuntu(14.04 LTS)では、デフォルトでcore_patternがapportを使用するように設定されていた。

コアダンプが出力されるケースでは、カレントディレクトリにcoreというファイルが出力される。
コアダンプが出力されないケースでは、apportでエラーが発生していた。

/var/log/apport.log

ERROR: apport (pid 3480) Tue May 12 18:48:31 2015: called for pid 3479, signal 6, core limit 18446744073709551615
ERROR: apport (pid 3480) Tue May 12 18:48:31 2015: ignoring implausibly big core limit, treating as unlimited
ERROR: ERROR: apport (pid 3480) Tue May 12 18:48:31 2015: Unhandled exception:
Traceback (most recent call last):
  File "/usr/share/apport/apport", line 357, in <module>
    (info['ExecutablePath'], info['ProcCmdline']))
  File "/usr/share/apport/apport", line 99, in error_log
    apport.error('apport (pid %s) %s: %s', os.getpid(), time.asctime(), msg)
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 44, in error
    sys.stderr.write(msg % args)
UnicodeEncodeError: 'ascii' codec can't encode character '\ufffd' in position 143: ordinal not in range(128)
ERROR: apport (pid 3480) Tue May 12 18:48:31 2015: pid: 3480, uid: 0, gid: 0, euid: 0, egid: 0
ERROR: apport (pid 3480) Tue May 12 18:48:31 2015: environment: environ({})

apportでエラーになっているから、コアダンプが出力されないのだ。
PythonのUnicodeEncodeErrorが発生しているようだが、よく分からないので、core_patternにapportを使用しないよう設定することにした。

# echo 'core.%e.%p' > /proc/sys/kernel/core_pattern
$ ulimit -c unlimited
$ cat segfault.c
#include <stdio.h>

int main(void)
{
  char *s = "hello, world!";
  *s = 'H';

  return 0;
}
$ gcc -Wall -g -o segfault segfault.c
$ ./segfault 
Segmentation fault (コアダンプ)
$ ls
core.segfault.3423  segfault  segfault.c

echoで変更した設定は、システム再起動後には無効になってしまう。
変更を永続化するためには、/etc/sysctl.confに設定する。

情報源: E.4. sysctl コマンドの使用

/etc/sysctl.conf

kernel.core_pattern = core.%e.%p

しかし、なぜかシステムを再起動すると、apportを使用するように設定が戻ってしまっている。
システム起動時のapport起動で、設定を上書きしているらしい。
情報源: 12.04 - How to permanently edit the core_pattern file? - Ask Ubuntu
これを止めさせるには、apportを無効にして再起動する。

/etc/default/apport

# set this to 0 to disable apport, or to 1 to enable it
# you can temporarily override this with
# sudo service apport start force_start=1
#enabled=1
enabled=0

cachegrind.out.xxxxxx が /private/var/tmp に大量に作成されてディスク容量を圧迫

Mac OS X (Yosemite) で最近ディスクの空き容量がやたら少なくなっているので、調べてみた。

$ sudo du -sh /*

$ sudo du -sh /private/*

$ sudo du -sh /private/var/*

と調べて行くと、/private/var/tmp が200GBくらいある。
/private/var/tmp を見てみると、cachegrind.out.50526 のようなファイルが大量にあった。
これはXdebugのプロファイラーが出力するファイルらしい。(MacPortsのxdebugを使用している。)
Xdebugはエラー時にスタックトレースを表示したり、(Eclipseが必要だが)ステップ実行でデバッグできたりと便利なのだ。

で、この cachegrind.out.xxxxxx を rm で削除しようとしたら、

$ sudo rm cachegrind.out.*
-bash: sudo: Argument list too long

となって削除できない。
ファイルが多すぎるため、シェルが * を展開すると Argument list too long になってしまうのだ。

find -exec で削除した。

$ cd /private/var/tmp
$ sudo find . -name 'cachegrind.out.*' -maxdepth 1 -exec rm {} \;

200GBくらい空いた。

find -exec については、以前書いた以下の記事を参照してください。
findで検索した結果を削除したりgrepする方法

このままではまたどんどん cachegrind.out.xxxx がたまってくるので、xdebugの設定を変更して、プロファイラーが/private/var/tmp でなく、/tmp に出力するようにした。
(ついでにトレースファイル出力先も /tmp にしておいた。)
こうしておけば、再起動時に削除されるだろう。

/opt/local/etc/php53/php.ini
xdebug.profiler_output_dir と xdebug.trace_output_dir を追加。

[xdebug]
xdebug.profiler_enable=On
xdebug.remote_enable=On
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"
xdebug.idekey=ECLIPSE_DBGP
xdebug.profiler_output_dir=/tmp/ ; プロファイラーのファイル出力先
xdebug.trace_output_dir=/tmp/ ; トレースファイル出力先

Xdebug: Documentation.

OpenSSLコマンドで証明書のチェック

発行したSSLサーバ証明書と中間CA証明書を実際にApache等にインストールする前に、正しいかどうか検証したいことがある。
その場合は、OpenSSLのopensslコマンドで検証することができる。

openssl s_serverでサーバを起動

s_serverは、リモートのクライアントからのSSL/TLSの接続を受け入れる一般的なSSL/TLSサーバを実装している。

openssl s_server -cert <サーバ証明書ファイル> -key <秘密鍵ファイル> -CAfile <中間証明書ファイル>

実行例:

$ openssl s_server -cert server.crt -key server.key -CAfile intermediate.crt 
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT

openssl s_clientでチェック

起動したサーバに openssl s_client で接続して、証明書を検証する。
s_clientは、リモートのサーバに対するSSL/TLSの接続を確立する一般的なSSL/TLSクライアントを実装している。

openssl s_client -connect localhost:4433 -CAfile <CA証明書ファイル>

CA証明書ファイルの例:

  • Mac OS X
    /etc/openssl/cert.pem
    /opt/local/etc/openssl/cert.pem、/opt/local/share/curl/curl-ca-bundle.crt (MacPortsの場合)
  • Ubuntu (ca-certificates をインストールしておく)
    /etc/ssl/certs/ca-certificates.crt
  • CentOS
    /etc/pki/tls/certs/ca-bundle.crt にあるが、指定しなくても大丈夫。

実行例:

$ openssl s_client -connect localhost:4433 -CAfile /opt/local/share/curl/curl-ca-bundle.crt
CONNECTED(00000003)
depth=3 (略)
verify return:1
depth=2 (略)
verify return:1
depth=1 (略)
verify return:1
depth=0 (略)
verify return:1
---
Certificate chain
 0 s:(略)
   i:(略)
 1 s:(略)
   i:(略)
 2 s:(略)
   i:(略)
 3 s:(略)
   i:(略)
---
Server certificate
-----BEGIN CERTIFICATE-----
(略)
-----END CERTIFICATE-----
subject=(略)
issuer=(略)
---
No client certificate CA names sent
---
SSL handshake has read 4744 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: (略)
    Session-ID-ctx: 
    Master-Key: (略)
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    (略)
    Compression: 1 (zlib compression)
    Start Time: 1421023132
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

実際にサーバにインストールしたら、s_clientで以下のように証明書をチェックする。
-servername は、SNI(Server Name Indication)のために必要。

実行例:

  • Mac OS X
    (CAfileはMacPortsの場合)

    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts -CAfile /opt/local/etc/openssl/cert.pem
    
  • CentOS

    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts
    
  • Ubuntu
    (ca-certificates をインストールしておく)

    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts -CAfile /etc/ssl/certs/ca-certificates.crt
    

証明書の有効期限をチェックしたい場合は、

$ echo | openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts 2>/dev/null | openssl x509 -noout -dates