vax-number: コロナワクチン接種履歴を整数で表す

この恐ろしい新型コロナウイルスに対する最強のソリューションは 科学技術の結晶「mRNA(メッセンジャーRNA)ワクチン」である。

最近、このmRNAの研究において重要な研究をしていた研究者が 死去したことがニュースになった。 こうした優秀な研究者たちの努力の積み重ねによって実現したのがまさに、mRNAワクチンなのである。 仮に古市氏がワクチンで死んだのだとしても、それは本望であろう。

新型コロナウイルスワクチンに使われる遺伝物質「メッセンジャーRNA(mRNA)」の構造を解析した新潟薬科大客員教授の古市泰宏(ふるいち・やすひろ)さんが8日午前8時48分、自宅で死去した。81歳。富山県出身。葬儀は近親者で行う。喪主は妻郁子(いくこ)さん。後日、お別れの会を開く。

1970年代に、mRNAの末端にある「キャップ」という構造を発見。一部でノーベル医学生理学賞の候補とも目されていた。

https://www.yamagata-np.jp/news_core/index_pr.php?kate=Science_Environment_Health&no=2022100901000904

ところで、この最強のワクチンを打った人間は、 Twitterなどで自らをboostedと名乗り、 アカウント名の横には注射器を並べる。

最上位の中学受験生にとって、どの中学を受け、 どの中学に合格したかの履歴が重要であるように、 最上位のワクチニストにとってもどのメーカーのワクチンを接種したかは 重要な問題である。

そのため彼らは名前の横に暗号のようにアルファベットを並べる。 例えば、PPMPという文字列は、ファイザー、ファイザー、モデルナ、ファイザー と4回ワクチンを接種したことを意味する。 モデルナの強い副作用に打ち勝ったという履歴は、 きっと誇らしいものであろう。

さて、日本政府は今後もワクチン接種を続けていくことを発表している。 これは、ワクチンの効果がおよそ6ヶ月で切れてしまうためである。 このため、接種者は今後も6ヶ月間隔でワクチンを打ち続ける必要がある。 新型ウイルスは非常に危険なウイルスであり、感染は死を意味する。 従って、多少の副作用に目を瞑ってでもつべこべ言わずに打つことは 極めて理知的な判断といえる。 また、ワクチンの効果が切れ始めると、却って感染が増悪してしまう ADEというメカニズムを誘発するため、この意味でも打ち続ける必要がある。

しかしここで問題に気づく。 仮にこのまま半年ごとに打ち続けて10年が経ったとする。 その時、ワクチン接種は20回に達していることになり、 この場合、Twitterのアカウント名に接種歴を並べることは難しくなる。 これは、文字数制限的に無理かも知れないし、 もし可能であっても見た目が悪くなる。 いずれにしろ、彼らの栄光の障害になる。

こういった問題に対して、 情報工学の世界には、圧縮というアイデアがある。

当たり前の解法としては、 ほとんどの場合は同じメーカーのものを打ち続けるということに着目すると、 PPMPをP2MPと書く方法が考えられる。これをランレングス圧縮という。これならば ファイザーを10回連続で打った人はP10と書けることになり、PPPPPPPPPPと書くより はるかに短くなる。

しかしおれは、ワクチン接種歴を整数で表したかった。 そこで、 vax-number を開発した。 これは、PPMP的な文字列をVax数にencodeすることが出来、 また逆にdecodeすることも出来る。

vax-numberは正しさと性能にこだわった。

正しさの観点では、encode -> decodeをして元の文字列が復元出来るかを property-based testingによってテストした。 これにはproptest を利用した。このライブラリを使うと、テストは以下のようにさくっと書けてしまった。 テストは1万件のテストケースを自動生成し、当然全パスしている。

1
2
3
4
5
6
fn test_encode_decode(s in "[PM]{0,21}") {
    let s0: Vec<char, 21> = s.chars().collect();
    let x = encode(&s0);
    let s1 = decode(x);
    assert_eq!(s0, s1);
}

次に性能だが、 decodeにおいては、整数から文字列を作る過程で バッファを確保する必要があり、 encodeに比べると、decodeがやや重かった。 具体的には、encodeが15nsに対して decodeは50ns程度かかっていた。

これに対して、ライブラリをno_stdにし、 ヒープアロケーションを排除した。 こうすることで、汎用性とともに、性能も向上した。 decodeは最新の版では30nsを切る。 ライブラリとしては、heapless を使った。さらに性能改善出来るという人は、是非やってみてほしい。

1
pub fn decode(v: u64) -> heapless::Vec<char, 21> {

使い勝手のために、コマンドも用意した。 インストールのためにはcargo install vax-numberを実行すればいい。 こうして、vax-number encode PPMPとでも打てばあなたのVax数が手に入る。

今後は政府に対してVax数のマイナンバーカードへの組み込みを 訴求していく予定だ。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。