suer のブログ

メモメモ. はてダ → http://d.hatena.ne.jp/suer/

systemctl enable コマンドで Failed to execute operation: Invalid argument が出た

環境

CentOS 7.3

現象

# systemctl enable サービス名
Failed to execute operation: Invalid argument

原因

systemctl enable コマンドで /etc/systemd/system/multi-user.target.wants/サービス名.serviceシンボリックリンクが張られるが、間違えてファイルの実体をコピーしてしまっていた。

対処

/etc/systemd/system/multi-user.target.wants/サービス名.service を削除してあらためて systemctl enable すればよい。
もちろん、このファイルを編集してしまっている場合は、元ファイルに適用してから操作する。

ポートの疎通確認のために代わりのプロセスを立ち上げる

CentOS 6 から 7 に移行するために、firewalld の練習をしている。
特定のポートを開ける設定を行い、疎通確認をしたいので CentOS 7 に大抵入っている Pyhon を使って確認用のプロセスを立ち上げる。

環境

CentOS 7.3
Python 2.7.5

立ち上げる

Python 2 系なら SimpleHTTPServer を使用する。

# python -m SimpleHTTPServer 5432

Rails アプリの wercker docker 対応で PostgreSQL の対応

Wercker からマイグレーションせよというメールが来たので対応してみた - mallowlabsの備忘録 を参考に wercker のマイグレーションを実施した。
こちらの記事では MongoDB の例だったので、PostgreSQL の場合はどうするのかと調べた。

結論としては

box: ruby:2.3
services:
  - id: postgres
    env:
      POSTGRES_PASSWORD: ourlittlesecret
      POSTGRES_USER: myuser
build:
    steps:
        - bundle-install
        - rails-database-yml:
            service: postgresql-docker
        - script:
            name: echo ruby information
            code: |
                echo "ruby version $(ruby --version) running"
                echo "from location $(which ruby)"
                echo -p "gem list: $(gem list)"
        - script:
            name: db:migrate
            code: RAILS_ENV=test bundle exec rake db:migrate
        - script:
            name: rspec
            code: RAILS_ENV=test bundle exec rake spec
deploy:
  steps:
    - heroku-deploy:
        key: $HEROKU_KEY
        user: $HEROKU_USER
        app-name: $HEROKU_APP_NAME

のような感じで。

ポイントは

services:
  - id: postgres

のように PostgreSQL のコンテナを指定し、rails-database-yml で postgresql-docker を指定する。

        - rails-database-yml:
            service: postgresql-docker

すると http://devcenter.wercker.com/docs/services/postgresql に記載されている環境変数を使う database.yml を吐いて、正常に接続できるようになる。

rails-database-yml のタスクは
step-rails-database-yml/run.sh at master · wercker/step-rails-database-yml · GitHub

postgresql-docker を指定することに気付かずにハマった。

Mac OS X 環境でコマンドラインで Exif から Orientation を消す

画像ファイルで Exif はあるけど Orientation が無い、という特殊なテストデータが必要になったので。

環境

Homebrew 0.9.5

exiftool のインストール

$ brew install exiftool

Orientaiton を消す

$ exiftool -Orientation= XXX.jpg

サブディレクトリ運用の複数の Redmine で別の Redmine にアクセスすると勝手にログアウトするのを防ぐ

確認したバージョン
問題

Redmine は _redmine_session という Cookie でログイン状態が管理されていてる。

Redmine では、何もしないとパスが "/" で登録されるので、実際に異なるパスの Cookie データでも、同じとみなされてしまう。

なので、別の Redmine にアクセスすると、同じドメイン、パスの同じ Cookie キーなのに、値が違うので、ログインのしなおしになる。

設定方針

config/application.rb の以下の部分にパスを指定すればいいが、このファイルは Git の管理下なのであまり修正しないほうがいい。

    config.session_store :cookie_store, :key => '_redmine_session'

Redmine では、 config/application.rb に追記修正したい場合に、config/additional_environment.rb というファイルを用意している。 このファイルに書かれたコードは、Rails::Application のインスタンス化で eval されるので、 config/application.rb に書いたのと同じように動く。

解決

ということで、それぞれの Redmine の config/additional_environment.rb に以下のように書けばうまく動く。

config.session_store :cookie_store, :key => '_redmine_session', :path => '/XXXX'

XXXX はそれぞれの Redmine で異なる値を入れればよいが、その Redmine が配備されているサブディレクトリパスとかにすればいいと思う。

タブ文字で grep する

test(タブ文字) みたいなのを grep したい場合。

ターミナル
$ grep "test(タブ文字)" /path/to/file

のように入力したいが、普通に入力するとシェルがタブ文字を奪う。 bash, zsh の場合は ctrl-v を入力してからタブを打つと入力される。

ただし、これはメモなどからコピペするときに苦労する。

[:space:] の利用

空白文字もマッチしてしまうけど、それでもよければ [[:space:]] でタブ文字もマッチする。 これならメモなどからコピペできる。

$ grep "test[[:space:]]" /path/to/file
$'\t'
$ grep "test$'\t'" /path/to/file

はうまくマッチしなかった。

$ grep test$'\t' /path/to/file

であればマッチする。

どんなふうに展開されるか追っていけば使えるかもしれないが、よくわかっていない。

Java の .class ファイルを一括で逆コンパイルする

環境
jad のインストール

Mac OS X で Homebrew の場合

$ brew install homebrew/binary/jad
コンパイル

classes 以下に展開されているとすると、以下のコマンドで src ディレクトリ以下に .java ファイルとして一括で逆コンパイルできる。

$ jad -o -r -sjava -dsrc 'classes/**/*.class'