GeekFactory

int128.hatenablog.com

How to upgrade to ownCloud 10

This will explain how to upgrade ownCloud on Docker Compose.

Pull a new image.

# docker-compose pull owncloud

Run migration.

# docker-compose exec --user www-data owncloud /bin/bash
$ php occ upgrade

If error occurred, remove /apps and extract new one from the archive owncloud-10.0.3.tar.bz2. Most apps have been changed since 10.

LDAP user and group backend

If you are using the LDAP user and group backend app, you have to reinstall it form the market.

If no file or folder is shown in the home, make sure that the users table is migrated.

# docker-compose exec --user www-data owncloud /bin/bash
$ php occ user:sync 'OCA\User_LDAP\User_Proxy'
The process control (PCNTL) extensions are required in case you want to interrupt long running commands - see http://php.net/manual/en/book.pcntl.php
If unknown users are found, what do you want to do with their accounts? (removing the account will also remove its data)
  [0] disable
  [1] remove
  [2] ask later
 > 2
Analyse unknown users ...
    3 [============================]

No unknown users have been detected.
Insert new and update existing users ...
 xx/xx [============================] 100%

WSLでIDEAを使う

WSL(Bash on Windows)でIDEA(IntelliJ)を使い始めて少し経ったので雑感をまとめてみます。

IDEAにはJDKなしとJDKありがあります。IDEAに同梱されているJDKはフォントレンダラーが改善されているため、JDKありを使った方がフォントが綺麗になります。これはmacOSと同じですね。

IDEAは適当なフォルダに展開して idea.sh を実行すれば動きます。私は下記のシェルでバックグラウンド実行しています。普通に起動すると、アプリケーションを実行した時にStopが効かない問題があるため、この記事に書かれているワークアラウンドを入れています。

#!/bin/bash -xe
cd $HOME/bin/idea-*/bin
(
trap - SIGINT
exec ./idea.sh
) &

Gitはデフォルトで問題なく動きます。Git for Windowsより軽いので快適です。改行コードに悩まされることもありません。

IDEAに同梱されているJDKはOpenJDKとは異なるため、アプリケーション開発はOpenJDKで進めるとよいでしょう。

f:id:int128:20171115144916p:plain

Browserの設定は explorer.exe を指定しましょう。URLをクリックしたらWindowsのデフォルトブラウザが起動するようになります。

f:id:int128:20171115143551p:plain

起動時に External file changes sync may be slow: File watcher gave up to operate という警告が出ます。内容の通り、IDEAの外でファイルを書き換えてもIDEAにすぐに反映されない問題があります。最近のWSLではinotifyがサポートされていますが、IDEAではまだ利用できないようです。

(11/18追記)IDEAに含まれる fsnotifier64 を下記のものに差し替えると、上記の警告が出なくなります。また、IDEAの外でファイルを書き換えるとすぐに反映されるようになります。

github.com

Springでリクエストとレスポンスのログを出力する

Spring MVCでリクエストとレスポンスのログを出力する方法を説明します。

リクエストログだけなら CommonsRequestLoggingFilter もしくは AbstractRequestLoggingFilter を使う方法が簡単です。詳しくは下記の記事で説明しています。

int128.hatenablog.com

一方で、レスポンスログを出力するには一工夫が必要です。通常、レスポンスボディはストリームに書き込まれてメモリから消えてしまうため、メモリに一時的に保持する必要があります。Springで用意されている ContentCachingResponseWrapper というクラスを使うと、レスポンスボディをバイト配列で取り出すことができます。

実装例

AbstractRequestLoggingFilter を参考にしてフィルタを実装してみました。

  • ContentCachingRequestWrapper でリクエストオブジェクトをラップする。
  • ContentCachingResponseWrapper でレスポンスオブジェクトをラップする。
  • 前処理で、リクエストオブジェクトからヘッダとボディを取り出してログに出力する。
  • 後処理で、レスポンスオブジェクトからヘッダとボディを取り出してログに出力する。

なお、後処理では必ず ContentCachingResponseWrapper#copyBodyToResponse() を実行する必要があります。そうしないとレスポンスボディがストリームに書き込まれないため、Tomcatの場合は待ち状態になってしまいます。Jettyでは insufficient content written というエラーが返されます。

Java 8 + Lombokで書くとこんな感じです。

このフィルタを適用するとレスポンスボディが一時的にメモリに保持されるため、メモリの消費量が大きくなります。また、大きいレスポンスを返す場合はパフォーマンスが悪化します。そのため、デバッグ用途に限定した方がよいでしょう。