メモの日々


2001年02月20日(火) iアプリ

午前中eeeに行った。dbbase動かず。

実機で試すためにjjjjjjのサーバをいじった。起動してなかったので起動した。ルーティングがおかしかったので変えた。14と15の2つのマシンがデフォルトルータになっていたのを1.1をデフォルトにするように変えた。 起動直後のルーティングテーブルはどうやって設定されているのだ。分からなかった。

[java][mobile] iアプリで通信

iアプリ作ってみた。サーバからファイルをダウンロードしようとしたけど全然うまくいかない。デバグの方法を考えないとどうしようもないなあ。実機ではデバグできない。


2002年02月20日(水) とっても眠い

会社

  • 11:35 眠くてだめだ。もうだめだ。今日は休みが多い。
  • Google今日は熊がスノボ。
  • 17:30 StrCompareが平仮名と片仮名を区別せず検索がうまくいかない。もう疲れたので帰る。後は明日だ。

テレビ/本

  • アリーマイラブ4(録画)。多分先週放送分。アリーの幻覚症状はひどくなり...。泣ける。

2003年02月20日(木) わー、ロッテのローズもう退団

生活

  • 今日は有給休暇。
  • ひたすら部屋の配置変えの続き。
  • なんとか片付きはしたかな。
  • エプソンダイレクトからペリカン便でPCが送られてきた!

[hard] EDiCube R

来ましたよ、2月14日に買ったノートPCが。

閉じた状態だと銀色で開くとネイビー。あまり高級感はないかも。液晶は解像度が1400×1050できれい。が、字が小さいので解像度を落としたい。しかし解像度を落とすとフォントが滲んでしまい使えない。えー。とりあえず1400×1050で使うしかない。

キーボードは打ちにくくはない。マウスないので不便。A4ノートを使うのは初めてだけどでかくて重い。音は静か。WindowsXPを使うのも初めてでちょっと戸惑ったり。XPは起動が早いのですね。

とりあえずWindowsUpdateしてファイアウォール機能有効にしてみたりしてMozilla1.2.1とDatulaをインストールした。これから色々ソフトをインストールし色々なMLに入りなおさねばいけないのが面倒だ。


2004年02月20日(金)

  • ちょこっとコーディングした後はひたすらテスト環境でアプリケーションのビルドとインストール。色々問題があって全然進まない。もうヘトヘト。
  • ビルドと平行してSSHでホストベース認証を実現しようとしたけれどまだうまくいっていない。パスフレーズを聞かれる。
  • なんとかインストールはした。でもまだ設定を直さないと動かないよ。それは来週だ。うへー。
  • あー、今日は食事をしていないことに気づいた。だからヘトヘトでペコペコなのだ。
  • 今日の行数:7182

やること

  • 決算

2005年02月20日(日)

[work] 確定申告書作成した

去年は手書きで作成したけど、今年は国税庁の確定申告書等作成コーナーで作ってプリンタから印刷した。こっちの方が安心できるかな。

で、税金高ーい。経費の増やしようがないんだもの。サラリーマンは優遇されてていいよなあ。

やること

  • リンク元のスリム化
  • tDiaryバージョンアップ
  • FSWikiバージョンアップ
  • オーブンレンジ用べんり棚
  • 確定申告書作成
  • ブラウンの安い電動歯ブラシ買う

2009年02月20日(金)

[life][hard] 冷蔵庫から異音がする (2)

昨日は「常時」音がすると思ったが、そうではなく稼動中の音が異常に大きくなっただけだった。

それで、冷蔵庫をよく見ていたら裏側に付いている蒸発皿が外れかけているのに気づいた。これを直すとピタリと音がやんだ。壊れてなかった!

冷蔵庫の説明書を見直すと、「蒸発皿は確実に挿入してください。(挿入が悪いと、ビビリ音が出ます。)」と書かれていた。へえ、こういう音のことを「ビビリ音」と言うのか。


2012年02月20日(月)

[c++] C++のストリームに小数点以下桁数を指定

以前ストリームに精度を指定する方法をメモしたが、小数点以下の桁数を指定する方法もメモ。std::fixed()を使えばよい。

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double d = 12.3456789;

    // [1] 精度、floatfield共未指定
    cout << "[1] "
         << d
         << endl;

    // [2] 精度のみ指定
    cout << "[2] "
         << setprecision(5)
         << d
         << endl;

    // [3] 精度とfloatfiled指定
    //     こうすると、精度の意味が小数点以下の桁数になる。
    cout << "[3] "
         << fixed
         << setprecision(5)
         << d
         << endl;

    // [4] 精度のみ指定(floatfieldの設定は引き継がれる)
    cout << "[4] "
         << setprecision(5)
         << d
         << endl;

    // [5] floatfieldをリセットして精度を指定
    cout << "[5] "
         << resetiosflags(ios_base::floatfield)
         << setprecision(5)
         << d
         << endl;
}

出力結果:

[1] 12.3457
[2] 12.346
[3] 12.34568
[4] 12.34568
[5] 12.346

2015年02月20日(金)

[vim][dev] Pyclewn 2.0がリリースされていた

以前にメモしたVim上のGDBフロントエンドであるPyclewnの2.0がリリースされたのでメモ。

とはいえ、もうずっとPyclewnは使っておらず、GDBの--tuiオプションを使うのに逆戻りしている。Pyclewnは便利なんだけどしばらく使わないと使い方を忘れてしまうんだよなあ。まあメモを読み返せば使えるはずなんだけど。今回を機に使うかも。


2020年02月20日(木)

[life][work] マイナンバーカードを使ってe-Taxで電子申告をした

青色申告特別控除で65万円の控除を受ける条件として、来年の申告からはe-Taxの使用が加わるようなので、今回初めてe-Taxを使って確定申告をしてみた。

e-TaxはICカードリーダを購入しなければならないのがネックで使っていなかったが、既にNFC対応Android端末をICカードリーダとして利用できるようになっている。

使用したもの

e-Taxの利用には色々な方法があって混乱するのだけれど、今回は次を使って行った。

  • Bluetooth対応Windows PCとEdge
  • NFC対応Android端末 (Pixel 3a)
  • マイナンバーカード

ウェブブラウザとしてEdgeかIE11を使わなければならない。PCとAndroid端末はBluetoothで接続しておく必要がある。

また、PCとAndroid端末にはそれぞれ専用ソフトウェアのインストールが必要になる。

  • PC
    • e-Tax Edge用AP
    • 事前準備セットアップ(このインストーラから色々なアプリケーションがインストールされる)
  • Android端末
    • JPKI利用者ソフト
    • e-Taxアプリ

PC用ソフトウェアについては手順通り進めていけば順にインストールを促されるのでそれに従えばいい。

申告は確定申告書等作成コーナーから行った。

はまったところ

一番困ったのは、マイナンバーカードから基本4情報を参照する画面で読取エラーになったこと。PC上で「券面事項入力補助用パスワード」を入力するよう促されて入力するのだけれど、何度やってもエラーになってしまう。途方に暮れたが、

というFAQ内に

【注意】

Android端末をICカードリーダライタとして利用する場合、券面4情報(氏名・住所・生年月日・性別)の読み取りに対応していませんので、お手数ですが、新規にマイナンバーカード方式を利用する場合は、事前にAndroid端末から以下のとおり、操作してください。

とあるのを見つけて解決できた。Androidのe-Taxアプリを使って事前登録が必要だったのだ。PC上の操作画面にはそのような注意は表示されていなかった(と思う)ので、全員困ってしまうと思うがどうなのだろう。

感想

ほかにも各種ソフトウェアが不安定だったりわかりにくかったり、パスワードを何度も入力させられてうんざりするなど、かなりイライラさせられた。

でも、何とか電子申告できて達成感はある。


2025年02月20日(木)

[c++] C++の正規表現メモ

<regex>の使い方をメモ。

正規表現オブジェクトとそれを使った文字列に対するマッチ処理について以下をメモする。

  • std::basic_regex<CharT> (正規表現)
  • std::regex_match() (全体マッチ判定)
  • std::regex_search() (部分マッチ判定)
  • std::regex_iterator<Iterator> (部分マッチ結果の列挙)
  • std::regex_token_iterator<Iterator> (部分マッチ結果のサブマッチの列挙)

これら以外に文字列の置換機能もあるがそれについては割愛する。

std::basic_regex<CharT> (正規表現)

正規表現はstd::basic_regexクラステンプレートを使って表現する。

std::regex re{R"(abc (\d\d).(\d\d))"};
  • std::regex は std::basic_regex<char> の別名であり、通常はこれを使うだろう。
  • 「R"(...)"」部分は生文字リテラルであり、正規表現を書く際にはこの記法が役に立つ。
  • 使える正規表現はデフォルトではECMAScript互換。コンストラクタで構文を切り替えることもできる。
  • ひらがななどの非ASCII文字のサポートは期待できない模様(よくわかっていない)。

std::regex_match() (全体マッチ判定)

std::regex_match()を使うことで、文字列全体が正規表現にマッチするかどうかを判定できる。

void regex_match1()
{
    static const std::regex re{R"(\w+ \d+/\d+/\d+)"};
    const bool is_matched1 = std::regex_match("hello 2025/01/02", re);
    const bool is_matched2 = std::regex_match("hello world 2025/01/02", re);

    std::cout << "regex_match1" << std::endl;
    std::cout << is_matched1 << std::endl; //=> 1
    std::cout << is_matched2 << std::endl; //=> 0
}
  • 文字列の一部分ではなく全体がマッチする必要があることに注意。

regex_match()の引数にstd::match_resultsオブジェクトを指定すると、正規表現で指定したキャプチャグループ部分にマッチした内容を参照することができる。

void regex_match2()
{
    static const std::regex re{R"(\w+ (\d+)/(\d+)/(\d+))"};
    std::cmatch m;
    const bool is_matched = std::regex_match("hello 2025/01/02", m, re);

    std::cout << "regex_match2" << std::endl;
    std::cout << is_matched << std::endl; //=> 1
    std::cout << m[0] << std::endl;       //=> hello 2025/01/02
    std::cout << m[1] << std::endl;       //=> 2025
    std::cout << m[2] << std::endl;       //=> 01
    std::cout << m[3] << std::endl;       //=> 02
}
  • std::cmatch は std::match_results<const char*> の別名。
    • std::match_resultsクラステンプレートにはこのようなエイリアスがいくつか定義されている。が、std::string_viewを使う場合は std::match_results<std::string_view::const_iterator> などとしないといけないようだ。
  • 上記の m[0] などで得られるのは単なる文字列ではなくstd::sub_matchオブジェクト。std::match_results は std::sub_match を要素に持つコンテナだと考えることができる。

std::regex_search() (部分マッチ判定)

std::regex_search()を使うことで、文字列が正規表現にマッチする部分を持つかどうかを判定できる。

void regex_search()
{
    static const std::regex re{R"(\w+ (\d+)/(\d+)/(\d+))"};
    std::cmatch m;
    const bool is_matched = std::regex_search("hello world 2025/01/02", m, re);

    std::cout << "regex_search" << std::endl;
    std::cout << is_matched << std::endl; //=> 1
    std::cout << m[0] << std::endl;       //=> world 2025/01/02
    std::cout << m[1] << std::endl;       //=> 2025
    std::cout << m[2] << std::endl;       //=> 01
    std::cout << m[3] << std::endl;       //=> 02
}

std::regex_iterator<Iterator> (部分マッチ結果の列挙)

std::regex_iteratorクラステンプレートを使うと、std::regex_search()を繰り返し呼び出し、それぞれの呼び出しに対するマッチ結果(std::match_results オブジェクト)を順番に得ることができる。

void regex_iterator()
{
    static const std::regex re{R"(\w+ (\d+)/(\d+)/(\d+))"};
    const std::string s = "hello world 2025/01/02 japan 1/2/3/4/5/6/7/8/9";

    std::cout << "regex_iterator" << std::endl;
    for (std::sregex_iterator it{s.begin(), s.end(), re}, end;
        it != end;
        ++it)
    {
        std::cout << (*it)[0] << std::endl;
        std::cout << (*it)[1] << std::endl;
        std::cout << (*it)[2] << std::endl;
        std::cout << (*it)[3] << std::endl;
        std::cout << "---" << std::endl;
    }
}
regex_iterator
world 2025/01/02
2025
01
02
---
japan 1/2/3
1
2
3
---
  • sregex_iterator は regex_iterator<string::const_iterator> の別名。

std::regex_token_iterator<Iterator> (部分マッチ結果のサブマッチの列挙)

std::regex_token_iteratorクラステンプレートは regex_iterator に似ているが、マッチ結果ではなくサブマッチ(std::sub_match オブジェクト)の内容を直接得られるところが違う。

void regex_token_iterator()
{
    static const std::regex re{R"(\w+ (\d+)/(\d+)/(\d+))"};
    const std::string s = "hello world 2025/01/02 japan 1/2/3/4/5/6/7/8/9";

    std::cout << "regex_token_iterator" << std::endl;
    for (std::sregex_token_iterator it{s.begin(), s.end(), re, {1, 3}}, end;
        it != end;
        ++it)
    {
        std::cout << *it << std::endl;
    }
}
regex_token_iterator
2025
02
1
3
  • sregex_token_iterator は regex_token_iterator<string::const_iterator> の別名。
  • コンストラクタの4番目の引数で、何番目のサブマッチを列挙するかを指定する。ここに -1 を指定することでマッチしなかった部分を列挙することもできる。