暇つぶし文@謎

無料アクセスカウンターofuda.cc「全世界カウント計画」

2015-11-18

[][] U2211Hのファクトリーモードに入る

電源OFF→一番目と二番目のボタンを押しながら電源を入れる→一番目のボタンを押すと、ファクトリーモードに入れる。


DEBUGMEGをONにすると、色々な情報が表示される。表示された表示名でググると、Realtek RTD2xxxのソースが引っかかるけど、これ使ってるのだろうか? 古くてあまり当てにならないけど、雰囲気は分かる。BANK SCALERの(一部の?)ADDR/VALUEの変更が出来るようだけど、何か良く分からん。


にしてもデジタルで使うのに不要な機能がいっぱいだなぁ。レイテンシが気になる。

2015-11-09

[][][][] 簡略化 (simplify)

Octaveはsymbolicで対応しているらしい?が、Ubuntu 14.04のでは未対応みたい。Sympyは対応している。

これで楽になるかな…と思ったけど、結果を見るとうーむ。



補足すると、以下のが、

>>> t = Symbol('t')
>>> f = 0.3635819 + (0.4891775 + 0.0106411) * t * (4*t*t + 3) + 0.1365995 * (2*t*t-1);
>>> simplify(f)
1.99927439999666*t**3 + 0.273199*t**2 + 1.49945579999949*t + 0.2269824
>>> factor(f)
1.0*(1.99927439999666*t**3 + 0.273199*t**2 + 1.49945579999949*t + 0.2269824)

こうなる。そして、欲しかったのはこれ。

t*(t*(1.9992744*t + 0.273199) + 1.4994558) + 0.2269824

Wolfram|Alphaだと、候補の一つとして出してくれるようだ。

http://www.wolframalpha.com/input/?i=simplify%280.3635819+%2B+%280.4891775+%2B+0.0106411%29+*+t+*+%284*t*t+%2B+3%29+%2B+0.1365995+*+%282*t*t-1%29%29

1.99927*t**3 + 0.273199*t**2 + 1.49946*t + 0.226982
t(t(1.99927*t + 0.273199) + 1.49946) + 0.226982

2015-11-08

2015-01-19

[][] デストラクタ/スマートポインタ

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

[][] 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;
}

2015-01-05

[][] 右辺値参照とムーブセマンティクス

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
}