この炎天下の中外を走るって頭おかしいと思う。

久しぶりに運動した。

ここ最近、札幌も暑すぎて野外での運動は危険と言われてきたので。

どうせ運動するなら、空調が効いた涼しい部屋で運動したいものです。

そこで、近場のジムを調べてみました。

札幌ドームのトレーニングルームです。

一般の人でも利用できる施設で、大人500円ですが、障害者手帳があれば無料で利用できます。

今日、実際に行ってみたのですが、

トレーニングマシンの数は他の公共体育館とはダンチです。

ランニングマシンも台数が多いし、

筋トレマシンも種類が多いし、

何よりも、人が少ない。

これは、うまく利用するしかないっしょ。

夏場も頑張ってトレーニング続けるっすよ。

パーツ交換したモバイルPCを試してみた

札幌狸小路にある梅沢無線、お盆休みだってよ。

さて、こちらでパーツ交換したモバイルPCですが、

外で使ってみました。

遅っそ!

立ち上げは思った以上に早かったけど、ログインしてからが遅い。

原因はおそらくログイン直後にWindows Updateが走っているため。

Windows UpdateでCPU使用率100%行っちゃう。

まぁ、これはUpdateの確認で走っている処理なので、Updateが無ければCPU使用率元に戻るのだが、

あ、ちなみに、ネットワークはスマホの回線(LTE)をテザリングしています。

Windows Updateが終わって、CPU使用率が落ち着いても、動きがもっさりしている。

一番の要因は、やっぱりブラウザなのだろう。

最近のブラウザは色々と高性能だからね。

それなりにCPUパワーを使用します。

いまブログの記事を書いているのだが、

それでも文字入力だけでCPU使用率かなり持ってかれます。

だから、ブログ記事の更新にはあまり向かないかもしれない。

他アプリで文字入力を試してみる。

VSCodeを使ってみたところ、CPU使用率はある程度抑えられた。

ブラウザよりは。

おそらく、もっさりの原因はCPUパワーが足りないのだろう。

そりゃそうだ。第4世代のCeleronだもの。

まぁ、テキスト編集ぐらいなら十分耐えられるレベル。

ギリギリブログ記事編集かな。

写真とか、画像を含めると、ネットワーク関連がかなり足を引っ張りかも。

まぁ、せっかくパーツ交換でパワーアップしたモバイルPCなので、存分に使い倒して見せまする。

最近困らせていた耳鳴りの原因

今日の北海道は死ぬほど暑いね。

ここ最近オイラを困らせていた耳鳴りの原因ですが、

おそらく、老眼が進行したのではないかと。

40歳はバリバリの現役世代だと思いますが、

この頃から色々と体に衰えが出てきます。

更年期なので。

老眼もこの頃から現れ始めます。

確か、前回は40の時にパソコン作業用に眼科で度数を調整して貰ったメガネがあるのですが、

これが、どうも今の自分に合わなくなってきたような気がして。

実際、メガネを使用していない方が症状は軽いです。

姿勢はめっちゃ悪いですが。

多分、ディスプレイから20cmぐらいまで顔を近づけないと、ディスプレイの文字が見えない。

何にせよ、このままだといろいろ今の活動に支障が出ること間違い無しなので、

(仕事復帰することも含めて)

再び眼科に行って度数を調整して貰おうと思います。

で、街に出てきたんですが、

健康保険証の期限が切れてました。

(そういえば、新しい保険証が家に届いていたような)

今日は暑いので、飲んで帰ります。

クーポン貰ったので。

あ、老眼は年々悪くなっていくので、定期的に診察を受けた方が良いらしい。

当然、早いサイクルでメガネを変えることになります。

なので、高いメガネは避けた方がよさそう。

あと、定期的な診察は緑内障の早期発見にも繋がります。

【北海道大戦】プレイヤーの行動処理を実装する。

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

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

https://github.com/takishita2nd/HokkaidoWar

以前作成したこれ。

これの「自分の行動」の部分を作成していきます。

            while (asd.Engine.DoEvents())
            {
                asd.Vector2DF pos = asd.Engine.Mouse.Position;

                switch (gameStatus)
                {
                    case GameStatus.SelectCity:
                        cycleProcessSelectCity(pos);
                        break;
                    case GameStatus.ActionEnemy:
                        cycleProcessActionEnemy(pos);
                        break;
                    case GameStatus.ActionPlayer:
                        cycleProcessActionPlayer(pos);
                        break;
                }

                if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
                {
                    switch (gameStatus)
                    {
                        case GameStatus.SelectCity:
                            onClickMouseSelectCity(pos);
                            break;
                        case GameStatus.ActionEnemy:
                            break;
                        case GameStatus.ActionPlayer:
                            onClickMouseActionPlayer(pos);
                            break;
                    }
                }
                asd.Engine.Update();
            }

分かりやすいようにサブルーチン化した。

        private void cycleProcessActionPlayer(asd.Vector2DF pos)
        {
            _battle.MyTurn(_player.City);
            _player.City.PaintAttackColor();
            var info = Singleton.GetInfomationWindow();
            info.ShowText(pos, "都市を選択してください\r\n");
            var cities = _player.City.GetLinkedCities();
            foreach(var city in cities)
            {
                if (city.IsOnMouse(pos))
                {
                    city.OnMouse(pos);
                    city.PaintDeffenceColor();
                }
                else
                {
                    city.ClearPaint();
                }
            }
        }
        public void MyTurn(City player)
        {
            if (lastDeffece != null)
            {
                lastDeffece.ClearPaint();
            }
            if (lastAttack != null)
            {
                lastAttack.ClearPaint();
            }
            var info = Singleton.GetGameProcessInfomation();
            info.ShowText(player.GetPosition(), string.Format("{0} turn {1} / {2} {3}", turn, cityCnt + 1, _cities.Count, player.Name));
        }

周期処理です。

まず、自分の都市を赤くします。

攻撃対象を選択するのですが、自分の都市の上にマウスカーソルがある場合のみ、その都市を青く表示します。

        private City _target = null;
        private void onClickMouseActionPlayer(asd.Vector2DF pos)
        {
            var info = Singleton.GetInfomationWindow();
            info.ShowText(pos, String.Empty);
            var cities = _player.City.GetLinkedCities();
            foreach (var city in cities)
            {
                if (city.IsOnMouse(pos))
                {
                    _target = city;
                    _battle.MyTrunAttack(_player.City, _target);
                    gameStatus = GameStatus.ShowResult;
                }
            }
        }
        public void MyTrunAttack(City player, City target)
        {
            var info = Singleton.GetGameProcessInfomation();
            var r = Singleton.GetRandom();
            lastAttack = player;
            lastDeffece = target;
            double attack = lastAttack.Population * (double)(r.Next(minRate, maxRate) / 10.0);
            double deffence = lastDeffece.Population * (double)(r.Next(minRate, maxRate) / 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));
            }
        }

マウスクリック時の処理です。

マウスカーソルにある都市に対して攻撃処理を行います。

攻撃対象は記憶しておきます。

これはみんな試して欲しい。スーパーのうなぎがお店のうなぎになる。

土用の丑の日は終わってしまいましたが、

スーパーで580で中国産のうなぎが売られていましたので、

上の方法で調理してご飯と一緒に頂きました。

これはね、うなぎがめっちゃ柔らかくなります。

レンチンしたうなぎとは全然違います。

箸で身が簡単に裂くことが出来ます。

これは完全に、直前まで厨房で焼いていましたといううなぎ。

これはみんな是非試して欲しい。

スーパーの安いうなぎも美味しく食べられます。

【いろいろ計測モニター】WindowsでHTTPクライアントを作成する。

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

ラズパイにHTTPサーバを実装したので、今回はHTTPクライアントをWindowsに作成します。

以前こちらで作成したのは、HTTPサーバですが、基本的にはこれを流用します。

なので、ソースコードはほとんど似ています。

違いはサーバ処理しているところをクライアント処理しているところぐらいです。

<Window x:Class="IroiroMonitor.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="温度" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10" Width="239" Height="86" FontSize="48"/>
        <Label Grid.Row="1" Grid.Column="0" Content="湿度" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Margin="10" Width="239" Height="87"/>
        <Label Grid.Row="0" Grid.Column="1" Content="{Binding Temperature}"  HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
        <Label Grid.Row="1" Grid.Column="1" Content="{Binding Humidity}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
    </Grid>
</Window>
namespace IroiroMonitor
{
    [JsonObject("sensorModel")]
    public class Sensor
    {
        [JsonProperty("datetime")]
        public string datetime { get; set; }
        [JsonProperty("temperature")]
        public string temperature { get; set; }
        [JsonProperty("humidity")]
        public string humidity { get; set; }
    }
}
namespace IroiroMonitor.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "いろいろ計測モニター";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private double _temperature;
        private double _humidity;

        public double Temperature
        {
            get { return _temperature; }
            set { SetProperty(ref _temperature, value); }
        }
        public double Humidity
        {
            get { return _humidity; }
            set { SetProperty(ref _humidity, value); }
        }

        public MainWindowViewModel()
        {
            Thread thread = new Thread(new ThreadStart(async () => {
                try
                {
                    HttpClient client = new HttpClient();
                    while (true)
                    {
                        HttpResponseMessage response = await client.GetAsync("http://192.168.1.15:8000/");
                        response.EnsureSuccessStatusCode();
                        string responseBody = await response.Content.ReadAsStringAsync();
                        Sensor sensor = JsonConvert.DeserializeObject<Sensor>(responseBody);
                        double temp = 0;
                        double hum = 0;
                        double.TryParse(sensor.temperature,out temp);
                        double.TryParse(sensor.humidity, out hum);
                        Temperature = temp;
                        Humidity = hum;
                        Thread.Sleep(1000);
                    }
                }
                catch (Exception ex)
                {
                }
            }));

            thread.Start();
        }
    }
}

スマートフォンのバッテリーを長持ちさせる方法

Microsoft社員のちょまどさんが所有しているPixel3のバッテリーが膨張したという話を聞いて。

スマホに負荷をかけ続けていると、その負荷がバッテリーにもかかり、結果的にバッテリーに損傷を与えます。(バッテリー膨張という形で)

ちょっと前だったらiPhoneでよく見られた現象ですが、Androidでも起きるんですね。

最近のスマホって、PC並みの性能を持っている一方で、PCでは当たり前のCPUファンがスマホでは実装できない、という弱点を持っているのですよ。

なので、スマホ延命策の基本として、

熱いと思ったら自然放熱を待つ

というのが、基本的なスマホの発熱ケアと言えます。

この間、スマホの操作も、スマホの充電も禁止です。

スマホの充電は、その行為だけでバッテリーは熱を発しますし、最近のスマホゲームはCPUパワーを大量に使いますので、熱を発します。

なので、スマホが熱いと思ったら、熱が収まるまで放置するのが最善です。

特に、スマホケースを使用している方は、スマホケースによって放熱を阻害しているので、すぐにケースから外したほうがいいです。

ちょまどさんみたいに、「あったかーいホッカイロみたい」と思っていてはダメです。

さらに付け加えるとすると、

スマホが熱いからと言って、冷蔵庫や冷却剤などで強制的に冷却するのもNGです。

強制的に冷却すると、スマホの内部で結露し、スマホ基板自体が損傷する可能性があります。

これは防水機能の有無とか関係なく起こります。

じゃあ、どうするのが一番良いのかというと、自分が考えるのはスマホクーラーなどで風を送り続けて冷やすことです。

この方法ならば、結露すること無く、スマホを効率よく冷やすことが出来ます。

ちなみに、

オイラはPixel3を手帳型スマホケースに入れて使用していますが、自宅に帰ると、すぐにスマホケースから外して、スマホクーラーの風に当ててます。

その甲斐もあって、オイラのPixel3は未だにバッテリー膨張することなく、未だに現役で使い続けることが出来ます。

今持っているスマホを少しでも長く使いたいならば、スマホクーラーを使用することも一つの案です。

最近のスマホクーラーはサイズも小さくて良いっすね。

(オイラは一世代昔のスマホクーラー使用)

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

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

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

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

データ入力処理ですが、すでにデータ入力画面や一連の処理は作成してあるので、同じ要領でデータ詳細画面にもデータ入力画面への導線を作成します。

EatingDetailComponent.vue

<template>

<-- 中略 -->

            <p id="inputbutton">
                <button @click="onClickInput">データ入力</button>
            </p>

<-- 中略 -->

        <eating-input-dialog-component :show="showInputDialogContent" :date="date" :datehold=false @update="invokeUpdateList"></eating-input-dialog-component>

<-- 中略 -->

</template>

<script>
export default {

    //中略

    methods: {
        onClickInput: function() {
            this.showInputDialogContent = true;
        },
        invokeUpdateList: function() {
            this.updateList();
        },

【Android】【実質北海道一周】jsonを読み込ませる。

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

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

https://github.com/takishita2nd/AroundHokkaido

さて、前回作成したJsonファイルを、実際にAndroidアプリに読み込ませるのですが、

こちらの記事を参考にさせて頂きました。

https://qiita.com/Bluewind1997/items/c3f8e90e9fb19f47daee

assetsフォルダを作成して、その下にJsonファイルを作成して設置します。

あとはassetManagerを介せば、そのJsonファイルにアクセス出来ます。

ただ、assetManagerが使えるのはMainActivityだけ。

Androidのプログラミングでは、このMainActivityが重要でして、

Androidに関する重要な処理は、このMainActivityが無ければ使用できません。

なので、どこからでもMainActivityを使用できるように、シングルトンにしてしまえば良いのではと思いましたが、

Kotlinにはシングルトン(というか、staticクラス)という概念がないので、

ここだけJavaで書きました。

package com.takilab.aroundhokkaido;

import androidx.appcompat.app.AppCompatActivity;

public class SingletonActivity {
    private static AppCompatActivity _activity;

    public static void SetActivity(AppCompatActivity activity) {
        _activity = activity;
    }

    public static AppCompatActivity GetActivity(){
        return _activity;
    }
}

JavaとKotlinは混在できるんですね。

実際の開発現場では、どのようにMainActivityを扱っているんですかね?

このMainActivityを使ってJsonの読み出し。

package com.takilab.aroundhokkaido

class City(city: String, distance: Double) {
    val city: String = city
    val distance: Double = distance
}
package com.takilab.aroundhokkaido

import org.json.JSONException
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader

class CityList {
    val cityList: ArrayList<City> = ArrayList()

    init{
        val activity: MainActivity = SingletonActivity.GetActivity() as MainActivity
        val assetManager = activity.resources.assets //アセット呼び出し
        val inputStream = assetManager.open("AroundHokkaido.json") //Jsonファイル
        val bufferedReader = BufferedReader(InputStreamReader(inputStream))
        val str: String = bufferedReader.readText() //データ
        try {
            val jsonObject = JSONObject(str)
            val jsonArray = jsonObject.getJSONArray("list")
            for (i in 0 until jsonArray.length()) {
                val jsonData = jsonArray.getJSONObject(i)
                val city: City = City(jsonData.getString("city"), jsonData.getDouble("distance"))
                cityList.add(city)
            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
    }
}
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        SingletonActivity.SetActivity(this);

        val cityList = CityList()
        for (city in cityList.cityList) {
            Log.d("Check", "${city.city} : ${city.distance}")
        }
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 札幌 : 35.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 小樽 : 20.1
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 余市 : 15.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 古平 : 6.4
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 積丹 : 49.0
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 神恵内 : 6.3
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 泊 : 17.9
:
:

Google Budsも発表されていたんですね。

それは気がつかなかった。

https://store.google.com/jp/product/pixel_buds?hl=ja-JP

ぶっちゃけ、Sony WF-SP800Nで十分満足しているのですが。

仕様を比較すると、WF-SP800Nに搭載されているGoogle Budsはノイズキャンセリングが無い。

その代わり、耳に完全にフィットさせることでノイズを遮断、空気孔で周辺の音を聞こえやすくしているらしい。

WF-SP800Nは左側タップでAlexaを起動できますが、Google Budsは声でGoogleアシスタントを起動できるらしい。

起動もハンズフリーなのはイイネ👍

Google Budsはスマートフォンと連携して自動翻訳機能があるらしい。使う機会は少ないと思うけど。

Google Budsは無線充電に対応しているのもイイネ👍

防水機能も付いているので、スポーツにもイイネ👍

WF-SP800Nを使っているときも思ったけど、声だけでプレイリスト再生出来るの、すごい便利よ。

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