BanG Dream! 8th Live Day1(Live Viewing)

いやー久しぶりのライブ、楽しかったね。

とりあえず、印象的だったシーンをまとめていくわ。

まずは、ドッキリでSTAR BEAT!~ホシノコドウ~を歌い出したところ。

あいあいも乗って歌い出すも、くどはるのコーラスが完全にアウトで、

というか、この為にSTAR BEAT!~ホシノコドウ~を練習してきたのか。

スタビ、良い曲だよね。

くどはる、感極まって号泣×2。

わかる、みんなに会えてうれしいんだね。オイラも嬉しいよ。

fire birdは、アニメ3rdシーズンのシーンを再現してくれて、泣いた。

今回のキャラくずは全員罰ゲーム。

なんか最終的に感動で終わったけど、そういうコーナーだったっけ?

さて、オイラは今、病院を終えて狸小路のファミレスでこの記事を書いているのだが、

ライブDay2まで、あと6時間、何をすれば良いっすか?

Let’s EncryptのSSL証明書の有効期限が切れていました。(解決済み)

いやー焦った焦った。

ブログの様子を見ようと思ったらこれだよ。

ERR_CERT_DATE_INVALID

というメッセージから読み取るに、

エラー、証明書、日付、不正。

ああ、証明書の日付がおかしな事になっているのね。

このサイトのSSL証明書はLet’s Encryptというツール(?)で発行しているので

ただ、自動更新する設定になっているはずだが、それがたまたま上手くいっていないのだろう。

SSHでサーバにログインし、証明書の日付を確認する。

コマンドはこれ。

$ sudo openssl x509 -in /etc/letsencrypt/live/【ドメイン名】/fullchain.pem -noout -dates

notAfterが証明書の有効期限が切れる日付です。

なるほど、8月20日午前7時11分(標準時刻)で期限が切れていたみたい。

$ sudo letsencrypt renew

で、手動による証明書更新を試みたものの、なぜかスキップされたので、

強制的に更新させました。

$ sudo letsencrypt renew --force-renewal

11月19日午前11時32分(標準時刻)に更新されました。

あ、標準時刻だから、日本時間はこれに+9時間する必要があるからね。

そして、忘れてはいけない、nginxの再起動。

$ sudo systemctl restart nginx.service

エラーは解消されました!!

光センサーをもう一度試してみる。

昨日、札幌狸小路にある梅沢無線に行ってきまして、

部品を仕入れて参りました。

この抵抗を使って、

この回路の抵抗を、

こんな感じに変えてみました。

120Ωの抵抗、売り切れやったんや・・・

これで光センサーに光を当てたときの感度が変わるのかなって思いまして。

というのも、前回は10kΩの抵抗しか持ってなかったので。

結果は、よく分かりませんでした。😋

というのも、光量云々の前に、フォトトランジスタに光を当てるときの向きが重要だったらしい。

向きを変えれば、部屋の蛍光灯でも反応してくれました。

今のコロナウイルスの状況を中二病(厨二病?)的に整理してみた。

中国武漢で発生した新型コロナウイルス感染症。

瞬く間に世界中に広がり、パンデミック状態になりました。

ここで、世界に突きつけられた選択肢は以下の二つでした。

  1. コロナウイルスに感染して死ぬ。
  2. 経済的(お金が無くなる)に死ぬ。

どっちを選択しても結局は死んでしまう。

ある国(ニュージーランド等)は①での死を嫌って、コロナウイルスに感染するのを国境で防ごうとしました。

また、ある国(ブラジル等)は②での死を嫌って、マスクなんて不要、いつも通り生活しようと訴えました。

果たして、選択肢は上の二つしか無いのでしょうか?

もし、第三の選択肢があったら、中二病的に嬉しくないっすか?

いや、ラノベに親しんでいる人達がいたら、①、②とは異なる、第三の選択肢を探して頑張る姿の方がカッコイイっすよね?

いや、もはや、ラノベの定石ですよね。

①を回避しようと訴える人達は、主に医療関係の人達で、

②を回避しようと訴える人達は、主に事業者関係の人達です。

今、日本が目指しているのは、①でも②でもない、第三の選択肢です。

言うなれば、コロナウイルスで死なない、経済的にも死なない結末を目指して、頑張っています。

特に頑張っているのは、三権分立の、行政に当たる部分(決められた予算を執行する機関)です。

そのリーダーが総理大臣であり、その下に国務大臣がいて、都道府県の知事がいて、市町村の長がいます。

彼らは、今、第三の選択肢、①でも②でもない第三の選択肢、どうするのが正解なのかを、頑張って探しています。

いろんなしがらみを抱えつつも、現在進行中の状態なのです。

果たして、世界の未来はどうなっていくのでしょうか。

【ダイエット支援】【食事管理】データ削除ダイアログ処理を作成する。

前回までの状況はこちら

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

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

データ削除処理を作成していきます。

まずはDeleteをクリックしたときの処理。

やり方はEditと同じです。

EatingDetailComponent.vue

        onClickDelete: function(timezone, id) {
            var deleteData = {};
            this.datalists[timezone].forEach(element => {
                if(element.id == id){
                    deleteData.id = id;
                    deleteData.date = this.date;
                    deleteData.item = element.item;
                    deleteData.timezone = timezone + 1;
                    deleteData.protein = element.protein;
                    deleteData.liqid = element.liqid;
                    deleteData.carbo = element.carbo;
                    deleteData.calorie = element.calorie;
                    return true;
                }
            });
            this.$refs.deleteDialog.dataSet(deleteData);
            this.showDeleteDialogContent = true;
        },

ダイアログ処理は体重管理のものを流用しています。

EatingDeleteDialogComponent.vue

<template>
    <div>
        <div id="overlay" v-show="show">
            <div id="content">
                <p v-if="error_flg == true" class="error">
                    <ui>
                        <li v-for="error in errors">{{ error }}</li>
                    </ui>
                </p>
                <table class="edit">
                    <tbody>
                        <tr>
                            <td>日付</td>
                            <td>{{contents.date}}</td>
                        </tr>
                        <tr>
                            <td>品名</td>
                            <td>{{contents.item}}</td>
                        </tr>
                        <tr>
                            <td>時間帯</td>
                            <td>{{contents.time}}</td>
                        </tr>
                        <tr>
                            <td>タンパク質</td>
                            <td>{{contents.protein}}</td>
                        </tr>
                        <tr>
                            <td>脂質</td>
                            <td>{{contents.liqid}}</td>
                        </tr>
                        <tr>
                            <td>炭水化物</td>
                            <td>{{contents.carbo}}</td>
                        </tr>
                        <tr>
                            <td>カロリー</td>
                            <td>{{contents.calorie}}</td>
                        </tr>
                    </tbody>
                </table>
                <p id="command">
                    <button @click="clickDelete">削除</button>
                    <button @click="closeModal">閉じる</button>
                </p>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    props: ['show'],
    data() {
        return {
            errors: [],
            error_flg: [],
            param: {},
            contents: {},
        };
    },
    created: function() {
    },
    methods: {
        dataSet: function(data) {
            this.contents = data;
            switch(this.contents.timezone) {
                case 1:
                    this.contents.time = "朝";
                    break;
                case 2:
                    this.contents.time = "昼";
                    break;
                case 3:
                    this.contents.time = "夜";
                    break;
                case 4:
                    this.contents.time = "間食";
                    break;
            }
        },
        clickDelete: function() {
            var self = this;
            this.param.contents = this.contents;
            axios.post('/api/eating/delete', this.param).then(function(response){
                self.closeModal();
                self.$emit('update');
            }).catch(function(error){
                self.error_flg = true;
                self.errors = error.response.data.errors;
            });
        },
        closeModal: function() {
            this.$parent.showDeleteDialogContent = false;
        },
    }
}
</script>

次はAPIの処理です。

これも体重管理の処理とほぼ同じ。

ApiController.php

    /**
     * データを一件削除する
     */
    public function delete(Request $request)
    {
        $this->eatingManagement->delete(Auth::user(),  $request->contents['id']);

        return response()->json();
    }
EatingManagementRepository.php

    /**
     * データを一件削除する
     */
    public function delete($user, $id)
    {
        $model = $user->EatingManagements()->where('id', $id)->first();
        $timezone = $model->timezones()->first();

        $this->detachToUser($model, $user);
        $this->detachToTimezone($model, $timezone);
        $model->delete();
    }

違いはtimezoneテーブルとのリンクを削除する処理が増えたぐらいで、やっていることはそんなに難しくないです。

すんなり完成しました。

これでCURD処理一通り完成したので、次回はグラフ処理を作成していこうと思います。

ビットコインが高騰したと聞いて

この情報を聞いたのが昨日の夜、スマホのニュース記事で。

オイラはYahoo!ショッピングなどで獲得したTポイントをbitFlyerを介してビットコインを購入する、ということをやっていて、

売るならこのタイミングだろう。

ちょっと価格下がり始めてたし。

保有していたビットコイン全て売りました。

なぜ、ビットコインが高騰したのか、ですが、

定額給付金10万円で購入した人がいるとかいないとか。

で、売った結果。

そのときのビットコインの価格が1BTC=約120万円。

これまでビットコインに費やしたTポイントを計算すると、半年で約6000ポイントで、

獲得したお金は、その1.5倍になっていました。

で、ここで考えなきゃ行けないのは、税金のこと。

こちらのサイトを調べてみたら、

https://bitcoin.dmm.com/column/071

雑所得が20万円を超えたら、確定申告が必要になるらしい。

まぁ、今回の場合は高く見積もっても利益1万円程度なので、たぶん確定申告の必要は無いと思うけど、

念のため、ビットコインで○○円の利益を得ていた、ぐらいは覚えておいた方が良いかもしれない。

まぁ、今回のお金で焼肉二回ぐらい行けます。

ちなみに、今後もビットコインで稼ごうとかは全然思ってないです。

今後もチマチマTポイントでビットコインを貯めていくので、

そのポイント分のお金が増えてたら良いなぁ、

程度でしか考えていないので。

でも、Tポイント→ビットコイン購入時の価格とか、きちんと記録しておいた方が良いかな。

なんかいろいろ面白そう。

元手がポイントなので、損しても被害は少ない。

【ANDROID】【実質北海道一周】UIの検討。

さて、そろそろUIにも着手しようと思うのですが、

まずはどういった情報を表示するか、を整理した方がいいのかな、と思います。

ピックアップしてみると、

  • 現在の始点と終点(どの町と、どの町の間を移動しているか)
  • その区間の現在位置(何km中のkmの位置にいる、現在何%なのか)
  • 札幌(スタート地点)からの距離、全体の何%か

これらの情報が必要かな。

あと、表示をもっとシンプルにさせたいので、画面タップで表示を切り替えるとかも良いかもしれない。

北海道地図で位置が分かるのが一番良いけど、難易度が高そうなので、今回は見送ることにする。

まずは、こんな感じで行ってみましょうか。

【北海道大戦】戦闘結果表示、ゲーム終了動処理を実装する。

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

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

https://github.com/takishita2nd/HokkaidoWar

以前作成したこれ。

status=4、5の処理を作成していきます。

とは言っても、特に難しいことはしていません。

なので、一気に作成します。

ついでにゲームオーバーの処理も作成します。

    class HokkaidoWar
    {
        enum GameStatus
        {
            SelectCity,
            ActionEnemy,
            ActionPlayer,
            ShowResult,
            GameEnd,
            GameOver
        }

        public void Run()
        {
中略
            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;

                switch (gameStatus)
                {
                    case GameStatus.SelectCity:
                        cycleProcessSelectCity(pos);
                        break;
                    case GameStatus.ActionEnemy:
                        cycleProcessActionEnemy(pos);
                        break;
                    case GameStatus.ActionPlayer:
                        cycleProcessActionPlayer(pos);
                        break;
                    case GameStatus.ShowResult:
                        break;
                    case GameStatus.GameEnd:
                        cycleProcessGameEnd();
                        break;
                    case GameStatus.GameOver:
                        cycleProcessGameOver(pos);
                        break;
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    switch (gameStatus)
                    {
                        case GameStatus.SelectCity:
                            onClickMouseSelectCity(pos);
                            break;
                        case GameStatus.ActionEnemy:
                            break;
                        case GameStatus.ActionPlayer:
                            onClickMouseActionPlayer(pos);
                            break;
                        case GameStatus.ShowResult:
                            onClickMouseShowResult();
                            break;
                        case GameStatus.GameEnd:
                            break;
                        case GameStatus.GameOver:
                            break;
                    }
                }
                asd.Engine.Update();
            }
        private void cycleProcessGameEnd()
        {
            var gameinfo = Singleton.GetGameProcessInfomation();
            gameinfo.ShowText(_player.City.GetPosition(), string.Empty);
            var info = Singleton.GetInfomationWindow();
            info.ShowText(cities[0].GetPosition(), "ゲームが終了しました\r\n");
            info.ShowText(cities[0].GetPosition(), cities[0].Name + "の勝利です\r\n");
        }

        private void cycleProcessGameOver(asd.Vector2DF pos)
        {
            var gameinfo = Singleton.GetGameProcessInfomation();
            gameinfo.ShowText(_player.City.GetPosition(), string.Empty);
            var info = Singleton.GetInfomationWindow();
            info.ShowText(pos, "敗北しました\r\n");
        }

        private void onClickMouseShowResult()
        {
            _battle.MyTurnEnd();
            cities = _battle.GetCityList();
            if(cities.Count <= 1)
            {
                gameStatus = GameStatus.GameEnd;
            }
            else
            {
                gameStatus = GameStatus.ActionEnemy;
            }
        }
    class Battle
    {
        public void MyTurnEnd()
        {
            if (lastDeffece != null)
            {
                lastDeffece.ClearPaint();
                lastDeffece = null;
            }
            if (lastAttack != null)
            {
                lastAttack.ClearPaint();
                lastAttack = null;
            }
            cityCnt++;
            if (cityCnt >= _cities.Count)
            {
                _cities = cityRandomReplace(_cities);
                cityCnt = 0;
                turn++;
            }
        }

その他、微調整も加えています。

これで一応一通り完成しました。

次は、ちょっとした不具合とか、微調整を行って行きます。

Fortniteがストアアプリから削除されたことについて思うこと。

Epic Gamesも大胆な事をしちゃったね。

元々はEpic Gamesがアプリ内課金をストアアプリ経由ではなく、自前の課金システムを使用していた、と言う事みたいなんですが、

(Fortniteプレイしていないので)

結局はEpic GamesとApple、Google間の問題でしょ?

と考えるあなた。

甘い。

確かに、ユーザー視点からしたら課金すること自体には何も変わりは無いですが、

問題は、その課金するためのクレジット情報をどこが管理しているか、ということです。

ストア経由ならば、一括してAppleがGoogleが管理していますが、

Fortniteの場合は第三者側で管理することになります。

今回の場合、Epic GamesはPCで独自のプラットフォームを持っており、そのノウハウがあれば安全かと思われますが、

どちらかというと、AppleやGoogle側が、一度そういう行為を許すと、いろんなアプリ開発メーカーが独自の課金システムを使用する流れになる、というのを防ぎたいのが一番の目的だと思います。

もしそうなった場合、個人情報の管理が出来なくなり、どこかで個人情報流出が起きると、大混乱になりますよね。

個人としては、一番信頼できる、Apple、Googleで一括管理して貰った方が安心と思いますが、どうでしょうか?

接触確認アプリCOCOAが個人情報を収集していないことをプログラマー視点で解説する

ニュースとかでもいろいろ言われてきましたが。

https://twitter.com/afoolahoo/status/1294277259545571328

COCOA=すれ違い通信

という説明が一番わかりやすいかもしれないけど。

そもそもの話、アプリは勝手に個人情報に関わるデータを参照することができない用になっています。

これはiPhoneでもAndroidでも同じ。

ここでいう個人情報に関わるデータとは、GPS、電話帳、カメラ、外部ストレージなどを指します。

例えば、あるアプリが、他のアプリの情報を勝手に参照する、ということも出来ません。

これらの個人情報データを参照するには、「必ず事前にユーザーの了解を得ないとアクセス出来ない」仕様になっています。

例えば、GPSを使用するアプリを起動したときに、こんな画面が表示されることありませんでしたか?

この画面で「許可」をタップして、アプリはようやくGPSのデータにアクセス出来ます。

この手順というのもOS側で決められた手順で行わなければなりません。

例えるなら、

アプリが個人情報にアクセスしたい場合、アプリはOSが用意した正式フォーマットをユーザーに提示します。

ユーザーはそれに「OK!」とサインして、初めてアプリは個人情報にアクセス出来るようになります。

(通じたかな・・・)

これは逆に考えることも出来まして、

例えば、みなさん、上のダイアログの内容、確認しないでOKポンポンタップしたりとかしていませんか?

その行為、個人情報抜き取られているかもしれませんよ?

ストアアプリは大丈夫だと思うけど、野良アプリ(ストア外のアプリ)は注意した方が良いよ。

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