1 of 39

納品物がBADデータ☆

NPO法人 デジタルガバメントラボ 代表理事 千葉 大右

2 of 39

代表理事 千葉 大右

船橋市役所職員

情報システム課、市民税課、戸籍住民課等に在籍

2018年から総務省地域情報化アドバイザー

2020年にNPO法人デジタルガバメントラボを設立、代表理事を務める。

3 of 39

昨年の

BADオープンデータ供養寺《一周忌》で、

宮崎県のドランクプログラマー Kenzi によって

爆誕した属性

それが、

4 of 39

「データマゾヒスト」

5 of 39

「データが綺麗になっていくと魂が浄化されるぅ」

6 of 39

「データマゾヒストにとってBADデータはむしろご褒美」

7 of 39

「汝の敵(BADデータ)を愛せよ」

「ルカの福音書」6章27節

8 of 39

おお、主よ。

私はたった今、

データマゾヒストであることを自覚しました。

9 of 39

「神は乗り越えられる試練(BADデータ)しか与えない」

10 of 39

そう、あの時の試練を私は乗り越えた…

11 of 39

平成26(2014)年6月

私は自分史上

最も長い名前の部署に在籍していました。

12 of 39

船橋市健康福祉局福祉サービス部地域福祉課

臨時福祉給付金及び

子育て世帯臨時特例給付金給付事業推進本部

13 of 39

はい、今年話題となった特別定額給付金と

同様の給付金担当でした。

14 of 39

簡素な給付措置(臨時福祉給付金)とは

平成26年4月の消費税率の引上げによる影響を緩和するため、所得の少ない方に対して、制度的な対応を行うまでの間の、暫定的・臨時的な措置として、簡素な給付措置(臨時福祉給付金)を支給するものです。

支給対象者

平成26年度分市町村民税(均等割)が課税されない方が対象です

ただし、

・住民税において、課税者の扶養となっている場合

・生活保護制度の被保護者となっている場合

などは対象となりません。

支給額

支給対象者1人につき 1万円

(年金や児童扶養手当等の受給者は5,000円の加算)

15 of 39

 M社 「申請書データの納品でーす」

 私  「印刷業者への引き渡しまで1週間、

なんとか間に合ったな」

16 of 39

 私  「引き渡しの前に、一応中身を確認しておくか…」

17 of 39

 私  「ん?想定レコード数よりもだいぶ多いぞ!?」

18 of 39

 私  「被扶養者がOMITされてないんじゃ!」

19 of 39

 私  「宛名に“様”がついてないんじゃ!」

20 of 39

このように、納品されたデータは

ありとあらゆる条件が漏れていました。

21 of 39

完成度は、多分6割程度だったと思います…

22 of 39

 私  「くぁwせdrftgyふじこlp!!!」

 M社 「すみません、1週間では無理です(;_;)」

M社の名誉のために補足すると、無理なのは単なるクレンジングではなく、非課税判定等対象者抽出ロジックに関わるところが間に合わないとのことでした。

23 of 39

 私  「やるしかない。自分でやるしかない!」

24 of 39

しかし、私は”COBOL”しか書けない。

25 of 39

なので買ったよ\(^o^)/(自費)

26 of 39

納品データ十数万件と、

住民税データ数十万件と、

住民データ約100万件を、

手元の非力なノートPCでぐりぐり回した。

砂時計がくるくる回っても、

ただただじっと待っていた。

※脳内BGMをスガシカオのProgressでお楽しみください。

27 of 39

引き渡しまでの1週間は本当に泣きながら

仕事をしていました。

SQLでどうにもならないところは、

これも泣きながらググってVBSを書きました。

28 of 39

山のようにできた作業ファイルを全部結合したいんじゃ!

For Each objFile In FileList

inputFileName = objFile.Name

inStream.LoadFromFile inputFileName

Do While inStream.EOS = False

records = inStream.ReadText(-2) '-1:全部読込 -2:一行読込

outStream.WriteText records, 1 '0:文字列のみ 1:文字列+改行

Loop

Next

29 of 39

印刷業者に渡すデータにBOMなんていらないんじゃ!

'バイナリモードにするためPositionを0に

outStream.Position = 0

outStream.type = 1

'先頭2バイトをスキップするためPositionを2に

outStream.Position = 2

Dim bin

bin = outStream.Read()

30 of 39

氏名カナをそのまま口座名義人欄にプリントしたら、

小さい「ツ」とかが原因で組み戻しになるんじゃ!

Public Function HanKanaSLConv(s As String) As String

Dim i As Integer, P As Integer, C As String

Const HanKanaS = "ァィゥェォャュョッー"

Const HanKanaL = "アイウエオヤユヨツ-"

HanKanaSLConv = s

For i = 1 To Len(s)

C = Mid(s, i, 1)

P = InStr(1, HanKanaS, C, vbBinaryCompare)

If P > 0 Then Mid(HanKanaSLConv, i) = Mid(HanKanaL, P, 1)

Next i

End Function

31 of 39

SQLを回すたびに、�VBSを流すたびに、

BADデータが綺麗になっていく…

32 of 39

 私  「あれ?なんか…(気持ちいい☆)」

33 of 39

さあ、

あなたもBADデータを受け入れましょう。

34 of 39

「右の頬を打たれたら、左の頬をも差し出しなさい」

「マタイの福音書」5章39節

35 of 39

寛大な心で、データマゾヒストの道を究めよ。

36 of 39

データマゾヒストの心得

その①

「外から来たデータは信用するな」

37 of 39

データマゾヒストの心得

その②

「外から来たデータには寛大に、

外に出すデータは厳格に」

38 of 39

後日談

昨年実施された「プレミアム付商品券事業」のシステムを受託したのもM社でした。

打ち合わせで久しぶりに会った当時の営業は、私の顔を見るなりこう言ったのです。

 M社 「前回の資産があるので、今回は大丈夫です!」

 私  「お、おう…」

39 of 39