元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

Julia tips #1:【超簡単】コードのテスト

テストマクロについてのメモ(2017/12/03時点)

環境

windows 10 Pro (Fall Creators Update)
WSL有効化済み
WSLのbashにて実行
環境構築の仕方はこちらをどうぞ

hotoke-x.hatenablog.com

テストマクロの使い方

まずは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が動かない。

これでは不便なのでX11 GUIを導入する。

ココから以下の二つをダウンロード&インストールする。

  • Xming-fonts-7-7-0-10-setup.exe
  • Xming-6-9-0-31-setup.exe

インストール後、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どこよ
  • ファイルがダブっている
  • てか読んだっけ?

なんてことは日常茶飯事で困っていた(情報整理とか豆なことは苦手)。

そこで文献管理ソフトを使うわけだが、日本では以下が有名どころのようだ。

文献管理ソフトの例

  • EndNote
  • ReadCube
  • Zotero
  • Mendeley
  • Papers (macのみ)

ただ、どれも容量に制限があったり、結構高いお金がかかったりとパッとしない。

求めることは

  • オンラインストレージに文献保存
  • クラウドでの文献管理環境
  • メモ的なものが書けて、かつ簡単に確認できる

こんなのないかなーとずっと思っていたら、あった。

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

色々なクラウドストレージに対応しているようだ。

インストール

まずはインストールする

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が立ち上がったら成功。

f:id:hotoke-X:20170903014007p:plain

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なので触らないでおく。

ちゃんと使えるようになったらwindowsmacと遜色なくOneDriveが使えるようになるかも?

Ubuntuのアップグレード

アップグレードの前に設定を確認

英語版Ubuntu

    1. システム設定
  1. Software & Updates
  2. Updates のタブ を選択
  3. Notify me of a new Ubuntu version で「 For any new version 」を選択

日本語版Ubuntu

  1. システム設定
  2. ソフトウェアとアップグレード
  3. アップデート のタブを選択
  4. 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 (vimでいう.vimrcに相当)
  • dein.toml (パッケージ設定を記述する)
  • dein_lazy.toml (とりあえずはなくても良い)

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スタイルを決定している。

さいごに

texを使いたいのに、texで論文書いてるとボスに殺される人もハッピー!!

markdownで論文・レポートを書く、環境準備編【Ubuntu 16.04 LTS】

論文やレポートの体裁を整えるのはひたすら苦痛だ。

  • ワードは書きやすいけど数式に弱いし面倒くさい。
  • Latexは数式や体裁を整えることが得意だが、可読性が低い。
  • markdownは数式にも強いし可読性も高いが、citationが苦手。

これらのいい所だけ集めたのが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}

正しくインストールされたことを確認

platex test.tex

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が出力されれば成功している。