【ダイエット】実践していることその3、ダイエットのためにお金をケチらない

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

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

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

多少波がありますが、今、体重が減少傾向にあります。

今日明日頑張ればもっと体重落ちそう。

ダイエットを本気で取り組もうと思っているならば、あえて、高いコストをかけるというのも1つの手段ダと思います。

自分の場合は、トレーニングウェアに1万円のスポーツブランド(デサント)を購入しましたし、

トラッカーには2万円のFitbit Versa 2を購入。

体重測定には1万円のFitbit Aria2を使用していますし、

ランニングでは2.6万円のソニー WF-SP800Nを購入しました。

SAVASのデカイ袋のプロテインをほぼ毎日飲んでいます。

なぜ高い物を選択するのかというと、

ダイエット・トレーニングの効率を高めるという意味もありますが、

ダイエットを諦めるハードルを下げないためでもあります。

例えば、こんな経験は無いですか?

近所に安くていつでも使えるトレーニングジムが出来たと聞いて、会員になったものの、結局月に1回しか通ってない。

いつでも通えると思ったら明日でいいやと思ったり、結局めんどくさいと思ったり。

そんな状態のまま数ヶ月、無駄にジムの月額使用料を支払っている。

(まさしく過去の自分です。)

後々考えれば、こんなことにお金を使わずに、お金はかかるけど完全予約制の専属トレーナー付きのジムに通った方が、遙かに効率的だと思いませんか?

完全予約制ですから必ずジムに通わなければなりませんし、トレーナーがきちんとトレーニングを指導してくれます。

ここまでやったら成果が出ないと、もったいないじゃ無いですか。

これは一つの例でしたが、

結局、安いコストしかかけていないと、止めようと思ったら簡単に止めることが出来てしまいます。

しかし、高いコストをかけることで、「ここまでお金をかけたんだから成果を出さないともったいない。」という考えが出てくると思うんです。

つまり、ダイエットを諦めるハードルが全然違ってくるんです。

ハードルを高くすることは継続に繋がります。

本気でダイエットをしたいと考えているのならば、安物で揃えてそれで成果が出ればラッキー、という考えでは無くて、高い金をかけてるんだから絶対成果を出してやる!という考えじゃないと無理だと思います。

まさしくそれがダイエットに対する本気度だと思いますよ。

【北海道大戦】ランダムで隣接する都市を選択する

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

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

https://github.com/takishita2nd/HokkaidoWar

今回はバトルを仕掛ける市町村を選択する処理を実装します。

自分のターンが回ってきた市町村から、隣接する市町村をランダムで選択し、攻撃を仕掛ける、という感じにしたいと思います。

ただし、何もしない(攻撃を仕掛けない)ケースもあるものとします。

さらに、攻撃側の市町村と防御側の市町村が分かるように色分けしましょうか。

    class City
    {

        public void PaintAttackColor()
        {
            var color = new asd.Color(255, 0, 0);
            foreach(var m in _maps)
            {
                m.SetColor(color);
            }
        }

        public void PaintDeffenceColor()
        {
            var color = new asd.Color(0, 0, 255);
            foreach (var m in _maps)
            {
                m.SetColor(color);
            }
        }

        public void ClearPaint()
        {
            foreach (var m in _maps)
            {
                m.SetColor(_color);
            }
        }
    class Battle
    {
        public void NextTurn()
        {
            if(prevAttack != null)
            {
                prevAttack.ClearPaint();
            }
            if(prevDeffece != null)
            {
                prevDeffece.ClearPaint();
            }

            var targets = _cities[cityCnt].GetLinkedCities();
            var r = Singleton.GetRandom();
            int targetIdx = r.Next(0, targets.Count + 1);
            prevAttack = _cities[cityCnt];
            prevAttack.PaintAttackColor();

            var info = Singleton.GetGameProcessInfomation();
            if(targetIdx >= targets.Count)
            {
                info.ShowText(prevAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}",
                    turn, cityCnt + 1, _cities.Count, prevAttack.Name));
            }
            else
            {
                prevDeffece = targets[targetIdx];
                prevDeffece.PaintDeffenceColor();
                info.ShowText(prevAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4}",
                    turn, cityCnt + 1, _cities.Count, prevAttack.Name, prevDeffece.Name));
            }

            cityCnt++;
            if(cityCnt >= _cities.Count)
            {
                _cities = cityRandomReplace(_cities);
                cityCnt = 0;
                turn++;
            }
        }

隣接する都市を取得する処理は今までに作成しているので、メソッド1つで取り出せます。

その中から乱数で1つ都市を選択します。

ただし、何もしないターンもあるので、乱数の範囲を大きめにとって、配列より大きければ、何もしない、と扱います。

【ラズパイ】【いろいろ計測モニター】実際に組んでみる。

今日は9時間頑張りました。

実際にこの回路を組んでみました。

材料はこちらの記事にあります。

結果はこうなりました。

挫けた。

そもそも、

このラズパイZero用の基板に全部盛り込もうとしたのが間違い。

かなり難易度の高いはんだ付け作業になりました。

また、穴と穴が繋がっていない(ユニバーサル基板とはそういうもの)ので、その線をつなぐのも苦労しました。

さらに、


GLCD側のピッチ幅がラズパイZero側の基板より小さい事が発覚。

これがさらにはんだ付けの難易度を上げました。

はんだの熱で基板と部品が若干溶けてました。

このままじゃ悔しいので、ブレッドボードに回路を作り直して、ラズパイZeroで動かしました。

今回はこれで勘弁してください。

9時間頑張ったんだよ・・・

でもラズパイZeroで動かしているので、長時間稼働していても全然暑くないです。

でも性能は明らかに劣っているからモッサリしているけどね。

損傷して使い物にならなくなってしまいました。

残念ながらゴミ箱行きです。

【LARAVEL】【ダイエット支援】ダッシュボードに食事管理を追加する

前回までの状況はこちら

最新ソースファイルはこちら(gitHub)

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

ダッシュボード画面に、

この画面の追加します。

ベースは体重管理のものを流用できるので、さくっと作成しました。

EatingDashboardComponent.vue

<template>
    <div>
        <div class="dashboard">
            <div class="chart">
                <canvas id="eating"></canvas>
            </div>
            <div class="command">
                <ul>
                    <li><a @click="onClickPrev">prev</a></li>
                    <li><a @click="onClickNext">next</a></li>
                </ul>
                <ul>
                    <li><a @click="onClickInput">クイック入力</a></li>
                    <li><a href="">詳細</a></li>
                </ul>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
        };
    },
    created: function() {
    },
    mounted: function() {
    },
    methods: {
        onClickNext: function() {
        },
        onClickPrev: function() {
        },
        onClickInput: function() {
        },
    }
}
</script>
app.js

Vue.component('eating-dashboard-component', require('./components/Eating/EatingDashboardComponent.vue'));
home.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">Dashboard</div>

                <div class="panel-body">
                    @if (session('status'))
                        <div class="alert alert-success">
                            {{ session('status') }}
                        </div>
                    @endif

                    <weight-dashboard-component></weight-dashboard-component>
                    <p></p>
                    <eating-dashboard-component></eating-dashboard-component>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

【ラズパイ】【いろいろ計測モニター】

どうせならきちんとして使える物を作りたい。

前回まではラズパイ4(2GB)を使用しましたが、これって、ファンを使わないと発熱がやばいらしいですね。

なので、消費電力が少なくて、発熱も少ないラズパイZERO HWを買いました。

使用する部品も買いました。

MicroUSBのACアダプター

MicroSDカード(16GB)

8GBでも十分だったんだけどね。

これらは今まで使用していた部品と同じです。

ラズパイZero用の基板です。

これにピンヘッダを取り付けて、基板と本体を取り外しできるようにします。

スイッチに使用する抵抗とダイオード。

(たぶん)同じ物を購入しました。

それらをつなぐジャンパ線です。

こんな感じで回路を組もうと思ってます。

結構ごちゃごちゃしてる。

まぁ、ピンの位置とか実際の位置に合わせて書いているので仕方が無い。

問題はスイッチが正しく動くかどうか。

前回は12個のスイッチでしたが、今回は1個のスイッチを使います。それに合わせて同じような回路を組んでいます。

ちゃんと機能するか、ブレッドボードに簡単に組んでみました。

上手くいけば、スイッチ押下時にインプット信号がHIGH→LOWになるはずです。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN)
swState = 0

try:
    while True:
        if GPIO.input(21) == 0 and swState == 0:
            time.sleep(0.05)
            if GPIO.input(21) == 0:
                print("ON")
                swState = 1
        elif GPIO.input(21) == 1 and swState == 1:
            print("OFF")
            swState = 0
        time.sleep(0.005)

except KeyboardInterrupt:
    GPIO.cleanup()
$ python3 test.py 
ON
OFF
ON
OFF
ON
OFF
ON
OFF
ON
OFF

うん、うまく動いているようです。

じゃあ、制作開始といきますか。

【料理】【リュウジのバズレシピ】絶品鶏チャーシューを作ってみた

意外と味が浸みるもんだね。

こちらのレシピ動画を参考にしました。

レンチンだけで出来てしまって、しかも美味しいというのがスゴイ。

しっかり味が付いてるし、火も通っているし、何よりお酒がすすむ。

動画の中では600Wの電子レンジを使用していますが、うちの電子レンジは500Wなので、動画よりも少しレンチン時間を長めにしています。

最初に5分30秒、裏返して3分ぐらい。

レンチン中も良い香りがしてお腹が空きます。

そして、冷蔵庫で寝かしたらさらに味が浸みて美味いと言うことなので、約10時間冷蔵庫で寝かしました。

いや、美味かった。

けどレンチンしたての熱々でも食べてみたいな。

いろいろアレンジ試してみたいと思います。

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

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

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

https://github.com/takishita2nd/Picross

次はこちらの問題を解いてみます。

実行結果はこちら

惜しい。

多分、次やらなくちゃ行けないのはここだろうな。

ここは2,2,5とすでに塗られているので、空いている空白はマスクで確定されます。

ちょっと解析パターン11と似ていますが、こんなコードを組んでみました。

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

        private void pattern15Row()
        {
            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;
                }

                for(int i = 0; i < aData.Count; i++)
                {
                    int count = 0;
                    // 塗られているマスを数える
                    foreach (var b in bitmapLists[i])
                    {
                        if (b.IsPainted())
                        {
                            count++;
                        }
                    }
                    // 塗られているマスと数字が一定している場合は空きマスをマスクする
                    if(aData[i].Value == count)
                    {
                        foreach(var b in bitmapLists[i])
                        {
                            if(b.IsValid() == false)
                            {
                                b.Mask();
                            }
                        }
                    }
                }
                row++;
            }
        }

        private void pattern15Col()
        {
            int col = 0;
            foreach (var collist in colNumbers)
            {
                if (collist.IsAnalyzed())
                {
                    col++;
                    continue;
                }

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

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

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

                for (int i = 0; i < aData.Count; i++)
                {
                    int count = 0;
                    // 塗られているマスを数える
                    foreach (var b in bitmapLists[i])
                    {
                        if (b.IsPainted())
                        {
                            count++;
                        }
                    }
                    // 塗られているマスと数字が一定している場合は空きマスをマスクする
                    if (aData[i].Value == count)
                    {
                        foreach (var b in bitmapLists[i])
                        {
                            if (b.IsValid() == false)
                            {
                                b.Mask();
                            }
                        }
                    }
                }
                col++;
            }
        }

んー思った以上に進んでいないぞ。

少々時間がかかりそうです。

もう少し調べてみます。

【北海道大戦】各市町村の行動をランダムで回す

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

https://github.com/takishita2nd/HokkaidoWar

早速バトル処理を作成していきます。

しかし、ただループさせるだけだと途中経過が全く見えないので、

マウスをクリックすると次の行動を実行する、という形にしたいと思います。

そして、ターンの最初には、市町村の行動順をランダムに並べ替えます。

まずは、市町村を並び替える処理を作成。

    class Battle
    {
        private List<City> cityRandomReplace(List<City> beforeCities)
        {
            var r = Singleton.GetRandom();
            List<City> afterCities = new List<City>();
            int max = beforeCities.Count;
            for (int i = 0; i < max; i++)
            {
                int index = r.Next(0, beforeCities.Count - 1);
                afterCities.Add(beforeCities[index]);
                beforeCities.RemoveAt(index);
            }

            return afterCities;
        }

乱数でindexの値を振り、そのindexの都市を新しいListに追加して、古いリストから削除する、という処理を繰り返す事で並べ替えできます。

これを使用してマウスクリック処理を作成しいます。

    class HokkaidoWar
    {
        public void Run()
        {
            _battle = new Battle(cities);

            while (asd.Engine.DoEvents())
            {
                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    _battle.NextTurn();
                }
                asd.Engine.Update();
            }
            asd.Engine.Terminate();
    class Battle
    {
        private List<City> _cities = null;
        private int turn;
        private int cityCnt;
        public Battle(List<City> cities)
        {
            turn = 1;
            cityCnt = 0;
            _cities = new List<City>();
            foreach(var c in cities)
            {
                _cities.Add(c);
            }
            _cities = cityRandomReplace(_cities);
        }

        public void NextTurn()
        {
            cityCnt++;
            if(cityCnt >= _cities.Count)
            {
                _cities = cityRandomReplace(_cities);
                cityCnt = 0;
                turn++;
            }

            var info = Singleton.GetGameProcessInfomation();
            info.ShowText(_cities[cityCnt].GetPosition(), string.Format("{0} turn {1} / {2} {3}", turn, cityCnt, _cities.Count, _cities[cityCnt].Name));
        }

マウスをクリックする度に、NextTurn()が実行され、順番が回ってきた市町村の名前を表示します。

そして、一巡したらターンを更新し、市町村を並べ替えて処理を続けます。

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

【Laravel】【ダイエット支援】食事管理データベースを作成する

食事管理機能の作成に着手します。

まずはデータベースの作成。

マイグレーションを作成します。

$ php artisan make:migration create_eating_management
class CreateEatingManagement extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('eating_managements', function (Blueprint $table) {
            $table->increments('id');
            $table->date('date');
            $table->text('item');
            $table->integer('protein');
            $table->integer('ripid');
            $table->integer('carbo');
            $table->integer('calorie');
            $table->timestamps();
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });

        Schema::create('eating_management_user', function (Blueprint $table) {
            $table->integer('user_id')
                  ->foreign('user_id')
                  ->references('id')->on('users')
                  ->onDelete('cascade');
            $table->integer('eating_management_id')
                  ->foreign('eating_management_id')
                  ->references('id')->on('eating_managements')
                  ->onDelete('cascade');
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });

        Schema::create('timezones', function (Blueprint $table) {
            $table->increments('id');
            $table->text('zone');
            $table->timestamps();
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });

        Schema::create('eating_management_timezone', function (Blueprint $table) {
            $table->integer('eating_management_id')
                  ->foreign('eating_management_id')
                  ->references('id')->on('eating_managements')
                  ->onDelete('cascade');
            $table->integer('timezone_id')
                  ->foreign('timezone_id')
                  ->references('id')->on('timezones')
                  ->onDelete('cascade');
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('eating_management_timezone');
        Schema::dropIfExists('timezones');
        Schema::dropIfExists('eating_management_user');
        Schema::dropIfExists('eating_managements');
    }
}

必要な項目は、日付、時間帯、品目、タンパク質、脂質、炭水化物、カロリー。

時間帯は別テーブルで定義して、朝、昼、夜、間食から選択します。

時間帯は固定値なので、Seederで作成します。

$ php artisan make:seeder TimezoneSeeder
class TimezoneSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('timezones')->insert(['zone' => '朝',]);
        DB::table('timezones')->insert(['zone' => '昼',]);
        DB::table('timezones')->insert(['zone' => '夜',]);
        DB::table('timezones')->insert(['zone' => '間食',]);
    }
}

これらを実行して適用させます。

$ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Package manifest generated successfully.
$ php artisan migrate
Migrating: 2020_07_10_092328_create_eating_management
Migrated:  2020_07_10_092328_create_eating_management (0.07 seconds)
$ php artisan db:seed --class=TimezoneSeeder
Database seeding completed successfully.

作成時間にNULLって入っているけど、まあいいか。

【ナナオン】ガチのバンドリーマーが1ヶ月ナナオンをプレイして見て思ったこと。

プレイ始めてからもう一ヶ月経つのか・・・

メインはガルパですが、ナナオンもぼちぼちプレイしています。

プレイして気がついたこと。

1.無料石が余って仕方が無い。

難易度EasyでもNormalでも達成報酬が無料石なので、無料石が16000個あります。

あと、プレイ回数でも達成報酬がありますね。

でも、このゲームは同じキャラを引き当てることが前提になっていて、同じキャラを引き当てることによって、レベルの限界突破ができます。

で、5回限界突破すると、キャラのアイコンにサインが入ります。(自分はやったことありませんが)

2.判定がガルパより甘い。

判定が甘いので、たぶん、ガルパよりもALL PERFECT取りやすくなっています。

EXPERTをALL PERFECT取ると、こんな感じになります。

3.それでもホールドでミスが多い。

なんか、バグじゃないのかっていうぐらいホールドでミスります。

何で途中で途切れるんですかね?

バグを修正したとアナウンスがありましたが、まだ問題がありそうな気がします。

4.マルチはやる気にならない。

アナウンスはされているんですが、

とにかく、切断が多いんです。

現在対応中と言うことですが、

そのせいもあってか、マルチプレイは過疎っている感じがします。

自分もいまはほとんどマルチプレイしていません。

そもそも人が集まらないので。

こればかりは改善を待つしかありません。

それでも、ナナオンでしかプレイできないカバー曲とか多いので、

ガルパの片手間にナナオンも続けていきたいと思います。

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