TwitterのストリーミングAPIを試してみた

Twitterからリアルタイムに情報を得るStreaming APIを試してみました。

$ sudo easy_install pip
$ sudo pip install tweepy --upgrade

として、パッケージ管理ツール pip をインストールした後、tweepy をアップグレードしました。その後、キーワードを含む tweet を入手するスクリプトをいろんなところを参考にしながらなんとか作りました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import json
import tweepy  
import re

# Account 
consumer_key= '  '
consumer_secret= ' '
access_token= ' '
access_token_secret= ' '

class Listener(tweepy.streaming.StreamListener):
    def on_data(self, data):
        if data.startswith("{"):
            tweet = json.loads(data)
            if 'text' in tweet:
                user = tweet['user']
                text = re.sub(r'\n',r' ',tweet['text'].encode('utf-8')) # 改行コード除去
                print tweet['id'],":",tweet['lang'],":",user['screen_name'].encode('utf-8'),":", \
                              user['name'].encode('utf-8'),":", text
        return True

    def on_error(self, status):
        print status

if __name__ == '__main__':
    l = Listener()
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = tweepy.Stream(auth, l)
#    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
#    def filter(self, follow=None, track=None, async=False, locations=None, 
#        count = None, stall_warnings=False, languages=None):
#    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
    stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

15~27行目がデータ受信時の処理で、データを分析してユーザー名やscreeen_name、tweetの内容などを表示します。29行目からが認証で、34行目でstreaming apiを呼び出しています。
39行目でフィルタの内容を設定していて、ここでは日本語のTweetで、「AKB,HKT,NMB」を含むものをキーワードとしています。キーワードは日本語のようなスペース区切りではない言語では正常に動作しないようです。

同じ処理は、on_data ではなく、 on_statusを使うとJSONの解析もTweepy側でやってくれるようで、on_status版も上げておきます。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import json
import tweepy  
import re

# Account
consumer_key= ' '
consumer_secret= ' '
access_token= ' '
access_token_secret= ' '

class Listener(tweepy.streaming.StreamListener):
    def on_status(self, status):
        print status.id,":", \
               status.lang,":", \
               status.user.screen_name.encode("utf-8"),":", \
               status.user.name.encode("utf-8"),":", \
               re.sub(r'\n',r' ',status.text.encode("utf-8"))
        return True

    def on_error(self, status):
        print status

if __name__ == '__main__':
    l = Listener()
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = tweepy.Stream(auth, l)
#    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
#    def filter(self, follow=None, track=None, async=False, locations=None, 
#        count = None, stall_warnings=False, languages=None):
#    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
    stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

取得できるデータは、あるtweetを参考に分析してみたところ、

{u'contributors': None,
 u'truncated': False,
 u'text': u'\u301017\u6642....00#NMB #HKT48\u3000#HKT',
 u'in_reply_to_status_id': None,
 u'id': 3744....11520,
 u'favorite_count': 0,
 u'source': u'<a href="http://twittbot.net/" rel="nofollow">twittbot.net</a>',
 u'retweeted': False,
 u'coordinates': None,
 u'entities': {u'symbols': [],
               u'user_mentions': [],
               u'hashtags': [{u'indices': [68, 74], u'text': u'AKB48'},
                             {u'indices': [75, 79], u'text': u'AKB'},
                             {u'indices': [80, 86], u'text': u'SKE48'},
                             {u'indices': [87, 91], u'text': u'SKE'},
                             {u'indices': [92, 98], u'text': u'NMB48'},
                             {u'indices': [99, 103], u'text': u'NMB'},
                             {u'indices': [104, 110], u'text': u'HKT48'},
                             {u'indices': [111, 115], u'text': u'HKT'}],
               u'urls': [{u'url': u'http://t.co/f4....w6kL', u'indices': [8, 30], u'expanded_url': u'http://com.nicovideo.jp/community/co....411', u'display_url': u'com.nicovideo.jp/community/co....\u2026'}]},
 u'in_reply_to_screen_name': None,
 u'id_str': u'3744....1520',
 u'retweet_count': 0,
 u'in_reply_to_user_id': None,
 u'favorited': False,
 u'user': {u'follow_request_sent': None,
           u'profile_use_background_image': True,
           u'default_profile_image': True,
           u'id': 63.....87,
           u'verified': False,
           u'profile_image_url_https': u'https://.......png',
           u'profile_sidebar_fill_color': u'DDEEF6',
           u'profile_text_color': u'333333',
           u'followers_count': 1,
           u'profile_sidebar_border_color': u'C0DEED',
           u'id_str': u'63.....87',
           u'profile_background_color': u'C0DEED',
           u'listed_count': 0,
           u'profile_background_image_url_https': u'https://......png',
           u'utc_offset': 32400,
           u'statuses_count': 25632,
           u'description': None,
           u'friends_count': 1,
           u'location': u'',
           u'profile_link_color': u'0084B4',
           u'profile_image_url': u'http://......png',
           u'following': None,
           u'geo_enabled': False,
           u'profile_background_image_url': u'http://......png',
           u'name': u'\u308a\u3063..........\uff09',
           u'lang': u'ja',
           u'profile_background_tile': False,
           u'favourites_count': 0,
           u'screen_name': u'KK....ty',
           u'notifications': None,
           u'url': None,
           u'created_at': u'Sun Jul 15 18:..:.. +0000 2012',
           u'contributors_enabled': False,
           u'time_zone': u'Osaka',
           u'protected': False,
           u'default_profile': True,
           u'is_translator': False},
 u'geo': None,
 u'in_reply_to_user_id_str': None,
 u'possibly_sensitive': False,
 u'lang': u'ja',
 u'created_at': u'Mon Sep 02 08:..:.. +0000 2013',
 u'filter_level': u'medium',
 u'in_reply_to_status_id_str': None,
 u'place': None}

というような感じで、ユーザー名などは入れ子になったデータ構造になっていますので、on_data版ではソースの20行目のように一旦’user’データを取り出しています。

 

あらためてBeagleBoneBlackにUbuntuをインストールしてみた

TAKEさんのLinuxブログをみてみたら、UbuntuがGUIで起動した、という記事がありました。
自分の方は先日失敗しているので、ちょっとみてみたら、BeagleBoard UbuntuのWikiに8月24日付けで新しいarmhfイメージが上がっていて、BeagleBone Blackについては、

BeagleBone/BeagleBone Black: v3.8.13-bone26 kernel
・Lots of hdmi fixes...

という記載が・・・・(^^;

ということで、BeagleBoard UbuntuのWikiに沿って改めて試してみました。
まず、SDイメージをダウンロードしてきます。これは上記Wikiの中の「Raring 13.04 armhf」の項目の少し下にある Prebuilt image のリンクを辿って入手します。

“あらためてBeagleBoneBlackにUbuntuをインストールしてみた” の続きを読む

Open Jtalkを試してみた

頻繁に見させていただいているTAKEさんのLinuxブログ音声合成の記事を見かけたので試してみました。

LinuxMint13で試してみたのですが、TAKEさんの記事の通りに

  1. apt-get でインストール。TAKEさんの記事からコピペでOK。
  2. 音声ファイルのダウンロード&インストール。
    これもTAKEさんの記事からコピペでOK
  3. jsay.shという名前でシェルスクリプトを作成。
    これもTAKEさんの記事からコピペでOK

という手順で試してみたら、文字通り「あっ」という間に音声を発声してくれました。

漢字仮名まじりの文章でも何ら問題なく発声してくれるのでおもしろいです。(あ、漢字仮名交じりだけではなく、数字やアルファベットのSI単位系なんかもいけましたね)

<追伸>
パラメータをイジってみたくなりました。このあたりが参考になるかもしれない。

  1. パラメータについて説明あり
    http://mahoro-ba.net/e1569.html
  2. 合成音声をミクさんに変える
    http://kentai-shiroma.blogspot.jp/2013/03/fhc.html

SanDisk Ultra USB3.0のベンチマーク

先日秋葉原に行ったら、SanDiskの新しいUSB3.0メモリを見かけたので買ってきました。しばらく放置してあったのですが、例によってOSインストールに使うとどうなるか、ということで簡単なベンチマークをしてみました。

ブツは、SDCZ48-032G-U46です。型番からわかる通り32GB品です。値段は馬鹿っ早のExtreme SDCZ80-032G-X46より少し安い程度でした。(すみません、具体的な金額忘れました・・・)

サイズはSDCZ80よりも2割くらい短い感じでしょうか。並べてみると2割くらいですが、実物では結構違いを感じます。コンパクトになっているので、このコンパクトさで性能が出ているのであれば・・・・と思って購入したわけです。

ベンチマークの方法は前回と同じです。

Screenshot-SanDisk SanDisk Ultra (SanDisk SanDisk Ultra) – ベンチマーク

読み込みはパッケージの記載(80MB/s)にやや届かず、というところでしょうか。
書き込みの方は例によって625MBのISOファイルを書き込んでみたところ、開放まで約30秒、LEDの点滅が収まるまで約1分なので、開放までで20MB/sくらい、LED点滅が収まるまでで10MB/sくらいで、USB3.0のUSBメモリとしては凡庸な結果となりました。

価格差があまり大きくないことを考えると、やや大きくて嵩張りますが、Extremeを買った方がお得感は高そうです。

BeagleBoneBlackにXubuntuデスクトップ環境を構築

しばらく前に秋月でBeagleBone BlackをGetしました。
まずはMicroSDカード上にデスクトップ環境を構築してみました。

1.Ubuntu13.04のダウンロード

こちらのページ
http://www.armhf.com/index.php/download/
のからUbuntu Raring 13.04をダウンロードする。
ubuntu-raring-13.04-armhf-3.8.13-bone20.img.xz  (June 9, 2013)
というファイル。

2.MicroSDカードへのインストール

# xz -cd ubuntu-raring-13.04-armhf-3.8.13-bone20.img.xz > /dev/sdb

としてMicroSDカードにイメージを書き込む。

3.BeagleBoneBlackにて起動

MicroSDカードを取り付けて、BOOTボタンを押しながら電源投入し、MicroSDカードから起動させる。
login: ubuntu / Password: ubuntu にてログインする。

4.パッケージの更新

$ sudo apt-get update
$ sudo apt-get upgrade

にてパッケージを更新

5.パーティションサイズの変更

イメージを書いた状態だと、u-bootに1MB、システムに約2GBのみなので、MicroSDカードの容量一杯まで使うにはパーティションサイズの変更が必要です。一旦シャットダウンし、別のPCにてパーティションサイズを変更しました。

6.デスクトップ環境の導入

$ sudo apt-get install ubuntu-desktop

ものすごく時間がかかりますので、ひたすら待ちます。結局1時間以上かかりました。
再起動すると、グラフィカルログイン画面で立ち上がります。
・・・が、何か変です。周期的に画面が乱れます・・・。マウスカーソルの表示をトリガーにしていそうです。

7.リモートデスクトップ接続

リモートデスクトップ接続のため、xrdpをインストールします。

$ sudo apt-get install xrdp

ホスト側から rdesktop で接続しようとすると、「unable to connect」で蹴られてしまいます。
おそらく、iptables で蹴られているものと思います。
簡単に済ますため、

$ sudo apt-get install ufw
$ sudo ufw disable

として、firewall 機能を無効にしたところ、ホスト側から

$ rdesktop 192.168.1.108

で接続できました・・・・が、ログインすると途中でエラーを吐いて黙りこんでしまいました・・・。

8.Xubuntuではどうか?

デスクトップ環境のインストールを

$ sudo apt-get install xubuntu-desktop

として、xubuntuにすると、「Failed to load session “gnome”」というエラーでやはりダメでした・・。

LFSに挑戦3(LFSシステムの構築)

第6章「基本的なソフトウェアのインストール」に進みます。
ここまでの作業のバックアップはパーティションイメージとtarで取得済みです。

ここからの作業は5章の最後に書いてある通り、rootで行います。特に問題や気づいた点がない限りはHTML版のLFS BOOKからコピペで進めていきます。

“LFSに挑戦3(LFSシステムの構築)” の続きを読む

MPLAB-X + PIC12F675は使えない・・・・

ちょっと治具を簡単に手持ちのPIC12F675で作ろうとしたのですが、ハマってしまいました。
今回の環境はMPLAB-X + XC8を使ってみようと思ったのですが、これがハマりの元凶です。

まずはLチカで環境に問題がないことを確認しようとしていたのですが、そこで引っかかりました。

Lチカプログラムはこんな感じで、何の変哲もありません。

101

しかし、コンパイルして動かそうとすると動きません。
いろいろ設定を疑ってみたものの、うんともすんとも言いません・・・・。

プログラムメモリの内容をディスアセンブル表示させると、先頭は

Screenshot-1

というような感じでした。001番地にCALL 0x3FFがありますが、これは確か3FF番地にはRETLW命令が置いてあって、Wレジスタにクロック周波数の補正値を入れて戻ってきて、その後、OSCCALレジスタにWの値を書き込む(上記で言うと、レジスタバンクを1に切り替えてからT1CONのアドレスに書き込む)ことで、周波数を補正していたはずです。

しかし、不安になって、WindowsでPickit2でROMの中身を吸い出して見たところ・・・・・3FF番地の値が0000(NOP)になってました。これでは001番地のCALL命令で無限ループになるので動くわけがありません。

Pickit2にはクロック周波数補正値を回復する機能があるので、それで3FF番地の値を回復させて、改めてMPLAB-Xで書き込んでみるとLチカが動作しました。・・・が、再度コンパイルして書き込んでみると、やっぱり動きません。
Pickit2で見ると、また3FF番地の値が消失しています。この状態をPickit2で吸い出してHEXファイルに保存し、補正値を回復させ、改めて吸い出したHEXファイルを書き込むと、Pickit2は補正値を保存するので、ちゃんと動作しました。

とにかく「MPLAB-XとPIC12F675の組み合わせは使い物にならない」ということがわかりました・・・。