【ダイエット支援】【入力履歴機能】履歴データ処理の作成

前回作成した履歴一覧画面からデータテンプレートへ移動する機能を作成していきます。

<template>
    <div>
        <div>
            <p id="navi"> <a href="/home">HOME</a></p>
            <p id="inputbutton">
                <button @click="onClickSubmit">選択したデータを登録</button>
            </p>
            <table class="eatinghistory">
                <tbody>
                    <tr>
                        <th class="check">
                            <input type="checkbox" v-model="all" @click="onAllCheck" />
                        </th>
                        <th class="date">日時</th>
                        <th class="item">アイテム</th>
                        <th class="protein">タンパク質</th>
                        <th class="liqid">脂質</th>
                        <th class="carbo">炭水化物</th>
                        <th class="calorie">カロリー</th>
                    </tr>
                    <tr v-for="data in datalists">
                        <td class="check">
                            <input type="checkbox" v-model="data.check" />
                        </td>
                        <td class="date">{{ data.date}}</td>
                        <td class="item">{{ data.item}}</td>
                        <td class="protein">{{ data.protein}}</td>
                        <td class="liqid">{{ data.liqid}}</td>
                        <td class="carbo">{{ data.carbo}}</td>
                        <td class="calorie">{{ data.calorie}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</template>

チェックボックスの処理と処理を行うボタンを配置しました。

リストのチェックボックスはリストデータとバインドさせています。

チェックした内容がそのままデータに反映されます。

        onClickSubmit: function() {
            var self = this;
            this.datalists.forEach(element => {
                if(element.check == true){
                    this.ids.push(element.id);
                }
            });
            this.param.contents = this.ids;
            axios.post('/api/eating/regist', this.param).then(function(response){
                self.updateList();
            }).catch(function(error){
            });
        },
        onAllCheck: function() {
            if(this.all == false) {
                this.datalists.forEach(element => {
                    element.check = true;
                });
            }else{
                this.datalists.forEach(element => {
                    element.check = false;
                });
            }
        }

ヘッダのチェックをクリックすると、リストの中の全項目にチェックを行うように処理しています。

そして、「選択したデータを登録」をクリックすると、チェックをつけたidのリストがバックエンド側に送信されます。

Route::post('api/eating/regist', 'Eating\ApiController@regist');
class ApiController extends Controller
{
    public function regist(Request $request)
    {
        $this->eatingManagement->registTemplate($request->contents);
        return response()->json();
    }
class EatingManagementRepository
{
    public function registTemplate($ids)
    {
        $records =EatingHistoryItem::whereIn('id', $ids )->get();
        foreach($records as $record)
        {
            $model = new EatingTemplateItem();
            foreach($this->templateParamNames as $name)
            {
                $model->$name = $record[$name];
            }
            $model->save();
            $record->delete();
        }
    }

idのリストを元にhistoryのデータをtemplateに移動させています。

この画面はまだまだ改良の余地がありますが、とりあえずこんな感じでいいでしょう。

次回はテンプレートから入力候補を検索する処理を作成していきます。

【Alexa】次のバスの時刻を教えてくれる。バス通勤とかに便利。

このスキルが意外と便利だったりする。

使い方は簡単。

Alexaアプリで、よく使うバス停(乗るバス停と降りるバス停)を登録するだけ。

設定が終わったら「アレクサ、次のバスは?」と話しかけるだけ。

そうすると、次のバスが何分後の何時何分に来るか、その次のバスは何分後か、というのを教えてくれます。

これ、自宅の近所、よく使うバス停と、降りるバス停を登録しておくと、家を出るタイミングが分かるので、非常に便利なんです。

そういえば、Pixel4aってeSIM搭載なので、手軽に乗り換えられるんじゃ無いかって思ったけど。

通常、新規契約やMNPでSIMカードを発行して貰うとき、発行手数料として3000円ぐらい支払わなくちゃいけないし、

SIMカードが届くまで電話やモバイル通信ができなくなります。

WiFi経由なら問題無いけど、二段階認証とかでSMS受信が必要になった場合に困ります。

しかし、eSIMが使えるなら、発行手数料もかからないし、設定すればその場ですぐ使用できます。

そもそもeSIMって何?

端末に内蔵されているSIMカードのようなもので、

最初は空っぽの状態ですが、プロファイル情報を書き込んであげることでSIMカードとして機能します。

日本国内のeSIM事情。

調べてみると、日本のモバイル通信事業者でeSIM対応を行っているのは、

楽天モバイルとIIJmioの2業者だけですね。

思った以上に少ないっすね。

楽天モバイルの特徴。

基本料金は2980円ですが、一年間無料。

そして通信量は無制限。

ただし、これは楽天圏内に限りまして、今のところ楽天圏内は大都市圏に限ります。

それ以外は他事業者の回線を借りて通信を行いますが、その場合は5GBの制限があります。

ただ、札幌はすでに楽天圏内なので容量無制限で通信可能。

ただし、地下などでは楽天回線が使えない場合があります。

IIJmioの特徴。

Zeroプランでは、契約手数料1円、基本料金は150円で、使用する容量に応じて料金が加算されます。

例えば、1GB使用する場合は300円、それ以降は1GB使用する度に450円、といった感じです。

で、どうする?

今のNifmoのプランでは通話+7GBで2300円払っています。

楽天モバイルにすれば1年無料で通信し放題だけど、それ以降は割高になってしまいます。

でも楽天ポイント付くんだよね?

IIJmioは論外。

ちょっと考えます。

【COCOS2D-X】アイコン画像をピッチリ並べる

とりあえず、アイコンをピッチリ並べてみました。

ポイントは、座標や拡大サイズを全て計算で算出すること。

こうしないと、機種が変わったときに、確実にレイアウトが崩れます。

    float buttonScale = visibleSize.height / (visibleSize.height / 4.0);
    float buttonBase = 0.0;
    auto homeButton = Sprite::create("btnHome.png");
    if (homeButton == nullptr)
    {
        problemLoading("'btnHome.png'");
    }
    else
    {
        homeButton->setPosition(Vec2(sprite->getPosition().x + sprite->getContentSize().width * scaleRate / 2 + origin.x, visibleSize.height + origin.y));
        homeButton->setAnchorPoint(Vec2(1.0,1.0));
        homeButton->setScale(buttonScale);
        buttonBase = visibleSize.height - homeButton->getContentSize().height * buttonScale;
        this->addChild(homeButton, 1);
    }

    auto charaButton = Sprite::create("btnChara.png");
    if (charaButton == nullptr)
    {
        problemLoading("'btnChara.png'");
    }
    else
    {
        charaButton->setPosition(Vec2(sprite->getPosition().x + sprite->getContentSize().width * scaleRate / 2 + origin.x,
                                      buttonBase + origin.y));
        charaButton->setAnchorPoint(Vec2(1.0,1.0));
        charaButton->setScale(buttonScale);
        buttonBase -= charaButton->getContentSize().height * buttonScale;
        this->addChild(charaButton, 1);
    }

    auto equipButton = Sprite::create("btnEquip.png");
    if (equipButton == nullptr)
    {
        problemLoading("'btnEquip.png'");
    }
    else
    {
        equipButton->setPosition(Vec2(sprite->getPosition().x + sprite->getContentSize().width * scaleRate / 2 + origin.x,
                                      buttonBase + origin.y));
        equipButton->setAnchorPoint(Vec2(1.0,1.0));
        equipButton->setScale(buttonScale);
        buttonBase -= equipButton->getContentSize().height * buttonScale;
        this->addChild(equipButton, 1);
    }

    auto questButton = Sprite::create("btnQuest.png");
    if (questButton == nullptr)
    {
        problemLoading("'btnQuest.png'");
    }
    else
    {
        auto scale = buttonBase / questButton->getContentSize().height;
        questButton->setPosition(Vec2(sprite->getPosition().x + sprite->getContentSize().width * scaleRate / 2 + origin.x,
                                      buttonBase + origin.y));
        questButton->setAnchorPoint(Vec2(1.0,1.0));
        questButton->setScale(scale);

        this->addChild(questButton, 1);
    }

例えば、「キャラ」のアイコンは「ホーム」のアイコンの下に並ぶように座標を計算して配置していますし、

その下の「装備」も「キャラ」の下に並ぶように座標を計算で算出しています。

「クエスト」のボタンは、上の3つのアイコンを並べた空きスペースにピッチリ収まるように、拡大率を算出して配置しています。

アイコンの拡大率も計算で算出しているので、機種や解像度が変化しても、アイコンの大きさが変わる程度で、大きくレイアウトは崩れないと思います。

思った以上に良い感じです。

【プロジェクトセカイ】指をクロスさせる必要なんて無かった

問題の譜面。

いろいろ試したんだけど、

やっぱり指をクロスさせるにはやりづらくって、

いや、指をクロスさせても問題無いのよ。

でも、指をクロスさせなくても、指がホールドのバーの中にあればコンボが繋がる事が分かりまして、

はるかに、こちらの方が簡単。

でも、こんなの最初見たときは戸惑うわな。

ラズパイ 400(Raspberry Pi 400)が普段使いできるPCになるわけないだろう。

自分、ラズパイ4を使用しているが、この記事には唖然とした。

そりゃ、サイトとしてはラズパイを持ち上げざるを得ないかもしれないけどさぁ。

そもそも、CPUは他のPCと比べて遙かに劣っている。

ラズパイで動作しているOSやアプリケーションはラズパイ用に最適化・軽量化しているので、そんなマシンでPCが使用しているようなアプリがまともに動くわけがない。

Webツールも然りである。ブラウザ自体が軽量化されているので、まともにJSが動く保証はない。

それでもラズパイ4でだいぶマシになった方だけれども。

ただ、ラズパイ4で電子工作を行う場合としては、遙かに魅力的なマシンである事には間違いない。

【テクテクライフ】北海道開拓の村

特にチェックポイントはないのですが、近くの牛角に予約を取っていたので、ついでに行ってきました。

ここは敷地が全て野外の博物館の様になっていて、北海道開拓時代の建造物がこのエリアに移設、復元されています。

明治・大正時代の建物ばかりなので、かなりレトロな雰囲気を体験することができます。

建物自体は未だにしっかりしているので、冷暖房さえ完備すれば住めそう。

こういう所でキャンプしてみたいな。

なんかおった。

出口にリンゴと大根の無人販売がありました。

大根50円。

大根の美味しい食べ方を検索中。

お疲れ様でした。

VPSをHTTP2に対応させてみた。

簡単にできるんだね。

こちらのサイトを参考にしました。

http://www.dcom-web.co.jp/lab/web-server/nginx_with_http2

nginxの設定でlistenにhttp2と書き足すだけで良いらしい。

Protocolがh2になっていれば、HTTP2を使用しています。

HTTP2で何が変わるのか?

従来のHTTP1.1では、1リクエストに対して必ず1レスポンスを返す必要があります。

1ページの中に複数のコンテンツ(htmlとかjsとかcssとか)が合った場合、これらのファイルを一つずつダウンロードする必要がありました。

しかし、HTTP2では、多リクエスト、多レスポンスが可能になります。

これはどういうことかというと、送信中のリクエストの応答を待たずして次のリクエストを出せるのですね。

なので、複数のファイルを平行してダウンロード出来るようになります。

なので、その分ページの読み込みが早くなります。

今のブラウザはほとんどHTTP2に対応しているので、あとはサーバ側の設定を変えればHTTP2での通信になります。

あ、それと、HTTP2はデフォルトSSLによる暗号化通信なので、サーバ側に証明書が必要になりますよ。

HTTP2に関する小話

HTTP2は元々Googleによって開発された通信プロトコルで、後に正式にHTTP2の規格に採用されました。

TCPより上位のプロトコルなので、簡単に双方向の通信を行うことができます。

おそらく、最近のスマホゲームのマルチプレイなんかは、この技術が使われていると思われます。

それ以前は、一つ下位のプロトコルである、TCPで通信していたと思われます。

でも、TCPって思った以上に扱いが難しんですよね。

nifmoからBIGLOBEモバイルに乗り換えようか、と言う話。

今、スマホのSIMは、格安スマホのNifmoを利用しているのですが、

プロバイダーがBIGLOBEに変わったので、

格安SIMもBIGLOBEモバイルに乗り換えようか、と思いました。

回線をまとめた方が良いのかな、というざっくりとした考え。

ということで、料金プランを比較してみた。

今利用しているNifmo。

https://nifmo.nifty.com/sim/card_voice.htm

今7GBのプランを使用しているので、月2300円支払っています。

BIGLOBEモバイルの料金プランを見てみると、

https://join.biglobe.ne.jp/mobile/plan/?cl=head_mobile_plan

ギガの容量が違うので、細かい比較はできませんが、

例えば、ギガを6GBに落とせば少し安くなる計算ですわな。

では、今の利用状況を確認すると、

6GBじゃ足らんかったわ。

7GB越えて利用できているのは、先月の繰り越し分らしいです。

おそらく、位置ゲーとテザリングでの利用が大半だと思います。

家ではWiFiでゲームしているので。

うーん、乗り換えるメリットが無くなってきたぞ。

さらに、MNPを行うのに、Nifmoに手数料3000円必要になり、BIGLOBEのSIMを発行して貰うので、おそらく初期手数料3000円かかるでしょう。

うん、やめよう。

メリットがない。

今のギガが足りなくなって、大容量プランに切り替える場合にまた考える。

マインクラフトサーバを外部に公開しようと思ったけど

モデムの設定を変更して、グローバルIPに接続すれば内部の仮想PCに繋がるようにして見たんだけど。

ダメだった🤔。

グローバルIPにpingを送っても応答がない。

いや、正確には、自分のPCからpingを送ると応答があるが、

外部のpingツールサイトを使用すると応答がないのである。

そして、今朝、もう一度確認してみると、

外部からの接続を可能にする設定が消えていた。

※後で分かったんだけど、昨日から今日までの間に、IPv6に切り替わったらしい。おそらく設定項目が変わったのはその影響じゃ無いかと

でも、外部に公開する手段が無くなってしまったので。

頓挫しました。

しゅーりょー。

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