xtensa-lx-106-elfをビルドするためにNon-OS版が必要だったということもないと思うので、単にAPIが使えるようにしてあげているだけかもしれん。esp-open-lwipは、lwipのESP版なのか。[Savannah]lwIPは使ったことが無いのだが、keilで使えるライブラリの一覧で見たことがある。Non-OS版で使われているらしい。使われているということは、ライブラリがあるということだ。Non-OS版のlibを見ると、liblwip.aとliblwip_536.aが入っている。sdkと比較して差分がなかったということは、ビルドしてまったく同じものができたか、単にNon-OS版のファイルをコピーしたかだ。・・・とmakefileを眺めて、理由が分かった。\$(TOOLCHAIN)/xtensa-lx106-elf/sysroot/usr/include/endifそう、デフォルトであるSTANDALONE=yの場合のみビルドされるものなのだ。STANDALONE=nの場合は、バイナリ提供されているものはバイナリのまま使う方式だと思うから、気にせずよいということか。esp82662016/12/04[esp8266]esp-open-sdkのビルド(STANDALONE=n)やる気が起きないので、久々に仕事と何の関係もなくESP8266のことをやろう。目的が無いので、githubに移動したというRTOS版を動かすことにする。FreeRTOSまずは、コンパイル環境を作るところから始めるようだ。Windowsでやろうとして、提供されたコンパイラが32bit環境でしか動かないようだし、参照しようとしたコンパイル環境がEspressifから出ていなかったので止めた。RTOS版のRequirementsで紹介されているページも結局は同じコンパイル環境なのだけど、Espressifが紹介しているから、お仕事で使うことになったとしても納得できるだろう。仕事とは関係なく、といいつつも、やっぱり考えてしまうよねぇ。Windowsではなく、VMware上のXubuntu16.04(64bit)でやる。普段立ち上げていることが多いのでね。書いてあるとおりに、cloneして、apt-getして、makeする。モードとして、STANDALONE版とそうでない版があるらしい。デフォルトはSTANDALONE版になるのだけど、ライセンスがどうのとあるので、そういうグレーなところはなるべく持ち込まないよう、STANDALONE=nで行う。リンクするくらいだから、なんかうまいことやってくれればうれしいのだがね。VM環境とは言え、そこそこましなビルド環境だと思っているのだが、15分経ってもmakeが終わらない。20分くらいかかったようだ。最後に、コンパイラへのPATHと、includeとライブラリへのパス(-Iと-L)が表示されるので、メモして置いた方がよいだろう。スクリプトにしておくとよいのではないかな。STANDALONE=yだと不要なんじゃなかろうか。ここまでやっておいてなんだが、なぜRTOS版にはコンパイラが別途必要なのだろう?Requirementsにxccでもgccでもよい、と書いてあるので、実はNon-OS版の環境を持っていれば不要なのだろうか。いつもgen_misc.shを実行するだけなので、どういうコンパイラを使っているかすら把握してなかったのだな。Liteをしばしば使っている。相手に1.27mmのソケットがある場合はよいのだが、たまにないときがある。nanoなんかがそうだ(mbedとして使う場合が多いのだろうけど)。前回は無理やりピンを曲げたり、ピンだけ挿したりしてつないだのだけど、どうにも見栄えが悪い。別の用事で、1.27mmのシングルラインのピンヘッダを折る用事があって、ちょうど5ピンが2つ残っていた。これを挿せば目的を達するのではないだろうか?はい、ダメでした。2.54mmだとできるけど、1.27mmだからか、買ったピンヘッダがそうなのかわからないけど、厚みがあるようだ。いうのがちょうどよいのだけど、わざわざこれだけ買うというのもなぁ。kitsあるいは、2列のピンヘッダを自分でハンダ付けして2.54mmで使えるようにするか。LITEの根っこから生やせばよいのだけどね。hw2016/12/02[勉]meteorのclient非同期はセッション変数で対応できそうhttp://hiro99ma.blogspot.com/2016/12/meteor.htmlまさかの続き記事だ。client側で、結果が非同期に戻ってくるので、returnした値を表示させることができない。やって更新したらよいのだろう?というのが前回の疑問だった。調べたが、Meteorには値が更新されると自動的に表示まで更新される機能があるから、コールバックが戻ってきたときに値を更新すれば、無理して同期とか非同期とか考えなくてよいんじゃ無かろうか、というのが今のところの結論だ。以前はsetInterval()などで監視していたよなぁ、という部分を隠蔽してくれていると思えばよいか。(日本語情報)よくわからないながらも、こちらをまねしながらやると、コールバック関数内でSession.set()すると、その内容が画面に反映された。「returnで値を返すように作り替えないと」と思っていて、Meteorの特徴とも言えるリアクティブというものが見えていなかったようだ。非同期?急きょ、お仕事でほんのちょっとだけ触ることになりそうなmeteorのことを調べておこう。「めてお」と発音するようだ。しても、CodeSourceryのMentor社が頭をよぎってしまう。https://www.meteor.com/ブラウザで見るサイトを作るときにはだいたいJavaScriptを使うが、そういうアプリを作るためのフレームワークらしい。・・・済まん、この世界のことが分かっていないので、用語が正しいかすらわからん。私がJavaScriptを使ったときは、動的なHTML画面を作る、という場合だけだった。定期的に監視して、値が変わったら更新する、とか。クライアント側で動くJavaScriptと呼ぶことができるだろう。Meteorの紹介を読むと、サーバサイドもクライアントサイドも両方書ける、というところが利点としてあげられていた。し、JavaScriptが導入されたときは、サーバで処理するとクライアント数に応じて負荷がかかるから、できることはクライアント側でやってあげましょう、みたいな話を聞いていた。このmeteorというのをインストールして、決まった場所にHTMLやらJavaScriptやらのファイルを置いておくと、自動的に閲覧用の構成を作ってくれるらしい。試したところでは、特にApacheなどもインストールしていないのに3000番ポートにブラウザでアクセスできた。私は一から環境を作るわけでも、サイトを作るわけでもなく、気分転換したいときにサイトを見て不具合があったら修正してくれると助かる、という程度なのだ。それほど真面目に調べたいわけではない。その不具合の1つで聞いているのが、値が非同期で返ってくる処理結果を画面に反映させる処理をまだ書いていない、というやつだった。分かってないが、JavaScript側に関数を書いておき、そのreturnで戻ってきた値をHTML側で{{value}}みたいな感じで参照することができるようなのだが、処理が非同期なのでreturn時には値がまだない、ということのようだ。以前、結果が動的に変わる画面書いたときは、setInterval()とかで定期的に結果を監視して、画面表示が変更になりそうだったらelementなんとかに代入して更新させていたように思う。今回の箇所はコールバックで結果が戻ってくるようだから、そのタイミングで同じようなことをやるのだろうか。Meteorの説明を読むと、非同期のところを同期にすることでさっぱりさせた、という項目があった。JavaScriptでなんとかするんじゃなくて、Meteorのしくみを使ってなんとかするのだろうか?こういうフレームワークを使うと、解決するのにフレームワークでのやり方があるのか、一般的なやり方でよいのか、そこの見極めが難しいことがあるよなぁ。検索すると、サーバ側に書いた処理が非同期だった場合のやり方が出てきた。今回は、たぶんだけど、非同期なのはサーバ側の処理ではなさそうな気がしている。Promiseというのを使う例も出てくるが、async/awaitをPromiseの代わりに使うという記事もあった。Async.wrap()というのはサーバ側だけらしい。なんとなく、Promiseというのはコールバックを連結して処理を行うようにするのを避けるためのやり方で、コールバックで得られた結果を画面反映させたいというのとはちょっと違うような気もする。クライアント側だけで非同期だったとしても、それをサーバ側に持っていけば、サーバ側なら同期で返す方法があるらしいので、それで済ませてしまうものなのだろうか。だいたい、非同期で処理するということはコンテキストが別になるということだから、コールバックされたコンテキストは関数で呼ばれたときと異なると思うのだ。Linuxとかだとselect()で待たせる、みたいなやり方があるけど、関数が呼ばれた経路はHTMLのメインスレッドに相当するはずだから、returnせずにコールバックを待たせるとブラウザが固まってしまうんじゃないかと思う。やりたいことのような気がするので、探し方が悪い気がしている。study2016/12/01[c/c++]strncatはあふれても\0付加しない一番使っているのはC/C++だが、文字列を扱うことがあまりないので、標準関数が苦手だ。バッファがぎりぎりしかないときの扱いは、いつも不安なので事前にテストコードを書いている。昨日書いていて、気付かないままバッファあふれしていたので、調べておこう。0;}さて、結果はおわかりだろうか?snprintf=[12]strncpy=[123]strncat=[123123]strncpy()やstrncat()が\0を付加しないというのは覚えていたのだが、strncat()のnは追加する文字列に対してのもので、バッファ全体に対してのものじゃないのだな。ポインタの先頭から\0を探して、そこから追加していくから、その時点でnに達していたら追加は行わないかと思っていた・・・。その回避をしたい場合は、C11から追加された_s系の関数になる。strncpy_s()やstrncat_s()だ。こっちはsnprintf()のように、第2引数にバッファのサイズを指定するのだ。試してみたかったのだが、このgccではc11オプションを付けてもダメだった。cppreference.com__STDC_WANT_LIB_EXT1__を1に定義してからコードを書き始めるのだが、__STDC_LIB_EXT1__が未定義だから、そもそも使用できないようだ。