Microsoft Cognitive Services でバイナリ送る

Microsoft が提供している Microsoft Cognitive Services の Emotion API を使ってみた。

www.microsoft.com

パラメータがいろいろあり、かなり遊べる感じだったものの、どの API のサンプルを見ても URL で画像を送っている。ただ普通にreadFile して送りつけたら InvalidImageSize という名のエラーが出て、Image size is too small or too big. とか怒られて、そこで数時間詰まったので、メモ代わりに。

どうやら chunked transfer をサポートしていないことが問題らしく(参考:botframework - Microsoft Cognitive Services Emotion API. Error: 'Image size is too small or too big.' - Stack Overflow)、sync で読めばよいという話のよう。

以下、コード。

"use strict";

const request = require('request');
const fs = require('fs');

request.post({
  url: 'https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize',
  headers: {
    'Ocp-Apim-Subscription-Key': { SUBSCRIPTION-KEY },
    'Content-Type': 'application/octet-stream'
  },  
  method: 'POST',
  body: fs.readFileSync({ IMAGE FILE })
}, (error, response) => {
  let res = JSON.parse(response.body);
  console.log(res);
});

Connecting to eduroam (WPA-EAP) with Raspberry PI

I wanted to use eduroam with my Raspberry PI.

echo -n <password-for-wifi> | iconv -t utf16le | openssl md4

and create a hash for your authentication. Save the result somewhere for we’ll use it later on.

sudo vi /etc/network/interfaces

Open file for interfaces, and rewrite the wlan0 part as below.

allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
  • make sure you write DHCP, or else you’re going no where.

And of course, you need to rewrite the wpa_supplicant.conf as well.

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

At the bottom of the file,

network={
      ssid="eduroam"
      scan_ssid=1
      key_mgmt=WPA-EAP
      eap=PEAP
      identity="<your-username>"
      password=hash:<your-hashed-password>
      phase2="MSCHAPV2"
}
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
history -c
sudo reboot

If above doesn’t work, try out different methods and protocols…

Reference

Raspberry PI でデフォルト以外のマイクを優先的に認識させる

以下、すべて Raspbian Jessie での話です。 外部 USB サウンドカードを挿して、マイクを Raspberry PI につないだはいいものの、なんだかうまく認識してくれない、というところで約1日詰まったので、記録まで……。

ちなみに、Web Audio API を使いたいだけなのであれば、Chromium のデバイス詳細設定を見ると、どのマイク、どのイヤホンを使うか、みたいなメニューが隠れていて、そこをいじればすぐ動く、はず。

aplay -l
aplay -L
cat /proc/asound/cards
alsamixer

まず、上記のコマンドを実行すると、各フォーマットで alsa で使用可能なデバイスが表示される。 まず、自分のサウンドデバイスがこちらに表示されていることを確認。

*aplay と alsamixer は両方とも alsa のコマンドなので、まだ alsa をいれてない人は、

sudo apt-get install alsa-base alsa-utils alsa-tools

ですべて入るはず。 *一説によると alsamixer でもデフォルト変更できるらしいものの、うまくいった感じはしなかった

ここから先は先ほどのコマンドに対して、何番目に(aplay -l が一番わかりやすい)表示されたかを覚えつつ進めていく。

sudo rm /etc/modprobe.d/alsa-base.conf

*Raspbian Wheezy はこれを使っていたようだけれど、Jessie ではいらなくなってる(というか異なるファイル)

sudo nano /usr/share/alsa/alsa.conf

alsa の設定ファイルを開き、

defaults.ctl.card 0
defaults.pcm.card 0

と書いてある行を発見し次第、0 を自分のサウンドカードの番号に置き換える。

さらに、

sudo nano ~/.asoundrc

とし、

pcm.!default {
    type hw
    card CARD_NUMBER
}

ctl.!default {
    type hw
    card CARD_NUMBER
}

CARD_NUMBER を自分のサウンドカードの番号に置き換えて書き込む。

再起動したら自分が設定したサウンドカードが優先されるようになっている、はず……。

ただ、自分の用途のときはそもそもコード側で alsa に対してサウンドカードを指定できた(plughw:1,0)ので、この操作は結果的にあんまり意味なかった……。

plughw:1,0 ってなんぞやってなったときは、 linux - What do ALSA devices like "hw:0,0" mean? How do I figure out which to use? - Super User の回答にとても丁寧に書いてあるけれど、aplay -lを再度実行。

$ aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: T71Space [Terratec Aureon 7.1-Space], device 0: ICE1724 [ICE1724]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: T71Space [Terratec Aureon 7.1-Space], device 1: IEC1724 IEC958 [IEC1724 IEC958]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: T71Space [Terratec Aureon 7.1-Space], device 2: ICE1724 Surrounds [ICE1724 Surround PCM]
  Subdevices: 3/3
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2

この card の後に書いてあるのがカードの番号(当たり前)で、デバイスの後に書いてあるのがデバイスの番号。 それを組み合わせて、

plughw:カード番号,デバイス番号

と表記するらしい。

Node でのライブラリクラスの書き方

(function(global) {
  "use strict";

  let hoge = "",
      fuga = "";

  class ClassName {
    constructor(_hoge) {
      this.hoge = _hoge === undefined ? false : _hoge;
    };

    functionName () {
    }

  if ("process" in global) {
    module["exports"] = ClassName;
  };  
  global["ClassName"] = ClassName;


})((this || 0).self || global);

あらためて、ふざけた言語だ JavaScript。 本当の本当に最新版は何かは僕も分からないっす。

IE10 以下を切る場合の JavaScript チェックリスト - Qiita

最近の行儀のよい JavaScript の書き方 - Qiita

Node.js : コードの書き方 : typeOf 'aki_mana'

引数を渡さなかった際にデフォルト値を使う場合の注意点 - Qiita

use strict で this がエラーを吐く

タイトルのとおり

ある大きな function の中で vars という変数を定義したとする

"use strict"

/// 大 function
var _vars = "hey!!!";
function something(hello) {
   hoge.fuga(params, function (p) {
      this._vars; /// エラーを吐く
   };
};

みたいなことが起きた。

どう怒られるかというと、

ReferenceError: _vars is not defined

とか言われる。

ES6 のドキュメントとか読んでいても this の扱い方としてはあっているはずなのになー、と思ったら、

"use strict"

/// 大 function
var _vars = "hey!!!";
function something(hello) {
   hoge.fuga(params, (p) => {
      this._vars; /// エラーを吐く
   };
};

という arrow 記述にしたら直った。

記述自体も新しくあわせろやっていうことですね。

個人的には function って書いてある方がある程度読みやすいと思うんだけどな……。