ARCHIVESDRIVE HB

オイラはホームベーカリー!

メールを実送信したくないが送信はされて欲しいし内容は確認したいお気持ちを delivery_method に表明する

Railsconfig.action_mailer.delivery_method で、:sendmail なり指定すればサッとメール送信できるので便利で良いですね。 とはいえ、環境によっては「メールを送信したくない!」というパターンがあるので。 しかし単純に送信部分をコメントアウトなりしちゃうと、サインアップ処理の最後に爆発しちゃうこともあるのでどうしたもんか。

そんなときは、 :file を利用しましょう。

続きを読む

RDS から mysqldump するときのお作法

GTID とかついてきて、そのまま他の環境に持ち込もうとするとうまく行かず。 「イラァ」としないためのメモ。

mysqldump -u ${ユーザ名} -p -h ${エンドポイント} --quick --single-transaction --skip-triggers --set-gtid-purged=OFF ${DB名} > ${ファイル名}

これでよい。 mysql -u ${USER} -p -h ${HOST} < ダンプファイル.sql とかでスルっと戻せるようになる。

Apache 利用時に /rest/ が動作しない

ColdFusion には REST API を実装する機能が用意されているのだけれど、本番用プロファイルを選んだら動作しなかったので。

ロケ地: CentOS7 64bit

こうする

ColdFusion をデフォルトの /opt/coldfusion2016/ にインストールした場合は、 mod_jk.confJkMountFile "/opt/coldfusion2016/config/wsconfig/1/uriworkermap.properties" を追加する。

mod_jk.conf

こんな感じにし、変更後は systemctl restart httpd しておく。

# Load mod_jk module
LoadModule    jk_module  "/opt/coldfusion2016/config/wsconfig/1/mod_jk.so"
# Where to find workers.properties
JkWorkersFile "/opt/coldfusion2016/config/wsconfig/1/workers.properties"
JkMountFile "/opt/coldfusion2016/config/wsconfig/1/uriworkermap.properties"
# Where to put jk logs
JkLogFile "/opt/coldfusion2016/config/wsconfig/1/mod_jk.log"

コーディングしてる人の手元では動いていた罠

開発している人の環境は、いわゆる 開発用プロファイル で、 Apache をWebサーバにせず、 port 8500 でアプリケーションサーバとして Tomcat が起動していた。 そのため各種機能が動いていた模様。

うーん、 ColdFusion 難しない?

helpx.adobe.com

カスペルスキーアンチウィルスを入れた時、証明書をスキャンされるのを防ぐ

なにがしたいかって、証明書スキャンして交換されると、本来の証明書がブラウザから確認できなくておつらみ。

有効だとどうなる

FirefoxAmazon の証明書を見るとこうなっている。 証明局が AO Kaspersky Lab に変わっている。

f:id:donbulinux:20181227205827p:plain

こうする

環境設定 から、 プロテクション全般ネット決済保護、 Web トラッキング防止、および保護者による管理の使用時には安全な接続を確認する ( HTTPS ) のチェックを外す。

f:id:donbulinux:20181227205910p:plain

どう変わる

本来の証明書に戻る、この場合 AmazonSSL 証明書も元の発行者である DigiCert となっている。

f:id:donbulinux:20181227210145p:plain

Mojave に Python 入れようとして zlib がないぞって怒られた

産業で

  • xcode CLI tools をインストールする
  • sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target / する
  • brew install readline xz する

どうして…どうして…どうして…

pyenv install 2.7.15 したら怒られた。

ERROR: The Python zlib extension was not compiled. Missing the zlib?

Mojave 以降は CLI インストールするだけではライブラリが用意されなくなったものがあるらしい。 ということで以下のコマンドを利用して追加でインストールする。

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

github.com

これでよい。

python 3.x に移行しないの?

ブーメランだからヤメロォ!

whenever で cron を設定すると bundle: command not found

産業で

whenever 実行するユーザの 環境変数 PATH/usr/local/bin を追加しろ

なんでこうなる

whenever を設定すると、登録される cron はだいたいの場合において、以下のようなものになると思われる。

0 0 * * * /bin/bash -l -c 'cd ${RAILS_ROOT} && RAILS_ENV=${環境名} bundle exec rake ${タスク名} --silent >> log/crontab.log 2>&1'

ここで /bin/bash -l -c を見てみましょう。 AmazonLinux2 の man bash ではこう書かれています。

  • -l
    • Make bash act as if it had been invoked as a login shell (see INVOCATION below).
    • ログインシェル (後述の 起動 セクションを参照) として起動されたかのように bash を動作させます。
  • -c string
    • If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
    • -c オプションが指定されると、コマンドが string から読み込まれます。 string の後に引き数があれば、これらは 位置パラメータ (positional parameter: $0 から始まるパラメータ) に代入されます。

和訳はこちらから。 Man page of BASH

つまり、cron 起動時に、ユーザログインした状態(環境変数などを)を再現して、引数に指定されたコマンドを実行する、といったテイストですね。何もしないと cron のジョブ実行時の環境変数やらはお寒いので、( -l は余計なものも読み込むからやめろ!と言われますが ) 解決するアプローチとしては良いと、個人的には思っております。

で、何が問題かというと、上記の状態で cron が動作すると、 log.crontab.log にこのように記録されます。

/bin/bash: bundle: command not found

なして!

なぜコマンドがないのか

ここでコマンドの有無を、 cron を設定した&実行を期待されるユーザ ec2-user で確認しましょう。

$ which bundle
/usr/local/bin/bundle
$ whereis bundle
bundle: /usr/local/bin/bundle

ありますねえ……? ログインシェルのように起動して振る舞うなら、このコマンドを見失うのはおかしいですね。 では、実際に cron での動作を確認してみましょう。

0 0 * * * /bin/bash -lx -c 'which bundle' > /tmp/result.txt

ハイ、見事に空ですね。 コマンドは見当たりませんでした、ナンデ! という訳でこういう時は環境変数 PATH ですね、上記と同じようにそれぞれ確認してみましょう。

PATH の中身を確認する

$ echo $PATH
/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/bin
0 0 * * * /bin/bash -lx -c 'env $PATH'

→結果
+ PATH=/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin

/usr/local/bin おらんなった

おしりにいたはずの /usr/local/bin おらんなった、なんじゃこれ。

どうしていないのか

どうやら bash のバグかなんからしいです。デフォルトの PATH として、 /usr/local/binハードコートされているらしいのですが、どこかでポロっとおっことしているようで。 なので対策として、 sshd_configssh でログインしてきたときに、 PATH に自動的に付与しているようです。

serverfault.com

これずっと治ってないって外人兄貴達が言ってるんだけど実際どうなんじゃろ?

結局どうすればいいのか

  • cron の先頭に PATH を記載して、実行時に環境変数を増やす
  • bash -l でログインシェル起動っぽく振る舞うので、そもそも .bash_profile なりの環境変数 PATH に /usr/local/bin を追加してしまう
    • /usr/bin はベンダの動作確認したコマンドで、それで足りなかったりオーバーライドしたい場合、 /usr/local/bin を使う、というふうに僕は聞いたんだけど、そうなら先頭に追加したほうがよさそうすねこれ

whenever を使う場合であれば、管理する箇所が増えるのだるいので .bash_profile なりの環境変数 PATH に追加するのが良いと思います。 ただその場合、以下のように sshd_config の親切心と合わせてちょっと PATH が汚くなるので、それはご愛嬌ってことで。

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/bin

Mojave に引っ越ししたけどフォントがきたない

りんご「Retina ディスプレイならきれいだから!」

うるせえ!

このようにすると、 以前の macOS みたいなフォントレンダリングに戻る

海外コメント兄貴すごい、どうやって見つけてくるんだこんなオプション。

github.com

 手順

  1. ターミナルを起動する
  2. defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO と入力する
  3. ログアウトもしくは再起動する
  4. やったぜ。

ただこれアプリケーションのフォントレンダリングだけみたいで、 macOS のメニューバーのフォントレンダリングは改善しないもよう。

f:id:donbulinux:20181206192343p:plain
firefox のメニューバー

f:id:donbulinux:20181206192504p:plain
レンダリング変更した VisualStudioCode のステータスバー

こんだけ改善すればいいか、変更できる前はフォントがボケててめっちゃ目が痛かったし。