Imagemagickでgifアニメのループの最後だけ長いポーズを入れる

Powerpointにgitアニメを貼り付けると、ループの回数を有限回にしても止まらず、無限ループする。このこと自体の解決方法は見当たらなかったので、次善の策として、ループの最後だけ長いポーズを入れることにした。

convertは非常に柔軟なコマンドで、想像の範囲外のことまでできた。やり方はこんな感じ。

convert -dispose previous -loop 1 -delay 50 band-{1..15}.png -delay 1000 band-15.png out.gif

Travis-CIのyamlセッティング

Conditional releaseのところではifが使えない? condition:を使う。その中身はbash conditionalの[[ condition ]]で書く。

Deployment - Travis CI

他のところでは、ifが使えたりする。envとか。

https://docs.travis-ci.com/user/conditional-builds-stages-jobs/

PyPI deployでskip_existing: trueが使える。Pythonパッケージのpython2.7と3.6で別のビルドを行った時に、どちからdeployが遅い方でソースパッケージ(something-version.tar.gz)がすでに存在するというエラーが出てtravisがこけてしまうことを防ぐことができる。

Bash conditional

[[ condition ]][ condition ]の違いとか。

Conditions in bash scripting (if statements) - Linux Academy Blog

condaによるpostgresqlのインストールと起動

% conda install postgresql
% initdb -D /path/to/postgresql-prefix
% pg_ctl -D /path/to/postgresql-prefix start
% createuser -P username
% createdb -O owner dbname
% psql dbname
dbname=# GRANT ALL PRIVILEGES ON DATABASE dbname to username;
% pg_ctl -D /path/to/postgresql-prefix stop

/path/to/postgresql-prefix以下にたくさんファイルが生成される。自分だけの場合はusernameownerは同じでよいと思われる。

スパコンでconda

こういうスパコンを使っている。Redhatを使っているらしい。ソフトウエアが古い。インターネットは外に繋がっている。そこにcondaをセットアップし、python C-APIを使っているコードのビルド&インストールをした。思ったよりトラブルが少なかったけど、もちろんなかったわけではない。その忘備録。

unset _CONDA_PYTHON_SYSCONFIGDATA_NAME

setuptoolsがCCを見てくれるので.oはcondaのgccコンパイルするが、リンクにはシステムのgccを使うため、そこでコケてしまう。LDSHAREDという環境変数がリンクに使われるらしく、gccを置き換えるだけではフラグがないのでこける。フラグはbuildログ(python setup.py build)のシステムのgccでコケたところからコピーで取ってきて、コンパイラ(つまり$CC)と共に全部LDSHAREDに突っ込むことでビルドが無事通った。もちろん一般的な解ではない。

export LDSHARED="/hoge/togo/miniconda/envs/dev/bin/x86_64-conda_cos6-linux-gnu-cc -pthread -shared -Wl,-rpath,/hoge/togo/miniconda/envs/dev/lib -L/hoge/togo/miniconda/envs/dev/lib -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -Wl,-rpath,/hoge/togo/miniconda/envs/dev/lib -L/hoge/togo/miniconda/envs/dev/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -DNDEBUG -D_FORTIFY_SOURCE=2 -O2"

condaで環境構築・Linuxの場合

% bash ~/Miniconda2-latest-Linux-x86_64.sh -b -p $HOME/.miniconda2
% ln -s $HOME/.miniconda2 $HOME/.miniconda
% conda create --name myenv
% source activate myenv

環境設定はここに書く:

cd $CONDA_PREFIX
mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/env_vars.sh
touch ./etc/conda/deactivate.d/env_vars.sh

Bash completionをzshで使いたい場合は、$CONDA_PREFIX/etc/conda/activate.d/env_vars.shに以下の行を加える。

autoload bashcompinit
bashcompinit

コンパイラもcondaで入れたいなら、

% conda install gcc_linux-64 gxx_linux-64 gfortran_linux-64

$CONDA_PREFIX/etc/conda/activate.d以下にactivate-gcc_linux-64.shなどのbashスクリプトが入る。それが環境変数CCなどを設定する。gccといった実行可能バイナリもしくはそのリンクは作られないので、このbashスクリプトが重要。zshではbashスクリプトを適当な場所に移動して、以下のようにエミュレートして読み込むようにする。

emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-binutils_linux-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gcc_linux-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gxx_linux-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gfortran_linux-64.sh'

プロンプトのホスト名がx86_64-conda_cos6-linux-gnuになるので、元に戻すために以下の行を$CONDA_PREFIX/etc/conda/activate.d/env_vars.sh$CONDA_PREFIX/etc/conda/deactivate.d/env_vars.shに追加。

export HOST=`hostname`

まとめると(zsh)

autoload bashcompinit
bashcompinit

if (( ${+LD_LIBRARY_PATH} )); then
  export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
else
  export LD_LIBRARY_PATH=$CONDA_PREFIX/lib
fi
if (( ${+C_INCLUDE_PATH} )); then
  export C_INCLUDE_PATH=$CONDA_PREFIX/include:$C_INCLUDE_PATH
else
  export C_INCLUDE_PATH=$CONDA_PREFIX/include
fi
if (( ${+LIBRARY_PATH} )); then
  export LIBRARY_PATH=$CONDA_PREFIX/lib:$LIBRARY_PATH
else
  export LIBRARY_PATH=$CONDA_PREFIX/lib
fi

emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-binutils_linux-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gcc_linux-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gxx_linux-64.sh'

export HOST=`hostname`

他に、cmake, eigen, boost, openblasもcondaで入る。openblasはconda-forgeから入れると良い。

condaで環境構築・Macの場合

gcc, gxxの代わりにそれぞれclang, clang++を使うことになる。fortranは共にgfortran。以下参照。

% conda install clang_osx-64 clangxx_osx-64 gfortran_osx-64 llvm-openmp

OpenMPを使う場合はllvm-openmpが必要。

$CONDA_PREFIX/etc/conda/activate.d/env_vars.shの設定をまとめると、

autoload bashcompinit
bashcompinit

export PATH=$CONDA_PREFIX/bin:/Users/togo/code/rtags/bin:$PATH
if [[ -v LD_LIBRARY_PATH ]]; then
  export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
else
  export LD_LIBRARY_PATH=$CONDA_PREFIX/lib
fi
if [[ -v C_INCLUDE_PATH ]]; then
  export C_INCLUDE_PATH=$CONDA_PREFIX/include:$C_INCLUDE_PATH
else
  export C_INCLUDE_PATH=$CONDA_PREFIX/include
fi
if [[ -v LIBRARY_PATH ]]; then
  export LIBRARY_PATH=$CONDA_PREFIX/lib:$LIBRARY_PATH
else
  export LIBRARY_PATH=$CONDA_PREFIX/lib
fi

emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate-gfortran_osx-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate_clangxx_osx-64.sh'
emulate sh -c 'source $CONDA_PREFIX/etc/conda/activate.d/bash/activate_clang_osx-64.sh'
export HOST=`hostname`

macOS(High Sierra, Mohave)でcondaとhomebrewのlibgompが衝突

condaで主な環境を構築しているものの、gccはhomebrewを使っている。最近のアップデートのせいか、このgccとcondaのlibgompが非互換なため、実行時にコケてしまうようになった。つまり-lgompでリンクすると、どうしてもcondaのlibgompを読んでしまう。/usr/local/opt/gcc@6/lib/gcc/6/libgomp.aといった静的ライブラリをリンクすることで問題を回避した。