沖の雑記帳

基本的には趣味に絡んで雑多な内容を色々と

先月のPVが多かっただけに謎の焦り

特にこれといって方針のないブログなのだが、先月はPSO2で流行したEP4のアクセサリ調整でゴーカートを作る記事を書いたりしたおかげで月間PVが1,000を超えるというよくわからない事態になってしまった。

それに比べて今月はちょっと流行に乗り遅れたマイナンバーのチェックデジットの記事が大半を占めている。

なので、もちろん人目を引くわけでもないのでPVは全然伸びないんだけども、ほぼ独り言メモなブログだからこれが普通なはず

なのだが、なぜかPV数伸ばすには…人に見てもらうにはどんな記事を書けば良いのだろうとかいう謎の焦りが生まれている。

正直な話、書きたい内容自体は実はいっぱいあるんだけど本家のサイトのメンテで忙しかったりで書きたい内容を整理する時間が全然取れてないんだよね。

どこかでまとまった時間が取れたらいいのだけど、年度末の忙しさにプライベートでの忙しさが重なってサッパリサッパリ…サッパリ妖精が通りすぎて行きそうな感じです。

GithubのMarkdownを手軽に確認したかった

かなり昔からアカウントだけ登録してあって全くと言っていいほど使っていなかったんだけども、最近になってマイナンバー云々の記事で書いたコードとかその他色々ローカルにしとくものでもないなというものをGithubにあげてみたりしてる。

してるんだけども、一応README.mdをしこしこ書いてAtomとかでプレビューしてえいやって放り込むと期待した表示になっていない…

期待した表示じゃないから、もう1回ちょっと修正してこれでいいはず?ってREADME.mdだけを変更してコミット…

またちょっと期待してた表示じゃない…なんで?
Githubを使い始めたら何度もREADME.mdをコミットするはめに…

ってことがありまして、ツールを探したりプラグインを入れたり色々やってみたけどどれもイマイチぱっとしないというかREADME.md確認するためだけに色々設定いじったりプラグイン入れたりがめんどくさい。

会社のPCはWindows7だし、自宅でGithubアクセスするときはWindows10(デスクトップPC)だし、出先でGithubアクセスするときはMacbook Airだしでツールはちょっと…ってなってきたところにいいものを見つけました。

Big Sky :: markdown を何時でもチャラーっとプレビューしたい。

これは便利だなぁ…自分で作る気力なんてなくて人様の作ったものを拝借

だって、既に自分が作るよりも良さそうなものがあるならそれを使った方がいいじゃない?

FORTRAN 77でマイナンバーのチェックデジットを計算

先日、WindowsバッチファイルとAwkチェックデジットを計算するプログラムを書きました。
その続きです。多分最後です。

Windowsバッチファイルでマイナンバーのチェックデジットを計算 - 沖の雑記帳

awkでマイナンバーのチェックデジットを検証・集計 - 沖の雑記帳

元の記事と同様に参照元は以下のQiitaの記事です。

マイナンバーのチェックデジットを計算する - Qiita

このシリーズいつまで続けようか?そもそも需要がない言語がほとんどだよね?
この辺は私がおっさんなので新しい言語を触ってないというよりも仕事柄古い言語を触ることが多いだけでもあるんだけどね。

さて、続きは長くなるので一旦折りたたみ

続きを読む

awkでマイナンバーのチェックデジットを検証・集計

先日、Windowsバッチファイルでチェックデジットを計算するプログラムを書きました。

Windowsバッチファイルでマイナンバーのチェックデジットを計算 - 沖の雑記帳

元の記事と同様に参照元は以下のQiitaの記事です。

マイナンバーのチェックデジットを計算する - Qiita

でも、集計するならawkとか使ったほうが楽だよね。それにまだawk版はなさそうじゃん?ってことで書きました。
ただ、awkって実計算部分は他の言語と大差ないんだよね
なので今回は解説らしい解説も特には不要かな?

検証環境

Windows7
GNU Awk 3.1.8

awkで気をつけること

配列や、文字数の開始は1からで0ではないこと。この辺は他の言語と違っています。
変数は全てグローバル。関数や、各パターンマッチで同じ変数名使うと書き換わるよ。*1
パターンマッチした時の処理にnextとか書いとかないと次に一致したパターンも延々処理していくよ。*2
と、こんなところでしょうか?

それでは続いてコードを貼り付けましょうね。

awkマイナンバーのチェックデジット検証・集計

# サマリ出力するデータの初期化
BEGIN {
    invalid_count = 0
    valid_count = 0
    unexpected_count = 0
}

# 全入力データを保存
{
    mynumber[FNR] = $0
}

# 数値のみの行にマッチ
/^[0-9]+$/ {
    sum = 0
    if (length($0) == 12) {
        print "mynumber : " $0
        digit = calc_checkdigit(substr($0,1,11))
        print "digit    : " digit
        if (digit == substr($0,12,1)) {
            print "validate : true"
            valid_count++
            result[FNR] = 1
        }
        else {
            print "validate : false"
            invalid_count++
            result[FNR] = 0
        }
    }
    else {
        print $0 " :requires 12-digit."
        unexpected_count++
    }
    print ""
    next
}

# 非数を1つでも含む行にマッチ
/[^0-9]+/ {
    print $0 " : Not be used non-numeric.\n"
    unexpected_count++
    next
}

# どのパターンにもマッチしてこなかった場合は不正データ
# 改行のみの場合などはここに来る
{
    print "Unexpected data.\n"
    unexpected_count++
}

# 検証結果のサマリ出力
END {
    print "Summary:"
    print "  Number of data : " FNR
    print "  Valid data     : " valid_count
    for (i = 1; i <= FNR; i++) {
        if (result[i]) {
            print "\t" mynumber[i]
        }
    }
    print "  Invalid data   : " invalid_count
    print "  Illegal data   : " unexpected_count
# 不正入力を出したい時だけ
#    for (i = 1; i <= FNR; i++) {
#        if (!result[i]) {
#            print "\t" mynumber[i]
#        }
#    }
}

# チェックデジットの計算
# 入力は11桁の数値列
function calc_checkdigit(number){
    for (i = 1; i < 12; i++) {
        p = substr(number,12-i,1)
        if (i <= 6) {
            q = i + 1
        }
        else {
            q = i - 5
        }
        sum += p * q
    }
    remainder = sum % 11
    if (remainder <= 1) {
        return 0
    }
    else {
        return 11 - remainder
    }
}

基本的にはコメントの通りです。
今回はそれぞれの入力に大してチェックデジットやtrue/falseなどを出力していますが、どちらかというと正しいものだけを抽出して出力したり表形式で正否を出力したりといった使い方の方が実用性があるでしょう。

一部を除いてほぼC言語なんかと変わらないですね。

以下検証関連
最後に入力データ数、チェック結果の数と、正しいデータのみを出力しています。

*1:良い書き方ではないけど関数に関しては避ける方法はある

*2:特に何もなければ上から下まで全てのパターンをなめる

続きを読む