udon's blog

思いついたことを、思いついた時に。忘れないように。

コマンドラインArduino環境の構築

つかれたー

ことの始まり

使いにくい。あの中途半端なIDE

http://www.arduino.cc/en/Main/software

で、イロイロぼやいていたわけです。

どうせavrなコンパイラ叩いたりとかだけだろうし、IDEにverboseなログ出すなりでコマンド解析して、ちょっとしたスクリプトでも書けばイケるだろうとか考えてたわけですわ。

でもそんな言ってると、コマンドラインツールがあると教えてもらえました!

https://github.com/amperka/ino

ino init

でプロジェクト作って、

ino build

でビルドできて、

ino upload

で書き込みできるわけです。 コレは便利!!!!

なぞのエラー

で、調子に乗ってちょろっとソースを変えたりしてみました。

main.ino

#include <SD.h>
#include "foo.h"
File root;

void setup()
{
}

void loop()
{
  foo(root);
}

foo.h

#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
#include <SD.h>
void foo( File root );

#endif

foo.ino

#include <SD.h>

void printDirectory(File dir )
{
  // もろもろコード
  // ...

  return;
}

これでビルドするとエラーになると。。。 なんか、Fileの定義が無い とか言われるわけです。 Fileの定義はSD.hにちゃんとあるんですがね・・・・

で、ちょっと見てみると.inoを.cppに一旦変換してからコンパイルしてるみたいだったので見てみました。*1

./build/uno/src/foo.cpp

#include <Arduino.h>
void printDirectory(File dir );
#line 1 "src/foo.ino"

#include <SD.h>

void printDirectory(File dir )
{
  // もろもろコード

・・・・ヘッダのインクルードより前にプロタイプ書き込まれてる!?

そらいかんわな・・・

ふぁいっ!

ていうか、何か環境悪い?とか、インクルードの書き方間違えてる?!とかイロイロ見てみたけどダメ。。。 ino本体はgithubに公開されているもののpython製のためかなりしんどい。 コレ?とか思うのに手を入れたりしてみたけど、そもそもeasy_installしたモジュールをローカルファイルで更新する方法すら知らない状態。。。。 *2

で、いろいろ探してると、実は既知のバグだった 事が判明。

https://github.com/amperka/ino/issues/35

ぐぬぬ・・・。一瞬ino使うの諦めかけた・・・。

けどよく考えれば、forkするなりしてパッチ当てればよくね?とね。

ざ・ぱっち

issueに書いてくれてるパッチはgitのdiffだったりして当て方わからん・・・。*3

ので、手元で修正して当てた。


--- ino/commands/preproc.py
+++ ino/commands/preproc.py
@@ -35,6 +35,7 @@ class Preprocess(Command):

         sketch = open(args.sketch, 'rt').read()

+        out.write('\n'.join(self.includes(sketch)))
         header = 'Arduino.h' if self.e.arduino_lib_version.major else 'WProgram.h'
         out.write('#include <%s>\n' % header)
         out.write('\n'.join(self.prototypes(sketch)))
@@ -47,6 +48,11 @@ class Preprocess(Command):
         matches = regex.findall(src)
         return [m + ';' for m in matches]

+    def includes(self, src):
+        regex = re.compile("\\s*#.*")
+        matches = regex.findall(src)
+        return [m.strip() for m in matches]
+
     def collapse_braces(self, src):
         """
         Remove the contents of all top-level curly brace pairs {}.

ようやく

・・・で、いろいろ遠回りしたけどようやく環境が整いましたわ。 なんかこんなんばっかで気力使ってるくね?

ちなみに今回直したinoはforkしたレポジトリに上げましたとさ。

https://github.com/datsuns/ino

コレでようやく快適Arduinoライフ!な、はず!!!

*1:Arduino IDEも同じような動きみたいです

*2:inoと同じ階層で sudo easy_install inoとか。sudo python setup.py install --force とか

*3:git amっつうのもあるらしいけど

のーひん至上主義

なんとかとの遭遇

まぁ、、、いいんですけどね。

ちなみにまだテストしてない段階だったみたいで

for( int a = 0; a < 100; a++ ){
  for( int b = 0; b < 100; b++ ){
    for( int c = 0; c < 100; c++ ){
      for( int d = 0; d < 100; a++ ){
      }
    }
  }
}

こんなんになってて最後が無限ループになってたけどw

how feel ?

遭遇したコードは自分は触らないし、おそらくメンテをすることも無いコードだったんですよね。となると「まぁ触らんしええか」とかね。思ってしまったわけです。

そんなんでええはずないだろうがっ!!

と、なんとか我に返りましたけど。 *1

終わり良ければ?

結局さっきみたいなのは納品したらハイそれで終わりというのが身に染み付いてしまってるんですわな。 ある程度まで顕在化せずに済めば何も痛くもないしもうそれでイイ、というわけです。

納品したから終わりなんてS/Wとしてあるはず無いし、頭では分かってるはずなのにこの体たらくですよ。いかんなー

多重何とかを引きずりまくってるナントカSIとか、こんな納品お疲れさん方式とか、ホントダメす。ダメダメダーメですよ。

ちゃんとイロイロ考えよう、と自分に言い聞かせつつ。

*1:が、権限的に何もできないのは変わらないんですが

cygwinでgtest

なんかわからんけどむちゃくちゃハマッてしまったのでメモ代わり。

やろうとしたこと

rakeでgtest!

手順

  1. gtestを落とす
  2. <gtest-dir>/make/Makefileを参考に gtest_main.a を作る
  3. それをリンクに指定

そんだけ。文字にすると死ぬほど簡単じゃないか。

結果的なrakefile

require 'rake/clean'

CC = "g++"

task :default => "all"

GTEST_DIR = '~/work/programming/c/lib/gtest-1.6.0'

SRCS = FileList["**/*.cpp"]
OBJS = SRCS.ext('o')

LIB_OPTION = "#{GTEST_DIR}/make/gtest_main.a"
INC_OPTION = "-I #{GTEST_DIR}/include"

file "all" => OBJS do |t|
  sh "#{CC} #{LIB_OPTION} -o #{t.name} #{t.prerequisites.join(' ')}" 
end

rule '.o' => '.cpp' do |t|
  sh "#{CC} #{INC_OPTION} -c #{t.source} -o #{t}"
end

task "run" do
  sh "./all"
end

task "lib" do
  sh "cd #{GTEST_DIR}/make && make clean && make"
end

CLEAN.include(OBJS)
CLOBBER.include("all")

一応"rake lib"で.aを生成するようにはしてみた。

結局

README読めばわかったことなんです。。えぇ。

余談

なぜかcygwinにgcc4.7入れようかとか脇道に逸れまくって時間ばっかりかかってしまった。。。 やりたいことがネストしていって元に戻れない 癖はどうにかせなイカンな。。

markdownテスト

タイトル

  • リスト
    • ネストリスト
      • 更にネスト

見出し

  • 強調してみよう
  • イタリックもできるよ

素で入力するとこんな感じ

見出し

hello

見出し2

hello2

見出し3

hello3

改行を入れた
ら、こうなる


線を引く

リンクも当然。

引用したくなる

複数行の引用は 一行目だけ引用指定でOK これで引用し放題!

間に引用以外を入れないとくっついてしまうぽい

けど 一行目しかマークを入れないと 改行がされないね。

引用のネストだ!

デブサミ関西2012へ

Developers Summit 2012 Kansai
たしか関西は今年で二度目でしたっけ?
まぁだからってことはないんですが、仕事サボって行って来ました。

出席したセッション

C1 → A2 → C3 → A4 → C5
特に狙ったわけではないんですが「モバイル(=C)」と「アジャイル(=A)」をテレコにとっていたという。そうですかワタシの興味はやっぱりそこですか。

【C-1】関西から世界に通用するスマートフォンサービスの開発

サイバーエージェントの方の講演。
やっぱり何か社員に活気があるのね!という印象でした。

なんか「会社の一部の企画部だけ頑張って企画は出すけど、たいていの社員はしらけ気味」なんていうの、あるやないですか? *1 そういうのが無い(ないしは、かなり少ない)んやなー、と。
良くも悪くも体育会系なノリ?な感じがしました。

あと関西の拠点にて勉強会サポートな動きもされているとか。その辺も注目ですね。

【A-2】エンタープライズ開発におけるコラボレーション - JIRAによる顧客と開発

初めのあたりを聞いて「おろ?」とおもたんです。アジャイルバズワード的に捉えてね?って。
でもまぁ、大規模なエンタープライズ!なコンテキストでいくと、そうなるもんなのかなーとか。
あとはJIRAとかJIRAとかJIRAとか。

【C-3】「実はユーザ評価下がってる!スマフォアプリ開発の罠」

1に省電力2に省電力、3,4がなくて5に省電力。
最近のsmart phone向けアプリは、とにかく電力使用量がカギ(というか生命線)ですね。
んで「じゃあ昔のiappliとかどうだったんよ?」ってのは結局端末自体が頑張ってくれてたんですね、と。

ともかく想像以上に組み込みエクストリームな話で面白かったです。

  • とにかくムダなH/W機能は使うな(有効にするな)
    • 液晶はもちろん、メモリ操作も案外電池を食う

ですよねー。
ただ、メモリも槍玉に上がってたのは意外でした。
んー、H/W毎にどれくらい使用電力が違うのかも知りたかった。*2

アラーム機能やらとかで、混線しやすい時間とかに起動されたりもしますわなと。
そういえば「〜時ちょうどとかは避けて、1分2分でもいいからその前後で通信しよう」っていうのを見かけたことがありますね。時間の制約がゆるいならその方がいいんやろうなぁ。

  • 通信回線での状態遷移(高速通信/低速通信/アイドル)別に消費電力が違う
    • 高速→低速→アイドルへの遷移はタイムアウトでしか発生しない
    • なので必要な通信が終わってタイムアウトを待っている間は無駄な電力を消費する
    • 細々通信するよりまとめる

タイムアウトのみって・・・そんなもんでよかったの?ですけど、そう決まってるもんらしい。。

たぶんあれですね、物理的なアクセスとかはどうせチップメーカーの提供するライブラリに隠蔽されるし、ファイルシステムもOSやらなんやらに依存する(おいそれとは手が出ない)し、なので「遅くなったとしてもユーザビリティが下がらないように気をつけよう」になるんだろうなぁー。

そういえば非同期なAPIがあるならそれを使うのもいいのかもですね。

んでもって、こんな必死な(涙ぐましい)話なんて、キャリアや端末メーカーはどれほど考えてんだろ?と。
もちろんH/W要件的にはかなり詰めるんでしょうけど、特にプリインストールアプリとか、かなりおざなりになっとんちがうか?と勝手に想像したりしてます。
まぁAndroid端末なんて「root取れるか確認してから買う」ものなはずなので、実際に使う分にはそこまで影響ないかもですけど *3

あとそうそう、NFC-Laboとやらもチェックぽいです。
NFC Labo

【A-4】Struts の時代から、標準 Java EE で実現する効率的な Web サイト構築の時代へ

Javaイィーッ!(戦闘員風

話されていることのほとんどがわかりませんでしたが、時々Twitterとかで流れる単語が何を示しているのか、を幾つか拾えたのでそれで満足。
ちなみにじゃんけん大会は負けました。。。

【C-5】実演ライブコーディング!触って動かす組込プログラミング

最後のお楽しみ!だったんですが、「Android + Arduinoで計測した気温をTwitterにpost」って話を聞いた時点でどんなプログラムになるのかあらかた想像ついてしまったのが残念でした。
ていうかこの前Arduino買ったんだけどタイミング的に最悪じゃんか!

あそうそう、ADKはUSB-Shieldを買えばできるってのを講師の方から教えてもらえたので、それは収穫でした。
今のが落ち着いたらちょっとやってみようかなーーー。もしくは誰かをノセて買わせよう!

感想

一つ一つのセッションがそれほど長時間でなかったのもあるせいか、一日があっという間でした。
なんかアジャイルよりも組み込みネタのほうに過敏に反応してしまう自分がいいのやら悪いのやら。
まぁいいっすよね。

でもどれかひとつくらいBセッション(web tech)も出ればよかったかな。。また次回かなー。

p.s.

懇親会のpaypal精算にて唯一のクレジットカードが弾かれてしまった・・・。くそぅ。

*1:ワタシの経験がアレなだけかもですけど

*2:調べろ?はいそうですよね・・・

*3:root化するとプリインストールアプリ消せるんですね

社内アジャイルセミナーを開催(してもらった!)

感謝

とにもかくにも。
いきなりお願いしたのに素晴らしいセミナーを開いてもらった@さんと@さんにはほんとうに感謝です。ありがとうございました!

目的

「社内」と銘打ってればモロバレですけど、もちろん弊社社員向けに「アジャイルって?」を感じてもらおうというやつです。
が、、、結構告知とかしたものの参加者が二人。。。
このままでは開催すら危ういというお粗末ぶり。。。
ん〜〜、日がダメだったのかなぁ・・ *1

結局お知り合いの方数人に急遽お声がけして来てもらったという。
何から何まで迷惑ばかりすみません orz

内容

「ぢ・あじゃいる」なワークを4つほどやっていただきました。*2
知ってたのもあり、知らなかったのもあり。濃くてよかったです。

課題

非常に素晴らしいワークで良かった!!んですが、良すぎるために「楽しかった」で終わらないかと思ったりしてます。
もちろん、終わらせない様にするのはワタシの仕事なんですが。

とりあえず参加者二人のうち一人は権力ある人間なので、社内だけでも何か継続した勉強的なものをできるように考えようかなと。

あとは呑み過ぎな!注意な!

*1:妻帯者多いんです

*2:イロイロで具体的な内容はオブラーティッドしときます