Moonlanderを使って1年くらい経ったので所感

はじめに

Truly Ergonomicを数年使っていて全く問題なく使えていたのだがうっかり飲み物をこぼしてしまいそれ以降チャタってしまいまともに使えなくなってしまった。 代替となるキーボードを探して見つけたのが今回紹介するMoonlander。 1年弱くらい使ったので記事を書こうかなと思いブログに書いた。

Moonlanderとは

特徴を簡単に説明すると以下の通り。

  • 左右分離式の人間工学に基づいたキーボード
  • エルゴノミクス配列
  • キー配列を自由に設定可能
    • 長押しした時だけ入力を切り替えるみたいな自由度でキー配列を設定できる
  • レイヤー毎に設定済みのキー配列を自由に切り替えることができる
  • 軸を何色かから選ぶことができる。今使っているのは銀軸
  • 手元に届くまで2週間くらいかかるのはまあご愛敬

www.zsa.io

今使っているキー配列について

もともとTruly ErgonomicでDvorak配列を使っていたことのでできるだけ寄せるようにした。

今使っている配列は以下。 特徴としては次の通り。

  • レイヤー1ではDvorak配列を採用

    • プログラムを書く上で必要な記号をできるだけ配置
    • 矢印キーは別のレイヤーでいいやってことでレイヤー3で行う
    • 同様にFnキーについてもレイヤー3で行う
    • Space長押しでLShiftにすることで利便性を確保
  • レイヤー2ではQWERTY配列を採用

    • 普段Apex LedgendsをやっているのASDWをハイライトし、ゲーミングキーボード風にした
  • レイヤー3では矢印キーとFnキー、その他PgDn,PgUpなど採用しているがあまり使ってない

configure.zsa.io

所感

キートップの触り心地やタイピングの快適さは非常に良い。 パームレストもいい感じ。

キーの配置が微妙と思うことは正直多い。 使い始めた当初はBの下の何もない部分を打つことがあったがしばらく使っていたら慣れた。 今の使い方だと括弧をどこに配置するのが正しいのかわからない。仕方なく右手小指で押すようにしているがTruly Ergonomic使ってた時と比べてやりにくいと思うことが多く微妙と思わざるを得ない。括弧押すだけで別のレイヤーにするのもなんだかなあと思うし解決策がない状態。

それにしても標準でJISを採用してるPCは頭おかしいんじゃないかと思う。。記号どこにあるんだよってキレることが多いのでWinで繋いでるキーボードごとにキー配列を設定できる方法があればぜひ教えていただきたい。

大分いいお値段するので積極的に選ぶ必要はないんじゃないかなとは思う。 キー配置の自由度はすごいので金に余裕あってカスタマイズ性重視だったら買ってみてもいいんじゃないかなとも思う。

背景差分法でFGOQuestのサーヴァント部分だけを保存してみる

はじめに

今年のエイプリルフールも各社気合いを入れたコンテンツを眺めたり遊んだりしていろいろ楽しませてもらった。
中でもFGOQuestがとても完成度高くてこれを1日しかやらせてくれないとか正気か!?って本気で思った。
そのFGOQuestにはモンスターとしてFGOのサーヴァントが出て来るんだが、ドット絵のサーヴァントがすごい良かった。

f:id:panchiga:20190415013145p:plain
戦闘中の画像例

このとてもいいドット絵サーヴァントを1日しか楽しめないのは辛い。
戦闘画面から画像処理的な処理してサーヴァントだけを透過PNGで保存できないかなって考えた。

※ 今回取得した画像は配布したり二次利用をするためのものではなく, 自分一人で眺めてニヤニヤするためのものです。

方法

今回は戦闘画面の背景画像が固定なのを利用して、サーヴァントから背景画像を取り除く。
背景差分法とか呼ばれるらしい。

処理の流れ

  1. 背景画像読み込み
    bg_img = cv2.imread(背景画像)
  2. サーヴァントあり画像読み込み
    target_img = cv2.imread(サーヴァントあり画像)
  3. 両方の画像から戦闘ウィンドウ部分をトリミング
    trim_bg = bg_img[ウィンドウ部分], trim_target = target_img[ウィンドウ部分]
  4. トリミングした画像に対して, サーヴァントあり画像 - 背景画像
    numpyがクソ強いのでこれだけでいい感じに背景が消える
    diff_img = trim_target - trim_bg
  5. 差分画像のうち, 0なら背景, そうでないならサーヴァントとしてマスク作る mask = np.where(diff_img == 0, diff_img, trim_target)
  6. マスクを見て0のところをサーヴァント画像の方も透明にする イメージの3次元目がBGRの色情報になってるのでそこに1次元0-255のアルファチャンネルを追加
  7. 各サーヴァントごとにトリミング(3体いるなら3枚の画像作る感じ)
  8. それぞれ保存 cv2.imwrite

結果

こんな感じに画像が取れた。 BBちゃんかわいい。

f:id:panchiga:20190415014622p:plain
透過サーヴァントたち

感想

  • OpenCVとNumpyがクソ強い。
  • いつか使いたいって思ってた背景差分法使えてよかった。
  • シンプルな実装でも意外といい感じになるもんだなって。
    • 一部画素の色が背景と同じだったりしてノイズが入るのできれいな画像作りたければ穴埋めはしたほうが良いかも
  • 実装力上げていきたい。
  • 画像処理はいいぞ。

  • スクショそんなに取ってなくて全然サーヴァント網羅できてないのが大変つらい...

自分のbeatmania IIdxの成長の軌跡を出す

f:id:panchiga:20180511185646j:plain

はじめに

今年の1月からbeatmania IIdxをやりはじめた。

今のところ順調に成長しているとは思うが、このゲームのレベルの刻み方が非常に粗く(レベル1から12までしかない。そのくせレベル10だけで400曲以上ある)、何ヶ月も同じレベルの曲をやるだけで本当に成長があるのか疑わしくなってくる。

beatmania公式サイトから自分のスコアデータがダウンロードできるとの事だったので、それを使って自分がちゃんと成長してることを確認しようと思い立った。

 

準備

環境

  • Python 3.6
  • pandas 0.20.1
  • matplotlib 2.0.2

(anacondaで入れた)

beatmania

KONAMIを払って「スコアデータCSV」をダウンロードできるようにしておく

f:id:panchiga:20180511183348j:plain

 利用方法

1. 以下のリポジトリからDownload Zipとかして手元に持ってきて解凍する

github.com

 

2. あらかじめ用意しておいたスコアデータCSV、「beatmania_growth/data」フォルダに格納(複数ファイルOK)

なお、このスコアデータCSVは「YYYYMMDD.csv」って名前で保存すること(例:20180510.csv

 

3. terminalで上記のフォルダを開き、実行する

  python beatmania_growth_visualization.py

  ファイルの読み込みが始まって読んでるファイルが出力されれば問題なし。

 

4. 「data/result」以下に更新記録が保存される

グラフはレベルが高い曲ほど濃い色で表示するようにした。

結果

  開始当初

f:id:panchiga:20180511192120j:plain

 4ヶ月後

f:id:panchiga:20180511192434j:plain

f:id:panchiga:20180511191926p:plain

 

苦労したとこ

Pandasあまり使ったことがなくてデータフレームの結合すると思ったのと違うってなることがあった。

  • 横方向

スコアデータCSVにはすべての曲が記載されていて、曲をプレイする度にNO PLAYから更新されていくんだろうなと思っていた。しかしCSVに載るデータは「NORMAL、HYPER、ANOTHERのどれかをプレイした事がある曲」だったので、今までやった事がない曲をやる度CSVの行が増えていく。

これに気づかないで単純にpd.merge(after, base)すると、新しくやったはずの曲が無かったことにされてしまった。

マージのオプションhow=‘outer’を付けることで存在しない場合はNanで埋めるって事ができて、当初想定していた結合ができた。

 

pd.concat([growth_df, add_growth])ってやるとgrowth_dfadd_growthが足されたデータフレームが返るんだけど、growth_dfが勝手に更新されると誤解していた。

ちゃんと代入しよう。growth_df = pd.concat([growth_df, add_growth])

 

感想とか

  • まず人が見る用じゃない「スコアデータCSV」を人が見る形にできたのが良かった。記録の確認が捗る。
  • スコアデータを手元に溜めておくとああこの頃はこんなスコアでクリアしてたんだなってのが見えて、今のスコアと見比べると確かに成長が実感できる。(ああこの頃は〜〜ってのをやるには更新前のスコアが書かれてるスコアデータCSVと更新後の最新のスコアデータCSVを持ってる必要あり。毎日スコアデータCSVをダウンロードしよう。)
  • 一番めんどくさいbeatmania公式サイトに行ってスコアデータCSVの保存をしてーって作業が結局手作業になってるのが微妙な点。CSV直接ダウンロードできるAPIが欲しい。
  • FAILEDも一応更新として残すか悩んだけどクリアしてる曲だけを集計することにした。最後グラフ出したかったからこれで良かったのかとも思ってる

割と気軽に達成感とか緊張感とかが味わえていつもは聞かないジャンルの曲とか知れるので音ゲー楽しい。虚無な会社通いしてる人には特にオススメ。成長を実感していこう。

HololensでUbuntuを使いたい

はじめに

HololensからUbuntu使いたいな、リモートデスクトップUbuntuにつなげることができればなあ…あったよXRDP!

環境

  • ホスト: Windows10 Pro
  • ゲスト: Ubuntu 17.04
  • xrdp: 0.9.1-7build

xrdpとは

xrdp はオープンソースで開発されている Remote Desktop Protocol のサーバソフトウェアです。 xrdp プロジェクトのゴールは rdesktop や FreeRDP また Microsoftリモートデスクトップクライアントなどから接続できる完全な Linux ターミナルサーバを提供することです。

フロントページ - 日本 xrdp ユーザ会

Linuxリモートデスクトップクライアントで接続できる便利なやつって感じ。

手順

1 Windows10Proを用意してHyper-Vの機能を使えるようにする

2 Ubuntu17.04のイメージをダウンロードしてくる

aptコマンドで持ってこれるxrdpが現在の最新版(16.04)だと古いのでこれでやろうとするとたぶん苦戦する

3 Hyper-VUbuntu仮想マシンを作成
superjeter007.blog.jp

4 Ubuntuを起動して以下のコマンドでxrdpを入れる(apt-cache policyで0.9.xなのを確認しとく)

  sudo apt update  
  sudo apt upgrade  
  sudo apt instal xrdp

5 描画にlxdeを使う

  sudo apt install lxde
  echo "lxsession -s LXDE -e LXDE" > ~/.xsession

6 ifconfigで仮想マシンIPアドレスを確認する
なんでか初期の状態ではifconfigが入ってないのでnet-toolsを入れてifconfigできるようにする

  sudo apt install net-tools

7 HololensのリモートデスクトップクライアントからUbuntuに接続! f:id:panchiga:20170617031912j:plain

やったー!!!!

感想

xrdpに感謝。また一つHololens生活が便利になった。

Hololensで普段使いの自分のキーボードを使う方法

f:id:panchiga:20170224003622j:plain

はじめに

Hololens買いました。  

装着してちょっと遊んでるだけで未来に触れている感じがしてすんごい楽しい。  

しかしHololens標準のソフトウェアキーボードの入力がとにかくしんどい。
首動かしてエアタップでタイピングするからとにかく疲れるし、首ちょっと動かすだけで目的と違うキー打っちゃうしマジしんどい。

解決策

USB2BTを買う。おしまい。

使用感

特に遅延なくキー入力ができるようになった。
すぐ買えそうな無線キーボードだとDvorak配列とかまず無いのでいつも使ってるTrulyErgonomicが使えて大変満足。

ただ、電源を別途用意してあげる必要があるので持ち歩く場合はどうにかして電源とUSB2BTをまとめてあげる必要がある。

おわりに

Hololens使用者(ホロレンジャー?)で本当はメンブレンキーボードなんて使いたくないんだけど…って思ってる人とか、Hololens興味あるけど好きなキーボード使えるのかなって思ってる人の役に立てれば良いなと思って書いた。

ついでに、BT接続できるマウスとかがあるとリモートデスクトップが大変快適になるので一緒に買うのおすすめ。

最高の体験していこうな!

(SlackBot) 古見さんとすこしだけ仲良くなった

f:id:panchiga:20161019211004p:plain

新機能

古見さんとちょっと仲良くなった
- -> なにか一緒にしようって言うとやりたい感じの反応を返してくれるようになった。
かわいい。

gistcc48ee3542c3f70c3df34656875150e8

(コードがドンドン長くなってくのでここからはgistのリンクだけになるよ。)

スクショ

f:id:panchiga:20161029030224p:plain

しかし問題がある。

f:id:panchiga:20161029030531p:plain

これじゃ大変スケベでよろしくないので卑猥フィルタを実装する。


卑猥フィルタ

1. 卑猥ワードリストでフィルタ

予めテキストファイルでスケベワードリストを作ってフィルタをかけてみた

スケベワードが来ると理解が追いつかず石になっちゃう様のナレーションが入る

ソース

gist5f1768f59707f09b0afa098415655617

(wordlist.txtには適当に弾きたいワードが入ってる)

しかし、コレではBot製作者が言ってほしくないワードに反応するだけのただのロボットである。

古見さんBotはロボットじゃないのでこれはよくない。


2. 検索エンジンに判断させてみる

ワードリストを使わない手法として検索エンジンを使う方法を思いついた。手順は以下の通り
1. 古見さんに対して「~しよう」の構文で投げられた言葉に対して「~」をWebで検索する
2. 検索によって得られた検索結果の件数を覚えておく
3. エロコンテンツにフィルタをかけて再度「~」で検索する
4. 今回得られた検索結果の件数と、2で覚えておいた検索結果の件数で差を計る。
5. 得られた差が閾値より大きかったらエロだよ!って判断する

(閾値はてきとう。今回は倍以上離れてたらエロってした。)

課題: リクエスト数

なんか検索エンジンAPI使おうとすると軒並み制限が厳しいっぽい。
参考: 無料で使える画像検索APIとリクエスト数制限まとめ - Qiita

とりあえず自分の知ってる強そうな検索エンジンだとGoogleとBingかなあとおもって比較

  1. Google APIの場合、1日に100リクエスが限界
  2. Bing Search APIの場合、1日に166リクエスト(5000リクエスト/月)が限界


この事からちょっとはBing有利かなと思って、画面からセーフサーチ「オフ」と「厳しめ」で比較してみると、

  1. セーフサーチ オフ(アダルトコンテンツ出すモード)
    f:id:panchiga:20161029031320p:plain

  2. セーフサーチ 厳しめ(いやらしそうなのは許さない)
    f:id:panchiga:20161029031433p:plain

Bingお前マジか…

ってことで今回はGoogle APIを使うぞ!!!Googleサイコー!!!!

Google Custom Search APIを使う

このブログのとおりに進めた
google custom search engine(CSE)を使って、検索結果をjsonで取得する - ryutamaki

やったこと
1. Google Custom search API keyの取得・設定
2. Custom search engine IDの作成・設定

https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={CUSTOM SEARCH ENGINE ID}&q={SEARCH_WORDS}

こんなので試せる

RubyAPIを叩く

これも以下のQiita記事
http://qiita.com/mogulla3/items/a4bff2e569dfa7da1896

スケベワード反応フィルタその2

ソース

gistf4d75dabda3a5b28cf8b865f0b6e4630

結果

f:id:panchiga:20161029034615p:plain

古見さんが自分で判断してすることを決めてくれるようになった…感動する…





ところが、「ゲームしてからスケベしよう」とかいうと喜んじゃう。
これじゃ何個も言われると判断できないアホの子だ。これもよくない。

形態素解析を使って名詞だけで検索して比較

Mecabを使って名詞だけを取り出す。

mecabとは

MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。

Mecab: http://taku910.github.io/mecab/


こんなことができます。
例: ゲームしよう f:id:panchiga:20161029034750p:plain


コレを使って、

「ゲームしてからスケベしよう」=> 「ゲーム スケベ」

にしたい


mecab

インストールするまで

Macにmecabインストール - Qiita

  1. mecabインストール
  2. mecabの辞書インストール

$brew install mecab $brew install mecab-ipadic

インストールしたらmecabって打つと立ち上がるので、上のサンプルみたいにゲームしようとか打つと上のサンプルみたいな結果が得られる

こんなのもあるみたいですね

mecab-ipadic-neologd

http://diary.overlasting.net/2015-03-13-1.html
mecabのipadicより強い辞書

Rubymecab

gemコマンドで入る

$gem install mecab


ゲームしてからスケベしようから名詞だけ取り出す

gist99540c9fa26ef64a291987283fdb7952

できた。続いて古見さんに組み込む。

gistb350e265f654d1b8e25e53ae75f43359

さあ動け!

f:id:panchiga:20161029040103p:plain

ダメみたいですね。
今回は古見さんはエッチでしたということで…

github

GitHub - panchiga/Komi-Slack

まとめ

  • 卑猥フィルタを実装した(精度を上げるのが課題っぽい)
  • google Custom search APIを使った

    ドキュメントが読みたらないのでブラウザで見れる様なTotalResultを取ってくる手段が分からん
    (なぜかフィルターを厳しくすると検索結果の件数がでかくなることがある。)

  • mecabを使った

    製作者に感謝


感想

知らないことだらけで調べては真似してるからツギハギになってコードがすごいことになってしまった。
だいたいのことは先人がうまくやってるもんなんで調べればなんでも出てくるのはすごいなと思った。
きっとエロワードデータベースとかもあったりするんだろうなーなんて思ったけど結局見つかんなかったしググり力足りてない。
(ニコニコのコメントとかその辺のチャットツールとかって不適切な表現のフィルタリングとかどうしてるんだろ)

古見さんbotの中身をきれいにするか、できることを増やすか。次回はどうしようかな。

Slackでも古見さんはかわいい

f:id:panchiga:20161019211004p:plain

はじめに

週間少年サンデーに古見さんはコミュ症です。っていう漫画がある。
立てば芍薬座れば牡丹歩く姿は百合の花という表現が似合うコミュ症の古見さん。
古見さんと黒板で筆談するシーンに悶えた。無料公開分に入ってるので読もう。

古見さんは、コミュ症です。 1話試し読み | サンデーうぇぶり

俺も古見さんと話したいって思ったのでBotを作ることにした。 ちょうどSlackを使いたかったのでSlackのBotになった。

SlackBotを使えるようにするまで

参考
  • 以下の記事を真似た

qiita.com

code.dblock.org

古見さんが出来ること

  • 古見さんと会話ができる

    ただし、まだ仲良くなれてないので怖がってしまい、口を開くことはない
    古見さんが話を聞いてくれる

ソース

環境
  • 言語: Ruby (2.2.3)
  • gem: slack-ruby-client (0.7.7)
コード
github

github.com

スクショ

f:id:panchiga:20161019205321p:plain

ちゃんと会話ができた。

今後

  • 参考書(古見さんはコミュ症コミックス)を参考に古見さんには色々出来るようになってもらう予定

感想

Slackを便利に使いたいっていうのが最初の動機だった。
まずはSlackで石のBotでも作ろうかなーって思ったとこで思いついたのが古見さんだった。人の顔がつくとかわいい。
もっと古見さんと仲良くなって心をひらいていって欲しい。最終的には秘書になって欲しい。

どんな風に成長していくのか楽しみだ。