【ダイエット支援】【食事管理】データ一覧処理を作成する。

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

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

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

今回はデータ一覧画面を作成していきます。

この画面は日付ごとにタンパク質、脂質、炭水化物、カロリーを集計して一覧表示にします。

今回の一番の肝、データを処理するリポジトリの処理。

class EatingManagementRepository
{
    private $paramNames = ['date', 'item', 'protein', 'liqid', 'carbo', 'calorie'];

    /**
     * データを取得して日毎にまとめる
     */
    public function getDailyList($user, $page = 1, $days = 10)
    {
        $dates = [];
        for($i = ($page - 1); $i < ($days * $page) ; $i++) {
            $dates[] = date('Y-m-d', strtotime('today - '.$i.' day'));
        }

        $eatings = $user->EatingManagements()
             ->whereIn(DB::raw('date_format(date, "%Y-%m-%d")'), $dates)
             ->get();

        // 日毎に集計
        $dailyDatas = [];
        foreach($eatings as $eating) {
            for($j = 2; $j < count($this->paramNames); $j++) {
                if(!array_key_exists($eating->date, $dailyDatas)) {
                    $dailyDatas[$eating->date] = [];
                }
                if(!array_key_exists($this->paramNames[$j], $dailyDatas[$eating->date])) {
                    $dailyDatas[$eating->date][$this->paramNames[$j]] = 0;
                }
                $dailyDatas[$eating->date][$this->paramNames[$j]] += $eating->{$this->paramNames[$j]};
            }
        }

        // 戻り値に変換
        $retDatas = [];
        $index = 0;
        foreach($dailyDatas as $dailykey => $dailyData) {
            $retDatas[$index][$this->paramNames[0]] = $dailykey;
            for($k = 2; $k < count($this->paramNames); $k++) {
                $retDatas[$index][$this->paramNames[$k]] = $dailyDatas[$dailykey][$this->paramNames[$k]];
            }
        }

        return $retDatas;
    }

まずはwhere inで日付指定でデータを取得するために、今日から(デフォルト)10日前までの日付を配列$datesに作成します。

>>> $dates
=> [
     "2020-07-30",
     "2020-07-29",
     "2020-07-28",
     "2020-07-27",
     "2020-07-26",
     "2020-07-25",
     "2020-07-24",
     "2020-07-23",
     "2020-07-22",
     "2020-07-21",
   ]

そして、DBにアクセスして、データを取得、結果が$eatingsに入ります。

>>> $eatings = $user->EatingManagements()->whereIn(DB::raw('date_format(date, "%Y-%m-%d")'), $dates)->get();=> Illuminate\Database\Eloquent\Collection {#3920     all: [
       App\Model\EatingManagement {#3917
         id: 1,
         date: "2020-07-30",
         item: "item1",
         protein: 10,
         liqid: 10,
         carbo: 10,
         calorie: 10,
         created_at: "2020-07-30 10:38:50",
         updated_at: "2020-07-30 10:38:50",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3916
           user_id: 1,
           eating_management_id: 1,
         },
       },
       App\Model\EatingManagement {#3652
         id: 2,
         date: "2020-07-30",
         item: "item2",
         protein: 20,
         liqid: 20,
         carbo: 20,
         calorie: 20,
         created_at: "2020-07-30 10:39:00",
         updated_at: "2020-07-30 10:39:00",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3915
           user_id: 1,
           eating_management_id: 2,
         },
       },
     ],
   }

このデータを日付毎に集計します。

$dailyDatasは二次元の連想配列になっていて、$dailyDatas[日付][栄養素]という感じで格納されます。

栄養素の連想配列名は定義済みの$paramNamesの値をそのまま使用します。

こうすることで、今後何かDBに修正が入ったとしても、$paramNamesのみを修正すれば良いことになります。

>>> $dailyDatas
=> [
     "2020-07-30" => [
       "protein" => 30,
       "riqid" => 0,
       "carbo" => 30,
       "calorie" => 30,
     ],
   ]

ただ、このままだと、Json化してJavascript側で処理するのに、ものすごい面倒なことになるので、扱いやすいようにデータを変換します。

具体的には、$retDatas[データ番号][項目]という形にします。

>>> $retDatas
=> [
     [
       "date" => "2020-07-30",
       "protein" => 30,
       "riqid" => 0,
       "carbo" => 30,
       "calorie" => 30,
     ],
   ]

この状態でJson化してフロントエンド側に送信します。

この処理書くの大変だったわ。

namespace App\Http\Controllers\Eating;

class ApiController extends Controller
{
    /**
     * データ一覧を取得する
     */
    public function list(Request $request)
    {
        return response()->json(['dataLists' => $this->eatingManagement->getDailyList(Auth::user(), $request->contents["page"])]);
    }
Route::post('api/eating/list', 'Eating\ApiController@list');
<script>
export default {
    created: function() {
        this.updateList();
        //this.createPagenate();
    },
    methods: {
        updateList: function() {
            this.datalists = [];
            this.contents.page = this.currentPage;
            this.param.contents = this.contents;
            var self = this;
            axios.post('api/eating/list', this.param).then(function(response){
                response.data.dataLists.forEach(element => {
                    self.datalists.push({
                        date: element.date,
                        protein: element.protein,
                        liqid: element.liqid,
                        carbo: element.carbo,
                        calorie: element.calorie
                    })
                });
            }).catch(function(error){
            });
        }

いやー未だにPHP慣れないわー。

札幌にもUber EATSがやってきた!

7月28日、札幌でもUber EATSのサービスが開始されました。

元々Uber EATSは日本各地でサービスを行っていたので、詳細は省きますが、

いいね。

オイラが住んでいる白石区はギリギリサービス圏内で、

サービス圏内端っこの方なので、利用できるお店は中央区ほど多くありませんが、

昨日の時点ではマクドナルド、スターバックス、かつやの三軒だけでしたが、

今日になって、新たに牛角とベントスが追加になっていました。

まだまだ出前館には、お店の数では及びませんが、

Woltはサービス圏内ですらありませんが、

今後も店舗が増えるかもと考えると、なかなか良い宅配サービスです。

※スターバックスはブランチ月寒からの配達なので、おそらく配達員がそこに張り付いているのだろう。

Uber EATSを選択するメリットは、最低購入価格が設定されていないところ。

なので、本当にコーヒー一杯からでも配達してくれます。

ただ、配達料がかかるから、頼むとしたらまとめて注文するけどね。

ただ出前館も負けじと、最近は新規の店舗も増えてきて、住民からすれば嬉しい限りです。

出前、いいねぇ。

今の体調とコリの恐ろしさ

仕事を退職して10ヶ月経過。

失業手当も次回の認定で終わってしまいます。

昨年の体調不良の原因が、肩こり、首こりにあると分かって、定期的に整体に通い、凝りをほぐすことによって、だいぶ回復してきました。

筋肉のコリって怖いね。

筋肉が凝り固まってしまうと、血液が十分に流れなくなってしまうので、手足の末端が震えたり、頭が働かなくなったりします。

(そういえば、最近は手のしびれが無くなったな・・・)

コリを防ぐには、定期的に体を動かしたり、ストレッチを行うことによって防ぐことが出来るのですが、

凝り固まってしまうとそれだけではなかなか解消できなくって、

高い金を払って整体に通わなければならなくなります。

整体のお金って結構高いんすよ。

オイラの行っていたあゆみ整骨院は1回あたり4000円だったかな・・・。

整体って、整体師が力業で体をマッサージする物だと思っていたけど、

ここはかなりハイテク(?)な治療マシンを使っているので、効果はテキメンでした。

しかも痛くない。

前回で通うのを終了しましたが、今でも定期的なストレッチは欠かしていませんし、なんてったって、ネックマッサージャーがあります。

これを使うと、使用後の感覚が整体終えた直後と同じなので、本当に効果テキメンです。

これで1万円なら安い物です。

でもまだ問題がありまして、

どうやら目の疲れがひどいらしい。

目の疲れからか、目のコリが発生して、耳鳴りがする。

で、どうやったら目の疲れを軽減できるのか、と言うのを調べてみたのですが、

その原因の一つに、パソコンディスプレイがあるらしい。

というのも、

ディスプレイが部屋の光りを反射して(グレアというらしい)、それが目に負担をかけていると言うことなのです。

そういえば、オイラのパソコンディスプレイ、メインのやつ(中央)が一番古いディスプレイだ。

そして、よく見ると、メインのディスプレイは背景の光りを反射している。

これがグレアか。

メインディスプレイを2番目に古いディスプレイに配置交換。

(一番新しいヤツはラズパイと兼用なので、位置を変えると不便。)

目の疲れは多少軽減できましたが、完全に対処するには、ノングレアのディスプレイカバーを買えば良いらしい(結構高い。)

あと、目の周りをマッサージしたり、眼球を動かす運動を定期的に行ったり、目を温めたりすると良いらしい。

さらなる体調改善を期待。

【実質北海道一周】GPSの2点から距離を求める。

実質北海道一周アプリとは?

定期的にスマホのGPSの信号を取得し、その2点間のデータから移動距離を計測して蓄積。

北海道一周を行う場合、総移動距離が、北海道のどの位置に相当するか、というのを表示するアプリ(という物を想定しています。)

GPSデータから距離を求める処理はQiitaにまとめてあります。

https://qiita.com/takishita2nd/items/3f1d7800fe85de2273bd

ハマったのは、パーミッションの記載。

“android”と記載するところを”Android”と書いただけで無効化されてしまいます。

「WebAPIにアクセス出来ねぇ!」ってなって、冷静に確認したら、上記のようなミスをしていました。

今回はJavaではなくて、Kotlinを使用していますが、KotlinはJavaのインターフェースを使用できますし、その逆も可能です。

なんなら、Kotlinで書いたコードをコンパイルしたバイナリファイルをJVMで動かすことができます。

Kotlinの方が便利な所もありまして、Kotlinは限りなくNullポインタアクセスを考慮しなくて良い仕様になっていますし(ただ、独特なコードの書き方はまだ慣れない)

UIにアクセスする際も、コントロールのID名だけで直接アクセスできたりします。

Android、というか、Javaをメインでやっている人は、Kotlinを覚えておいても全く損は無いです。

いや、無駄な知識は無い、持っていれば持っているだけメリットがあります。

だから人生一生勉強

頑張ります。

TCL 10 Lite、26800円って安すぎじゃね?

これだけ安いのには訳があるはずだ。

スペックの数字だけを見てみると、プロセッサーはローからミドルの間ぐらいですが、

メモリ6GB、ストレージ128~256GBという数字だけ見ると、オイラがいま使用しているPixel3よりもお得に見えるが。

※ちなみに、Pixel3はメモリ4GB、ストレージ64~128GB。

スペックを見て気がついたことが2点。

まず、NFCを搭載しているものの、Felicaを搭載していないので、おサイフケータイは使用できません。

いや、それだけでここまで安くなるわけが無い、

と思ってさらに調べてみると、

急速充電未対応。

ただ、バッテリー容量が多いので、寝ている間にフル充電させれば1日持つかも。プロセッサーの性能が高くない分、消費電力も少ないはずなので。

まぁ、一番気になるのはプロセッサーの性能だよね。

Pixel5のプロセッサーはミドルレンジかも、という噂もあるしね。

Antutuのスコアを比較してみると、Snapdragonの730Gと比較すると、半分ぐらいの性能だろうか。

https://reameizu.com/antutu-benchmark-and-geekbench-reveal-qualcomm-snapdragon-665-mobile-platform/

https://reameizu.com/qualcomm-snapdragon730g-vs-snapdragon730-snapdragon712-snapdragon710-by-antutu-benchmark-and-geekbench/

まぁ、実際に触ってみないと本当の性能なんて分からないけどね。

ビックカメラに行って、あったら触ってみようかな(←あまり期待していない)

【マインクラフト】【統合版】Minecraftプログラミング

マインクラフトでプログラミングをやってみよう。

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

https://knowledge.sakura.ad.jp/22099/

統合版ならWindowsストアから専用アプリをインストールするだけで遊べます。

あ、マインクラフト本体が必要だからね(もちろん有料)。

こちらのサイトから専用アプリをインストールします。

https://www.microsoft.com/ja-jp/p/code-connection-for-minecraft/9ppfpg2fg2qb?activetab=pivot:overviewtab

アプリを実行すると。こんな画面が表示されるので、

これをマインクラフトのゲーム画面から実行します。

Code Connection for Minecraftに接続するコマンドです。

表示されているIPアドレスはローカルIPなので、ご自宅のネットワーク内からでしか接続できません。

まぁ、Code Connection for Minecraftが起動していなければ接続できないんですけどね。

マインクラフト本体を立ち上げで、ローカルに新ワールドを作成。

この時、忘れちゃいけないのは、

敵が出てくるとウザいので、難易度はピース。

そして、チートを有効にすること。

これをやらないとconnectコマンドが打てません。

ワールドに入ったら、/ボタンを押して、connectコマンドを入力します。

そうすると、Code Connection for Minecraftの画面が変わります。

使用するエディターが選べます。

オススメはMakeCodeかな。

ブロック、Python、Javascript、好きな言語を選べます。

まずは、チュートリアルでプログラミングのコツを覚えるのが良いでしょう。

説明は英語ですが、基本的に表示されるコードを入力するだけなので、やることはそんなに難しくありません。

pythonで組んでみたサンプルコード。

これを実行すると、目の前に苔むした石レンガの壁が出来上がります。

タイトルなんかも出せちゃったりします。

これで自分だけのカスタム世界が出来上がったりするわけですな。

もっとどんな事が出来るのか調べてみます。

【北海道大戦】今後の実装にあたって。【設計のコツ】

たぶん、どんな感じで動かすか、と言うのをきちんと整理しておかないとごちゃごちゃしてくると思うので、

こんな感じのものをサクッと作成しました。

まぁ、フローチャートですわな。

ゲームの状態をステータス(status)で定義し、その状態によってループ処理とか、マウスクリック処理を変えていくように実装させて行く必要があると思います。

ゲーム開始時はstatus=1の状態で始まり、プレイヤーが担当する自治体を選択します。

選択したらゲームスタート。

自分の番が来るまで敵が行動するのですが、その状態がstatus=2です。

で、自分の番が来たらstatus=3に移行。

攻撃対象となる自治体を選択(クリック)します。

その後status=4に移行し、戦闘結果が表示されます。

その後クリックで再びstatus=2に移行し、以後、自治体が残り一つになるまでループします。

最終的に、自治体が残り一つになればstatus=5に遷移してゲーム終了。

とまぁ、サクッと説明しましたが、こういった整理が出来るかどうかで設計能力が問われるわけで。

「このステータスの時」「このイベントが起きると」「このアクションをする」

こんな感じで、図や表なんかに書き出してみると、きれいに整理できたりします。

案外こういうのが解決の近道だったりするので、困ったときは一度立ち止まって整理することをオススメします。

【ラズパイ】【いろいろ計測モニター】時計表示を大きくする。

フォントをもっとシンプルなものに変更しました。

複雑なフォントにすると、データ化がめんどくさい。

こういうシンプルなデザインにした方が、数字表示用8LEDディスプレイみたいで(厳密には違うが)データ化が1時間程度で完了しました。

さらに、横幅も少し小さくして、時間と分のセパレータ「:」も入れることが出来ました。

このサイズだったらかなり見やすいでしょ。

    [ #1
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        ]
    ],

データもこんな感じなので(というか、縦に線を引いているだけなので)サクッと作れました。

具体的にはgitHubのソースを見て欲しい。

https://github.com/takishita2nd/RaspiDisplayMonitor

表示する時刻データを、

GLCD.drowLargeClock(datetime.datetime.now().strftime('%H:%M'))

こんな感じで文字列化して、

def drowLargeClock(time):
    position = 0
    val = 0
    for s in time:
        if s == ':':
            val = 10
        else:
            val = int(s)

        for page in range(6):
            for addr in range(24):
                if position + addr < 64:
                    SelectIC(1)
                    SetPage(page)
                    SetAddress(position + addr)
                else:
                    SelectIC(2)
                    SetPage(page)
                    SetAddress(position + addr - 64)
                WriteData(LFont.Array[val][page][addr])
        position += addr

このように処理させることで、大きいフォントで時刻表示できます。

これでさらに使い物になりましたな。

【ダイエット支援】【食事管理】データ入力処理を作成する。

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

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

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

データ入力ダイアログから入力データをデータベースに登録するところまで行きます。

モデル

class User extends Authenticatable
{
    public function EatingManagements()
    {
        return $this->belongsToMany('App\Model\EatingManagement');
    }
class EatingManagement extends Model
{
    protected $table = 'eating_managements';
    
    public function users()
    {
        return $this->belongsToMany('App\User');
    }

    public function timezones()
    {
        return $this->belongsToMany('App\Model\Timezone');
    }
}
class Timezone extends Model
{
    protected $table = 'timezones';
    
    public function Eating()
    {
        return $this->belongsToMany('App\Model\EatingManagement');
    }
}

リポジトリ

<?php

namespace App\Repository;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use App\Model\EatingManagement;
use App\Model\Timezone;
use App\User;

class EatingManagementRepository
{
    private $paramNames = ['date', 'item', 'protein', 'riqid', 'carbo', 'calorie'];

    public function __construct()
    {

    }

    public function add($param, $user, $timezone)
    {
        $model = new EatingManagement();
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();
        $time = Timezone::where('id', $timezone)->first();

        $this->attachToUser($model, $user);
        $this->attachToTimezone($model, $time);
    }

    public function attachToUser($model, $user)
    {
        $model->users()->attach($user);
    }

    public function detachToUser($model, $user)
    {
        $model->users()->detach($user);
    }

    public function attachToTimezone($model, $timezone)
    {
        $model->timezones()->attach($timezone);
    }

    public function detachToTimezone($model, $timezone)
    {
        $model->timezones()->detach($timezone);
    }

    public function getParam()
    {
        return $this->paramNames;
    }

}

コントローラー

<?php

namespace App\Http\Controllers\Eating;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Repository\EatingManagementRepository;

class ApiController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->eatingManagement = new EatingManagementRepository();
    }

    /**
     * データを1件登録する
     */
    public function add(Request $request)
    {
        $paramNames = $this->eatingManagement->getParam();

        $param = [];
        foreach($paramNames as $name) {
            $param[$name] = $request->contents[$name];
        }

        $this->eatingManagement->add($param, Auth::user(), $request->contents['timezone']);
        
        return response()->json();
    }

}

パラメータを設定する処理をちょっと変えています。

Vue側でtypoしていないことが前提ですが、なるべくコードの中で直値を使わない(定義する箇所は一か所のみ)ようにするための工夫。

これが正解なのか、いまだにわかりませんけどね。

Vue側の修正です。

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="/eating">詳細</a></li>
                </ul>
            </div>
        </div>
        <eating-input-dialog-component :show="showInputDialogContent" :datehold=true @update="invokeUpdateList"></eating-input-dialog-component>
    </div>
</template>

ダッシュボードからのクイック入力からは、日付の入力はできないようにします。(本日固定にする。)

そのために、コンポーネントにdateholdというパラメータを追加で渡しています。

EatingInputDialogComponent.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>
                                <input type="date" v-model="contents.date" v-if="datehold" readonly>
                                <input type="date" v-model="contents.date" v-else>
                            </td>
                        </tr>
                        <tr>
                            <td>品名</td>
                            <td><input type="text" v-model="contents.item" /></td>
                        </tr>
                        <tr>
                            <td>時間帯</td>
                            <td>
                                <select name="timezone" v-model="contents.timezone">
                                    <option value="1" selected>朝</option>
                                    <option value="2">昼</option>
                                    <option value="3">夜</option>
                                    <option value="4">間食</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td>タンパク質</td>
                            <td><input type="number" v-model="contents.protein" /></td>
                        </tr>
                        <tr>
                            <td>脂質</td>
                            <td><input type="number" v-model="contents.riqid" /></td>
                        </tr>
                        <tr>
                            <td>炭水化物</td>
                            <td><input type="number" v-model="contents.carbo" /></td>
                        </tr>
                        <tr>
                            <td>カロリー</td>
                            <td><input type="number" v-model="contents.calorie" /></td>
                        </tr>
                    </tbody>
                </table>
                <p id="command">
                    <button @click="clickAdd">入力</button>
                    <button @click="closeModal">閉じる</button>
                </p>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    props: ['show', 'datehold'],
    data() {
        return {
            errors: [],
            error_flg: [],
            param: {},
            contents: {
                date: "",
                item: "",
                timezone: 1,
                protein: "",
                riqid: "",
                carbo: "",
                calorie: "",
            },
        };
    },
    created: function() {
        this.clear();
    },
    methods: {
        clickAdd: function() {
            var self = this;
            this.param.contents = this.contents;
            axios.post('api/eating/add', this.param).then(function(response){
                self.clear();
                self.closeModal();
                self.$emit('update');
            }).catch(function(error){
                self.error_flg = true;
                self.errors = error.response.data.errors;
            });
        },
        closeModal: function() {
            this.$parent.showInputDialogContent = false;
        },
        clear: function() {
            var today = new Date();
            this.contents.date = today.getFullYear() + "-" + ('00'+(today.getMonth() + 1)).slice( -2 ) + "-" + today.getDate();
            this.contents.item = "";
            this.contents.timezone = 1;
            this.contents.protein = "";
            this.contents.riqid = "";
            this.contents.carbo = "";
            this.contents.calorie = "";
            this.error_flg = false;
            this.errors = [];
        }
    }
}
</script>

ちょっと苦労したのはdateのフォーマットですね。

dateフォームのフォーマットは”YYYY-MM-DD”で、これが若干違っていてもフォームは正しく認識してくれません。

実行結果。

七年前の古いノートパソコンを再活用してみた。

すまん、CPUはCore iじゃなくてCeleronだった。

USBインストーラーのWindows10が結構昔に作成したものだったらしく、インストール直後、アップデート祭が発生しました。

Windows Updateでアップデートを行うと、めっちゃ時間がかかるので、

こちらのサイトで見つけた、Rufusというツールを使うと便利です。

https://www.pasoble.jp/windows/10/oogata-update-1903.html

このツール、Windowsのアップデートプログラムのisoイメージをダウンロード出来ます。

isoイメージをダウンロード完了すれば、そのファイルをマウントしてアップデートプログラムを実行すればOK。

Windows Updateを使うより早いです。

使用した感じは思った以上にサクサク動作します。

やっぱりドライブをSSDに換装したのと、メモリを8GBに増やしたのが大きいと思います。

アイドル状態でメモリ使用率が32%。

2.4GBぐらい使用している計算になります。

普段使いでは8GB使い切ることは無いですが、CPU使用率はすぐに100%行ってしまいますね。

で、なぜこのノートPCなのかというと、このノートPC、バッテリーの持ちが良いんです。

確か、購入時のスペックを確認したところ、フル充電で6時間使用できるとありました。

何のアプリを実行するかにも寄りますが、文書作成程度ならば十分普段使用に耐えられると思います。

そうだなぁ、外出先でライティング作業に使用しようか。

執筆作業とか、インターネット、ブログ更新程度なら十分使用できます。

その反面、ゲームとかプログラミングには向かないかもしれん。

まぁ所詮旧世代のCeleronだからね。

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