Hatena::ブログ(Diary)

作業記録/備忘録(仮) このページをアンテナに追加 RSSフィード

2014/08/29

BBB(Ubuntu12.04)で11ac WLANアダプタを利用する

概要

BeagleBoneBlack(BBB)で802.11ac無線LANアダプタ(WDC-867U3/添付写真も参照)を使えるようにする。
f:id:nihohi:20140830000803p:image:w240

背景

ある探査ロボットを遠隔無線操縦し、画像転送を行う必要があり、帯域を広めに利用したかった。
BBB用に、.11ac WLANドライバをbuildしたので、そのdriverと使い方を公開する。ドライバのbuild方法は後日記載予定。

環境

BeagleBoneBlack(BBB) Ubuntu 12.04

WLAN adaptor:ELECOM WDC-867U3

使い方

8812au.koをdownloadする。
https://github.com/nihohi0428/11ac_driver_for_BBB/tree/master

$ sudo cp 8812au.ko /lib/modules/3.8.13-bone30/kernel/net/wireless/
$ sudo chmod 644 /lib/modules/3.8.13-bone30/kernel/net/wireless/8812au.ko 
$ sudo /sbin/depmod -a 3.8.13-bone30

WLANアダプタを刺す。

$ sudo modprobe 8812au

11acとして使えてることが分かる。

$ sudo iwconfig
wlan0     IEEE 802.11AC  ESSID:"xxxxx"  Nickname:"xxxxx"
          Mode:Managed  Frequency:5.5 GHz  Access Point: DC:FB:02:xx:yy:zz
          Bit Rate:867 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=-45 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.

rename4   unassociated  Nickname:"xxxxx"
          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

buildの仕方

  • (後日記載予定)

2012/08/03

apache + wsgi + djangoでのdebug方法

※「wsgiファイルにdebugger起動の設定を書いておく」を追記し、「link」に関連するポインタを追記しました。2012/08/05

概要

apache + wsgi + djangoを利用している時、pdbを利用したdebug方法について示します。

背景

djangoでdebugしていて、通常であればmanager.py runserverなどで確認していたが、事情によりapacheでの動作中に確認する必要があった。
簡単なところは、print debugしていたが、だんだん辛くなり、debuggerを利用する方法について調べたら分かったので備忘として残しておきます。

環境

OS CentOS 6.0
python 2.6.6
mod_wsgi 3.3
apache 2.2.15

(1)wsgiファイルにdebugger起動の設定を書いておく

djangoのprojectディレクトリ(setting.pyとかあるところ)にあるxxx.wsgiファイルにclass Debugerの設定と、applicationに適用する設定を書いておく。
個の記載をすることで、applicationが呼ばれる際にdebuggerを起動できる。

下記例では、class Debugger(object):以降の部分が追記する部分。

# cat ../gui/django.wsgi
import os, sys
sys.path.append('/var/www/xxx')
os.environ['DJANGO_SETTINGS_MODULE'] = 'gui.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

class Debugger(object):
    def __init__(self, object):
        self.__object = object

    def __call__(self, *args, **kwargs):
        import pdb, sys
        debugger = pdb.Pdb()
        debugger.use_rawinput = 0
        debugger.reset()
        sys.settrace(debugger.trace_dispatch)

        try:
            return self.__object(*args, **kwargs)
        finally:
            debugger.quitting = 1
            sys.settrace(None)

application = Debugger(application)

(2).htaccessをdebugしたいprogramのあるdirectoryに配置する

PythonHandlerのところに、debuggerを起動させたいprogramを指定する(?)。<--ちゃんと調べてません
下記例では、yyy.py

 AddHandler python-program .py
 PythonHandler yyy.py
 PythonEnablePdb On

(3)debugger起動待ち状態にする

 # apachectl -k stop
 # apachectl -DONE_PROCESS

プロンプトが戻ってこなくなり、pdb起動待ちになります。

(4)web accessすると、debuggerが起動するのでそのままdebugをすすめる。

[root@xxx XxxYyy]# apachectl -DONE_PROCESS   <--ここで待ちになるが、web browserアクセスしたら返ってくる
> /usr/lib/python2.6/site-packages/Django-1.4.1-py2.6.egg/django/core/handlers/wsgi.py(213)__call__()
-> if self._request_middleware is None:
(Pdb) l
208  	    request_class = WSGIRequest
209  	
210  	    def __call__(self, environ, start_response):
211  	        # Set up middleware if needed. We couldn't do this earlier, because
212  	        # settings weren't available.
213  ->	        if self._request_middleware is None:
214  	            self.initLock.acquire()
215  	            try:
216  	                try:
217  	                    # Check that middleware is still uninitialised.
218  	                    if self._request_middleware is None:
(Pdb) b /var/www/xxx/yyy.py:39
Breakpoint 1 at /var/www/xxx/yyy.py:39
(Pdb)

link

Mod_pythonアプリケーションpdbデバッグ
http://www.daemonfreaks.com/blog/200705281740.html

Debugging Techniques
http://code.google.com/p/modwsgi/wiki/DebuggingTechniques

2012/03/10

androidをリモートコントロール

PCから、ネットワーク越しにAndroidをリモート操作し、以下を行った。

  • トースト通知表示
  • カメラで写真撮影
  • センサ情報の取得

Androidでは、SL4Aのサーバを起動し、PCからpythonを使って、そのサーバ越しに上記操作を行った。

以下のサイトを参考にして作業を行った。

  1. AndroidFacadeAPIセンサー
  2. RemoteControl How to control the device while running scripts on your computer
  3. SL4A+PythonでAndroidをリモートコントロール

androidをノートPCに無線接続(帰属)

Windows7のノートPCをアクセスポイントにして、そこにAndroidを無線接続(帰属)させた。
また、開発環境は、Windows7のVM上のLinux(Ubuntu10.04)であったため、Windows上でルーティング解決が必要であった。

  1. アクセスポイント(AP)モードで起動可能な無線LANアダプタを用意する。
  2. APモードで起動する。
    • 「クライアントマネージャ」を起動し、「携帯電話を接続する」を選択する。すると、アクセスポイントモードで起動できる。
    • 適当に編集する。
    • 例えば、SSIDにunpopo,チャネルを13,認証タイプをWPA2-PSK,暗号化タイプをTKIP,WPAプリシェアドキーをhogefugahogefugaなど。
    • SSID,WPAプリシェアドキーは後でandroid端末から帰属させるのに必要である。
  3. Android端末をAPに帰属させる。
    • 自分が持っている端末(N-06C)だと、設定->無線とネットワーク->Wi-Fi設定で設定できる。
    • 先のAPが見えているはずなので、パスワードにプリシェアドキーと同じ文字を入れる。
  4. 接続後、先の画面でもう一度APをタップすると、IPアドレスが表示される。
    • windows7のコマンドプロンプトなどからpingでも打って導通することを確認しておく。
    • 自分はwindows7上の仮想系Linuxからだったので以下のルーティング設定が必須だった。

ルーティング設定

※必要ない時は読み飛ばして可

  1. fowardingの有効化
    • サービスの"Routing and remote Access"で右クリック、"開始"をする。
    • ipconfig /allしたときに、"IPルーティング有効"が"はい"になっていることを確認する。
  2. 仮想ネットワークの追加
    • VMwarePlayerでハードウェアで、"ネットワークアダプタ"を追加し、"NAT"で接続する。
    • もともとあったネットワークアダプタはそのまま(ブリッジ)にした。
  3. ルーティング設定

linuxのアドレスが192.168.28.1で、192.168.28.0/24ネットワーク(eth1)、Androidが192.168.100.0/24ネットワークであったので、Linuxにルーティング設定した。

$ sudo ip route add 192.168.100.0/24 via 192.168.28.1 dev eth1

android端末でSL4Aのサーバを動かす

  1. サーバ起動
    • SL4Aをインストール後、起動。メニュー画面を開きView->Interpretersを開く。
    • さらにメニュー画面を開き、StartServer->Publicを開く。
    • このとき、Publicの場合、帰属しているIPでサーバが立ち上がる。(Privateだとlocalhost/127.0.0.1で立ち上がる。)
    • 画面上部の通知領域にアイコンが出るのでそれを開く。IPアドレスとポート番号が表示されるの控えておく。例えば、192.168.100.2:42378など。リモート操作時に必要。

PCからandroidをリモート操作準備

  1. 接続サーバのIP,ポート番号を環境変数に設定する。
$ export AP_HOST=192.168.100.2
$ export AP_PORT=42378
  1. androidリモートコントロール用のscriptを用意する。

android.pyをダウンロードする。
(中を見るとAndroidクラスの__init__()でsocket作ってる。コンストラクタで接続先を指定されない時に環境変数利用している。)

リモート操作用のプログラム作成

あとは、作って実行するだけ。

  1. toast通知用

とりあえず練習。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
droid = android.Android()
droid.makeToast("Hello,nihohi")
  1. カメラ撮影用

リモートから任意のタイミング(定期的でも)撮影できるので、何か使えそう。
OpenCVと組み合わせて画像認識して撮影とかもできるかも。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
droid = android.Android()
droid.cameraCapturePicture('/mnt/sdcard/sl4a/fuga.jpg')
  1. センサ情報取得用

手で光センサ部分を覆ったり、傾けたりすると値が変化して面白い。
こちらのサイトが大変参考になった。
AndroidFacadeAPIセンサー

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import android
import time
droid = android.Android()
droid.startSensingTimed(1, 500)
for i in range(100):
    event = droid.eventWaitFor("sensors")
    for key,val in event.result["data"].items():
        print "%s:%f"%(key,val)
    print "\n"
droid.stopSensing()

2012/03/09

twitter client(2)

結局、python-twitterでは、認証機能をそのままでは利用できないようで、認証を使えるtweepyという別のモジュールを利用したのでそのメモ。
ざっくりとOAuthの登録、tweepyのインストール、tweepyでOAuthを利用してtwitter APIをたたいてtweet発信/tweet取得、の流れ。

基本的に下記サイトを参考に作業を行った。

  1. ubuntu & pythonでtwitter
  2. python-tweepy
  3. Twitter From the Command Line in Python Using OAuth
  4. python で twitter メモ

tweepyのインストール

ubuntu & pythonでtwitterや、python-tweepyを参考に、pythonからtwitterにアクセスするモジュールtweepyをインストールした。
以下はその手順。なお、開発環境はUbuntu 10.04 + python 2.6.5
aptのrepositoryにはpython-tweepyはないので、repositoryにpython-tweepyを追加し、apt-getでとってこられるようにする。
python-tweepyの「Read about installing」に書いている

$ sudo add-apt-repository ppa:chris-lea/python-tweepy
$ sudo apt-get update
$ sudo apt-cache search tweepy <--以下のように表示することを確認
python-tweepy - Twitter library for python
$ sudo apt-get install python-tweepy

OAuth登録

Twitter From the Command Line in Python Using OAuthや、python で twitter メモを参考に、OAuthでtwitterを使えるように登録する。

$ python
>>> import tweepy
>>> CONSUMER_KEY = 'xxxxxxxxx'
>>> CONSUMER_SECRET = 'xxxxxxxxxxx'
>>> auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
>>> auth_url = auth.get_authorization_url()
>>> print 'Please authorize: ' + auth_url
Please authorize: http://api.twitter.com/oauth/authorize?oauth_token=xxxxxxxxxxxxxxxxx
>>> 

このURLにアクセスして連携を処理。
PIN(=NNNNNNNN)を得た。

>>> verifier = raw_input('PIN: ').strip()
PIN: NNNNNNNN  <--この数字は手で入力。
>>> auth.get_access_token(verifier)
>>> print "ACCESS_KEY = '%s'" % auth.access_token.key
ACCESS_KEY = 'XXXXXXXX'
>>> print "ACCESS_SECRET = '%s'" % auth.access_token.secret
ACCESS_SECRET = 'XXXXXXXXXX'
>>> 

ここまでで準備完了。(上記サイトと同じ手順ででき大変参考になりました。)

tweet発信

>>> import sys
>>> CONSUMER_KEY = 'XXXXXXX'
>>> CONSUMER_SECRET = 'XXXXXXXXXXXXXX'
>>> ACCESS_KEY = 'XXXXXXXX'
>>> ACCESS_SECRET = 'XXXXXXXXXX'
>>> auth.tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
>>> auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
>>> auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
>>> api = tweepy.API(auth)
>>> api.update_status(mypost)
<tweepy.models.Status object at 0x2326f50>
>>> mypost = sys.stdin.readline().strip()
にほんごテストfrom PYTHON
>>> api.update_status(mypost)
<tweepy.models.Status object at 0x2394090>

tweet取得

上記に続いて以下でtimeline取得できる

>>> api.update_status(mypost)
<tweepy.models.Status object at 0x2394090>
>>> print api.home_timeline()[0].text
尾崎豊が長生きしてたらいま何言ってるだろう、というのは、ジミヘンが今生きてたらどうだっただろう、というのと全く違う次元で想像するに値するような気がします
>>> 

お気に入り取得

>>> favs = api.favorites(count=200)
>>> for i,fav in enumerate(favs):
...     print "(%d):"%i,fav.created_at,"|",fav.text
... 

(0): 2012-03-08 02:26:26 | なぜ日本に自動販売機が多いのかhttp://t.co/ckxxlImh これはトルコでも経験した。明らかに売り切れていない商品のボタンを押しても出てこない、釣り銭ボタンを押しても釣り銭が出てこない、中の飲み物が腐ってる(爆)。日本の自販機のメンテナンス水準は驚異的。
(1): 2012-03-07 23:27:38 | 『人間とショウジョウバエはほとんど同じ遺伝子を使って時を刻む生物時計を持っています』- 時間の分子生物学
(2): 2012-03-07 12:07:47 | 紅茶好きが勧める絶対に行っておきたい東京の紅茶専門店7つ http://t.co/Xxj4xU4v
(後略) 

follower/followee取得

# follower表示                                                                                                                
for n in tweepy.Cursor(api.followers).items():                                                                                
    print n.screen_name                                                                                                       
# 自分がfollowしてるひと表示                                                                                                  
for n in tweepy.Cursor(api.friends).items():                                                                                  
    print n.screen_name           

参考:tweepy API