早く流れる川で

雑に書き留めた何か

アリスとボブとみんな

発端

A から Z までの適当な名称が欲しくなりました。

アリスとボブ
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AA%E3%82%B9%E3%81%A8%E3%83%9C%E3%83%96

イイですね!

名称列挙

Alice
Bob
Carol
Charlie
Dave
Ellen
Frank
Issac
Ivan
Justin
Mallory
Marvin
Mallet
Matilda
Oscar
Pat
Peggy
Plod
Steve
Trent
Trudy
Victor
Walter
Zoe

一部のアルファベットの名称が無い

おやおやおや?
次のアルファベットの名称が無いことに気づきました。

  • G
  • H
  • K
  • L
  • N
  • Q
  • R
  • U
  • X
  • Y

適当な名称をあてる

Gari
Haiku
Katana
Last
Ninja
Quantum
Ramen
Udon
Xanadu
Yakitori

日本語がそのまま外国で通じるらしい言葉をあてました。
L Q X はユルシテ。
(Xanadu 行きたいな)

名称列挙その2

Alice
Bob
Carol
Charlie
Dave
Ellen
Frank
Gari
Haiku
Issac
Ivan
Justin
Katana
Last
Mallory
Marvin
Mallet
Matilda
Ninja
Oscar
Pat
Peggy
Plod
Quantum
Ramen
Steve
Trent
Trudy
Udon
Victor
Walter
Xanadu
Yakitori
Zoe

名称を出力するだけのもの

github.com

その他

  • Visual Studio Community 2022を使いたい
    • 利用している PC の容量に余裕が無い
  • 仕事(働き口)が欲しい

C#で文字認識(Windows.Media.Ocr.OcrEngine)を試す

GitHub

今回、作成したもの。

github.com

結果から

画像から文字を認識するのは想像以上にできませんでした。
今回は現実のものがサンプルだったので良い結果を得られなかったかもしれません。
もし、サンプルがPC画面上に表示している文字(画面キャプチャ)だったらしっかり文字認識をしていたかもしれません。
…画面キャプチャを試してみたらしっかり認識しました…おーい!!!
目的?はレシートの文字認識だから何とも言えないですな。

画面キャプチャの文字認識の結果

発端

  • 何となく興味があった
  • 以前、家計簿をつけていたがレシートから転記するのが面倒だった
    • 画像から文字認識できれば転記の負荷が減るのでは?!
  • C#WPFの勉強
  • 就職活動のアピールになれば…

参考

本当にありがとうございます!

開発環境など

文字認識対象

FF14プリペイドカード表面

  • カラー、グレースケール、白黒の3種類の画像を用意した
    • FF14プリペイドカード表面・カラー画像
    • FF14プリペイドカード表面・グレースケール画像
    • FF14プリペイドカード表面・白黒画像
  • カラーと白黒は語句単位で5枚の画像を用意した
    • FF14プリペイドカード表面・カラー個別画像1
    • FF14プリペイドカード表面・カラー個別画像2
    • FF14プリペイドカード表面・カラー個別画像3
    • FF14プリペイドカード表面・カラー個別画像4
    • FF14プリペイドカード表面・カラー個別画像5
    • FF14プリペイドカード表面・白黒個別画像1
    • FF14プリペイドカード表面・白黒個別画像2
    • FF14プリペイドカード表面・白黒個別画像3
    • FF14プリペイドカード表面・白黒個別画像4
    • FF14プリペイドカード表面・白黒個別画像5

文字要素

カードにある文字要素は次の5つ。

  1. SQUERE ENIX
  2. 30日利用券/¥1,628
  3. ファイナルファンタジーXIV
  4. FINAL FANTASY(R) XIV
  5. ONLINE

文字認識前予想など

  • 小さい文字の認識はできるのか?
    • 文字要素の1と2、4の一部が小さい
    • 2は30日利用券/が小さい
      • ¥1,628は読み込めそう
    • 4は(R)だけが特に小さい、認識は厳しそう
  • 認識文字の種類を日本語にしているから、英語でも試す必要はありそう
    • 試してみたが大きな変化は無かった

カラー画像の結果

FF14プリペイドカード表面・文字認識結果

SQUARE ENIXÉ*E
3 。 日 利 用 券 / ¥ 1.628

カラー個別画像の結果

1, 3, 4, 5枚目

認識できなかった。

2枚目

30 日 利 用 券 / \ 1 , 628 '

グレースケール画像の結果

認識できなかった。

白黒画像の結果

FF14プリペイドカード表面・白黒画像の文字認識結果

30 日 利 用 券
フ ァ イ ナ ル フ ァ ン タ ジ ー Ⅵ
、 Ⅲ 影 躡 IIV

白黒個別画像の結果

1, 3, 5枚目

認識できなかった。

2枚目

30 日 利 用 券

4枚目

Ⅱ 盟 、 F 贐 Ⅳ

プリペイドカード画像の文字認識の感想

  • 想像以上に文字認識ができていない
    • 黒印字されている文字が文字認識には最良か?
  • 大きい文字は文字として認識していない
    • 認識できる文字の大きさに上限があるのか?
  • 漢字やカタカナの間に半角スペースが入る
    • 半角スペースを削除する必要がある
  • 文字が淡い色使いだと文字として認識しない
    • 文字色と背景色に明確な違いがあれば認識する?

スーパーマーケットのレシート

  • 一部の要素を塗りつぶしたレシート画像を用意した

レシート画像

レシート画像の文字認識の結果

レシート画像の文字認識結果

・ カ ネ ス 工
受 付 時 関
9 : OO
20 : 00
お 問 合 セ ン タ ー 0120 一 922-640
く 領 収 害 >
2023 年 6 月 5 日 ( 月 )
お 会 計 券
0002 コ ク ナ イ サ ン タ ベ ル ! \ 99
員 分 類 一 括
3 %
! ¥ 110
員 分 類 一 括
3 %
! \ 137
員 分 類 一 括
3 %
! \ 77
員 分 類 一 括
3 %
! \ 97
員 分 類 一 括
3 %
! \ 97
員 分 類 一 括
3 %
! ¥ 97
員 分 類 一 括
3 %
員 分 類 ・ 一 括
3 %
0007 ノ ウ コ ウ ヰ ヌ
! \ 114
( 2 個 x @57)
会 員 分 類 一 括 3 %
! \ 107
会 員 頁 一 括 3 %
0013 プ ル ガ リ ア ヨ ー グ
! \ 147
会 員 分 類 一 括 3 %
小 計
¥ 1 , 123
\ 1 , 123 )
( 外 % 対 象 額
外 税 額
\ 90
買 上 点 数
12 点
言 十
¥ 1 , 213
お 予 頁 り
¥ 1 , 213
( 消 費 税
お 釣 り
\ 0
轆 兇 率 : 無 印
標 準 税 率 ・
会 会 会 会 会 会 会 会
\ 90 )

レシート画像の文字認識の感想

  • 「OO」「0」、なぜ異なる?
  • 「長音」「ハイフン」「漢数字の一」との見分けがつかない
  • 領収書は「害」だった?
  • 空白を何かしらの文字で埋めれば改行が発生しないのでは?
    • 文字間の空白が多いと改行している
  • 半角カタカタは文字認識しない?
  • 文字認識する行間が存在する?
    • 行頭にも問題があったりするのか??
  • 「会 会 会 会 会 会 会 会」あー誰かに会いたいな!
    • 「会員分類一括」で認識できなかった「会」か?
    • 8行分だから数は合っているが…

編集したスーパーマーケットのレシート

  • 少し粘る、少し編集したレシートを用意し、文字認識をさせてみた。
    • 「あ」「い」の書体はメイリオ、「う」「え」はMS明朝、「え」は太字にした

レシート画像2

レシート画像2の文字認識の結果

レシート画像2の文字認識結果

・ カ ネ ス 工
受 付 時 関
9 : OO
20 : 00
お 問 合 セ ン タ ー 0120 一 922-640
く 領 収 害 >
2023 年 6 月 5 日 ( 月 )
お 会 計 券
0002 コ ク ナ イ サ ン タ ベ ル ! \ 99
員 分 類 一 括 3 % あ あ あ あ あ ー 2
員 分 類 一 括 3 %
い い い い い
- ! \ 137
つ つ つ つ つ つ
員 分 類 一 括 3 %
ー \ 77
員 分 類 一 括 3 %
ー \ 97
員 分 類 一 括 3 %
ー \ 97
員 分 類 一 括 3 %
` ¥ 97
員 分 類 一 括 3 %
員 分 類 ・ 一 括 3 %
0007 ノ ウ コ ウ ヰ ヌ
! \ 114
( 2 個 x @57)
会 員 分 類 一 括 3 %
! \ 107
会 員 頁 一 括 3 %
0013 プ ル ガ リ ア ヨ ー グ
! \ 147
会 員 分 類 一 括 3 %
小 計
¥ 1 , 123
\ 1 , 123 )
( 外 % 対 象 額
外 税 額
\ 90
買 上 点 数
12 点
言 十
¥ 1 , 213
お 予 頁 り
¥ 1 , 213
( 消 費 税
お 釣 り
\ 0
轆 兇 率 : 無 印
標 準 税 率 ・
会 会 会 会 会 会 会 会
\ 90 )

レシート画像2の文字認識の感想

  • 空白を文字で埋めて1行と見なさせる効果はあるにはある
    • 何故、「キャベツ」を認識しないのか?
    • 初回から認識していなかったので行間の問題だろうか
  • 「う」が「つ」と認識している
    • 認識させる文字はしっかり表示・印字していないとダメっぽい
    • 認識しやすい文字がありそう?
      • 最初は「@」で試したがダメだった
      • 文字サイズを上げればいけるかも?

その他に得た何か

  • プリペイドカードやレシートはスキャナでスキャンしたものです
    • スキャン時の設定で解像度(DPI)は300が望ましいです
    • DPIが300未満ですと、文字のどこかに欠けが発生しているケースがありました
      • そもそも文字認識の結果が悪すぎてそれどころじゃない
  • 手書きの文字が載った画像を文字認識させてみましたが駄目でした
    • ボールペンで書いた文字は認識できませんでした
    • ネームペンで書いた文字は認識できましたが、誤認識でした
      • 綺麗な字を書けば正しく認識するかもしれません
      • ちなみに書いた文字は「数字の1~9」です
        • 数字の1~9、12478が「/ ユ イ ク ま」と認識されました
          • 少し斜めに描いたのが問題かもしれません
          • 何かの暗号に使えますね!!
  • 認識する文字を日本語から英語に変換したらOCRエンジンがNullになりました
    • 英語の言語パックをインストールしていなかったのが原因でした

C#, DateTimeのあれこれ

はじめに

久々に C# に触れている。
DateTime の使い方がおぼろげ?なので備忘録として残す。

開発環境

プロジェクト

  • コンソールアプリ
    • .NET Core 3.1
    • プロジェクト名は TryDateTime

あれこれ

  • 初期値
  • 初期化
  • AddXX() を用いた増減
  • 実行時の日時が知りたい
  • 月末を得たい
  • 日時同士の計算(差引のみ)
  • 表示形式の変更
  • 差引した日時の合計

初期値

using System;
using System.Diagnostics;

namespace TryDateTime
{
    class Program
    {
        static void Main(string[] args)
        {
            Sample1();
        }

        public static void Sample1()
        {
            var datetime = new DateTime();

            /*
                実行結果
                0001/01/01 0:00:00
            */
            Debug.WriteLine(datetime);
        }
    }
}
  • これ以降は SampleN() 内のコードを載せる
    • 1 <= N && N <= ...
  • System.DiagnosticsDebug.WriteLine() を使いたかったから追加した
    • 実行結果をコピペしたい

初期化

        public static void Sample2()
        {
            var datetime1 = new DateTime(1, 2, 3);

            // 0001/02/03 0:00:00
            Debug.WriteLine(datetime1);

            var datetime2 = new DateTime(1, 2, 3, 4, 5, 6);

            // 0001/02/03 4:05:06
            Debug.WriteLine(datetime2);
        }
  • 年、月、日、時、分、秒を指定する
  • ミリ秒も指定できる
  • ticks やら DateTimeKind を使って初期化もできる
  • 個人的には載せたやつばかり使っている

AddXX() を用いた増減

        public static void Sample3()
        {
            var datetime = new DateTime();
            datetime = datetime.AddYears(1);

            // 0002/01/01 0:00:00
            Debug.WriteLine(datetime);

            datetime = datetime.AddMonths(2);

            // 0002/03/01 0:00:00
            Debug.WriteLine(datetime);

            datetime = datetime.AddDays(3);

            // 0002/03/04 0:00:00
            Debug.WriteLine(datetime);

            datetime = datetime.AddHours(4);

            // 0002/03/04 4:00:00
            Debug.WriteLine(datetime);

            datetime = datetime.AddMinutes(5);

            // 0002/03/04 4:05:00
            Debug.WriteLine(datetime);

            datetime = datetime.AddSeconds(6);

            // 0002/03/04 4:05:06
            Debug.WriteLine(datetime);

            datetime = datetime
                .AddYears(-1)
                .AddMonths(-2)
                .AddDays(-3)
                .AddHours(-4)
                .AddMinutes(-5)
                .AddSeconds(-6);

            // 0001/01/01 0:00:00
            Debug.WriteLine(datetime);
        }

実行時の日時が知りたい

        public static void Sample4()
        {
            var datetime = DateTime.Now;

            // 2022/04/21 23:59:30
            Debug.WriteLine(datetime);
        }
  • よい子は寝ましょう

月末を得たい

  • ↓駄目な例です
        public static void Sample5()
        {
            var now         = DateTime.Now;
            var last_day    = new DateTime(now.Year, now.Month + 1, 1).AddDays(-1);

            // 2022/04/30 0:00:00
            Debug.WriteLine(last_day);
        }
  • ↑駄目な例です
  • now が12月だと次の例外が発生する
System.ArgumentOutOfRangeException: 'Year, Month, and Day parameters describe an un-representable DateTime.'

かなり意訳すると13月って何?無理!

        public static void Sample5A()
        {
            var now = new DateTime(2022, 12, 12);
            var last_day = new DateTime(now.Year, now.Month, 1).AddMonths(1).AddDays(-1);

            // 2022/12/31 0:00:00
            Debug.WriteLine(last_day);
        }

これなら大丈夫、これを書きたかった。
12月に + 1 したらアウトじゃないか?って思ったら案の定例外だった。

日時同士の計算(差引のみ)

        public static void Sample6()
        {
            var datetime_a = new DateTime(2022, 4, 21, 9, 0, 0);
            var datetime_b = new DateTime(2022, 4, 21, 18, 0, 0);
            var result = datetime_b - datetime_a;

            // 09:00:00
            Debug.WriteLine(result);
        }
  • 結果は TimeSpan 型

表示形式の変更

        public static void Sample7()
        {
            var now = DateTime.Now;

            // 2022-04-22 01:28:49
            Debug.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));

            // 2022年04月22日(金) 01時28分49秒
            Debug.WriteLine(now.ToString("yyyy年MM月dd日(ddd) HH時mm分ss秒"));
        }

差引した日時の合計

        public static void Sample8()
        {
            var times = new List<TimeSpan>
            {
                new DateTime(2022, 4, 1, 18, 0, 0) - new DateTime(2022, 4, 1, 9, 0, 0),
                new DateTime(2022, 4, 2, 18, 0, 0) - new DateTime(2022, 4, 2, 9, 0, 0),
                new DateTime(2022, 4, 3, 18, 0, 0) - new DateTime(2022, 4, 3, 9, 0, 0)
            };

            var result = new TimeSpan(times.Select(x => x.Ticks).Sum());

            // 1.03:00:00
            Debug.WriteLine(result);
        }
  • 結果は27時間 = 1日と3時間
  • Ticks は long 型
    • あれ?最大値を超えたら例外が発生するのでは?
    • long.MaxValue = 9223372036854775807
    • 1時間 = 36000000000
    • long.MaxValue / 36000000000 = 256204778 hours
    • 256204778 hours / 24 hous = 10675199.0833... days
    • 10675199 days / 365 days = 29247.12054794521 years
    • 29247年の集計ってなかなか無さそう
  • List は System.Collections.Generic
  • Select() や Sum() は System.Ling

所感

そんなに忘れていなかった。型があるのは良い。
月末を得たいで例外を見つけて何だか書く気になった。

その他

やっぱ、プログラミングは楽しいなぁ…
今はプログラミングとは無関係の職だけど復帰したい。
前回の記事から7か月後ってマジか…マジか…

KotlinでFizzBuzz

はじめに

  • Kotlinに触れてみたくなったので試しにFizzBuzzを書いた

動作環境

開発環境

コード全文

fun main(args: Array<String>) {
    for(x in 1..100) {
        var word : String = ""

        if(x % 3 == 0) {
            word = "Fizz"
        }
        if(x % 5 == 0) {
            word += "Bazz"
        }
        if(call_word == "") {
            word = x.toString()
        }
        println(word)
    }
}

所感?

参考

お風呂の栓につながっているチェーンを付け直した

はじめに

状況

入浴をしていたある日、お風呂の栓につながっているチェーンが切れた。
切れてしまった物は仕方がない、その内に直そう!と思いつつ数ヶ月が過ぎた。

直し方を調べた

次のWebページを参考にした。

プラスドライバーを使えばできるらしい。

作業1.チェーンの付け根を確認

チェーンの付け根の形状

チェーンの付け根がどんな形状か確認した。

ネジの位置が真正面なので取り外しは楽そうだ。

作業2.チェーンの付け根のネジを外す

お風呂の栓をつけておく

チェーンの付け根のネジを外す前にお風呂の栓をつけた。ネジなどが落ちてしまった場合に回収を容易にするためだ…っぽいことが参考にしたWebページに載っていた。

チェーンの切れ端とネジ

プラスドライバーでネジを外すとチェーンの切れ端が落ちた。

作業3.チェーンの付け根にチェーンをとめる

チェーンの付け根の下に穴がある

チェーンの付け根の下にチェーンをつなぐための穴がある。ここにチェーンをいれてネジをとめた。

おしまい

ネジをとめてからチェーンを引っ張っても外れそうになかった。

感想

簡単に直せてよかった!チェーンの切れ方がほぼ付け根付近だったため、チェーンを新調する必要がなくてよかった!!
スマホで撮った画像が大きすぎて驚いた(小さくした)。

退職金(解約手当金)請求書を書く必要が無かった

はじめに

「退職金(解約手当金)請求書」(以下、請求書とする)を書いていた。
いろいろとすぐに書き終えられず面倒くさくなった際に請求書の裏面を読んでいたら請求書を書く必要が無いことがわかった。

掛金納付月数が12月未満は退職金(解約手当金)が支払われない

退職金共済に契約されてから(被共済者になってから)解約するまで12か月未満だった。
請求書の裏面に「掛金納付月数が12月未満のときは、退職金(解約手当金)は支払われません。」と明記されていた。

掛金納付月数は通算できる

退職後3年以内に退職金共済を採用している企業に転職して、被共済者になり通算の申し出をすれば前の職場の掛金納付月数が無駄にならずにすむ。

申し出ができたら記事を書きたいな。

送付先宛名ラベルを印刷すると楽かも

途中まで書いていて気づいたこと、確認したことをせっかくなので書く。
Google Chrome(Version 89.0.4389.90)で次のページを印刷し、送付先宛名ラベルを切って封筒に貼る。

http://chutaikyo.taisyokukin.go.jp/tetuduki/tetuduki04_3.html

送付先宛名ラベルを貼れる大きさの封筒は長形3号だとちょうど良い。
※書けばいいが書くのが面倒だった。

「記入欄 共済契約者(事業主)」が未記入だが、そのまま提出しても良い

「記入欄 共済契約者(事業主)」に元勤務先の次の要素が書かれている(もしくは押印されている)はずだったが未記入だった。

  • 住所
    • 郵便番号
    • 電話番号
  • 氏名又は名称
    • 印鑑
  • 被共済者(従業員)の退職日

この項目は労働者側で勝手に書くことはできない。
元勤務先に書いてもらうように頼む必要があるのかわからなかったため中退共に問い合わせた。
返答は中退共が必要であれば事業主に確認をとるため未記入のまま提出しても良いとのことだった。

「金融機関記入欄 口座確認欄」は預金通帳のコピーで代用できる

「金融機関記入欄 口座確認欄」には退職金を振り込んで欲しい預金口座の金融機関の窓口に行き押印または記入が必要だ。

ただ、次のページの「退職金(解約手当金)請求書記入要領1・2」(PDFファイル)に代替手段が載っていた。

http://chutaikyo.taisyokukin.go.jp/tetuduki/tetuduki04_2.html

わざわざ金融機関に行かなくて良いから楽だ。

通帳預金のコピーは「金融機関名、支店名、口座名義人(カタカナ)、普通預金口座番号」が載っている必要がある。

退職所得申告書の確認欄が「有」

「退職した年の前年以前4年内に退職手当の支払を受けたことがある方」に該当した。
これに該当してしまうと次の書類が必要になる。

退職所得の源泉徴収票・特別徴収票は確定申告で提出し原本が手元から無くなる可能性があるのでコピーやスキャンデータを残しておくとよい。
※スキャンデータの名称を「退職金等振込通知書」にしていたため見つけるのに手間取った。
※退職所得の源泉徴収票・特別徴収票は退職金等振込通知書として届いた。

ところで勤務期間が年に満たない場合はどう書けばいいのだろうか?
提出する必要が無い理由を知ってしまったので確認はしていない。

退職所得の受給に関する申告

退職してすぐに転職するなら退職前にこの申告を済ませておきたい。

退職して無職の期間が続いて自分で確定申告するなら必要は無さそう。

その他の参考

iDeCoから還付金が発生、確定申告に間に合わなくなりそう?

手続きをサボっていた

2021年2月に国民年金基金連合会から 転退職に伴う「個人型確定拠出年金」手続き の案内が届いた。
案内のざっくりとした内容は「退職されているなら個人型確定拠出年金(以下、iDeCoとする)の運営管理機関に連絡してくださいよ~」といったもの。
退職後、国民年金の種類はすぐに変更したのにiDeCoは放置していた。

加入条件が無くなった期間の掛金は還付される

案内が届いてから1か月後、e-Taxでポチポチと入力しつつ、重い腰を上げ運営管理機関に電話をかけた。
電話をかけてから30分ぐらい経過して担当者につながった(時期的な問題でつながりにくかったのだろうか?)。
2020年の半ばに退職して、それから無職で国民年金保険料は全額免除の状態にあると担当者に伝えた。
担当者からは次のことを言われた。

  1. iDeCoの加入条件が無くなった期間の掛金は還付します
  2. 還付の処理は2か月ほどかかります

確定申告はどうすればいいのか

掛金の還付がされるなら小規模企業共済等掛金控除証明書の内容が変わってしまう。
確定申告の受付期間は2021年4月15日までだが、還付の処理を待っていたら間に合わない。
管理運営機関の担当者に確定申告はどう対応すればよいか尋ねたら、税務署の方に尋ねてくださいと言われた。

確定申告の計算結果が「還付」なら、iDeCoの還付処理を待ってから申告すればいい

最初は「確定申告電話相談センター」に質問したが明らかにおかしな返答だった。伝え方が下手くそだったか?
このため、確定申告会場にいらっしゃる専門家に助言をいただくことにした。
専門家からは次のことを言われた。

  1. e-Taxで入力済みの小規模企業共済等掛金控除(専門家は「社会保険料控除」とおっしゃっていた)を「0」にする
  2. 確定申告の計算結果が「還付」なら、iDeCoの還付処理を待ってから申告すればいい
  3. 確定申告の計算結果が「納付」なら、一旦確定申告を終わらせiDeCoの還付処理の通知が届いてから更正すればいい

ご返答ありがとうございます、ありがとうございます、ありがとうございます。

e-Taxで計算結果を確認した

e-Taxで入力した小規模企業共済等掛金控除を0にして、計算結果を確認したら還付だった。
iDeCoの還付処理が終わる予定の5月まで放置が決まった。

参考としてe-Taxの計算結果が「納付」「還付」の画像を添付。

納付

e-Taxの計算結果が納付

還付

e-Taxの計算結果が還付

還付申告

e-Taxの計算結果が還付の場合は確定申告の受付期間以降でも申告ができるのは知らなった(e-Tax以外でも良い)。
少し調べてみたら「還付申告」は確定申告の対象年の翌年1月1日から5年以内(2020年度分は2021年1月1日から2025年12月31日まで)は受け付けることが分かった。
はぁ~このことだったんですねぇ。

参考

その他

あー無職なので貯金が減っていく。まだ余力はあるけど良い気分ではない。