閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

無題

anond.hatelabo.jp

ニンテンドースイッチのゲーム50本遊んで感想書いたのでまとめ(23〜47) 探偵..

こちら、すばらしいまとめですね。アドベンチャーゲームがたくさん紹介されています。自分もプレイ済みのゲームが一部含まれていて、それゆえ「好みが合いそう!」とピンときたので参考にして色々やってみたいな、と思いました。レインコードはやらなきゃなーと思っていましたし。

ただ最近はゲーム機起動するにもエネルギーが必要で、どこまでやれるかは分かりませんが…。うーん、ADVも中高生の頃はやりまくっていたんだけどなあ。

OpenCV(C++)のcv::Matから一部を切り抜いて(ROI)フィルタをかける際に、元画像の画素値も参照される

PythonC++で、同じような実装をしたつもりが結果が異なるので少しハマりました。

# Python
import cv2
import numpy as np

mat = np.zeros((100, 100), np.uint8) + 100
cv2.rectangle(mat, (20, 20), (80, 80), 128, cv2.FILLED)
roi = mat[20:80, 20:80]
mat[20:80, 20:80] = cv2.blur(roi, (11, 11))
// C++
cv::Mat mat = cv::Mat1b::zeros(100, 100) + 100;
cv::rectangle(mat, cv::Rect(20, 20, 60, 60), cv::Scalar(128), cv::FILLED);
cv::Mat roi = mat(cv::Rect(20, 20, 60, 60));
cv::blur(roi, roi, { 11, 11 });
// この時点のmatが、Pythonと異なる

まあこの例だと一目なんですが、実際はもう少し入り組んでいたので最小化するのに苦労しました。roiにだけ処理したいのですが外側の画素値も見ちゃうんですね。それはそうか、という気もするような、しないような。本能的にコピーを避けようとしてしまうのですが、Pythonと同じ結果にしたければ、コピーすれば良いです。

cv::Mat mat = cv::Mat1b::zeros(100, 100) + 100;
cv::rectangle(mat, cv::Rect(20, 20, 60, 60), cv::Scalar{128}, cv::FILLED);
cv::Mat roi = mat(cv::Rect(20, 20, 60, 60)).clone();
cv::blur(roi, roi, { 11, 11 });
mat(cv::Rect(20, 20, 60, 60)) = roi;

逆にC++の元の実装と同じ挙動をPythonで実現したくなったら、結構面倒そうですね。

ちなみにblurのboderType引数にBORDER_ISOLATEDというものがありますが、これを使っても外側の値は参照されるようです。コメントにはdo not look outside of ROIと書いてあるんですが、これはまた暇なときにソースを読んでみようかな。

はてなブックマークのアクティビティ

Androidアプリ版に何気に実装されているんですね。まあ、見てどうするというものでもないですが…。

昔PC版というか、Webページの方にもあった気がしたけどなくなっちゃったのかな? カレンダーとかあったような…。

リモートワークになったからかTwitter連携が弱くなったからか、徐々にブクマ数が減っているようです。スマホアプリ自体は毎日開いていてニュースサイト代わりにしているのですが、フリック入力が遅い方なので減っちゃっているのかなぁ。

いつまで生きるのか、みたいなプランが何もない

病気になっていつまで生きられるか分からないしiDeCoはいいかな…という気持ちと、老後が不安だし2000万くらいは貯めておこうという気持ちがあり、どっちやねんと思いつつぼんやり生きている。まあ、そんなに稼いでいるわけではないからNISAで十分ではあるかもしれない。新NISAも始まるのでもうこれだけで良いでしょう。

血液透析患者の予後については楽観的な話も悲観的な話も、ネット上にはなんでもあるけれど日本の透析医療は移植が(法的に)弱い分進んでいて30年以上透析している人も普通にいるし、当時よりは今の方が進歩しているものもあるので合併症などなければ人並みには生きるんじゃないかという気もしている。なんやかんや9年くらい続けていて、最近はそんなに変化はなさそうですが。電解水透析という言葉は出てきているけどこれは利用していないし。

仮に長生きしても「老後の楽しみ」なんかそんなにないだろうという気もしている。体の自由は常に今が一番効くはずなので、やりたいことは今やるべきなのでしょう。食事に限っては、将来的に腎移植ができて食事制限がなくなる可能性はあるけれど、その頃は胃が終わっているかもしれないし…。宵越しの銭は持たぬとまではいかないものの、貯め込んで使わずに終わるよりはそれなりに使っていく方がいいのだろうなぁ。

うーん、まとまりがない。結局行き当たりばったりですな。

C++でメモリがコピーされるのかされないのか、意識せずにハマることがある

たとえばOpenCVで以下のようなコードを書くと落ちるのは、分かるんですが、分からないときがある。

cv::Mat GetImage() {
    std::vector<uint8_t> buf = ...;
    return cv::Mat(128, 128, CV_8U, buf.data());
}

const auto mat = GetImage();
cv::mean(mat); // 死

このくらい近ければぱっと見でも分かるのですが、実行時エラーになるので距離があると悩んでしまったり。cv::Matのこのコンストラクタは渡されたバッファをコピーしないので、関数を抜けると参照先(buf変数)が解放されてしまうというやつ。

機械学習ライブラリとかでもデータ渡してテンソルを作るぞ!みたいなクラスで同じ事をやって、計算中に落ちてあれーってなったり。

毎回コピーするような実装だとパフォーマンスも気になってしまうのでそれはそれで…ということで、C++難しいです。マニュアルをちゃんと読みなさいという話ではあります。

PS5購入

FF16もそろそろ出るしなーということで購入。ちょっと前まではなかなか入手できず、抽選当てないといけないとかだったと思いますが、今は通販でも普通に買えるんですね。SwitchのProコントローラの方が品薄かも。

注文したら24時間経たずに届いてしまい、なかなかすごい時代だなと思いました(持続可能ではなさそうで、近々もう少し時間かかるようにはなりそうですが)。来月末までにセットアップしなくては。PS4のゲームも遊べるならLOOP8をこれでやるのもアリかな。

Webサービス(サブスク)をdocomo経由で登録する

Netflixdocomo経由で契約するとお得ですよーみたいな広告を見て、そういえば最近あまりNetflix見てないな…と思い、いったん契約を解除しました。

で、どうもSpotifyも似たようなものがあるようなのでそちらは契約を切り替えてみました。

ギガホ・ahamoならおトクが続く!爆アゲセレクション

切り替えのために一度Spotifyを解約(FREEプラン)に変更してから申し込みをする必要があるということで、そのようにしたらアプリが毎日「プレミアムに戻りませんか?」と言ってきて鬱陶しかった。この辺商売としては何も言わないわけにもいかない、ということなんでしょうし、1日1回ならまぁ我慢できるかな…という感じですが、広告では儲からないんですかねぇ。

しかしポイ活とか、5000兆円あればいちいち考えなくて良くなるのにな~。まあこの手の趣味は金持ちの方が効率的にやっていそうな気がしなくもないですが。金持ちほどケチというか、ケチだから金持ちになるのか…。

あとは前に一瞬利用していたDisney+も作品が増えているので暇ができたら見てみるかな。あと、Youtube広告が気になってきたのでこのプレミアムか…うーん。ニコニコのプレミアムはずっと続けているのに、ここで躊躇うのはなんなんだろうなw