カテゴリー別アーカイブ: 研究開発・作品紹介

深遠なるニッパーの世界

これは慶應ロ技研 Advent Calendar 2016 23日目の記事です。

←22日目:おいしい倒立振子 / 24日目→乞うご期待


挨拶

こんにちは。「冬はつとめて」とは言いますが、こう寒い朝が続くと起きるのがどんどん遅くなってしまうimhotep310です。昔の人は偉いですね。ブログどころかTwitterもやってない身としては慣れないブログ投稿にビクビクしています。果たして私は正しく投稿できるのでしょうか!? 続きを読む

広告

ロギ犬をベクタ画像にしてみた

こんばんは,僕はロ技研のアイドルであるロギ犬のプロデューサーを自称し,ロギ犬に変わる新たなマスコットを擁立せんとする闇の組織と日々戦っているせきごんというものです.急遽アドベントカレンダー20日目に参加することにしましたが,運悪く2日連続ロギ犬ネタとなってしまいました.

ロギ犬は華やかさが欠片もないシンプルなデザインですが,シンプルであるからこそ,絵心がない人にも簡単に書けるという素晴らしい特徴を持っています.長方形を9個並べるだけで書けるマスコットキャラ.いいですね.

最近,長方形だけで書けるということはロギ犬をベクタ画像にしたら軽量になるに違いないということに気が付きました.デザインした人もそのあたりを考慮して作ったのかと思いましたが,部内のリソースにベクタロギ犬は見当たらなかったので作ってみました.とりあえずInkscapeでトレースして,svgoで最適化したところ,pngで7kBだったロギ犬がsvgで1kBになり85%軽量化しました.しかもベクタ画像なので幾らでも拡大できます.

残念ながらwordpressはデフォルトでsvgに対応していないようなので,リンクを貼っておきます.

https://drive.google.com/open?id=0BwvCu9TdNxuGQVlQRlhpMHZzOFE

作っている途中,実はロギ犬の右耳は長方形ではなく台形であるということに気づいてしまいましたが,まあ一箇所台形にしたところで対して容量は変化しないので台形にしておきました.

部内での地盤固めだけでなく,対外的にもロギ犬を押していくことで,マスコットとしての盤石の地位を確立していきたいです.

PythonでTwitterAPIをいじろう [Advent2016]

これは慶應ロ技研 Advent Calendar 2016 13日目の記事です。

←12日目の記事 / 14日目の記事→


ご挨拶

どうもこんにちは、tokkyo13です。こうやって、ブログとかを書くのは初めてなので緊張しています。今も、震える右手を左手で必死におさえながら文字を打っています。今回Advent Calendarに参加するにあたって、なんのネタもなかったので、1,2日かけてPythonでTwitterを操作する方法を模索していました。この記事はそれを2,3日前の僕に解説するつもりで書いたものです。未熟者ですが、どうぞ宜しくお願いいたします。


APIとは?

さて、タイトルから分かる通り、この記事のテーマはTwitterです。皆さんはTwitter 使ってますか?使ってる、あるいは使ったことがある人ならわかると思いますが、Twitter上にはbotなるものが存在しますね。定期的に同じことをつぶやいたりする、あれです。(ちなみに僕はバイオゴリラbotが好きです)

でもあれ、どういう仕組みでうごいてるのか気になりませんか? 気になれ!

結論から言うとbotの機能はTwitterが公開しているTwitterAPIを利用して実現しているんです。それだけじゃないです。botに限らず、(みなさんが一度くらいはしたことがあるであろう)アプリ認証を求めてくるサービス、さらにはみなさんのスマホにインストールされているTwitterアプリでさえ、すべてTwitterAPIを利用しています。

APIというのは、僕が理解できた範囲で言うと、ウェブサービス(Twitter、Youtube、Amazon…etc)が、外部向けに公開している、各サービスへアクセスする方法のようなものです(要出典)。APIが公開されているからこそ、botがTwitterにアクセスできるし、ウェブページにYoutubeの動画が埋め込めるし、アフィカスが稼げるというワケです。

ということは、このAPIなるものを利用すれば、Twitterでなにか楽しいことができるはず!!ということですね。


TwitterAPIをどう使うか

では具体的に、公開されているTwitterAPIとはどのような情報なのか。簡単に言うと、「このアドレスにこういうリクエストを送信すると、こういう情報が返ってくるよ。」のような情報です。これをどんな形で使うかは人それぞれで、いろんなプログラミング言語で使えます。(世に出回っている解説書ではPHPのサンプルコードが多かったです)

僕はPythonというプログラミング言語をつかってみたいなぁ、と前々から思っていたので、それを使うことにしました。(細かいこと言うと、今回使ったのはPython3です)

PythonでTwitterAPIを使う方法を調べると、TweepyというTwitterAPI用のライブラリが存在することがすぐにわかりました。ライブラリというのは、「汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの」(wikipedia) だそうです。

やるべきことがだんだん明確になってきましたね!


Tweepyのインストール

注:これ以降は環境によって多少違いがあると思います。僕の環境は、macにPython3がインストールされている状態です。(時間の都合上、Pythonのインストールについては解説しません。ググってください)

では早速Tweepyのインストールからやっていきます。以下の3ステップで終わります。

  • get-pip.pyをこのページからダウンロードする。(リンク先のページ内にある、get-pip.pyというリンクを右クリックして、保存を選びます。)
  • ダウンロードしたファイルをターミナルで実行する。(ファイルを保存したディレクトリに移動してからでないと実行されません。例えばデスクトップにファイルを保存した場合、以下のように入力します)
$ cd desktop
$ python3 get-pip.py
  • Tweepyをインストールする。以下のようにターミナルに入力します。
$ pip install tweepy

これで、Tweepyのインストールは完了です。


各種アクセスキーを入手する

Tweepyもインストールできたし、いよいよツイッターAPIをいじれる!……かと思いきや、まだです。まだやることがあるのです。それはアクセスキーの入手です。

TwitterはAPIを公開していますが、そのAPIを使うためには4つのカギ(暗証番号)が必要なのです。以下、その手順を説明します。

  • ツイッターアカウントを作る。(当然ですね)
  • ツイッターアカウントを電話番号と紐付ける。このページで設定ができます。
  • Twitterアプリを作成する。このページでCreate New Appと書いてあるボタンをクリックします。するとこのような画面が表示されると思います。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-14-33-57

Nameは作成するアプリの名前です。すでに存在する名前でなければなんでもいいです。32文字以内です。

Descriptionは作成するアプリの内容についての説明です。めんどくさいですが、10文字以上は何か書かなくてはいけないようです。適当に埋めときましょう。

Websiteは作成するアプリが存在するウェブサイトのURLを入力するところです。今回はまだWebアプリを作成するような段階まで進まないので、なんでもいいです。僕は、自分のブログページのURLを入力しておきました。

Callback URLは、詳しく調べていないのですが、作成するアプリがユーザーのアプリ認証を終えた後に自動的に移動する先のURLだと思います。今回はWebsiteで入力したURLと同じで問題ないです。

以上4つの項目を埋めたら、Developer Agreementに同意するにチェックを入れて、Create Your Twitter Applicationと書かれたボタンをクリックします。これでTwitterアプリの作成は完了です。

  • 4つの鍵をメモする。Twitterアプリの作成が終わると、アプリの管理ページが表示されると思います。管理ページはDetails、Settings、Keys and Access Tokens、Permissionsの4つのタブにわけられているので、Keys and Access Tokensを開きます。するとこのような画面が表示されると思います。(黒塗りで隠していますが、英数文字列が表示されているはずです)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-40-56

ここに表示されているConsumer Key (API Key)Consumer Secret (API Secret)をメモします。

続いて、ページの下の方を見ると、Access Tokenを生成するボタンがあるので、それをクリックし、このような画面を表示させます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-41-42

同様にAccess TokenAccess Token Secretをメモします。

これで、4つの鍵が揃い、ようやくTwitterAPIを使う準備が整いました!疲れた…。


Tweepyの使い方

では、満を持してTwitterAPIをいじっていきましょう!Tweepyのドキュメンテーションを読むと、下のような基本形のPythonプログラムが紹介されています。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

public_tweets = api.home_timeline()
for tweet in public_tweets:
    print tweet.text

これは何をするプログラムかというと、「自分のアカウントのタイムライン(TL)から、最新のツイート20件の情報を取得し、その文章をターミナル上に表示する」プログラムです。

7行あるプログラムのうち、上4行はTwitterAPIを使うためのインスタンスを作成するプログラムで、カッコの中のconsumer_key、consumer_secret、access_token、access_token_secretは、先程メモした英数文字列に置き換えます。この4行はTweepyを使うプログラムでは、必ず記述する必要があります。

下3行は、このプログラムが具体的に何をするかを決めています。そして、ピンク色の部分が、TwitterAPIを実際に利用しているコードです。

Tweepyが提供してくれる関数(要出典)は以下のような形で使います。

api.関数名(引数=値, 引数=値,...).取り出したいデータポイント

引数に何を入れればいいのかは、Tweepyのドキュメンテーションに書いてあります。

上のプログラムで使っている「home_timeline」は「自分のアカウントのTLから最新のツイートの情報を取得する」関数で、最後の行で「.text」が適用されて、文章内容が表示されています。実は、home_timelineが取得する情報は大量で、その一部として「text = ‘ツイート内容’」があるのです。

試しにデータポイントを何も指定せずに最初のプログラムを実行してみると、大量のデータがターミナル上に表示されるでしょう。送られてくるデータは、「text」や「statuses_count」などのデータポイントの名前と、数値、文字列、辞書などのデータがセットになっているので、それを見ながらどんな情報を取り出すことができるのか知ることができます。

Tweepyの使い方は大まかに言うとこれだけです。(これ以外の使い方には手を出していないのでわからない、と言った方が正確かもしれません)


idの罠

引数やデータポイントとして使われる変数の中に「id」があります。しかし一言でidと言っても指すものが複数あり、非常にわかりにくかったのでここで、わかったことをまとめます。

user_id:ユーザーが持つ固有の番号。途中で変更はできない。「@tokkyo13」のようなものは「screen_name」という別物だが、役割はほとんど同じ。

api.get_user(id='@tokkyo13').id   #@tokkyo13のユーザー情報を取得し、user_idを返す

status_id:各ツイートが持つ固有の番号。Twitter上でツイートの詳細を開くとアドレスバーに表示される。

api.home_timeline(count=1),id  #自分のTL上にある最新のツイートの情報を一件取得し、status_idを返す。

リツイートid:他人のツイートをリツイートしたときに、そのツイートが持つステータスidとは別に、新たに生成される番号。リツイート取り消しは、「ツイート削除の関数destroy_statusに、このリツイートidを引数として渡す」という仕様になっています。

api.user_timeline(id='@tokkyo13', count=1).id  #@tokkyo13の最新のツイート一つの情報を取得し、リツイートidを返す

api.home_timeline(count=1, include_my_retweet=1).current_user_retweet  #自分のTL上にある最新のツイート一つの情報を取得し、それが自分のリツイートであった場合、リツイートidを含む辞書データを返す

実践

やはり応用例として何か自分でも作らなければいけないな、と思ったので、自分のツイートを全部削除するプログラムを作ってみました。動機は、以前mt_caret君(Advent Calendar 2016 3日目担当)が、トラブルを避けるために定期的にツイートを全部消しているという話を聞いたことをふと思い出したからです。(彼も何かしらのプログラムで操作していたと思います)

作ったコードはこんな感じです。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

#自分のアカウントの情報を取得
me = api.me()

#総ツイート数(リツイートを含める)を取り出す
count = me.statuses_count

#総ツイート数を表示
print('総ツイート数:',count)

#ツイートが0になるまで繰り返す
while count > 0:
          for tweet in api.user_timeline(id = me.id, count = 200): #一度に200のツイート情報を取得する
                   api.destroy_status( tweet.id ) #それぞれ削除していく
                   count -= 1 #総ツイート数を1減らす
                   print(count) #総ツイート数を表示する

print ('finish')

一度に200のツイート情報を取得する意味は、単に僕の環境では一度に200が限界だったからです。それ以上の数をcountに指定しても、意味がありませんでした。

そしてこれを実行すると…

img_3734

おお〜!どんどんツイが消えていく…!

そして数十分後、5500件ほどのツイートが全部消えました。しかし最後にAPI通信制限がかかり、エラーを吐いて終了したので少し後味が悪かったです。みなさんも気をつけましょう。

APIの中には、短時間の間にたくさん利用すると、一定期間使えなくなるものがあります。ファボ魔が「ファボ規制かかった〜」とか言ってるあれです。


おわりに

PythonでTwitterAPIを操作するための入口になるような記事を目指しました。よくよく考えると、全然ロ技研と関係なかったような気もしますが、もういまさら遅いので考えることはやめましょう。ここまで読んで下さった方には感謝しかないです。この記事が少しでも役に立ったり、興味を掻き立てたなら光栄です。では皆さん良いクリスマスとお正月を〜😌


おまけ

僕が今回、PythonでTwitterAPIをいじるにあたって、一番大きな壁となり、時間を取られた問題を紹介したいと思います。本文で紹介しなかったのは、その問題がPythonやTwitterとなんの関係もないことだったからです。その問題とは、macに標準でインストールされている「テキストエディタ」の「スマート引用符」という機能です。

スマート引用符とは、テキストエディタで引用符( ‘ ‘ )を入力すると自動で( ‘ ’ )に変換してくれるというApple様のお作りになられたなんともスマートな機能であります。しかし変換後の引用符をつかってPythonコードを書くとエラーが出るので、テキストエディタでプログラムを書いていた僕にはいい迷惑でした。スマート引用符がエラーの原因だと気づくまでの時間はかなり精神的に厳しく、カービィのアニメを2話ほど観ました。

解決方法はかんたんで、テキストエディタの環境設定で、スマート引用符のチェックを外せば完了です。ただし、一度スマート引用符が適用されてしまった過去の保存済みファイルは、依然としてスマートなままなので注意が必要です。

JSでmbed

この記事は慶應ロ技研 Advent Calendar 4日目/JavaScript Robotics Advent Calendar 5日目になります

←3日目:F^3RCの話|4日目:レーザー加工機の紹介→

あと10分程で誕生日を迎えます、Piroroです。百合ください。よろしくお願いします。

突然ですが皆さん、JavaScriptはお好きですか?私は大好きです。++[[]][+[]]+[+[]] == 10がtrueになる謎の多い言語仕様や、雨後の筍のように現れては消えていき諸行無常を感じさせる様々なフレームワークなどが大変魅力的ですね。
そんなJavaScriptですが、NodeJSでサーバーサイド、Electronでデスクトップアプリを作りスマホアプリはReactNative、とどんどん活躍の場を広げているものの、組み込み分野ではあまり活躍していません。そこで今回はmbedをJavaScriptで制御する話です。 続きを読む

かわロボの電装、特にPN混合型モータドライバについて

この記事は慶應ロ技研 Advent Calender 2日目になります
←1日目:今年の振り返りと3軸オムニロボ噺|3日目:F^3RCの話→

あと10日で酒が飲めますishtarmk2です。酔ったときに脳内を蠢く下ネタの群れが声帯から流出しないか不安です。さてついにAdvent Calenderが始まりました。1日目の記事は読んでいただけたでしょうか。今年のF^3RCでもステッピングモータを積んだ機体が猛威を奮っていたのでぜひ読んでみて下さい。というわけで今日はステッピングモータに続き思い通りにDCモータを回すためのお話です。
ロ技研とは関係ありませんが本題に入る前にお話しておきたいのが12月24日即ちクリスマス・イブはアニメ「魔法少女リリカルなのはA’s」(魔法少女リリカルなのはシリーズの2期にあたります)を見る日です(TV版でも劇場版でも可)。これは本作の最終決戦の日付がクリスマス・イブであることに由来します。来るべき24日に備えてまだ1期を見ていない人は視聴しておきましょう。
dsc_0481
さて寄り道はこれくらいにして本題に入ります。
続きを読む

機械学習フレームワークJubatusを使ったアニメのレコメンデーション

岡野です。今、アメリカのシリコンバレーでインターンしてます。

オンライン機械学習向け分散処理フレームワークJubatus

最近、ビッグデータ関連で機械学習がブームですね。
私は卒論で、機械学習フレームワークのJubatus(ユバタス)を使い、その使いやすさに感動しました。
Jubatusはオンライン機械学習向け分散処理フレームワークです。
繰り返し処理に時間がかかる機械学習とデータ転送に時間がかかる分散処理を、最新研究の機械学習アルゴリズムと分散処理アルゴリズムをフル活用することによって、ある程度の精度を保ちながらオンラインで行う夢のソフトウェアだと僕は思ってます。

バッチ処理とオンライン処理

機械学習というのは一般的に、学習と出力によって行われます。例えば、
「身長180センチ、Tシャツ、ジーンズは男性」
「身長153センチ、タンクトップ、ミニスカートは女性」
というデータを機械学習に教える作業を「学習」と言います。
学習させた機械学習に、
「身長163センチ、Tシャツ、ミニスカートは男性?女性?」
と質問し、「女性」という結果を得ることを「出力」と言います。
バッチ処理では、一度に学習を行い出力させます。出力する前に、毎度全データを学習させる必要があります。
一方、オンライン機械学習というのは、出力した後でも継続的に学習も行います。出力する前に、学習する必要が無いので即座に(オンラインで)結果を得ることができます。

機械学習×分散処理×オンライン

機械学習関連のライブラリやフレームワークはたくさんありますが、オンラインで分散処理機械学習をしているのは、おそらく世界にはJubatusの他に無いでしょう。
分散処理型の機械学習といえば、有名なところでMahout/Hadoopもありますが、Mahout/Hadoopは分散処理のバッチ処理向けであり、オンライン処理を達成しません。
最近は、MLlib/Sparkなるものも登場してます。SparkはHadoopを高速化した分散処理フレームワークです。MLlibはSparkの機械学習プラグインです。Sparkも元々はバッチ処理でしたが、ストリーム処理をするためのプラグインも登場しました。これとMLibを組み合わせるとJubatusのようなオンライン機械学習フレームワークが実現しそうですが、ストリーム処理とMLlibを同時に使用できるかどうかは不明です。

アニメのレコメンデーション

そこで今回は、機械学習入門としてJubatusで簡単なプログラムを作ったので紹介したいと思 います。簡単にというと「アニメのレコメンデーション」です。

とりあえずゴールとしては、

・各部員に似た部員を数人リストアップする
・各部員がまだ見ていないアニメの中でオススメのアニメをレコメンドする

まるでTwitterの「あなたに似たユーザ」やAmazonの「おすすめの商品」みたいですね。
機械学習は現在は主にそういった場所に使われています。

さて、まず学習するための教師データが必要になります。とりあえず、アニメ好きが多いロ技研部員達に頼んで、Googleスプレッドシートに今までに見たアニメとその評価を記入してもらいました。フォーマットは(あなたの名前、アニメの名前、5段階評価)で。
実際のデータがこちらになります。
https://github.com/routerman/Recommender/blob/master/data.dat
ソースコードはこちら、
https://github.com/routerman/Recommender/blob/master/recom.cpp
即席でチャチャッと書いたので汚いです。すいません。。

レコメンデーション結果

これで、実行
結果の見方は、

部員名:
similar to: 似ている部員トップ3(類似度)
recommend 部員名: オススメのアニメトップ5(予測評価値)

ルーターマン:
similar to :Bobby(0.204344), Shiyox(0.161062), sekigon(0.108002),
recommend ルーターマン(98): ガルガンティア(2.6), まどかマギカ(2), 魔女の宅急便(1.8), 天空の城ラピュタ(1.8), コードギアス(1.8),
Bobby:
similar to :Hiroki(0.249479), ルーターマン(0.204344), sekigon(0.0243314),
recommend Bobby(89): クレヨンしんちゃん(2.75), ガルガンティア(2.25), 進撃の巨人(2.25), 攻殻機動隊(1.5), ベクシル日本鎖国(1.25),
sekigon:
similar to :Shiyox(0.45279), ルーターマン(0.108002), Hiroki(0.0873813),
recommend sekigon(98): まどかマギカ(2), 魔女の宅急便(1.8), 天空の城ラピュタ(1.8), ジョジョの奇妙な冒険(1.8), エヴァンゲリオン(1.6),
Shiyox:
similar to :sekigon(0.45279), ルーターマン(0.161062), Hiroki(0.101597),
recommend Shiyox(96): クレヨンしんちゃん(2.75), ドラえもん(2.25), 宇宙のステルヴィア(1.25), 天空の城ラピュタ(1.25), ゾイド(1.25),
Hiroki:
similar to :Bobby(0.249479), Shiyox(0.101597), sekigon(0.0873813),
recommend Hiroki(98): 進撃の巨人(2.6), ジョジョの奇妙な冒険(1.8), 攻殻機動隊(1.8), コードギアス(1.8), エヴァンゲリオン(1.6),
shima:
similar to :
recommend shima(18):
tani:
similar to :
recommend tani(1):

( taniさんとshimaさんが何も無いのは、アニメが奇跡的に全部誰とも被ってなかったからです。
よって、似ているユーザもレコメンドするアニメも無い、といった感じです。こういうこともあるんですね。)

たくさんのご協力ありがとうございました。

評価ですか、
機械学習関連の研究は評価が難しいんです。
結果を見ても、正しいかどうかわからないですし。
せめて、部員達がオススメされたアニメを気に入ってくれたら幸いです。

将来研究

次はWebアプリケーションとして実装をしたいですね。結構、もうありますが。。

ロボット紹介:Clakra

Clakra(クラクラ)

Clakra

動画

春休み中に3週間でなんか作ろうってことで作ってみた倒立振子。2年生の復習と3年生の予習を兼ねて最適制御に挑戦しました。来週から始まるオリエン期間では、ロ技研のコーナーで展示する予定なので、興味を持った新入生の方はぜひ来て下さい。

以下簡単にスペック等。

マイコン:dsPIC33FJMC302
モーター:ロボサイトモーター(30:1)
加速度、ジャイロセンサー:MPU6050
ロータリーエンコーダ:AMT102
バッテリー:モバイルバッテリー(Anker Astro2 8400mAh)

バッテリーをモバイルバッテリーにしたのは失敗でした。ちょっと負荷がかかると過電流保護が働いて止まってしまいます。 細かい製作記事もそのうち書くのでお楽しみに。