カレーパンだ。
すごい行列だったね。
赤カレーと黒カレーの2種類ありまして、どちらも280円です。
赤カレー
黒カレー
若干辛さが違います。
どちらかが辛いと言うわけではなく、辛さの種類が違うって感じで。
食べ比べて面白いです。
あと、中にステーキ肉が入っているのも特徴的ですね。
前回までの状況はこちら
前回のままだと、摂取量をそのまま数字としてグラフに表示させているだけなので、
この数字が適正量なのかを判断するために、適正値との割合をパーセンテージにして表示させたいと思います。
といっても、どれくらいが適正量なのか、というのが、体型などに左右されやすいものなので、
こちらの記事の計算式を参考にして、
体重60kg、摂取カロリー2000kcalとして計算すると、
この数字を直に与えました。
baseData: {
protein: 120.0,
liqid: 55.5,
carbo: 255.0,
calorie: 2000.0
},
これ、ちゃんとした条件をもとに計算する仕組みが必要だね。
self.datasets.push(response.data.data.protein / self.baseData.protein * 100);
self.datasets.push(response.data.data.liqid / self.baseData.liqid * 100);
self.datasets.push(response.data.data.carbo / self.baseData.carbo * 100);
self.datasets.push(response.data.data.calorie / self.baseData.calorie * 100);
これでグラフがパーセンテージになります。
なので、どの栄養素が足りてなくて、どの栄養素を取りすぎているかがわかります。

ところで皆さん、公共Wi-Fiって、イマイチ使いづらいと思いませんか?
オイラは使ってみたいと思っていましたが、イマイチ契約して使ってみようとは思いませんでした。
何故なのか。
公共Wi-Fiの設置場所って、変なところにありがち。
喫茶店とか、ファミレス、ファーストフード店ならまだ分かるが、
ガソリンスタンドとか、レンタカーショップとか、誰が使うん?
いや、必要としている人がいるのかもしれないが。
今利用しているサービス(@niftyとか、ドコモWi-Fiとか)で調べてみても、
まー使い勝手が悪い。
で、色々調べまして、
Wi2という公共Wi-Fi事業者が比較的Wi-Fiの設置場所が充実していることが分かりまして。
https://wi2.co.jp/jp/personal/gigazo/standard
どれくらい充実しているかというと、今存在する公共Wi-Fiのアクセスポイントは、ほぼ全て網羅しているレベル(という認識)。
しかし、大事なのは、アクセスポイントだけではない。
どれくらい速度が出て、満足にネットライフを過ごせるか、である。
なので、実際にスタンダートプラン(税込み500円)を契約し、使ってみました。
使い方は、スマホなら、専用アプリをダウンロードし、契約時のアカウントでログインすればOK。
アクセスポイントの近くに行けば、自動的に接続されます。
繋がらなくても手動で接続する事が出来ます。
今回は札幌市狸小路のしゃぶ葉札幌狸小路店で使用。
スピードテストを実施してみました。

おっそ。
ちなみに、モバイル回線(4G)の実行結果がこれです。(ギガ消費😥)

んー、モバイルより遅いか。
もちろん、使用する時間帯とか、混み具合とかで変わる数字で、あくまでもこれは一つの目安なのですが、それにしてもこの差よ。
公共Wi-Fiの実力はこんなものか。
ギガが減らない、というメリットはある物の、500円払う価値があるかどうか、というとまた話は違ってくるもので。
Wi-Fiってモバイルより早いイメージあるじゃないっすか?
いや、この差は正直ガッカリだったな。😒
しゃぶ葉って、以前は元町店に通っていたのですが、
より近くにお店が出来てうれしーって感じです。
しゃぶ葉って平日のランチタイムの食べ放題が無制限なんですよ。
(実際にはランチタイムが16時で終わるので、16時まで居座ることが出来ます。)
まぁ、実際問題、そこまで食べ続けられる訳ではないですが。
ただ、このお店、

アルコール飲み放題が999円なんですよ。
元町店にはなかった。(オイラの記憶上)

このお店の特徴は、お肉以外は、全てセルフサービス、ということ。
ビールも自分でつぎます。
しかし、グラスをセットしてスイッチを押すだけでこんな泡ができます。
いや、美味しかった。
お腹いっぱい食べて2300円程度で済んじゃうんですよ。
通いすぎ・食べ過ぎ注意だね。
前回までの状況はこちら。
簡単ですが、UIは作ったので、実際に移動距離から都市名を表示させる処理を作っていきます。
class StartEnd(startCity: String, endCity: String) {
val startCityName : String = startCity
val endCityName : String = endCity
}
class AroundHokkaido {
fun getCity() : StartEnd {
var tempDistance = 0.0
var start : String = ""
var end : String = ""
var loop : Boolean = false
run {
citylist.cityList.forEach{
if(loop){
end = it.city
return@run
}else{
tempDistance += it.distance
if(totalDistance < tempDistance){
start = it.city
loop = true
}
}
}
}
return StartEnd(start, end)
}
Jsonで作成した都市と距離のデータから、移動距離と都市間距離を比較しながら加算していき、都市間距離合計が移動距離を超えたときにそのときの都市を返します。
forEach()を使っているのですが、forEachは処理じゃなくて関数なので、途中で処理を抜けるには、breakではなくreturnになります。
それをrunというラベルを指定してreturnすることで、run{}を抜けるところまでジャンプできます。
ややこしい。
でも大分Kotlinにも慣れてきた気がする。
class MainActivity : AppCompatActivity() {
private fun updateCitydistance(startEnd : StartEnd){
startCity.text = startEnd.startCityName
endCity.text = startEnd.endCityName
}
kotlinはUIにアクセスするの楽だからいいね。

GPSって、思った以上にいい加減、というか、誤差が大きくて、動かしていなくても、1mぐらい移動したものと見なされるみたいです。
後々対処しないとだけど、今は、移動するのがめんどくさいので、このままにしておきます。
確認用に、Jsonを修正。


うん、きちんと変わりましたね。
修正しなきゃいけないところはあるけど、とりあえずはこれでいいか。

一応、プロジェクトを作成して、Hello Worldが出るまでやりました。
手順などは、Qiitaにまとめましたが、
https://qiita.com/takishita2nd/items/0b54af9860f54c65fd24
実際はもっと手こずったので、いろいろと愚痴を書きたい。
まず、Python2.7で無ければセットアップからプロジェクト作成まで動かないのだが、
Python3が動いているのは分かっているのにPython3の本体がどこにあるか分からない、という自体に。
そもそもWindowsにインストールした覚えがない。
ググってプログラムの本体を調べるコマンドを探しまして、
where python
って打てば良いんですけど、
これコマンドプロンプロのコマンドね。
最近はPowerShellをよく使うから。
C:\Users\[ユーザー名]\AppData\Local\Microsoft\WindowsApps\python.exe
にありました。
分かるか。
展開したPython2.7を展開し、環境変数のPATHの設定で、上のフォルダの記載がある場所の上にPython2.7のPATHを書かなければならない。
PATHの検索順をPython2.7→Python3に変えるんですね。
めんどくせぇ。
今時Python2.xなんて使うやついないよ。(たぶん)
もう設定元に戻したわ。
プロジェクト作るときだけ変えれば良い。
そして、もう一つ、Cocoa2d-xってWindowsでも動かすことができるんですが、
いわゆるマルチプラットフォームになっていて、C++の共通コードだけ記述すれば、他のOSでも動かすことができる。
しかし、Windowsで動かす場合は
Visual Studio 2017が必要。
2019ではダメらしい。
めんどくさい。
(一応動かしたけど、後でまとめるわ)
でも、動いたので、あとはガリガリC++のコードを書いていけば。
IDE何使えば良いんだ?
以前取り上げたopenTKのやつ。
これを使ってSTLファイルを表示する、というのをやってみたいと思います。
使用するSTLファイルは、こちらからダウンロードしました。
https://www.3dagogo.com/creativetools/designs/3DBenchy
ただしく処理できれば、こんな風に表示されるはずです。

STLファイルの読み込みはこちらのサイトを参考にしました。
https://codingsquare.net/cs/stlfile/#toc11
STLのデータは法線ベクトルと、三角形を構成する頂点の座標を示す3つのベクトルで構成されています。
法線ベクトルは三角形の面の表側を向いている方向を示すベクトルです。
public bool ReadBinary(string filePath)
{
// filePath が null か、ファイルが存在しない場合はエラーとする
if (filePath == null || File.Exists(filePath) == false)
return false;
try
{
// バイナリファイルの読み込み
using (var reader = new BinaryReader(new FileStream(filePath, FileMode.Open, FileAccess.Read)))
{
// ヘッダ読み込み
Header = reader.ReadBytes(HeaderLength);
// ファセットの枚数読み込み
uint size = reader.ReadUInt32();
// ファイルの残りのバイト数
long rest = reader.BaseStream.Length - reader.BaseStream.Position;
// ファセット1枚分のバイト数
const int FacetLength = 50;
// ファイルの残りのバイト数が、求められるファセットの枚数分のバイト数より少なければエラー
if (rest < FacetLength * size)
return false;
// 全ファセット読み込み
Facets = new Facet[size];
for (int i = 0; i < size; ++i)
{
// ファセット1個分のバイト配列読み込み
byte[] bytes = reader.ReadBytes(FacetLength);
// ファセットデータ生成と配列への格納
int index = 0;
const int offset = sizeof(float);
Facets[i] = new Facet(
new Vertex(
BitConverter.ToSingle(bytes, index),
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset)),
new Vertex(
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset)),
new Vertex(
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset)),
new Vertex(
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset),
BitConverter.ToSingle(bytes, index += offset))
);
}
}
}
catch (Exception)
{
return false;
}
return true;
}
これでバイナリのSTLデータを読み込み、描画させます。
STLFile stlFile = new STLFile();
public Game() : base(800, 600, GraphicsMode.Default, "0-3:GameWindow")
{
stlFile.ReadBinary("3DBenchy.stl");
}
//画面描画で実行される。
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.MatrixMode(MatrixMode.Modelview);
Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
GL.LoadMatrix(ref modelview);
int count = 0;
foreach(var f in stlFile.Facets)
{
count++;
GL.Begin(BeginMode.Triangles);
GL.Color4(Color4.White);
GL.Normal3(f.Normal.X, f.Normal.Y, f.Normal.Z);
GL.Vertex3(f.Vertex1.X / 30, f.Vertex1.Y / 30, f.Vertex1.Z / 30);
GL.Vertex3(f.Vertex2.X / 30, f.Vertex2.Y / 30, f.Vertex2.Z / 30);
GL.Vertex3(f.Vertex3.X / 30, f.Vertex3.Y / 30, f.Vertex3.Z / 30);
GL.End();
}
SwapBuffers();
}
そしてライトの設定も加えます。
こちらのサイトを参考にしました。
https://ameblo.jp/nishi-u6fa4/entry-10864018960.html
//ウィンドウのサイズが変更された場合に実行される。
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
GL.MatrixMode(MatrixMode.Projection);
Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, (float)Width / (float)Height, 1.0f, 64.0f);
GL.LoadMatrix(ref projection);
GL.MatrixMode(MatrixMode.Modelview);
Matrix4 look = Matrix4.LookAt(3.0f * Vector3.One, Vector3.Zero, Vector3.UnitY);
GL.LoadMatrix(ref look);
GL.Enable(EnableCap.Lighting);
float[] position = new float[] { 1.0f, 2.0f, 3.0f, 0.0f };
GL.Light(LightName.Light0, LightParameter.Position, position);
GL.Enable(EnableCap.Light0);
}
実行結果はこちら。

なんだこりゃ。
たぶん、データは間違ってないと思うんですよ。
問題は視点なのかな、と思います。
視点を変えるとか、変更できるようにすればちゃんと表示させることができるかもしれません。
もうちょっと勉強します。
まぁ、いまのままでもそこそこ楽しめるのですが、
ゲーム性を高めるために、いろいろ実装していこうかと思います。
まずは、今のバトルは完全乱数で発生させた値でのバトルなので、
ゲーム性を高めるために、じゃんけんバトルのようなものにしようかと思います。
そうなると必要なのがAltseedのシーン切り替え機能ですかね。
このシーン切り替え機能を使用するのに、どれだけ回収が必要なのかも考えないと行けません。
その検証を次回やりましょう。
あと、今は防御側勝利時、特に何もメリットがないので、防御側勝利時に1ターン戦力ボーナス・ペナルティを付与しようかなと思っています。
たぶん、そうすることでゲーム性が向上すると思うんですよね。
よし、がんばります。
あ、あと、Altseed2というのがリリースされたみたいですね。
https://altseed.github.io/index.html
とりあえず、少し改造しました。

調べてみると、GPU温度も測定できるみたいなので、それも入れてみました。
ラズパイのGPU温度を確認するコマンドは、
sudo /opt/vc/bin/vcgencmd measure_temp
sudoなので、pythonプログラム実行時もsudoで管理者権限で実行しなければなりませんが、
サービスで実行させているので、基本的に管理者権限で動作しているので、問題無いでしょう。(実際、動いた。)
時刻というのは現在時刻じゃなくて、最後に測定した時刻です。
HTTPでラズパイからデータを取得していますが、間隔を短くすると、ラズパイZeroでもCPU温度が上がってしまうので、少し間隔を空けています。(1分ぐらい)
次どうしようか。
新しい部品があればネタに出来そうだけど、今はお金が無いので。
グラフ化させてみる?