ヤバすぎるマイナポータルのなぞ

最近Webで時々見かけるキャッチー?なタイトルをつけてみた。というのも、マイナンバーカードで確定申告するためにマイナポータルで控除証明書を集めようとしていたらあまりの使いにくさに目が点になったためだ。まだ試していない人のためにその使いにくさ加減を説明しようと思う。まず

  • 控除をもらいたい対象毎に連携が必要
  • 対象が同じでも複数契約ある場合は別々に連携が必要
  • 証券会社も連携は必要(マイナンバー伝えてなかったか?)

ここまででわかる人にはヤバさ加減がわかると思う。保険の控除するのに契約ごとに全部連携が必要って頭大丈夫かというレベルだ。せめて会社に連携すれば同一契約人のデータは欲しい。次に

  • 連携するのにアプリとサイトを何度も何度も往復しなければならない
  • 往復するたびにマイナンバーカードのパスワードとカードの接触が必要

もはや嫌がらせといってもいいレベルである。現在ようやく保険2社、2契約と証券会社とふるさと納税サイトに連携申請したがまだ別の保険会社があるし、複数契約はまだ未申請である。恐ろしいのはふるさと納税サイトに連携する場合はそれでひとまとめで済むが、個別の市町村に連携する方法もあるということ。全国の市町村名がドロップダウンで表示されて選択せよと言われたときは目を疑った。やる気がない人ができるだけ目立たないようにシステムを設計するとこうなるんだなと思った次第。本来ならデータを発行する側にマイナンバーを伝えておき、データを発行する側もマイナンバーに対して発行すれば自動的にデータが集まるというのがあるべき姿であると思うのだが、そうすると最初にマイナンバーをあちこちに伝えなければならないシステムになる。マイナンバーのコンセンサスも取れていない中そんなシステムを作ればシステムを使うつもりのないなんでも反対屋にも言われたい放題になることは目に見えてる。そこを使いたい人だけがマイナンバーを使うという形にして避けたのだろう。マイナンバーが漏れるとまずいというのは聞いたことがあるのだが、先行して行われている事例を研究して何とかしてもらいたいものだ。なりすましの問題らしいのだが、マイナンバーがあろうとなかろうとこの問題は常に存在し続けていたと思う。

デジタル庁の人間は全員個人で電子での源泉徴収、確定申告を必須にしてシステム改善に励んでいただきたいと思うのであった。

マイナポータルと年末調整のなぞ

最近は確定申告を自分ですることにしている。確定申告は税務署?がアプリを作っているので申告書の作成が非常に簡単にできる。そこでふと見ると年末調整というアプリもあることに気づいた。もしかすると毎年面倒な記入や計算を強制されるあれもデジタルでできるなら楽ではないかと思って今年はアプリでやってみることにした。調べてみるとマイナポータルから証明書がダウンロードできるらしい。ここで自分のイメージとしては、マイナポータルに勝手に証明書が集まってきていて保険の控除などは入力不要になるのだろうと思っていた。しかしどうやらそうではないらしい。マイナポータルから民間企業が運営するクラウドストレージ的なところに飛ばされてアカウント登録して、さらに各保険会社に電子で送ってもらうための手続きをしなければいけないらしい。しかもクラウドストレージ的なサービスは複数の企業が運営していて保険会社毎にどこのサービスを使うかが決まっているらしい。つまり自分の控除証明書を電子で取得するにはいくつかのクラウドストレージ的なサービスにアカウントを登録したうえで各保険会社に電子でくださいと個別にお願いしないといけないということ。

いかにもお役所仕事の無駄の集まりみたいな状態だ。徴税のためのインフラなんだから国がお金出して全国民に数メガのストレージを割り当てて各種証明書がすべてそこに集まるようにすればいいのにと思う。なぜ道路はインフラとして国が管理しているものもあるのにITに関してはすべて民間にやらせようとするのだろうか。民間にやらせるということは複数の似たようなサービスが立ち上がるのは当たり前だし、そうすると不便こうむるのは国民なんだけど。電子請求書のプラットフォームでもそうだけどなんでも民間にやらせるのがいいわけではないんだよ。はやく電子化で事務作業員を減らしての分をITインフラ構築に割り当ててほしいと思う。

(続)PDFに電子署名をしてみる

前回PDFに電子署名ができるようになった。(といってもiTextSharp4と先人の知恵をコピペしただけで内容は全く理解できていないが。)前回は電子証明書がある前提で書いていた。これは法務省発行の電子証明書がたまたま手元にあったからだが果たしてこの電子証明書はこんなに軽々しく使っていい物なのか不安になった。これは実印みたいなものだというし電子帳簿保存法で規定されているのはタイムスタンプと検索要件だけなので自己証明書でも十分では。ということで試してみた。

1,セルフサイン用の証明書の作成
 keytool -genkey -keyalg RSA -alias MinoCraft -keypass mino3000 -keystore keystore.ks -dname "cn=______, c=JP"
 「_____」の部分は名前を入れておく
2,ドメイン認証用の証明書の作成
 openssl pkcs12 -export -out certificate.pfx -inkey _______.key -in ______.crt
 「_____」にはドメイン認証用のキーファイルとルート証明書ファイル名を入れる。

1,2のどちらでもできたファイルを前回の証明書の読み込み部分のファイルに指定すればOK。セルフサインではcnで入れた名前が署名者として表示され、2の場合はドメイン名が署名者として表示される。どちらも署名されてから変更されていないことと埋め込みタイムスタンプが含まれている点は同じ。2では証明書のルートが確認済となる点はよいが証明書を毎年更新しなければいけないのがNG。1だと、有効期限は自分で決めれるから自由が利くのが良い。とりあえず当面ドメイン証明書を使って署名しておいて法務省発行の電子証明書の使ってもよさそうな雰囲気になったら入れ替える予定。

しかし個人向けの電子証明書は無料なのに法人向けは有料なんだよね。いい加減政府は電子インフラも公共事業として認識したほうがいいんじゃないかと思う。

PDFに電子署名をしてみる

PDFに電子署名とタイムスタンプを付けたくなった。理由は電子帳簿保存法に対応したPDFを作りたいから。いろいろ調べてみたが買い切りのライブラリで一番安いのは海外製499ユーロだった。国内産が良かったがサブスクだったのだ。正直もうそれでいいかと思ったが、一応自分でもトライしてみることにした。そこでまず最初に下記のサイトを参考にC#化してみようと思った。

PDF/A に電子署名してみる

https://qiita.com/trueroad/items/db29302229707b6114bc

こちらの情報では少し古いQPDF(のC++ライブラリ)を使用していた。自分はC#でやりたいということでQPDFNetに翻訳してやってみようとしたのだが、QPDFとQPDFNetにまったく互換性がないというかC++で使用しているクラスや関数名とQPDFNetで使用できるクラスなどが全く対応していない。QPDFNetはコマンドラインツールであるQPDFをコマンドラインを使わず実行できるようにした感じでクラスの作りがコマンドラインのオプション名に準じている。しかし、C++のQPDFは普通に関数で実行する感じで、もしかするとコマンドラインツールの内部コードで使用している関数をそのまま公開しているのかもしれない。このページのやり方はかなりローレベルというかPDFの署名の仕組みを0ベースで構築している感じでQPDFを使いこなせるようになっても電子署名データを作るデータ範囲を考えたり非常に面倒そうなのでこれは諦めた。

次にネットで情報が多いITextSharpというライブラリを使った方法で検討してみた。よくよく調べてみるとiTextSharpはVersion4までは商用利用OKだったらしいがそれ以降は商用利用不可で結構なライセンス費用を取られることが分かった。これならまだ499ユーロで購入したほうがましということでiTextSharp4を使用した方法で考えてみることにした。実はネットであふれるiTextSharpを使った情報の半数はVersion4時代のものでiTextSharp4を使うと決めてからは早かった。というわけでやり方。

まずライブラリ。ナゲットで
iTextSharp.LGPLv2.Core
をインストール。(追加でPortable.BouncyCastleが自動的に入る)
コードは以下
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Collections;
using iTextSharp.text.pdf;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;

private void Signdemo()
        {
 String TSA_URL = @"http://ts.ssl.com";
 String TSA_ACCNT = null;
 String TSA_PASSW = null;
 ITsaClient tsc = new TsaClientBouncyCastle(TSA_URL, TSA_ACCNT, TSA_PASSW);

 var _certificate = new X509Certificate2(@"電子証明書.p12", "password", X509KeyStorageFlags.Exportable);

 var certParser = new Org.BouncyCastle.X509.X509CertificateParser();
 var chain = new Org.BouncyCastle.X509.X509Certificate[]
                 {
                  certParser.ReadCertificate(_certificate.RawData)
                 };
 AsymmetricKeyParameter bouncyCastlePrivateKey = DotNetUtilities.GetKeyPair(_certificate.PrivateKey).Private;


 var reader = new PdfReader(@"input.pdf");
 var writer = new FileStream(@"Digitally Signed.pdf", FileMode.Create, FileAccess.Write);
 PdfStamper st = PdfStamper.CreateSignature(reader, writer, '\0');
 PdfSignatureAppearance sap = st.SignatureAppearance;
 sap.Location = @"場所名";

 sap.Render = PdfSignatureAppearance.SignatureRender.Description;
 sap.SetCrypto(bouncyCastlePrivateKey, chain, null, PdfName.AdobePpklite);
 sap.Acro6Layers = true;

 reader.Appendable = true;
 var dic = new PdfSignature(PdfName.AdobePpklite, PdfName.AdbePkcs7Detached);
 dic.Reason = sap.Reason;
 dic.Contact = sap.Contact;
 dic.Location = sap.Location;
 dic.Date = new PdfDate(sap.SignDate);
 sap.CryptoDictionary = dic;

 int contentEstimated = 15000; //you can modify this you have loads of contents in signature

 var exc = new Hashtable();
 exc[PdfName.Contents] = contentEstimated * 2 + 2;
 sap.PreClose(exc);

 PdfPkcs7 sgn = new PdfPkcs7(bouncyCastlePrivateKey, chain, null, "SHA-1", false);
 IDigest messageDigest = DigestUtilities.GetDigest("SHA-1");
 Stream data = sap.RangeStream;
 byte[] buf = new byte[contentEstimated];
 int n;
 while ((n = data.Read(buf, 0, buf.Length)) > 0)
 {
    messageDigest.BlockUpdate(buf, 0, n);
 }
 byte[] hash = new byte[messageDigest.GetDigestSize()];
 messageDigest.DoFinal(hash, 0);
 DateTime cal = DateTime.Now;

 byte[] sh = sgn.GetAuthenticatedAttributeBytes(hash, cal, null);
 sgn.Update(sh, 0, sh.Length);

 byte[] encodedSig = sgn.GetEncodedPkcs7(hash, cal, tsc, null);
 if (contentEstimated + 2 < encodedSig.Length)
  throw new Exception("Not enough space");

 var paddedSig = new byte[contentEstimated];
 Array.Copy(encodedSig, 0, paddedSig, 0, encodedSig.Length);

 var dic2 = new PdfDictionary();
 dic2.Put(PdfName.Contents, new PdfString(paddedSig).SetHexWriting(true));
 sap.Close(dic2);
 writer.Close();
}

参考にしたのは下記の2つのサイト。どちらもiTextSharp4時代のものらしく非常に参考になった。もしPDFにかかわり続けるなら(それなら使えるライブラリを買ったほうが良いとは思うが)2番目のサイトはアーカイブして保存すべきでしょう。

https://blog.banko.cloud/blog/2013/10/24/use-itext-4-1-6-to-signing-a-pdf-file-with-c/

https://web.archive.org/web/20130329022247/http://itextpdf.sourceforge.net/howtosign.html

素人にはハードルが高いドメイン移換のなぞ

会社のドメイン管理会社を変更した。理由は費用が高いから。ドメイン管理とメールサーバー機能の提供で月1万3千円。この価格だと他社でまあまあ良いメールサービスが受けられると思うが、この会社ではメールサーバーはおまけだから半日くらいメールサーバーが停止してもしょうがないと言ってきた。で、メールサーバーは他社の一番安いプラン(月1000円で50アドレス使用可能)に乗り換えていた。専門メーカーだけあって何か不都合で停止しても30分程度だし、きちんと連絡が来る(当たり前か?)。今まで停止してもなかなか連絡がなく、数時間後に社内でなんかおかしいと騒ぎ始めてようやくみたいなメールサーバーはやっぱり異常だったんだなと思った。メジャーな会社ほどハッキングの対象になりやすいかもしれないのでそういうリスクはあるかもしれないが、メールはおまけですという会社よりはよいはずだ。メールがおまけなら一体月1万3千円は何の費用なのかと思うが契約当初の資料が残っていないためよくわからない。

メールを変更して問題なかったのでこの度正式にこの会社のサービスから離脱するためにドメインを移換することにしたのだ。しかしドメインの移換についてはあまり情報がない。素人が手を出さないようにという善意かもしれないが困ってしまったのでここにメモを残そうと思う。間違った情報があると思うので自分で確認しながら進めてほしい。流れはこうだ

1,転入先でドメイン転入を申し込む
 値段が安いところにすればよいのだが、事業者によっては機能ごとに別料金だったりでオプション付けると結局同じ金額みたいなこともあるようだ。事業者側で機能比較されないように機能一覧を出さない業界ルールでもあるのか比較が難しい。なおドメインの有効期限1カ月以内だと転入受付してもらえない。それ以外にも転出元によってやることがあるようだがこれは調べるのは容易なので書かなくてもよいだろう
2,転出元にドメイン転出を申し込む
 特に問題なし。どこに転出するかを伝えるだけでよし。
3,DNSレコードを転入先に設定
 素人(自分)が間違えてるのがここでドメイン移換=DNS移換ではない。てっきりDNSレコードを持ってくる作業までやってもらえるのかと思ってた(甘)ドメイン移換というのはどうやらドメイン情報の管理権を移換するだけでDNSレコードを管理しているサーバーは移っていないらしい。このままにしておくと転出元の契約切れと同時にDNSレコードが無くなってしまうことになる。転入先のサービスが使用できるようになったら速やかにDNSレコードを転入先に設定しDNSサーバーを転入先のサーバーに変更する必要がある。
4,DNSサーバーを転入先のサーバーに変更
 転入先の設定メニューで実施。

 自分が一番はまりかけたのは3のDNSレコードのところからであった。もしかしたら資格試験の勉強で見たことはあったかもしれないがドメインの情報とDNSレコードは別のところで管理されており、ドメインの管理情報にWhois情報とどこのDNSサーバーにDNSレコードがあるのかも書いてあるというイメージであるらしい。ドメイン移換しただけでは管理情報の管理権が移換されただけなので自分でDNSレコードがあるサーバー設定を変更しないといけないらしい。ドメイン買うとたいていセットでついてくるのでドメイン管理会社=DNSレコード管理会社のようなイメージがあったがそうではないらしい。ドメイン管理会社に書いてある移換の手続きも3以降が書かれていないことがある。これはDNSサーバーを自社管理している場合のことのようだ。

事前に転出元にドメイン移換の流れを聞いてはいたのだが超絶不親切な転出元なので1と2しか教えてくれなかった(うちがDNSサーバー持っていないことを知っているのに)。まあ転出したいという連絡しても半月以上何の応答も無いような会社だからしかたない。ようやく縁がきれてほっとするのであった。

Win11強制アップデートの罠

最近会社のPCをWin11にアップデートした。アップデートしたかったわけでもなく、将来会社のPCをWin11にするための動作確認というわけでもない。

理由は、Win10の動作がおかしくなってきたから。

1つ目の異常:タスクバーの動きが遅い。タスクバーを自動的に隠すに設定しているのだがマウスを画面の下に持って行った後タスクバーが出てくるのが遅くなった。しかも普通ならスムーズにせり出してくるところがなぜかカクカクなのだ。これだけなら隠すのをやめれば良いのだが、タスクバーから出てくるメニュー類すべてが遅くなってしまっていた。それ以外の動作は遅く感じることはなかったから不思議である。

2つ目の異常:パソコンが突然OFFになる。これはハードウェアの異常かもしれないのだが、唐突にパソコンが切れるのだ。ノートPCでバッテリーがあるので瞬停とかではない。しかも再起動すると何事もなかったかのように起動する。電源が急に切れると次起動したときにチェックとか入るんじゃなかったか?

ドライバーを入れなおしたりいろいろしたが変わらず、Win10をインストールしなおすかWin11にアップグレードの2択でWin11アップグレードを選んだというわけ。理由はアップグレードではアプリ類が保持されるのは過去の経験からわかっていたから。Win10を再インストールすると自分のデータは保持できるがアプリが入れ直しになって面倒だ。どうせいつかはWin11にしなければいけないなら先陣を切っておこうという考え。すべてがハード的な不具合ならアップデートでは治らないのではと思ったが、アップデートするとタスクバーの動きは直った。電源OFFも治った感じである。なんとなく電源OFFはCPU温度が上がってOFFになった感じのような気がする。理由はわからないが筐体の温度が下がった感じはある。もしかするとウィルスにやられていたのかもしれない。Win11の使い勝手は特に変わらない感じである。アプリはそのまま動いてるし、背景のテーマもそのまま引き継がれる。過去のWindowsのようにアップグレードで要求スペックが急激に上がって動作が遅くなるということもなかった。

しかし家のPCをWin11にしたのもWindowsの不具合の解消のためだった。もはやわざとWindows10の不具合を放置しているとしか思ない自分なのであった。

インボイス制度で赤字になる太陽光発電のなぞ

ちまたではインボイス制度対応に大忙しのようだ。自社にもインボイス対応のために新しいシステムを導入しませんかみたいな話がくるし、ネットではフリーランスが騒いでいるようである。さて今回は巷で騒がれていない落とし穴についてである。

これを読んでいる人がいるとしてその中の一定数の人はおそらく太陽光発電装置を屋根に載せていることだろう。果たしてその人たちはどれだけがインボイス制度で発電額が10%目減りすることになること気づいているだろうか?というのは太陽光発電での買い取り時に消費税が支払われているからである。知らないうちに益税をもらっていたわけだがこれがインボイス制度でなしになってしまうのである。大多数の自宅発電所は年間10万~20万くらいの範囲内ではないだろうか。ということは1万から2万売電収入が目減りすることになる。2019年の時点で国内の自家用太陽光発電施設数は2,676,116件らしい。2年経過しているので3,000,000件くらいになっていると思う。ここから例えば1件あたり1.5万円とすると450億円の増税となる微妙に全体ではそこまで大きな金額ではないが1家庭年間1.5万は結構大きい。なぜかこのことを誰も言わないのが不思議である

ガーミン ナビゲーションのなぞ

初めてガーミンのナビゲーションを使用してみた。といってもGPXデータはウルトラの大会が提供していたものを使用したのでGPXの作成方法はわからないままである。そのうち、自分が練習で走りに行くコースのGPXデータをスイスイ作れるようになりたいものである。

さてその結果というわけではないがウルトラは完走できた。ナビゲーション画面にタイムが出ないので自分がどのくらいのペースで走っているのかをそれほど意識せずに走れる範囲で走れてよかったような気がする。

ナビゲーションといっても数100m先までの道の大まかな形状が表示される画面と事前に登録しておいたポイントまでの距離が表示される画面の2つがあるだけなので最初はあまりにシンプルな画面に戸惑ったが、実際に走っているとこの程度で十分だった。自分で全エイドを登録しておいたおかげで給水までの距離に応じて残りの水を飲むか飲まないかの判断に使えてよかったと思う。

ただ、一点残念だったのはGPXデータが間違っていたこと。どうやらGPXデータを公開した後に一部コースに変更が入ったらしく最後10キロの日が落ちて一番ナビが欲しい時にナビのコースと違う道を走らなくならなくて困った。ナビが無いいつものレースならとりあえず走って考えたんだろうけど、ナビが右というところをまっすぐ走り続けるのは結構勇気がいった。

次はGPXデータの作り方でブログを作ろうと思う。

ヤフコメと民主主義のなぞ

ヤフーニュースにコメントすることがある。また、ニュースを読んでよくわからないときはコメントをみて情報を補足してもらったりその裏付けを検索したりすることもある。そんなことを繰り返していくうちに議会を廃止してヤフコメみたいなサイトで省庁の提案を載せていいねで決定してもいいんじゃないかと思えてきた。そうすると間接民主主義をやめて直接民主主義になるわけだ。もちろん電子選挙ですら実現していないことからすると技術的な困難さはあると思うが、政治屋が跋扈するよりはましにならないだろうか。特に勉強したわけでもないおニャン子が政治家になったり学歴詐称、国籍不明な政治家(こちらは都市伝説かもしれないが)よりましではないか。そこで必要な要件を整理してみる。

・ユーザーが特定できないこと
・一人一ユーザーであること。
・各政策ごとに1ユーザー1投票しかできないこと(ただし、納税額によって1投票の重み付けはありかも)
・あらし対策をすること

とこんな感じであろうか。現時点で技術的な一番の課題となりそうなのは匿名かつ一人1アカウントであるということだろうか。匿名性を保ちながら一人1アカウントを徹底し、2段階認証などのセキュリティを実装する。そのうえで嘘を流布したりあらし目的のコメントをした人に何らかの罪を問えるようにする必要もある。矛盾した要求を満たす技術を開発できれば国としても個人としてもウハウハかもしれない。

Garminの互換電池その後

まあわかりきっていたことではあったが、リセットしようが充放電繰り返そうが関係なく電池の持ちは変わらなかった。わかりきっていたというのは、残容量表示がくるっているだけなら充放電で変わるかもしれないが実際に使って強制シャットダウンになるまでの時間が10時間程度しかなかったので、販売店が時間稼ぎ、もしくは悪あがきしてるだけだろうとは思っていたためだ。結局、正規品の180mAhより少ない容量だったのではと思う。というのも、GPS、心拍、BluetoothがONの状態で稼働時間が10時間くらいだったからだ。スペック上はGPS、心拍のみONで14時間ということになっており経験上、BluetoothのON、OFFだけで4時間も変わらないためだ。

ということで使えないわけではないのだが、新しく血中酸素飽和濃度?も図れる新型に買い替えることにした。これはカタログ仕様でGPSONで30時間となっており、心拍ONでも16時間くらいの大会は余裕だと思う。

ウルトラトラックモードにすれば今のままでも20時間くらいはいけるかもしれないがウルトラトラックモードは距離の誤差がすごい(1割以上)ので大会で使うと疲れる。ということで現機種は封印していつか新機種用の電池が手に入ったら再度開けてみたいと思う。