閑古鳥

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

has_parent_pathの戻り値

www.little-cuckoo.jp

path::has_parent_path - cpprefjp C++日本語リファレンス

パスにルートパスのみが含まれていれば、ルートパスの親はルートパスと見なされてtrueが返る

ということでした。

c++ - How can a std::filesystem root path have itself as a parent? - Stack Overflow

has_relative_pathはパスにルートパスのみが含まれていれば、falseが返るので、

fs::path path(R"(/Users/Public/Documents)");
while (path.has_relative_path())
{
    std::cout << path.stem() << std::endl;
    path = path.parent_path();
}

なら良さそう。何か書く前にリファレンスを読みましょう。

ルートディレクトリでhas_parentがfalseになると思っていた

#include <filesystem>

namespace fs = std::filesystem;

int main()
{
    fs::path path(R"(C:\Users\Public\Documents)");
    while (path.has_parent_path())
    {
        std::cout << path.stem() << std::endl;
        path = path.parent_path();
    }

    return 0;
}

みたいなコードを書くと無限ループになるんですね。なんか、ルートディレクトリはさらに上にはいけないからhas_parentはfalseになると思っちゃったんですよね。

fs::path path(R"(C:\Users\Public\Documents)");
while (path != path.root_path())
{
    std::cout << path.stem() << std::endl;
    path = path.parent_path();
}

みたいにするのかな。

Pythonのpathlibも同じでした。

from pathlib import Path
print(Path(r"C:\\").parent) # => C:\

朝、意味も無くドトールにコーヒーを飲みに行ったりしている

朝起きて、わざわざ駅前のドトールまで行ってコーヒー飲んでまた家に帰ってきて始業する、みたいなことをやっています。

目覚ましと、僅かながら歩数稼ぎと、ついでに抜きがちな朝食を食べておいて痩せないようにしたい、という辺りが目的。

通勤……というか通勤電車に乗るのは嫌だけど、まったく体を動かさないのもなぁということで。特にやっててよかったとか体感できるところはありませんが、退店時に「いってらっしゃいませ」と言ってもらいながら、帰るんですけどね~と思いつつ帰路につくのはちょっと楽しいです。

体のためというならついでにラジオ体操とかやる方がよっぽど良さそうではありますが…やるか?

OpenCVのMat構造体で任意の列を処理したいとき

メモリ構造を考えるとそれはそう、という話なんですが、こういうコードを書くと実行時間に差が出ます。

cv::TickMeter ticks;
ticks.start();

for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.row(i))[0];
}

ticks.stop();
std::cout << ticks << std::endl;

ticks.reset();
ticks.start();

for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.col(i))[0]; // ここの処理はなんでもいい (この例だとreduceで良くなっちゃうけど)
}

ticks.stop();
std::cout << ticks << std::endl;
0.0058812sec // mat.row
0.343708sec  // mat.col

ずっと一次元のデータと戯れてきたため二次元とか行列は知見がなくて、こういう時どうするのが良いんでしょう。transposeしちゃう?

cv::transpose(mat, mat);
for (int i = 0; i < 1000; ++i)
{
    const auto m = cv::mean(mat.row(i))[0];
}

OpenCVのMatが強かった

C++版のMat構造体って表現力豊かだなーと思っていましたが、oepratorも色々用意されていて今まで書いてたコードも冗長だったなと気付かされました。

OpenCV: cv::MatExpr Class Reference

Matとdoubleを比較してマスクを得る…みたいなことができるので、これを使うとPythonと同じくらいのコード量で同じことができます。

Pythonというかnumpyだと、配列(画像)中の0以外の値を全部255にしたい、という場合に以下のように書けますが

mat = np.array([
    0, 1, 0,
    1, 1, 1,
    0, 1, 0])
mat[mat != 0] = 255

C++もこれだけでいけました。

cv::Mat mat = (cv::Mat_<uint8_t>(3, 3) <<
            0, 1, 0,
            1, 1, 1,
            0, 1, 0);
mat.setTo(255, mat != 0);

さすがに直接代入することはできなさそうですが、十分簡潔です。OpenCVの場合、大抵は用意されている関数を使う方がパフォーマンスも出るので、用意されている機能はゴリゴリ使う方がコードもどんどん短くなって気持ちよさそうです。

ヤクルトの宅配を頼んでみた

なんとなく、透析導入してから1日1本ヤクルトを飲んでいます。特に便秘が改善するとか体感できる何かはないのですが、量が少ないので飲み過ぎることもなくていいかな、と。

ただスーパーで10本入りのものを10日置きに買うのも面倒になってきたので、宅配を頼んでみました。これもいわゆるサブスクですか。

ヤクルトの宅配なら送料無料のヤクルト届けてネット

ネットで申し込めて、支払いはカード、週一で置き配してくれるので人との接触が一切無しで完結していて素晴らしいです。

毎週一週間分置いていってくれ、翌週の分から不要になったらやはりネットでキャンセルもできるようです。旅行に行くから一時停止とかもしやすそうで、なかなかよいUXですね。いや、本来あらゆるネットサービスがこうあるべきだと思いますが…。

ヤクルト、店売りだとNewヤクルトでシロタ株200億含んでいるみたいですが宅配用のヤクルト400だと400億、さらにヤクルト1000だと1,000億とインフラがすごいことになっています。なんかストレスも軽減されるみたいなので頼んでみたけど1週間で987円はちょっとブルジョア感ありますね。まぁ1杯500円のコーヒーとか飲んでるのに比べればまだまだですが(何が?)。

ネックスピーカー買ってみた

仕事で使っていたUSBヘッドセットが断線したのか音がうまく聞こえなくなってしまい、線がないやつなら切れることもなくなるのでは?とワイヤレスのものを買ってみました。

SRS-NB10 | アクティブスピーカー/ネックスピーカー | ソニー

Bluetooth接続、充電はUSB Type-C。

ヘッドホン付けて長時間通話することなんて滅多にないのですが、1時間以上話す場合はこういうタイプの方が耳が痛くならなくていいかも。思ったより軽くて、首にかけていても負担もありませんでした。

当たり前ですが無線になると通話中に移動とかもできるので、ちょっと離れたところにある物を取りに行くとか、なんならトイレにも行けるので(試したことはありませんが)通話中のちょっとしたストレスみたいなのからも解放されて良いですね。