七年前ぐらいに購入した古いノートパソコンをパーツ交換して再活用する。

パーツが届きました。

2.5インチのSSDです。

8GBのメモリです。

メモリを装着。

マザーボード装着。

SSD装着。

コネクタとネジを元に戻して電源ON。

動きました。

この後、Windows10のインストーラーを入れたUSBを接続してWindows10をインストール。

過去にWindows10を動かしているのでライセンス認証は不要です。

あっ・・・。

【ダイエット】こんにゃく米を試す。

これ、美味しいかも。

糖質は抑えたい。

でもご飯の量は満足いくまで食べたい。

ということで、ネットを色々調べてみると、最初に見つかるのがしらたきご飯だと思います。

作り方は、

まず、しらたきを茹で、細かく刻んだあとに洗ったご飯と一緒に炊いて食べる、というもの。

これはこれで美味しいし、お米の一部がしらたきなので、糖質は抑えられます。

しかし、めんどくさい。

しらたきを茹でてから刻むまでの工程がもんのすごくめんどくさいのです。

ダイエットを続ける上で、こういっためんどくさい作業はできるだけ避けるべきです。

めんどくさいって思っていたら、どんどん避けていくでしょ?

なので、しらたきご飯をもっと簡単に作る方法を調べてみました。

そこで見つけたのがこれです。

大塚食品のこんにゃく米です。

作り方も裏に丁寧に書いてあります。

まず、ご飯とこんにゃく米の比率ですが、ご飯:こんにゃく米=2:1~3:1程度。

使用するお米の量を洗って(こんにゃく米は洗ってはいけない)、そこにこんにゃく米を混ぜます。

お水はご飯の規定量より少し少なめ。ここら辺は経験則で微調整すると良いでしょう。

炊飯器をセットして、通常通りご飯を炊きます。

炊き終わったら、そのまま蓋を開けずに20分程度蒸らします。

蒸らし終われば完成。良くご飯を混ぜて召し上がれ。

食べてみた感じでは、普通のご飯と全く変わりません。

これで糖質を抑えられるんだったら、ご飯炊くのも全然めんどくさくない。

これなら続けられそうです。

しかし、保温には向かないようで、時間をおく場合は容器に入れて冷蔵庫で保管した方が良さそうです。

【北海道大戦】パラメータを調整して札幌以外でも勝てるようにする

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

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

https://github.com/takishita2nd/HokkaidoWar

パラメータを調整して、ランダムの値の範囲をもう少し大きくしました。

        private const int maxRate = 50;
        private const int minRate = 1;

                double attack = lastAttack.Population * (double)(r.Next(minRate, maxRate) / 10.0);
                double deffence = lastDeffece.Population * (double)(r.Next(minRate, maxRate) / 10.0);

戦力値0.1倍~5倍に広げました。

清水の勝利でした。

札幌の勝利100%では無くなったので、パラメータはこれで行きましょう。

当然のことながら、このままではゲームではありません。

ただ成り行きを眺めているだけなので。

次回以降、さらにゲームっぽく改造していこうと思います。

七年前ぐらいに購入した古いノートパソコンをパーツ交換して再活用したい。

ただただ、捨てるのもったいない。

確か7年前ぐらいに購入したノートパソコン、HP Inspiron(だったと思う)がしばらく使われないまま棚の中で眠っているので、なんとか活用できないか、と考えています。

決して捨てるのめんどくさいとか思っていません。

ええ、思っていませんとも。

電源スイッチが入らなくなるまで使い倒すつもりでいます。

まず、このノートPCのスペック(うろ覚え)についてですが、

CPUは第4世代Core i

HDDの容量は500GB

メモリ4GB

ディスプレイの解像度1280×800(フルHDより少し少ない)

このスペックで確か当時3~5万円で購入したと思う。

今の価値だったら5000円以下かもしれない。

当時のOSはWindows8。しかしWindows10にアップデートした形跡があり、後々巡り巡ってUbuntuが入っています。

今のオイラはSSDの快適さを知ってしまっているため、このスペックではPC立ち上げに時間がかかっているだけでストレスになってしまっています。

というか、今の時代にメモリ4GBとは本当の意味で役立たずです。

まずは、何に使えるかを考えるよりも、使い物になるようにカスタマイズするべきでは無かろうか。

と思いました。

という訳で、分解。

ここまで書いて写真が無いのは、写真撮る前に分解してしまったからです。

本体の裏側のネジを取ると、キーボードが外れるようになるので、キーボードと基板の接続部分を外します。

HDDの場所は分かりました。

写真の左上のヤツですね。

これをSATAの2.5インチのSSDに取り替えれば換装できそうです。

HDDを外しました。

問題はメモリの場所ですね。ここからじゃ分かりません。

なので、マザーの部分も外しちゃいましょう。

いろんなケーブル(外部インターフェースとか、バッテリーやWi-Fiモジュールなどとの接続)を外して、マザーに相当する部分を外しました。

たぶん、金属の部分がヒートシンクになっていて、その裏側にCPUがあるんだと思います。

しかし、基板のどこを見てもメモリが無いなぁ。

もしかして、シルバーの金属に覆われている箇所の下だろうか?

当たりでした。

メモリはDDR3-12800Sらしい。

Amazonで調べてみると、過去に購入したことがあるやつ。

で、交換用のパーツを発注しました。

8000円ぐらいあればマシになるはず。

問題は、元通りに組み立てられるか、と言う所だね。

結構いろんなケーブル外したぞ。

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

サービスでプログラムを稼働させてからは安定して動作しております。

ラズパイZeroで稼働させていますが、本体を手で触っても全然熱を感じないので、省エネだし、熱で壊れることもありません。

いいね、これ。

ただ、文字が小さいので、時刻だけ大きく表示させてもいいんじゃないかなって思っています。

ということで、フォントデータを作成中です。

Array = [
    [ #0
        [
            0x00, 0x00, 0x00, 0x80, 0xc0, 0xf0, 0xf8, 0xf8,
            0xfc, 0xfe, 0x7e, 0x3e, 0x3e, 0x1f, 0x1f, 0x1f,
            0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3e, 0x7e, 0xfe,
            0xfc, 0xf8, 0xf8, 0xf0, 0xc0, 0x80, 0x00, 0x00
        ],
        [
            0x00, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f,
            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x03, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe0
        ],
        [
            0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff
        ],
        [
            0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff
        ],
        [
            0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x80, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f
        ],
        [
            0x00, 0x00, 0x00, 0x03, 0x07, 0x1f, 0x3f, 0x3f,
            0x7f, 0xfe, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0,
            0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfe,
            0x7f, 0x3f, 0x3f, 0x1f, 0x07, 0x03, 0x00, 0x00
        ]
    ],
:
:

ちょっと大きくしすぎた感がありますが、最低限数字4文字入ればなんとかなるので、このままフォントデータのビットパターンを作成していきます。(残り6文字)

大人のスタンプラリー パ酒ポート

どうやってスタンプを集めようか計画検討中。

北海道の酒蔵がこの本で紹介されており、

この本を持ってその酒蔵を訪れると、スタンプがもらえるのと、特別サービスが受けられます。

例えば、ドリンク一杯無料とかそんな感じ。

あと、日帰り温泉がワンコインで楽しめあり、宇佐美スタンドのガソリンが割り引きになったりします。

https://www.pashuport.com

右側の17箇所と特別スタンプ12箇所スタンプが用意されています。

17箇所コンプリートすると、特製エコバッグがもらえ、29個フルコンすると、特製Tシャツがもらえます。

ちなみに。

パ酒ポートでスタンプを押す17箇所、Googleマップにまとめました。

https://goo.gl/maps/eCyhot7MJsakSURc7

ほとんどは道央に集中しているのですが、1箇所だけ道東斜里町が一つあって、

ここをどうやって攻略しようかと。

たぶん片道だけで1万円行っちゃうよね?

札幌からだと泊まりがけ確実だよね?

・・・うん、コンプは諦めた(早

まずは札幌圏を中心に攻めよう。

【ダイエット支援】【食事管理】詳細画面を作成する。

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

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

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

詳細画面を作成していきます。

これも体重管理の画面を流用してさくっと作成していきます。

処理部分は後で実装します。

web.php

Route::get('/eating', 'Eating\EatingController@index')->name('eating');
EatingController.php

<?php

namespace App\Http\Controllers\Eating;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class EatingController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('eating');
    }
}
eating.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">食事管理</div>

                <div class="panel-body">
                    @if (session('status'))
                        <div class="alert alert-success">
                            {{ session('status') }}
                        </div>
                    @endif
                </div>
                <eating-list-component></eating-list-component>
            </div>
        </div>
    </div>
</div>
@endsection
app.js

Vue.component('eating-list-component', require('./components/Eating/EatingListComponent.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" @update="invokeUpdateList"></eating-input-dialog-component>
    </div>
</template>
EatingListComponent.vue

<template>
    <div>
        <div>
            <p id="navi">> <a href="/home">HOME</a></p>
            <p id="inputbutton">
                <button @click="onClickInput">データ入力</button>
            </p>
            <div id="pagenate">
                <ul>
                    <li>
                        <a href="#" v-if="prevShow" @click="prevPage()">&lt;</a>
                        <b v-else>&lt;</b>
                    </li>
                    <li v-for="page in pagenates">
                        <a href="#" v-if="currentPage != page" @click="changePage(page)">{{ page }}</a>
                        <b v-else>{{ page }}</b>
                    </li>
                    <li>
                        <a href="#" v-if="nextShow" @click="nextPage()">&gt;</a>
                        <b v-else>&gt;</b>
                    </li>
                </ul>
            </div>
            <table class="eatinglist">
                <tbody>
                    <tr>
                        <th class="date">日時</th>
                        <th class="protein">タンパク質</th>
                        <th class="liqid">脂質</th>
                        <th class="carbo">炭水化物</th>
                        <th class="calorie">カロリー</th>
                        <th class="edit"></th>
                        <th class="delele"></th>
                    </tr>
                    <tr v-for="data in datalists">
                        <td class="date">{{ data.date}}</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>
                        <td class="edit"><a @click="onClickEdit(data.id)">Edit</a></td>
                        <td class="delele"><a @click="onClickDelete(data.id)">Delete</a></td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            showInputDialogContent: false,
            showEditDialogContent: false,
            showDeleteDialogContent: false,
            datalists: [],
            pagenates: [],
            currentPage: 1,
            maxPage: 1,
            param: {},
            contents: {
                page: "",
            },
        };
    },
    computed: {
        prevShow: function() {
            return this.currentPage != 1;
        },
        nextShow: function() {
            return this.currentPage != this.maxPage;
        },
    },
    created: function() {
    },
    methods: {
        createPagenate: function() {
        },
        changePage: function(page) {
        },
        nextPage: function() {
        },
        prevPage: function() {
        },
        onClickInput: function() {
        },
        onClickEdit: function(id) {
        },
        onClickDelete: function(id) {
        },
        invokeUpdateList: function() {
        },
        updateList: function() {
        }
    }
}
</script>
app.scss

@import "eatinglist";
_eatinglist.scss

table.eatinglist {
    width: 100%;
    tbody tr {
        th {
            border: solid;
            border-width: thin;
        }
        .date {
            width: 20%;
        }
        .protein {
            width: 15%;
        }
        .liqid {
            width: 15%;
        }
        .carbo {
            width: 15%;
        }
        .calorie {
            width: 15%;
        }
        .edit {
            width: 10%;
        }
        .delete {
            width: 10%;
        }
        td {
            border: solid;
            border-width: thin;
            text-align: right;
        }
        .date {
            width: 20%;
        }
        .protein {
            width: 15%;
        }
        .liqid {
            width: 15%;
        }
        .carbo {
            width: 15%;
        }
        .calorie {
            width: 15%;
        }
        .edit {
            width: 10%;
        }
        .delete {
            width: 10%;
        }
    }
}
p#inputbutton {
    text-align: right;
    margin-right: 10px;
}
p#navi {
    margin-left: 10px;
}
div#pagenate {
    text-align: right;
    ul li {
        margin-left: 5px;
        margin-right: 5px;
        display: inline;
    }
}

まぁ、まだデータがないからね。

AndroidのGPSで位置情報を取得してみた。

今日はマジ暑くてしんどい。

Android10でGPSの位置情報を取得する方法を調べてみたところ、

まぁ、かなり古い情報しか発掘されなくて。

こういう情報はどんどん更新されていくから、バージョンが変わると調べ直すのめんどくさい。

一番有効な情報はこちらの記事でした。

https://dev.classmethod.jp/articles/android-get-location/

Javaではなく、Kotlinのコードですが、オイラの環境でも動くのを確認しました。(Pixel3)

Javaのコードが全く見つからなくて、

もう時代はKotlinで、Javaはオワコンなんですかね・・・

仕方が無い、kotlin勉強するか。

偶然、Kindle Unlimited対象の書籍が見つかったので、時間があるときに読んでいます。

時間はたっぷりあるけどな。

今後は、GPSの位置情報を使った、ちょっとしたお遊びアプリを考えています。

【Before We Leave】チュートリアルを攻略

戦闘の無い優しい世界で都市開発を行うゲームです。

EPIC Gamesでダウンロードできます。

週間アスキーにて紹介されていたのでプレイして見ました。

ただ、一つ問題がありまして、

日本語化されていないんですよね。

なので、チュートリアルを解説付きでプレイしていきます。

左上に指示が出ていますので、この通りに進めていきます。

マウスの右クリック・ドラッグでカメラを移動、ホイールの回転でズームを行います。

道(Road)を3つ、小屋(HUT)を3つ作成します。

左下に矢印が出ているので、どれが該当するアイコンかが分かると思います。

ジャガイモ農場(Potato Field)2つと井戸(well)を作成します。

農場系は井戸の周りに作成すると効率が上がります。

逆に工業系の近くに置くと、汚染が発生するので、効率は下がります。

木切り場(woodcutter)を森の近くに配置します。

これで木材の供給が可能になります。

森を3つ破壊し、石を3つ獲得します。

矢印の施設でツールを作成します。

施設をクリックすると、右下にウィンドウが出るので、緑のボタンを押すと、木材からツールを5つ獲得します。

今のところツールを作成するのはこの方法しかありません。

冒険者の小屋(Explorers Hut)と図書館(Library)を建築します。

冒険者の小屋は地図上のエンシャントテクノロジー(緑色のカプセルみたいなの)を回収し、グリーンテクノロジーに変換します。

図書館はこのグリーンテクノロジーを消費してテクノロジーを獲得します。

図書館でエレベータのテクノロジーを獲得し、エレベーターを作成します。

図書館をクリックすると右下にウィンドウが表示されるので、緑のボタンを押すと、

この画面が出るので、エレベーターをリサーチします。

エレベーターは高台に上るために必要になります。

高台と平地の間に設置します。

そのまえに、高台まで道が繋がっている必要があります。

図書館でマイニングを獲得します。

採石場(Quarry)を建設します。矢印があるmountainの隣に設置します。

修復(Repair)を獲得します。

Hutの数を増やして、人間の数を25以上にします。

倉庫(Warehouse)をリサーチして倉庫を建設します。

倉庫を建設するには2つスペースが必要になります。

また、この頃にはツールが足りなくなると思うので、ツールを生産する必要があります。

次に倉庫に溜める資材を選択します。次のチュートリアルに進むためには最低3つ選択する必要があります。

次はMetalworkをリサーチします。

そうすると、鉄鉱山(Iron mine)を建築できるようになるので、Rusty Hulkの側に建設します。

次は発電所を修復します。

発電所を修復すると、パワー(power)を獲得できます。

パワーは発電所のみで獲得できます。

それが出来たら鉄精錬所(Iron Smelter)とToolsmithを建設します。

これで鉄鉱石とパワーを消費し、鉄とツールの供給が可能になります。

この2つは汚染を発生させるので、農場とは離れたところに設置するといいでしょう。

次はガーデニング(Gardening)をリサーチし、野菜畑2つとハーブ畑を2つ建設します。

これも井戸の近くに設置すると効率が上がります。

最後に船を修復します。

船を修復したら船を操作して新大陸を探します。

新大陸を発見したら、船を大陸の側に移動させて右下の緑のボタンから上陸させます。

これで序盤はクリア。

まだまだ続きますが、新大陸に上陸した後も何をすれば良いかが分かるはずです。

【北海道大戦】バトル処理を実装する。

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

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

https://github.com/takishita2nd/HokkaidoWar

前回は対戦相手を選択する処理を作成したので、

今回は実際にバトルを行う処理を作成します。

    class Battle
    {
        public void NextTurn()
        {
            if (lastDeffece != null)
            {
                lastDeffece.ClearPaint();
            }
            if (lastAttack != null)
            {
                lastAttack.ClearPaint();
            }

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

            var info = Singleton.GetGameProcessInfomation();
            if(targetIdx >= targets.Count)
            {
                info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}",
                    turn, cityCnt + 1, _cities.Count, lastAttack.Name));
            }
            else
            {
                lastDeffece = targets[targetIdx];
                lastDeffece.PaintDeffenceColor();
                float attack = lastAttack.Population * (float)(r.Next(5, 30) / 10.0);
                float deffence = lastDeffece.Population * (float)(r.Next(5, 30) / 10.0);
                if(attack > deffence)
                {
                    info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nwin",
                        turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
                    lastAttack.CombinationCity(lastDeffece);
                    _cities.Remove(lastDeffece);
                    lastDeffece = null;
                }
                else
                {
                    info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nlose",
                        turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
                }
            }

            cityCnt++;
            if(cityCnt >= _cities.Count)
            {
                _cities = cityRandomReplace(_cities);
                cityCnt = 0;
                turn++;
            }
        }
    class City
    {
        public List<Map> GetMaps()
        {
            return _maps;
        }

        public void CombinationCity(City lose)
        {
            addMaps(lose.GetMaps());
            _population += lose.Population;
        }

        private void addMaps(List<Map> maps)
        {
            foreach(var m in maps)
            {
                m.SetCity(this);
            }
            _maps.AddRange(maps);
        }

とりあえず、0.5倍~3倍の乱数で戦力値に補正をかけて勝敗を決めます。

そして、攻撃側が勝利した場合は防御側を吸収合併します。

これで一通り実装は完了したので、実際に大戦を実行しましょう。

札幌の一人勝ちでした。

もうちょっとパラメータを調整しないといけないですね。

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