ホーム » スタッフ » 斉藤徹 » Computer

Computer」カテゴリーアーカイブ

2022年1月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最新の投稿(電子情報)

アーカイブ

カテゴリー

Linux演習

Linux演習資料

理解度確認

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

macOS Monterey

macOS Monterey が出てるのでインストール。特に問題はないのかなぁ…

homebrew もこれに合わせ、”brew upgrade” を行い、homebrew 3.3.1 が入ったようだ。

Outlook(Web版)でメールグループの注意点

「Outlook-Webで、メールグループ(AA)宛てのメールを読んでいる最中に、BBさん宛ての『新しいメッセージ』を書くと、AAグループにも送られる」という仕様のため、1人宛のつもりがグループ全員に送られるというトラブルが発生しやすいようだ。

メール作成画面では、”To/Cc: AAグループ” という表示は出ないのに、AA宛てに送られる…、かなり危険な仕様。

教員室にhomebridge導入

自宅では、iPhoneとの連動で、Raspberry-Pi にhomebridgeを入れて、家電制御で便利に使っているけど、教員室の Linux サーバにも導入してみた。

自分のスマホに ping で所在確認するプラグインと、自室の在室や予定を表示している掲示板システムを操作するプラグインを入れてみた。

在室状態に応じて掲示板にメッセージを表示していたけど、更新間隔が1時間おきとかなので、「不在表示なのに居るじゃん…」とか学生からのチェックが入るので、ドアや充電器の所に置いてあるNFCをタッチすると、掲示板の在室/不在表示+予定表示するようにしてみた。

# 以前から同様なことはしていたけど、手抜き Web API 経由だったのを、ホームアクセサリとして動かしてみた。

在室確認をBluetoothに変更

自分の教員室前には、在室状況や授業や会議で不在なのが分かるように、LEDの表示器を設置してある。

でも、在室しているかを、スマホへの ping で実装していたけど、実験室の WiFi をメッシュ機能対応のものに変えた影響か、別部屋の WiFi を掴んだまま。そのため、不在表示になっているようで「不在と表示されてますが?」と学生が来ることが増えた。

仕方がないので、安い Bluetooth LE に対応したドングルを自室サーバに追加し、Bluetooth で確認する方法に変更。

$ /usr/bin/sudo /usr/bin/l2ping -c 1 11:22:33:44:55:66

情報処理演習室のルータを交換

EI棟3F演習室で、Aruba の WiFi 環境のための Buffalo ルータを使っていたけど、警告メッセージが出始めたので、確認したらルータの管理画面さえ表示できなくなってきた。古いルータだったので寿命と思われる。

かといって、このルータは、4EI教室,5EI教室,2F実験室,3F演習室,4F創成LABを束ねる Aruba WiFi の上流にあたるため、実験室がことごとく使えなくなる。そこで、手持ちのマニアックな Edgerouter-X に入れ替える。

Windows Terminal 1.8 公開

Windows Terminal 1.8 が正式公開となった。これで、

  • [Shift]+クリックで別ウィンドウで新しいターミナルを開くことができる。
  • [Alt]+クリックでは、タブ分割で新しいターミナルを開くことができる。

iPadのパスワードリセット

「貸出していた iPad が返却されたけど、パスワードが分からない…」との相談を受け、パスワードのリセット作業をお手伝い。

その方も、Web記事をみて試したけどダメだった様子。iPad 起動時に○○キーと○○キーを押しながら…との説明だけど、タブレットのケースのおかげで、押しづらい状況。まずはケースから取り出して、作業。それに、合わせ押すキーが機種によって違うので iPhone7, iPhone8, それ以降とかいろいろ試した。

途中、iMyFone lockwiper というソフト(有償)を使うと簡単と書いてあったので、ページを見ると「無料ダウンロード」と書いてあるし、お試し版が使えるかと試してみた。ただ、OSのイメージダウンロードとか時間かかるし、「イメージ解凍中」とか出てずっとまっても動かず、クリックしたら動き出す。ボタン「イメージ解凍開始」って表示にしろよ…。んで、長々と待っていざイメージ書き込み…とおもったら、この時点で「有償ソフトだから登録してね」の表示となる。そーゆー大切なことは最初に出せよ。時間の無駄だった。

自分自身の端末では、パスワード忘れでフルリセットしたことがないので、面倒だったとはいえいい経験だったかな。

「サイバー攻撃の手口と守り方」の準備

2/6(土)に「サイバー攻撃の手口と守り方~情報セキュリティ入門~」にて、CTFを中高生に体験してもらう準備のお手伝い中。

コマンドラインをたたいてもらう体験の部分は、クラウド上に準備した noVNC を使い、ブラウザさえあれば参加可能。問題は、以前 K-SEC 主催の CTF 問題から「いんすぱいぁ(≠ぱくった)」されて作った問題を少々。