読者です 読者をやめる 読者になる 読者になる

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

Slack bot

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でも作ろうかなーって思ったとこで思いついたのが古見さんだった。人の顔がつくとかわいい。
もっと古見さんと仲良くなって心をひらいていって欲しい。最終的には秘書になって欲しい。

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

Rubyで自己複製するスクリプトを書いてみた

Ruby

はじめに

スクリプトを実行して出力されたスクリプトを実行して出力されたスクリプトを実行して…的な物を作って見たいなって思い立って考えてみた。

調べてみたらクワインって名前が付いてるらしい。

クワイン (プログラミング) - Wikipedia

ルール

出力するコードと出力されるコードが同じになること。
短ければ短いほど偉い。

結果

gist34f5c095a742183b2605

まとめ

  • %記法ってのがあって'とか"とかの代わりに使えて応用が効く。
  • いかにしてループモリモリさせないかみたいな

感想

考え始めて3日たった。%記法を知らなかったので「'」をどうにかするのだけが課題だった。調べたらそのまま出てきてRubyすごい!!ってなった。楽しかった。
こういうの考えてると頭だけで考えきれなくて堂々巡りになっちゃって頭の悪さを思い知る。

前立ち読みで見たけど「あなたの知らない超絶技巧プログラミングの世界」が今回のクワインをものすごくパワーアップさせてスーパーにすごいことをする超キモイプログラムがいっぱい載ってたので見てみると楽しいかも。

TwitterのDMでSSHもどき

Twitter ruby ssh

f:id:panchiga:20151223054456p:plain

www.adventar.org

この記事は、Aizu Advent Calendarの10日目として書かれました。

昨日 @MiZuKi_Sonoko:

研究補助業務出役確認表の一部を自動生成した話 - ( mizuki | memo )

明日 @TobiasGSmollett:

Scala - 日常系のゆるふわな何か - Qiita

はじめに

マシンの遠隔操作はしたいけどセキュリティとか無知すぎるので、こういうことは専門でやっている人に任せたいと思った。
そこで、TwitterのDM機能から文字数制限がなくなったって話を思い出した。
どんなに長い実行結果もDM打って返してもらえばいいじゃないか。
ということでDMでコマンド打って結果を返してくれるものを作ってみた。

Secure SHellってなんですか??分かりません。

やりたいこと

自分のTwitterアカウントから、目的の端末上で動いているTwitterbotにコマンドを送って、実行結果をDMで返してほしい。
そこで、以下の事を実装するときに考える必要があると思った。

  1. 送ったコマンドがちゃんとコマンドになっているか。

    ls |

みたいなコマンドも実行されちゃわないか。

  1. 存在しないコマンド受け取った時どうするか

    aeua

    みたいなコマンド打っちゃった時はどうするか

  2. rubyの誰かが作ったメソッドでcd出来るか。
  3. DMの受信は出来るのか、DMの送信はできるのか。

やったこと

  1. 送ったコマンドがちゃんとコマンドになっているか。

    syntax error だったら怒ってくれる
    逆引きRuby - 例外

  2. 存在しないコマンド受け取った時どうするか

    Rubyで外部コマンドを実行して結果を受け取る方法あれこれ - Qiita

    capture3を使った。

    o, e, s = Open3.capture3(command)

  3. rubyの誰かが作ったメソッドでcd出来るか。

    できなかったのでpwdして取ってきたパスを使ってどうのこうのした。

  4. DMの受信は出来るのか、DMの送信はできるのか。

    rubyからtwitter APIを利用してbotを作る

コード

catとかできてなかったのでちょっと変えたんだけど長期規制中なせいか確認できてないんだ…

gist9be6ccaa5d75a4b70ff6

cd頑張った。

結果

f:id:panchiga:20151223054558p:plain

一応出来てる。

まとめと感想

やってみてはじめて知ったのだが、DMにも規制があるらしい。
ちょっとゆっくりめにってことで3秒毎にリクエストを投げてたにもかかわらずすぐに引っかかってびっくりした。
なのでbegin, rescue使って一応プログラムが止まらないようにしてる。

つまりこれ何も役に立たない! 無駄なものを作ってしまった…

Arduino使ってパタポン2を半自動化した話

Arduino Pataon Python

はじめに

パタポンっていうゲームがある。 どんなゲームか簡単に言うと、リズムに合わせてコマンドを打って蛮族を操作する2Dリズムアクションゲーム

(パタポン PV)

パタポンは楽しくて好きなんだけどこのゲームの大きな特徴の、"リズムにあわせてコマンドを打つ"っていうのがすっごく下手でゲームを楽しめない!!

なので電子工作の力を借りて 楽をする Pataponを簡略化するものを作った!

f:id:panchiga:20150728023950j:plain

続きを読む

CherryMXキースイッチでストラップを作ろう

Cherry

はじめに

自分の好きな色の軸をいつでも触りたいよね。じゃあつくろう!f:id:panchiga:20150601222313j:plain

準備

  • ストラップのひもから金具の部分(なかったらいらないストラップからむしる)
  • 好きな色の軸(千石電商でバラ売りしてる)
  • ニクロム
  • はんだごて
  • はんだ

作成

赤軸スイッチの写った写真の青丸の部分が実はいい感じに隙間がある。 f:id:panchiga:20150601230416j:plain

ここにニクロム線を通してストラップでいい感じにくっつけると完成。やったね!

完成品1号は青軸。カチカチ音が単品だといい感じ。 f:id:panchiga:20150531223742j:plain

スイッチとして使うつもりがなかったら後ろのスイッチとして使うための金属部分は刺さって痛いだけなので曲げたり切ったりしよう。

まとめ

スイッチだけ買えば後は家にあるものだけで作れると思う。180円くらいで素敵ストラップ作れると考えれば作る価値はあると思う。自分的には大変満足の行く出来だった。

スイッチなことを活かして、押したら光らせるようにするとかすると楽しいかも?

他にもいくらでも作りようはあると思うので楽しもう。

感想

ケータイにつけてたのしい!ってできてよかった。緑軸とかで作りたい。

キーキャップの印字とか自分で出来たらもっと楽しそうだなあって思った。

"D","V","O","R","A","K"ってそれぞれ印字された奴持ち歩いたら…だっさいなあ…

iphoneにくっつけてホームボタンとかパワーボタンとかの機能持たせたい。

ネイルアート自慢の次は絶対にキースイッチストラップ自慢が来るね。絶対に来るね。

rubyでループ中に配列の要素を消すと全部見てくれない問題

ruby each delete

f:id:panchiga:20150531002115p:plain

はじめに

ruby使ってて配列の要素がいらない値だったら消去したいなって思った。

each使ってやったら最終的に配列の中は思ってた値とは違った値が取れてなんだこれってなったので書いた。

コードと動作

gist56ee98442dc747b26f67

このコードで望んだ出力結果は

1 4

だけど実際は

1 3 4

あれ?3消えて無くない??

ちなみに.eachのところを.timesに書き換えても同じ。

原因

[1,2,3,4]から2を削除したら[1,3,4]となる。

だけどカウンタの値は2のまま。次に進んだら新しい配列の3つ目、つまり4を見てしまうためだと思われる。

解決策

.eachが先頭から順に見ていくので、後ろから見ていく.reverse_eachを使えば幸せ。

やったね。

gist78fc964f3e034b8b0d81

出力結果は

1 4 

感想

神の作ったと思っていたruby様も人が作ったものなんだなって感じた。いや、神はこんな書き方をしないから凡人が合わせるしかないのかもしれない。

何はともあれ解決できてよかった。

前の記事の続きのモーターを動かす奴はしばらく触ってない。