フレッツ光ルーターのPR-S300SEでPPPoEの接続先を取得
必要性は不明。このPPPoEもONUでトンネリングして送られてるはず。
http://192.168.1.1/cgi-bin/debugcmd.cgi?cmd=func+pfwListShow
http://192.168.1.1/cgi-bin/debugcmd.cgi?cmd=func+pfwObjGet+SYS_PPP
1 854dd000 SYS_PPP
http://192.168.1.1/cgi-bin/debugcmd.cgi?cmd=func+pfwStackObjGet+-2058498048+1
RET:-2058498048(0x854dd000)
http://192.168.1.1/cgi-bin/debugcmd.cgi?cmd=func+pfwStackShow+-2058686528
RET:-2058686528(0x854aefc0)
Service Name =
AC Name =
AC Ethernet Addr. = xx:xx:xx:xx:xx:xx
参考元: https://bitbucket.org/frc-cpp11/windriver-headers-package-deb/src/default/h/ppp/?at=default
scope_exit文
GCC拡張のcleanup attribute使えば簡単にscope_exit文を作れそうだな、と思って作ってみた。ネスト関数のプロトタイプ関数に使うautoとか初めて使った。
#include <stdio.h> #define scope_exit() \ auto void on_scope_exit(void *ptr);\ __attribute__((cleanup(on_scope_exit))) int __scope_exit[0];\ void on_scope_exit(void *ptr) int foo(){ scope_exit() { printf("foo exit\n"); } printf("foo start\n"); } int bar(){ scope_exit() { printf("bar exit\n"); } printf("bar start\n"); foo(); } int main(){ foo(); bar(); return 0; }
デストラクタ/スマートポインタ
C言語でデストラクタ及びスマートポインタを実装した人が居るらしい。何というタイミング。GCC拡張のcleanup attributeを使っているので、使い道は少なそう。それと、メモリをスタックからじゃなくてヒープから取得してるのが気になる。
[C] Implementing smart pointers for the C programming language
http://snaipe.me/c/c-smart-pointers/
https://github.com/Snaipe/c-smart-pointers
右辺値参照とムーブセマンティクス
C++11は良く分からんので、C言語で。参照でもないけど、実装は似たようなもん。デコンストラクタ問題やオーバーロードや演算子オーバーライドが無いので別物だけど、これはこれで使い道ある気がする。
moveについては、safe_freeのような趣きがあって良ろしいかな。unique_ptrのようなものを作るのにはcoccinelleのようなソフトの支援を借りなければならないけど、coccinelleならコンテキストに依存した複雑な制約を課すことが容易なので、それはそれで色々出来そう。
#include <stddef.h> #include <stdio.h> #include <alloca.h> /* static inline void *_move(void **p){ void *q = *p; *p = NULL; return q; } #define move(p) _move((void **)&p) #define to_rvref(v) ((*(volatile typeof(v)*)alloca(sizeof(v))) = v,alloca(0)) // buggy */ // GCC拡張 #define move(p) ({typeof(p) __q = p; p = NULL; __q;}) #define to_rvref(v) ({typeof(v)* __p = alloca(sizeof(v)); *__p = v; __p;}) int *test(){ int *u = NULL, *v = to_rvref(12345678); printf("%d\n", *v); u = move(v); printf("%d\n", *u); printf("%p\n", v); return u; } __attribute__((optimize("O0"))) void breakstack(){ int **p = alloca(sizeof(int*)*3); *p++ = NULL; *p++ = NULL; *p++ = NULL; } int main(){ int *p = test(); breakstack(); printf("%d\n", *p); // broken }
IDEとPython (タイプヒンティング、その他)
Pythonでは、タイプヒンティングの構文が標準化されておらず、実装によって構文がバラバラ。
import周りの規則もややこしいことこの上ない。ということで、コード補完のための定義ファイルの生成周りが理解しきれてない。
bpy.types.bpy_prop_collectionのためにGeneric型が欲しいのだが、PyDevはGeneric型に対応していないらしい。なので、現時点で自動補完するならPyDevよりもPyCharmの方が良いはず。
Does PyDev's type hinting support generic types?
http://stackoverflow.com/questions/23876497/does-pydevs-type-hinting-support-generic-types
PyCharmがジェネリックに対応しているとはいっても、クラスのジェネリック型で__init__が必須だったり、プロパティ(ゲッター)の型の処理が怪しかったりと罠多め。
タイプヒンティングの標準化が進んでいるらしく、それはPyCharmの構文とかなり異なるので、標準化されるまで待った方が懸命かもなぁ。
K-meansじゃダメだ
x軸はグレースケールの色と最頻値との差の絶対値、y軸は画像の外周を中心に円にした時の中心からの距離。下図の右下を切り離したいので、別のクラスタリング手法を使う必要がありそう。
しかし、OpenCVにはk-meansしか用意されていないので、sklearnを入れてみた。色々なクラスタリング法が使えて面白い。ただ、遅いからサンプル数を間引かないといけないけども。
- スペクトラルクラスタリングはメモリが大量に必要とのことで断念。
- Ward法はk-meansと似た結果でダメだった。
- DBSCANは良さげに見えるけど、今回のケースでは不可能。
- 凝集クラスタリングで良い結果を得られた。
クラスタ数増やしたら一応上手く行ったけど、安定した方法では無さげ。さてどうするかな。外れ値検出とか? アウトラインフラグメント化とか?