布団の中にいたい

Elasticsearchいじったり、Androidアプリ書いたり。最近は数学の勉強が楽しくなってきました。

Rasberry Piでサーボを動かしてみた

以前Rasberry Piでカメラを使えるようにしてみたものの、この次に何をするか特に思いつかなかったので、今度はサーボを動かせるようにしてみました。サーボは色々はっつければ遊べそうなので期待大。

買ったのは以下。欲しかったのはSG90でカメラマウントは特に欲しい訳ではなかったが、何か括りつけるのに便利そうだったのでついでに購入。

今回はブレッドボードとかは使わずに直接サーボとrasberry piを接続する形にしました。

ざっくりSG90の仕様を調べてみると、赤がvcc、オレンジがPWMで茶色がgroundのようなので、それぞれrasberry piの対応するpinに接続します。

SG90の仕様は以下で見られます。

http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf

rasberry piのpin配置については公式のREADMEに記載されていました。

GPIO: Models A+, B+, Raspberry Pi 2 B and Raspberry Pi 3 B - Raspberry Pi Documentation

ソースコードは以下の方のものを参考にしました。

Raspberry Pi講座 Servo ( SG90, SG92 ) - Hobby robot laboratory

とりあえず、もりもり動くことは確認できたので、次は何かに括りつけて動かしてみたいといいな。

f:id:asahima_194h:20171208221717j:plain

Rasberry Piでカメラを使えるようにした

先日rasberry piを買ってみたものの結局の所、botを運用するサーバーに成り果てているので、それっぽいことをしてみたくカメラを使えるようにしました。

購入したカメラは以下。理由は単純に評価が良さそうだったから。

Raspberry Pi Camera V2

Raspberry Pi Camera V2

rasberry piでカメラを使うようにする手順は以下。

  1. rasberry piでカメラを有効化する
  2. カメラを接続する

rasberry piでカメラを有効化する

やり方はとても単純。

以下のコマンドでrasberry piのconfigを開く。

sudo raspi-config

Interface Optionsという項目を選んで、先頭にあるP1 Cameraを選択。そのまま有効化するかどうか聞かれるので、有効化してrebootすればいい。

カメラを接続する

こっちはちょっと難しめ。実際に動画を見ながらやると捗ると思います。

私が参考にしたのは以下。爪をあげるところから見れるのでかなり役立ちました。

www.youtube.com

実際に写真を取れるか試したいのであれば、raspistillコマンドでお試しできるので、やってみるといいかと。

Rasberry Pi 3 model B を買ってみた

今更ながらRasberry Piで遊んでみたかったので、今の所一番新し目のRasberry Pi 3 model B を買いました。OSのセットアップをするのは嫌だったので、最初からセットアップされているものを買いました。ちなみに買ったのは以下。

Raspberry Pi3 コンプリートスターターキット (Standard)

Raspberry Pi3 コンプリートスターターキット (Standard)

あとはifconfigでip見て、sshできるようにしたり、ノリで買ったカメラモジュールで撮影できるようにしたりぐらいです。カメラ周りについてはまた後でまとめます。

Lチカをやってみたかったり、サーボ回したりしたければ、ブレッドボードとかを買う必要があります。暇なときに秋葉原にでも行って買ってきますかね。

fitbitを買ったので体重をSlackに投稿するやつを作った

つい先日、fitbit flex2を買いました。今までfitbitの初期型のものを持っていたのですが、なくしてしまったのでその代わりです。睡眠に関するデータが取れるらしいので色々期待しています。

Fitbit Flex 2™ フィットネス用リストバンド

まだ買ったばかりで睡眠データとか無いので、今回はさっくりfitbitのapiを叩いて、体重をslackに投稿するやつを作ってみました。

github.com

fitbitのapiを叩くためにpython-fitbitを、slackのincoming webhookを叩くために、requestsを使っています。

github.com

体重を取得しているコードは以下

def getDailyWeight():               
    # fitbit用のclientを作成                                                                                                            
    authd_client = fitbit.Fitbit(                                                                                                                             
        config.CLIENT_ID,                                                                                                                                     
        config.CLIENT_SECRET,                                                                                                                                 
        access_token=config.ACCESS_TOKEN,                                                                                                                     
        refresh_token=config.REFRESH_TOKEN,                                                                                                                   
        system=""                                                                                                                                             
    )                                                                                                                                                         
                                           
    # 昨日の体重を取得                                                                                                                   
    weight_data = authd_client.get_bodyweight(getYesterday())["weight"][0]                                                                                    
                                                                                                                                                              
    return (                                                                                                                                                  
        weight_data["date"],                                                                                                                                  
        weight_data["bmi"],                                                                                                                                   
        weight_data["weight"]                                                                                                                                 
    )                                       

まとめ

fitbitのapiを叩いて、slackに投稿するだけなら割と簡単にできました。本当はslackbotとか使って対話的にできるようにしたいんですが、特に取得したいデータもなかったのでこんな感じになっています。もう少しデータが集まったらbot化してみようかと思います。

「Electronではじめるアプリ開発 JavaScript/HTML/CSSでデスクトップアプリを作ろう」を読んだ

ちょろっと色んな環境で動くデスクトップアプリを作る必要がでてきたので、以下の本を読んでみた。個人的には楽しく読めたし、一度は作ってみたかったものがサンプルとして記載されていたので満足だったのだけれど、気になるところもある感じ。

本の内容をざっくり説明すると、Electronというjsを使ってデスクトップアプリケーションを開発するためのフレームワークがあって、それを使って簡単なアプリを書いてみましょうという感じです。以下に感想書きます。

良かったところ

個人的にはチャットアプリだったり、markdownのアプリだったり、実際に使えそうなサンプルがあったのが嬉しかったです。加えてspectronを使ったテスト方法やアプリケーションの配布方法なども記載されていたので、実際に配布する場合などにもきちんとテスト回しつつできそうです。

なんとも言えないところ

別に悪いという所ではなく、自分の確認不足もあるのですが正直Reactには面食らいました。React自体はちょっとだけ触ったことがあるので本を読むにあたって大きな障害はなかったのですが、Reactをあんまりわからない人が読むと説明があまりなくて大変なので、この本を読む前に簡単なチュートリアル程度は済ませておくと主眼であるElectronに集中できていいかもしれません。

まとめ

「とりあえず簡単なアプリを作ってみよう」ぐらいの気持ちでもさっくり読めて、すぐ応用できそうな内容なので、実際に何か作ってみて試してみてもいいかもしれません。私もせっかくなので趣味のアプリとか作ってみようと思います。

golangのflagで引数を取得する

自分でCLIのツールを作るときは大抵、cobraを使ってやるのですが、サブコマンドを必要としていなかったり、そこまで処理が多くない場合にcobraを使うのは面倒だったので、標準パッケージに含まれているflagを使ってみている。そんななかでflagでオプション無しで引数を渡す所で詰まったのでメモ。

オプション付きの引数

flagでオプション付きの引数を使う場合は以下

var f string

flag.StringVar(&f, "f" "", "default")
flag.Parse()

実行する際は以下

[コマンド名] -f "引数"

オプション無しの引数

オプション無しで引数を使う場合は以下のような感じ。これだと、第一引数が取得できる。

flag.Arg(0)

query stringが自由すぎてびっくりした話

Elasticsearchを使って実際に検索するときに便利なクエリがQueryStringQuerySimpleQueryStringQueryです。これらはqueryでfieldを指定したりAND・OR・NOTを指定できたりするのでかなり自由度が高いクエリです。

この2つのクエリ、使う分にはかなり便利なのですが、分かってないで使うと非常に危なさそうだったので、備忘録代わりに書きます。

SimpleQueryStringQueryとQueryStringQueryはquery_stringのパラメータとして、fieldsを指定することで、そのfieldsの中から検索をすることができるのですが、QueryStringの場合、queryに直接fieldと値を指定されてしまうと、その条件で検索をかけてしまいます。

以下のmappingでindexを作成したとします。 sampleというtypeでidとuser_idというpropertyを定義しています。propertyはともにkeywordです。

{
    "mappings": {
        "sample": {
            "properties": {
                "id": {
                    "type": "keyword"
                },
                "user_id": {
                    "type": "keyword"
                }
            }
        }
    }
}

上記のmappingのindexに以下のデータを入れているとします。

{ "id": "test1", "user_id": "user_id1"}
{ "id": "test2", "user_id": "user_id2"}
{ "id": "test3", "user_id": "user_id3"}

そして以下のクエリを投げると、まさかidがtest2のdocumentが引っこ抜けてしまいます。

GET sample/sample/_search
{
    "query": {
        "query_string": {
            "query": "id:test2",
            "fields": ["user_id"]
        }
    }
}

ちなみにSimpleQueryStringQueryの場合だと指定したfieldsから検索されるので検索結果は空で返ってきます。

まとめ

QueryStringQueryとSimpleQueryStringQueryはとても便利なのですが、私みたいによく分かっていない状態で使うと色々危ないので、無難に検索するのであれば、MultiMatchQueryを使うのが無難かもしれないです。もっと細かい検索(AND・OR・NOTなど)を使いたいのであれば、自前でquery builderを書いたほうがいいんですかね。