あけましておめでとうございます!(遅い)
さてさて、2016年が始まりましたね!
昨年は9月頃から仕事+プライベートが忙しくなってしまったので、
全然更新ができず(年末年始もほぼ仕事で終わってしまいました悲)
まずは昨年の振り返りから
・ブログをこまめに書く。 → 9月ぐらいまではまぁまぁ書けたかな。うん。(書けてない)
・Pythonのスキルアップ → Python3やDjangoを使った案件を取れたのと、CMS開発を行ってきたので達成!
・Swiftアプリ開発 → 案件がなくなってしまったので結局ノータッチ
・ARアプリ開発 → これも時間がなくて出来ず。。。
・ホームページ作成 → CMS開発自体は進んでいましたが、ここまでは到達できず。
・Ring+RaspberryPi → Ringはほとんど触っていないのですが、RaspberryPiでは温度センサーを使ったIoTにチャレンジしました。
・英語の勉強 → これもほぼ出来ず。ダメ過ぎる。。
はい、見事にプライベートでは何も出来ていないですねぇ・・・
今年は、Python、Java、GoogleAppsScript、あとはレクチャー系のお仕事ばかりだったので、その辺りは勉強してスキルアップできたかなぁと思います。
あとは、GoogleAppEngineとAWSを使えるようになりました。
いい感じに幅広く対応できるようになってきています。
もう一つ、昨年はオンラインで勉強会も開催していたので、そちらでも勉強できたのは良かったと思います。
さて、今年ですがブログの方はちょっと低速気味にしようかと思います。(書きたいことは沢山あるのですが、結局仕事がらみのことで書けないことが多かったので。。)
また、プライベートの方が去年よりは時間が取れそうなので、基本的にはCMS開発を進めていこうかなぁと考えています。
あとは、今年は新しいコミュニティを作ったので、そちらに書きたいことを書いていければと思います。
PipelineDBを使ってみた(その2)
前回からかなり間が空いてしまいましたが、今回はPythonを使ってPipelineDBにアクセスしてみました。
コードは以下のサンプルを使っていますが、このままだとリアルタイムに取得できているのかがわからなかったので 各々の処理を分割して実行してみました。
まずはビューを作成するコードです。予めこれを実行してビューを作成しておきます。
import psycopg2 conn = psycopg2.connect("dbname='pipeline' host='localhost' port=6543") pipeline = conn.cursor() q = """ CREATE CONTINUOUS VIEW v AS SELECT url::text, count(*) AS total_count, count(DISTINCT cookie::text) AS uniques, percentile_cont(0.99) WITHIN GROUP (ORDER BY latency::integer) AS p99_latency FROM page_views GROUP BY url """ pipeline.execute(q) conn.commit()
次にクライアントです。これで常にビューを監視し続けます。
import psycopg2 import random conn = psycopg2.connect("dbname='pipeline' host='localhost' port=6543") pipeline = conn.cursor() while True: pipeline.execute('SELECT * FROM v ORDER BY url') rows = pipeline.fetchall() for row in rows: print row
最後にデータをインポートするプログラムです。
import psycopg2 import random conn = psycopg2.connect("dbname='pipeline' host='localhost' port=6543") pipeline = conn.cursor() for n in range(10000): url = '/some/url/%d' % (n % 10) cookie = '%032d' % (n % 1000) latency = random.randint(1, 100) pipeline.execute(""" INSERT INTO page_views (url, cookie, latency) VALUES ('%s', '%s', %d) """ % (url, cookie, latency)) conn.commit()
これで、クライアントを実行し続けて別のコンソールなどでデータをインポートすると、 リアルタイムにデータが取得できているのが確認できます。(今回はサンプルが統計を取るビューだったので、データとしては全データが表示されることになっていました)
まだまだPipelineDBの詳細はわかっていませんが、これを使えばクローラなどで継続的にデータ収集し、ビューで統計してから画面に表示といった使い方が出来るかもしれません。
ReconJETを持って外へ
あまりの夏の暑さと雨のせいで使用を控えてきましたが、
今日は少しだけ暑さがマシになってたので、ReconJETを装着して家の周りを歩いてきました。
実際に外で使ってみた感想としては、
・ディスプレイがある分少しだけ右側の視界が悪くなってしまう
・歩きながらでも表示されている内容がしっかり見えている!(これ重要)
・サングラスより少し重いので、歩いている途中でずれてくるかと思いましたが
そんなことはありませんでした。(これはサイズ次第かもしれませんが)
とりあえずGPSマップアプリも試してみましたが、それなりに感度は良好でした。
今度はもう少し遠出してみます!
ReconJETが届いた!
2年ぐらい前から予約していたReconJETがようやく手元に届きました。
スポーツタイプのヘッドマウントディスプレイなので、見た目がカッコイイです!
とりあえず、初期設定をして使ってみましたがいい感じに動いています。
画面自体は右下のちょっと遠くに見えるような感じで、思った以上にしっかりと画面が見えました。(目の前に浮かんで見えるようなものとはちょっと違うかも)
まだ、部屋の中でしか使っていないので、実際に外で着用した際にどんな感じで画面が見えるのかも試してみたいですね。
また、OS自体がAndroidベースで出来ていて、アプリ開発などもできるようなので、
これから色々と試していきたいと思います。Ringとの連携とかもできたら面白そうですね!
PipelineDBを使ってみた
しばらくブログをお休みしていましたが、ようやく仕事が一段落ついたので再開です!
最近、PipelineDBというオープンソースのストリーミングSQLリレーショナルデータベースプロジェクトがスタートしたみたいなので、ちょっと触ってみることにしました。
PipelineDB—The Streaming SQL Database
まだ詳しくはわかっていないのですが、
Continuous Viewという独自のViewを定義しておくことで、対象のテーブルにデータをストリーミングしながら、継続的にデータが取得するような使い方ができるんだとか。
Apache StormのバックエンドがRDBになった版として使えるのかも?
公式サイトを見るとパッケージをダウンロードしてインストールする形式だったので、早速Ubuntu14.04の仮想環境にインストールしてみました。
Ubuntuなので以下のようにdebパッケージをインストールします。
sudo dpkg -i pipelinedb-0.7.7-ubuntu14-x86_64.deb
しかし、インストール実行直後に以下の様なエラーが;;
rm: `/etc/ld.so.conf.d/pipelinedb.conf' を削除できません: そのようなファイルやディレクトリはありません
どうも、初期化時に以前インストールしたものをクリーンアップするようなのですが、
当然初めてのインストールなのでそんなファイルはありません。
そこで、
sudo touch /etc/ld.so.conf.d/pipelinedb.conf
として空のファイルを作ってから再度試してみたところ、うまくインストーラが動いてくれました。
また、私の環境だとlibcurl3が入っていなかったので、以下のコマンドでインストールしてから、再度dpkgを実行する必要がありました。
sudo apt-get update
sudo apt-get install libcurl3
これで無事にインストールができたので、まずは初期化コマンドを実行
pipeline-init -D 任意のディレクトリ名
次にサーバーを起動すると使えるようになります。
pipeline-ctl -D 任意のディレクトリ名 -l logfile start
上記を実行後にQuickStartに書かれているコードを実行してみたところ、無事に結果を得ることができました。
公式ページにpythonのサンプルも書かれていたので次回に試してみたいと思います。
Flaskのjsonify
最近、仕事を並列で行っているのでちょっとサボリ気味
サーバー側のテスト用にFlaskを使っているのですが、
jsonify関数にこんな感じでリストを渡すとダメだったのでメモ
@app.route("/items", methods=['GET']) def items(): list = [ {"id": "1","name": "hoge","category": "1"}, {"id": "2","name": "fuga","category": "2"} ] response = jsonify(results=list) response.status_code = 200 return response
これだと500エラーが出ちゃいます。
正しくはこんな感じに渡さないとダメなようです。
@app.route("/items", methods=['GET']) def items(): list = [ dict(id=1, name="hoge", category=1), dict(id=2, name="fuga", category=2) ] response = jsonify(results=list) response.status_code = 200 return response