WebAssembly環境の構築
卒研で WebAssembly を使った開発をしてもらっているけど、自分でも試したいので環境の構築。
Debian emscripten パッケージだけではダメだった
卒研の学生さんが、emscripten 使っているという話だったので、”aptitude search emscripten” を実行したら、パッケージがあったので、”aptitude install emscripten” を実行。鉄板の hello world をコンパイルしようとしたら、”LLVM version appears incorrect (seeing “11.0”, expected “10.0”)”というエラーが出て、コンパイルに失敗。
llvm の C コンパイラとのバージョンが合わない様子。ということで、git より環境を構築してみる。
git で emsdk 環境の構築
通常ユーザであれば、”git clone https://github.com/juj/emsdk.git” を実行すると、その PATH 直下に環境が作られるみたい。こういう使い方は好きじゃないので…
$ sudo bash ((( ひとまず emscripten は必要みたい ))) # apt-get install emscripten # 導入後は不要? ((( emsdk のインストール ))) # cd /usr/local # git clone https://github.com/juj/emsdk.git # cd emsdk # ./emsdk install latest # ./emsdk activate latest
Hello World を試す
((( 自分の環境で以下のコマンドにより環境変数をセット ))) $ source /usr/local/emsdk/emsdk_env.sh ((( Hello World をコンパイル ))) $ cd ~/public_html $ mkdir test $ cd test $ vi hello.c #include int main( int argc , char* argv[] ) { printf( "Hello World\n" ) ; return 0 ; } $ emcc test.c -s WASM=1 -o test.html $ ブラウザで test.html を開く http://...URL.../~t-saitoh/test/test.html
ブラウザから自分のC言語(wasm)を呼び出し結果を出力
$ mkdir html_template $ cp /usr/local/emsdk/upstream/emscripten/src/shell_minimal.html html_template $ vi html_template/shell_minimal.html ((( C言語側を呼び出すボタンを埋め込む ))) <textarea class="emscripten" id="input"></textarea> <input type="button" value="CALL WASM" onclick="Module._ems_func();"/> ((( test.cxx ))) #include <stdio.h> #include <emscripten/emscripten.h> #include <string> int main( int argc , char* argv[] ) { return 0 ; } // void* getElementValue_( char const* id ) { ... } が作られる EM_JS( void* , getElementValue_ , (char const* id) , { var e = document.getElementById( UTF8ToString( id ) ) ; var str = e.value ; var len = lengthBytesUTF8( str ) + 1 ; // コンパイル時に -s EXPORTED_FUNCTIONS="['_malloc']" しないとエラーがでる var heap = _malloc( len ) ; stringToUTF8( str , heap , len ) ; return heap ; } ) ; // std::string型はC++の文字列処理の型 // std::string s( "abcde" ) ; // s.c_str() で、C言語のNULターミネータ付きの文字列を参照できる。 std::string getElementValue( std::string const &id ) { void *p = getElementValue_( id.c_str() ) ; std::string s( (char const*) p ) ; free( p ) ; return s ; } void setElementValue( std::string const &id , std::string const &value ) { EM_ASM( { var e = document.getElementById( UTF8ToString( $0 ) ) ; e.value = UTF8ToString( $1 ) ; } , id.c_str() , value.c_str() ) ; } #ifdef __cplusplus extern "C" { #endif /* HTMLに埋め込んだ onclick=_ems_func() で呼び出される*/ void EMSCRIPTEN_KEEPALIVE ems_func() { std::string input = getElementValue( "input" ) ; setEnvironmentValue( "output" , input ) ; } #ifdef __cplusplus } #endif ((( test.cxx をコンパイル ))) $ source /usr/local/emsdk/emsdk_env.sh $ em++ -o test.html test.cxx -O3 -s WASM=1 -s EXPORTED_FUNCTIONS="['_main','_malloc']" --shell-file html_template/shell_minimal.html
batchとnohup
学校の CUDA サーバを自宅より使う学生より、「接続が Broken Pipeで切れるのどうすれば?」との質問があった。
原因は ssh で操作が何もない状態が続くと、セキュリティのために接続が切られるため。んで、.ssh/ssh_config でセッションの最大時間を延ばす設定あたりを説明したけど、「計算どのぐらいかかるの?」と聞くと「20時間かな…」。# さすが CUDA を使う卒研。
ssh のセッション延長の設定で20時間とかしちゃうと、ネットワークトラブルで通信が途中で切れたときに、サーバ側で「まだこの ssh 通信中だよね…」というプロセスが生き残る可能性があるので、あまり勧められる方法ではない。
こういう時には、処理を継続したままで、ログアウトするテクニックが必要。
通常は処理を起動して、ログアウトすると親プロセスにあたる sh が死ぬので、子プロセスが死んでしまう。
# このプロセスの原則があるから、Linux サーバで「訳の変わらんプロセスがあったら、『親を殺せ!!』が基本。」
プロセス確認の基本
((( 通常のプロセス全表示 ))) $ ps ax ((( 指定したコマンドのプロセス情報表示 ))) $ ps ax | grep コマンド名など ((( プロセスの起動引数を全部表示 ))) $ ps axl ((( 負荷の高い順にプロセス一覧を表示 ))) $ top ((( 指定したプロセスを停止 ))) $ kill -KILL プロセス番号
プロセスのバックグラウンド起動
((( プロセスをバックグラウンド起動 ))) $ コマンド... & # &がバックグラウンド起動の意味 ((( プロセスをバックグラウンドに変更 ))) $ コマンド... # フォアグランドでプロセスが動き出す ^Z (Ctrl-Z) # プロセスを一時停止 $ fg # 停止中のプロセスを再びフォアグラウンドで再起動 $ bg # 停止中のプロセスをバックグラウンドで再起動 $ jobs # 起動中の job を表示
上記で説明したコマンドは、login した shell の子プロセスになるため、たとえバックグラウンドで起動して「裏で動いている…プロセス」といえども、logout すると親プロセスが死ぬので、一緒に子プロセスも死んでしまう。
このため、起動するプロセスの親をシステムに代替わりしてもらって起動する nohup コマンドが使われる。
((( プロセスを No Hugup コマンドで起動 ))) $ nohup コマンド & # 出力はファイル保存される。 $ nohup コマンド > file.out & # 明示的にリダイレクトで表示保存先を指定 $ tail file.out # 保存しているファイルの末尾を表示
ただし nohup コマンドだと、プロセスが終了したかどうかわからない。こういう時は、batch コマンドが便利。ただし、batch コマンドはインストールされていない処理系が多い。(メールの設定が必要だから)
((( at パッケージのインストール ))) $ sudo apt-get install at # at(指定時間コマンド起動) # batch(バッチ処理起動) ((( batchの使い方 ))) $ batch at> コマンド at> ^D $ echo "コマンド" | batch
ただし batch は PATH が /bin/sh だけで起動するので、”python ほげ.py” とかで起動しても動かない場合あり。”/usr/bin/python ほげ.py” とかPATHを明記して起動するか、PATH=/usr/local/bin:/usr/bin:/bin なりの設定する処理を明記しないと動かない場合があるので要注意。
batch は、処理の出力結果はメールで送られてくる。結果を残すのなら、出力リダイレクトをしておく方がいい。
データの扱いは丁寧に
うーむ、卒研発表のレジメ、有効数字がおかしいので、質疑応答の時にツッコミを入れた。
有効数字を注意すること
私らの恩師のS先生なら、このネタやると卒研発表の会場が凍りついたよなぁ… (^_^;
でも、情報系の人間は、それっぽく見える数字で嘘ついちゃいかん。
卒研の査読のお手伝いしたのでも、この辺の有効桁がいい加減なのがあったので、あえて指摘。
学会の論文とか発表で、こういうところが変な状態だと、変な有効桁というだけで内容を信用してもらえなくなる。
(ちなみに、この学生さんの卒研は内容もあり、問題なく優秀な内容なので、あえて指摘しています。)
グラフの見せ方にも注意
あと、プレゼン資料やレジメ資料だけど、色の使い方にも注意しましょう。
同じ青系でグラフを描いたら、後ろの人なら見て区別できません。
あと、学会などでも印刷資料になるときは、よほどのことがないかぎり白黒印刷。このようなグラフ資料はデータがまるっきり区別できなくなるので、モノクロにしても内容が判別できるように資料を作りましょう。
特別研究Ⅱ発表会準備に手間取る
昨日1/27(水)の放課後に、専攻科2年電子情報系の特別研究Ⅱの発表会が行われました。
発表会を行う教室が改修工事の余波で使えないので、専攻科棟4F-C-Lab で行ったが、その部屋も直前まで授業で使っていた。それに、今年は専攻科学生が6名と例年より多いことから、早めに時間を設定。
しかしながら、直前まで授業だったので会場準備が手間取り、しかもそういう時に限ってパソコンが思ったように起動してくれず、開始時間が30分遅れになってしまった。反省….
debian で django を動かす
卒研で Django を debian なサーバで動かしたいので、メモ
Django をインストール
最初、起動に失敗したので、python3-pip を入れたら、無事に動き出した。
$ sudo aptitude install python3-django python3-pip
ユーザが Django を起動
$ cd # 自分のホームディレクトリに環境を構築 $ django-admin startproject myapp $ cd myapp $ python3 manage.py migrate $ python3 manage.py runserver 127.0.0.1:8000
卒研が進んで、うまく動くようになったら、service に登録して運用しよう。
システム開発のジレンマ
現在、他の先生と共同で発達障害者支援システムの開発をしているけど、3/21に利用者を交えた事例検討会があった。
参加者の意見交換の中で、いくつかのシステム作りのジレンマを感じる意見があった。簡単にまとめると…
「支援システムのおかげで、支援能力は2倍になった。でも便利だからこそ、保護者は先生から3倍のサポートを期待する。」(N倍は感覚をわかってもらうための便宜的な数字)
この両者の不足分の「1」は…
- 先生への過度の負担にならないか…
- コンピュータ屋的には、PDCAサイクルもう1周まわして4倍にすりゃいいじゃん…でも、その開発費はどこから?
- ICTによる支援も大事だが、親と子供の直接の関わりを疎遠にさせてはいけない。
卒業式…
今日は卒業式、5年間の思い出と共に卒業おめでとうございます。

優秀学生表彰
今年は、例年と違い最初に、学会などで優秀学生表彰された人を、卒業式の前に 表彰式が行われました。電子情報からは、4人の学生さんが選ばれました。

斉藤卒研
私の卒研室の4人と一緒に…
