空気を読んだ関数のオーバーロード

関数の戻り値から関数のオーバーロードができるようになった
いゃったぁ!
こんな書き方しないけど!

f:id:zenu:20170902132721p:plain

今までインナー関数はマングリング(?)してグローバル関数として作っていたけど
returnを関数として実装している都合、関数毎にインナー関数用のスコープを持たせることにした

空配列の型解決

空配列の使っているところを見て型推論っぽいのをできるようにした
型解決がその場しのぎで、つぎはぎだらけのよく分からないものになっていく

f:id:zenu:20170817161959p:plain


大して関係ないけど、WSHの↓が動かなくなっていた
echoなんてコマンドないって怒られる
変わったことと言えばWin10のパッチ位だと思うんだけど・・・なんかやったっけ?
× WScript.CreateObject("WScript.Shell").Exec("echo a");
○ WScript.CreateObject("WScript.Shell").Exec("cmd /c echo a");

戻り値だけ異なる関数のオーバーロード

戻り値だけ異なる関数をなんちゃって型推論して解決することができた
約1年越しにほっといた機能を夜中のテンションで作成
元は数値型をIntかFloatかShortなどなど、使っているところから推論したいってのが始まり
まだそっちはできてないので何とか考える

f:id:zenu:20170817032059p:plain

欠点は引数が同じで戻り値ありの関数と無しの関数をまぜて、戻り値を使わない場合が判別不可
無理矢理戻り値無し関数を呼んだことにしてもいいけど、エラーにしたほうがいいか?
まぁどうでもいいや

ブラウザを作ってみる 2日目

なんとなくタブっぽいものが作れた
実際にはImageButtonを並べているだけ
選択したときのハイライトとか付けたい
f:id:zenu:20170217013520p:plain


画面をキャプチャするタイミングが分からん
setPictureListenerとかそれっぽい名前のリスナはObsoluteでござるとか言われるし
じゃあ代替の関数なんやねん、書いといてくれや

とりあえずonPageFinishedでキャプチャしてもまだ描画終わってないのか、真っ白になることが多い
ひとまずタブ切り替え時に更新するようにしたはいいけど・・・
Java側からJSのonloadイベント差し込んでJAVA側にload完了を知らせる?
いやいやもっと簡単な方法があるはず、きっと、多分


つかJAVAラムダ式使えるよーになったとか聞いてたけどAndroid Studioは関係ないのね
Scalaか小鳥ちゃんで書いたほうが楽なんじゃないか?
構文しらんけど

ブラウザを作ってみる

AndroidでWebViewはめ込んだだけのブラウザを作ってみる
どうにも思ったようなものがない

こんだけイジる

低速SIMを使ってるからデフォで外部ファイル(js、css、画像全て)は読み込み不要
タブ化してタブの切り替えは画面下並べる
ボタンはメニューとタブを閉じるボタンのみ、画面下にしか配置しない
URL、タイトルは見ないから不要
リンク長押しで裏タブで開く
左右フリックでタブ移動、onclickのあるところではタブ移動しないほうがいい
新規タブにOperaみたいなSpeedDial
target=_blankは無視して同タブで開く
viewportのwidthは無視して端末幅で表示
viewportのuser-scalable=noは無視
ユーザー定義のcssを使いたい
URLベースのフィルタを入れとく


とりあえず画面にこれ以上Widgetは置かない
f:id:zenu:20170215225816j:plain

無線&タッチセンサー

無線とタッチセンサー化したくてとりあえずAdafruit Feather 32u4 Bluefruit LEを購入
サンプルいじってBluetoothのキーボードにするのはすぐできた
超簡単(^-^)
Amazon.co.jp: Adafruit Feather 32u4 Bluefruit LE: DIY・工具

ただ、↑にはピンヘッダついてないし最終的にはブレッドボードなしで行きたいから
とりあえずArduinoにタッチセンサーをつないでみた
https://www.amazon.co.jp/gp/product/B00YXGAC5U

まず繋ぐ線がどれか分かんねぇ(-_-;
UNOのサンプルはあるけどMicroだとうまく動かない
めんどくさいから、もうピンヘッダはんだ付けしたけどすごい雑い
結局SCLとSDAとかいうのがArduinoの機種ごとに違うからデータシートよーみんさいって事だった
知らんし( ノД`)
f:id:zenu:20170122221537j:plain

タッチセンサーのピンヘッダ取るのだるいし、もう一個買ったろかいな、安いし・・・

データグローブ試作 その2

手袋の指先にポッケを作りセンサーをぶっさして多少見栄えはよくなった
センサーがよくずれるけどなんとかならんもんか・・・
今はマジックテープで縛って両面テープでくっつけている、でもよくずれる

ソフト側はC言語ならかじったことあるのでめちゃ簡単に作ったった
一言でいうとザ・手抜き
動いたのでHello Worldしてみた
www.youtube.com
実は10回以上リテイクしている、20回から先は数えてない
撮影用に手を挙げて入力するのしんどい


手をぶらりとさせれば入力できるけど、キーアサインまだ覚えきれない
キーアサインはなんかのソースコードをアルファベットの出現頻度見て折り曲げやすい配置から順に設定していった
数字やモデファイヤキーはまだない、つか指がたらん

#define A0_LIMIT 833 // 親指
#define A1_LIMIT 880 // 人差し指
#define A2_LIMIT 858 // 中指
#define A3_LIMIT 870 // 薬指
#define A4_LIMIT 890 // 小指

#define NOP B0000 // パー

uint8_t KeyStroke = NOP;
uint8_t KeyAssign[32] = {
  NOP, // ○○○○ ○
  'e', // ○○○○ ●
  'a', // ○○○● ○
  'd', // ○○○● ●
  'o', // ○○●○ ○
  'w', // ○○●○ ●
  'k', // ○○●● ○
  NOP, // ○○●● ●
  'u', // ○●○○ ○
  'x', // ○●○○ ●
  'g', // ○●○● ○
  NOP, // ○●○● ●
  'c', // ○●●○ ○
  'p', // ○●●○ ●
  't', // ○●●● ○
  'r', // ○●●● ●
  'i', // ●○○○ ○
  'n', // ●○○○ ●
  'b', // ●○○● ○
  'v', // ●○○● ●
  'j', // ●○●○ ○
  'q', // ●○●○ ●
  'y', // ●○●● ○
  NOP, // ●○●● ●
  'h', // ●●○○ ○
  'm', // ●●○○ ●
  'z', // ●●○● ○
  'f', // ●●○● ●
  's', // ●●●○ ○
  'l', // ●●●○ ●
  ' ', // ●●●● ○
  KEY_RETURN, // ●●●● ●
};

void setup()
{
  Serial.begin(9600);
  Keyboard.begin();
}

void loop()
{
  int a0 = analogRead(A0);
  int a1 = analogRead(A1);
  int a2 = analogRead(A2);
  int a3 = analogRead(A3);
  int a4 = analogRead(A4);

  int now_stroke =
    (a0 >= A0_LIMIT) |
    (a1 >= A1_LIMIT) << 1 |
    (a2 >= A2_LIMIT) << 2 |
    (a3 >= A3_LIMIT) << 3 |
    (a4 >= A4_LIMIT) << 4;

  KeyStroke |= now_stroke;
  if (now_stroke == NOP && KeyAssign[KeyStroke] != NOP)
  {
    Keyboard.press(KeyAssign[KeyStroke]);
    delay(100);
    Keyboard.releaseAll();
    KeyStroke = NOP;
  }
  else
  {
    print_finger_state(a0, a1, a2, a3, a4);
    delay(100);
  }
}

void print_finger_state(int a0, int a1, int a2, int a3, int a4)
{
  Serial.print(a4, DEC);
  Serial.write(" ");
  Serial.print(a3, DEC);
  Serial.write(" ");
  Serial.print(a2, DEC);
  Serial.write(" ");
  Serial.print(a1, DEC);
  Serial.write(" ");
  Serial.print(a0, DEC);
  Serial.write(" ");
  Serial.println(KeyStroke, BIN);
}