Travis CIのmatrixでtoxを実行する

Djangoフレームワークに依存するPythonのモジュールを作っていると、複数のPythonバージョンと複数のDjangoバージョンでテストコードを実行する必要があります。

手元で実行する場合はtoxを使うのですが、CIツールでもテストを実行したいです。

Welcome to the tox automation project — tox 2.7.0 documentation

GitHubで公開しているプロジェクトの場合、Travis CIを使うのが簡単でした。

Travis CI - Test and Deploy Your Code with Confidence

Travis CIは、複数の実行環境で並列してテストを実行し、テスト結果を分けて表示してくれます。

設定例

toxはTOXENVで実行する環境を指定できるので、.travis.ymlのmatrixでこれを指定します。

Pythonのバージョンを変えつつ環境変数を指定する設定の書き方がわかりづらくて試行錯誤した結果、次のように落ち着きました。

.travis.yml:

sudo: false
language: python
matrix:
  include:
    - python: '2.7'
      env: TOXENV=py27-dj18
    - python: '2.7'
      env: TOXENV=py27-dj19
    - python: '2.7'
      env: TOXENV=py27-dj110
    - python: '2.7'
      env: TOXENV=py27-dj111
    - python: '3.4'
      env: TOXENV=py34-dj18
    - python: '3.4'
      env: TOXENV=py34-dj19
    - python: '3.4'
      env: TOXENV=py34-dj110
    - python: '3.4'
      env: TOXENV=py34-dj111
    - python: '3.5'
      env: TOXENV=py35-dj19
    - python: '3.5'
      env: TOXENV=py35-dj110
    - python: '3.5'
      env: TOXENV=py35-dj111
    - python: '3.6'
      env: TOXENV=py36-dj110
    - python: '3.6'
      env: TOXENV=py36-dj111
    - python: '3.6'
      env: TOXENV=flake8
    - python: '3.6'
      env: TOXENV=coverage
script:
  - tox
install:
  - pip install tox

tox.ini:

[tox]
envlist =
  py27-dj18,
  py27-dj19,
  py27-dj110,
  py27-dj111,
  py34-dj18,
  py34-dj19,
  py34-dj110,
  py34-dj111,
  py35-dj19,
  py35-dj110,
  py35-dj111,
  py36-dj110,
  py36-dj111,
  coverage,
  flake8

[testenv]
commands = nosetests
deps =
  pyftpdlib
  nose

[testenv:py27-dj18]
basepython = python2.7
deps =
  django>=1.8,<1.9
  {[testenv]deps}

[testenv:py27-dj19]
basepython = python2.7
deps =
  django>=1.9,<1.10
  {[testenv]deps}

[testenv:py27-dj110]
basepython = python2.7
deps =
  django>=1.10,<1.11
  {[testenv]deps}

[testenv:py27-dj111]
basepython = python2.7
deps =
  django>=1.11,<1.12
  {[testenv]deps}

[testenv:py34-dj18]
basepython = python3.4
deps =
  django>=1.8,<1.9
  {[testenv]deps}

[testenv:py34-dj19]
basepython = python3.4
deps =
  django>=1.9,<1.10
  {[testenv]deps}

[testenv:py34-dj110]
basepython = python3.4
deps =
  django>=1.10,<1.11
  {[testenv]deps}

[testenv:py34-dj111]
basepython = python3.4
deps =
  django>=1.11,<1.12
  {[testenv]deps}

[testenv:py35-dj19]
basepython = python3.5
deps =
  django>=1.9,<1.10
  {[testenv]deps}

[testenv:py35-dj110]
basepython = python3.5
deps =
  django>=1.10,<1.11
  {[testenv]deps}

[testenv:py35-dj111]
basepython = python3.5
deps =
  django>=1.11,<1.12
  {[testenv]deps}

[testenv:py36-dj110]
basepython = python3.6
deps =
  django>=1.10,<1.11
  {[testenv]deps}

[testenv:py36-dj111]
basepython = python3.6
deps =
  django>=1.11,<1.12
  {[testenv]deps}

[testenv:flake8]
basepython = python3.6
deps =
  flake8
commands =
  flake8 src/

[testenv:coverage]
basepython = python3.6
deps =
  django>=1.11,<1.12
  coverage
  {[testenv]deps}
commands =
  nosetests --with-coverage

実行結果

tokibito/django-ftpserver - Travis CI

f:id:nullpobug:20170415154656p:plain

ハマった点

  • Pythonのバージョンを3.6にすると、Python3.5が入っていない
  • Pythonのバージョンを3.5にすると、Python3.6が入っていない

Django 1.11がリリースされましたね

Djangoフレームワークの1.11がリリースされましたね。

Django 1.11 released | Weblog | Django

  • 1.11はLTS(Long Term Support)バージョンです。メンテナンス期限はリリースから3年後までなので、2020年4月までになります。

    • 1つ前のバージョン1.10のメンテナンス期限は2017年12月までになります。
    • 1つ前のLTSバージョンは1.8で、メンテナンス期限は2018年4月までになります。
  • 対応するPythonのバージョンは、2.7、3.4、3.5、3.6です。Python2系をサポートする最後のバージョンです。

  • 次の大きなバージョンアップは2.0で2017年12月に予定されています。Python3.5以上をサポートする予定になっています。

ここ最近はロードマップのスケジュール通りにリリースされているので、次のバージョンも、さほどずれることはないのかもしれません。

エラーメッセージなどのリソースの日本語翻訳はやっておきました。変な訳があればTransifexかGoogleGroupなどで連絡して頂けるとよいかと。

気になった変更点など

全部には目を通してませんが、いくつか気になった点など。

Django 1.11 release notes | Django documentation | Django

  • install_requiresにpytzが入った

    • Djangoに初めてinstall_requiresが追加されました。今のところpytzだけ。
  • モデルに指定するデータベースのインデックスがクラスベースになった

    • インデックス名の指定ができるようになったみたいです
  • フォームのwidgetレンダリングがテンプレートシステム経由になった

    • 以前はPythonコードでHTMLパーツを生成してたので、分離しやすくなりそう?
  • ORMのサブクエリまわりをいくらか明示的に記述できるようになった

  • django.contrib.authのviewがクラスベースになった

参考情報

バージョンアップの準備の参考に。

Unity使い始め

HTC VIVEで遊びたくて、まずはUnityをちょっと使えるようになってみようって感じで勉強し始めたのでメモを残したり。

Unity - Game Engine

読み始めた書籍

購入して読み始めた本はこれ。

ほんきで学ぶUnityゲーム開発入門 Unity5対応

ほんきで学ぶUnityゲーム開発入門 Unity5対応

Unity 5.6とVisualStudio 2017をインストールして、本を読みつつ写経していってみてます。

まだ1/3程度しか読めてないですが、本の感想を少し。

  • 本のUnityバージョンが少し前のものなので、メニュー項目名など変わっていることがあり、若干戸惑う
  • スクリーンショットがいっぱいで説明が丁寧なのでわかりやすい。
  • 主要な各プラットフォーム向けのビルドについて説明されているのがうれしい
  • すぐに動かせるサンプルがあってうれしい

Unityを使いはじめての所感

3Dグラフィックスを扱うプログラミングがまったくはじめてなんですが、今のところさほど問題なく勉強を進めていけてる感じですが、この先数学の知識など足りなくてつらくなりそう。

UnityはWeb上にも情報が多いので楽できている感じ。

C#もはじめてに近いぐらいでしたが、他のプログラミング言語をいくつか使っていたのもあり、今のところ問題なさそうです。

ダウンロードしてきた無料のAssetをキー操作で動かせるようにして遊んだりしています。

f:id:nullpobug:20170405002325p:plain

メモ

  • アニメーション

    • AnimationControllerを用意してステートの遷移を設定
    • ステートの条件となる値をスクリプトで変更していく
    • アニメーションの終了をまたずにステートを遷移させるには「Has Exit Time」チェックを外す

引き続きやっていく。

参考

VRをやっていきたい

会社でHTC VIVEを購入したので、VRやARについて知見を得ていきたいと思う。知識ほぼないところからスタートだけども。

VIVE™ 日本 | 想像を超えたバーチャルリアリティの体験

HTC VIVEを少し動かしてみた感想としては、次のような感じ。

  • ルームスケール用の場所を確保するのが大変

    • 障害物のない長方形エリアを確保するのは意外と難しかった
  • 没入感すごい

    • Android端末でのVRも一緒に試していて、比較した感じではHTC VIVEのほうが没入感があっていい感じ。視野角が広いせい?
  • コントローラが画面に表示されるのはよい

    • 両手に持つコントローラが目の前に表示されるので、VR内の世界に触れる感じがあってよかった

      • 振動のフィードバックもあったりして楽しい
    • Android端末のほうで見てるだけだと、ちょっと物足りない、画面へのタッチが難しいので操作デバイスほしくなる

開発ツールはUnityになるのかなー?

Three.jsでWebVRなんかも試していきたい。

devproxyをWebアプリケーション開発で使う

devproxyというのを開発時に使っているのですが、便利なので紹介します。

GitHub - moriyoshi/devproxy: A swiss army knife of forward HTTP proxies

devproxyは、Webアプリケーション開発向けのHTTPフォワードプロキシです。次のような点で便利です。

  • /etc/hostsの編集やDNSの設定をしなくても、開発サーバーにドメイン名を指定してでアクセスできる
    • そのため、個々の開発環境に差(VMを使ってたりローカル環境だったり)があっても、概ね同じ手順でツールを利用できる
  • 設定を保存、共有するのが簡単(YAMLファイル)
  • クロスプラットフォームで動作し、実行に必要なファイルも1つなので容易に導入できる
  • HTTPSに対応しているため、開発時にHTTPSスキームでの動作確認などが容易にできる

作者はmoriyoshiさんです(弊社の代表)。

動作環境

Goで書かれていて、LinuxMacWindowsで動作します。手元ではLinux(Ubuntu)とWindows(Windows10)で問題なく使えています。

導入

英語ですがREADMEに書いてあるとおりにすれば、特にハマりませんでした。Goで作られたツールをビルドできる環境があればすぐに試せるかと思います。

私はGo言語には詳しくないので、ビルド方法などいい手順があれば指摘ください。

$ cd /path/to/temorary/
$ export GOPATH=$PWD
$ go get github.com/moriyoshi/devproxy
$ bin/devproxy --help
Usage of bin/devproxy:
  -l string
        "addr:port" on which the server listens (default ":8080")
  -v    verbose output

一度バイナリをビルドしてしまえば、あとはコピーして他の環境でも使えるあたりは、Goで書かれたツールの利点ですね。依存ライブラリもなくポータビリティも高くていい感じです。

go getを実行する際に環境変数を指定すればWindows用のバイナリをクロスコンパイルできました。

$ GOOS=windows GOARCH=amd64 go get github.com/moriyoshi/devproxy
$ ls bin/windows_amd64/
devproxy.exe

使ってみる

動作確認用にPHPでホスト名を表示するだけのスクリプトを用意して、ビルトインサーバーで動かしておきます。

$ cat index.php 
<?php
header("Content-type: text/plain; charset=utf-8");
echo "テスト用コンテンツ\nHost: " . $_SERVER['HTTP_HOST'];
$ php -S 127.0.0.1:8000

今回はHTTPとHTTPSを試すので、SSL証明書(いわゆるオレオレ証明書)を用意します。devproxyのREADMEにかかれている通りにopensslコマンドを実行すれば、できました。

x509.ini:

[CA]
basicConstraints=critical,CA:TRUE,pathlen:1
keyUsage=digitalSignature,keyCertSign,cRLSign

SSL証明作成:

$ openssl genrsa 2048 > testca.rsa.key.pem
$ openssl req -new -key testca.rsa.key.pem -out testca.rsa.csr.pem
$ openssl x509 -req -in testca.rsa.csr.pem -signkey testca.rsa.key.pem -days 3650 -sha256 -extfile x509.ini -extensions CA -out testca.rsa.crt.pem

devproxyの設定ファイルとして、config.yml(ファイル名は何でもいい)を次のように書きます。

tls:
  client:
    verify: true
  ca:
    cert: testca.rsa.crt.pem
    key: testca.rsa.key.pem

hosts:
  http://example.com:
    - ^(/*)$: http://127.0.0.1:8000$1
  https://example.com:
    - ^(/*)$: http://127.0.0.1:8000$1

devproxyを起動します:

$ devproxy config.yml

Webブラウザのプロキシ設定で、HTTPとHTTPSのプロキシをdevproxyのアドレスとポートに設定します。

プロキシ設定の切り替えは、例えばChromeならProxy SwitchySharpなどを使えば手軽にできます。

ブラウザで https://example.com/ にアクセスしてみると、オレオレ証明書なので警告は出ますが、テスト用のコンテンツが表示されます。ドメイン名もアプリケーション側のHOSTヘッダで参照できています。

f:id:nullpobug:20170326135612p:plain

HTTPSの際に追加ヘッダを要求する場合は、devproxyでヘッダを追加するようにも設定できます。最近だと、ワイルドカードサブドメインに対応したWebアプリの動作確認や、OAuthプロバイダの動作確認などで活躍しました。

Dockerで使う

Dockerイメージを作ってDockerHubに置いときました。

https://hub.docker.com/r/tokibito/devproxy/

まとめ

便利なので使っていきたいと思います。

SphinxでPDFをビルドするためのDockerイメージを作った

Sphinxでlatexpdfjaコマンドを使ってPDFをビルドするには、latexのインストールされた環境が必要になります。

Ubuntuだとtexlive-fullパッケージで必要なパッケージをインストールできるっぽいというのを把握しました。

texlive-fullは依存パッケージがたくさんありサイズが大きいので、Dockerイメージにして使い捨てすると良さそうだと思いました。

調べたらすでに同じようなことをやってる人がいたんですが、Sphinx拡張などいくつか欲しいものが足りなかったので、自分で作ってみました。

DockerHubに置いときました。

tokibito/sphinx-texlive - Docker Hub

使い方

イメージのサイズが圧縮状態で3GBぐらいあって大きいので、試す際はご注意ください。

Sphinxのプロジェクトのディレクトリに移動して以下のコマンドを実行すると、make latexpdfjaが実行されます。

$ docker run --rm -v $PWD:/docs/ tokibito/sphinx-texlive:latest

make htmlの場合は末尾にコマンドを指定すればできます。

$ docker run --rm -v $PWD:/docs/ tokibito/sphinx-texlive:latest make html

sphinx-quickstartを使いたい場合はdocker runコマンドのほうに -it オプションを指定するといいです。

$ docker run -it --rm -v $PWD:/docs/ tokibito/sphinx-texlive:latest sphinx-quickstart

*diagシリーズのsphinxcontribも入ってます。詳しくはリポジトリのDockerfileを見てください。

github.com

2017年

年が明けて1月はもう後半になってしまいましたが、今年もちょっとずついろいろなことをやっていきたいです。

  • ブログの更新頻度をもう少し高めにしたい
  • ここ1~2年、技術的に新しいことに手を出せていなくて危機感高まっているので、入門的なことからでもメモを残しつつやっていこう
  • 積みあげてしまっているプライベートなタスクを整理しつつ、しっかりこなしていきたい
  • 車の運転を練習したい(オートバイは7年ぐらい乗ってるけど、車はペーパードライバー。今後のためにも慣れておきたい)
  • 運動していこう(1~2年で増えてしまった体重を減らしたい)
  • 畑は継続して知見ためつつやっていこう
  • 睡眠時間の調整をもう少しうまくしていきたい(早寝早起きに寄せたい)
  • お金の運用は継続してうまくやっていきたい

こんな感じで...