2016/10/31

[py]はじめてのclass

pythonで何かするお仕事が止まっているので、ネタが切れかかっている。。。
えい、前回いっていた「文字列かbytearrayかを処理するだけのclass」を作ってみよう。

 

pythonにpublicやprivateというものを決めるキーワードは特になく、名前で決めるようだ。
でも、入門記事を見ていると、「こうだと思ってたんだけど」みたいな書き方で、言語仕様がどうなのか読んで書いているのかどうかわからんかった。
python2のドキュメントを読む。

  • __init__()は特別
    • コンストラクタ
  • プライベートな変数
    • 言語仕様としては無い
    • 慣習としてアンダースコアで始まる名前は、非publicとして扱う

 

python2.7で試す。

class StrBin:
name = ''

def __init__(self):
pass

def set_name(self, name):
self.name = name

def _hello(self):
print 'Hello, ' + self.name


sb = StrBin()
sb.set_name('yoshio')
sb._hello()

Hello, yoshio

 

pyCharmとしてはテキストエディタとして警告が出るものの、実行は問題ない。
当然、これもOKだ。

class StrBin:
_name = ''

def __init__(self):
pass

def set_name(self, name):
self._name = name

def _hello(self):
print 'Hello, ' + self._name


sb = StrBin()
sb._name = 'nitori'
sb._hello()
Hello, nitori

 

行儀はよくないだろうが、できる。


では、あっさりしたclassを作ってみよう。

class StrBin:
_value = ''
_type = -1 # 0:bytearray 1:string

def __init__(self):
pass

def set_bin(self, byte_array):
self._value = byte_array
self._type = 0

def set_str(self, string):
self._value = string
self._type = 1

def get_str(self):
if self._type == 0:
return self._value.encode('hex')
elif self._type == 1:
return self._value
else:
raise Exception('not set value')

def get_bin(self):
if self._type == 0:
return self._value
elif self._type == 1:
return self._value.decode('hex')
else:
raise Exception('not set value')

sb1 = StrBin()
sb1.set_str('ab12')
print 'get string: ' + sb1.get_str()

sb2 = StrBin()
val = b'\xab\x12'
sb2.set_bin(val)
print 'get bin: ' + sb2.get_str()

if val == sb1.get_bin():
print 'same !'
else:
print 'not same..'

 

まだソースコードをblogにうまく載せられないので、改行が消えてしまったようだ。。
ともかく、最初の代入で文字列かbytearrayかをちゃんと指定しておけば、あとはget_bin()なりget_str()なりで適切な方に変換してくれる。

2016/10/28

[py]pyCharmでbytearrayを見たい

そうか、そういうことか。。。

pyCharmでbytearray型(という表現でよいのかよくわからんが、文字としてじゃなくてバイナリ値を扱いたいときの話)を使っているのだが、ブレークポイントで止めて値を見ても文字列で表示しようとして、化けて出てしまう。

そういうときは、「Evaluate Expression」のダイアログを開いて、そこで「encode('hex')」などと表示したいように入力してやれば、その形式で表示してくれるようだ。
さすがスクリプトだ。

2016/10/27

NXPが買収される予定

Qualcomm to Acquire NXP

珍しくnxpからメールが来たと思ったら、これですよ。
マイコンとしてNXPのを使うことはそう多くないのだが、NFCの雄だ。

NFC worldも反応してます。
NXP to be bought by Qualcomm in US$47bn deal • NFC World

2020年ということなので、完了するまでは予定になるのだろうけど、大きいと思っているところもこうなるんですな。
Phillipsって、いまどうなってるんだろう。

 

 

ARM買収も驚いたけど、こっちもなかなかでした。

[py]pyCharmを使うことで改善されたか?

起動したときのアイコンが「PC」だったので、パソコンのことかと一瞬思ったが、略したらPCなんだな。

image

型がわからなくて困る問題がpyCharmを導入することで改善したかというと、そういうことはない。
まあ、bytearrayとstrの違いなんて、pyCharmだってわからないはずだ。
せめて、メソッドがないとかそういうレベルであれば、エディタの段階で気付かせてくれるだろうに。

新しくコードを書き始めれば、また目覚めるのかもしれないが、ちょうど一通りコードを書き終わった後なので、ソースの整形にしか使っていないのだ。
だから、使った方がよいかどうかは、また後日だな。

期待するのは、ブレークポイント。
今まではprintを埋め込んでいたのだが、やりやすくなるはず。
埋め込んだprintを削除する作業がけっこう面倒に感じているのだ。。。
Cで書いているときは、わざとインデントをずらしてprintf()を置くことで、ざーっとソースを眺めてデバッグ出力を見つけられたのだが、pythonだとインデントがずらせないので目印を付けておくくらいしかやれることがない。
少しだけやってみたが、bytearray型の変数が見づらい。
Cであれば、変数のアドレスを取ってきてメモリビューアなんかで見れば済むし、VisualStudioやIntelliJでも配列要素は1つずつ見られたのだが、ここはツールというよりも言語仕様の違いなのだろうか。

 

 

つらつらと書きながら思いついたのだが、decode('hex')とencode('hex')で書くのではなく、binasciiのa2b_hex()とb2a_hex()を使うようにしたらよいのでは無かろうか?
・・・関係なかった。
そもそも、「バイナリ」と「文字列」が同じ系列で扱えるんだから、関数になったって同じだ。

だから、別の「バイナリ型」があればよいのだ。
python3ではb'xxxx'というやり方になっていたと思うが、その辺が見分けられるようになったのかも。
16進文字列と文字列の変換 - Qiita
そんなことはなさそうだ。。
どっちも引数がb'xxxx'になっている。
うーん。。。。

 

まぬけな気がするけど、自分でclassを作って、チェック機構を付ける方が建設的かもしれない。

2016/10/26

[py]pyCharmで見ると、かなり指摘された

変数の型がわからないのはIDEを使ってないからかも!ということで、有名そうなpyCharmをインストールして、作っていたライブラリを開いてみた。
テキストエディタのように普通に開けたのだが、スクロールバーが見づらいなぁ。

 

あ、これ全部指摘だ・・・。

 

全部は見ていないけど、PEP8という指摘が多い。
コメントがああだこうだ出ている。

Python のコーディング規約 PEP8 に準拠する - Qiita
ほう、そういうものがあるのか。
しかし・・・細かい。
無理に従うつもりはないのだけど、今から変な癖を付けたくもないので、理解できるところは対応しよう。

 

しかし、指摘はスクロールバーにしか表示してくれないのか?
あ、色設定がtwilightだから見えなかっただけのようだ。


・関数内の変数は小文字にしよう

ちっ、私にしては珍しくキャメルを使ってやったのに、この仕打ちか!

 

・関数名も小文字にしよう

えっ、そうなの?
アンダースコアでつなげるタイプなんだ。

 

・引数にlenとか使っちゃいかん

そんな短いのを標準で使わないでおくれ・・・。

 

・そこに括弧はいらないよ

tupleで値を返すのに括弧で囲んでいたのだけど、いらないんだ。。

 

・ブロックコメントは「#」で始めよう


ああ、「#こめんと」じゃなくて「# こめんと」とスペースを空けろということか。

 

・行末にセミコロンはいらん

習慣なんだよ、習慣!

 

・関数間は2行空ける

あー、はいはい。

 

・行が3行以上空いている

。。。

 

・docstringはダブルクオーテーション3つで

普通のところはシングルクオーテーション3つで何も言われないけど、ファイル先頭だけは指摘された。
pydocでコメント化されるからだろうか。

 

・1行が長い

改行するよ!

と改行したら、こんな警告が出てきた。

image

どうやら、改行後の位置まで指摘しているらしい。

a = abc + def + ghi + jkl

のghiとjklの間で改行したい場合は、

a = abc + def + ghi
        + jkl

のようにするとよいようだ。
やれやれ。。。

 

この辺をRefactorを使いつつ修正して、今まで作っていたサンプルを動かそうとしたら、動かない。
変更した関数名が、下々に反映されていないのだ。
Refactorを使ったのに、なぜ・・・。

そうか、プロジェクトの設定で、作ったライブラリが有効になるようにしていなかったから、下々は関連性がわからずに反映されていなかったということか。
確認欄に出てくるファイル名が少ないと思っていたんだ。。。

pyCharmの「File > Settings > Project:xxx > Project Structure」で、Add Content Rootをライブラリのあるフォルダにしたら見えたのだけど、何か設定が違う気がしている。
PYTHONPATHに追加するだけだったのだけど、Project StructureじゃなくてProject Interpreterの方に追加するのかしら。

でも、こっちでローカルのファイルを追加しようとするとエラーになるのよねぇ。
__init__.pyがないからかしら。
まあ、これは後日調べよう。


簡単な対応は上記くらいで、あとはコード部分になってきた。

 

まず、単なる足し算の行が指摘されている。
image
なんだよ・・・
あ、pythonって、「+=」が使えるんだ!
++が使えなかったので、+=も無いと思い込んでいたのだ。
不覚。。。

この指摘って、マウスカーソルを外すとすぐに消えてしまうのだが、なんとかならないだろうか。。
検索したくても消えてしまうのだ。

 

doxygen用の「##」も指摘されるのか。
pydocのものでも処理はしてくれるそうだ。
http://www.doxygen.jp/docblocks.html#pythonblocks

ただ、私がdoxygenを使いたいのは、引数の説明(型としてこれを取ります、など)を書きたいからなのだ。
だから、doxygen形式で書きたいのだけど、そうするとPEP8指摘が多数出てしまう。

特定のコメントを書くと無視してくれるらしいけど、うーん。。。。
How to disable a pep8 error in a specific file? - Stack Overflow

あ、#を連結しても、その後に文字列が続かなければ警告が出てこなかった。

##
# 関数のコメント
# @param[in] xxx aaa

こんなのでよいらしい。
ちゃんと先頭は@briefで拾ってくれているようだ。

 

最後に、そんな属性はない、という警告が残った。
検索すると、import文で出てくるという例はあったのだが、関数内の方は見つからなかった。
動いているから、ないってことはないと思うのだが、わからんので放置だ。


多少、口うるさいという印象を受けなくはないが、C言語もこのくらい規約がうるさければ、人によってソースの書き方がずいぶん違うと言うこともなかっただろう。
まあ、時代が違うから、C言語の自由さとその結果から得られたものだ、と思うことにしよう。

[py]型指定しない言語を使う人は、どうやって型を見分けてるのだろうか?

まあ、pythonだけではないのですが。

pythonを使い始めてかなり悩んでいるのが、変数を型宣言せずに使えることです。
なんというか、C言語で言えばすべてがvoidポインタ型になっていて、キャストせずに最後に代入した型として使える、という感じだろうか。

 

いま、プロトコルを解析したり作ったりしているのだが、decode('hex')とか、encode('hex')とか、struct.pack()とか、struct.unpack()とか、そんなのばかり使っている。
技がまだわからないので、bytearray型からprintするときはencode('hex')して、計算するときはdecode('hex')して、とパタパタやっている。

そうしていると、だいたいどこかで間違って、既にprintできる形でできている変数を、さらにencode('hex')して「1234」が「31323334」になったりしてしまう、という悲劇が起きている。
関数化して間違いを少なくしようとはしているのだけど、その関数に与えるのを間違えるのもしばしばだ。

 

だいたい、bytearrayでも、strでも、どっちも同じグループだから同じように扱えてしまうのがいかん!
いかん、と力強くいいたいのだけど、最近の言語はどっちかといえば型を強要しない方向が多かったように思う。
JavaScriptもそうだし、C#もvarが使えるようになったみたいだし。


ということは、使う人がそれに慣れればうまく使えるという意味ではないだろうか。
もしうまく使えないのであれば、そういう傾向は広がらないはずだからだ。

 

思いついたのは、変数の型名を決めることだった。
なんだっけ、なんかそういう名前ルールの名前があったはずだ(コロンブスとかコロンビアとか、なんかそういう感じだったような。。。)。
昔は評判が悪いという人もいた名前付けルールなのだけど、型のない時代にこそ生きてくるのか?

ただまあ、これはこれでけっこうめんどくさい。
関数名は、読んでわかりやすいように、文字列を返すときは「xxStr()」などとしているが、1つでも忘れてしまうと意味が無くなってしまうので、しんどい。

 

 

などと調べていたら、pythonでアノテーションのしくみが導入されるらしいという記事を見かけた。
Javaもそうだったけど、あれはよいよね。
まあ、統合開発環境じゃないと効果が少ないかもしれんが。

はっ、いまpythonをテキストエディタでやってるけど、IDEを使うと悩みが減るのだろうか?

2016/10/25

[py]pydocとdoxygenの両立がうまくいかない

自分用にユーティリティ関数を作っていたのだけど、どうせしばらくすると忘れてしまうだろうからコメントを付けておこうと思う。

どうせコメントを付けるなら、いつものようにdoxygen形式にするか、と思ったのだが、どうもpythonにはpydocというしくみがあるようだ。
これもまたコメントにしたものをドキュメントにするツールなのだが、特殊な構文はないようで、それっぽい位置にコメントを書いておけばドキュメントになってくれるようだ。

 

それでもよいかと思っていたのだが、変数にドキュメントとしてのコメント付けができないらしく、定数がいくつかあるモジュールだったので、ちょっと寂しい。
まあ、pythonは定数というものがないようなので、安全に運用するなら関数化して置いた方が無難なのだろうが、練習だ。


#encoding:utf-8

## @file    doxy.py
## @brief   doxygenで書いてみよう


## すごい関数
# @param[in]    prm1    すごい引数
# @return       すごい結果
def func1(prm1):
    '''
    good function
    '''
    return prm1 + 'is very good !!'

こういうpythonファイルを書いておくと、pydocでこう見える。

Help on module doxy:

NAME
    doxy - #encoding:utf-8

FILE /cygdrive/d/Prog/python/study/doxy.py

FUNCTIONS
    func1(prm1)
        good function

 

これはまだよいのだが、doxygen出力の方だ。

image

関数内のコメントが映り込んでしまった。
なんか、技はないものか。。。

2016/10/24

[py]classにしなくてもモジュールとして使える

JavaやC#は、classを作る。
classを作って、その中にメソッドやら何やらを詰め込む。

pythonもそういう言語なのだろうと思って、同じファイル内では関数(クラス内ではないメソッドという意味ね)が書けるけれども、importする場合はクラス名がいるんだろう、と思い込んでいた。

だから、自分用のユーティリティ関数を作っていたのだが、それはclassにして、@staticmethodを全部に付けていた。
そうすると、同じファイル内でメソッドを呼び出したくてもクラス名を書かなくてはならないので、面倒だなぁ、しょうが無いなぁ、と思いながらやっていた。

 

が、そういうことはしなくてよいのだ。
ファイル名がモジュール相当で、それをimportしたら「ファイル名.関数名()」という形で使うことができるんだな。。。
おじさん、気付かなかったよ。

いやあ、使うときに「from ファイル名 import クラス名」みたいにしていたけど、他のモジュールってそういう使い方してないよなぁ、とは思っていたのだ。
「クラス名は大文字から始めるのが基本ルールです」と書いてあるのに、小文字で始まっているものが多いから「まったくルールを守らずに・・・」とか思っていたけど、あれはモジュール名だったのね。

気付けばわかるんだけど、一人でやっているとなかなか気付かないものだ。

[nrf51]MTU長の変更APIは今のところ無い

よく調べていなかった・・・。

S130が使えるようにnRF51822のRAM32KB版を買ったのだけど、S130はバージョンが2.0.1が最新で、まだなのかどうかわからないけど、今のところMTU長の変更APIが無かった。

しまった。。。
予定では「MTUをマックスまで延ばしてみました! でもスループットが上がったかどうか実感できませんね」という記事を書くはずだったのに。。。

 

気を取り直して、S130 v2の特徴を調べておこう。

  • GAP
    • LE Secure Connectionサポート
  • L2CAP
    • sd_ble_l2cap_xxx() APIが23バイト以上のパケットをサポートした

新規はこの2つだが、むむ、23バイト以上を一番下がサポートしたんだったら、あとは上位層が対応すればよいのか?
nRF52だって、MTU長の変更サポートはv3からだし、まだ希望は捨てなくてよいだろう。

 

ただ、Core v4.1以下の機器しかない状況では、普及すんのか?というのがネックになる。
そのうちスマートフォンで4.2対応機種が出てくるかもしれないけど、それまではv4.2の機能を使った機器は出てこないだろう。
そしたら、4.2に対応したスマートフォンを出さなくていいや、と思ってしまうかもしれない。

 

それだったら、いっそのこと別の規格でもいいんじゃないか?という発想が出てくるかも。
今のうちに試せるものがあれば遊んでみたいのだが、うん、やっぱり2.4GHz帯以外となると、個人ではなかなか手が出せませんなぁ。

2016/10/23

[ble]BLE nanoを使う

先月買ったまま放置していたRedBear社のBLE nano。
RAMが16KBタイプは持っていたのだが、S130はそれでは使えないようなので、32KBタイプを買ったのだ。
くっ、もったいない。。。

 

SWDとして線は出ているのだが、形状がJ-Linkのものと違うので、nRFgo Studioなどが使えない。
nrfjprogなんかもダメそうだ。

 

BLENano/USB-IF at master · RedBearLab/BLENano
まず、ここでMK20-USBに入り、MK20の基板バージョンにあった方をダウンロード。
うちのは、V1.0だった。

これを、書いてある手順で焼く。
USBに挿す前に、横にあるボタンを押したままにし、USB接続し、ドライブとして認識されたらボタンを離す。
そして、D&D(うちはWindows)。
10秒くらいしたら再起動してよいらしいので、そうするとドライブが「DAPLINK」という名前で見えるようになる。

 

これに、S130のHEXをD&Dし、KeilでnRF51822用の設定にしてビルドし、デバッグするとmainで止まってくれたから、動いているのだろう。
RUNするとAdvertisingもしていたから、たぶんよかろう。

Keilって、CPUの設定を変えるとメモリのマッピングが初期化されるから、スクリーンショットを撮ってから変更すると楽かも。


でもやっぱりJ-Linkでつなぎたい。
前もやった気がするが、むりやりつなげよう。

image

うーん、きれいに撮影できない。。
図で描くと、こうだ。

image

VTrefをつながないとダメなので、計4本。
1.27mmというのがつらい。。。
今回は、秋月で買っていた1.27mm--2.54mm変換と、1.27mmコネクタを切り離すときに割れてしまったピンを使った。
スズメッキ線やジュンフロン電線の細いのがちょうどよいようなのだが、手元にないのよねぇ。
そういうのがあれば、こんな変換コネクタなど使わずに済むのだ。

つなげば、nRFgo Studioで見ることができる。

image

[esp8266]ESP8266の提供コンパイラはUbuntu on Windowsでは動かないようだ

あまり使っていないUbuntu on Windowsだが、VirtualBoxでLinuxを立ち上げてTeraTermで使うような場合であれば置き換えることができるのではなかろうか?

そう思って、ESP8266のコンパイラを動かそうとした。
コンパイラは、ESP8266のサイトからたどって、GoogleDriveに置いてあるものを解凍した。
が、どうにも動かない。

$ xtensa-lx106-elf-gcc
bash: /home/xxx/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc: cannot execute binary file: Exec format error

うーむ。

$ file ~/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc
/home/xxx/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=7a9f0d0e5bc08c2aabfaffdf2a31acd4f83fc3a0, stripped

うーむ。。

$ file /usr/bin/gcc-4.8
/usr/bin/gcc-4.8: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=4ac5c87ccc7bfc62f4b7c72ffab1210eca56295d, stripped

うーん。。。
32bitと64bitの違いだよねぇ。

 

 

ここは無理をせず、コンパイラを別から持ってくることにした。
Toolchain · esp8266/esp8266-wiki Wiki
持ってくるというか、gitで落としてきてビルドするだけなのだが。
お仕事だと、さすがに提供されたコンパイラじゃないと嫌なのだけど(自分のせいになるので)、自分用ならよかろう。

ct-ng buildというのが、えらく時間かかっている。
そして、ビルドできたのだけど、インストール先が思ったようになってくれない。。
手順をあまり読まずにやっているからか(そりゃそうだ)。

 

というわけで、提供された環境を使う方が楽な気がしてきた。

2016/10/22

[python]decode('hex')した型はstrだった!

文法もろくに調べないまま、適当にpythonを使っている。
C/C++以外はどうでもいいやっていう気持ちがにじみ出てしまい、なんとかしたいのだが、どこから始めたものだか。。。

 

前回、python3でdecode('hex')ができないというのはわかったのだけど、python2でdecode('hex')した結果がなんなのか、全然把握していなかった。
気持ちとしては、バイト型の配列か何かだろうと思っていた。

foo = 'abcd'.decode('hex')
bar = len(foo) + foo

データ長を頭に付けたいので、うまくいくかどうかわからんが上記のような式を書くと、エラーになった。
「intとstrは足せません」みたいなエラーだ。

str ?

心配になったので、type(obj)でobjの型を見ることができるらしいのでやってみると、「<type 'str'」と出てきた。

decode('hex')した結果の型は、strなんだ!

プリンだと思い込んで食べていたのに、これは茶碗蒸しですよ、と言われた気分だ。
変なものを食べていたわけではないし、満足していたのだが、えっ、としか言えない。


よく考えてみれば、兆候はあった。
decode('hex')した結果を足し算したら、加算ではなく連結されていたし。
都合がよかったので見過ごしていたが、あのときによく考えれば気付いていたはずだ。

 

さて、python2で16進数を扱うのにstrを使うのは常套手段なのだろうか?
覚え始めなので、変なことは覚えたくない。
が、もうツールをdecode('hex')で作ってしまったので、普通の使い方じゃないなら、そのことくらいは認識しておきたい。

検索してみたが、よくわからなかった。
int(str, 16)みたいにして数値にしている人もいるし、decode('hex')だったり、ord()だったりhex()だったり。
やり方と表現がいろいろありすぎだ。
思うに、decode('hex')でstrになるのは、C/C++でchar型が8bitだから配列にしてバイナリデータを扱おう、と思うのと似たようなものかもしれない。

 

ちょっとまだ、pythonがどういう言語なのか理解できていない。。。


おっと、最初の課題が片付いていなかった。
データ長(1byte)を連結したいのだ。

fooにdecode('hex')したデータが入っているのであれば、len(foo)でデータ長は出てくるはず。
たぶん「\0」で終わり、なんてルールにはしていないんじゃなかろうか。

 

foo = '00112233445566778899aabbccddeeff'.decode('hex')
print '%02x' % len(foo)

こうすると、

10

になった。
うん、大丈夫だ。

 

foo = '00112233445566778899aabbccddeeff'.decode('hex')
foo = '%02x' % len(foo) + foo
print 'data=', foo.encode('hex')

こうすると、

data= 313000112233445566778899aabbccddeeff

あれ・・・。
データ長はASCII扱いになっている。
そうか、こうするしかないのか。

foo = '00112233445566778899aabbccddeeff'.decode('hex')
foo = ('%02x' % len(foo)).decode('hex') + foo
print 'data=', foo.encode('hex')

これで、

data= 1000112233445566778899aabbccddeeff

うん、ようやく認識があった。

もうちょっと格好良くしたいところだが、今の私にはこれが限界だ。

2016/10/21

[c/c++]私のC言語 - 最適化

C/C++なら、ネタが無いときでも何か書けるだろうと甘い考えを抱いていたのですが、かなり甘いことがわかりました・・・。
善処します(≒がんばらない)。

 

C/C++以外の言語はよく知らないが、C/C++ではコンパイル時に最適化オプションの選択ができることが多い。
選択できない場合は、コンパイラ自体は選択できるけれども、ツールのデフォルトが固定になっているとかだろう。

私の最適化オプションの選び方は余り根拠がない。
開発環境が提供されていて、サンプルアプリがあるようであれば、その設定を流用する。
位置から書かないといけない場合は、gccでいえば-O2くらいを選んでいる。
最近は、-O3で提供された環境が多かったから、-O3でもいいかな。

そう、根拠がないのだ・・・。

逆のパターン、最適化をゆるくするときは、だいたい決まっている。
動かしてみて、不明なエラーが出ていて、最適化をしなくても余裕がある場合だ。
まあ、だいたいロジックに不具合が見つかるのだけど、それを解決しても最適化レベルはなんとなく低めにしてしまう。

やっぱり、根拠がないのだ・・・。


ともかく、正しく動いているのであれば、最適化が弱かろうと強かろうと、どっちでもよいだろう。
正しいというのは、速度的にも満足していないといけない。

古くから組み込みをやっていて、最適化で痛い目を見た会社だと「最適化禁止!」というところもある。
昔はコンパイラのバグとして、最適化処理にバグがある、ということがしばしばあったのだけど、最近はユーザも多いし、最新版とかじゃなければ大丈夫だろうと思っている。

コンパイラにバグがなければ、あとは人間の問題だ。
痛い目を見ながらでも、技術を上げていった方が良いんじゃないかと思っている。

思っているのだけど、管理する立場からすると、そんな面倒なことに関わり合いたくないという気持ちはわかる。
「最適化禁止!」としてしまって、不安要素は最初から取り除いておこう、という行動は合理的だと思うのだ。
やることは他にもあるしね。

 

だけども、だけれども、だ。
最適化を禁止にするというのは、コンパイラに負けた気がするのだ。
使いこなせないということを告白するようなものなので、せめて「最適化を許可しても動くんだけど、ふん、ルールには従ってやるわい」くらいのところまではやっておきたいのだ。

文字にすると、すごく負け惜しみっぽいですな。。。

2016/10/19

UARTのエラー

お仕事でUART通信をしている。
よく使うので、作業工数として考えてすらいなかったのだが、ここではまっている。。。
データが化けるのだ。

毎回ではなく、特定の条件があるわけでもなく、たまに化ける。
ドライバはチップメーカーが提供しているので、それを使っているので、あまり心配していない。
じゃあ、ロジックか?
化けているのではなく、間違ったデータを書き込んだとか??
でも、そういう感じもしないしなぁ。
FIFOもまあまあ大きいので、バッファあふれってこともない気がするし、それだったらエラーが来るだろうし。

そしてようやく、framing errorが発生していることに気付いた。
困ったことに、エラーはドライバが握りつぶしていた。。。
エラー返せよ!!

 

フレーミングエラーは、ストップビットが来るべきはずのタイミングで来ていない、という現象とのこと。
えーっと、何もないときはHI状態なので、スタートビットがLO、ストップビットはHI状態なのかな。
UARTはハードがやってくれるので、ソフトはレジスタに設定するだけだ。
だから、こっちのマイコンがストップビットのタイミングだと思って読込んだらLO状態だった、ということになる。
たった1bitなので、データによっては発生しないこともあるだろう。
その場合は、エラーにはならないものの、データ化けするはずである。

 

さて、原因は?
通信速度が微妙にずれているか、ノイズがときどき載るかのどっちかだと思う。
ロジアナで見る限りではずれている感じもしないので、ノイズなのかなぁ。。。。
オシロで見た方が良いのかもしれんが、手元にないし。
試作の前の段階で、私が適当にUART線を接続しているからかもしれないし、電源が弱そうなのでそこからノイズが載っているのかもしれんし。

うううう・・・。
逆さまつげで弱っているときに、こういうのが起きるとつらいですな。

2016/10/17

[win10]lxssというフォルダでウイルス検知された

うちは、Windows10 64bit環境だ。
久しぶりにAvast! Freeのクイックスキャンを掛けたところ、ウイルス検知された。

AppData/Local/lxss/rootfs/tmpにあるexeファイル。
名前はmain-ret-zero-pe-i386.exeだが、そこにたどり着くまでにclangなどのフォルダ名があったので、コンパイラだと思う。
しかし、Explolrerで見ても、lxssというフォルダ自体見えない。。。
直接パスを打ち込むと、入ることができた。
隠しフォルダ表示にしても見えないので、なにやらシステム関係なのだろう。

 

ネットで検索すると、Bash on Ubuntu on Windows関係とのこと。
(関係ないことだが、onってこういう風に重ねてもよいのだね。)
tmpだし削除してもよかろう、と勝手に考えて、Explorerで消した。

on Ubuntuの中では、このtmpは/tmpと同じ扱いだった。
だからまあ、消してもよいのではなかろうかね・・・。
意外とファイルサイズは大きかった。


心配になってlxss自体のサイズを見たところ、3GBくらいあった。
うーん、うちのCドライブはSSDなのだが、このサイズはちょっとつらいかも。。。

そうなると、lxssをHDD側に移動させてしまいたいのだが、大丈夫だろうか?
使用頻度が少なくてサイズが大きなファイルは、HDD(うちではDドライブ)にフォルダを作って、SSD(Cドライブ)にジャンクションを作るようにしているのだ。
うちではSSDが貴重な資源なのだ。。。

できれば、Windowsが動いていないときにやってしまいたい作業なのだけど、その技を持っていない。
だから、Program FilesなんかはSSDのままだ。
まあ、これは速度的にもそれでよいのかもしれんが。

ちょっと、技を増やしたいところだ。

2016/10/15

[ubuntu]16.04にアップデートしてからsambaがインストールできないのはsmb.confだった

うちは、VirtualBox上にXubuntu 16.04.1をインストールしている。
元は14.04で、アップグレードで16.04になり、16.04.1になった。

そしたら、sambaがinstallできていないことに気付いた。
14.04で動かしていたので、そのまま動いていると思い込んでいたのだ。

 

別の環境で、16.04.1を直接インストールしたのだが、そちらでは何もなくインストールできた。
どうも、アップグレードした場合に発生しているようだ。


どう失敗するかというと、smbdの起動のようだ。

Setting up samba (2:4.3.11+dfsg-0ubuntu0.16.04.1) ...
Job for smbd.service failed because the control process exited with error code. See "systemctl status smbd.service" and "journalctl -xe" for details.
invoke-rc.d: initscript smbd, action "start" failed.
dpkg: error processing package samba (--configure):
subprocess installed post-installation script returned error exit status 1

 

updateサーバをMain Serverにしたらできた、という人もいたのだが、うちではダメだった。
メッセージに従い、コマンドを打ってみる。

$ systemctl status smbd.service
● smbd.service - LSB: start Samba SMB/CIFS daemon (smbd)
   Loaded: loaded (/etc/init.d/smbd; bad; vendor preset: enabled)
   Active: failed (Result: exit-code) since 土 2016-10-15 08:41:59 JST; 2min 19s ago
     Docs: man:systemd-sysv-generator(8)

10月 15 08:41:53 xxx-VirtualBox systemd[1]: Starting LSB: start Samba SMB/CIFS daemon (smbd)...
10月 15 08:41:58 xxx-VirtualBox smbd[23962]:  * Starting SMB/CIFS daemon smbd
10月 15 08:41:59 xxx-VirtualBox smbd[23962]:    ...fail!
10月 15 08:41:59 xxx-VirtualBox systemd[1]: smbd.service: Control process exited, code=exited status=1
10月 15 08:41:59 xxx-VirtualBox systemd[1]: Failed to start LSB: start Samba SMB/CIFS daemon (smbd).
10月 15 08:41:59 xxx-VirtualBox systemd[1]: smbd.service: Unit entered failed state.
10月 15 08:41:59 xxx-VirtualBox systemd[1]: smbd.service: Failed with result 'exit-code'.

 

$ journalctl -xe
10月 15 08:41:59 xxx-VirtualBox systemd[1]: snapd.refresh.timer: Adding 1h 46min 1.727239s random time.
10月 15 08:41:59 xxx-VirtualBox systemd[1]: Started CUPS Scheduler.
-- Subject: Unit cups.service has finished start-up
-- Defined-By: systemd
-- Support:
http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit cups.service has finished starting up.
--
-- The start-up result is done.
10月 15 08:41:59 xxx-VirtualBox systemd[1]: Started ACPI event daemon.
-- Subject: Unit acpid.service has finished start-up
-- Defined-By: systemd
-- Support:
http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit acpid.service has finished starting up.
--
-- The start-up result is done.
10月 15 08:42:01 xxx-VirtualBox sudo[22965]: pam_unix(sudo:session): session closed for user root
10月 15 08:42:32 xxx-VirtualBox anacron[628]: Job `cron.weekly' terminated
10月 15 08:42:32 xxx-VirtualBox anacron[628]: Normal exit (2 jobs run)
10月 15 08:44:29 xxx-VirtualBox pkexec[24316]: pam_unix(polkit-1:session): session opened for user root by (uid=1000)
10月 15 08:44:29 xxx-VirtualBox pkexec[24316]: pam_systemd(polkit-1:session): Cannot create session: Already running in
10月 15 08:44:29 xxx-VirtualBox pkexec[24316]: xxx: Executing command [USER=root] [TTY=unknown] [CWD=/home/xxx]

うーん、よくわからん。
もう一度、MainServerに変更してから試す、というのをやってみよう。
upgrade - Samba does not launch after upgrading to 16.04 - Ask Ubuntu


まずは、更新しておこう。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

sambaをpurge

$ sudo apt-get purge samba

設定も移動させておこう。

$ sudo mv /etc/samba ~/

GUIのSoftware & Updatesで、Main Serverに変更して、もう一度sambaをインストール。。。
ダメだ。エラーだ。

 

あら、/etc/sambaって、インストール時にデフォルトを作ってくれないんだ。
コメント欄にも、smb.confがどうのこうのと書いてあるので、極力コメントアウトしてみよう。

・・・インストールできた。
statusも正常そうだ。
system-config-sambaもインストールできた。
Windows10からもアクセスできた。
そうか、そういうことか・・・。

2016/10/14

[py]print文

pythonのprintを使うと、自動的に改行が行われてしまうようだ。
回避方法はあるのかもしれないが、1行に書いてしまえばよいだけだろう、とも思う。
前回の

foo = bytes.fromhex('123456789abcdef0')
print(''.join(format(x, '02x') for x in foo))

も、1行で出してしまいたかったからだ。

数字を16進数で出したければ、これでよいようだ。

>>> print '%x' % 1234
4d2

これでも同じらしい。

>>> print format(1234, "x")
4d2

ゼロがほしいときは、

>>> print '%04x' % 1234
04d2
>>> print format(1234, "04x")
04d2

など。
この辺りは、printfの使い方と似ているので、まあ大丈夫だろう。

 

並べたいときは、

>>> print '%d %x' % (1234, 1234)
1234 4d2

のように、引数の方を括弧で囲むようだ。

 

ちょっと迷うのが、コンマ。

>>> print 'x', 1234
x 1234

スペースが空くのだ。
嫌だったら、足し算を使うのか。

>>> print 'x' + str(1234)
x1234

文字列の連結になるためか、数字を文字列に変換せんといかんかった。

 

まだ技はありそうだが、(私が)普段使いそうなのはここら辺だろう。


これはprintとは関係ないが、文字列はダブルクオーテーションでもシングルクオーテーションでもよいらしい。

>>> print "abc"
>>> print 'abc'

これが、なかなかなじめない。。。
ただ、両方使うことができるので、

>>> print '"abc"'
"abc"
>>> print "'abc'"
'abc'

という技が使えるようだ。

2016/10/12

[py]python3は16進数の扱いが違うんだ

お仕事で、たまにpythonを触ることがある。
大したことをするわけではなく、ライブラリと一緒に配布されているexamplesに、ちょっと手を加えて実行する程度で、本格的にアプリを組むというのはやったことがない。

自覚しているが、私はどうもスクリプト言語が苦手だ。
そのせいか、pythonも便利そうなことはわかるのだけど、本気で覚える気力がわいていない。
これから使う機会が多いので、イヤイヤ期は卒業せねばならぬのだが。。。

 

さて、pythonがどうだ、というわけではないのだけど、16進数の扱いが難しいと感じる。
私がやると、どうしてもプロトコル解析とか、バイナリデータ操作とかが主なので、16進数で1バイトずつアクセスしたいのだ。

先週、ようやく

foo = '123456789abcdef'.decode('hex')
print foo.encode('hex')

という形でそれっぽく扱うことができることがわかった。
これでもう怖くない!と思っていたのだが、昨日使ったexamplesでは「decode()なんてないよ」といきなり怒られてしまった。

しばらく気付かなかったのだが、ファイルの先頭に「python3」などと書かれている。
gcc3とかgcc4とかと同じようなものかと思ったが、そうではなく、言語のバージョン自体が違うらしい。
そういえば、python2系とpython3系でどうのこうの、という記述を見たことがある。。。

どうも、python3では「bytes」という型があるらしい。
python3のbytes型とstr型の比較と変換方法 | Python Snippets

文字列の前に「b」と付けると、bytes型になるようだ。
16進数をバイト列にすると、こういう感じでよさそうだ。

foo = bytes.fromhex('123456789abcdef0')

printすると「\x」がついて邪魔なのだが、文字列じゃないからそのまま出力されても困るし、仕方ないところか。
変換すればよいだけなので、よしとしよう。

ただ、bytes型だけじゃなく、整数型としても16進数を扱えるので、「あれ、自分は16進数のデータをどうやって扱っているんだっけ?」ということになってしまう。
ライブラリに頼っているので、結局は受け入れてくれる形に変換するしかないのだ。

 

朝の続き。
bytesの16進数を、文字列で表示させたい。
C言語で言えば、こういう感じだ。

const uint8_t foo[] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
for (int lp = 0; lp < sizeof(foo); lp++) {
    printf("%02x", foo[lp]);
}
printf("\n");

python3だと、こうかな?

foo = bytes.fromhex('123456789abcdef0')
import binascii
print(binascii.hexlify(foo))

hexlify()は、b2a_hex()でもよいらしい。

これは悪くないのだが、

b'123456789abcdef0'

と、「b」とかシングルクオーテーションが付いてしまうのが気にくわない。
文字列だろうから、と「[2:]」などとしても、b'は消えない。
これは、hexilify()の戻り値がbytesだからだ。
つまり、16進数文字列を、16進数としてbytesに変換するだけだから、print()の方がb'を付けていることになる。

 

ちなみに、

foo = b'123456789abcdef0'

でやると、

b'31323334353637383961626364656630'

となる。
つまり、文字列を16進数にしているのだ。
C言語で言えば、文字列中にエスケープシーケンス\xで16進数を直接書いた場合に使うことになろう。

 

数値に変換したい場合は、C言語だとこう書くかな。

long val = strtol("abcdef", NULL, 16);

確か、文字列が0xで始まっていても、うまいことやってくれたような気がする。

print(int('123456789abcdef0', 16))

でやると、

1311768467463790320

となった。
「1311768467463790320 = 0x123456789ABCDEF0」だから、そのままの見た目で変換してくれるようだ。

 

であれば、さっきの話に戻るが、

print('%x' % int('123456789abcdef0', 16))

とすると、

123456789abcdef0

となるので、まだるっこしいが「b」やらシングルクオーテーションやらは取り除かれる。
目的は達するけど、ちょっとねぇ。。。。

 

こんなことすると、

print(('%x' % int('123456789abcdef0', 16)).zfill(20))

結果は、

0000123456789abcdef0

とゼロ埋めしてくれるので、悪くない。。。のかな。。。

 

ただ、数値で扱える範囲を超してしまうとダメだろうから、やはり1要素ずつ変換するのが素直なのではなかろうか。

foo = bytes.fromhex('123456789abcdef0')
print(''.join(format(x, '02x') for x in foo))

だと、

123456789abcdef0

なので、私が思っているイメージになった。

2016/10/10

[nrf52]Compatibility Matrix

nRF52シリーズ用のCompatibility Matrixドキュメントがリリースされた。
今回はPDFじゃないようだ。

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52%2Fdita%2Fnrf52%2Fnrf52_comp_matrix.html&utm_campaign=Product+Update+Notifications&utm_source=hs_email&utm_medium=email&utm_content=35577894&_hsenc=p2ANqtz-9JsjrbrgvyMs-43xrQmqofRnFeWRQl2dWu3N68pMS9DLFpuqOA6VRZAl88wSlzohRybL2VH8b_dUnC_LXUeTR0bJVWgw&_hsmi=35577894

 

ふむ、まだIC revisionは「1」しかない。

QFABは、FLASH 256KB、RAM 32KBと半分なんだな。
まだ国内で使えるnRF52832の評価モジュールはあまり出ていないようだけど、出そろってきているらしいので、覚えておいても損はないだろう。

https://www.facebook.com/Nordicsemi.Japan/photos/a.152726684934094.1073741829.126463744227055/526446920895400/?type=3&theater

2016/10/08

[nrf52]nRF52832の開発環境(GCC)

nRF52832の開発環境についてメモを残しておこう、と急に思い立ったのだが、実はnRF51822と同じでよいため、書くことがほとんどない。

hiro99ma blog: [nrf51]gcc+eclipseでの開発(2015/01/09)

 

現時点でのSDK最新版はv12.1.0なので、追記だけしておこう。

  • nRF5 SDK v12.1.0のページ(Infocenter)
  • GCCは「GCC ARM Embedded 4.9 2015q3
  • GCCをインストールしたパスに合わせて「components\toolchain\gcc」のMakefileを編集する。
    • たぶん、GNU_VERSIONは使ってない
  • ビルドは、コマンドプロンプトやcygwinなどお好みで
    • コマンドプロンプトの場合、makeコマンドをどこかからインストールする
    • cygwinの場合、Makefileのパスの書き方に注意がいるかも

 

GCC版のよいところは、コードサイズの制限がないと言うことだろう。
製品版のIDEじゃないと、リンクサイズが制限されるのだが、nRF52くらいだとそこそこ大きいプログラムを作ってしまい、制限されてしまうと哀しいかもしれない。
私はWindowsで開発しているけれども、LinuxやMacでもGCC版ならほぼ同じ感じでやれるのではなかろうか。

Makefileを作るのが面倒だと思うのだけど、これはEclipseでうまいことやると楽になるかもしれない。
私はEclipse自体を立ち上げるのが面倒だと思ってしまうので、自分でMakefileを作った方を好んでいる。

 

ただ、GDBに慣れていないので、結局はEclipseを使っている。
軽量のGUIフロントエンドがあるとよさそうだけど、SWDでSEGGERを使っていて、Eclipse用の設定が準備されているので、あれこれ考えるよりもEclipseを使ってしまう。

nRF5はブレークポイントで止めると、再開させてもExceptionが発生するので、動かしながらデバッグするときはRTTかUARTを使うことになり、あまりEclipseの出番がない。
だから、これはこれでよいのかな、と思っている。

[win10?]片方のモニタだけパーセントを変えるのは、つらかった

昨日の続き。

「テキスト、アプリ、その他の項目のサイズを変更する」が100%だと、ノートPC側の液晶画面でも、外部接続した液晶モニタでも同じ比率で見える。
見えるのだけど、ノートPCはピクセル自体が小さいので、非常に小さく見えてしまう。
ノートPCは14インチ、液晶モニタは23インチなので、けっこうな差があるのだ。

しかし、「テキスト、アプリ、その他の項目のサイズを変更する」の設定はアプリごとに無効にできることがわかったので、設定を150%にしておいて、見栄えが悪いアプリだけ無効にする作戦をやってみた。

 

・・・だめだ、私にはダメだった・・・。

どうも、スクロールバーのようなものは大きいまま維持されるようなのだ。
また、ウィンドウを移動させると、ウィンドウがどちらのモニタに属しているかによって表示が切り替わるのだが、その切り替わり方に慣れることができなかった。

ちょっと、表現方法が思いつかない。
とにかくまあ、慣れなかった、という他なかろう。

結局どうしたかというと、100%設定で使うようにした。
文字が小さいのは、慣れる。
きっと、慣れる!と思い込むことにした。

 

どうするのが一番よかったのかが、まだわかっていない。
外付けの液晶モニタとノートPCのピクセルサイズが同じくらいになるようにしておけばよかったのかもしれない。
ドット、パー、インチ。
つまり、1インチ辺りのドット数が同じであれば、画面サイズどうこう関係なく1ドットの大きさは同じになるはずだ。

うちのThinkPad T61も、もう8年くらい経つので、今年買い替えるかどうか悩んでいるところだった。
しかし、今回のようなことがあると、ちょっと迷うな。
あー、でも、うちはノートPCをデュアルでつなぐことはほぼないので、そこまで気にすることはないかもしれん。

2016/10/06

[win10?]デュアルモニタはピクセルの大きさが顕著に出る

作業場で、新しいノートPCを買ってもらった。
いぇい。
ノートPCで、画面は1920x1080と広いぞ!

 

だが、いくら広いと言っても、開発するには2画面くらいほしい、ということで、液晶モニタももらってしまった。
こっちも1920x1080と広いぞ!

あれ・・・ノートPCの広さと同じだ・・・。

 

これをデュアルモニタとしてつなげるとですね・・・
液晶モニタではちょうどよい大きさの文字が、ノートPCではとても小さく見えてしまうのです。
もちろん、画面との比率は同じ。
単にピクセルが小さいので、全体として小さくなってしまうという現象です。

なかなかこれは悩ましい。。。
テキストエディタをいくつか開いて、ウィンドウごとあっちにこっちに移動させるのですが、ノートPCにあわせると液晶モニタでは大きすぎるし、液晶モニタにあわせるとノートPCでは小さすぎるし。。

 

image

実は、ノートPCを初めて起動したとき「えらく文字やアイコンが大きいな」と思ったのです。
これは、「テキスト、アプリ、その他の項目のサイズを変更する」がデフォルトで150%になっていたためでした。
150%が「推奨」になっています。

これでよいかも、と思ったのですが、私が好んで使うフォントがMSゴシックなので、それが1.5倍になるとカクカクしてしまうのです。
フォントサイズが1.5倍というよりも、表示倍率だけ変わっているのかもしれません。
あるいは、スケーラブルになる前のドットフォントだからかも。。

 

今日は、このパーセントは100で、テキストエディタのフォントサイズを大きくしてやり過ごしました。
これを100%以外にしていても、アプリの設定で個別に無効にできるらしいので、そちらで対応した方がよいのかも。
Windows 10 でアプリの文字表示のにじみを解消する小技 - しっぽを追いかけて

ちなみに、このパーセントはモニタごとに設定できるので、デュアルモニタで両方のバランスを取る、という心配はいらないです。
ただ、錯覚じゃないですが、比較する画面が並んでしまうので、やたらと大きかったり小さかったり見えてしまうというのはあるかと思う。

MQTT

MQTTなんて知らなくても生きていけるわい、と思っていたが、生きていけなくなりそうなので調べている。
ふっ、人間の主義主張なんて、生活環境によってすぐ変わるものよ。。。

 

幸い、日本語の資料も多い。
プロトコルについては、IBMのページが一番わかりやすいと思った。
MQ Telemetry Transport (MQTT) V3.1 プロトコル仕様

正確には、ここのリンク先にある日本語のPDFだ。
PDFを見るのが面倒であれば、英語版のページもよいと思う。
そこまで面倒な仕様ではなさそうだ。

 

あまり納得がいかないのが、ヘッダが2種類あること。
全体としては「ヘッダ」と「ペイロード」なのだけど、固定ヘッダ(fixed header)と可変ヘッダ(variable header)があるのだ。
「固定ヘッダ」と「ペイロード」にして、ペイロードの中で小分けすればいいやん、と思うのだ。

だって、固定ヘッダに載っているデータ長も「可変ヘッダ+ペイロード」だし、可変ヘッダのサイズだけを取得できるわけでもないのだ。
可変ヘッダとペイロードの境目があいまいすぎる気がする。

それに、ペイロードを持っているコマンドは限られているのだ。
CONNECT, SUBSCRIBE, SUBACKだけらしい。
いやいや、PUBLISHがあるじゃないかと思うのだが、アプリケーション固有のデータのみだからという理由なのか、ペイロードじゃなくてBLOB、と言ってる。
うーん。。。へりくつのような。。。

 

わかりやすい、とさっきは書いたが、一般的な技術ドキュメントと比較するとわかりづらい部類だ。
実例が多いのはよいのだけど、フラグとビットの割り当てが書かれていなかったり、例だけしかなくて各項目の詳細説明がなかったりする。

プロトコルを把握する必要があまりないのかもしれないが、これがわからないとバイナリの解析ができないのだ。


MQTTって何?というのは、こちらがわかりやすい。
さすがGoogle検索で一番上にあるだけのことはあるな。
MQTT as a Service sango

publishとかsubscribeとかいう単語があるので、新聞のしくみと似ているのかもしれない。

新聞の編集・出版を行っているのが「broker」で、記事を書く人はタイトルを付けて文章を書き、brokerに「○○新聞の△△記事の1つとして配信して!」とpublish依頼する。

記事を読みたい人は、brokerに「○○新聞の△△記事を配っておくれ」と依頼したり、「○○新聞を配っておくれ」と依頼したりできる。

「○○新聞の△△記事」のようなのは、ディレクトリ構造のような指定の仕方になっている。
ワイルドカードも使えるので、あるディレクトリに引っかかったものは配信してほしい、というようなことができるのだ。

 

まあ、私が書くよりも、リンク先を見てもらった方が良かろう。

テストする場合だが、broker=MQTTサーバは誰かが作ってくれているとして、publishしたりsubscribeしてもらったりするMQTTクライアントをどうするか。
私は、Androidのアプリを使っている。
Windowsでツールがあったのだけど、Windows10で動かしているせいか動作が安定しないのだ。
ただ、WireSharkでパケットを見ることができるので、バイナリデータを確認するのに向いている。
明日はM2Mqtt Spyを試してみよう。
M2Mqtt Spy – Microsoft ストアの Windows アプリ

2016/10/05

nRF5 SDK v12.1.0リリース

NordicのnRF5 SDK v12.1.0がリリースされた。
https://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v12.x.x/

オフラインドキュメントも更新されている。
SDKとしてはv12.0.0も残っているのだが、Infocenterの方はv12.0.0のサイトにv12.1.0のことが書かれているので、v12.0.0は取り消し扱いなのだろう。

http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.0.0%2Findex.html&cp=4_0_0


リリースノートによると、こういうところか。

  • S132 v3.0.0のserializationを追加し、S132のserializationはやめた
  • nRF52832のエラッタ反映
  • 対応SoftDevice
    • S130 v2.0.1
    • S132 v3.0.0
    • S212 v2.0.0
    • S332 v2.0.0

 

あまりぱっとしないのだが、マイナーバージョンを上げてまでアップするものだったのだろうか?

差分を見ると・・・ああ、そういうことか。
エラッタ反映がexamplesのほぼ全体に及んでいるんだ。
components/toolchain/system_nrf52.cだけなのだろうけど、Keilはビルド時にファイルをコピーしてくるようになっているのか、その差分が見えていた。
また、MDKも関係しているようで、プロジェクト設定がv8.9.0に上がっていた。
私はgccだから関係ないのだが、MDKを使っている人は注意した方が良かろう。

それ以外にも、細々した修正が入っている。
浮動小数点の扱い方を修正していたり、サンプルでタイマを止め忘れている箇所があったり。
APIの変更はなさそうなので、そのまま差し替えてもよさそうな感じだ。

 

いつものことながら、ヘッダファイルの変更が多い。
何かというと、コメントが間違っていたり、誤字修正だったり、改行位置を修正していたり。
いや、正しく直しているのだからよいけれども、ファイルが多すぎて全部見る気になれない。。

2016/10/04

[bds]Bluetooth Developer Studio 1.1リリース

アイコンが赤から青へ。。。
Bluetooth Developer Studioが1.1になったというリリースがありました。

image

image

https://www.bluetooth.com/download-developer-studio?_cldee=YmJfdWVub0B5YWhvby5jby5qcA%3d%3d&recipientid=lead-45cb2055ba82e61180f15065f38acb61-6064004ebad44fd1a568c51ef4b57402

 

数日前に立ち上げたら、自動アップデートでインストールされていたのだが、リリースするほどだったとは。。

 

違いがよくわからなかったけれど、メニューのTOOLSの中に「Protocol Viewer」というものがあった。
が、選択しても「インストールされていません」と出てくる。
ファイアウォールとウイルス対策ソフト(Avast! free版)をオフにすると動いたのだが、キャプチャーなどしそうなアイコンが出ていたので、対応したドングルを持っていないと使えないのかもしれない。

image

対応ドングルは高いものではなさそうだけど、きっと日本の技適には通ってないような気がする。
あ、99ドルってけっこうするな。
自分で製品を作るわけでもないし、いらんだろう。

 

これ以外のアップデート内容がわからんかった。
気付いたら書いていこう。

[win10]再起動に対するほうれんそうがなっとらん

最近は言わなくなったような気がするが、昔は「報告・連絡・相談」と言われたものだ。

今日、Windows10の作業中、いきなり再起動した。
更新しているようなメッセージが出ていたので、Windows Updateによるものだろう。
ええ、私が作業して開いていた開発環境や、書きかけの見積書は全部閉じてしまいましたよ。。。

 

うちはWindows10 Proなので、gpedit.mscで設定をすることができる。
だから、やっていたと思うのだが、見てみると解除されていた。
Windows Updateされると、レジストリの設定ってところどころ消されるよね。。。

 

ともかく「Windows Updateで再起動したい」と報告したり、「今から再起動しますよ」と連絡したり、「再起動してよいでしょうか?」と相談したりすれば、なんとかできるのだ。
めんどくさいと思いつつも、少なくともファイルを保存するくらいのことはできる。

それがいきなり再起動するから、みんなから文句を言われるのだ。
やはり、報告・連絡・相談は大事なのかもしれん。
少なくともOSにはやってほしいものだ。

 

あと、「アクティブ時間」を確認したけど、これは問題なかったのだ。
12時間しか指定できないけど、その時間内だったのだ。
あれって、ちゃんと効いているのだろうか?
時間外になったらすぐ再起動するわけでもなかったので、有効なのかどうかはっきりしない。

再起動させないためには、Windows Updateの自動更新を止めるのが一番安全らしいので、本末転倒になってしまった感じはする。
普通に考えると、勝手に再起動するOSって、ただのバグだよなぁ。
そういう意味では、バグの元を絶つ対策なのかもしれない。
そして手動更新を忘れて、やられてしまう、と。。。

 

いかんいかん、再起動されたことでイライラしていたようだ。
こういう建設的でないことを書いても仕方ないので、gpeditでやった設定を載せておこう。

ローカルコンピュータ>
 コンピューターの構成>
  管理者テンプレート>
    Windowsコンポーネント>
      Windows Update > 自動更新を構成する

image

「未構成」だったので、有効にして「2」にした。
デフォルトは「3」の「ダウンロードして準備できたら通知」らしい。

えー、通知されなかったんだけど。。。

 

あと、

image

と、

image

も有効にしていたようだ。

 

しかし、「通知」に何も出てこないのは気になるな。
なにか、ミュートしすぎたのだろうか?
「使用するためのヒントやおすすめの方法」にはチェックを入れているのに。。。


[2016/10/06更新]

初めて、Windows Updateのダウンロード前に通知が出ました!
スクリーンショットを残しておけばよかった・・・。
いつもの画面右下にある吹き出しみたいなところからティッカーが出てきて、ダウンロードするものがあることを伝えてきました。
やるじゃないか。

ダウンロードが終わったときのスクリーンショットでも載せようかと構えていたのですが、出てこない。
KB3197356という累積的な更新プログラムらしいのですが、30分以上経ってもダウンロードが終わらず。。。
85%で止まっているようです。
お仕事に出かけるので、残念ながらここまで。

 

[その夜]

今回も、ダウンロード前の通知は撮り忘れましたが、ダウンロードが完了して再起動を促す通知は撮影できました。

image

ティッカーじゃなくて、アクションセンター(吹き出しを押して出てくる方)です。

ちなみに、アクティブ時間は21時までなので、この時点で時間外ではあります。
デバイスが動いているかは見るらしいので、見ていると言うことかな?

 

[その後]

あれから風呂に入って、ご飯食べたり本読んだりして、PCを消そうかとスクリーンセーバーを解除すると、ダイアログが出ていた。

image

おお、これがアクティブ時間外になって、使われていないということを確認した上でのダイアログなのか。

「確認」を押すと、消えてしまった。
アクションセンターには「再起動が必要です」のメッセージしか残っていなかった。
こういうのは、残していった方がよいと思うのだけどねぇ。

シャットダウンダイアログは、ちゃんと「更新してシャットダウン」が出てくるので、毎回ダイアログを出して終了させる方が安心だな。

image

では、よい夜を。

2016/10/02

[arduino]Streamクラスでも出力できる

作ろうとしているArduinoのライブラリだが、シールドもある。

シールドとシリアル通信するのだが、インターフェースはまだ決まってない。
そういうときはArduinoのStreamクラスを使う、と書いてあった。

しかし、Streamクラスのリファレンスを見ても、read()はあるけどwrite()がない。
これじゃ使えんじゃないか!と、とりあえずHardwareSerialとかにして実装を進めていた。

 

それとは別で、Arduinoの他の人が作ったソースを読んでいたのだが、あれ・・・Streamでprint()を使っている・・・。
APIの説明に書いていないということは、隠しインターフェースか!?と一人で盛り上がっていたのだが、上記のリンク先にちゃんと「print()などはPrintクラスを継承している」と書いてあるではないか・・・。

じゃあPrintクラスってどういうのだろうか、と調べようとしたが、こっちはリファレンスに出てこない。
ZIPファイルの、hardware\arduino\avr\cores\arduino\Print.hがそれのようだ。
うん、print()、println()だけじゃなく、write()もある。
ポインタとサイズを引数に取っているから、普通に使えそうだ。

 

この辺は、ちょっとわかりづらいと思う。
せめて、Printクラスのリファレンスも用意してくれるとよいのだけどなぁ。