オイラも先ほど申請を済ませました。
オンラインでも申請で着るみたいです。

ホテルで発行して貰った宿泊証明書や明細書は、スキャナーで読み取るか、デジカメで撮影すれば良いと思います。
前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/AroundHokkaido
今回はGPSの情報から取得した移動距離合計をファイルに保存する処理を作成していきます。
クラスを一つ作成し、北海道一周関連の処理はこのクラスの中で処理していきたいと思います。
package com.takilab.aroundhokkaido
import java.io.File
class AroundHokkaido {
private val filename: String = "distance.txt"
private val citylist: CityList = CityList()
private var totalDistance: Double = 0.0
private val activity: MainActivity = SingletonActivity.GetActivity()
fun getDistance(): Double{
val file = File(activity.filesDir, filename)
if(file.exists()){
totalDistance = file.readText().toDouble()
}
return totalDistance
}
fun updateDistance(distance: Double): Double {
val file = File(activity.filesDir, filename)
if(file.exists()){
totalDistance = file.readText().toDouble()
}
totalDistance += distance
file.writeText("%.3f".format(totalDistance))
return totalDistance
}
}
まず、Android内でファイルアクセスするためには、MainActivityが必要です。
exists()でファイルの存在の有無を確認し、存在していれば、ファイルに保存済みのデータを読み込みます。
ファイルはテキストで保存されているので、Double型に変換して取得します。
保存するときは、桁数を指定しないと、指数表記でテキスト保存されてDouble型に変換出来ないという問題があるので、桁数を絞っています。
これをMainActivityでUIに表示させます。
private lateinit var aroundHokkaido: AroundHokkaido
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
SingletonActivity.SetActivity(this);
aroundHokkaido = AroundHokkaido()
val distance: Double = aroundHokkaido.getDistance()
distanceText.text = "%.3f".format(distance)
requestPermission()
~中略~
override fun onResponse(call: Call, response: Response) {
var str = response!!.body!!.string()
val jsonObject = JSONObject(str)
val jsonArray = jsonObject.getJSONArray("Feature")
for (i in 0 until jsonArray.length()) {
val jsonData = jsonArray.getJSONObject(i)
val geometry = jsonData.getJSONObject("Geometry")
val distance = geometry.getDouble("Distance")
val totalDistance: Double = aroundHokkaido.updateDistance(distance)
val mainHandler : Handler = Handler(Looper.getMainLooper())
mainHandler.post(Runnable {
distanceText.text = "%.3f".format(totalDistance)
})
}
}
まず、AroundHokkaido()の中でMainActivityを使用していますので、AroundHokkaidoの初期化はSingletonActivity.SetActivity(this);の後に行わなければなりません。
で、AroundHokkaidoから現在の移動距離を取得しUIに表示します。
これがアプリ立ち上げたときの初期表示値です。
WebAPIのレスポンスを取得したときの処理も同様にします。

札幌狸小路にある梅沢無線、お盆休みだってよ。
さて、こちらでパーツ交換したモバイル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));
}
}
マウスクリック時の処理です。
マウスカーソルにある都市に対して攻撃処理を行います。
攻撃対象は記憶しておきます。
土用の丑の日は終わってしまいましたが、
— 多岐川ノリ@ぼっち系プログラマー (@n2_taki) July 20, 2020
スーパーで580で中国産のうなぎが売られていましたので、
上の方法で調理してご飯と一緒に頂きました。
これはね、うなぎがめっちゃ柔らかくなります。
レンチンしたうなぎとは全然違います。
箸で身が簡単に裂くことが出来ます。
これは完全に、直前まで厨房で焼いていましたといううなぎ。
これはみんな是非試して欲しい。
スーパーの安いうなぎも美味しく食べられます。

前回までの状況はこちら。
ラズパイに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のバッテリーが膨張したという話を聞いて。
Google Pixel 3 、
— ちょまど🎀 (@chomado) July 27, 2020
とても好きで毎日使ってて、
で、すごく熱くなることが多くて
ふとスマホケースを外してみたら
バッテリーが膨張してた😲 pic.twitter.com/QTVdUB4C7x
スマホに負荷をかけ続けていると、その負荷がバッテリーにもかかり、結果的にバッテリーに損傷を与えます。(バッテリー膨張という形で)
ちょっと前だったら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();
},

