ImageMagickでOrientationを操作して画像の向きを自分の望み通りにする

自分の思ったような向きにならないことがあったのでメモ。

まずはImageMagickを使って -strip でExif削除するケースの場合。 削除後に見ると表示して欲しい方向とは違う感じで表示されてしまった。

$
$ identify -verbose hoge.jpg | grep Orientation
  Orientation: RightTop
    exif:Orientation: 6
$
$ convert hoge.jpg -strip hoge_after.jpg
$
$ identify -verbose hoge_after.jpg | grep Orientation
  Orientation: Undefined
$

次に -auto-orient を試してみた。 これが自分の望む動作になった。

$
$ mogrify -auto-orient hoge.jpg
$
$ identify -verbose hoge.jpg | grep Orientation
  Orientation: TopLeft
    exif:Orientation: 1
$

リサイズで -thumbnail を使っているとexif情報は削除されるようだ。 実行してみたところ、生成された画像はやはり自分の希望する方向ではなかった。

$
$ convert hoge.jpg -thumbnail 640x640 hoge_thumb.jpg
$
$ identify -verbose hoge_thumb.jpg | grep Orientation
  Orientation: Undefined
$

リサイズで自分の欲しい向きにするには -auto-orient -resize の2つを使うのがいいみたい。 これで自分のやりたいことが出来た。

$
$ convert -auto-orient -resize 640x640 hoge.jpg hoge_resize.jpg
$
$ identify -verbose hoge_resize.jpg | grep Orientation
  Orientation: TopLeft
    exif:Orientation: 1
$

PHPでSFTPを使う

個人的にあまりやりたくないですが、こういうファイルサーバーにアクセスして何かするみたいなのが必要な時もあるということで。
まずSFTPはSSHが必要です。
https://ja.wikipedia.org/wiki/SSH_File_Transfer_Protocol

PHPの場合、拡張モジュールが必要なので、インストールされていない場合はインストールします。
http://php.net/manual/ja/book.ssh2.php
インストール出来ればあとはコーディングです。 下のサンプルでなんとなく雰囲気は分かるかなと思います。

$connection = ssh2_connect('sftp-server', 22);

if (!$connection) {
    echo('接続エラー');
}
if (ssh2_auth_password($connection, 'user', 'pass')) {
    $sftp = ssh2_sftp($connection);
} else {
    echo('認証エラー');
}

// ファイル名を取得して出力してみる
$handle = opendir("ssh2.sftp://{$sftp}/root");
while (false != ($entry = readdir($handle))){
    echo($entry . PHP_EOL);
}

fishでbashの$(command)をやる

最近になってfishを使い始めた。
そんな中aws-cliとか使っていてAWSに言われたまま動かなかったコマンドがこちら

$(aws ecr get-login --no-include-email --region ap-northeast-1)

bashzshではこれという事で、何も考えずにコピペしたのだが動かず。 fishではevalなんですね。

eval (aws ecr get-login --no-include-email --region ap-northeast-1)

で実行可能。

Gmailのサーバーを使ってメールを送る為にSMTP Relayで設定したが送れない時

具体的に言うと、/var/log/maillog に以下のような警告とエラーが出てる時

warning: SASL authentication failure: No worthy mechs found
SASL authentication failed; cannot authenticate to server smtp.gmail.com[108.177.125.109]: no mechanism available

他の設定は問題ないのにこれが出て送れない場合、

yum install cyrus-sasl-plain

で送れるようになることが多いはず

HerokuでClearDBを使ってMySQLを使っている時、MySQLのデータを見たりする

最近「ちょっとしたものはHerokuが一番楽でお金もかからなくて良くないか?」と思い、Herokuを使っています。
本当に楽なのがいいですね。
で、PHPの時はPostgreSQLが普通らしいのですが、今までMySQLだったのでMySQLを使ってみた。
その後、「はて、バックアップやら直接見る時はどうするんだろう」と思ったのです。

結論から言うと、MySQLのクライアントから普通にコマンドラインで接続できるようで。

 mysql -h {host} {db} -u {user} -p

設定情報はいつもの通り、 heroku configでみれます。
なんか直接繋げられちゃうのは少し気持ち悪いですね。
PostgreSQLにしようかなぁ…

PyCharm(IntelliJ)でMarkdownの時だけ保存時の自動空白削除を無効にする

地味なのだけど、README.mdとか書いていてMarkdownを保存した時に勝手に空白が削除され、改行が反映されない……
というのが面倒だった。

解決策

  1. PluginでEditorConfigが有効にされている状態で、プロジェクトルートに .editorconfig というファイルを作成
  2. その中に以下の設定を追加
[*.{md,markdown}]
trim_trailing_whitespace = false

これで無事にそのまま保存されるように
これは良くある話だと思うので、デフォルトでやって欲しい感じしますね。。。

AWS DynamoDBのTTLは意外とアバウトみたい

TTL = Time To Live
pingとかのTTLと同じで、いきている時間。
これを設定したところにUTCで数値を入れると、その時刻になった時に自動的に消える。
なので一時的なデータに最適…なのだが、正確にTTLの設定時刻に消えるものではないみたいだ……
試してみたところ、その時刻になっても即座には消えず、割と時間差がある。
とは言え、流石に1時間単位とかで遅れることはなさそうだが、10分くらいは遅れても普通ぽい。
厳密な時間管理はしない一時的なものにした方が良さそうですね。