bashからzshに乗り換えた話

この記事は、 OIT Advent Calendar 2017の2日目の記事です。

前置き

元々OIT Advent Calendarに弊学の梅田キャンパスを「がっこうたんけんした話」を書くつもりでしたが外が寒くてダメでした.何か記事を書くネタを考えたところ最近zshを使い始めたのでそのことを書くことにしました(偶然にも2日連続シェル環境の記事になった).

dotfiles

最初に貼っておくとdotfilesは以下にあります

github.com

Docker

また以下のコマンド群をコピペするだけで僕のzshを試せます!

docker run --rm -it odanado/zsh zsh
./install.sh && ./deploy.sh
source ~/.zshenv && source ~/.zshrc

動機

周りに影響されてfishを触ってみたところ,デフォルトで入っているauto suggestion機能がとても便利に感じました.ほぼ何もカスタマイズされてないbashで作業をするのは目に見えない時間を失っているようで嫌だったので,bashを辞めることを決意しました.
乗り換えるshellを選ぶ上で前から気になっていたzshと,周りの人が使っているfishで悩みましたが,zshの方が色々カスタマイズできてネット上に情報が多そうだったので,zshを選びました.

プラグインマネージャ

まず最初にプラグインマネージャを選びました. Preztooh-my-zshAntigen などもありましたが, zplug がいいとの情報が多かったので zplug を選択しました.後述しますが実際使ってみて最高でした

インストールしたプラグイン

zsh-users系

目についたやつを入れていきました

peco

pecoはリアルタイムgrepみたいなコマンドです.GO言語で実装されていて厳密にはzshプラグインというわけではないんですが, zplug だとこういったものも zplug "peco/peco", as:command, from:gh-r でインストールすることが可能です.この柔軟性が最高だと思いました.

ghq

これまでは ~/git 以下にひたすらgit cloneしたリポジトリを集めてましたが,ghqを使えば管理が楽になります.これも zplug を使って zplug "motemen/ghq", as:command, from:gh-r でインストールできます.

anyframe

pecoと連携するためのプラグインです.ほしい関数が用意されているので使うのにキーバインドやaliasを設定するだけで使えるようになって便利.

powerline

ターミナルのステータスバー?をかっこよくするやつ. zplug は他人のzshファイルを読み込むこともできて, zplug "powerline/powerline", use:"powerline/bindings/zsh/powerline.zsh" でインストール可能です(ほんと最高). デフォルトのconfigだとかっこいい三角形を表示するためにpowerline用のフォントをインストールする必要があります.しかし三角形を表示するためにフォントをインストールのは大げさだと思い,configで"default_top_theme": "ascii" としています.他にも設定を弄って最終的にこんな表示になりました. f:id:odan3240:20171202222956p:plain

その他設定

ヒストリ

どうやらデフォルトではヒストリを保存しないぽいので設定しました

export HISTFILE=${HOME}/.zsh_history
export HISTSIZE=1000
export SAVEHIST=500000
setopt hist_ignore_all_dups # 同じコマンドをヒストリに保存しない
setopt hist_reduce_blanks # 無駄なスペースを消してヒストリに保存する
setopt share_history # ヒストリを共有

ssh-agent関係

tmux内でもssh-agentが使えるように以下の記事の設定をコピペしました

qiita.com

CIとか

TravisCIとDockerを使ってgithubにpushされるたびに,zplugでのプラグインのインストールが成功することと,zshenv及びzshrcの読み込みが成功することをテストするようにしました.本当はちゃんど動作するところまでテストしたいと思っていましたが方法がわからず,ないよりマシの精神でインストールとロードまでをテストしています.この辺の知識がある方がいれば教えていただきたいです(あとneovimの起動もテストしたい).

おわりに

bashからzshに乗り換えてインストールしたプラグインや設定を紹介しました.今回zshに乗り換えたことでシェル環境の快適度が増して個人的にとても満足しています. zshにはこんな便利なプラグインがあるよ!とかこの設定書くと便利だよ!などの情報をお持ちの方はぜひ教えてください.

SIMD-oriented Fast Mersenne Twisterのpythonラッパーを書いた

SIMD-oriented Fast Mersenne Twister とは

SIMD命令を使うように設計されたMersenne Twisterのこと.普通のMersenne Twisterより高速に動作する.3DSのあるゲームソフトで擬似乱数を生成するために使われていたりする

動機

SFMT(SIMD-oriented Fast Mersenne Twister) を使う時はいつもCでプログラムを実装して,それをpythonからsubprocessで呼び出していた.この方法だと使える言語に制限があるAWS Lambda など使えない.
そう思って作ったがこの記事を書くにあたって改めて調べるとバイナリも一緒にアップロードすれば使えるらしい.まあ,バイナリを作ってアップロードするという手間が省けると思うことにする.

すでに作ってる人はいたが sfmt_genrand_real1 しか実装されておらず, sfmt_genrand_uint64 を使いたい自分の要望にはマッチしていなかった. GitHub - mochizuki-ichiro/pysfmt: SIMD-oriented Fast Mersenne Twister for Python Cythonの勉強も兼ねて自分で実装することにした.

コード

github.com

pypiにもアップロードしたので pip install pysfmt でインストール出来る

問題点

coverageを計測したかったけど何故かできていない http://cython.readthedocs.io/en/latest/src/tutorial/profiling_tutorial.html#enabling-coverage-analysis にあるように .coveragerc に設定を書いたけどダメだった

condaをパッケージマネージャとしてインストールする

動機

conda コマンドは便利だけどシステムのpythonは上書きしてほしくない. python-venv ぐらいのノリで conda コマンドを使いたい
pytorchはcondaコマンドでインストールすることを推奨してるので,こっちでインストールしたい

方法

実はPyPIにcondaコマンドは登録されていてこれをインストールすればよい.
ただ単純に pip install conda でインストールするだけでは以下のように condaにpip経由でインストールしたことを怒られる

ERROR: The install method you used for conda--probably either `pip install conda`
or `easy_install conda`--is not compatible with using conda as an application.
If your intention is to install conda as a standalone application, currently
supported install methods include the Anaconda installer and the miniconda
installer.  You can download the miniconda installer from
https://conda.io/miniconda.html.

しかしこれは4.3系からの仕様なのか,4.2系を入れると特に怒られずにcondaコマンドを使える.つまり pip install conda==4.2.7 でインストールすれば良い

とりあえずこれで conda installconda create が使えているので良しとする

ICPC国内予選2017参加記

お疲れ様でした

f:id:odan3240:20170715103746p:plain

チーム

コンテストの様子

問題文を印刷する.模擬国内予選と同様にA問題も印刷してしまう.
最初のABCはチームメンバーそれぞれが担当することになっていたので,自分はC問題を読む.実装がちょっとつらそうだけど去年と同様に簡単なC問題なので,やはり4完しないとアジア予選には参加できないなと思う.

00:12 A問題 AC

B問題を解いている後輩がちょっと詰まっているみたいなので,A問題を解いた同期に様子を見てもらって,C問題を実装し始める.微妙にどこかバグってるなあ頭悪いなあとつらくなっていたら,B問題が実装できそうとのことなので,ソースコードを印刷してパソコンを交代する.

00:49 B問題 AC

印刷したソースコードを眺めていたら,頭の付いていない箇所を見つけたので修正する.それでもサンプルが一致しなくてデバッグしていると,外側の最小値を2回掛けていることがわかり悲しくなる.修正するとサンプルが一致したので提出した.

01:10 C問題 AC

個人的にいいペースで3完でき,何とかして次の問題を解きたいぞとなる.
E問題は実装を頑張れば通りそうだし,しっかり考察をすれば実装が軽くなる系の問題な気がしたが,順位表はD問題を通しているチームが圧倒的に多かったのでD問題を解くことに決める.
レシピと材料で2部グラフを作りフローを流せば解ける気がしてしまう.考察してる間に後輩にライブラリを写経してもらう.全部のレシピを試したことにして,材料が偶数個になるように辻褄を合わせるために消すレシピを最小化すれば,元の問題が解けることに気付く.この最小化の部分を最小費用流で解けそうだと感じて実装するがサンプルが一致しない.このまま時間切れで終了.

コンテストの感想

D問題はnの大きさで場合分けだったらしい.最初問題を読んだ時にsqrt(500)の値は計算していたのに気づかないのは悲しかった.考察の最中に愚直にbitDPすれば2**500だからつらいよねーとか嘘を言っていた悲しい.
やっぱ4完の壁は大きいと感じた.

解いたC問題のソースコード

gist.github.com

ICPCの感想

色々あって恐らく今年で引退になりました.ICPCは高校から競プロをやっていた関係もあって1年の頃から参加してきました.戦績はこんな感じです.

学年 解いた問題数 順位
1 2完 83位
2 3完 54位
3 3完 73位
4 3完 66位

今年うちの大学からICPCに参加した人のほとんどは来年も参加可能だし,日常的にAtcoderなどのコンテストに参加する人が出現し始めたので,来年以降に期待したいなと思います.
進路が確定したらJAG入りするのかなあ.

何はともあれお疲れ様でした.アジア予選進出された方は引き続き頑張ってください.

macでllvmをbuildする時に The specified item could not be found in the keychain. とエラーを吐く

背景

neovimに乗り換えた - odan’s diary に書いたように neovim のプラグインのzchee/deoplete-clang を使うために, Build llvm for OS X · GitHubllvmをbuildする必要がある.

症状

error: The specified item could not be found in the keychain. というエラーメッセージを吐いてbuildが止まる

解決策

http://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt に書いてあるように,lldb_codesign という名前の証明書を新しく作ればいい

neovimに乗り換えた

導入したプラグインと導入にあたってハマったことのメモ

github.com

プラグイン管理

dein.vim を入れた.
管理の方針としてはプログラミング言語毎に toml ファイルを用意して, on_ft で言語に応じてtomlファイルを読み込むようにした.それ以外は適当に1つのファイルに纏める

common.toml

一般的なプラグインを管理するtomlファイル

cespare/vim-toml

tomlファイルをシンタックスハイライトするため

tomasr/molokai

colorscheme で molokai を使うため

Shougo/deoplete.nvim

補完プラグイン

Shougo/neosnippet

snippet管理プラグイン.競プロのライブラリはこのプラグインを通じてシュッと挿入される

Shougo/neosnippet-snippets

よく使われるsnippet集.pythonif __name__ == '__main__': とか使用頻度が高い

mattn/sonictemplate-vim

vim時代は thinca/vim-template を使っていたけど,こっちの方が良さそうに思えたので乗り換えた.
:Template kyopro で競プロ用のテンプレートが挿入される

Shougo/unite.vim

正直使いきれてない

kmnk/vim-unite-giti

uniteからgitを叩く(?)プラグイン

scrooloose/nerdtree

vimの左側がかっこよくなる

Xuyuanp/nerdtree-git-plugin

かっこよくなる時にgitの状態を表すアイコンが追加される

scrooloose/syntastic

ソースコードの文法とかをチェックしてくれる.pythonはlintツールに flake8 を設定してる

itchyny/vim-cursorword

カーソルの上にある単語にアンダーラインを引いてくれるプラグイン.たいぽのチェックに役に立つ

itchyny/lightline.vim

status がかっこよくなる

cpp

rhysd/vim-clang-format

ソースコードに対して自動的にclang-formatを実行してくれる.スペース+cfで実行するようにキーマップを設定した

zchee/deoplete-clang

clangを使って自動補完してくれる
macOSだとclangのheaderファイルがなくて自前でbuildする必要がある.ただREADMEにリンクしてあるbuildスクリプトは,macOSheadlink がないことや,引数に空白を含む文字列が渡されることが想定されなかったりする.forkして修正した

arakashic/chromatica.nvim

clangを使ってシンタックスハイライトするプラグインvim時代は justmao945/vim-clang を使っていたけどneovimには対応していないらしく,作者もこっちを使えと言っている

python

tell-k/vim-autopep8

ソースコードを対してautopep8 を実行してくれるプラグイン.clang-formatのやつと同じくスペース+cfで実行される.

zchee/deoplete-jedi

pythonの自動補完プラグイン

Indeed Machine Learning CodeSprint Tagging Raw Job Descriptions

復習がまだ済んでないけどブログを書いてとりあえず供養する

問題概要

求人広告の文章が与えられるので,広告に part-time-jobhourly-wage などの12種類のタグを付与しろ
ただし, part-time-jobfull-time-job のように同時に付与されない排他的なタグも存在する
採点方法は12種類のタグのprecisionとrecallの総和からF値を計算する www.hackerrank.com

方針

やったことを時系列順に

深層学習

深層学習試せばいけるやろwという気分になる.この時は12種類のタグに対して独立に採点されることを認識しておらず,12種類のタグを sigmoid_cross_entropy 同時に予測しようとする.スコア 284.62

問題文を確認する

問題文を確認して12種類のタグをそれぞれ予測してもいいこと知る.排他的なグループ内で素性BoWでSVMを使って多値分類してみる.スコア 460.04

トップはスコア700超えていてすごいなあ

ググった結果 scikit-learnOneVsRestClassifier を試してみる(内部的には12回2値分類をしたことになる).スコア 476.53

つらい

素性にbinaryのBoWやtf-idfなどを試すと,binaryのBoWがいい精度を出した.スコア 544.15

おわりに

分類器に XGBoost や ランダムフォレストを試してみるがだめ
最終的に語彙数を増やしたり,ストップワードを除去してスコア 557.97
最終順位は242人中97位だった.悲しい

感想

機械学習の手法を色々試したりしてただけで,1週間が過ぎてしまってエラー分析とかが全くできなかった…
名前は聞いたことあったけど,触ったことのない機械学習ツールの使い方を覚えた
NLPの趣味なので,lemman化などの前処理を知らなかったのが悔しい
こういう企業の機械学習コンペ増えてほしい

github.com