Railsのログをlogrotateする

Railsproduction.log などのログは、際限なく容量が増えるため、古いものから削除するなどの必要があります。これをログのローテーションと言います。

Linuxではlogrotateを使うことが一般的ですが、ローテーション後に、アプリケーションサーバーが新たにログを書き出せなくなる問題があります。これは、logrotateが新しいログファイルにした際に、アプリケーションサーバーが新しいログファイルの検知に失敗するために発生します。

この問題は、次のようにlogrotateのオプションに copytruncate を追加することで解決できます。このオプションは、新たにログファイルを作成するのではなく、ログをコピーして古いログをファイルの中身を空にするものです。

$ cat /etc/logrotate.d/my_rails_app
/var/www/my_rails_app/log/*.log {
  weekly
  missingok
  rotate 280
  compress
  delaycompress
  create 0664 ec2-user ec2-user 
  copytruncate
}

参考

copytruncate – Copy the log file and then empties it. This makes sure that the log file Rails is writing to always exists so you won’t get problems because the file does not actually change. If you don’t use this, you would need to restart your Rails application each time.

gorails.com

補足

ログのローテーション後に、pumaというアプリケーションサーバーに次のようなシグナルを送り、ログのリオープンを指示したが、うまく行きませんでした。

$ kill -HUP $puma_pid 

tech.basicinc.jp

MySQLの「0000-00-00 00:00:00」のデータを更新させたい。

MySQLのDATE/DATETIME型には、利用しないほうが良い「0000-00-00 00:00:00」という値がある。 詳細は他の方に譲るとして、今回はこのあたりをUPDATEしたいと思う。

mysql> UPDATE buildings set created_at = '2004-01-29 00:00:00' where created_at = '0000-00-00 00:00:00';
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created_at' at row 1

エラー出て更新できない。

mysql> select id from buildings where created_at = '0000-00-00 00:00:00';

created_atが '0000-00-00 00:00:00'になっているデータがヒットする。

mysql> UPDATE buildings set created_at = '2004-01-29 00:00:00' where id in (select id from buildings where created_at = '0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created_at' at row 1

サブクエリでヒットさせようとしたけど失敗。

UPDATE buildings set created_at = '2004-01-29 00:00:00' where CAST(created_at AS CHAR(20)) = '0000-00-00 00:00:00';

StackOverFlowで検索したらこれならできるらしい。めんどくさ。

マージ済みのリモートブランチを一括削除

長年Gitを利用していると、消し忘れたブランチが増えてくるため、一括削除するためのコマンドを紹介する。

マージ済みのリモートブランチを一括削除する

$ git branch -r --merged マージ先ブランチ名 |  egrep -v "(^\*|除外するブランチ名)"  | sed -e 's/origin\///g' | xargs -i git push -d origin {} # 
$ git branch -r --merged origin/develop |  egrep -v "(^\*|master|staging|develop)"  | sed -e 's/origin\///g' | xargs -i git push -d origin {} # 具体例

リモートで消されたブランチをローカルでも削除する

$ git fetch --prune

UbuntuでMacのopenみたいなコマンドを利用する

Macで、open . とかでよくFinderを開いていた。xdg-open コマンドが該当するようだ。

.bash_profile に次のように記載する。

alias open='xdg-open'

URLを指定すればブラウザも開けるのかい。

open http://google.co.jp

Amazonで電子出版した

親父(元教員)が自分の書いた論文を電子出版したいと言ってきたので、父親が作成したWordファイルを基に EPUB に変換して電子出版した。 EPUB の実態はHTML+CSSだったので、簡単に変換することが出来た。

大きな流れ

今回の作業の肝は、文章を構造化することである。構造化とは、文書の要素に対して、引用や見出しのレベルを指定するものである。こうすることで、コンピューターが処理しやすくなる。例えば、引用の箇所は、30ポイント左の空白を一律で空けるといったようなことが簡単に出来る。また、見出しを基に自動的に目次を生成することが可能になる。

親父から送られてきたWordファイルは、次のようなものであった。

  • 引用だけスタイルが指定してある。見出しは強調しているだけで、自身でナンバリングしている。Wordの場合、見出しに章の番号を自動で振るのは複雑なのでこうなるのもよくわかる。
  • 傍点・圏点、ルビを利用している
  • セルを結合している複雑な表がある

今回の作業は、Pandocを利用して次のように変換を行った。Markdownに変換後、構造化を行った。EPUBの編集の際には、GitHub上で親父と修正作業を行った。

  1. Wordファイル(.docx)
  2. Markdown
  3. EPUB

Google DocumentがEPUB形式の書き出しが出来ると聞き、Wordファイルを取り込んでみたが、ルビや圏点・傍点に対応していないことが判明したために利用を見送った。Google Documentが利用できると、親父と簡単に共同作業ができるため、ありがたかったのだが。

WordファイルからMarkdownへの変換

pandoc を利用し、次のコマンドで変換を行った。

$ pandoc input_file.docx -t markdown-raw_html-native_divs-native_spans -o output_file.md

Markdownの感想

WordからMarkdownへ変換を行っているが、本来は不要な工程だ。 docxファイルから変換できる数少ないフォーマットて、電子書籍に関する巷のノウハウが一番存在するのがMarkdownだったため、消極的な理由から利用していた。次に述べるように、日本語の電子書籍に用いるには、ベターだがベストではないソリューションであると感じた。

Markdownの利点

  • テキストファイルなのでGitを用いた構成管理が可能
  • 対応しているエディタが多く、編集作業が行いやすい。プレビューを見ながらの編集が行えたり、文法のチェックが簡単に行える。
  • 文法がシンプルなため、習得が用意

Markdownの欠点

  • セルの結合など複雑な表に対応できない。ただし、HTMLで記載すれば対応できるので、問題なし。
  • ルビ、圏点・傍点などが対応していない。ただし、HTMLで記載すれば対応できるので、問題なし。
  • 強調するのに分かち書きが必須ではないようだが、利用していたMarkdownエディタだと認識してくれない。

Markdown から EPUBの変換

pandocでEPUBファイルに変換後、そのままではGitで管理できないため、構成管理できるようにした。

pandocのコマンドは、メモし忘れた。

構成管理できるように、.epub ファイルの拡張子を .zip に変更し、解凍し、Gitに追加した。ルートファイルは次のようになる。

f:id:Artisan:20200505092137p:plain
解凍したEPUBファイル

EPUBファイルの編集

単なるHTML+CSSファイルのため、お好きなエディタで編集すればよい。 親父とは、GitHub上でやりとりをした。ITエンジニアではないが、文書の修正はやってもらえた。

EPUBファイルのビルド

Gitに格納されているのは、解凍された状態なので、圧縮して .epub の拡張子のファイルを生成する必要がある。

次のようなMakefileを作成し、適宜makeコマンドを実行した。

all:
    rm main.epub;cd epub;zip -X0 ../main.epub mimetype;zip -9 -r ../main.epub META-INF OEBPS
$ make

EPUBにおける日本語固有の処理

ルビ

漢字等のよみを表示する。

例:規範ノモ秩序

<ruby>規範<rt>ノモ</rt>秩序<rt></rt></ruby>

圏点・傍点

文字の上に「・」が表示されるもの。強調を意味する。

あらゆる創造を<span class="emph-dot">になう</span>
span.emph-dot {
  text-emphasis-style: dot;
  -epub-text-emphasis-style: dot;
  -webkit-text-emphasis-style : dot;
}

構文チェック

epubcheckを利用した。

github.com

Amazonへの登録

省略

まとめ

  • EPUBはHTML+CSSのスキルがあれば容易
  • Wordが基ファイルの場合には、Pandocを利用し、変換を行う必要がある