Synergy

身体運動研究における“Synergy”概念とその射程
ベルンシュタイン問題
(1) トップダウンに変数を決定しているとすると、関節で10^2, 筋肉で10^3, 細胞で10^14もの変数を決めなければならず、非現実的である。
(2) 時間で切る従来の運動制御理論では、文脈に多義性を持つ。
身体運動は文脈に依存して組織化され、シナジーを前提すれば解決されうる、と先見した。
シナジー
特定の運動の達成において身体の各部位が連携協調することで、運動の自由度を減らす機能的構造・単位
これは一時的で柔軟な組織化で、課題特定かつ文脈依存の要素間結合を想定している。
Synergyの大きな流れ
CDとUCMの二つに分かれている。
CDは自己組織化理論を用いた次元圧縮・要素間結合
UCMは相互補償・要素間調整
補償について
Kelsoらの発話実験で、babの後のbの途中で下顎に負荷をかけた時、15-30ms程度で上下唇に素早い補償運動が観測された。
骨格筋→筋紡錘→Ia繊維→脊髄α運動ニューロン→筋収縮のような反射の中でも、非常に短いアキレス腱反射で30-40msである。
あまりにも早く、情報処理モデルに基づく生理学的な説明が困難であり、そのためUltrafast現象と呼ばれる。
この現象は発話・姿勢制御・眼球運動・卓球選手のスマッシュなどの調整に見られる。
Ultrafast現象を説明するために、筋肉と骨格にTensegrityのような機械的かつ受動的な結合を前提すると、今までのような電気的な反応とは異なる枠組みで議論できると考えられている。
観測由来ヒエラルキー
相互作用しあう部分システム間で、観測に有限時間を前提すると、観測中に環境が変化するために観測された環境は厳密には一致しない。観測に有限時間を前提しないと、時間相関のある変動やスケールフリー相関が説明できない。
部分システムの境界における観測由来のゆらぎの存在を考慮して、階層的なシステムの階層間の相互作用に積極的な意味を見出す。
階層構造を持つ対象に限定せず一般化したのが観測由来ヒエラルキーという。

UCM参照制御ーどうやらUCM空間を積極的に用いた制御方法らしいが、残念ながら論文が公開されていないらしい。

http://www.ieice.org/ken/paper/20130314DBCy/

http://www.uno.nuem.nagoya-u.ac.jp/~togo/

Mark L.Latash, et al. “Motor Control Strategies Revealed in the Structure of Motor Variability”
単語
Latash先生のUCMに基づく運動の解説。UCM解析の解説なのだが、Modeとかいう概念を導入している。
あと、それに基づいて銃を打つ時に重要な変数を同定する、とかいう話や、把持において回転方向の力の方が重要だ、とかいう話になっているが、途中から実験で駆り出された後に上を進められたので読めていない。

Scholz先生のResearch Article
“The uncontrolled manifold concept: identifying control variables for a functional task” PDF

Ruhr大学のD論(Martinさん)
“A dynamical systems account of the uncontrolled manifold and motor equivalence in human pointing movements” PDF

大阪大学宮崎研究室
拮抗筋肉による軌道、剛性の同時制御

http://robotics.me.es.osaka-u.ac.jp/MiyazakiLab/jpn/research/cooperation_task/index.html

http://www.seirei.ac.jp/web/teacher/ohgi/080428-2.pdf

シナジェティクス
「隷属原理」
それまで無関係であった多数の内部変数のうちの一部に不安定化が生じて、それを通じて残りの多数の内部変数の動きが支配され、その結果多数の内部変数の動きに統一的な関係性が生じる
「秩序パラメータ」
要素間の秩序の度合いによって生じるパターンを示す変数。例えば、位相差など。
「制御パラメータ」
パターンを生む外部変数外部変数、人自らの発達学習など

Kelsoの実験
メトロノームのリズム(=制御パラメータ)に合わせて両手の人差し指の運動(秩序パラメータ)を逆位相でくるくるさせていると、突然2.0-2.5Hzくらいで位相が揃う。

引き込み現象
ミクロな多数の要素の集まりの間に引き込みが起こり、特定の振動数と位相を持った大きな振動が生まれる。
マクロな規則正しい振動は引き込みによって系全体の振動を一つに揃えていく。

運動発達の自由度はFreezingからFine Tuningを経て大きくなる

運動制御の仮説

http://www.bekkoame.ne.jp/~domen/reflex.html

Mertonのサーボ仮説
緊張性伸縮反射が運動制御の部品であると考える仮説。現在は信じられていない。
γ運動ニューロンに与えられる。情報の流れは、γ運動ニューロン活動→筋紡錐→緊張性伸張反射(tonic steretch reflex:TSR)→α運動ニューロン活動→筋張力の発生→運動。

Povlovは脳を各種反射の相互作用に基づいて受動的に反応するだけの臓器ととらえていた一方で、Bernsteinは能動的な環境の探索が動物の脳の本質に近いと主張した。反射はデータの再現性を有する反応が得られるが、随意運動の本質を明らかにすることは出来ない。
(Bernsteinはこの考え方を発表したことによってロシア政府に危険思想扱いされている)

αモデル
Bizziらは脊髄後根を切断(求心遮断)しても、運動を覚えさせたサルが同じ運動が実現機能だったことから、緊張伸縮反射を介する必要はなく、αニューロンだけで随意運動が発現する、という説を提唱した。つまり、中枢の運動指令は、α運動ニューロンプールの活動レベルを変化させ、筋肉のバネ特性を変化させることにより、主動筋と拮抗筋のつり合い位置が変化して随意運動が発現する。屈筋、伸筋とのつりあい位置が関節位置となる。
アンチテーゼとしては、
(1) Latashは、Bizziの実験はα modelの求心遮断が起きたときの代替手段だと指摘している
(2) この手法だと、運動中の剛性が高いことを前提しているが、運動中も剛性が低いことが分かっている
全く何が何だか分からない。何がどこにあるのか。それぞれがどのような機能なのか。

Tetsushi Nonaka, Motor Variability but Functional Specificity: The Case of a C4 Tetraplegic Mouth Calligrapher. Ecological Psychology, Vol. 25, No. 2, 2013
単語
事故で四肢麻痺を患って以来、口に筆を咥えて書道を25年間続け、達人レベルに達したFumiyuki Makinoの運動解析。
冗長なコンフィギュレーション空間を取ってきたときに、うまいタスク変数を選べば、前者の分散構造がタスク変数を協調して安定化することを示した。
タスク変数の選び方はヒューリスティック、逆に言えば人間が見たときに自然である。
協調性の解析のために、UCM解析と言われる手法を用いている。2変数のUCM解析がここに説明されている。
肝心のUCM解析の部分が全く分からなかった。
謎の係数kたちで6次元が1次元に落とされていたように見えたが…?6次元→3次元なはずなのに。
1変数ずつ、それぞれの方向の分散を無視しているというならわかるが。
そもそもmultiple regression procedureって何だ?説明されてた?
UCMは何らかの拘束条件を前提しなければいけないはずなのに、拘束に関する言及が全く見られなかったように思えるのだが…

cmake sample

cmakeの勉強のようなことをした。
参考にしたページはここここである。特に、後者の記事の最後の表は参考になった。
-I, -o, -L, -lとソースファイルを適切なコマンド・手順で指定すると、実行ファイルなり共有ライブラリなりが出力されるツールだ、と解釈するのが多分平和である。

今回cmakeを試しに使ってみるにあたって作ったsampleはここに上げられている。
全て、cmake .; makeでコンパイルできて、shared_libraryのみ、make installが可能である。

githubのCMakeLists.txtのコメントに、cmake自体の説明はまとめられている。

(1) simple_cmake
最も単純なcmakeのサンプル。

(2) full_executable
実用上利用する、フラグ, -D, -I, -o, -L, -lの指定できるサンプル。

(3) shared_library
共有ライブラリを作成するためのサンプル。

本当はサンプル集を作成するためのCMakeLists.txtも作ってみたかったが、今後の課題とする。

BINARY HACKS #23-#29

registerの参照
以下のようにすることで、stack_pointerとframe_pointer registerを参照できる。

 register void* stack_pointer asm ("%esp");
 register void* frame_pointer asm ("%ebp");

なんでespとebpなのだろう?

インラインアセンブラ

 __asm__ ("アセンブラテンプレート":出力オペランド指定:入力オペランド指定:この操作によって変わってしまうもの);
 __asm__ __volatile__ ("アセンブラテンプレート":出力オペランド指定:入力オペランド指定:この操作によって変わってしまうもの);

出力オペランド指定では、以下のような制約の表記をする。=は
“=&S” (d0)
出力オペランドで指定した変数は、アセンブラテンプレートで順に%0, %1などと参照可能。
また、制約は”0″などと表記できる。
入力オペランド指定では、
“0″ (src)
などとする。これは変数srcに”0″という制約を付ける。”0″は%esiレジスタに割り当てられているので、srcを%esiレジスタに設定するようになっている。
やっていることとしては、

入力オペランドで、C言語の入力される変数をレジスタに割り当て
アセンブラテンプレートを処理する
出力オペランドで、レジスタの値を出力の変数に代入する

操作によって変わってしまうもの、および__volatile__はC言語の最適化回避。

ビルトイン関数
例えば、strlenに文字列リテラルを渡すと、最適化の段階でstrlenを呼ばずに即値に変換してくれる。
このような機能は数学関連、文字列関連の関数でしばしば実装されている。
先頭の0bitを数える__builtin_clz(unsigned int x)などがハッカーに好んで使われると言われているが、何に使うのか皆目わからない。
なお、gccでは以下の1行目は文字列リテラルと同値に扱われない。2行目のようにしなければならない。

const char* str = "hoge";
const char* const str = "hoge";

glibcを使わないプログラミング
libcが大量にリンクされているために、プログラムのコード単純なHello Worldでも5kbを越える。この無駄を排除したい。
これを解決するために、システムコールのみを使うことが解決策としてあげられる。
しかし、C言語のwrite関数などは、アーキテクチャ依存性を排除するための単なるglibcの関数である。
つまり、アーキテクチャに特化したシステムコールを探してこなければならない。
そこで、_syscallNを探しだし、exit, write関数となるべきマクロをコピペする。すると、マクロによって関数を定義することができて、writeコマンドをCPUの命令で実行できる。
これを

 gcc -Os -fno-builtin -fomit-frame-pointer -no-ident -c hello.c
 strip -s hello
 strip -R .data hello #dataセクションはreadelf -S曰く、0バイトだからいらない

TLSの利用
スレッド固有の変数を簡便に利用するためのシステムを使う方法。
TLSはthread local storageといい、グローバル変数に__threadキーワードをつけることで実現できる。
まともな使い道としては、errnoの保持などに利用できる。

pthread_key
TLSはポータブルではなく、gccに特有の機能である。
ポータブルに実装するならば、以下のようにpthreadの機能を用いる。

 pthread_key_t key; 
 pthread_key_create(&key, destructor);

 void* value;
 pthread_thread_setspecific(key, value);
 value = pthread_thread_setspecific(key);

 pthread_key_delete(key);

#27を一回飛ばします。

weekを用いて、リンクされているライブラリによって挙動を変化させる
weekはリンク時にundefinedであればそれを0に設定する、というキーワードである。
つまり、例えばlibmがあるかどうかを判別するためのプログラムを以下のように実装することができる。

extern double sqrt(double x) __attribute__ ((week));

void foo {
    if (sqrt) 
        cout << "found" << endl;
    else 
        cout << "not found" << endl;
}

バージョンスクリプトでライブラリ外に出るシンボルを限定する
別のファイルにあるfooとbarが存在し、fooがbarに依存するが、barはライブラリの外部に漏らしたくない、という状況を考える。
この時、以下のバージョンスクリプトlibfoo.mapと、動的ライブラリ作成のためのリンクで-Wl,–version-script,libfoo.mapオプションをつけることで、外部に公開するシンボルを限定できる。

{
    global: foo;
    local: *;
};

C++の場合は、デマングルするためにextern “C++”が必要であることと、デマングルしたときに引数の違いによって関数名の後に後続する文字列があるので、以下のようにする。

{
    global:
        extern "C++" {
            foo::hoge*;
        };
    local *;
};

gcc拡張のvisualityを用いて関数の公開性を制御する
上のversion scriptによる方法は単に隠しているだけなので、PICでコンパイルするとhiddenな関数もPLTを通り、低速である。
gccでは__attribute__ ((visuality(“default”)))を用いることで、より簡便かつ高速な公開非公開の制御ができる。

 #define EXPORT __attribute__ ((visuality("default")))

このオプションをつけて、さらにコンパイル時に、以下をつけることで、defaultと明示的に指定していないシンボルが全てhiddenになる。

-fvisuality=hidden

(attributeはクラスの後、型名の前に付ける)

Syntax Hightlighter Evolvedサンプル

導入はこちら

自分が利用する範囲のsyntaxをここにまとめておく。
今のところ使いたいものは、c, shell, text。
オプションはfirstline, light。

これ、行表示の状態でコピペすると行番号もコピーされて残念なんだけど、解決する方法はないか。

C言語通常

int main(int argc, char** argv)
{
    printf("Hello World!");
    return 0;
}

C言語行表示

int main(int argc, char** argv)
{
    printf("Hello World!");
    return 0;
}

C言語簡易モード

int main(int argc, char** argv)
{
    printf("Hello World!");
    return 0;
}

shell

echo test > /dev/null
aptitude search `echo libgnu`
cd ~; cd -

テキスト

はむっ

もったいないおばけ屋敷

お酒が飲みたい。特にワインが飲みたい。
ワインの銘柄とかも記録したほうが楽しめるのだろうか。

可能性を捨てた成長が怖い。
MMORPGのクラスアップしかり、アナログからデジタルへの流れしかり、でっちあげ開発しかり、世の中の進化は往々にして可能性を捨てる。
専門以外に興味を持って時間を割き、可能性を捨てることのできない僕は甘ちゃんだ。

一方で、あまりにデジタルになれすぎた僕たちがFPGAの性能に驚愕したこと、あるいはでっちあげ開発の蜜の甘さを知ることは、安易に可能性を捨てすぎないための戒めになるだろう。
極振りは最適解ではない。

雨のプールに行くことになるかもしれない。
すると、女の子の服が透けた様子が楽しめるのか、と思ったが、そもそも水着だった。

BINARY HACKS #20-#22

PICを付ける意味
PICは.rel.dynamicを.textに押し付けるオプションである。
PICをつけなくとも、共有ライブラリを正常に動かすことは可能である。しかし、速度面からPICを付ける必要がある。
PICをつけ{ずに, て}コンパイルしたファイルのELFを見る。TEXTRELはテキストの再配置が必要であること、RELCOUNTは再配置の数を表す。
readelf -d fpic-no-pic.so | egrep ‘TEXTREL|RELCOUNT’
readelf -d fpic-pic.so | egrep ‘TEXTREL|RELCOUNT’
とすると、下ではTEXTRELが見つかり、RELCOUNTが多い。
(テキストの再配置って何?RELCOUNTって何?.rel.dynamicって何?)

statifier
動的リンクが必要な実行ファイルを、必要のない実行ファイルに変換する。
statifiere /usr/bin/php php2
実行してみないと動的リンク先が決められないライブラリを利用している場合は、–set=LD_PRELOAD=”a.so b.so”などとする。
これが必要な状況は、/lib/libnss*.soと、/usr/lib/gconv/*.soである。

gccのGNU拡張
(1) ビルトイン関数
文字列リテラルを出力するだけのprintfはputsに置き換えられるなど。
LD_PRELOADのオーバライドで問題が起きることがあるので、これの状況を知るための関数が用意されている。
(2) アトリビュート
関数やデータの性質を記述し、特別な意味を付加したり、呼び出しの最適化を期待する。
宣言時に
int foo(void) __attribute__((つけたいアトリビュート));
などとする。
(3) ラベルの参照
ラベルを&&をつけることで、関数ポインタとして扱うことが出来る。なお、関数ポインタなので減算加算が可能である。
void *label = &&error;
goto *label;
error:

(これは実際に使ってみないと、何が使えるのかよくわからなそう)

研究室に存在する生活ー1日目

昨日は9:20-20:10に研究室に存在していた。午前中は自分の勉強、午後は研究関連の調べ物を行った。
勉強は良い時間設定だった。夕飯で眠くなって帰ってしまったが、帰らずに粘った方が良かった。

ご飯を早くとか朝から来てとか、そういう雰囲気がなく、皆が随分とのんびりしていて、随分と雑草が放置されている。
僕は研究とは何なのかが分かっていない。組織としての研究室が持つ目標も分からない。

評価に一喜一憂して、不安に駆動されることは果てしなく格好悪い。
漠然とした恐怖に唆されて、頑張って、評価を得たと信じて、浮き沈みを繰り返す。
目をつむって淡々と快楽主義的に生きるのが良い、と割り切ったつもりでも、評価への恐怖は僕を動かすのに寄与するし、評価されれば安心する。

色々思うことはあるが、真似事から始める他ないのだ。

パズドラを始めた。麒麟が出たので、Wキリン25倍パでごり押しが楽しい。

BINARY HACKS #14-#19

c++filtについて
nm cpp.o
とすると、cppの名前マングリングによって、_Z3fooiのような読みづらいシンボルが得られる。
これは、
nm cpp.o | c++filt
nm –demangle cpp.o
によって解決できる。

addr2line(needs -g)
ポインタからソースコードの行を特定するためのコマンド。
addr2line -e ./a.out 0×8048764
-fオプションをつけることで、関数名もわかるようになる。
addr2line -e ./a.out 0×8048764

strip
ユーザのプログラムをstripして、開発者のところにしていないバイナリを残すと、コアファイルをコピーすることで開発環境でデバッグ可能。
strip ./a.out
-dオプションは、だいたい-gによる部分だけを削除する。すると、完全にデバッグできなくなる状況を避けられる。
strip -d ./a.out
.o, .aをstripするとシンボルが全部消えてしまう。

ar
作成(r: 新規挿入既存置換、c: 警告抑止, u: 新規のみ置換, s: ranlib)、閲覧、展開
ar rcus libhoge.a 1.o 2.o 3.o …
ar tv libhoge.a
ar xv libhoge.a

C++からCを呼び出す
一点のみ注意が必要である。Cのheaderで以下のようにすればよい。
#ifdef __cplusplus
extern “C” {
/*Cのコードいっぱい*/
}
#endif
extern “C”をつけると、C++の名前マングルの対象外となる。C++ではリンクが通れば型のミスはないと思われるが、Cでは間違ったプロトタイプ宣言が可能。extern “C”をつけた部分では、型の安全性がCレベルまで低下する。でも、普通に考えたらヘッダファイルが存在するはずなので、CからでもC++からでも使えるプロトタイプ宣言を作っておけば問題ない。
参考: http://hakobe932.hatenablog.com/entry/20090104/1231073299

CからC++を呼び出す
C++コードをg++でコンパイル、Cコードをgccでコンパイル、g++でリンクすることを考える。
4点注意が必要である。(1)(2)は「C++からCを呼び出す」の理由、(3)はCのコードにC++の例外が通るとプログラムが落ちることによる。
(1) C++のheaderをifdef, extern “C”でくくる。
#ifdef __cplusplus
extern “C” {
/*Cのコードいっぱい*/
}
#endif
(2) C++のソースをextern “C”でくくる
extern “C” {
int cpp_func(void) {return 0;}
}
(3) C++のソースが例外を投げるならば、例えば以下のようにする。
extern “C” {
int cpp_func(void) try {throw -1;} catch(…) {return -1}
}
(4) 関数ポインタを引数に取るCの関数は-fexceptionsでコンパイルしなければならない。このオプションをつけると、全ての関数についてフレーム解放処理を挿入する。
なお、glibcのqsort, bsearchなどは、このオプションをつけてコンパイルされている。

警告の出ない名前衝突–C言語
gccでたまに経験する、名前衝突しているのに何故か警告も出ずに、実行時に予想していないほうのシンボルが呼ばれるアレ。
これの原因は
(1) 静的ライブラリを作成する時のarコマンドは、ただのアーカイバなので、シンボル名とか見てない。
(2) 動的リンクのSONAMEとNEEDEDの対応付けも、一番初めに見つかった方を利用している。
逆に、回避可能な条件は以下である。
(1) 動的リンクを利用しておらず
(2) .oを全てまとめてリンクして実行ファイルを作成するとき

警告の出ない名前衝突–C++言語
C++ではもう一つ罠が増える。.oを全てまとめてリンクしていても期待したシンボルが参照されない可能性がある。
原因は、
(3) inlineで定義するweekシンボルがnon-weekシンボルの存在により無視されるから。これは.hの中に定義が入っていたとしたら、それが複数の.cppにincludeされると重複して定義されてしまうため、後で解決してやろうという気持ちによる。
回避方法は、
(3) inlineで定義するシンボルを作らない、もしくは、無名namespaceでリンケージリークを防ぐ。無名namespaceによってmoduleにシンボルを閉じ込めれば、当然モジュール内でしか利用できなくなるが、今回のような大域領域での名前衝突は解決できる。