Mbedでマルチスレッド

これはロ技研アドベントカレンダー13日目の記事です。

今年は部員がたくさん増えたので、カレンダーが2つになりました。

はじめに

こんにちは、tokkyo13です。最近寒いですね。こんなに寒いのに、お布団から出るという行為に賃金が発生しないのはおかしいと思うんですよ。

さて、今日はmbedでマルチスレッドを使う話です。知っているとマイコンのプログラミングも幅が広がると思います。それでは行ってみましょう。

マルチスレッドって何?

マルチスレッドとは簡単に言うと複数の処理を並列で実行する仕組みのことです。単純なプログラムだと、実行の流れは1つだけで、ループや関数呼び出しを除けば、基本的に上から順に実行されます。この実行の流れを2つ以上に増やすのがマスチスレッドです。プログラムを実行してるCPUが分身の術を使って、複数の処理を同時に実行するようなイメージで考えてくれればいいと思います。マルチスレッドに対して単純なプログラムのことをシングルスレッドと呼んだりもします。

余談ですが、『暗殺教室』という漫画に「殺せんせー」というキャラクターが登場します。殺せんせーは高速移動をしながら、その残像を使って独立した動きをする分身を作り出します。あれがまさにマルチスレッドです、と言えばピンとくる人がいるかも知れませんね。

RTOS on Mbed

Mbedでは、RTOS (Real-time operating system) の機能が提供されています。RTOSについての細かい話はしませんが、RTOSの機能を使ってマルチスレッドが実現できます。

RTOSの提供する機能の使い方は、Mbedのウェブサイトに詳しく書かれています。今日はこれらの中から、

  • スレッド
  • 相互排他

の2つを扱ってみようと思います。

RTOSの使い方

これから、ソースコードを示したりしますので、コンパイルの方法について紹介します。

オンラインコンパイラの場合は、テンプレートとしてRTOS basic example.を選択して、main.cppを書き換えればOKです。

PlatformIOを使う場合は、まずProject Examplesからmbed-rtosを選択します。次に、インポートされたプロジェクトファイルの中にあるplatformio.iniというファイルを、使用するマイコン用に書き換えます。NucleoF446REの場合は、次のように書き込めばOKです。あとは、srcフォルダ下のmain.cppを書き換えましょう。

[env:nucleo_f446re]
platform = ststm32
framework = mbed
board = nucleo_f446re
build_flags = -DPIO_FRAMEWORK_MBED_RTOS_PRESENT

以下、NucleoF446RE用のプログラムを想定してプログラム例を示します。

スレッド

下にあるのが、1つのLEDを2秒周期で点滅させるプログラムです。

#include "mbed.h"

DigitalOut led1(A0);

int main()
{
    while (true)
    {
        led1 = !led1;
        wait(1);
    }
}

これにスレッドを1つ加えて、1秒周期で点滅するLEDを1つ追加してみましょう。次のようなプログラムになります。

#include "mbed.h"

DigitalOut led1(A0);
DigitalOut led2(A1);
Thread thread; // threadという名前のスレッドを宣言

void led2_thread() // 追加したスレッドが実行する用の関数
{
    while (true)
    {
        led2 = !led2;
        wait(1);
    }
}

int main() // main は必ず実行されるスレッド
{
    thread.start(led2_thread); // thread に led2_thread 関数の実行を開始させる

    while (true)
    {
        led1 = !led1;
        wait(0.5);
    }

    thread.join(); // thread の終了を待つ
}

使い方は上のプログラムを見ればだいたい分かると思いますが、説明します。

  1. まず、増やしたい数だけスレッドを宣言します。(5行目)
  2. 次に、増やしたスレッドが実行する関数を記述します。(7行目)
  3. 次に、メインのスレッド内で、新しいスレッドを開始します。(18行目)
  4. 増やしたスレッドの終了を待ってからメインのスレッドを終了する場合 (26行目)

メインのスレッドというのは、main関数から始まって順に実行されていく処理の流れのことです。また、4. についてですが、上のプログラムは無限ループなので、スレッドは終了しません。join()は、増やしたスレッドの終了を待ち、タイミングを揃えるときなどに使います。

これを実行すると、次の動画のようになります。

https://platform.twitter.com/widgets.js

相互排除

上で紹介したプログラムは、各スレッドが自分専用のLEDを持っていました。しかし、1つのLEDしか使えなかったらどうなるでしょう。次のプログラムは、1つのLEDを0.6秒周期で点滅させようとするスレッドと、0.2秒周期で点滅させようとするスレッドが競合状態になっている例です。

#include "mbed.h"

DigitalOut led1(A0);
Thread thread;

void led2_thread()
{
    while (true)
    {
        led1 = !led1;
        wait(0.1);
    }
}

int main()
{
    thread.start(led2_thread);

    while (true)
    {
        led1 = !led1;
        wait(0.3);
    }

    thread.join();
}

これを実行すると、次の動画のように、なんだかおかしな挙動になります。面白いですね。

https://platform.twitter.com/widgets.js

このような競合を防ぐには、LEDへのアクセスが可能なスレッドを1つに絞る必要があります。そのために使われるのが、相互排除です。相互排除を実現する機能として、ミューテックス(Mutex)という機能が提供されています。Mutexは、簡単に言うとアクセス権のようなもので、取得したり返却したりできます。アクセス権を取得することを「ロック」といい、アクセス権を返すことを「アンロック」といいます。

では、Mutexを使って先程のプログラムを書き換えましょう。

#include "mbed.h"

DigitalOut led1(A0);
Thread thread;
Mutex mutex; // ミューテックスの宣言

void led2_thread()
{
    while (true)
    {
        mutex.lock(); // ミューテックスをロック
        for (int i = 0; i < 6; i++) // 0.2秒周期で3回点滅
        {
            led1 = !led1;
            wait(0.1);
        }
        mutex.unlock(); // ミューテックスをアンロック
        wait(0.5);
    }
}

int main()
{
    thread.start(led2_thread);

    while (true)
    {
        mutex.lock(); // ミューテックスをロック
        for (int i = 0; i < 6; i++) // 0.6秒周期で3回点滅
        {
            led1 = !led1;
            wait(0.3);
        }
        mutex.unlock(); // ミューテックスをアンロック
        wait(0.5);
    }

    thread.join();
}

LEDの点滅プログラムは都合上、3回点滅して0.5秒間待つようにしています。この0.5秒の間に他のスレッドがLEDへのアクセス権を奪えるようにです。

結果、LEDは0.2秒周期の点滅と0.6秒周期の点滅を交互に実行するようになります。その様子は次の動画のようになります。

https://platform.twitter.com/widgets.js

この様に、Mutexは限られたリソース(今回の場合LED)を一時的に独占したいときに利用します。限られたリソースを使う前にロック、使い終わったらアンロックです。

おわりに

この記事で説明したのは、RTOSの機能のごく一部です。マルチスレッドや同期実行に興味が湧いた人はMbedのウェブサイトを読んで、サンプルプログラムを実行してみると良いと思います。

広告

「統計的学習の基礎」の基礎

慶應ロ技研 Advent Calendar 2018 その1 10日目

こんにちは、研究室配属で失敗がありました、mt_caretです。

さて、前回のアドベントカレンダーではロボットに大変関係があるということで Haskellについて書きました。今年は同様にロボットに大変関係があるトピックということで統計的学習についての駄文です。

まずは、統計的学習とは何かについて考えると、何らかの変数Yとそれらに何らかの関係を持った変数X = (X1, X2, ⋯, Xp)を考えた時、次のようなモデルを考えてみます。

Y = f(X) + ε

fはなんらかの関数であり、εXと独立かつ期待値0の誤差項とします。1 適当なXを与えられた時のYを推定したいとすると、fを上手く近似したさえあれば推定値 = (X)が得られる、ということになります。

ここで、推定値は真値Yにどれだけ近づけることができるか検討してみるために、一旦Xを固定して、最小二乗誤差のあらゆるデータセット𝒯に関する期待値E[(Y − )2]を計算して見ましょう。

つまり、最小二乗誤差の期待値はfの期待値の差の二乗からなるバイアス項、 のヴァリアンス項、そしてεの分散の3つの項に分解することができました。この前者2つの項が所謂Bias-Variance Tradeoffに出てくるものに相当するわけです。

この導出が手元の本2だと「自明」としてカバーされておらず、しばらく導出できなくて云々唸ってようやくできたので記事のネタにしようと思い検索したところ、ウィキペディアに載っていました

ということで、ウィキペディアはちゃんと確認しよう!

追記: WordPress.comでMarkdown+LaTeXで数式を書こうとしたら地獄を見た。もう絶対使いたくない。


  1. 交絡等によりXεが成り立たない場合は、このモデルは上手く成立しなくなります。
    • An Introduction to Statistical Learning
    • The Elements of Statistical Learning

【Solidworksを快適に使おう】GeforceでもRealVeiwを有効にする方法

←11日目の記事

こんにちは。2年のしゅんもです。今年前半はかわロボをやってました。来年出場予定のNHKロボコン班では、ハードを担当しています。よろしくお願いします。

さて、本日12月12日といえば、慶應ロ技研部長のishtarmk2君の誕生日ですね笑 おめでとうございます。プレゼントは特にあげてないです。

まあ、それは置いといて、今回の話題に移りましょう!

はじめに

ハードウェアの設計で欠かせない存在のSolidWorksは、そこそこ重めのソフトです。今まではかわロボのような小型なロボットだったため、あまり意識していなかったのですが、NHKロボコンに向けて巨大なロボットを制作するようになり、アセンブリで激重になることもしばしば怒っています。そこで今回は、SolidWorksでGeforceを活かすための裏技を紹介していきます。

目次

そもそもGeforceSolidWorksに対応していない

SolidWorksはOpenGLで動いています。そのため、ノートPCや一般的なデスクトップPCで使用される内蔵グラフィックはもちろん、ゲーミングPCに使用されるGeforceやRadeonなどのDirect Xに最適化されたグラフィックボードは、公式ではSolidWorksに対応していません。

その代わり、QuadroやFireProなどの、OpenGLに最適化されたグラフィックボードが公式で対応となっています。(以下、Direct Xに最適化されたグラボの代表としてGeforce、Open GLに最適化されたグラボの代表としてQuadroを取り上げます。)

DSC05890.JPG

上は私のPCの内部です。オレンジで囲んだ部分が、上で出てきた”グラフィックボード”(略してグラボ)と呼ばれるパーツです。現在私はMSIのGTX 970を使用しています。

GeforceQuadroは何が違うのか?

上で述べたように、GeforceはDirect Xに”最適化”されており、OpenGLに対してはリミッターがかけられています。一方で、QuadroはOpen GLに最適化されていますが、Direct Xに対してはリミッターがかけられています。

そのため、ほとんどのゲームのAPIであるDirect Xに最適化されたGeforceがゲーミングPCに採用されるのです。一方で、Quadroは3D設計や動画制作といった業務用途で用いられることが大半のため、非常に高価です。

QuadroだとRealViewが使える

公式に対応しているQuadroを搭載したPCでは、RealViewという機能がデフォルトで有効になります。RealViewとは、3Dモデルをグラフィカルに表示する機能です。以下の写真を見ていただくとわかりやすいかと思います。

■SolidWorks標準の描画■

RealView無し.jpg

■RealView有効時■RealView.jpg

部品を選択するとこうなります。

■SolidWorks標準の描画■

標準_部品選択画面.jpg

■RealView有効時■

photoview360_部品選択画面.jpg

RealViewを有効にすると、金属表面の光沢がリアルになり、反射も美しいですね。選択画面の光り方もカッコいいです。

RealViewを有効にすると、見た目が綺麗になることによるモチベーションの向上だけでなく、ハードウェアによる描画支援が有効になり、SolidWorks自体のパフォーマンスが向上します。(たぶん)

ちなみに、写真で用いているモデルは、今年のかわロボの機体の骨格です。

PhotoView 360とは何が違うのか?

PhotoView 360もSolidWorksに内蔵されているレンダリングツールなので、RealViewとにていますが、大きく異なる点は、「ハードウェアエンコード」なのか「ソフトウェアエンコードなのか」です。前者がRealViewで、後者がPhotoView 360です。

一般的に、ハードウェアエンコードは書き出しが速いが、表示品質はあまり高くないという特徴を持ちます。一方、ソフトウェアエンコードは書き出しが遅いが、表示品質が高いという相反的な特徴を持ちます。

そのため、ハードウェアエンコードであるRealViewは、その名の通り、リアルタイムで描画できますが、ソフトウェアエンコードであるPhotoView 360はCPUによるレンダリング(書き出し)作業が必要になります。

このレンダリング処理は非常に重く、私の使用している自作PC(Core i7 6700K @4.0GHz/RAM 16GB)でも数分はかかります。(品質を下から2番目の中高にした場合。)

下の画像は、実際にも載せたモデルをレンダリングしたものです。

実はGeforce搭載PCでもRealViewを有効にできる(これが本題)

上で述べたように、公式でRealViewに対応しているのはQuadroだけです。

しかーし!

なんとGeforceでもRealViewを有効にできちゃう裏技があるんです!!その方法を紹介します。ただし、レジストリの編集を伴うので、十分注意して行ってください。(この記事により何らかのトラブルが発生しても、一切責任を負いませんので、ご了承ください。)

①レジストリの起動

スタートボタンを右クリックし、ファイル名を指定して実行をクリックします。そしたら、名前のところに「regedit」と入力してOKを押します。

1.jpg

②自分のグラボの値を確認する

まず、「HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS2016\Performance\Graphics\Hardware\Current” 」に移動します。

■注意■SOLIDWORKS2016の西暦の部分は、お使いのバージョンに合わせて変更してください。

次に、右の画面にある「Renderer」をダブルクリックして開き、値のデータをコピーします。

2.jpg

③キーを作成する

今度は、「HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2016\Performance\Graphics\Hardware\Gl2Shaders\R420」に移動します。

その後、ツリー状のR420フォルダ上で右クリックし、新規→キーを選択します。

3.jpg

そしたら、新しくR420の下にキーが作成されるので、先程コピーした値を貼り付けます。

④値を入れる

右の画面上の何も無いところで右クリックし、新規→DWORD(32ビット)値を選択します。

4.jpg

次に、作成したDWORDの名前を「Workarounds」に変更し、ダブルクリックで開きます。

最後に、表記を16進数に変更した後、値のデータに「30008」を入力します。

5.jpg

■注意■グラボにより、この値だとRealViewが有効にならない場合があるようです。その場合は、「30408」と入力してみてください。それでもだめな場合は、「自分の使用しているグラボ名+SolidWorks+RealView」とかでぐぐってみてください。

⑤設定完了!

お疲れ様でした。これで設定が完了したので、レジストリエディタを閉じて、SolidWorksを起動しましょう!すでにRealViewが有効になっているはずです。もし有効になっていない場合は、表示→表示タイプ→RealView Graphicsが有効になっているか確認してください。グレーアウトしている場合、④での値が違っていた可能性があります。上の注意を参照してください。

最後に

この設定をしたからといって、Quadroと同じようにガンガンSolidWorksを使えるわけではないようです。もしかしたら、数年落ちのQuadroを安く買ったほうがいいかもしれません。そのあたりはご自身で判断してみてください。私自身、Quadroを検討しているのですが、使用しているモニターが4Kのため、それなりに新しいQuadroでないと60Hz表示に対応できず、躊躇しています。

というわけで、最後までお読み頂きありがとうございます。現在、慶應ロ技研ではアドベントカレンダーなるものを実施しており、クリスマスの日まで毎日記事が更新されております。お時間のあるときに、ぜひご覧ください。

参考サイト

・GRABCAD COMMUNITY “https://grabcad.com/questions/how-i-can-activate-real-view-graphics-in-my-solidworks-2015-x-64-bit-sp2-my-operating-system-is-windows-7-x-64-bit-sp1-and-my-graphics-card-is-amd-radeon-hd-7500m-7600m-series-i-have-already-tried-realhack-3-9-1-but-it-is-not-working&#8221; (参照 2017-12-12)

・overclock “http://www.overclock.net/t/1598305/howto-enable-solidworks-realview-graphics-on-gaming-video-cards&#8221; (参照 2017-12-12)

←11日目の記事

深遠なるニッパーの世界

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

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


挨拶

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

ロボット設計の勘所 ~軸と回転体の締結~

まえがき

こんにちは、SSSRobotsです。早速ですが、ロボットの設計をするとき、こんなことで困ったりしませんか?

  • シャフトにどうやってギアを取り付けていいのかわからない!
  • 歯車が空回らないようにしたい!
  • リンク機構を作りたいけど、リンクとヒンジピンの固定ができない!
  • 止めねじって何?
  • キーって何?
  • H7とかm6って何のこと?
  • シャフトの平面取りって何のためにあるの?
  • タイミングプーリーを使いたいけど、軸穴仕様にあるタップやキー溝って何に使うの?

今回はこうした疑問や悩みにお答えしたいと思います。 Continue reading “ロボット設計の勘所 ~軸と回転体の締結~”

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話ほど観ました。

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

Unityでマイクロマウスをシミュレートしたい

この記事は慶應ロ技研 Advent Calender の8日目です
7日目:AndroidとArduinoUnoの通信仕方|9日目:コンパイルエラーを出したくない(C言語)
「数学1Bの単位落としちゃった!!!!!!!!!!!!!!」とバスの中で叫ぶことが現実になりそうで怯えておりますishtarmk2です。さっさと成人してセイクで優勝して忘れたいところですね。

さて今回はマイクロマウスというロボコンの話です。大雑把にいうとマウスと呼ばれる自動制御の非常に小さいロボットで正方形のマスで区切られた正方形の迷路を探索し予めインプットされたゴールを目指すという趣旨の競技です。重要なのは1試合につき2回走るという点で、2回目の走行時には1回目に取得したデータを保持することが可能なので、1回目で迷路を舐め回すかのように探索して、そのデータをもとに2回目で最速で走り抜けるのが王道戦略となっています。さらなる詳細は公式で。まあ動画を見ていただくのが一番早いでしょう。
Continue reading “Unityでマイクロマウスをシミュレートしたい”