昨日、札幌狸小路にある梅沢無線に行ってきまして、
部品を仕入れて参りました。

この抵抗を使って、

この回路の抵抗を、

こんな感じに変えてみました。

120Ωの抵抗、売り切れやったんや・・・
これで光センサーに光を当てたときの感度が変わるのかなって思いまして。
というのも、前回は10kΩの抵抗しか持ってなかったので。
結果は、よく分かりませんでした。😋
というのも、光量云々の前に、フォトトランジスタに光を当てるときの向きが重要だったらしい。
向きを変えれば、部屋の蛍光灯でも反応してくれました。
中国武漢で発生した新型コロナウイルス感染症。
瞬く間に世界中に広がり、パンデミック状態になりました。
ここで、世界に突きつけられた選択肢は以下の二つでした。
どっちを選択しても結局は死んでしまう。
ある国(ニュージーランド等)は①での死を嫌って、コロナウイルスに感染するのを国境で防ごうとしました。
また、ある国(ブラジル等)は②での死を嫌って、マスクなんて不要、いつも通り生活しようと訴えました。
果たして、選択肢は上の二つしか無いのでしょうか?
もし、第三の選択肢があったら、中二病的に嬉しくないっすか?
いや、ラノベに親しんでいる人達がいたら、①、②とは異なる、第三の選択肢を探して頑張る姿の方がカッコイイっすよね?
いや、もはや、ラノベの定石ですよね。
①を回避しようと訴える人達は、主に医療関係の人達で、
②を回避しようと訴える人達は、主に事業者関係の人達です。
今、日本が目指しているのは、①でも②でもない、第三の選択肢です。
言うなれば、コロナウイルスで死なない、経済的にも死なない結末を目指して、頑張っています。
特に頑張っているのは、三権分立の、行政に当たる部分(決められた予算を執行する機関)です。
そのリーダーが総理大臣であり、その下に国務大臣がいて、都道府県の知事がいて、市町村の長がいます。
彼らは、今、第三の選択肢、①でも②でもない第三の選択肢、どうするのが正解なのかを、頑張って探しています。
いろんなしがらみを抱えつつも、現在進行中の状態なのです。
果たして、世界の未来はどうなっていくのでしょうか。

前回までの状況はこちら
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/diet-mng
データ削除処理を作成していきます。

まずはDeleteをクリックしたときの処理。
やり方はEditと同じです。
EatingDetailComponent.vue
onClickDelete: function(timezone, id) {
var deleteData = {};
this.datalists[timezone].forEach(element => {
if(element.id == id){
deleteData.id = id;
deleteData.date = this.date;
deleteData.item = element.item;
deleteData.timezone = timezone + 1;
deleteData.protein = element.protein;
deleteData.liqid = element.liqid;
deleteData.carbo = element.carbo;
deleteData.calorie = element.calorie;
return true;
}
});
this.$refs.deleteDialog.dataSet(deleteData);
this.showDeleteDialogContent = true;
},
ダイアログ処理は体重管理のものを流用しています。
EatingDeleteDialogComponent.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>{{contents.date}}</td>
</tr>
<tr>
<td>品名</td>
<td>{{contents.item}}</td>
</tr>
<tr>
<td>時間帯</td>
<td>{{contents.time}}</td>
</tr>
<tr>
<td>タンパク質</td>
<td>{{contents.protein}}</td>
</tr>
<tr>
<td>脂質</td>
<td>{{contents.liqid}}</td>
</tr>
<tr>
<td>炭水化物</td>
<td>{{contents.carbo}}</td>
</tr>
<tr>
<td>カロリー</td>
<td>{{contents.calorie}}</td>
</tr>
</tbody>
</table>
<p id="command">
<button @click="clickDelete">削除</button>
<button @click="closeModal">閉じる</button>
</p>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['show'],
data() {
return {
errors: [],
error_flg: [],
param: {},
contents: {},
};
},
created: function() {
},
methods: {
dataSet: function(data) {
this.contents = data;
switch(this.contents.timezone) {
case 1:
this.contents.time = "朝";
break;
case 2:
this.contents.time = "昼";
break;
case 3:
this.contents.time = "夜";
break;
case 4:
this.contents.time = "間食";
break;
}
},
clickDelete: function() {
var self = this;
this.param.contents = this.contents;
axios.post('/api/eating/delete', this.param).then(function(response){
self.closeModal();
self.$emit('update');
}).catch(function(error){
self.error_flg = true;
self.errors = error.response.data.errors;
});
},
closeModal: function() {
this.$parent.showDeleteDialogContent = false;
},
}
}
</script>
次はAPIの処理です。
これも体重管理の処理とほぼ同じ。
ApiController.php
/**
* データを一件削除する
*/
public function delete(Request $request)
{
$this->eatingManagement->delete(Auth::user(), $request->contents['id']);
return response()->json();
}
EatingManagementRepository.php
/**
* データを一件削除する
*/
public function delete($user, $id)
{
$model = $user->EatingManagements()->where('id', $id)->first();
$timezone = $model->timezones()->first();
$this->detachToUser($model, $user);
$this->detachToTimezone($model, $timezone);
$model->delete();
}
違いはtimezoneテーブルとのリンクを削除する処理が増えたぐらいで、やっていることはそんなに難しくないです。
すんなり完成しました。
これでCURD処理一通り完成したので、次回はグラフ処理を作成していこうと思います。
この情報を聞いたのが昨日の夜、スマホのニュース記事で。
オイラはYahoo!ショッピングなどで獲得したTポイントをbitFlyerを介してビットコインを購入する、ということをやっていて、
売るならこのタイミングだろう。
ちょっと価格下がり始めてたし。
保有していたビットコイン全て売りました。
なぜ、ビットコインが高騰したのか、ですが、
定額給付金10万円で購入した人がいるとかいないとか。
で、売った結果。
そのときのビットコインの価格が1BTC=約120万円。
これまでビットコインに費やしたTポイントを計算すると、半年で約6000ポイントで、
獲得したお金は、その1.5倍になっていました。
で、ここで考えなきゃ行けないのは、税金のこと。
こちらのサイトを調べてみたら、
https://bitcoin.dmm.com/column/071
雑所得が20万円を超えたら、確定申告が必要になるらしい。
まぁ、今回の場合は高く見積もっても利益1万円程度なので、たぶん確定申告の必要は無いと思うけど、
念のため、ビットコインで○○円の利益を得ていた、ぐらいは覚えておいた方が良いかもしれない。
まぁ、今回のお金で焼肉二回ぐらい行けます。
ちなみに、今後もビットコインで稼ごうとかは全然思ってないです。
今後もチマチマTポイントでビットコインを貯めていくので、
そのポイント分のお金が増えてたら良いなぁ、
程度でしか考えていないので。
でも、Tポイント→ビットコイン購入時の価格とか、きちんと記録しておいた方が良いかな。
なんかいろいろ面白そう。
元手がポイントなので、損しても被害は少ない。

前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/HokkaidoWar
以前作成したこれ。

status=4、5の処理を作成していきます。
とは言っても、特に難しいことはしていません。
なので、一気に作成します。
ついでにゲームオーバーの処理も作成します。
class HokkaidoWar
{
enum GameStatus
{
SelectCity,
ActionEnemy,
ActionPlayer,
ShowResult,
GameEnd,
GameOver
}
public void Run()
{
中略
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;
case GameStatus.ShowResult:
break;
case GameStatus.GameEnd:
cycleProcessGameEnd();
break;
case GameStatus.GameOver:
cycleProcessGameOver(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;
case GameStatus.ShowResult:
onClickMouseShowResult();
break;
case GameStatus.GameEnd:
break;
case GameStatus.GameOver:
break;
}
}
asd.Engine.Update();
}
private void cycleProcessGameEnd()
{
var gameinfo = Singleton.GetGameProcessInfomation();
gameinfo.ShowText(_player.City.GetPosition(), string.Empty);
var info = Singleton.GetInfomationWindow();
info.ShowText(cities[0].GetPosition(), "ゲームが終了しました\r\n");
info.ShowText(cities[0].GetPosition(), cities[0].Name + "の勝利です\r\n");
}
private void cycleProcessGameOver(asd.Vector2DF pos)
{
var gameinfo = Singleton.GetGameProcessInfomation();
gameinfo.ShowText(_player.City.GetPosition(), string.Empty);
var info = Singleton.GetInfomationWindow();
info.ShowText(pos, "敗北しました\r\n");
}
private void onClickMouseShowResult()
{
_battle.MyTurnEnd();
cities = _battle.GetCityList();
if(cities.Count <= 1)
{
gameStatus = GameStatus.GameEnd;
}
else
{
gameStatus = GameStatus.ActionEnemy;
}
}
class Battle
{
public void MyTurnEnd()
{
if (lastDeffece != null)
{
lastDeffece.ClearPaint();
lastDeffece = null;
}
if (lastAttack != null)
{
lastAttack.ClearPaint();
lastAttack = null;
}
cityCnt++;
if (cityCnt >= _cities.Count)
{
_cities = cityRandomReplace(_cities);
cityCnt = 0;
turn++;
}
}
その他、微調整も加えています。
これで一応一通り完成しました。
次は、ちょっとした不具合とか、微調整を行って行きます。
Epic Gamesも大胆な事をしちゃったね。
元々はEpic Gamesがアプリ内課金をストアアプリ経由ではなく、自前の課金システムを使用していた、と言う事みたいなんですが、
(Fortniteプレイしていないので)
結局はEpic GamesとApple、Google間の問題でしょ?
と考えるあなた。
甘い。
確かに、ユーザー視点からしたら課金すること自体には何も変わりは無いですが、
問題は、その課金するためのクレジット情報をどこが管理しているか、ということです。
ストア経由ならば、一括してAppleがGoogleが管理していますが、
Fortniteの場合は第三者側で管理することになります。
今回の場合、Epic GamesはPCで独自のプラットフォームを持っており、そのノウハウがあれば安全かと思われますが、
どちらかというと、AppleやGoogle側が、一度そういう行為を許すと、いろんなアプリ開発メーカーが独自の課金システムを使用する流れになる、というのを防ぎたいのが一番の目的だと思います。
もしそうなった場合、個人情報の管理が出来なくなり、どこかで個人情報流出が起きると、大混乱になりますよね。
個人としては、一番信頼できる、Apple、Googleで一括管理して貰った方が安心と思いますが、どうでしょうか?
ニュースとかでもいろいろ言われてきましたが。
COCOA=すれ違い通信
という説明が一番わかりやすいかもしれないけど。
そもそもの話、アプリは勝手に個人情報に関わるデータを参照することができない用になっています。
これはiPhoneでもAndroidでも同じ。
ここでいう個人情報に関わるデータとは、GPS、電話帳、カメラ、外部ストレージなどを指します。
例えば、あるアプリが、他のアプリの情報を勝手に参照する、ということも出来ません。
これらの個人情報データを参照するには、「必ず事前にユーザーの了解を得ないとアクセス出来ない」仕様になっています。
例えば、GPSを使用するアプリを起動したときに、こんな画面が表示されることありませんでしたか?

この画面で「許可」をタップして、アプリはようやくGPSのデータにアクセス出来ます。
この手順というのもOS側で決められた手順で行わなければなりません。
例えるなら、
アプリが個人情報にアクセスしたい場合、アプリはOSが用意した正式フォーマットをユーザーに提示します。
ユーザーはそれに「OK!」とサインして、初めてアプリは個人情報にアクセス出来るようになります。
(通じたかな・・・)
これは逆に考えることも出来まして、
例えば、みなさん、上のダイアログの内容、確認しないでOKポンポンタップしたりとかしていませんか?
その行為、個人情報抜き取られているかもしれませんよ?
ストアアプリは大丈夫だと思うけど、野良アプリ(ストア外のアプリ)は注意した方が良いよ。
前回の記事で、ラズパイのCPU温度を取得できることが分かったので、
これをいろいろ計測モニターに表示させるところまでやっていきたいと思います。

PythonでLinuxコマンドを実行し、結果を得るには以下の様にプログラミングします。
import subprocess
args = ['vcgencmd', 'measure_temp']
res = ""
try:
res = subprocess.run(args, stdout=subprocess.PIPE)
except:
print("Error.")
print(res.stdout)
参考記事
https://qiita.com/tdrk/items/9b23ad6a58ac4032bb3b
これを実行すると出力はこうなります。

これを色々と加工して、Windows側に渡すパラメータにします。
実際に組み込んだコード。
def getCPUTemp():
args = ['vcgencmd', 'measure_temp']
res = ""
try:
res = subprocess.run(args, stdout=subprocess.PIPE)
except:
return "Error."
return res.stdout.decode().split('=')[1].strip().replace('\'C', '℃')
data = {
'datetime' : datetime.datetime.now().strftime('%Y:%m:%d %H:%M:%S'),
'temperature': Temperature,
'humidity': Humidity,
'cputemp' : getCPUTemp()
}
えっと、何をしているかというと、
まずは、res.stdoutの値はバイト文字なので、これをdecode()で文字列に変換します。
その後、split(‘=’)で=で文字列を分割し、後方の文字列([1])を取得します。
しかし、その文字列の中には不要な改行文字(\n)が入っているので、strip()で削除。
そして、「’C」と表示させているところをreplace()で「℃」に置き換えています。
これをJsonのパラメータに追加します。
ここまで出来ればWindows側は表示するだけなので、Windows側コードは割愛。

人が触れない温度。

https://qiita.com/BearcubThaw/items/070be8be8dc14e5837f4
$ vcgencmd measure_temp
というコマンド、ラズパイ専用コマンドがありまして、
このコマンドでCPUの温度を出力することが出来ます。
上のスクショはファン無し、アイドル状態で放置した状態でコマンド打った結果。
この温度、お風呂だったら入れないね。
この状態のまま重たい処理を実行させると、さらにCPU温度が上がって、ラズパイは確実に壊れます。
なので、ラズパイ専用のファンを買いました。

ネジが一本どっか行ったけど気にするな。
こっちは老眼で小さい部品見えないんだよ。

部品の中にはヒートシンクも入っていました。
これをCPUに貼り付けると、熱を吸い取って、表面積の多い凸凹部分に熱を伝え、これをファンの風で冷却します。
ファンを回した結果はこちら。

37℃まで下がりました。
人肌レベルですね。
まぁ、ラズパイ4はお勉強用のマシンなので、常時起動しておくことは少ないと思いますが、これで安心です。
ちなみに。

ラズパイZeroの方ですが、
ちょっと温度高め?
触っても熱くないですが。
(ラズパイ4は明らかに手で触れないくらい熱かった。)
うーん、今走らせてるサービス処理、もう少し軽くするか。
こういった温度をWindows側でモニタリングするツールを作ってもいいね。