Pistolfly のすべての投稿

Software Engineer in Tokyo, Japan

CentOSにRVMをマルチユーザ用にインストール

マルチユーザ用にRVMをインストール

マルチユーザ用にRVMをインストールするには、sudo でインストールする。
RVM: Ruby Version Manager - Installing RVM

$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
Downloading RVM from wayneeseguin branch stable
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). The default
 bundle is named curl-ca-bundle.crt; you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
Could not download 'https://github.com/wayneeseguin/rvm/tarball/stable'.
  Make sure your certificates are up to date as described above.
  To continue in insecure mode run 'echo insecure >> ~/.curlrc'.

curlのSSL証明書の検証でエラーになった。
CA証明書が古いらしい。
新しいCA証明書を取得する。

CA証明書のアップデート

$ sudo mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.bak # バックアップ
$ sudo curl http://curl.haxx.se/ca/cacert.pem -o /etc/pki/tls/certs/ca-bundle.crt

curlでまたSSLのエラーが出たので対処 - kanonjiの日記
cURL - Details on Server SSL Certificates
cURL - Extract CA Certs from Mozilla
再度sudoでRVMをインストール。

$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
Downloading RVM from wayneeseguin branch stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  796k  100  796k    0     0   170k      0  0:00:04  0:00:04 --:--:--  340k
Installing RVM to /usr/local/rvm/
installing - /usr/local/rvm/man/man1/rvm.1 -
installing - /usr/local/rvm/man/man1/rvm.1.gz -
    Creating RVM system user group 'rvm'
# RVM:  Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.beginrescueend.com/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Screencast: http://screencasts.org/episodes/how-to-use-rvm
# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'
Installation of RVM in /usr/local/rvm/ is complete.
# XXXXXXXXX,
#
#   Thank you for using RVM!
#   I sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne

sudoでマルチユーザ用にインストールすると、RVMは /usr/local/rvm にインストールされる。

sudoを使うのは、RVM自体のインストール時のみ。

以降の操作は、sudoを使わない。rvm installやgem install など、/usr/local/rvm 下に書き込む操作は、rvmグループに所属しているユーザで行う。(/usr/local/rvmのグループがrvmになっている。)
RVM: Ruby Version Manager - Troubleshooting RVM
RVM をマルチユーザー用にセットアップする: ひ日記
ユーザのグループにrvmを追加。

# usermod -a -G rvm <ユーザ名>

ユーザをrvmグループに追加したら、いったんログアウトしてから、rubyやgemをインストール。
sudo しない。

$ rvm install 1.9.3
$ rvm use 1.9.3
$ gem install rails

RVMのアップデートも、sudoを使わず、rvmsudoを使う。

$ rvmsudo rvm get latest

OS X Lion で postfixを設定する

ローカル開発環境用に Mac OS X Lion に postfix を設定する。
Mac OS X には最初からpostfixが入っているので、まず Lion でそのままの設定で postfix を起動してみる。

$ sudo postfix start

メール送信すると、以下のエラー。
/var/log/mail.log

postfix/smtpd[3475]: fatal: open /etc/postfix/submit.cred: No such file or directory
postfix/master[3282]: warning: process /usr/libexec/postfix/smtpd pid 3475 exit status 1
postfix/master[3282]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

ログを見ると、/etc/postfix/submit.cred が存在しないというエラー。
OS X Lion postfix smtpd problems: Apple Support Communities
/etc/postfix/submit.cred を作成し、パーミッションを設定。

$ sudo touch /etc/postfix/submit.cred
$ sudo chmod 600 submit.cred

/etc/postfix/submit.cred

submitcred version 1
hostname|user|password

※ hostname、user、passwordは、実際の送信したいユーザのものに置き換える。
※ submit.credは、空行が含まれていると、
warning: syntax error on line 2 of /etc/postfix/submit.cred
という警告が出るようなので、空行は入れない。

/etc/postfix/main.cf

$myhostname = macbook-pro.local
$mydomain = macbook-pro.local
myorigin = $mydomain
inet_interfaces = all
# 以下の行があったらコメントアウト
#inet_interfaces = loopback-only

自動起動の設定

/System/Library/LaunchDaemons/org.postfix.master.plist

  • -e オプション(プロセスが終了するまでの時間)をコメントアウト。
  • OnDemand を false に設定。
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
<!--
                <string>-e</string>
                <string>60</string>
-->
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/Library/Server/Mail/Data/spool/maildrop</string>
        </array>
        <key>AbandonProcessGroup</key>
        <true/>
        <key>OnDemand</key>
        <false/>
</dict>
</plist>
$ sudo launchctl unload /System/Library/LaunchDaemons/org.postfix.master.plist 
$ sudo launchctl load /System/Library/LaunchDaemons/org.postfix.master.plist

Subversion1.5以降でのブランチとマージ

Subversion 1.5 以降では、Merge Tracking 機能により、マージが楽になった。
フィーチャーブランチの典型的なマージ手順をメモしておく。
※以下の例で使用している、作業コピーのリポジトリーのルートディレクトリーのURLを表すキャレット (^) 記法は、Subversion 1.6 以降で可能です。

ブランチ作成

$ cd <いずれかの作業コピーのパス> # キャレット記法を使うために作業コピーに移動。フルでURL指定するなら不要。
$ svn cp ^/trunk ^/branches/br1

ブランチとtrunkの差分表示

$ cd <いずれかの作業コピーのパス> # キャレット記法を使うために作業コピーに移動。フルでURL指定するなら不要。
$ svn diff ^/trunk ^/branches/br1

trunkの最新をブランチにマージ

branchでの作業期間中、これを定期的に行う。

$ cd <ブランチの作業コピーのパス>
$ svn up # 作業コピーを最新にしておく
$ svn st # 作業コピーがクリーンであることを確認しておく
$ svn merge ^/trunk # ブランチの作業コピーにtrunkの最新をマージ
$ svn commit

ブランチをtrunkにマージ

branchでの修正が完了したら、最後にbranchをtrunkにマージする。
--reintegrate オプションが必要。

$ cd <trunkの作業コピーのパス>
$ svn up # 作業コピーを最新にしておく
$ svn merge --reintegrate ^/branches/br1
$ svn commit

いったん --reintegrate でマージされたブランチはもう使えない。
いったん削除する必要がある。

$ svn delete ^/branches/br1

ブランチでの作業を再開したい場合は、一度削除してから、ブランチを再作成する。

$ svn cp ^/trunk ^/branches/br1

削除したブランチのログを見たい

ブランチを削除しても、全てのリビジョンは残っているので、レポジトリのルートURLやブランチのルートURLなどに対して svn log すればよい。

$ cd <いずれかの作業コピーのパス> # キャレット記法を使うために作業コピーに移動。フルでURL指定するなら不要。
$ svn log ^/
$ svn log ^/branches

Basic Merging

MySQLのスロークエリログを取得する

  • my.cnf(MySQL 5.1)
    [mysqld]
    # スロークエリログの出力先
    log_slow_queries = /var/log/mysql-slow.log
    # これより実行に時間がかかる SQL ステートメントをロギング(秒)
    long_query_time = 2
    # インデックスを使用しないクエリをロギング
    #log-queries-not-using-indexes
    # 管理ステートメントもロギング
    #log-slow-admin-statements
    
  • my.cnf(MySQL 5.5以降)
    [mysqld]
    # スロークエリログを有効にする
    slow_query_log=1
    # スロークエリログの出力先
    slow_query_log_file=/var/log/mysql-slow.log
    # これより実行に時間がかかる SQL ステートメントをロギング(秒)
    long_query_time = 2
    # インデックスを使用しないクエリをロギング
    #log-queries-not-using-indexes
    # 管理ステートメントもロギング
    #log-slow-admin-statements
    
  • 空のログファイルを作成し、パーミッションを設定後、mysqldを再起動する。
    # touch /var/log/mysql-slow.log
    # chown mysql:mysql /var/log/mysql-slow.log
    # service mysqld restart
    
  • ログをクリアする場合は、
    # :> /var/log/mysql-slow.log
    

MySQLのクエリキャッシュ

クエリキャッシュの設定

my.cnf

[mysqld]
query_cache_size=64M
query_cache_type=2

query_cache_type には、以下のいずれかを指定できる。
0: (OFF) キャッシュを行わない、または キャッシュした結果の読み出しを行わない。
1: (ON) SELECT SQL_NO_CACHE で始まるステートメント以外のキャッシュ。
2: (DEMAND) SELECT SQL_CACHE で始まるステートメントだけのキャッシュ。

クエリキャッシュのステータスを確認

mysql> show status like 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        | 
| Qcache_free_memory      | 66674696 | 
| Qcache_hits             | 8        | 
| Qcache_inserts          | 41       | 
| Qcache_lowmem_prunes    | 0        | 
| Qcache_not_cached       | 1145     | 
| Qcache_queries_in_cache | 41       | 
| Qcache_total_blocks     | 88       | 
+-------------------------+----------+
8 rows in set (0.00 sec)

クエリキャッシュのデフラグメント

mysql> FLUSH QUERY CACHE;

クエリキャッシュからクエリ結果を削除

mysql> RESET QUERY CACHE;

MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.13 MySQL クエリ キャッシュ

Rails3のActionMailerでOpenSSL::SSL::SSLError (hostname was not match with the server certificate)

Rails3でメールを送信したところ、送信できなかった。
ActionMailerの設定は、
config/initializers/02_action_mailer.rb

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  :address        => "mail.example.com",
  :port           => "587",
  :domain         => "example.com",
  :user_name      => "username",
  :password       => "password",
  :authentication => :cram_md5
}

のようにしている。
同じ設定で、Rails2では送信できている。

原因

ActionMailer::Base.raise_delivery_errors = true

を追加して実行したところ、

OpenSSL::SSL::SSLError (hostname was not match with the server certificate)

となり、SSL証明書の検証で例外が発生しているらしいことが分かった。
また、メールサーバのログでも、

connect from xxxxx
setting up TLS connection from xxxxx
TLS connection established from xxxxx
lost connection after STARTTLS from xxxxx
disconnect from xxxxx

という状態だった。
このメールサーバはテスト用のpostfixで、
smtpd_tls_security_level = may
にしており、
smtpd_tls_cert_file、smtpd_tls_key_file には、自己署名証明書を設定していた。
Rails3では、STARTTLSがデフォルトで有効になっているためTLSで接続しようとするが、このメールサーバの証明書がテスト用の自己証明書だったので検証に失敗していたのが原因らしい。

解決方法

証明書を正当なものにすればよいと思われるが、テスト環境なのでとりあえず今は自己署名証明書を使いたい。
そのためには、ActionMailer::Base.smtp_settingsの設定で、STARTTLSを無効にするか証明書の検証を無効にする。

ActionMailer::Base.smtp_settings = {
  :address        => "mail.example.com",
  :port           => "587",
  :domain         => "example.com",
  :user_name      => "username",
  :password       => "password",
  :authentication => :cram_md5,
  :enable_starttls_auto => true,  # STARTTLSを無効にする場合はfalseにする
  :openssl_verify_mode => 'none'  # STARTTLSを有効にしつつ、不正な証明書もOKにしたい場合は、証明書の検証を無効にする
}

証明書の検証を無効にするのは本当はよくないけど、テスト環境等で自己署名証明書でもOKにしたい場合は、とりあえず上記のようにすれば、TLSでメールが送信できます。
OpenWebOps
email - Postfix & Rails 3.0 ActionMailer: lost connection after STARTTLS - Stack Overflow

MacのターミナルでのEmacsのメタキー

MacのターミナルでEmacsを使う場合に、デフォルトだとメタキーとしてエスケープキーしか使えないので不便だったが、ターミナルの環境設定→キーボードで、「メタキーとして option キーを使用」にチェックを入れると、optionキーをメタキーとして使用できた。
[mac][emacs] Terminal上でemacsのメタキーを使う方法 - goinger的日記