技術メモのかけら

内容はもとより調べたことすら忘れてしまうので個人的なメモです。とにかく短く、結論だけ書いていきます。

readlineが7にバージョンアップされてgradleとpsqlが動かなくなった

何もした覚えがないのだが、ある日急にgradleとpsqlが動かなくなった。

$ gradle tasks
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/bash
  Reason: image not found
[1]    52259 abort      gradle tasks

$ psql
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/psql
  Reason: image not found
[1]    52489 abort      psql

どちらもlibreadline.6.dylib がないと言ってエラーを吐いている。

あまり記憶にないけど、Homebrewでreadlineを入れていたようで、現在は7.0.3が適用されているようだ。

$ brew info readline 
readline: stable 7.0.3 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/6.3.6 (46 files, 2MB)
  Poured from bottle on 2014-05-29 at 11:25:42
/usr/local/Cellar/readline/6.3.8 (46 files, 2MB)
  Poured from bottle on 2014-10-18 at 05:30:37
/usr/local/Cellar/readline/7.0.3 (46 files, 2MB)
  Poured from bottle on 2017-02-28 at 22:25:05
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.

macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.


For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include

6系のものに切り替えてみる

$ brew switch readline 6.3.8
Cleaning /usr/local/Cellar/readline/6.3.6
Cleaning /usr/local/Cellar/readline/6.3.8
Cleaning /usr/local/Cellar/readline/7.0.3
Opt link created for /usr/local/Cellar/readline/6.3.8

動いた!

$ psql --version
psql (PostgreSQL) 9.4.0

おそらく7系をインストールした何かが動かなくなるんだろうなと思いつつ、とりあえず良しとする。

RedmineでSVNの差分を見ようとすると「リポジトリに、エントリ/リビジョンが存在しません。」エラーになる

Passenger+ApacheRedmineを運用しているが、SVNのコミットの差分を見ようとすると「リポジトリに、エントリ/リビジョンが存在しません。」とエラーが表示されるようになった。
コミットメッセージなどは取得出来ているので、リビジョンが存在しないと言われても良く分からん状態なので調査してみた。

エラー「リポジトリに、エントリ/リビジョンが存在しません。」 — Redmine.JP

上記サイトにあるように、まずerror_logを見てみるとそれっぽいエラーメッセージが出力されていた。

App 32640 stderr: svn: Can't convert string from 'UTF-8' to native encoding:
App 32640 stderr: svn: Index: ?\233?\155?\187?\230?\176?\151?\230?\150?\153?\233?\135?\145.txt

更に調べてみると、正に下記サイトに書いてあるとおりファイル名が日本語だとうまく変換出来ていなかったようだ。

CentOSでApacheを日本語ロケール(ja_JP.utf8)で起動する | maeda.log

/etc/sysconfig/httpdHTTPD_LANG=ja_JP.utf8 を指定して事なきを得た。

Redmineのサーバー移設をした後に発生したので以前は設定されていたようだがノウハウが失われていたようだ。
せめてもう少しエラーメッセージが分かりやすいと良いのだが。

xargsコマンドで変数を使う

-i変数名 でパイプで渡された値を変数に格納して処理できる。
gitのタグ一覧を取得してまとめて処理する実行例はこんな感じ。

git branch -r | egrep --text "tags/" | cut -d / -f3|xargs -iVAR git tag svn/VAR svn/tags/VAR

grepでマッチした箇所をハイライトする

grep --color=auto yamada /etc/passwd

grepの--colorオプションを付けるとヒットした文字がハイライトされる。
どこがヒットしたか目で追うのはしんどいので大変便利です。
リダイレクトやパイプ使用時にはハイライトしないようにしてくれるので、基本 auto を指定すれば良いと思います。

export GREP_OPTIONS='--color=auto' 

環境変数で設定しておけば、毎度指定する必要がなくなります。
気に入ったら.bashrcにでも仕込んでおきましょう。

シェルの$括弧

  • $(コマンド)
    バッククォートで括ったのと同様にコマンドを実行できる。
    ネストできたり開始終了が分かりやすいので、こっちを使ったほうが良い

  • $((演算))
    exprでやったような演算ができる。$(expr 1 + 1) とやるよりスマート