最近調子が良かったので、朝から夕方までフル稼働させてみました。
1ヶ月前だったら、午前中の時点で頭が重たくなっていたもの、
このネックマッサージャーを使用し始めてから調子が良いです。
フル稼働させても頭が重たくなることはありませんでした。
しかし、夕方になると今度は耳鳴りがし始めて。
ここが限界かと。
まだ無理はしない方が良いかもしれぬ。
あと、この記事で紹介しているストレッチ本もなかなかオススメです。
適度に体を動かして筋肉をほぐすのが稼働時間を延ばすのに有効みたいです。
オイラの経験上。

はんだごてが届いたので、早速はんだでピンを接続しました。

カオスなことになっています。
久しぶりのはんだづけなのでピンヘッダが傾いているけど気にするな。
これをブレッドボードに挿して、ラズパイと接続します。

カオス。
ちなみに、どうつないでいるかというと、

LCD側のデータシートがこうなっているので、

こんな感じでつなぎました。
ラズパイ側GPIOの並びがバラバラなので、かなり配線が複雑になってしまいました。
ちなみに、3番、18番は後でハマった所なので後述します。
とりあえず電源ON
LCDが光りました。
そりゃそうだ。バックライトの電源が入ったから。
しかし、画面にはなにも表示されません。
でもよく見ると、なにかうっすら映っているような。
で、ネットを調べてみると、3番18番の秘密が明らかになりました。
http://zattouka.net/GarageHouse/micon/Arduino/GLCD/GLCD.htm
半固定抵抗というものを使用しているんですね。
これは、足が3つあって、一つは5Vの入力、もう一つは-10Vの入力になっています。
そして、半固定抵抗につまみがあって、アナログ的に抵抗を変えて、出力電圧を変えることができるんです。
回路的には、5Vの入力はラズパイの5V、-10Vは18番、半固定抵抗の出力を3番につなぐみたいです。
そうすることでLCDディスプレイのコントラストを調整できるようなんです。
そう、半固定抵抗が必要なんです。
なので、ポチりました。50円。
とりあえず、今回はここまで。

最新ソースはこちら(gitHub)
https://github.com/takishita2nd/diet-mng
とりあえずダッシュボードの画面を作成してみました。

最近のVSCodeは非常に便利でして、

この画面でnpm run watchコマンドを動かしてくれるんです。
わざわざコマンドを入力する必要がないので、便利です。
この画面はVue.jsで書かれています。
久しぶりのhtml,cssだったので、ちょっと時間がかかりましたが、イメージとしては良いのではないでしょうか。

前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
今回注目したのはここです。

ここはどのように塗っていくかというと、
空いているマスが4マスに対して、数字は3なので、
真ん中の2マスは確実に塗れることが分かります。
なので、これを実装します。
処理を単純化させるため、解析対象となる数字が行、列で1つの場合のみを、このロジックの対象とします。
また、このロジックを適用するマスを抽出するのですが、
マスクとマスクの間が全て塗られていた場合は処理済みと判断してスキップさせます。
その結果、対象のマスが1つの場合のみ、このロジックの対象とします。
この様な説明で分かってもらえるかどうか分からないけど、そういうことをやっています。
// 解析パターンその8
// 数字が大きい場合、真ん中の方を塗る
private void pattern8()
{
// Row
pattern8Row();
// Col
pattern8Col();
}
private void pattern8Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
// 有効な数字を取り出す
List<int> values = new List<int>();
foreach(var data in rowlist.AnalyzeDatas)
{
if (data.IsAnalyzed())
{
continue;
}
values.Add(data.Value);
}
if(values.Count != 1)
{
row++;
continue;
}
// 対象となるマスを抽出する
List<List<BitmapData>> bitmapLists = new List<List<BitmapData>>();
List<BitmapData> bitmaplist = new List<BitmapData>();
for (int col = 0; col < colNumbers.Count; col++)
{
// マスクとマスクの間が全て塗られていたら、そこは対象としない
if (_bitmapData[row, col].IsMasked())
{
if(bitmaplist.Count != 0)
{
bool done = true;
foreach(var bitmap in bitmaplist)
{
if(bitmap.IsPainted() == false)
{
done = false;
}
}
if(done == false)
{
bitmapLists.Add(bitmaplist);
}
bitmaplist = new List<BitmapData>();
}
continue;
}
bitmaplist.Add(_bitmapData[row, col]);
}
if (bitmaplist.Count != 0)
{
bitmapLists.Add(bitmaplist);
}
if(bitmapLists.Count != 1)
{
row++;
continue;
}
int value = values[0];
List<BitmapData> bitmaps = bitmapLists[0];
if(value < bitmaps.Count && value * 2 > bitmaps.Count)
{
int paintNum = value * 2 - bitmaps.Count;
int countMax = 0;
if(paintNum % 2 == 1)
{
countMax = paintNum / 2 + 1;
}
else
{
countMax = paintNum / 2;
}
for (int count = -paintNum / 2; count < countMax; count++)
{
bitmaps[bitmaps.Count / 2 + count].Paint();
}
}
row++;
}
}
private void pattern8Col()
{
int col = 0;
foreach (var collist in colNumbers)
{
if (collist.IsAnalyzed())
{
col++;
continue;
}
// 有効な数字を取り出す
List<int> values = new List<int>();
foreach (var data in collist.AnalyzeDatas)
{
if (data.IsAnalyzed())
{
continue;
}
values.Add(data.Value);
}
if (values.Count != 1)
{
col++;
continue;
}
// 対象となるマスを抽出する
List<List<BitmapData>> bitmapLists = new List<List<BitmapData>>();
List<BitmapData> bitmaplist = new List<BitmapData>();
for (int row = 0; row < rowNumbers.Count; row++)
{
// マスクとマスクの間が全て塗られていたら、そこは対象としない
if (_bitmapData[row, col].IsMasked())
{
if (bitmaplist.Count != 0)
{
bool done = true;
foreach (var bitmap in bitmaplist)
{
if (bitmap.IsPainted() == false)
{
done = false;
}
}
if (done == false)
{
bitmapLists.Add(bitmaplist);
}
bitmaplist = new List<BitmapData>();
}
continue;
}
bitmaplist.Add(_bitmapData[row, col]);
}
if (bitmaplist.Count != 0)
{
bitmapLists.Add(bitmaplist);
}
if (bitmapLists.Count != 1)
{
col++;
continue;
}
int value = values[0];
List<BitmapData> bitmaps = bitmapLists[0];
if (value < bitmaps.Count && value * 2 > bitmaps.Count)
{
int paintNum = value * 2 - bitmaps.Count;
int countMax = 0;
if (paintNum % 2 == 1)
{
countMax = paintNum / 2 + 1;
}
else
{
countMax = paintNum / 2;
}
for (int count = -paintNum / 2; count < countMax; count++)
{
bitmaps[bitmaps.Count / 2 + count].Paint();
}
}
col++;
}
}
public BitmapData[,] Run()
{
pattern1();
while (checkPainedCount())
{
pattern2();
pattern3();
pattern4();
pattern5();
pattern6();
pattern7();
pattern8();
doMask();
}
return _bitmapData;
}
実行結果はこうなりました。

全て埋まりましたね。

解けたようです。
やったぁ。

とりあえず、環境を初期設定しました。

Auth機能を設定。
詳細はあとで作成する。
ログインするとこんな感じ。

とりあえず、体重などを記録して表示させたいと思っているので、画面はこんな感じかな。
ダッシュボードにはこんな感じで画面を作る。

クイック入力をクリックすると、ダイアログを表示する。

パパっと入力できるように。
詳細をクリックするとこんな感じの画面に遷移する。

こんな感じでリスト表示。
ここでデータ入力、編集、削除ができる。
操作はダイアログかなぁ。
ページャーもいるよね。
あとはグラフ表示を行うのにどのライブラリを使うかだな。
今後の予定としては、
こんな感じかなぁ。
ぼちぼちとりかかりますか。

前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
あれからがっつり修正しました。
具体的には、解析パターン5と6。
一度にたくさん処理していたのを、
一番最初のもの、一番最後のものの2パターンに分け、1回の処理では1つだけしか処理しない、という風にしました。
最初のループでは処理できない箇所でも次以降のループで処理できるでしょ、という考え。
詳しくはgitHubのソースコードを見て欲しい。
最終的には、こんな感じになりました。

解析完了までもう少しだが、まだ解析手法はあるはず。
これから考えます。

前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
今回はここを狙います。

ここは、数値が一つなのに対して、塗るで確定しているマスが二つありますので、この間が塗れることが分かります。
これを実装します。
// 解析パターンその7
// 数字が1個で2マス塗られている場合はその間を塗る
private void pattern7()
{
// Row
pattern7Row();
// Col
pattern7Col();
}
private void pattern7Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
if(rowlist.AnalyzeDatas.Count == 1)
{
int value = rowlist.AnalyzeDatas[0].Value;
int startCol = 0;
int endCol = 0;
for (int col = 0; col < colNumbers.Count; col++)
{
if(_bitmapData[row, col].IsPainted() && startCol == 0)
{
startCol = col;
}
else if(_bitmapData[row, col].IsMasked() && startCol != 0)
{
break;
}
else if(_bitmapData[row, col].IsPainted() && startCol != 0)
{
endCol = col;
}
}
if(startCol== 0 || endCol == 0)
{
row++;
continue;
}
for(int col = startCol; col < endCol; col++)
{
_bitmapData[row, col].Paint();
}
}
row++;
}
}
private void pattern7Col()
{
int col = 0;
foreach (var collist in colNumbers)
{
if (collist.IsAnalyzed())
{
col++;
continue;
}
if (collist.AnalyzeDatas.Count == 1)
{
int value = collist.AnalyzeDatas[0].Value;
int startRow = 0;
int endRow = 0;
for (int row = 0; row < rowNumbers.Count; row++)
{
if (_bitmapData[row, col].IsPainted() && startRow == 0)
{
startRow = row;
}
else if (_bitmapData[row, col].IsMasked() && startRow != 0)
{
break;
}
else if (_bitmapData[row, col].IsPainted() && startRow != 0)
{
endRow = row;
}
}
if (startRow == 0 || endRow == 0)
{
col++;
continue;
}
for (int row = startRow; row < endRow; row++)
{
_bitmapData[row, col].Paint();
}
}
col++;
}
}
やっていることは簡単で、最初に塗られているマスと後に塗られているマスを探し、その間を塗る、というロジックです。
まずは1周実行してみます。

想定通りに塗られていますね。
では2周目

3周目

おや?

ここをマスクされると、縦11の数字の処理に矛盾が発生しますので、この動きはおかしいですね。
いろいろ調査してみましたが、解析パターン5でマスクを行っている用です。
なので、今の解析パターン5に問題があるようです。
なので、次回なおしましょうか。(今なおしたらハマりそう)

次はこの問題を解いてみようと思います。

これまで作成したアルゴリズムを適用してみました。

まぁ、そうだろうねぇ。
でもこれならまだ頭の中に解法はある。
次回からそれを実装していきましょう。
あ、ロード処理を少し修正しました。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross


びっくりしたわ。
こういうのが届いたら、正しい物なのか調べるクセを付けておいた方がいいで。
厚生労働省のサイトを調べるとこれが見つかりました。
https://www.mhlw.go.jp/stf/newpage_03463.html
ざっくり説明すると、
過去に受け取った雇用保険料の算出方法に不正が見つかりました。
これを受け取った人は、誤って支払われた可能性があるので、内容を確認、必要事項を記入して返信してください。
少なく支払われていた場合は、その差額が口座に振り込まれます。
と、いうことなので、これは必ず返信しなければならないヤツです。
(お金がもらえる可能性があります。)

対象期間がかなりむかしなのですが、まぁ、被保険者番号が分かれば問題無いかと思います。
被保険者番号は雇用保険受給者証に記載されていますが、持っていなくても、現在所属している会社に問い合わせれば分かるみたいです。
明日投函します。
