2017年5月23日火曜日

vimでファイルを開いた状態でdiffを見る

どうも俺です。

vimで2つのファイルの差分を見るのは、
$ vimdiff fileA fileB

ですが、
vimでとあるファイルを開いた状態のままdiffを見る方法について。

(1)まずfileAを開く
$ vim fileA

(2)そこから分割して別ファイルのfileBを開く
:vsp fileB (または:sp fileB)

(3)その状態で以下のvimコマンドを叩く
:windo diffthis


これでvimdiffしたのと同じ状態になります。


以上でぇぇぇぇす。

2017年5月1日月曜日

Macでgem installしたら "Operation not permitted" エラー

どうも、俺です。

 Mac(Sierra)でターミナルから
$ sudo gem install XXXX

とコマンドを打つと
Password:
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/XXXX
というエラーが出る場合の対処法。

以下のようにすればOK。
$ sudo gem install -n /usr/local/bin XXXX
これは、インストールディレクトリを
/usr/bin
から
/usr/local/bin
へ変更してインストールを行います。


MacのrootlessというSystem Integrity Protection(rootless)という機能があり、
/System
/bin
/usr
/sbin
フォルダ以下にファイルを作成できないという仕様のためです。

他にもrootlessを無効にする方法もありますが、セキュリティ的に望ましくはないので割愛します。


以上でぇぇぇぇぇす。

2017年3月13日月曜日

php: error while loading shared libraries: libpq.so.5: cannot open shared object fileが出る

どうも俺です。

構築したばかりのサーバーで
$ php -v
と打ってphpのバージョンを確認しようとしたら、

php: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
というエラーが出ちゃいました。

エラー内容のとおり、
何かしらの共有ライブラリ(今回はlibpq.so.5)が読み込めないというエラーです。

ちなみにrootになって同じコマンドを打つと

# php -v
PHP 5.6.24 (cli) (built: Mar  2 2017 15:32:45) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
と問題なく実行されます。
つまり、今回のエラーは何かしらのPermissionが関係してるだろうと予想つきました。

こういう場合は共有ライブラリの依存関係を確認してみます。

$ ldd /usr/local/bin/php
        linux-vdso.so.1 =>  (0x00007ffda23d7000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f2982411000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f29821fa000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2981fe0000)
        libpq.so.5 => not found
        librt.so.1 => /lib64/librt.so.1 (0x00007f2981dd7000)
        libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f2981b6e000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f298186c000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2981667000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f298144e000)
        libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f29810e4000)

注目すべきは、libpq.so.5 => not found となっているところです。


今度はrootになって確認してみます。

# ldd /usr/local/bin/php
        linux-vdso.so.1 =>  (0x00007ffce4d60000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f0d05ff1000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f0d05dda000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f0d05bc0000)
        libpq.so.5 => /usr/local/pgsql/lib/libpq.so.5 (0x00007f0d05997000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f0d0578e000)
        libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f0d05525000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f0d05223000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f0d0501e000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f0d04e05000)

今度は libpq.so.5 => /usr/local/pgsql/lib/libpq.so.5 と表示されました。

ということで/usr/local/pgsqlディレクトリを確認してみます。


$ ls -l /usr/local
drwxr-xr-x   7 root     root       62  3月  2 15:44 bin
drwxr-xr-x.  2 root     root       22  7月 29  2016 etc
drwxr-xr-x.  2 root     root        6  8月 12  2015 games
drwxr-xr-x.  3 root     root       16  7月 29  2016 include
drwxr-xr-x.  3 root     root       30 12月  6 15:26 lib
drwxr-xr-x.  2 root     root        6  8月 12  2015 lib64
drwxr-xr-x.  2 root     root        6  8月 12  2015 libexec
drwx------   6 postgres postgres   52  3月  2 14:41 pgsql
drwxr-xr-x   3 root     root       16  3月  2 15:33 sbin
予想通りpgsqlユーザーのみ読み書きできる状態になってしまっていました。

適切に権限を追加して完了。




以上でぇぇぇぇす。

2017年3月1日水曜日

公開鍵認証を使い、sshで2段階ログイン(多段ログインもできちゃう)

どうも、俺です。

今日は、
~/.ssh/config
を使って、2段階先のサーバーへsshログインする方法をメモ。

<クライアント> → <サーバーA(192.168.0.2)> → <サーバーB(192.168.0.3)>
のように接続する際に

$ ssh サーバーB
と打てばサーバーBへsshログインできます。

(1) .ssh/configを編集


$ vim ~/.ssh/config

Host <サーバーA>
  HostName 192.168.0.2
  User ユーザー名
  Port 22
  IdentifyFile ~/.ssh/serverA_id_rsa

Host <サーバーB>
  HostName 192.168.0.3
  User ユーザー名
  Port 22
  ProxyCommand ssh -W %h:%p <サーバーA>
  IdentifyFile ~/.ssh/serverB_id_rsa

※クライアント側のPCにはサーバーAとサーバーBの認証鍵
~/.ssh/serverA_id_rsa
~/.ssh/serverB_id_rsa
があることが前提です。

(2) ログインする

$ ssh サーバーB

複数先のサーバーへログインする場合は、
上記の.ssh/config内に踏み台にするサーバーをドンドン追記していけばOKです。


以上でぇぇぇえぇぇす。

2017年2月20日月曜日

LumenでPHPのerror_reporting(エラーレベル)を設定する

どうも、俺です。

Lumenはデフォルトで全てのエラーが出力されます。
本番環境では出力されるエラー内容を設定したいのですが、その場合は、

$ vim /PATH/TO/vendor/laravel/lumen-framework/src/Concerns/RegistersExceptionHandlers.php
を開き、


    protected function registerErrorHandling()
    {   
        error_reporting(-1);

        set_error_handler(function ($level, $message, $file = '', $line = 0) {
            if (error_reporting() & $level) {
                throw new ErrorException($message, 0, $level, $file, $line);
            }   
        }); 

        set_exception_handler(function ($e) {
            $this->handleUncaughtException($e);
        }); 

        register_shutdown_function(function () {
            $this->handleShutdown();
        }); 
    }   
にある、error_reporting(-1)を変更します。

本番の場合は「何も出力しない or 重大なエラーだけ出力」、で良いと思うので、

  // 何も表示しない
  error_reporting(0);

  // 重大な実行時エラーを出力
  error_reporting(E_ERROR);

になります。


以上でぇぇぇぇぇぇす!

amazon