アプリ置き場

アプリ置き場

http://www.moreread.net/

ワットチェッカー

PCの消費電力が気になってしょうがない。
ワットチェッカーは持っているんだけど、いつも見える位置に配置しようとすると電源ケーブルをかなり延長する必要がある。Bluetoothで飛ばす製品もあるみたいだけど、結構なお値段する。

ということで、ありものの明暗センサLEDライト+ワットチェッカーWebカメラを使ったソリューション。Webカメラにマグネットシールを張り付けて、PCケース背面に設置、ワットチェッカーを監視。フレキシブルなUSBケーブルとかあればそっちのほうが便利かもしれない。暗くても見えるように近くに明暗センサLEDライトも設置しとく。

OpenCvSharpを使えばWebカメラからキャプチャできるらしい。NuGetしてきて適当にプログラムを書く。PictureBoxIplというコンポーネントがあったので、これを使えば表示できそうな気がする。

namespace WattCheck
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            CloseCaptureDevice();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateCapture();
        }

        VideoCapture cap = null;

        private void UpdateCapture()
        {
            if(cap != null && cap.IsOpened()) {
                pictureBoxIpl1.ImageIpl = cap.RetrieveMat();
                System.GC.Collect();
            }
            else
            {
                OpenCaptureDevice();
            }
        }

        private void OpenCaptureDevice()
        {
            for (int i = 0; i < 0x8; i++)
            {
                cap = new OpenCvSharp.VideoCapture(i);
                if (cap.IsOpened())
                {
                    break;
                }
                else
                {
                    CloseCaptureDevice();
                }
            }
        }

        private void CloseCaptureDevice()
        {
            if (cap != null)
            {
                cap.Release();
                cap.Dispose();
            }
        }
    }
}

やったー。
f:id:nazenaninadesico:20181123104530p:plain
PC+ディスプレイの消費電力。
LEDライトは0.2ワットだから気にしない。

あとは文字認識させてロギングしたいけど適当なOCRのライブラリってあるんだろうか。
探してみるとtesseract-ocrというものを使うと良いらしい。
適当に画像を2値化して食わせてみたけど……。

f:id:nazenaninadesico:20181123104536j:plain

反射光やら影やらのせいでうまく認識しない。
7セグ数字くらいなら自前でテンプレートマッチングしたほうが手っ取り早そうな気がしないでもない。そのうちなんとかしよ。

AirPodsをPCで使うとシークでノイズが出たり音が止まったり

PCで使う用にAirPodsを購入。超便利。
 
しかしながら、FireFoxで動画サイトを見ているときにシークバーを弄ると、ノイズが走ったり音がでなくなったりしてしまうことが多々。接続が切れているわけではない。おま環なのか、AirPods+PC(FireFox)のユーザーが少ないのかわからないが、ググっても情報が見つからない。
・MM-BTUD43 (Bluetoothドングル)
Intel NUC (Win10)
しょうがないので自分で少し原因調査してみたが、音の停止と再生を素早く行うと発生しやすい気がする。プログラムを書いてMCIで音を連続再生してみても起こった。
多分に推測が入るが、Bluetoothドングルか、そのドライバか、またはAirPodsかでサウンドの入力が0になったときに、節電モード的なもののスイッチが入るが、ほぼ同時に再生が開始すると入力を取りこぼすか検知できないかで問題が起きてそうな気が。
 
仮説が正しいとすると裏で音楽をかけっぱにしとけば問題はおこらないはず。ためしにMPCでMP3を低音量で垂れ流しておくと、FireFoxで動画をシークしても問題はおこらなくなった。
 
ということで、可聴領域外(5hz)&低音量で音を垂れ流すページを作った。FireFoxでこのタブを開いとけばシークでぶつぶつノイズが走ったり音がでなくなったりすることはなくなるはず。なんという力技。
とりあえず別の方法が見つかるまではこれでしのぐ……。

C# RARアーカイブから画像を読み込む

① nugetでSharpCompressをインストール

f:id:nazenaninadesico:20180909014756p:plain

② usingする

using SharpCompress.Archives;

③画像を読み込む
IArchive rar = ArchiveFactory.Open(path);
foreach (var e in rar.Entries)
{
     using (Stream s =e.OpenEntryStream())
     {
         Image img =Image.FromStream(s);
     }
}
rar.Dispose();

リタイアシミュレータ

逃げ切り計算機を使わせていただいて妄想が捗っていたのですが、細かい設定がしたかったり、グラフで見たかったり、結果を保存したかったり、等々があったのでシミュレータを作りました。
早期リタイア、アーリーリタイア、セミリタイアのための資産運用シミュレーションです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

BitMex 価格の取得

ccxtでBitMexのfetch_tickerが403になる。
下記で価格はとれた。
サーバーが直るのか、APIが禁止でccxtが更新されるのかわからんけど、暫定でとりあえずbotの動作再開。
import urllib
 
data = json.loads(ret.decode("utf8"))
 
return data["result"]["price"]

Amazon Echo スキル開発

審査かなりきびしい。何度めだかわからない申請してようやく通った。
とりあえず習作として「目隠し○×ゲーム」というのを作ってみました。
 
下記のサイトに紹介が。
//動画があったので再生したらうちのAlexaが反応するっていう。。ピザ注文テロとか発生しそう。
 
数字で座標を指定して○×を配置するルールなのだけど、申請のリジェクト理由の一つに、ユーザーは「真ん中」とかいうから!ちゃんと対応して!みたいなのがあって、細かいなぁと思った。まだ登録されてるアプリが少ないけど、審査厳しくて弾かれまくってるんじゃなかろうか。
 
あとDQX用にやいばくだきタイマ―つくったら商標ブランドがうんたらでダメっていわれた。無念。

echo dot 例外処理は?

ようやくとどいたー。結構いい精度で聞き取ってくれる。


そして、チュートリアルに言われるがまま、ぽちぽちクリックしてたらスキルつくれた。
 
無言だったときとか、聞き取れなかった場合などの処理がよくわからなかったが、UnhandledやSessionEndedRequestで拾えるらしい。ちなみにaskは8秒経過で次のメッセージ、さらに8秒経過でセッションが切れてSessionEndedRequestだそうな。
 
var handlers = {
    'LaunchRequest': function () {
        this.emit(':ask', text, text2);
    },
  ~~略~~
    Unhandled: function() {
        this.emit(':ask', ”ぱーどぅん?”, "わっと?");
    },
    SessionEndedRequest: function() {}
};