SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|

2005-01-16(Sun) タマ消たSVX

  今日はちょっとした成り行きから家具屋に向かう。適当に見て回った帰り、あまりにも遅いGTRをスッとパスしたら突然メーターパネルに赤いインジケータが!! ブレーキ!? ブレーキトラブル!? と思いきや、ストップランプのタマ切れである。あー、びっくりした。

  画像の説明

  しかし、スッと抜き去ったGTRを後ろに従えて、ストップランプがタマ切れしているという状況はなんともシマらない。ちょうど16号を走っていることだし、そのままスーパーオートバックスへ向かうコトにした。駐車場にとめて状況を確認。あぁ、確かに切れてるわ。

  店内のランプ売り場に行く。最近はLEDだのなんだのイロイロな種類のタマが並んでいるが、フツーのタマはきわめて安い。2つで\357である。SVXのテールは4灯で、左右の明るさが違うのもカッコわるいので2個入っているのはウレシイ。しかし、せっかくなのでちょっと変わったモノを取り付けてみたい気もする。なんぞないものか。

  しかしながらLEDタイプの高いこと高いこと。白色LEDなんて10個100円で買えるのに、タマにすると1個で2,000円もする。ざっと10倍だ。バカバカしい。フツーのでイイや。\357のモノを購入。

  画像の説明 画像の説明

  周りはすっかり暗くなっていたが、SVXのトランクを開け、裏の生地をちょっとめくったら、簡単にランプにアクセスできた。暗くてよく見えないが、手探りで交換できるほど簡単。縁起物なので両方交換しておく。作業完了。

  画像の説明

  家に帰って切れたタマを観察してみたトコロ、なんだかエラいクモっているし、ガラスにヒビまで入っていた。切れてない側のタマは新品と区別が付かないほどキレイなのに。コッチはまだ使えるので予備としてクルマに積んでおこう。ふふっふーんふーん。

  例の232メモリの作業はお休み。花粉症だかカゼだかワカランが、調子悪い。寝る。ぐぅ。


2006-01-16(Mon) tdiaryのコメントスパムを排除してみる

  当ブログはtdiaryというブログシステムを利用しているが、このtdiaryというブログシステムには「ツッコミ」を入れられるという特徴がある。日記の1日のエントリごとに、小さな掲示板が付いているというようなモノなのであるが、掲示板であるから余計な書き込みをする輩が現れる。面倒なことはキライだし、アホな書き込みも「枯木も山の賑わい」と、基本的に放置の方向で運営してきたが、怪しげな薬品の広告スペースとかに使われたり、私信のチャットに使われたりしだすと、さすがに見苦しさに余る。

  こーゆー時にはIPアドレスで制限したりするのが、基本的な対処であるが、IPアドレスでの制限は大抵はドロ沼になる。書き込む方は基本的に攻撃側であり、防御側が屈するまで、気の済むまで攻撃できるんだから当然である。IPを変えるなんざ、いとも簡単なことであり、そりゃ効き目があるわけがないのである。

  基本的に、攻撃もしくはどちらかというとダークな行動をする輩はスキルが低いことが多い。以前にFOMAの端末のボタンに直に配線をつなぐ改造を加え、端末をPCから制御して迷惑メールを出しまくっていた業者が摘発されたというニュースを見たが、その改造のアホさには目を見張るものがあった。端末のボタンへの配線が2本ずつあったのである。どうやら彼らには「GND」という概念がないらしい。同様に推測すると、以前に悪いことするために「サリンちゃん」なんていう妙薬を作り出した団体があり、ニュースでは「高度な技術を持つエリートを擁している」などとして扱われていたが、パンピーからは高度な技術にみえても、きっとフツーの薬品エンジニアからはなんでもないことなんじゃねーかと思う。まっとーな人間なら、ハナっからあんな団体に属したりしませんって。

  脱線したが、よーするに、そのようなダークな輩に正義のエンジニア(?)が負けるなどということはあってはならないコトなのである。ちゅーわけで、なんかいい方法はないかと考えていたのだが、あった。tdiaryの場合、うっとおしいコメントがあったら、管理画面でチェックボックスを外すことで非表示にできるのであるが、これをデフォルトにしてしまえばいいのである。そうすりゃ書き込まれた後に管理者が確認して、内容によって表示したり、放置したりすることができる。なんだ、簡単だ。いわゆる、オプトアウトでなく、オプトイン方式にすりゃいいのである。

  通常であれば、簡単な変更ではあっても、そのような変更は不可能なところであるが、ウチは自宅サーバであり、tdiaryはRubyで書かれたオープンソースアプリであり、オイラはRubyプログラマである。チョイチョイと直してしまえばいい。

  まずは、該当する部分を処理部を探さなければならない。grepである。早速tdiaryのホームディレクトリ下でgrepしてみる。検索ワードは「ツッコミ」だ。

colinux:/home/mitsu/public_html/diary $ grep -r ツッコミ *
skel/update.rhtml:                              <input type="submit" tabindex="<%=2000+idx%>" name="comment" value="ツッコミ表示状態変更">

  ココがクサい。ソースを読んでみる。

colinux:/home/mitsu/public_html/diary $ vi skel/update.rhtml
     59         @diary.each_comment( 100 ) do |comment| %>
     60             <div class="commentator">
     61                 <span class="checkbox">
     62                     <input class="checkbox" type="checkbox" tabindex="<%=2000+idx%>" name="<%= idx += 1 %>" value="true"<% if comment.visible? then %> checked<% end %>>
     63                 </span>
     64                 <span class="commentator"><%= CGI::escapeHTML( comment.name ) %><%= CGI::escapeHTML( " <#{comment.mail}>" ) unless comment.mail.empty? %></span>
     65                 <span class="commenttime"><%%=comment_date( Time::at( <%=comment.date.to_i%> ) )%></span>
     66             </div>
     67             <p><%= comment.body.make_link.gsub( /\n/, "<br>" ).gsub( /<br><br>\Z/, '' ) %></p><%
     68         end
     69         if idx > 0 then %>
     70             <div class="button">
     71                 <input type="submit" tabindex="<%=2000+idx%>" name="comment" value="ツッコミ表示状態変更">
     72             </div><%
     73         end %>

  ここはおそらくツッコミの表示部らしい。「comment.visible?」あたりで引っ掛けられそうである。おそらく、ツッコミはcommentであり、commentはオブジェクトなのであろう。

colinux:/home/mitsu/public_html/diary $ grep -r "visible?" *
tdiary.rb:              def visible?; @show; end
tdiary.rb:                              i += 1 if all or comment.visible?
tdiary.rb:                              if c.visible? then
tdiary.rb:                              next unless com.visible?
tdiary.rb:              def visible?
tdiary.rb:                                              break if @diary.visible?
tdiary.rb:                              lm = lmd if lm < lmd and diary.visible?
tdiary.rb:                              next unless diary.visible?
tdiary.rb:                      @diary = nil if @diary and not @diary.visible?
tdiary.rb:                              @diaries_size += 1 if diary.visible?
tdiary.rb:                              next unless diary.visible?
tdiary.rb:                                      next unless com.visible?

  いい感じに引っかかってきた。こーなりゃ、tdiary.rbを読むしかない。

colinux:/home/mitsu/public_html/diary $ vi tdiary.rb
     93     #
     94     # class Comment
     95     #  Management a comment.
     96     #
     97     class Comment
     98         attr_reader :name, :mail, :body, :date
     99
    100         def initialize( name, mail, body, date = Time::now )
    101             @name, @mail, @body, @date = name, mail, body, date
    102             @show = true
    103         end
    104
    105         def shorten( length = 120 )
    106             matched = body.gsub( /\n/, ' ' ).scan( /^.{0,#{length - 2}}/ )[0]
    107             unless $'.empty? then
    108                 matched + '..'
    109             else
    110                 matched
    111             end
    112         end
    113
    114         def visible?; @show; end
    115         def show=( s ); @show = s; end
    116
    117         def ==( c )
    118             (@name == c.name) and (@mail == c.mail) and (@body == c.body)
    119         end
    120     end

  ん? 114行目の「def visible?; @show; end」があって、102行目の「@show = true」があるっつーことは……これをfalseにするだけじゃん!! わー!! こんな1行ばっかの変更じゃ、ブログのネタにならないじゃねーかッ!!

  ……などといいつつも、ネッチリとソースコードを入れてネタにしてしまったが、結論から言うと「tdiary.rb」の以下の部分(Commentクラスのコンストラクタだ)を書き換えるだけで、所望する動作を行うことができた。

    100         def initialize( name, mail, body, date = Time::now )
    101             @name, @mail, @body, @date = name, mail, body, date
    102             @show = true	(※trueをfalseに書き換える)
    103         end

  以上、tdiaryをお使いで、コメントスパムに困っている人。この対処法を試してみてはいかがであろうか。ほんじゃ。

  あ、そうそう、この一連のツッコミには笑わせてもらった。オイラには書き込み元のIPが同じだってこと、わかっちゃってるんだよねぇ。


2008-01-16(Wed) いまさら7セグ

  とりあえず

  画像の説明

  画像の説明

  画像の説明


2010-01-16(Sat) 演歌で爆走する

  先のクリスマス、ウチの4歳のガキがサンタにお願いしたのは、なぜか「デコトラのゲーム」であった。

  オイラの知っているサンタは、いわゆる「デコトラ」に対して、あまりよい印象をもっていないはずなのだが、ガキとはいえ、せっかく興味を持ったのならば、与えてあげればいいじゃん、と思っているらしい。また、Amazonで極端に安く入手できることもあったのかもしれない。クリスマスの朝、彼の枕元には「爆走 デコトラ伝説 〜男一匹夢街道〜」があった。

  画像の説明

  操作はたいして難しくないのだが「とーさんがやってッ!!」と、彼は自分で運転しようとしない。うーむ、仕方ない、適当にトラックを選んで、ライバルと勝負してみる。

  なんでだかよくわからないが、ゲーム中のBGMは「ド演歌」だ。デコトラと演歌には切っても切れない関係があるのだろうか……とはいえ、かなりゲームの感じとマッチしているのも確か……気がつくと、ゲーム自体のデキもかなりイイ。気がつくと、彼は「♪ゆめ、ゆめ、さくらぁ〜」だの「♪風が泣いてる叫んでるぅ〜」だの口ずさんでいる。つーか、オレまで口ずさんでいる……なんか、ちょっと演歌にハマってしまったかも。

  こりゃ、mp3プレイヤに放り込むしかない。ゲームのCDをPCにセットしてみた。しかし、なぜか、認識され、吸い出せるのは2トラックだけ。残りの7曲はリストに出てこない。こーなりゃ、サウンドテストから引き抜こう。サウンドテストで再生させつつ、HDDレコーダで録画する。DVD-RWに焼いたらPCへ。wav化を試みる。

  前回と違って、パッと使えるWindows環境がないので、Linux環境でDVDからwavを抜き出そうとしたのだが……

vobcopy -m
cat VTS_03_1.VOB VTS_03_2.VOB | ffmpeg -i - decotra.ac3
a52dec -o wav decotra.ac3 > decotra.wav

  ……なぜか、真に奇妙なことに、この手順だと、左チャンネルが腐るのだ。デジタルなのに、妙にアナログチックに腐ってしまう。困った。

mplayer dvd://3 -ao pcm:file=decotra.wav -vc dummy -vo null
sox decotra.wav -b 16 -r 44100 decotra441.wav

  結局、試行錯誤して、上記の方法を編み出した。約40分のwavができてしまえばこちらのもの。過去に自作したcccdctを引っ張り出してきて、サックサックと切る。ついでに、微妙にアチコチ手直ししたので、新バージョンのcccdctをここに置いておく。

  今まで、演歌になんてまったく興味がなかったが、歳を取ったせいで、独特の曲調が心地よく感じるようになってきたのだろうか。ガキの言うことだからとバカにせず、いっしょに付き合うと、いろいろと新鮮な発見に出会えそうだ。ハァ、アン、ア、アンアンアン。

  #補足、直接にVOBを与える場合。

mplayer VOLUME_IDENTIFIER/VIDEO_TS/VTS_01_1.VOB -ao pcm:file=music.wav -vc dummy -vo null

  #さらに補足、flvから直接にmp3を抜き出す場合。

ffmpeg -i xxxxxx.flv -acodec copy xxxxxx.mp3

2016-01-16(Sat) ラガードのラガードによるラガードのためのレグザ購入 

  2016年が明けたところで、愛用してきたブラウン管ハイビジョンテレビTH-28D30が微妙な挙動を示し始めた。具体的に言うと、スプラトゥーンを遊んでいる時に、画像が上下にズレたり流れたりするようになってきた。

  数年前、実家から液晶テレビを譲り受けたので、TH-28D30は表示遅延ゼロの特性を生かし、ゲーム専用として活躍していたのだが、さすがに限界というトコロか。未だに画質は最高レベルなのだが、8年使えば、まぁいいか、という感じ。テレビ事情について思い返せば、エコポイントとか、ゲームにおける遅延問題とか、Wiiによるテレビ破壊ブームとか、シャープの隆盛と凋落とか、地デジのクソ画質以外の、様々な問題が「すぅ〜っかり全部片付いて」「すぅ〜っかり機能も価格も落ち着いた」ところでのテレビの買い替えということになる。しかも、出始めの4Kを避けてREGZA 43J10をチョイスだ。ある意味、最高の性能を、最低の価格で手に入れられたといえよう。

  パソコンなどが好きな自分は、イノベータ(新しいもの好き)なのだと思っていたが、実際にはほとんどの分野で極端にラガード(遅滞採用者)のようである。未だに電話もフューチャーホンだしなぁ。

  早速、スプラトゥーンで遊んでみる。極端に遅延が少ないというだけあって、違和感はゼロ。ヘボな腕がそれ以上にヘボにならずに済んでいる。そして、レトロゲーをやれば、すばらしくドットがクッキリと表示されるのである。

  画像の説明

  実に、ドット絵が起こせるレベルである。ちょっとボケるくらいが味があるという向きもあろうが、個人的にはこのガビガビにドットが見える状態が好きだ。昔からココムったりとか、クレマったりとか、不正会計したりとか、会社としては最低だが、テレビは最高だぞ。ナイスレグザ!

  取扱説明書を見ると、中身がLinuxらしいのも気分がいい。ブラウザも付いているので、試しにこのサイトを表示してみたところで、例のゲームが動くか試してみたら……

  画像の説明

  ばっちり動くじゃないの。ちょっと遅いけど、普通にリモコンの左右で違和感なく操作することができた。

  さて、録画用のハードディスクでも注文するか。気づかないうちに便利な世の中になったもんだなぁ。


2022-01-16(Sun) テストで雪道

  タイヤを交換してから、妙にクルマにカマいたくて、アレコレとネタを考えている……と、そういえば、そろそろバッテリを交換する頃ではないか、などと思い付き、やめときゃいいのに、夜にもかかわらず、小さなライトを手にボンネットを開けたら、エンジンルームの中にライトを落としてしまった……そらそうなるわな。

  55x35x15くらいの大きさなのだが、妙なところにハマり込んでいると、エンジンをかけた時に大変なことになりかねない。夜では暗くて探しようがないので、ヤキモキしながら寝付くことになった。ロードスターエンジンルームの下にはアンダーカバーがあって、落としたものが素直には地面に落ちない。もしかしたら左右どちらかのフロント・マッドガードを外したり、面倒なことになるかも……と、イライラなのか、ワクワクなのか、よくわからん感情が渦巻く。

  結局、翌昼、しつこく覗き込んだら見つかって、腕を突っ込んで回収することができた……あー、ほっとした。ホント、部品や小物の落下には、細心の注意が必要だな。

  そんなこんなで、タイヤを交換したのにちゃんと走れていない。冬ではあるが、少し陽気のいい今日は、久々に……ホントに1ヶ月ぶりくらいに、ちょっとしっかり走りに行こう、と、新豊根ダムでも向かってみることにした。お気に入りの33号を通って。

  画像の説明

  んが、やっぱりというか、思った以上というか、かなりの圧雪路が現れた。新タイヤといえど、ノーマルタイヤであるから、太刀打ちできるわけがない。わずかな上りなのに、微妙に左右に揺れ、TCS/DSC作動表示灯が点きまくる。あ、これ、ちゃんと点くのね……初めて見たような。

 

  ちょっとこの先も続きそうだし、ここは無理せず戻ったほうがいいと判断。すぐ先の雪の薄いところまで行って、後ろの車に譲り、転回場所を探して戻る。よく考えたら、この先はかなりの下りのはず。上りで様子が伺えたのは幸いだったかもしれない。

  画像の説明

  ただ帰るのはシャクだが、ダムまでは行けそうにもない。別に、用事があるわけではないので、雪のなさそうな道を選んで、ぐるっと回って帰ることにする。あ、ついでに少し高速に乗って、ホイールバランスが問題ないかチェックしてみることにしよう。

  新東名は正月に乗ったので、東名にしよう。豊川ICから乗る。音羽蒲郡ICで下りる……となると、10kmくらいしかないな。しかも、ちょっと混んでる。ちょっと前車との間隔を見て、90弱くらい出す、を、3回くらい繰り返す。特段のバイブレーションは出ない。普段はまったくと言っていいほど高速には乗らないので、90弱で問題なければ、何の支障もない。音羽蒲郡ICで下りる。330円。テスト、クリア(※例によって文中の数値の単位には参るです)。

  あとは、もう一度、空気圧チェックして、ホイールナットを締めて、念のためムシを締め直したら、完全終了だな……って、そのためにムシ回しを手配したのだが、実は、ロードスターに車載のタイヤパンク応急修理キットには、ムシ回しが含まれていたのであった。盲点。せっかくだから、ムシの締め直しで抜ける空気を入れる時、エアコンプレッサの試運転でもしてみようかしらん。

  画像の説明

  あ、ちなみに、今回、ヨコハマのアドバンスポーツ(ADVAN Sport)のV105からファルケンのジークス(ZIEX)のZE914Fに履き替えたことになるわけだが、正直、まったく差はわからん。ちょっと堅めで、弾力が増して、よりコンフォートっぽくなったような気もするのだが、4年も履いてたのと比べるのもおかしいわね。

  ついでに、タワーバーを外したのも、まったく差はわからん。おとなしく運転してただけなので、わかるわけもないと思うが。というか、そんなことなら、外したままでいいことになるけども。

  以前「自分にその価値がわからないからと言って、それをバカにする態度を採るのは、みっともない振る舞いである」って書いたけど、逆に「明らかにはわからないのに、何となくわかったような態度を採るのも、みっともない振る舞いである」って思うので、正直に印象を述べておきます。


2024-01-16(Tue) マイナンバーカードで遊んでみる

  カミさんがふるさと納税の手続きのため、マイナンバーカードをスマホに読ませてアレコレしてほしいといわれ、パスワードを失念していることに気づいた。確か短いのと長いののふたつがあったような気がするのだが。

  正直に「パスワードを覚えていない」というと「そうなると手続きが面倒なのよねぇ」とのこと。フムン。いや、たぶんアレとアレなんだが、長い方が特に自信がない。なんとかならんかと思ってググると、短い方がわかるなら、コンビニで長い方を再設定することができるらしい。短い方は割と自信がある。試してみるか。で、無事に再設定することができ、ふるさと納税の手続きも完了した。よっしゃよっしゃ。

  画像の説明

  と、そこでフトだいぶ前に買ったカードリーダが手元にあることに気づいた。もしかすると、これで読んだりできるのかしらん。早速、やってみた。

$ pkcs15-tool --dump
Using reader with a card: NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader [Vendor Interface] 00 00
PKCS#15 Card [JPKI]:
	Version        : 0
	Serial number  : 00000000
	Manufacturer ID: JPKI
	Flags          : 
 
PIN [User Authentication PIN]
	Object Flags   : [0x12], modifiable
	ID             : 01
	Flags          : [0x12], local, initialized
	Length         : min_len:4, max_len:4, stored_len:0
	Pad char       : 0x00
	Reference      : 1 (0x01)
	Type           : ascii-numeric
	Tries left     : 3
 
PIN [Digital Signature PIN]
	Object Flags   : [0x12], modifiable
	ID             : 02
	Flags          : [0x12], local, initialized
	Length         : min_len:6, max_len:16, stored_len:0
	Pad char       : 0x00
	Reference      : 2 (0x02)
	Type           : ascii-numeric
	Tries left     : 5
 
Private RSA Key [User Authentication Key]
	Object Flags   : [0x1], private
	Usage          : [0x4], sign
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 1 (0x1)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : c5a0a252-9d2d-eb60-fec0-41b4fbd722a2
 
Private RSA Key [Digital Signature Key]
	Object Flags   : [0x1], private
	Usage          : [0x204], sign, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 2 (0x2)
	Native         : yes
	Auth ID        : 02
	ID             : 02
	MD:guid        : e1bc1dae-59f1-16ab-b43f-9dafbb2acc9b
 
Public RSA Key [User Authentication Public Key]
	Object Flags   : [0x0]
	Usage          : [0x0]
	Access Flags   : [0x2], extract
	Key ref        : 1 (0x1)
	Native         : yes
	Path           : 000a
	ID             : 01
 
Public RSA Key [Digital Signature Public Key]
	Object Flags   : [0x0]
	Usage          : [0x0]
	Access Flags   : [0x2], extract
	Key ref        : 2 (0x2)
	Native         : yes
	Path           : 0001
	ID             : 02
 
X.509 Certificate [User Authentication Certificate]
	Object Flags   : [0x0]
	Authority      : no
	Path           : 000a
	ID             : 01
	Encoded serial : xx xx xxxxxxxx
 
X.509 Certificate [Digital Signature Certificate]
	Object Flags   : [0x1], private
	Authority      : no
	Path           : 0001
	ID             : 02
 
X.509 Certificate [User Authentication Certificate CA]
	Object Flags   : [0x0]
	Authority      : yes
	Path           : 000b
	ID             : 03
	Encoded serial : 02 04 0133C349
 
X.509 Certificate [Digital Signature Certificate CA]
	Object Flags   : [0x0]
	Authority      : yes
	Path           : 0002
	ID             : 04
	Encoded serial : 02 04 0132C4AB

  えらくゾロソロと出てくるが、わからんようなわかるようなで面白い。特に冒頭の「PIN」「Tries left」なんて、どう見てもパスワードの失敗許容回数だ。当たり前だがカード内で管理されてるんだな。なかなか高機能なカードであるといえよう。

  そのほか「Private RSA Key」「Public RSA Key」「X.509 Certificate」なんてのも、普段からSSLをガチャガチャしているオイラには見慣れた概念だ。証明書の内容を読み出してみる。

$ pkcs15-tool --read-certificate 1
-----BEGIN CERTIFICATE-----
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
 :
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
-----END CERTIFICATE-----

  完全にpem形式である。opensslで読めそうだ。ちな、2番目の証明書だけはPINコードでロックされているので、以下の指定が必要になる。指定すると入力を促されるので、入力してやると出力される。

$ pkcs15-tool --read-certificate 2 --auth-id 2 --verify-pin
Please enter PIN [Digital Signature PIN]: 
-----BEGIN CERTIFICATE-----
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
 :
XXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxx
xxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXXxxXX
-----END CERTIFICATE-----

  自分の環境では公開鍵は読み出せなかった。PINコードが正しくてもダメ。

$ pkcs15-tool --read-public-key 1
Public key enumeration failed: Required ASN.1 object not found
$ pkcs15-tool --read-public-key 2 --auth-id 1 --verify-pin
Please enter PIN [User Authentication PIN]: 
Public key enumeration failed: Security status not satisfied

  さらに秘密鍵にもなると読み出すコマンドすらない。そもそも「neverextract」だから読み出せなくて正しそう。カードに暗号文を渡し、カード内で(秘密鍵を使って)復号して平文を返してもらう、という形なんだろう。実に高機能なカードである。いくらすんだろね、これ。

  以上をまとめると以下のようになる。

カード情報 JPKI
(PIN1) PIN ユーザ認証PIN 4桁 残3回
(PIN2) PIN デジタル署名PIN 6-16桁 残5回
(秘密鍵1) 秘密RSA鍵 ユーザ認証鍵 署名用 機密 2048桁
 →読み出し不可
 →カード内で復号させる、PIN1で保護されている
(秘密鍵2) 秘密RSA鍵 デジタル署名鍵 署名用 非否認 機密 2048桁
 →読み出し不可
 →カード内で復号させる、PIN2で保護されている
(公開鍵1) 公開RSA鍵 ユーザ認証鍵
 →読み出し失敗
(公開鍵2) 公開RSA鍵 デジタル署名鍵
 →PIN2で保護されている、読み出し失敗
(証明書1) X.509 証明書 ユーザ認証証明書
(証明書2) X.509 証明書 デジタル署名証明書
 →PIN2で保護されている
(証明書3) X.509 証明書 ユーザ認証認証局証明書
(証明書4) X.509 証明書 デジタル署名認証局証明書

  pem形式の証明書が読み出せたので、デコードして可視化してみる。

require 'openssl'
cert = OpenSSL::X509::Certificate.new($stdin.read)
puts(cert.to_text)
$ ./pem_dec.rb < UserAuthenticationCertificateCA.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 20169545 (0x133c349)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, O=JPKI, OU=JPKI for user authentication, OU=Japan Agency for Local Authority Information Systems
        Validity
            Not Before: Sep 14 23:41:59 2019 GMT
            Not After : Sep 14 14:59:59 2029 GMT
        Subject: C=JP, O=JPKI, OU=JPKI for user authentication, OU=Japan Agency for Local Authority Information Systems
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Subject Alternative Name: 
                DirName:/C=JP/O=\xE5\x85\xAC\xE7\x9A\x84\xE5\x80\x8B\xE4\xBA\xBA\xE8\xAA\x8D\xE8\xA8\xBC\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x93\xE3\x82\xB9
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 CRL Distribution Points: 
                Full Name:
                  DirName:C = JP, O = JPKI, OU = JPKI for user authentication, OU = Japan Agency for Local Authority Information Systems
            X509v3 Subject Key Identifier: 
                8C:D5:58:6A:89:14:85:E5:59:37:9B:7E:29:D4:10:CF:D2:8B:35:93

  上記は「(証明書3) X.509 証明書 ユーザ認証認証局証明書」の抜粋だ。いわば、日本国の(オレオレ)証明書であり、日本国民なら共通の情報であるから、内容を公開しても問題ない。

  公開するとマズいのは、(私自身の)個人情報を含んでいる「(証明書1) X.509証明書 ユーザ認証証明書」「(証明書2) X.509 証明書 デジタル署名証明書」の方だが、前者は(おそらく)マイナンバーの番号だけで、直接的な情報は後者に含まれているはずだ。

  んが、上記のスクリプトで後者を読み出してみても、たいした内容が出てこない。せいぜい、以下の「区」くらいで、これは証明書の発行元の情報である。

            X509v3 CRL Distribution Points: 
                Full Name:
                  DirName:C = JP, O = JPKI, OU = JPKI for digital signature, OU = CRL Distribution Points, OU = Aichi-ken, CN = Nagoya-shi-Xxxx-ku CRLDP

  クサイのは以下。デコードができていないっぽい。そういえば、「othername:<unsupported>」って、先日の自分に会社から支給されている証明書でも出てたな。その時は深く考えなかったけれど。

            X509v3 Subject Alternative Name: 
                othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>, othername:<unsupported>

  で、調べていくと、これは「ASN.1」という形式らしく、まさにソコに情報が入っているようなのだが、opensslのtext出力ではその中身までデコードしてくれないようなのである。

  そんならRubyのOpenSSL::ASN1クラスを使ってデコードすりゃええか……と、思ったらその中身がムチャクチャに複雑で、ちっとも意図した結果が得られない。結局、どうにかこうにか再帰を使って出力に成功したが、実際にその中身はムチャクチャに複雑だった。これは再帰なしで書いたら日が暮れるな。文字列なのに、それがデコードできる場合と、単なる文字列の場合があるって、どういう構造なんだよ。

def asn_decode(value, n)
    puts('%sdecode[%s]' % [(indent = '  ') * n, value.class])
    if(value.is_a?(Array))
        value.each {|v|
            asn_decode(v, n + 1)
        }
    else
        begin
            asn = OpenSSL::ASN1.decode(value)
            asn_decode(asn.value, n + 1)
        rescue
            puts('%smay be string[%s]' % [indent * n, value])
        end 
    end
end
 
cert.extensions.each {|ext|
    puts('*%s' % ext.to_h['oid'])
    asn_decode(ext, 1)
}

  「(証明書4) X.509 証明書 デジタル署名認証局証明書」をデコードすると、以下の結果が得られた(抜粋)。

$ ./pem_dec.rb < UserAuthenticationCertificateCA.pem
*subjectAltName
  decode[OpenSSL::X509::Extension]
    decode[Array]
      decode[OpenSSL::ASN1::ObjectId]
        decode[String]
        may be string[subjectAltName]
      decode[OpenSSL::ASN1::OctetString]
        decode[String]
          decode[Array]
            decode[OpenSSL::ASN1::ASN1Data]
              decode[Array]
                decode[OpenSSL::ASN1::Sequence]
                  decode[Array]
                    decode[OpenSSL::ASN1::Set]
                      decode[Array]
                        decode[OpenSSL::ASN1::Sequence]
                          decode[Array]
                            decode[OpenSSL::ASN1::ObjectId]
                              decode[String]
                              may be string[C]
                            decode[OpenSSL::ASN1::PrintableString]
                              decode[String]
                              may be string[JP]
                    decode[OpenSSL::ASN1::Set]
                      decode[Array]
                        decode[OpenSSL::ASN1::Sequence]
                          decode[Array]
                            decode[OpenSSL::ASN1::ObjectId]
                              decode[String]
                              may be string[O]
                            decode[OpenSSL::ASN1::UTF8String]
                              decode[String]
                              may be string[公的個人認証サービス]
                    decode[OpenSSL::ASN1::Set]
                      decode[Array]
                        decode[OpenSSL::ASN1::Sequence]
                          decode[Array]
                            decode[OpenSSL::ASN1::ObjectId]
                              decode[String]
                              may be string[OU]
                            decode[OpenSSL::ASN1::UTF8String]
                              decode[String]
                              may be string[公的個人認証サービス署名用]
                    decode[OpenSSL::ASN1::Set]
                      decode[Array]
                        decode[OpenSSL::ASN1::Sequence]
                          decode[Array]
                            decode[OpenSSL::ASN1::ObjectId]
                              decode[String]
                              may be string[OU]
                            decode[OpenSSL::ASN1::UTF8String]
                              decode[String]
                              may be string[地方公共団体情報システム機構]

  さらに抜粋するとこう。

$ ./pem_dec.rb < DigitalSignatureCertificateCA.pem | grep may
        may be string[subjectAltName]
                              may be string[C]
                              may be string[JP]
                              may be string[O]
                              may be string[公的個人認証サービス]
                              may be string[OU]
                              may be string[公的個人認証サービス署名用]
                              may be string[OU]
                              may be string[地方公共団体情報システム機構]

  そしてクライマックスだ。「(証明書2) X.509 証明書 デジタル署名証明書」をデコードすると、以下の結果が得られた(抜粋)。

$ ./pem_dec.rb < DigitalSignatureCertificate.pem | grep may
        may be string[subjectAltName]
                  may be string[1.2.392.200149.8.5.5.1]
                      may be string[山田 太郎]
                  may be string[1.2.392.200149.8.5.5.4]
                      may be string[319700101]
                  may be string[1.2.392.200149.8.5.5.3]
                      may be string[1]
                  may be string[1.2.392.200149.8.5.5.5]
                      may be string[愛知県名古屋市中区栄3丁目]
                  may be string[1.2.392.200149.8.5.5.2]
                      may be string[00000]
                  may be string[1.2.392.200149.8.5.5.6]
                      may be string[00000000000000000000]

  当然だが上記は改ざんしている。んが、モロに自分の個人情報が入っていた。「デジタル署名」をするという行為は、上記の情報を提供するということであり、それが意図に反して行われないようにするためのものが、長い方のPINコードなのであった。逆に言えば、長い方のPINコードの要求に応じた場合は「自分の個人情報が提供される」ということだ。

  しかし、だ。「名前、生年月日、性別、住所」なんて、役所で気にもせずに一番に書面に書き出す内容である。たかが、それだけの情報なのである。マイナンバー制度に関してはマスゴミの意味不明のFUDキャンペーンで、すっかりネガティブイメージが付いてしまっているが、フタを開けてみればそれだけのこと。ボールペンで書くか、PINコードを打つかの違いしかないといえよう。仮に落として紛失したところで、運転免許証と同程度の危険性しかない。

  ちょっと前にマイナンバーカードを普及するため「マイナポイント事業」というのがあった。調べると「2020年9月に始まった第1弾では2979億円、今年6月から本格実施した第2弾では1兆8134億円を計上した」とあり、例によってマスゴミはこの予算について批判をしていたが、それは「無知なオマエラが無駄に騒ぎ立ててFUDしたから必要になった予算」ではないのか。マイナンバーで事務処理が円滑になれば役所の運営費も減るんだよ。しかも恒久的に。少しくらいは考えてモノを言えっつーの。オマエラが騒ぐとアホな国民の方々はその通りに踊っちゃうんだからさ。

  別に自分は常に日本国万歳ではないが、ことこの件については、マイナンバーカードの返納とか、日本国運営の方々に於かれては、本当にアホな国民の方々をお持ちのようで心から同情いたします。草々。

  あー、そうだ。とりあえずホテルの宿帳を書くの毎度メンドいんで、マイナンバーカードのタッチだけで済むようにしてほしいです。はい。