2018年4月10日火曜日

軽量ターミナル型ファイラー lf

ターミナル型ファイラーは非常に便利なので利用している方も多いのではないでしょうか。 私もpeco/fzfを利用した自作ファイラーや、VimFilerDirvishなどを使っています。

そんな中、lf という新しいターミナル型ファイラーが登場している事に気付きました。



lf の特徴は以下になると思います。
  • Go言語製なのでインストールが簡単で様々なOSで使える
  • vim っぽいキーバインド
  • 爆速
  • カスタマイズが柔軟

私の印象で言えば、Dirvish とよく似ているファイラーだと思います。 Vaffleともよく似ているかも。 jk で上下移動し、h で上ディレクトリへ戻る、l でファイルを開く事ができます。 外部コマンドは $ キーなどから呼び出すようになっている。

デフォルトの表示形式は、私はあまり好きではないですが、柔軟な設定ができるようになっています。 設定可能な項目は lf -doc で確認できます。 シンプルな1カラム型ファイラーにしたい場合は、~/.config/lf/lfrc に以下のように設定すると良いでしょう。
set hidden off  # 隠しファイルを表示
set nopreview
set ratios 1  # 1カラム表示
set info size:time  # サイズ・時間などの情報を表示

ファイル操作などのキーバインドは気持ち程度に設定されています。 私は FD っぽい動作をして欲しかったのですが、2画面表示での処理に難があるようなので、やや厳しいか。 Tipsで多少便利な使い方が提示されていますが、画面1から画面2へコピーみたいな事はできなそうです。 代わりにコピペみたいな感覚で操作できるみたいです。

Dirvish と同じように、ファイルを開くために使うファイラーかなあと思いました。 Dirvishと比較すると、ファイルを複数選択しやすい点や、ファイルを開き終わった後にフォーカスが lf に戻る点が違いますね。 この動作は lf を IDE にして使う人には便利かなあ。 面白いファイラーと思ったのでとりあえずメモしておきます。


私はログを ls -altr で探しつつ less で開く事をよくやっていたのですが、lf を使うと結構楽になりました。 lf $(cdp) をコマンドしておいて呼び出し、ディレクトリを移動し、st で時系列順にソートし、lf の less で開く。ログを見終わった後に lf にフォーカスが戻るので、ログ漁りが続行できる。 作業効率が上がりました。

2019-12-24: 気付いたら lf.vim が出てきて、凄く便利になりました。 vim 上でのファイル操作は、vimfiler 以外だと一番使いやすくなってきたかも。 yank っぽいファイル処理に慣れるのに時間が掛かりましたが、慣れてしまえば意外と便利な気もしてきました。 さらに lfcd というディレクトリ移動用のコマンドまで用意されて、かなり使いやすくなってきた。

Deep Learningで素子の寄与度を調べる

Random Forestでは特徴量の寄与度を簡単に算出できる (参考: PythonR) ので重宝していたのですが、Deep Learningでも似たような事が一応できます。

Deep Learningで特徴量の重要度を (なんとなく) 算出してみたい場合は、入力素子の結合強度を見ると良いでしょう。 強度が強いほど重要と言えるはずです。Kerasでは以下のように書ける。
weights = model.get_weights()
importances = list(map(lambda n:numpy.sum(np.abs(n)), weights[0]))
indices = np.argsort(importances)
# 重要度順に表示
for index in indices:
    print('%d: %.8f' % (index, importances[index]))
# 素子順に表示
for i in range(0, len(importances)):
    print('%d: %.8f' % (i, importances[i]))
model.get_weights() の一列目は入力素子への重みなのでこれを利用しています。 model.get_weights() で取得できる構造は ここ を参照してみてください。 他のライブラリでも同じ事はできるでしょう。

もう少し正確に算出するには中間層の重みも考慮したほうが良いかも知れませんが、 重要度が高くても過学習の原因になる事もあり絶対的な指標ではないので、適当めの算出でも良いかと。 特徴選択の参考にする程度なら結構有用かも知れません。


他にも特定の素子が精度に与える影響なども以下で確認できたりします。

入力素子 (特徴量) の寄与度

調べたい特徴量を0に置換した場合と、しない場合の精度の差分で寄与度を確認できます。 例えば前方16個の素子の寄与度を調べたい場合、Kerasでは以下のように書ける。
def mask(features):
    features[:16].fill(0.0)
    return features

x_test = numpy.array(list(map(lambda n:mask(n), x_test)))
model.evaluate(x_test, y_test)

先に述べたように model.get_weights() の一列目は入力素子への重みなので、そちらを0置換しても良いです。 その場合は以下に述べる方法で可能。

中間層の素子の寄与度

調べたい中間層の素子の重みを0に置換した場合と、しない場合の精度の差分で寄与度を確認できます。 例えば第2中間層の前方16個の寄与度を調べたい場合、Kerasでは以下のように書ける。
weights = model.get_weights()
weightsl[2][:16].fill(0.0)
model.set_weights(weights)
model.evaluate(x_test, y_test)

素子の重みを0置換して評価すると、過学習の起因となる素子を調査できるので便利です。

2018年4月3日火曜日

フリゲ紹介: ティルキッス ~Princess Shade~

ティルキッスは2017/12/31からフリー化された探索アクションRPG。 元々はシェアウェアだった事もあり、クオリティは非常に高い。 2006年からこのクオリティだったのかと思うと凄いです。



主人公のティルキッスが森で出会った女の子と一緒に迷子になっているところから物語は始まります (左下)。 騎士になる事を目指しているティルキッスは、剣と魔法を操る事ができます (右下)。



バトルはアクション主体。 剣で斬りつけるだけでなく (左下)、武器固有の魔法も使えたりして (右下)、武器一つ一つにも攻撃力以外の特徴があります。 この特性をうまく活かさないと勝つのが難しい局面も多く、よく練られているなあと感じさせられます。



フリーでプレイさせて頂ける事に感謝しないといけませんね。大いに楽しませて頂いた作品でした。

2018年4月1日日曜日

フリゲ紹介: モギジェット

何となくアクションゲームがしたくなり、色々と検索していました。 そこで知る人ぞ知る ひもじ村 を久々に覗いてみると、 いつの間にかゲーム数がとんでもない量になってる!

ひもじ村のゲームは基本的にかなり高難易度です。 その代わり中毒性の高いゲームが多く、根強いファンが多い事が特徴だと思います。 私は昔、パイナッポや忍者ゲームにハマっていたのですが、 今ははかいマンがパイナッポの後続になっているみたいです。さすがの難易度で、これはパイナッポより難しいかも。 ちなみに私はパイナッポもクリアできていません。

2003年以降の作品はほとんど未プレイなので、色々プレイしてみたのですが、やはりどれも面白い。 私は壁蹴り系アクションは苦手なので、壁蹴り要素の少ないモギジェットやてつはう、くせもん、てっぽマン、鉄球マンなどが良かったです。


とてもすべては紹介しきれないので、今回はその中でも最新作のモギジェットを紹介してみます。 ひもじ村の公開ゲームの中ではおそらく難易度は低めで、様々な方が楽しめると思います。 他のゲームより難易度が低めに感じるのは、たぶんどうしようもなくなって詰むパターンが少ないから。



モギジェットはジェット装置を積んだ主人公がライフルを手に暴れ回るゲームです (左下)。 Shiftキーでジェットを飛ばし、Ctrlキーでライフルを発射 (右下) というシンプルな操作しかないのも良い感じです。 爽快感も高い (ただし流血要素あり) ので、手軽に楽しめるゲームと思いました。



中盤以降はさすがに難易度が高めですが、パイナッポや忍者マンで鍛えればイケます!