久々のお料理。

こちらのレシピ動画を参考にしました。
ちょっと作り方間違えたけど、それでも十分いける。
あっという間にビールが無くなってしもうた。
これは罪な料理やわ。
まだジャガイモあるから3回作れる。
また作ろう。
そして運動もしよう。
このままじゃやばいことは知ってた。
ログイン画面が表示できてしまうと、そこから簡単に侵入できてしまうかもしれない。
なので、セキュリティを高めるために、ログイン画面を別のURLに移動させて、ブログから見えないようにします。
まず、ログイン画面へのリンクですが、これはウィジェットのメタ情報を削除すると消えます。
続けて、ログイン画面のURLを変える方法。
これはプラグインを使う方が簡単です。
プラグインの新規追加から「WPS Hide Login」を検索し、ヒットしたプラグインをインストール、有効化。
プラグインの設定でログイン画面に遷移するためのクエリパラメータを設定することが出来るので、自分しか分からないパラメータに変更して保存。
ログイン画面へのURLが表示されるので、必ずブックマークに保存してください。
これでワードプレスは安全になりました!
前回までの状況はこちら。
最新ソースはこちら。
ラズパイ https://github.com/takishita2nd/RaspiDisplayMonitor
Windows https://github.com/takishita2nd/IroiroMonitor
Windows側からラズパイの情報を取得できるなら、
Windows側からでもラズパイを操作する事も出来ます。
なので、Windows側からスイッチ操作を行う処理を作ってみます。
Windowsにボタンを設置。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<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" Margin="10" Width="239" Height="86" FontSize="48"/>
<Label Grid.Row="2" Grid.Column="0" Content="湿度" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Margin="10" Width="239" Height="87"/>
<Label Grid.Row="3" Grid.Column="0" Content="CPU温度" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Margin="10" Width="239" Height="87"/>
<Label Grid.Row="4" Grid.Column="0" Content="GPU温度" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Margin="10" Width="239" Height="87"/>
<Label Grid.Row="0" Grid.Column="1" Content="{Binding DateTime}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"/>
<Label Grid.Row="1" Grid.Column="1" Content="{Binding Temperature}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
<Label Grid.Row="2" Grid.Column="1" Content="{Binding Humidity}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
<Label Grid.Row="3" Grid.Column="1" Content="{Binding CpuTemp}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
<Label Grid.Row="4" Grid.Column="1" Content="{Binding GpuTemp}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48"/>
<Button Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2" Content="ボタン" Command="{Binding ButtonClickCommand}" FontSize="48" />
</Grid>
ボタンを押すと、ラズパイ側にPOSTリクエストを送信するようにします。
今後の拡張性を考えて、コマンド番号みたいなものを送れるようにしましょうか。
[JsonObject("CommandModel")]
class Command
{
[JsonProperty("number")]
public int number { get; set; }
}
public class MainWindowViewModel : BindableBase
{
private const int CommandSwitch = 1;
public DelegateCommand ButtonClickCommand { get; }
public MainWindowViewModel()
{
ButtonClickCommand = new DelegateCommand(async () =>
{
Command cmd = new Command();
cmd.number = CommandSwitch;
var json = JsonConvert.SerializeObject(cmd);
try
{
HttpClient client = new HttpClient();
var content = new StringContent(json, Encoding.UTF8);
await client.PostAsync("http://192.168.1.15:8000/", content);
}
catch (Exception ex)
{
}
});
これで、ラズパイ側にPOSTリクエストを送れるようになりました。
次はラズパイ側のコードを書いていきます。
class StubHttpRequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_len = int(self.headers.get('content-length'))
requestBody = json.loads(self.rfile.read(content_len).decode('utf-8'))
if requestBody['number'] == 1:
lock.acquire()
GLCD.GLCDDisplayClear()
lock.release()
pushButton()
response = { 'status' : 200 }
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
responseBody = json.dumps(response)
self.wfile.write(responseBody.encode('utf-8'))
HttpRequestHandlerクラスにdo_POSTメソッドをオーバーライドします。
これを実装することで、POSTリクエストを受診して処理することが出来ます。
受信したデータがボタン操作ならば、ラズパイ側で行っているボタン操作と同じ処理をおこないます。
def pushButton():
global mode
mode += 1
if mode > 4:
mode = 1
しかし、ここで考えなければならないのは、ラズパイ側の周期処理とHTTPサーバ処理は非同期処理を行っていると言うこと。
はい、処理が競合しちゃいます。
なので、スレッド間の待ち合わせ処理を行う必要があります。
方法はいろいろあるのですが、今回は一番簡単な方法を使用します。
Lockを使用する方法です。
lock = threading.Lock()
try:
while True:
lock.acquire()
Humidity = AM2320.GetHum()
Temperature = AM2320.GetTemp()
if sw == True:
GLCD.GLCDDisplayClear()
pushButton()
sw = False
if mode == 1:
-中略-
lock.release()
time.sleep(1)
except KeyboardInterrupt:
GLCD.GLCDDisplayClear()
GPIO.cleanup()
lock = threading.Lock()を定義し、同じlockで周期処理全体と、HTTPのスイッチ処理をlock/releaseで囲みました。
これで、一方がlockされている場合、もう一方はlockがreleaseされるまで処理に待ったがかかります。
これを使用すれば、ラズパイの遠隔操作も可能になります。
前回までの状況はこちら
前回のままだと、摂取量をそのまま数字としてグラフに表示させているだけなので、
この数字が適正量なのかを判断するために、適正値との割合をパーセンテージにして表示させたいと思います。
といっても、どれくらいが適正量なのか、というのが、体型などに左右されやすいものなので、
こちらの記事の計算式を参考にして、
体重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何使えば良いんだ?