Akogare Blog

憧れのWeb系企業に転職したエンジニアのブログ

alpineベースのコンテナですぐにredpenを使えるようにする

redpen自然言語の校正ツールです。自分は英語や日本語用のlintみたいなものだと捉えています。 最近、文章を書くときにredpenを使うようになりました。 redpenで行われるのはルールベースの機械的なチェックです。 それでも意外とエラーが出たりします。エラーを修正することで ある程度は文章の品質が担保されるので個人的には気に入っています。

redpenを使うにはjavaや設定ファイルが必要なのです。 人におすすめする時に、これらの作業を1からさせることなく簡単に使える環境があればいいなと思いDockerコンテナ化してみました。

以下にDockerfileを公開しています。

github.com

Dockerfile

Dockerfileは下記の通りです。 Dockerイメージを軽量にしたかったのでalpineをベースにしました。

FROM alpine:3.6

# install java etc
RUN apk update
RUN apk --no-cache add tar wget openjdk8

# download redpen
RUN wget https://github.com/redpen-cc/redpen/releases/download/redpen-1.10.1/redpen-1.10.1.tar.gz
RUN tar xvf redpen-1.10.1.tar.gz
RUN mkdir -p /user/local/redpen
RUN mv redpen-distribution-1.10.1 /usr/local/redpen

# add redpen to PATH
ENV PATH="/usr/local/redpen/bin:${PATH}"

WORKDIR /usr/local/documents

# copy redpen configuration file
COPY redpen-conf.xml .

# set "redpen" command for entory point
ENTRYPOINT [ "redpen" ]
CMD [ "--help" ]

やっていることは以下の通りです。

  1. javaのインストール
  2. redpenのダウンロードと展開
  3. redpenをPATHに追加
  4. redpenの設定ファイルをコピー

redpen-conf.xmlについて

redpenの校正ルールを定義するXMLファイルです。 redpenはカレントディレクトリの"redpen-conf.xml"を実行時に読み取ります。 また、実行時に-cオプションで明示的に設定ファイルを指定することも可能です。 今回はRedPen のおすすめ設定 を参考にさせてもらいました。

使い方

# Dockerfileからimageをビルドする
$ docker build . -t redpen-alpine

# 校正対象のドキュメントがあるディレクトリをコンテナの/usr/local/documentsにマウントして実行する
$ docker container run -it --rm -v ~/path/to/host/documents:/usr/local/documents:ro redpen-alpine
 target_document.txt

redpenの実行時オプションについて

redpenは実行時のオプションでチェックするドキュメントのフォーマット や結果の出力フォーマットを指定することができます。

-f <対象ドキュメントのフォーマット(例:plain,wiki,markdonw)>

-r <出力結果のフォーマット(例:plain,json,xml)>

他にもあるので詳しくはredpenドキュメントをご覧ください。

最後に

実行時のdocker runコマンドが長くなってしまいました。 もう少しスマートなやり方を見つけたら更新します。

python3のvenvでプロジェクト毎にライブラリを管理する

venvでできること・できないこと

できる

プロジェクト毎にモジュールとそのバージョンを管理する

できない

プロジェクト毎にpython自体のバージョンを管理する

venvの使い方

venvによる仮想環境の作成

sample_project/venvに仮想環境を作成する例

$ mkdir sample_project
$ cd sample_project
$ python3 -m venv venv

venvの有効化

$ source venv/bin/activate
# 有効になると([仮想環境のディレクトリ名])が先頭に表示される
(venv) $

有効化したあとは通常通りpythonを使用できる。

venvの無効化

(venv) $ deactivate
$

.gitignoreの内容

venvを使用する場合、.gitignoreに以下の内容を指定する。

gitignore/VirtualEnv.gitignore at master · github/gitignore · GitHubgithub.com

  • 基本的にはpython3 -m venvにより生成されるファイルを指定する。
  • "[Bb]in"とかになっているのはOSによって再生されるフォルダの大文字/小文字が異なるためらしい。

ライブラリの管理

venvというよりかはpipの使い方になるが記載しておく。

pushする前

requirements.txt にライブラリの情報を出力する。 必ずvenvを有効にした状態で実行すること。

(venv) $ pip freeze > requirements.txt

requirements.txtのサンプル

colorama==0.4.1
selenium==3.141.0
urllib3==1.24.1

pullした後

venvの仮想環境がない場合は作成、有効化した後に実行する。

(venv) $ pip install -r requirements.txt

venvをなぜ使うのか

自分は以下の理由からだと考えている。

  • プロジェクトで使用するライブラリとバージョンを明確にする
  • プロジェクトが自分のマシン以外でも動作できるようにする

通常、pipでインストールしたライブラリは個々のプロジェクトに限定されない。同じマシン内であればどのプロジェクトからも利用できる。

しかし、その反対にプロジェクト毎に必要なライブラリがどれかわからなくなりがちである。結果、他のマシンで実行しようとした際に必要なライブラリのインストールが漏れて動かない。もしくは、本来必要ないライブラリをインストールしてしまうといったことが起きる。

更に、同一マシン上に複数プロジェクトがあり、同一異バージョンのライブラリを使用する場合もvenv等の仮想環境を使用しないと難しい。

環境

この記事は以下の環境で実施した内容をもとに記載しています。