閑古鳥

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

C++で標準出力

適当にググって見ると、色周りは以下のブログが分かりやすかったです。まぁ情報としては先日のと同じなんですが。

jafrog.com

この辺のコードとか定数で定義されていると楽なんだけどなぁ、と思ったけどそうもいかないか。

面白みはありませんが、とりあえず書いてみるとこんな感じですか。

#include <iostream>
#include <string>
#include <Windows.h>

constexpr const char* ESC = "\x1b";
constexpr const char* CSI = "\x1b[";

bool EnableVTMode()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

int main()
{
    if (!EnableVTMode()) {
        return -1;
    }
   
    for (auto i = 1; i < 7; ++i) {
        std::cout << CSI << std::to_string(30 + i) << "m"; // 文字の色を変更
        std::cout << "Hello World";
        
        Sleep(500);

        std::cout << "\r";          // カーソルを先頭に戻す
        std::cout << CSI << "K";    // 行末まで出力した文字列を削除
    }

    return 0;
}

f:id:wata_d:20201229200900g:plain

どうでもいいけれどC++CLIという単語を組み合わせるとCommon Language Infrastructureの方が出てきてしまって具合が悪いですね。

C++の予習

十年ぶりくらいにC++もちゃんと(?)触れることになりそうなので、C++も予習しています。日本語の情報が充実していて素晴らしいですね。

cpprefjp.github.io

cppmap.github.io

functionやbindがBoostなくても普通に使えるようになったの便利ですね。autoやinitializer_listのおかげで結構楽な書き方もできるし、今風の言語として使っていけそうです。

CLIの予習

これまでずっとGUIばかりやっていましたが、来年はCUIもやっていくことになりそうなのでとりあえずMS Docsなど眺めています。

docs.microsoft.com

標準出力にエスケープシーケンス(\x1b)を渡すことで文字の色を変えたりすでに出力している文字を消したりできる。プログレスバー的なのはこれで実装しているわけですね(サイトによっては \033だったりもしますが、こちらは8進数で意味は同じ)。

PowerShellだとデフォルトでこれに対応していないようですが、SetConsoleModeでENABLE_VIRTUAL_TERMINAL_PROCESSINGを設定してあげれば良いようです(SamplesのEnableVTModeがまんま流用できる)。

コードの一覧はWikipediaの方が見やすくまとまっているかも。

en.wikipedia.org

wena 3購入

wena.jp

機能的にはよくあるスマートウォッチですが、時計そのものが付属しておらず、他の好きな時計を取り付けられるというコンセプトが面白くて気になっていたもの。3でついにSuicaに対応したこともあり、ポチってしまいました。ちなみに時計を付けずにこれ単体で使えるバージョンもあります。

Suicaに対応したとはいえ、定期は未対応。スマホで使っているモバイルSuicaと連動もできず、別に財布を持つ形になるのでまだ微妙なところではありますが、コロナ禍で定期を買わなくなってしまったのでこれはこれでアリかも、ということになりました(自分の中で)。財布どころかスマホも出さず、手首をかざすだけで改札を通ったり自販機から飲み物を買えるのはかなり気分がいいです。フリーパス!(フリーではない)

メタルバンドは時計の取り付け自体は確かに簡単にできるのですが、バンドの長さ調整は時計修理店にお願いしてね、という投げっぷりで結構ハードル高いです。レザーの方が手軽かな…。時計修理店は近所にもあるみたいでしたが、バネ外し棒というのが数百円で買えたのでこれで自力で調整しました。手先が不器用なのでどうかと思いましたが、割となんとかなりました。

Alexaも搭載されていますが、マイクだけでスピーカーはないので回答は文字で返ってきます。特に思いつきませんがテキストで答えが欲しいときにはいいのかも。イヤホンもGoogle Assistant対応しているので、頼る機会は少なそう。個人的にはこの辺、眼鏡(スマートグラス)が出てくれば音声もテキストも対応できていいんじゃないかなと思っていますが、まだかかりそうですね。

自分は利き手に時計を付けるので、手首側に本体のあるタイプだとPCのマウスを使う時にちょっと邪魔かもしれません。いや、買う前に気付けよって話ですが…。時計にもこだわりがないので、Rubberの方でもよかったかもなぁ。こっちのが安いし。このベルトによる値段差や、時計のヘッドの方が本体より高い状況を見ると、デジタルって安く根付けされてるよなって思います。ちなみにベルトはアクセサリーとして別売りしているので、後から他のタイプに切り替えることも可能です。カスタマイズできるおもちゃっていいですね。

JavaScriptのDateクラスで日にちの増減を行う

JavaScriptのDateクラスにはAddとか、AddDaysのようなメソッドがありません。moment.jsなどを入れるとかTemporalを試してもいいのですが、手軽にDateだけでなんとかしたい。

DateにはsetDateなどset系のメソッドがありますが、ここに負の値などを入れてもいい感じに計算してくれるのでこれで代用できるようです。

const date = new Date(2020, 0, 1); // 2020-1-1
date.setDate(date.getDate() - 1);
// date = 2019-12-31

setDateはDateインスタンスの現在時刻から日付だけを変更するもので、getDateの戻り値と任意の日数を足してあげればAddDaysみたいなことができます。

昔は日付の計算でよく月末の翌日を単純に日付だけ足し算でやって8月32日になってしまったり、とかありがちでしたが、単純にnew Date(2020, 8, 32)と書いても9/1になってくれるようで優しいですね。.NETだと例外になるみたいですが、果たしてどちらが親切なのか(ケースバイケースか)。

エネルギー源としてのようかん

近所のお店にミニ羊羹(9個入り380円)が売られているのですがこれエネルギー源として結構いいかもしれない。1個40gで110kcalくらいある。秒で食べられるし、意外と水がなくても大丈夫。リンもせいぜい20mgと少なめ。

カロリー摂れてないなって時のチートアイテムとしてカロリーメイトを利用していましたが、これの1本あたりのカロリーとリンの値が大体同じ。その他の栄養を無視してよければ、こちらの方が食べやすいので利用しやすいです。カロリーメイトも別にまずくはないけれど、4本も食べるとなんかノルマをこなしている感じになってくるんですよね……。水も必要だし。

洋菓子も好きなんですけど洋菓子は大体乳成分入りでリンが気になりますが、和菓子は砂糖の塊なので透析患者の栄養源としてはこちらの方が良いのかもしれない(笑)

ポイントに生活を支配される

この頃docomoが、他との競争もあり毎月dポイントの還元率が上がる施策を出しています。最近は月替わりの「買い物ラリー」とか。

10月お買物ラリー|d払い - かんたん、便利なスマホ決済

ローソンやファミリーマートなど、指定したお店でdポイントカード(バーコード)を提示した上でd払い(QR/バーコード決済)を使って支払いを行うとdポイントが多めにもらえるというもの。

このdポイントカード見せた上でd払いを使うというの、異なる2つのバーコードを見せる必要があり、非常に面倒くさい。iDやVISAのタッチ決済も使えるカードを持っていると余計に。d払いアプリはdポイントカードのバーコードも出せるから、スマホを見せるだけで支払いは完結できるのだけど、このアプリも90日置きにログアウトするみたいな仕様があり会計時に発動するとたいへんなことになる。いきなり開かなくなる財布なんて誰が使うんだ(私です)。

さらに利用するお店もd払いに対応したお店ならどこでもキャンペーン対象というわけではなく、docomoの指定したお店になるので、セブンイレブンではなくローソンにしようとか、そういう選択が生じる。ポイントに生活を支配されている。

しかし千単位のポイントがあるとカフェで気軽にコーヒー飲めちゃうのでそこそこおいしいんですよね……。コンビニはまだしも東急ストアとか、近所にあるスーパーが対象になると普段使いの買い物でポイントが返ってくるので、そんなに悪い話でもないし。

口座に5000兆円あれば、こんなの意識しなくて済むのになぁ~!