投稿

11月, 2013の投稿を表示しています

C言語でBluetoothスタックを叩きたい人のBluetooth開発入門その1

会社ではCでデバドラを書いてる私は、密かにBluetooth関連のお仕事をかっさらおうと画策中。 しかしながらスタックの知識、実装面等おぼつかない部分があるので、 スタンダードなことを勉強していこうと思い下記の本を会社の資料室で借りた。





めっちゃいい感じ。 PythonとかCでBluetoothスタックを叩いて実装の雰囲気を感じ取れる教科書。 入門じゃぁ!と思って意気込んでプロトコルとか読み漁るよりも、
はじめはざっくり雰囲気でよくわかんねぇけど実装は出来る状態に持っていく。
その上で深さ優先探索していってお勉強が完了するイメージですすめるほうが、
技術の習得においては手っ取り早い。

この教科書、Linux前提で話が進むので、
とりあえず私はWindowsをホストコンピュータとして、
Virtualbox上にUbuntu入れてお勉強進めます。

この本に載ってるソースコードでは、
しょっぱなから #include <bluetooth/bluetooth.h> やってるんですけど、
usr/include 以下を調べてもヘッダ無いんですよねこれが。

何かインストールしなきゃいけないんだろーと思って調べたところ、
bluezなるものをインストールする必要があるとのことでした。
アプリを実装するためにはヘッダ、バイナリが必要なので、
具体的にはコマンドを実行してヘッダを落としてきましょう。

$ sudo apt-get install libbluetooth-dev
# bluezの開発環境をインストール!

あとはここのサイトを参考にしてsimplescan.c を書いちゃって、

$ gcc -o simplescan simplescan.c -lbluetooth
# bluetoothライブラリをリンクしてコンパイル!

はい、実行できた。
きょうはここまで。

Webクローラーを自前で実装する戦略を情弱が考えてたところなんか話がそれて頭の良さの変遷ついて考察する事になった

私は仕事ではもっぱらCのコードを書いてて、
デバドラとか簡単なライブラリを実装している程度の技術力の人です。

仕事とは全く関係なく、ウェブ関連に少し興味持ち始めてきたので、
最近ソケットプログラミング覚えて、ちょっとVirtualboxつかってUbuntu使い始めました。
コマンドラインの素晴らしさを少しづつ学びsshでリモートログインしてとかしていくうちに、
慣れ親しんだWindowsの居心地が悪くなってきました。
githubにもsshでpush(?)してみたり、凄くおもろい。

しかもLinuxは暇つぶしにもいい。
ネットワークスタックのソース見て、
ドライバの実装ってこうやるんだーって勉強になったりもするし。

話は変わって、
少し前、pythonのurllib使ってhtmlファイル落としてきてbeautifulsoupでパースする程度の実装たことがあります。
クローラー的なものを実装してデータマイニングしてみよっかなっていう軽いノリでした。
しっかしクソ面倒。
htmlしっかり書いてるサイトだったらいいんだけど、
お粗末なサイトを徘徊するのはエラーハンドリング周りがしっかりした実装でないと、
所望の処理は行えないわけで。。。
ここでくっそ頑張れば最強pythonクローラーができるかもなんだけど、
それは車輪の再発明で世の中になんの新しい価値も生み出さない。
そもそもpython使ってたのは会社で自動化ツール実装するのに必要で、
遊びながら仕事にも応用できればなーってノリなだけだったし。。


1つの言語で全部済ませたいという目標は、
効率が良いように見えて実は遠回り。
道具は適材適所で使わないとアホみたいに時間がかかることに気付く。

Ubuntuのコマンドラインでほげほげコマンド触ってたら
wgetとかcurlとかあるじゃないって気付きました(今更)。
wgetでドメイン指定して再帰的にぶっこ抜くっていうのも簡単にコマンド一つでできると知って、
やっぱり無知は罪だなー時間を浪費するなーって気付きました。

$ wget -r http://*****.co.jp

ってやれば同一ドメイン上のすべてのファイルを取得可能ですよね。
とりあえず全部ぶっこ抜くのは楽勝。
ぶっこ抜いたデータベースに対してどういった処理を加えるかは、
文字列処理に強い言語を使えば良さそう!


GitHubを始めてみる

手持ちのMac Book Airで何かしらツールを実装して公開してみたくなった.
最初の初期設定についてのメモ.
まずは公式サイトを参考にssh keyの設定
$ git remote add origin git@github.com:user/project.git
$ touch makefile
$ git add makefile
$ git commit makefile -m "Add a makefile"
$ git push origin master

【まとめ】イシューからはじめよ

「イシューからはじめよ」のまとめ。


* 脱「犬の道」、「イシューからはじめる」 本書では、「やってみないとわからない」というスタンスで膨大な時間を浪費する「犬の道」ではなく、
重要な問題、本体解くべき課題にフォーカスして取り組む「イシューからはじめる」ワークフローへのパラダイムシフトを推奨している

* 「イシューからはじめる」アプローチとは (本書P34)

1. イシュードリブン: 本当に答えを出すべき問題「イシュー」を見極める
    イシューを明確にして目的意識のブレを防ぐ
    主語・動詞を入れて言語化し、スタンスを取る

        ・イシューが見つからない時は?(本書P88)
            変数を削る・視覚化する・最終形からたどる・So what?を繰り返す・極端な事例を考える


2. 仮設ドリブン
    - イシューを解けるところまで因数分解しサブイシューを割り出す
        適切なフレームワークでMECEに分解する
    - ストーリーラインを組み立てる

        ・典型的なストーリー
            必要な問題意識・前提となる知識の共有
            カギとなるイシュー・サブイシューの明確化
            それぞれのサブイシューについての検討結果
            それらを総合した意味合いの整理

        ・ストーリーライン
            「Whyの並び立て」
            「空・雨・傘」    

    - 説得に必要な分析のイメージを描く
        「軸の整理」: 比較/構成/変化
        「イメージの具体化」、「方法の明示」


3. アウトプットドリブン
    各サブイシューに対して分析を行う


4. メッセージドリブン
    論拠と構造を磨きつつまとめる
        - 論理構造を確認する
        - 流れを磨く
        - エレベーターテストに備える




GAEでデプロイできなくなった件について

GoogleAppEngine for Javaな話。

ローカル環境でJSP/Servletの動作確認はできたんだが、 デプロイしようとするとバグが出た。。
出てたログはこんな感じ。


JDKのパスを変更したり実装項目の再検討したりしてたけど解決せず。。。 Unable to update:
java.lang.RuntimeException: Cannot get the System Java Compiler. Please use a JDK, not a JRE.
at com.google.appengine.tools.admin.Application.compileJavaFiles(Application.java:814)
at com.google.appengine.tools.admin.Application.compileJsps(Application.java:801)
at com.google.appengine.tools.admin.Application.createStagingDirectory(Application.java:615)
at com.google.appengine.tools.admin.AppAdminImpl.doUpdate(AppAdminImpl.java:418)
at com.google.appengine.tools.admin.AppAdminImpl.update(AppAdminImpl.java:55)
at com.google.appengine.eclipse.core.proxy.AppEngineBridgeImpl.deploy(AppEngineBridgeImpl.java:433)
at com.google.appengine.eclipse.core.deploy.DeployProjectJob.runInWorkspace(DeployProjectJob.java:155)
at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)
at org.eclipse.core.internal.jobs.Worker.run(Worker…