スマホのAlexaアプリが勝手にradikoを起動する問題

こういうのマジでびびるから勘弁して。。。

WF-SP800Nを使い始めた当たりから、スマホのAlexaアプリが勝手にradikoを起動して、通知欄に居残るという現象が現れました。

Alexaアプリが悪さしているのは確実なんですが、なぜWF-SP800Nとのペアリングを契機にこうなったのか。

使用前は特に問題ありませんでしたし、

だからといって、Amazon Echoなどデバイスやスキルの設定もこのアプリで行うため、削除することもできません。

まぁ、原因はわかったんですが。

アプリの通知設定画面から、

上のAlexaという所のスイッチをOFFにして通知を切れば解消しました。

おそらくですが、WF-SP800NとAlexaを連携させたことにより、これらの通知がONに変更されたのが原因でしょう。

しかし、この画面、同じような項目が沢山あって訳が分からんよ。

なんとかしてください。Amazonさん。

【北海道大戦】マップデータを管理する

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/HokkaidoWar

さて、現状マップデータの管理は、都市オブジェクトの中に所属するマップが格納されていると言う状態で、マップ同士の横のつながりがありません。

このままでは「隣接するマップ」を取り出すことが出来ないので、整理して管理したいと思います。

マップデータは横44マス、縦35マスで構成されているので、二次元配列にするのが最適でしょう。

なので、このデータを管理するクラスを作成し、シングルトンで使用します。

    class FieldMap
    {
        public int MaxX { get { return 44; } }
        public int MaxY { get { return 35; } }

        private Map[,] _map;
        public FieldMap()
        {
            _map = new Map[44, 35];
        }

        public Map GetMap(int x, int y)
        {
            return _map[x, y];
        }

        public void SetMap(Map map)
        {
            _map[map.X, map.Y] = map;
        }

    class Singleton
    {
        private static FieldMap _map = null;
        public static FieldMap GetFieldMap()
        {
            if (_map == null)
            {
                _map = new FieldMap();
            }
            return _map;
        }

で、都市オブジェクトからマップオブジェクトを作成する際に、このクラスにマップオブジェクトも保持させます。

        public City(string name, Point[] points, int population)
        {
            _name = name;
            _population = population;
            _maps = new List<Map>();
            var r = Singleton.GetRandom();
            _color = new asd.Color((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255));

            var fieldMap = Singleton.GetFieldMap();

            foreach (var p in points)
            {
                Map m = new Map(p.x, p.y, _color);
                _maps.Add(m);
                fieldMap.SetMap(m);
            }
        }

たぶん、これだけでOKのはずなので、うまく管理出来ているか、テストコードで確認したいと思います。

マウスカーソルのあるマップの隣にあるマップの色を変化させます。

    class City
    {
        public void OnMouse(asd.Vector2DF pos)
        {
            var fieldMap = Singleton.GetFieldMap();
            foreach (var m in _maps)
            {
                if(m.IsOnMouse(pos))
                {
                    var info = Singleton.GetInfomationWindow();
                    info.ShowText(pos, _name + "\r\n" + _population.ToString());
                    // test
                    fieldMap.onMouse(m);
                }
            }
        }
    class FieldMap
    {
        // Test
        public void onMouse(Map map)
        {
            for(int x = 0; x < MaxX; x++)
            {
                for(int y = 0; y < MaxY; y++)
                {
                    if(_map[x,y] != null)
                    {
                        _map[x, y].unlinkedMap();
                    }
                }
            }
            if(map.X > 0)
            {
                if (_map[map.X + 1, map.Y] != null)
                {
                    _map[map.X + 1, map.Y].linkedMap();
                }
            }
            if (map.X < MaxX)
            {
                if (_map[map.X - 1, map.Y] != null)
                {
                    _map[map.X - 1, map.Y].linkedMap();
                }
            }
            if (map.Y > 0)
            {
                if (_map[map.X, map.Y - 1] != null)
                {
                    _map[map.X, map.Y - 1].linkedMap();
                }
            }
            if (map.Y < MaxY)
            {
                if (_map[map.X, map.Y + 1] != null)
                {
                    _map[map.X, map.Y + 1].linkedMap();
                }
            }
        }
    class Map
    {
        // Test
        public void linkedMap()
        {
            var changeColor = new asd.Color(200, 200, 200);
           _geometryObj.Color = changeColor;
        }

        public void unlinkedMap()
        {
            _geometryObj.Color = _color;
        }

うまくいけていると思います。

【給付金で買った物】【ワイヤレスイヤホン】Sony WF-SP800N

Sony WF-SP800N

リリースされたての最新モデルです。

27000円。

特徴としては、ノイズキャンセル機能も持ちながら、スポーツ用途に特化した防水仕様になっています。

防水仕様になっていないと、汗でイヤホンが壊れるらしいよ。

開封。

接続の仕方が書いてありました。

充電はUSB-Cです。

さすが。最新モデルは違うね。

イヤホンをケースに入れて充電中にアプリを準備。

アプリを入れ終わったら、アプリの指示通りにイヤホンをケースから取り出し、スマホ本体をイヤホンに近づけるとペアリングが完了します。

思った以上に簡単でした。

実際に使ってみての感想。

今まで使用していた

(確か)メルカリで数千円で購入したものと比較します。

まず装着感。

WF-SP800Nは耳に入れる部分がこうなってて。

イヤーピースが耳の窪みにハマる構造になっているんですよ。

見事にフィットするので、激しい運動しても耳から外れる気がしない。

安物は静止してても耳から外れようとするからね。

あと、コントロールは左右それぞれにタッチ部分があり、

ここっす。

左耳側がGoogleアシスタントまたはAlexaの起動ボタンで、どちらにするかはアプリで選択できます。

右耳側が音楽の再生、停止、スキップなどの操作ができるようになっています。

ポイントは操作ボタンが、「イヤホン全体」では無くて、「一部」ということです。

多分、イヤホン自体が大きいから出来るんだろうな。

安物はイヤホン全体がスイッチ部分になっていて、ポジション変更しようとして誤操作が頻繁に起こっててストレスになっていました。

WF-SP800Nはそもそも完全にフィットしているのでポジション変更する必要が無いのですが、全体がスイッチ部分ではないので、誤操作することがありません。

むしろ、操作しようとしてもうまくスイッチが入らないぐらい(え。

あと、ノイズキャンセル機能もいいですね。

ノイズキャンセル機能がもっと強力なモデルもあるのですが、そちらは防水仕様になっていないので、こちらを選択しました。

でも、性能としては十分で、たとえば、パソコン作業しているとPCファンの音とかは全く聞こえないですね。

音楽を再生すると、その音のクオリティにびっくりしました。

作業に集中できるが、お客さんがピンポンしても気がつかないレベル。

これは、最高ですわ。満足。

存分に活用させて頂きます。

【ダイエット】実践していることその2、1つだけでいいから生活習慣を変えるべし

その1についてはこちら。

体重計を買って毎日体重を量っていても、今までと同じ生活を送っていては何も変わりません。

なので、次にやることは、生活習慣を変えることです。

1つだけで十分です。

ただし、必ず守らなければいけないことがあって、

毎日出来ることを実行してください。

例えば、○○食べるだけダイエットを実施したとしましょう。

これを実行すれば一時的に痩せることは可能でしょう。

でも、それを今後一生続けることは出来ますか?

絶対無理だと思います。

生活習慣を変えることは、今後一生その生活を続けると言うことです。

なので、必ず毎日出来ることをやらなければ痩せられないのです。

※毎日と言っていますが、目的は生活習慣を変えることなので、無理して毎日しなくちゃいけないということでは無いですよ。

人間の体って、思っている以上にわかりやすくて単純なんですよ。

自分の体は、全て自分で食べたもので出来ていますし、運動を続ければ、それに適した体につくり変わっていきます。

なので、少しでも良いので今までの生活に変化を付けてください。

オイラの場合は、週の半分は、白米の代わりに発芽玄米パックを食べています。

そして、晴れている日はできるだけ外を走るようにしています。1回40分程度のジョギングです。

あとは筋トレとプロテインをやってますね。

ちょっとだけの生活習慣の変化でも、続ければ確実に体に変化が出てきますよ。

今のオイラの状況はと言うと、

火曜日に焼肉を食べに行ったので、少し体重が増えてしまいましたが、腹筋をやったおかげか、ベルトの穴が1つ内側になりました。

排泄も順調なので、暴飲暴食しなければ良い感じに落ちると思います。

ただ、しばらく雨でジョギングできないんですよねー。

【給付金で買った物】ディスプレイ

iMacが置いてあった場所。

ディスプレイを新規購入してここに設置しました。

12000円。

部屋の角に3画面態勢が完成しました。

大丈夫、マシンのリソースは十分にある。(メインメモリ32GB、VRAM8G)

なんならもう一台ディスプレイ追加できる(置き場所無いけど)

Dportでマシンと接続していて、HDMIと入力を切り替えることができます。

なので、このディスプレイを、ケーブル差し替え無しで、ラズパイ用ディスプレイとしても使用できます。

さらに、もう一つメリットができまして、

中央がメインディスプレイなので、そっちにキーボードとマウスの向きを変えたところ、

マウスを操作する際に、肘を置くスペースができました。

マウス操作がめちゃくちゃ楽です。

【ラズパイ】GLCDに時刻・気温・湿度・天候情報を表示する

前回までやっていたGLCDをライブラリ化して、gitHubを更新しました。

https://github.com/takishita2nd/GLCD

このGLCDライブラリを使ってGLCDに時刻、気温、湿度、天候情報を表示させたいと思います。

まず、温度、湿度を表示させるために、AM2320周りもライブラリ化しました。

import time
import smbus

i2c = smbus.SMBus(1)
address = 0x5c

def GetTemp():
    loop = True
    block = []
    while loop:
        try:
            i2c.write_i2c_block_data(address, 0x00,[])
            i2c.write_i2c_block_data(address, 0x03,[0x02, 0x02])

            time.sleep(0.05)

            block = i2c.read_i2c_block_data(address, 0, 4)
            loop = False
        except IOError:
            pass
    temp =  block[2] << 8 | block[3]
    return format(temp / 10)

def GetHum():
    loop = True
    block = []
    while loop:
        try:
            i2c.write_i2c_block_data(address, 0x00,[])
            i2c.write_i2c_block_data(address, 0x03,[0x00, 0x02])

            time.sleep(0.05)

            block = i2c.read_i2c_block_data(address, 0, 4)
            loop = False
        except IOError:
            pass
    hum =  block[2] << 8 | block[3]
    return format(hum / 10)

天候データはopenWeatherのWebAPIを利用します。

https://openweathermap.org

openWeatherにした理由は、今のGLCDが半角アスキー文字しか表示できないので、どうしても英語で表示させる必要があります。

なので、海外の英語のAPIを利用させて貰いました。

アクセス回数を絞れば無料で利用できます。

import json
import urllib.request

weather = ""
temp_min = 0
temp_max = 0
temp = 0

def RequestAPI():
    global weather
    global temp_max
    global temp_min
    global temp

    url = 'http://api.openweathermap.org/data/2.5/weather?lat=XXX&lon=XXX&units=metric&appid=XXXXXXXX'
    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as res:
        body = json.load(res)
        weather = body['weather'][0]['main']
        temp_min = body['main']['temp_min']
        temp_max = body['main']['temp_max']
        temp = body['main']['temp']

def GetWeather():
    return weather

def GetTemp():
    return temp

def GetTempMin():
    return temp_min

def GetTempMax():
    return temp_max

個人情報を含んでいるので、クエリパラメータは書き換えてあります。

これらを使って、GLCDに表示させます。

import RPi.GPIO as GPIO
import time
import datetime
import calendar
import GLCD
import AM2320
import Weather


def __main__():
    GLCD.PinsInit(20, 7, 8, 9, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17)
    GLCD.GLCDInit()
    GLCD.GLCDDisplayClear()

    roop = 10 * 60 * 60
    try:
        while True:
            if roop >= 10 * 60 * 60:
                Weather.RequestAPI()
                weather = Weather.GetWeather()
                temp = Weather.GetTemp()
                roop = 0

            GLCD.GLCDPuts(1, 0, "Date :")
            GLCD.GLCDPuts(10, 8, datetime.datetime.now().strftime('%Y:%m:%d %A'))
            GLCD.GLCDPuts(1, 16, "Weather :")
            GLCD.GLCDPuts(10,24, weather)
            GLCD.GLCDPuts(10,32, "Temp : " + format(temp) + 'C')
            GLCD.GLCDPuts(1, 40, "Time : " + datetime.datetime.now().strftime('%H:%M:%S'))
            GLCD.GLCDPuts(1, 48, "Humidity    : " + AM2320.GetHum() + '%')
            GLCD.GLCDPuts(1, 56, "Temperature : " + AM2320.GetTemp() + 'C')

            roop += 1
            time.sleep(0.1)
    except KeyboardInterrupt:
        GLCD.GLCDDisplayClear()
        GPIO.cleanup()

__main__()

フーフーって聞こえているのは、AM2320に息を吹きかけています。

なんか良い感じだぞ。

配線の見た目をなんとかすれば、そのままインテリアとして使えるかもしれない。

【C#】【ピクロス】【ALTSEED】解析パターン14

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

次はここを処理します。

ここは縦の数字がすでに3が塗られているので、上の空いているマスに1マス、下の空いているマスに2マスを塗ることができます。

なので、赤く囲んだ部分は塗れると言うことですね。

これを実装します。

考え方としては、まだ確定していないマスと数字を抽出し、順序関係が一致かつ、数字とマスが一致した場合、そこを塗る、という感じでいきますか。

        // 解析パターンその14
        // 数字と空いているマスを照合して塗る
        private void pattern14()
        {
            // Row
            pattern14Row();
            // Col
            pattern14Col();
        }

        private void pattern14Row()
        {
            int row = 0;
            foreach (var rowlist in rowNumbers)
            {
                if (rowlist.IsAnalyzed())
                {
                    row++;
                    continue;
                }

                // 有効な数字を取り出す
                List<AnalyzeData> aData = new List<AnalyzeData>();
                foreach(var data in rowlist.AnalyzeDatas)
                {
                    if (data.IsAnalyzed())
                    {
                        continue;
                    }
                    aData.Add(data);
                }

                // 対象となるマスを抽出する
                List<List<BitmapData>> bitmapLists = extractTargetBitmapListsCol(row);
                bitmapLists.Reverse();

                // 数字とマスを照合する
                if (bitmapLists.Count != aData.Count)
                {
                    row++;
                    continue;
                }

                AnalyzeData maxData = null;
                int remi = 0;
                for(int i = 0; i < aData.Count; i++)
                {
                    if (maxData == null)
                    {
                        maxData = aData[i];
                    }
                    else
                    {
                        if(maxData.Value < aData[i].Value)
                        {
                            remi = i;
                        }
                    }
                }
                if(maxData != null)
                {
                    if (bitmapLists[remi].Count == maxData.Value)
                    {
                        foreach (var b in bitmapLists[remi])
                        {
                            b.Paint();
                        }
                        maxData.Analyzed();
                    }
                }
                row++;
            }
        }

extractTargetBitmapListsCol()の処理も少し修正しています。

実行結果はこうなりました。

ここまで複雑なロジックを組み合わせていくと、過去の問題が解けなくなっているとか十分あり得るので、その確認が大変です。

なんかもっといい確認方法を考えないといけないかもしれない。

何か方法を考えます。

【ダイエット】実践していることその1、体重計を買うべし

まぁ、まだ自分もダイエット半ばですので、偉そうなことは言えないのですが、

確実に言えるのは、本気で痩せたいなら体重計を買うべし、です。

そもそもの話、体重計に乗って、体重の変化を数字で確認しなければ、痩せたかどうかが分からないじゃ無いですか。

正直言って、これができるかできないかでダイエットに対する本気度がバレてしまうと思います。

そして、体重計を買ったら、毎日体重計に乗って、体重を記録しましょう。

できれば毎日同じタイミングでの計測が良いです。

1日でも時間によって変わりますし、食前食後でも言わずもがなですね。

オススメは朝起きて、トイレに行った直後、です。

オイラはトイレの出口から見えるところに体重計を置いて、朝起きる→トイレに行く→体重計に乗るという導線を作っています。

あと、体重計は自動的に記録してくれるものが非常に便利です。

自分で記録しなくても、アプリとかで確認できる物が良いですね。

オススメはやっぱりfitbitの体重計です。

WiFi経由でスマートフォンのアプリにデータを転送し、いつでもアプリで確認することができます。

あとは、体組成計なども計測できるものもあり、それがあれば体のデータが細かく調べられます。

まぁ、なんであれ、毎日続けられる方法を選んでください。

これ、一番大事。

毎日続けることが重要です。

fitbit Versa2を1週間使用して気が付いたこと

fitbit Versa2の開封記事をこちらに書いたのですが。

1週間使ってみて、気がついたことをまとめました。

高低差が分かるようになった。

高低差が分かるので、例えば何階分の階段を上ったか、というのも記録されるようになりました。

ランニング記録にランニングルートが記録されるようになりました。

おそらく、スマホ端末側のGPS情報を使用しているのでしょうが、ランニングルートも記録されるようになりました。

個人情報を含むのでスクショは取れませんが。

今まではアディダスアプリを使って記録していましたが、これも不要になりますね。

ウォッチフェイスを変更できる。

まぁ、スマートウォッチだから当然だわな。

エクササイズを自動的に認識してくれる。

認識自体はいままでのトラッカーでもできましたが、

例えばランニング中に信号待ちで停止した場合、それも認識してタイマーを止めてくれます。

そして、信号が青になって走り出すと、それも認識してタイマーを再開してくれます。

謎アプリStrava

なんか、エクササイズを行うと、自動的にこのアプリが動作して、何かしてくれるみたいなんですが、いまだに何もしてくれていません。

これ、何なんですかね?

こう見て見ると、やっぱり今までのInspireHRよりも遙かにパワーアップしていますね。

使用していて楽しいです。

いろんなデータが溜まっていき、それを眺めて、また明日も頑張ろうって思えます。

【LARAVEL】【ダイエット支援】グラフのデータ間隔を指定する

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/diet-mng

このプログラムはこちらのリンク先で運用中です。

https://taki-lab.site:8443

さて、こちらのグラフなんですが、

現状は最近の10日間のデータをグラフに表示させているのですが、

実際、もっと昔のデータもグラフに出したいじゃないですか。

なので、これをやります。

UIとしては、右下のところに日毎、週毎、月毎のリンクを作成して、それでグラフの切り替えをやっていこうと思います。

まずはフロント部分。

            <div class="command">
                <ul>
                    <li><a @click="onClickDay">day</a></li>
                    <li><a @click="onClickWeek">week</a></li>
                    <li><a @click="onClickMonth">month</a></li>
                </ul>
                <ul>
                    <li><a @click="onClickInput">クイック入力</a></li>
                    <li><a href="/weight">詳細</a></li>
                </ul>
            </div>

こんな感じでリンクを作ります。

フロントの処理はこちら。

        onClickDay: function() {
            this.contents.interval = 1;
            this.graphUpdate();
        },
        onClickWeek: function() {
            this.contents.interval = 7;
            this.graphUpdate();
        },
        onClickMonth: function() {
            this.contents.interval = 30;
            this.graphUpdate();
        },

クリックするリンクでデータ間隔を数字で設定して、APIのパラメータとして与えます。

ではAPIの処理。

    /**
     * グラフ用データを取得する
     */
    public function graph(Request $request)
    {
        return response()->json(['datas' => $this->weightManagement->getGraphData(Auth::user(), $request->contents["interval"])]);
    }
    public function getGraphData($user, $interval, $days = 10)
    {
        $datetimes = [];
        for($i = 0; $i < $days ; $i++) {
            $datetimes[] = date('Y-m-d', strtotime('today - '.($i * $interval).' day'));
        }

        return $user->WeightManagements()
                    ->whereIn(DB::raw('date_format(datetime, "%Y-%m-%d")'), $datetimes)
                    ->get();
    }

実行結果はこちら。

日毎

週毎

月毎

データが少ないからあまり違いがわかりませんが、表示はちゃんと変わってます。

自分、ぼっちですが何か?