【ダイエット支援】【食事管理】グラフデータ取得処理を作成する。

前回までの状況はこちら

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

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

ダッシュボードに表示するグラフを作成していきます。

どんあグラフにしようかというと、

こんな感じのレーダーグラフです。

一日分の摂取したタンパク質、脂質、炭水化物などの情報を取得するAPIが必要になります。

まずは、それを作ります。

app/Repository/EatingManagementRepository.php

    /**
     * 一日あたりのデータを取得する
     */
    public function getDaily($user, $date)
    {
        $eatings = $user->EatingManagements()
            ->where(DB::raw('date_format(date, "%Y-%m-%d")'), $date)
            ->get();

        $retDatas = [];
        for($j = 2; $j < count($this->paramNames); $j++) {
            $retDatas[$this->paramNames[$j]] = 0;
        }
        foreach($eatings as $eating) {
            for($j = 2; $j < count($this->paramNames); $j++) {
                $retDatas[$this->paramNames[$j]] += $eating->{$this->paramNames[$j]};
            }
        }
        return $retDatas;
    }

$dateに取得する日付が入ります。

その日付に一致するデータをすべて取得し、それを栄養素毎に集計します。

これをAPIで取得するようにします。

app/Http/Controllers/Eating/ApiController.php

    /**
     * グラフ用データを取得する
     */
    public function graph(Request $request)
    {
        return response()->json(['data' => $this->eatingManagement->getDaily(Auth::user(), $request->contents['date'])]);
    }
routes/web.php

Route::post('api/eating/graph', 'Eating\ApiController@graph');

これをダッシュボードからデータを取得し、グラフにします。

resources/assets/js/components/Eating/EatingDashboardComponent.vue

            param: {},
            contents: {
               date: "",
            },
            label: ['タンパク質', '脂質', '炭水化物', 'カロリー'],
            datasets: [],
            sub: 0,
        };
    },
    created: function() {
        this.todayDate = this.getDate(this.sub);
    },
    mounted: function() {
        this.graphUpdate();
    },
    methods: {
        getDate: function(sub) {
            var today = new Date();
            return today.getFullYear() + "-" + ('00'+(today.getMonth() + 1)).slice( -2 ) + "-" + ('00'+(today.getDate() + sub)).slice(-2);
        },
        onClickNext: function() {
            this.sub++;
            this.todayDate = this.getDate(this.sub);
            this.graphUpdate();
        },
        onClickPrev: function() {
            this.sub--;
            this.todayDate = this.getDate(this.sub);
            this.graphUpdate();
        },
        onClickInput: function() {
            this.showInputDialogContent = true;
        },
        invokeUpdateList: function() {
            this.graphUpdate();
        },
        graphUpdate: function() {
            var ctx = document.getElementById("eating");
            var self = this;
            this.contents.date = this.todayDate;
            this.param.contents = this.contents;
            this.datasets = [];
            axios.post('api/eating/graph', this.param).then(function(response){
                if(response.data.data != null) {
                    self.datasets.push(response.data.data.protein);
                    self.datasets.push(response.data.data.liqid);
                    self.datasets.push(response.data.data.carbo);
                    self.datasets.push(response.data.data.calorie);
                    var myChart = new Chart(ctx, {
                        type: 'radar',
                        data: {
                            labels: self.label,
                            datasets: [{
                                label: self.todayDate,
                                data: self.datasets,
                                backgroundColor: 'RGBA(225,95,150, 0.5)',
                                borderColor: 'RGBA(225,95,150, 1)',
                                borderWidth: 1,
                                pointBackgroundColor: 'RGB(46,106,177)'
                            }]
                        },
                        options: {
                            title: {
                                display: true,
                                text: '摂取栄養素'
                            },
                            scale:{
                                ticks:{
                                    suggestedMin: 0,
                                    suggestedMax: 100,
                                }
                            }
                        }
                    });
                } else {
                    var myChart = new Chart(ctx, {
                        type: 'radar',
                        data: {
                            labels: self.label,
                            datasets: [
                            ]
                        },
                    });
                }
            }).catch(function(error){
            });
        }

デフォルトはアクセスした当日を表示し、next、prevクリックでそれぞれ次の日、前の日に切り替えることができるようにします。

getDate()で取得する日付の文字列を取得し、これをAPIのパラメータとします。

取得したデータをグラフのdatasets[]に設定すれば、グラフが表示されます。

次回はこのグラフをもっと見やすいようにカスタマイズしていきます。

Pixel4aを使ってみた結果、ほとんどの人はハイエンドなんて不要だった。

Pixel4aを使い始めて2日が経過しました。

いまのところ、なんの問題もなく動作しております。

ゲームも問題ありません。

むしろ、Pixel3より軽快に動ています。

これは買い替え成功間違いなし。

「戻る」の操作が変わったので、いまだにそこは慣れないですが、慣れればこちらのほうがサクサク操作できそうです。

メモリの量が増えたというのもあるかもしれませんが、

このスマホはミドルレンジのプロセッサーを使用しています。

はい、ほとんどの人たちにとってはハイエンドのスマホなんて不要だったんですね。

逆に、Pixel4aがここまで快適に動くのなら、低価格スマホは全部クソになりました。

低価格スマホに手を出して失敗するよりは、オイラは+1万ぐらい出してでもPixel4aを勧めます。

なんか5G対応機種が予定されているようですが、5G普及までにはまだ1~2年かかりますので、その頃には新機種が出ているので全く問題ありません。

そもそも、4Gまでは、それまで出来なかったことが出来るようになった、という点がありましたが、

5Gでは、今まで出来た事がより便利になった、という程度なので、焦って5Gにする必要はないです。

さて、今まで使用していたPixel3ですが、ヤフオク!に出品しようと思います。

いまの相場なら2~3万程度で売れるはず。

【ガルパ】ガチのバンドリーマーがナナオンをプレイした結果

もうナナオンをプレイ初めて三ヵ月ぐらいになる?

ナナオンをプレイして、その相乗効果といいますか、ガルパの腕前が上がりました。

その証拠。

初のレベル28フルコンしました。

flame of hopeも実装当日にフルコンしました。

おそらくですけど、

リズムゲーム上達の近道は、たくさんの種類の譜面をプレイすることじゃないかな、と思います。

ガルパリリース当初から高難易度曲をプレイできていた人たちは、おそらく以前からアーケードの音ゲーをプレイしてきた人たちではないでしょうか。

ここまでくればEXトライマスター狙えるかな、と思いましたが、

世の中そんなに甘くなかった。

もっと修行します。

【ぼっち】ROBATA 魚一心 南郷13丁目店

以前から行きたかったのですが、コロナの影響で8月まで休業していました。

昨日、やっといけました。

内装はちょっと高級そうな内装でした。

カウンターの前にキッチンがあり、開放感あります。

ぼっちで飲んでると結構恥ずかしい。

お料理は少々お高いものもありますが、日替わりメニューとかは比較的安めです。

お料理も見た目もうまそうだし、実際食べてもおいしかったです。

量も一人で食べるには十分な量です。

これだけ食べても3000ぐらいでした。

これなら通うのもアリかな。

【ANDROID】【実質北海道一周】UIの実装

さて、

このUIを作成していきます。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/startCity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/endCity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.425"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.528" />

    <TextView
        android:id="@+id/endCity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.425"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.591" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="↓"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/endCity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.402"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/startCity"
        app:layout_constraintVertical_bias="0.525" />

    <TextView
        android:id="@+id/distanceSection"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="280dp"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/distanceFromStart"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="364dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView3" />
</androidx.constraintlayout.widget.ConstraintLayout>

レイアウトとか、細かいところよくわかっていないので、適当です。

もしかしたら、機種によってレイアウトが崩れるとかもあるかも。

次回は実際に表示する処理を作成していきます。

減反政策は食料自給率低下の原因なのか?農家の息子が解説する。

いやぁ、またど阿呆が現れました。

自分は、当事者ではないのですが、当事者に近かった、農家の息子です。

なので、このツイートの誤りを指摘したいと思います。

そもそも、なぜ減反政策が行われたのか。

当時、日本がまだ米の自由化が行われる前の時代です。

まだ米の自由化が行われていないので、日本で流通しているお米は、全て日本産のお米でした。

※たしか、米の自由化が始まったのは、細川政権時、平成の米騒動(大不作)で米を緊急輸入するのと同時に、WTOで是正勧告を受けたために市場開放した、と記憶しています。(間違ってたらごめんなさい)

そして、不作への対策として、政府で米を一年間備蓄する政策が始まったと思います。

しかし、食の欧米化によって、日本人がお米を食べなくなり、お米の供給過剰な状態になっていったのです。

このままでは、お米の価格が下がってしまい、米農家の収入が減ってしまうので、政府はお米から他の農作物に切り替えることで、お米の供給量を減らし、それに応じてくれた農家には協力金が支払われました。

これが政府が進めてきた減反政策です。

これから分かるとおり、減反政策が自給率を下げたのではなく、むしろ、お米の自給率が高すぎたために減反政策が行われたのです。

なので、上のツイートは誤りですよね。

そしてもう一つ。減反政策で田んぼを潰してもその後に出来るのは、他の農作物を育てる畑です。(そうしないと政府からお金がもらえない。)

田んぼ潰して大型ショッピングセンターの様な施設ができると思った?

実際にウチの父親は減反政策で田んぼを蕎麦畑にしたことで、政府からお金を貰ったと聞いています。

いや、これってむしろ、自給率上がることにならない?

以上のことから、「減反政策が日本の食糧自給率を下げた」というような発言は大ウソとなります。

以上、農家の息子の指摘でした。

BANG DREAM! 8TH LIVE DAY3(LIVE VIEWING)

やっぱりポピパは最高だって思った。

Morfonicaの初お披露目。

Ayasaさんの弦さばきが美しゅうございます。

あまねすの歌も上手くなったよね(謎の上から目線)

画面越しで彩ちゃんと千聖ちゃんのデュエット、最高すぎた。

いつか同じステージで歌ってほしい。

夏色SUN SUN SEVENの件はライブの定番化しそう(面白かった

そうかーあの件は札幌ファンミが最初なのかー

スタビに行くと思わせて、まさかのFIRE BIRD(そしてツッコミの不在

ラストはレイチェルさん、あいあいを招いての夢打ち。

見事にBanG Dream!3rd seasonラストの再現。

これは控えめに言っても最高でしょ。

ライブに参加できて良かった。。。

Pixel 4aが到着しました!

開封。

おおー。

早速電源を入れ、セットアップ開始。

使用していた端末とケーブルをつなぐと、Googleアカウントとインストールしているアプリが引き継げます。

Pixel 3との比較。

本体のサイズは同じですが、ディスプレイが上下に長くなっています。

また、ピンホールカメラになっているので、そこにステータスアイコンなどが収まり、さらに広く感じます。

そして、若干Pixel 3より軽い感じがします。

そして、思った以上にサックサクに動く。

もうPixel 3より快適。

素晴らしい。

ただ、操作方法が若干変わっています。

横画面からホームに戻るには画面下から上にフリックに変わり、

戻るが画面右または左からフリックになります。

アクティブエッジが無い代わりに、画面右下または左下からフリックでGoogleアシスタント起動に変わりました。

まぁ、使って慣れるしかないでしょう。

一通り設定が終わった後でもこれだけの空き容量があります。

忘れてはいけないのは、スマホを保護するためのケース。

本体と画面を保護するのに、選択したのは今までと同じ手帳型。

そして、今回は防水ではないので、スマホ保険にも加入しました。

少額保険で月470円です。

https://www.lawson.co.jp/service/application/hoken/hoken/smartphone.html?utm_source=google&utm_medium=cpc&utm_campaign=smartphone&utm_content=TD10

これで水没しても、修理代は回収できます。

思った以上に良い端末でした。

大事に使っていきます。

BANG DREAM! 8TH LIVE DAY2(LIVE VIEWING)

雷の影響もあって30分遅れの開演。

でも、安心してライブ見られるのは何故だろう。

やっぱりガチのミュージシャンがいるから?

そして、ほとんどMCが無く、ノンストップで行っている分、演奏する曲も多く。

あのカバー曲もいいよね。

一足先に実装予定の曲も聴けたし。

あと、Departuresの実装もお願いします。

あと、day1のライブビューイング会場が思った以上に静かだと思ったのは、

ライブビューイング会場はサイリウムや拍手も禁止になっているんですね。

でもただ、静かに曲に耳を傾けるのも悪くないです。

さて、day3はいよいよPoppin’Party。

それよりも楽しみなのは初お披露目のMorfonicaかもしれない。

【北海道大戦】ターンを飛ばされる都市がある問題を修正する。

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

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

https://github.com/takishita2nd/HokkaidoWar

さて、現在のソースでは、ターンが飛ばされる都市がある事が分かりました。

https://github.com/takishita2nd/HokkaidoWar/blob/03569e0b8728860e73d11e38eeade24a0aafef9c/HokkaidoWar/Battle.cs#L15

原因はこの_citiesを一つで存在する都市と行動する都市を管理していたためです。

https://github.com/takishita2nd/HokkaidoWar/blob/03569e0b8728860e73d11e38eeade24a0aafef9c/HokkaidoWar/Battle.cs#L78

ここで行動済みの都市を削除すると(図の真ん中)、

図の右のように行動順が二つズレてしまうんですよね。

なので、次に行動するはずだった都市が飛ばされてしまいます。

なので、存在する都市と行動する都市を分けて管理する必要があります。

        List<City> cities = null;
        List<City> aliveCities = null;

必要になるのは、List<City>をコピーする処理。

このとき、Listの部分だけを複製して、中の都市オブジェクトは共有で管理します。

        private List<City> copyCity(List<City> cities)
        {
            List<City> ret = new List<City>();
            foreach(var c in cities)
            {
                ret.Add(c);
            }
            return ret;
        }

こんな感じで修正してみました。

これで、順番が飛ばされることはなくなるはず。

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