Julia tips #1:【超簡単】コードのテスト
テストマクロについてのメモ(2017/12/03時点)
環境
windows 10 Pro (Fall Creators Update)
WSL有効化済み
WSLのbashにて実行
環境構築の仕方はこちらをどうぞ
テストマクロの使い方
まずはJuliaのバージョン確認から
$ julia --version julia version 0.5.2
foo(x)という関数があったとして、その挙動を引数ごとにまとめて行う方法
julia> @testset "Foo Tests" begin @test foo("a") == 1 @test foo("ab") == 4 @test foo("abc") == 9 end Test Summary: | Pass Total Foo Tests | 3 3
全部で3回テスト(Total)して、3回ともクリアしたぞ(Pass)って意味。
ネストしていても大丈夫
julia> @testset "Foo Tests" begin @testset "Animals" begin @test foo("cat") == 9 @test foo("dog") == foo("cat") end @testset "Arrays $i" for i in 1:3 @test foo(zeros(i)) == i^2 @test foo(ones(i)) == i^2 end end Test Summary: | Pass Total Foo Tests | 8 8
結果が全部まとめられているが、エラーを吐いている場合は展開して表示してくれる。
Arrays: Test Failed Expression: foo(ones(4)) == 15 Evaluated: 16 == 15 in record at test.jl:297 in do_test at test.jl:191 Test Summary: | Pass Fail Total Foo Tests | 3 1 4 Animals | 2 2 Arrays | 1 1 2 ERROR: Some tests did not pass: 3 passed, 1 failed, 0 errored, 0 broken. in finish at test.jl:362
他にも色んなマクロがある
大体一緒か判定する
@test a≈b
≈は\approxと打った後にtabで表示される。
以下、エラーコードつき。
めっちゃ小さい数値誤差を許容して等しいかどうか判定
julia> @test_approx_eq 1. 0.999999999 ERROR: assertion failed: |1.0 - 0.999999999| < 2.220446049250313e-12 1.0 = 1.0 0.999999999 = 0.999999999 in test_approx_eq at test.jl:75 in test_approx_eq at test.jl:80
e-12なら通常使用なら問題なさそうかな?
許容誤差を設定して判定
@test_approx_eq_eps 1. 0.999 1e-3 ERROR: assertion failed: |1.0 - 0.999| <= 0.001 1.0 = 1.0 0.999 = 0.999 difference = 0.0010000000000000009 > 0.001 in error at error.jl:22 in test_approx_eq at test.jl:68
こんな書き方もあったりする。
julia> ≈(1, 0.999, atol=0.001) true julia> ≈(1, 0.999, atol=0.0001) false
感想
Pythonでデコレータ書いたりするより遥かに簡単で良い。
Windows Subsystem for Linux + Python + Jupyter + Julia
Windows Subsystem for Linux (WSL)で開発環境を構築する
Windows10 Fall Creators Updateにて、WSLが正式版となりました。
以下ではWSLの有効化は事前に行っているものとします。
WSLでは、Linuxが仮想環境ではなくサブシステムとしてWindows上で動く。
細かいことはわからないが、提供されていないカーネルを必要とするソフトウェアはWSL上では動かないらしい。
Linux互換環境といったところか。
Bashシェルやapt、gccコンパイラ、gitといったものは普通に動くので個人的には十分だ。
コンパイルして生成された実行ファイルはOSを跨ぐと当然動かないので、linux環境に統一したいというのが、今回WSL上に環境を構築する理由である。
大抵のスパコンや小規模計算機サーバなどはOSにlinuxを採用しているのでメリットは多い。
WSL上にPython仮想環境を構築する
WSL上にデフォルトのPythonが入っているので、WSL自体を壊してしまわないように仮想環境にAnacondaを使ってPythonを導入する。
pyenvのインストール
直接Anacondaを入れても良いが要らないパッケージを入れたくないので、pyenv経由で入れると良い。
$ sudo aptitude install git $ git clone https://github.com/yyuu/pyenv ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc $ source ~/.bashrc
*gitが入っている人は1行目はいらない。
Anacondaのインストール
pyenvから入れる。
$ pyenv install --list
いろいろ表示されるが、anaconda~~~ってやつの最新版を探す。
自分の場合はanaconda3-5.0.1が最新だった。
$ pyenv install anaconda3-5.0.1 $ pyenv global anaconda3-5.0.1 $ pyenv rehash
これでAnacondaのインストールは完了。
GUIのインストール
WSLにはGUIがないので、ipythonは動いてもmatplotlibが動かない。
ココから以下の二つをダウンロード&インストールする。
インストール後、Xmingを起動すると、windowsのタスクバーにXmingが現れるのでカーソルを合わせると
Xming server:0.0
と出ることを確認。こいつをdisplayの出力先に指定してやる。
$ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc $ source ~/.bashrc
これでGUIの設定ができた。
matplotlibの導入
以上で大方準備は完了しているが、このままだとmatplotlibのインストールがうまくいかない。 また、jupyterのインストールにも失敗した(確か)。
これらの問題を避けるためにWSLで必要なパッケージをインストールしておく必要がある。
$ sudo aptitude install libqtgui4 $ sudo add-apt-repository ppa:aseering/wsl $ sudo aptitude update $ sudo aptitude install libzmq3 $ conda install -c jzuhone zeromq=4.1.dev0
これで動くようになったはず。
あとはconda installするだけ。
$ conda install matplotlib jupyter
numpyはmkl対応のものがデフォルトになっている。
エラーを吐く場合はmklを使わないOpenBLASのものを使うようにする。
$ conda install nomkl $ conda update --all
Juliaのインストール
WSLでは、Juliaのインストール自体はUbuntuと同じで簡単にできる。
$ sudo add-apt-repository ppa:staticfloat/juliareleases $ sudo add-apt-repository ppa:staticfloat/julia-deps $ sudo apt-get update $ sudo apt-get install julia
JupyterがインストールされていればIJuliaも簡単に導入可能
$ julia > Pkg.add("IJulia")
まとめ
WSLにPythonの開発環境をpyenvを経由してAnacondaで構築した。
Jupyterの導入に便乗する形でJuliaもインストールした
Google Driveで文献管理 Paperpileが凄い
研究者を悩ませる文献管理
研究者にとって、増え続ける論文は仕事の効率を悪くする。
- ほしい文献がどこに行ったか覚えていない
- supporting informationどこよ
- ファイルがダブっている
- てか読んだっけ?
なんてことは日常茶飯事で困っていた(情報整理とか豆なことは苦手)。
そこで文献管理ソフトを使うわけだが、日本では以下が有名どころのようだ。
文献管理ソフトの例
ただ、どれも容量に制限があったり、結構高いお金がかかったりとパッとしない。
求めることは
- オンラインストレージに文献保存
- クラウドでの文献管理環境
- メモ的なものが書けて、かつ簡単に確認できる
こんなのないかなーとずっと思っていたら、あった。
Paperpile
Paperpileの特徴
- 文献はGoogle Driveに保存
- ブラウザからワンクリックでインポート&pdfダウンロード
- メモが簡単&閲覧も簡単
- Google Docsにcitationができる。
- academic use(要学校のアドレス)なら家でも文献ダウンロードできる??(気がするだけ?)
- ブラウザベースなので引用元を簡単に表示できる。
まぁとにかく凄い。
管理させるだけなら最強では?
残念な点
- wordプラグインは開発中らしい(フォーラムによると優先度低め)
- PCからでないと使えない。
タブレット版はベータテスト中らしいが、いつ正式版がでるのか不明。
ただ、Google DriveにあるpdfはGoogle Driveに追加できるMetaPDFでコメントをペタペタしながら読めたりするので別にいいかも。
日本語で紹介・解説している人を見たことがないので参考になれば。
os.walkでエラーが出た
pythonの話題。
なお環境はAnacondaで構築して、python3.5となっている。
普段使っていたスクリプトがファイル読み込みでエラーをはいたのでその原因を調べた。
pandasとかいう便利なやつ
データ分析する人なら御用達のpandas。
エクセルファイルを簡単に読み込める凄いやつ。
こいつで複数ファイルをループして読み込みまくろうとしたらことが起きた。
こいつのバージョンが問題なのではと色々調べたが、結局問題はもっと根本的なところにあった。
なんだかglobとかos.walkが怪しい…
細かい説明はすっ飛ばして結論を言うと、excelとかのofficeソフトって._XXXXXXって感じの隠しファイルを生成していて、Ubuntuはもれなく条件にヒットしたファイル名を拾ってしまう。
windowsではこれを自動で無視するらしくglobだろうがos.walkだろうが問題にならない。
この._XXXファイルが読めないよ!!ってエラーをはいていたのだった。
ありがた迷惑である。
.(ドット)で始まるファイルを除けばいい
ということで隠しファイルを除くサンプルスクリプトを書いた。
import os parentPath = 探したいディレクトリのパス for root, dirs, fnames in os.walk(parentPath): for fname in fnames: if not fname.startswith("."): print(fname)
わかってしまえば簡単だった。
Ubuntuをアップデートしたらネットに繋がらなくなった
いつもの調子でsudo update!!PC
すると突然、DNSエラーが出てネットに繋がらなくなった。
同じ症状で困っている人もいると思うので記録しておく(調べれば一瞬で解決だけど)。
DNSサーバーって?
雑な言い方をすると、google、yahooなどの名前からIPアドレスを教えてくれるサーバー。
PCはIPアドレスがわからないと、googleやyahooやその他のPCなどに接続できない。
でもIPアドレスを毎回打ち込むのも、覚えるのも大変。
ニックネームだけ覚えて、ユーザーとしては実際のIPアドレスは隠蔽したい。
そんな面倒くさい部分を管理してくれているのがDNSサーバー。
なんで突然繋がらなくなった?
細かいところはわからないが、DNSサーバーの指定だか何かが勝手に書き換わってしまうらしい。
なんだそれ。
書き換えられないようにハードコードして解決
/etc/resolvconf/resolv.conf.d/head
最終行に
nameserver 8.8.8.8
と追記。
再起動すればネット復活。
まとめ
勉強になりました。
UbuntuでOneDriveを使いたい
Ubuntuで直感的にOneDriveを使いたい。
rcloneとかいう便利なソフトがあるらしい。
GUIもあるから設定してみた。
そんなお話。
rcloneってなに
Linux使いならよーくご存じだと思われるrsyncのクラウドバージョン。
それがrclone。
色々なクラウドストレージに対応しているようだ。
- Google Drive
- Amazon S3
- Openstack Swift / Rackspace cloud files / Memset Memstore
- Dropbox
- Google Cloud Storage
- Amazon Drive
- Microsoft OneDrive
- Hubic
- Backblaze B2
- Yandex Disk
- SFTP
- FTP
- HTTP
- The local filesystem
インストール
まずはインストールする
snapとかいうパッケージ管理マネージャ的な何かをaptでインストールしておく
sudo apt install snapd
snapでインストール
sudo snap install rclone --classic
アップデートしたい時
sudo snap refresh rclone --classic
rcloneを設定する
rclone config
interactiveに設定できる。
一問一答形式なので困ることもない。
No remotes found - make a new one n) New remote s) Set configuration password n/s> n name> remote Type of storage to configure. Choose a number from below, or type in your own value 1 / Amazon Drive \ "amazon cloud drive" 2 / Amazon S3 (also Dreamhost, Ceph) \ "s3" 3 / Backblaze B2 \ "b2" 4 / Dropbox \ "dropbox" 5 / Google Cloud Storage (this is not Google Drive) \ "google cloud storage" 6 / Google Drive \ "drive" 7 / Hubic \ "hubic" 8 / Local Disk \ "local" 9 / Microsoft OneDrive \ "onedrive" 10 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH) \ "swift" 11 / Yandex Disk \ "yandex" Storage> 9 Microsoft App Client Id - leave blank normally. client_id> Microsoft App Client Secret - leave blank normally. client_secret> Remote config Use auto config? * Say Y if not sure * Say N if you are working on a remote or headless machine y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://XXXXXXXXXXX/auth Log in and authorize rclone for access Waiting for code... Got code -------------------- [remote] client_id = client_secret = token = {"access_token":"XXXXXX"} -------------------- y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
上記のコマンドたちについて少し説明。
ここは空欄で良いです(この後自動設定で、OneDriveのページヘ行き認証を行うため)
Microsoft App Client Id - leave blank normally. client_id> Microsoft App Client Secret - leave blank normally. client_secret>
もし、自動でブラウザが立ち上がらない場合、以下の部分に書かれているurlヘ飛ぶ。
If your browser doesn't open automatically go to the following link: http://XXXXXXXXXXX/auth
OneDriveの認証画面が現れるので、承認する。
最後に
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q>
と聞かれるので、qを入力して終了。
このままでもCUIでコマンドを叩けば使えるが、rsyncのdeleteオプションが付いている状態でファイルのやり取りがされるらしく…
クラウド上のファイル全削除なんて事故が頻繁に起こるらしい。
ましてやコマンドなんてしばらく使わなければ忘れるもの。
そこで、ファイル全削除なうえ復元不可…なんて惨劇を回避するためにGUIを導入します。
RcloneBrowserの導入
rcloneがインストールされて、設定が終わっていることが前提です。
インストールする
sudo add-apt-repository ppa:mmozeiko/rclone-browser sudo apt-get update sudo apt install rclone-browser
これだけでインストールができるらしい…が、私の環境ではなぜかパッケージのダウンロードの段階で404 not found。
メンテナンス中とかだったのだろうか…。
仕方ないのでRcloneBrowaer公式からdebをダウンロードして直接入れた。
ダウンロードしてきたフォルダに移動して以下のようにコマンドを入力。
sudo dpkg -i rclone-browser_1.2_amd64.deb
準備は整った。
実行する。
rclone-browser
こんなwindowが立ち上がったら成功。
rcloneの設定が終わっていないとポップアップがでてきて、rcloneの設定をさせられる。
出てきたウィンドウに、rclone locationと.rclone.confのpathを入力すれば導入完了。
rcloneの場所がわからなければ
which rclone
で調べられる。
.rclone.confの場所は人によって違うかもしれないが、
/home/yourname/.rclone.conf
あるいは、Ubuntuなら
/home/yourname/.config/rclone/rclone.conf
となっている…と思う。
まとめ
Ubuntuからwebブラウザを経由せずにOneDriveにアクセスできるようになった!
マウント機能もあるらしいがexperimentalなので触らないでおく。
Ubuntuのアップグレード
アップグレードの前に設定を確認
英語版Ubuntu
- システム設定
- Software & Updates
- Updates のタブ を選択
- Notify me of a new Ubuntu version で「 For any new version 」を選択
日本語版Ubuntu
- システム設定
- ソフトウェアとアップグレード
- アップデート のタブを選択
- Ubuntuの新バージョンの通知 で「 すべての新バージョン 」(デフォルトは長期サポート(LTS)版)を選択
いよいよアップグレード
sudo apt update sudo do-release-upgrade
再起動
sudo reboot
development release versionを入れる場合、更に次のコマンドを実行して再起動。
sudo do-release-upgrade -d sudo reboot
以上。
念の為バージョン確認
lsb_release -a
NeoVim + deinで快適なエディタ生活【Ubuntu 16.04 LTS】
Neovimの導入
neovimのよくあるインストール方法
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:neovim-ppa/unstable
sudo apt-get update
sudo apt-get install neovim
これでとりあえずのインストールは完了。
deinのインストール
これまでのvimなら.vimrcファイルに設定をゴリゴリ書き込んだり、NeoBundleでパッケージしたりします。
なんだか最近はdeinというものでパッケージ管理するのが流行りらしい。
パッケージとneovimそのものの設定を分けて置けるので、パッケージ管理が格段に楽になる。
準備する設定ファイル
init.vimは今までの.vimrcと同じノリで書けば良い。
ただ、dein.tomlを読み込むために以下の内容を追記しておく必要がある。
let g:python_host_prog = 'python2のパス' let g:python3_host_prog = 'python3のパス' let s:dein_dir = expand('deinをインストールする場所のパス') let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim' if &runtimepath !~# '/dein.vim' if !isdirectory(s:dein_repo_dir) execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir endif execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p') endif
deinでプラグイン管理
deinは便利で良いが…一般人には書き方がわかりにくい。
F言語?というものらしいので、最低限必要なことをまとめておく。
Shogo氏のdenite.nvimを入れる場合、パッケージを入れたいだけならdein.vimにとりあえず以下のように記述する。
[[plugins]] repo = 'Shougo/denite.nvim'
同じようにして、どんどん追記していけばいい。
遅延読み込みがしたければdein_lazy.tomlに書き込んでおくらしいが、私は使っていないので紹介できない。
そのうち、プラグイン管理に必要なF言語について必要な部分だけまとめる。
markdownで論文・レポートを書く、実践編【Ubuntu 16.04 LTS】
markdownからwordへ変換する最も簡単な方法
test.mdの中に適当にマークダウン形式で何か書いておく。
<test.md>
# Heading1 ## Heading2 hogeほげ - list - list - list 1. list1 1. list2 1. list3
で以下のコマンドを入力
pandoc test.md -o test.docx
test.docxという名前でワードファイルが生成されるはずだ。
もうちょっとステップアップ
ここからが本番。
細かいことは後述するが大まかに以下の3つがあればとりあえず論文が書ける。
図のreferenceは今回取り扱っていないが、(生物系の)投稿論文では図とメインテキストを分けることがほとんどなので問題にならないだろう。
おおまかな手順は以下の通り。 1. 予め、テンプレートとなる書式設定をしたtemplate.docxを準備しておく 1. bibtexやEndnote XMLで引用したいreferenceファイルを作っておく 1. citationスタイルを決めるcslファイルを準備しておく(後述) 引用はmarkdownファイル中の任意の場所で[@hogehoge]とでもすれば良い。
準備ができたら、以下のようにwordを生成すると投稿先スタイルになっている。
投稿先が変わったらテンプレートファイルやcslを差し替えれば良い。
めっちゃ楽!!
pandoc test.md -o test.docx --reference-doc template.docx --bibliography=references.bib --csl style.csl
–reference-doc template.docx
で書式設定
–bibliography=references.bib
でリファレンス埋め込み
–csl style
でcitationスタイルを決定している。
さいごに
markdownで論文・レポートを書く、環境準備編【Ubuntu 16.04 LTS】
論文やレポートの体裁を整えるのはひたすら苦痛だ。
これらのいい所だけ集めたのがpandocだ。 markdown、word、texファイルを相互に変換できる。 (本当はもっと色々できる)
中途半端な感じかと思ったが、凄かったので備忘録を残しておく。 たくさん書くのは疲れるので環境準備編と実践編に分ける
Latex環境の構築
pandoc環境の前にLatexをインストールしておく。 細かい仕様は確認していないが、Latexを入れておかないとpdf化ができないらしい。
apt-get update
apt-get upgrade
sudo apt-add-repository ppa:texlive-backports/ppa
sudo apt-get install texlive-lang-cjk
test.texという名前で以下を保存
¥documentclass{jarticle} ¥begin{document} hogeほげ ¥end{document}
正しくインストールされたことを確認
dvipdfmx text.dvi
test.pdfが生成されたはず。
pandocのインストール
pandoc単独で入れてもいいが、anacondaを使ってpythonをインストールするとついてくる。
anacondaのubuntu版をダウンロード
https://www.continuum.io/downloads
ダウンロードしたディレクトリに移動して、以下のコマンドでインストール
bash ~/Downloads/Anaconda3-4.4.0-Linux-x86_64.sh
python –version
以下のようにpythonのバージョンが出力されればうまく行っている。
Python 3.6.1
pandocも確認しておく
which pandoc
pandocのpathが出力されれば成功している。