2017年11月28日火曜日

imbalanced-learnでお手軽サンプリング

アンダーサンプリングやオーバーサンプリングは今まで手動で書いていたのですが、imbalanced-learnという素晴らしいライブラリがある事に気付きました。

以下はKerasと組み合わせた時のアンダーサンプリングの実装例。
from keras.utils import np_utils
from imblearn.under_sampling import RandomUnderSampler

negative = y_train.count(0)
positive = y_train.count(1)
count = min([positive, negative])
rus = RandomUnderSampler(ratio={0:count, 1:count})
x_train, y_train = rus.fit_sample(x_train, y_train)

y_train = np_utils.to_categorical(y_train, class_num)
y_test = np_utils.to_categorical(y_test, class_num)

model.fit(x_train, y_train, batch_size=128, epochs=1000)

上記は一番簡単なアルゴリズムを採用していますが、他にも様々なアルゴリズムを利用できるのはポイント高い。 これでもう面倒なコードを書かないでOKですね。

2017年11月24日金曜日

Vim/Neovimの設定で注意したい事まとめ

Vim/Neovimの設定を見直していて、結構地雷を踏んでいた事に気が付きました。 踏む地雷は人それぞれとも思うのですが、自分自身が再び地雷を踏まないように、 ハマった事のある~/.vimrcや~/.config/nvim/init.vimの設定の地雷をまとめてみました。

set paste
コピペが大好きな私は常にset pasteモードになっていればさぞ便利だろうと考えていた時期もありました。 しかしこの設定を行うと、deoplete.nvimのような補完プラグインの動作が変わる他、 tcommentのような自動入力系のプラグイン、それらに関連するような設定が機能しなくなります。 これに気付かずにかなり長い時間を無駄にした事があるので、要注意設定の1つ。

set t_Co=256
vimの色調を256色に設定するオプションです。 vimをターミナルで実行する場合、ターミナルのTERM変数からterm変数→t_Co変数を決定する仕組みになっているようです。 本来であれば ~/.bashrc などで export TERM='xterm-256color' を設定すればこの設定は必要ないはずだけど、 わざとターミナルの色調を落としているような場合は設定する必要がある。


set mouse=a
2019-12-22: 昔バグることが多かった設定でしたが、最近は問題がなくなったので、記述を削除しました。 最近はハマるポイントも減ってきて、完成度が高まってます。


set foldmethod=syntax
プログラミング言語のsyntaxを利用してコードを折り畳んでくれる便利機能ですが、これを設定すると全体の動作が非常に重く、もっさりになります。 様々なページで解決策を紹介されていますが、以下のような設定が私のおすすめです。
" ---------- もっさり対策
" ----- 共通
call dein#add('Konfekt/FastFold')
let g:fastfold_savehook = 1
let g:fastfold_fold_command_suffixes =  ['x','X','a','A','o','O','c','C']
let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk']

" 再描画の方法を変更して高速化
set ttyfast  " これは要確認かも
set lazyredraw

" 挿入モード時にsyntaxを解除して高速化
augroup foldmethod-syntax
  autocmd! 
  autocmd InsertEnter * if &l:foldmethod ==# 'syntax'
  \                   |   setlocal foldmethod=manual
  \                   | endif
  autocmd InsertLeave * if &l:foldmethod ==# 'manual'
  \                   |   setlocal foldmethod=syntax
  \                   | endif
augroup END

" syntaxを探索する行数/列数を限定する事で高速化
set synmaxcol=256
syntax sync minlines=256

" ----- vim-ruby/vim-ruby
autocmd FileType ruby setlocal foldmethod=syntax
autocmd FileType ruby setlocal foldlevel=0
autocmd FileType ruby setlocal foldnestmax=1
" foldmethod=syntaxの後に記述する必要あり
let g:ruby_fold = 1
let g:ruby_foldable_groups = 'def'  " 処理を減らして軽く
プログラミング言語毎にも色々設定しないといけないので面倒ですが、このような設定をするとかなりストレスが軽減されるはずです。 これでも耐えられない場合は、foldmethodを他の方式に変えたほうが良いと思います。

call dein#add('lambdalisue/vim-pyenv')
Vim/NeovimでのPython利用が一般的になってきてから、Pythonの指定が結構重要になってきています。 Pythonはpyenvで管理している人が多いと思いますが、pyenvに頼りきった環境ではPythonのパスをプラグインが見つけられない事があります。 私がこの問題に直面したのはValloric/YouCompleteMeで、インストールは正しいのに以下のエラーが止まりませんでした。
The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM core library not detected; you need to compile YCM before using it. Follow the instructions in the documentation.
ようはインストールしたはずのものがpyenv上にあるため見つからないという状況になっていました。 これはlambdalisue/vim-pyenvを入れる事で解決できましたが、プラグインのバグではないので気付くのに結構時間が掛かりました。 anyanvの利用時にはこのような問題が発生し得る事を覚えておくとトラブルシューティングが楽になるかも。


Neovimはバージョンにも注意 (2018/06)

設定とは関係ありませんが、0.2.1〜0.2.2をインストールすると文字化けで編集が困難になりました。 エディタが死ぬと辛いので、このバグが起きない0.2.0を野良ビルドして入れたほうが良いかも。 ちなみに0.3.0ではこのバグは直っていました。

他にも何かハマりそうなポイントが見つかったら追加していこうと思います。

Googleブックマークを見やすくするChrome拡張を作った

Googleブックマークは動作が軽く気軽に利用できるので、 今でもとりあえずメモっておくような用途では使っています。ただ表示がほんの少し不満で、もっとコンパクトに表示してほしい。

これを改善してみます。まず以下のファイル構成を作ります。
googlebookmarks/
  manifest.json
  user.css
  user.js
manifest.jsonを以下のように編集します。
{
  "name": "Google Bookmarks+",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "Google Bookmarks+",
  "homepage_url": "https://www.google.com/bookmarks",
  "content_scripts": [
    {
      "matches": ["*://www.google.com/bookmarks/*",
                  "*://www.google.co.jp/bookmarks/*"],
      "css": ["user.css"],
      "js": ["user.js"]
    }
  ]
}
user.css、user.jsにはすべてのページに設定したい内容を記述します。
私はuser.cssを以下のように設定してみました。これだけでもかなり使いやすくなります。
br { display:none !important; }

#search table {
  line-height:21px !important;
  padding-top:0px !important;
  padding-bottom:0px !important;
}

あとはこの拡張を読み込むだけです。chrome://extensions にアクセスし、上部に表示されている「デベロッパーモード」をONにします。 そして「パッケージ化されていない拡張機能を読み込む...」を押して、googlebookmarksディレクトリを選択すれば完了です。 普通の拡張のようにパッケージ化していないので、user.css, user.jsを編集後に設定をリロードする事ができます。

拡張を作っていて気付いたのですが、Googleのドメインをすべて指定するには、ひたすら列挙するしかないみたいです。これはひどい(笑)。 面倒なので.com, .co.jpだけに限定しましたが、他のドメインで利用したい場合はコードに手を加えてください。

2017年11月3日金曜日

フリゲ紹介: アレックスと最終戦争と9人の少女

アレックスと最終戦争と9人の少女VIPRPG 2014紅白で4位だった作品。 VIPRPG 2014紅白はエンチャントファームのインパクトが大きくプレイしていなかった作品が多かったのですが、改めて他の作品も色々プレイしてみたところ、この作品は非常に面白かった。



9人の少女ごとにストーリーが展開されていくので、かなりボリューム感がある作品でした。15時間くらいかなあ。 過去の関連作品も一緒に同封されており、それらをすべてプレイするともっとボリュームがあります。 過去の関連作品はプレイせずとも十分楽しめる内容でしたが、プレイしたほうが背景を理解しやすいかも。

見るゲ+戦闘ゲに絞った作品で、レベル上げや探索要素を完全に排除したRPGになっているのは珍しく、また面白い。 戦闘の作り込みが凄く、キャラクターが非常に多いのにサイドビューでどのキャラもヌルヌル動く (画像右上)。 作るのにどれくらい時間が掛かったんだろう…。

戦闘システムも練られているいるなあと感じました。 VIPRPGはキャラクターが多いので全キャラを登場させると人数が多過ぎて、 戦闘に登場させる事が難しくなったり、メンバーを選ぶのも面倒になる事が多いように感じます。 この問題を戦闘中のキャラクター入れ替えで解決したのは面白いなあと思いました。 また戦闘には登場しないサポートキャラが戦闘支援をしてくれるのも良くできていて、 まさにこれが欲しかったんだ!という仕組みでした。 (戦闘中にもっと支援してくれて、もっと戦闘キャラが多いようなシステムも面白そう)

戦闘は、序盤は楽々でしたが、終盤に近付くと色々考える必要があり楽しめました。 やや暗めのストーリーでしたが、終盤では様々などんでん返しがあり面白かった作品でした。

フリゲ紹介: マリィと賢者の森

マリィと賢者の森は、ふりーむ!のランキングに一瞬だけ載っていたのですが、絵が綺麗だったので目に留まった作品。シンプルな短編SRPGですが、面白いと思った作品。



タイトル通り、主人公のマリィと賢者の森を巡る物語です。 全4ステージと非常に短い作品ですが、適度な難易度でサクサクプレイできるのが良いと思いました。 難易度は「ふつう」と「やさしい」を選択できますが、ふつうでも気軽にプレイできるくらいの難易度と思います。 難易度だけでなく、ターン毎にセーブでき、消耗する装備品が少なく、キャラクターも膨張しないなど、 深くのめり込まず気軽にプレイできる設定になっていたのも良かったです。



長編SRPGも昔はかなりプレイしていましたが、上記のような要素が強過ぎると正直面倒に感じてきています。 ヴァーレントゥーガTactical Chronicleアストゥール戦記のような名作リアルタイムSRPGが登場した影響も大きいかも知れません。 マリィと賢者の森くらいのサクサク感でプレイできると、細かい事をほとんど考える必要がないため、大いに楽しめた作品でした。

他にも仲間にできるキャラクターに自由度があり、またすべて精霊というのも風変わりで新鮮でした。 シンプルながら良作だったと思います。

フリゲ紹介: 炎帝セイバー

炎帝セイバーは、最近Twitter経由で知った2002年のRPG。 評価が非常に高かったのでプレイして見ようかと思いました。 しかし今時2002年の作品を掘り起こす人は滅多に居ないだろうなあ…などと考えつつ検索してみると、なんと作者様が炎帝セイバーをAndroidに移植中。 そして炎帝セイバーの後継作品もAndroidでプレイできる。むしろ最前線だった!



そんな訳でAndroid版炎帝セイバーが出る前に、Internet Archiveからさっそく過去の配布ファイルを掘り起こして原作をプレイしてみました。 ロボットヒーローRPGで、このRPGの面白さはHPの一言に凝縮されているように思います。

「熱さとカッコよさ、その二つを追求して誕生したRPG、それが炎帝セイバーだ!」

…この言葉で説明する事がなくなってしまった気がしますが、まさに昔ながらのフリゲという感じで、疾走感は素晴らしい。 最近のRPGもシステムは進化しているので現在視点から見るとシンプルなRPGという印象ですが、 早く続きを見たいと思わせる感じはメイジの転生録に通じるところがあるかも。 うまく言葉にできませんが、爽快感があり(下画像)、シンプルに面白いという事なのだと思います。



気付けば一気にプレイし終わっていました。 この作品がAndroidでどのように生まれ変わるかも是非見てみたいです。 (それ以前に後継作品プレイしなくちゃ)