2018/04/24

[c]初期化用マクロを用意するとき

protobuf-cを見ているときだったが、構造体の初期化をするのに、関数とマクロの2つが用意されていた。
関数はアドレスを渡せばどこでも初期化できるのだが、マクロは構造体のインスタンス宣言に代入する形でないと使えない。


言葉で書くとわかりづらいので、コードにしておこう。

01: typedef struct {
02:   int a;
03:   const char *b;
04: } aaa_t;
05: 
06: #define INIT_AAA    { 0, NULL }
07: 
08: void init_aaa(aaa_t *val)
09: {
10:    val->a = 0;
11:    val->b = NULL;
12: }


マクロの場合は、構造体の初期化に限定した書き方になるので、宣言時の代入でしか使用できない。
C++であればコンストラクタで済ませられるのだが、Cではどうしようもない。


「じゃあ、初期化関数だけでいいやん」と私は思っていたのだ。
明示的に初期化したのが分かるし、そんなに面倒な書式ではない。


そう思って、自作のライブラリでもそうしていたのだが・・・だんだん嫌になってきた。
例えば、上記のコードを使うと、こうなる。


aaa_t     a;
init_aaa(&a);


大したことは無い。
では、こうなってきたらどうだ。


int k = 0;
aaa_t    a1;
aaa_t    a2;
bbb_t    b;
ccc_t    c;
char *str = NULL;

init_aaa(&a1);
init_aaa(&a2);
init_bbb(&b);
init_ccc(&c);


こういう混在が続いてくると、初期化するものが続いているときには、その場で初期化するようにした方が間違いが少ないんじゃなかろうか、という考えが芽生えてきたのだ。


おじさんでも、芽生えるときは芽生えるのだ。
ただ、それが良い方向かどうかは分からんがね。
「コードリーティング」を読んだ方が良いのかもなぁ。

2018/04/22

[tech]組み込み向けにするのをあきらめるとき

お仕事でプログラムを作っている。

一人で作っているのだが、設計も何もせずにやっている。
よろしくはないのだが、そもそもどういう動きをするようになるのかわからずに作るという、試作の手前のようなものである。


で、最近見直していると、同じようなことをやるのになぜか3つの実装方法をわざわざ使っていることに気付いた。
「同じようなこと」は、データを次々にためておく方法だ。

  • キュー
  • リングバッファ
  • リスト

我ながら「はぁ?」となってしまった・・・。
まあ、キューもリストも似たようなものではあるのだが、「キュー」は自分で実装したのだが、「リスト」はLinuxのリストであるLIST_HEADやLIST_ENTRYを使っている。
作ったのが別の人ならまだしも、私しかいないのに、なぜ。。。


プライオリティがなければ、データの詰め込み方はFIFOかFILOか、キューかスタックか、くらいしかないと思う。
リングバッファは、FIFO型になるのか。


たぶん、私の思考過程からすると、最初に作った「キュー」は、そこまで数が増えないけど、数の予測が付かなかったので、自作したのだろう。
その次がリングバッファになったのは「増えすぎたらキャンセルしてしまえ」と思ったからではなかろうか。

とにかく、メモリサイズがはっきりしない状況が嫌だったのだ。
何とかして、サイズを支配したかったようだ。


最後に作ったのはLinuxのリストを使ったもので、この頃になると自作するのも嫌になったし、サイズを考えるのにも疲れてきたのだろう。
そう、設計どうこうではなく、疲れたのだ。
私らしいといえば、私らしい。


そして、もう1つ。
作っているうちに、こりゃLinuxが動くレベルのマシンじゃないと実装できない、ということに気付いたことだ。
Cortex-Mなどの組み込みソフトにしてしまうことをあきらめたのだ。
これはこれで「疲れた」と表現できるかもしれない。


Raspberry-Pi1くらいあれば動くが、そこは私にとってはもう大きめの組み込みになる。
ストレージを付けたり外付けメモリとかやればCortex-Mでもできなくもないのかもしれないが、そこまでして実現する意味はあまりないだろう。
ハードウェアを安めに仕立ててソフトウェアががんばる、という時代でも無いと思う。
そういうことずっとやってるから、いつまで経っても仕事が減らんのじゃー。


と、それっぽい結論で終わらせようとしたが、実装が3種類もあるのはよろしくないので、どれかにまとめよう。

2018/04/14

[vscode]WSLの配色が直る

こちらの過去記事をご存じだろうか。


[vscode]WSLのターミナルが赤くなった
http://hiro99ma.blogspot.com/2017/12/vscodewsl_4.html


2017年の12月に書いた記事なのだが、これがさっきまで全然解決しなかったのだ。
ColorToolというツールを動かすことで、ようやく直った。


しかし、どういうことだったのだろう?
ColorToolはコンソールの配色を変更するツールのようなのに、vscodeにまで影響があったのか。
あるいは、コンソールに関する色設定がおかしくなっていたのだろうか。
他の環境で発生していないことからすると、後者の方があり得そうだ。

でもなぁ、cmdとかPowerShellなんかは普通だったし、Ubuntuのコンソールもまともだったのだよ。


いろいろ腑に落ちないのだが、新しい解決方法が身についたのは喜べることだ。

[win10]最近あったトラブルたち

昨日のことだった。

会社で使っているWin10 Homeのマシンの調子がよくなかった。
アクションセンター(タスクトレイの右端にある、吹き出しっぽいアイコン)をクリックしても、何も出てこない。
タスクトレイに置いているExplorerのアイコンを右クリックしても、何も出てこない。
スタートメニューはClassic Shellを使っていたから気付かなかったのだが、通常では左クリックしても出てこない。

むう・・・。


イベントビューアを見ると、Cortanaがどうとか。
確か、何かのツールを使ったときに無効化されていたと思うが・・・と見てみると、アンインストールされていた!
通常はアンインストールしようとできないので油断していたのだが、何かをトリガにして消えてしまったようだ。


ネットで検索すると、PowerShellを使ってあれこれやる方法が見つかるのだが、どれをやってもダメ。
昔なら、ストアアプリ系が動かなくてもなんとかなったのだが、いまや設定アプリがストアアプリになっているものが多く、作業できなくもないのだが、非常に不便になることが目に見えていた。


最終的に効果があったのは、Media Creation Toolを使っての再インストール。
私の知っている「再インストール」は、とりあえずWindows周りを再設定し直す、というものだった。
しかし、ネットで検索していると、どうも最近の「再インストール」は、データは削除しないしストアアプリは何とかするけど、それ以外のものは使えなくなる可能性は高いかも、というものが出てきていた。
私が思っていた「クリーンインストール」が、今の「再インストール」になりつつある気配を感じている。


時代が変わったということか。。。
あるいは、レジストリモデルはうまくいかない時代になったと言うことかもしれない(うまくいっていたのかどうかは知らん)。


Media Creation Toolで再インストールするという決断に至るまで、けっこう試したと思う。
wsrreset.exeやトラブルシューティングツールもエラーになるくらいだったから、どうしようもなかったのだろう。
前日までは問題なかったから、Windows Updateをトリガにして何か起こったのか、蓄積していた不具合が一挙に出てきたのか、あるいは・・・。

いや、意味の無い考察はやめよう。



再インストールをMedia Creation Toolでやった結果を残しておこう。
2018/04/13時点のWindows10 Home(Windows Updateは最新)での結果だ。

メディアを作らずに直接再インストールしたが、インストール済みのWindowsアプリ(ストアアプリじゃないやつ)は生き残っていた。
ストアアプリは、起動するようになった。
アクションセンターは、表示されるようになった。
使わないストアアプリはアンインストールしていたのだが、復活していた。Cortanaも戻った。
Shell Newは元に戻った。
Quick Launchにデスクトップ表示などのショートカットが復活した。
ATOKの認証が戻されて、ライセンス入力が必要だった。

全部は試していないのだが、困らないところまでは復帰してくれた。


こういう現象とは別に、以前から起きているものがある。
今回の再インストールをしても直らなかったものだ。


何かというと、Office系のアプリで、画像の挿入を行おうとしてエクスプローラのウィンドウが出たとき、サムネイルがほぼ表示されない、という現象だ。

「ほぼ」が何かというと、一度WindowsのExplorerでサムネイルが表示されているものは、Officeでも表示されているらしい。
Officeで使用されるExplorerにサムネイル作成機能が無い、とも言えるのか。


Office系だけなのかどうか調べたかったのだが、他に画像の挿入を思想なアプリが分からなかった。。。
WireSharkとかWinMergeじゃダメだろうしねぇ。


検索したけど、

  • Explorerの設定がアイコン表示になっている
  • Officeデータをサムネイル表示にしたい

がたくさん出てきて、見つけられなかった。。。


もう1つ。

Edgeを使っている人がいたのだが、「コピー&ペーストをするとウィンドウが閉じる」という話を聞いて、そんなわけなかろう、と操作してもらうと、本当にそうだった・・・。

ウィンドウが閉じるというか、強制終了なのだと思う。
毎回起きるわけではないけど、起きるときには何度やってもダメっぽい。



こういう現象を見ると、ネットで「××がうまくいきません」みたいなQと「○○すればできます。ネットで検索したらすぐ出てきました」というAがよくあり、私も読んで「検索してないのかな?」と思うことがあるのだが、実際目にすると、なかなかそうも行かないパターンもあるので、気をつけねばならんですな。

2018/04/01

[c/c++]protobuf-c (7)

protobuf-cの使い方を調べている。

前回、ProtobufCBufferSimpleが何か使えるんじゃなかろうかと思ったのだが、packに使うくらいしかなさそうだ。

https://gist.github.com/hirokuma/c79f5c80cfee9db8cc3c968ac4f46819

置き換えてみたのだが、packするサイズは事前に調べられるので、この使い方だと意味は無いな。

repeatedメンバーで個数が増えるときにappendするのがよさそうだが、realloc()で参照するメンバのアドレスを追加し、malloc()でメンバを追加していく方が素直に見える。


protobuf-cを使っているオープンソースが見つけられていなくて、うまい使い方が分からないのだ。
自分で見つけるしかないのか。


サンプルアプリのメモリ解放漏れが気になるので、valgrindで確かめよう。
・・・WSLだと、freeをわざと外しても"All heap blocks were freed -- no leaks are possible"となって信用できんので、ノーマルなUbuntu環境に立て直そう。


git clone https://github.com/google/protobuf.git
cd protobuf
./autogen
make
sudo make install

cd ..
git clone https://github.com/protobuf-c/protobuf-c.git
cd protobuf-c
./configure

protobufのヘッダがないというエラーになった。。。
しかし、config.logを見ると、-std=c++11 or -std=gnu++11と出ていた。

configure:17261: checking google/protobuf/compiler/command_line_interface.h usability
configure:17261: g++ -c -g -O2  -pthread -I/usr/local/include conftest.cpp >&5
In file included from /usr/include/c++/5/mutex:35:0,
                  from /usr/local/include/google/protobuf/stubs/mutex.h:33,
                  from /usr/local/include/google/protobuf/stubs/common.h:52,
                  from /usr/local/include/google/protobuf/compiler/command_line_interface.h:41,
                  from conftest.cpp:61:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

では、足してみよう。

./configure CPPFLAGS=-std=c++11
make
...
error: ‘scoped_array’ does not name a type

configureは通ったが、makeでエラーだ。
しかし、WSLでprotobufをビルドしたときにはエラーが出なかったはずだ。

configure:17261: checking google/protobuf/compiler/command_line_interface.h usability
configure:17261: g++ -c -g -O2 -I/home/xxx/prog/clang/protobuf/protobuf-c/../../../cpplang/protobuf/install/include -pthread conftest.cpp >&5
configure:17261: $? = 0
configure:17261: result: yes


何か見落としているのだろうか。。。