秘密の本棚

気になることをなんでも書きます

インフル(?)闘病記

日誌

2019/01/30

21:30頃、用事から帰宅する。帰宅する途中から腰痛が徐々にひどくなってきていた。少しズキズキするような痛みだ。普段は腰痛持ちではなく、以前重いものを持つ作業をしたときに一回なったきりでそれもすぐに治っていた。自分が腰痛とは珍しいなと思いつつ、その日はジムに筋トレに行っていたのでその影響だということにする。今まで筋トレで腰痛になったことは一度もないのだが。

とりあえず風呂へ。寒かったから風呂に入って温まろうと思ったのだが、温かいはずの湯船に浸かっても全然暖かくない。むしろ寒い。おかしい。これは「寒気」というやつではないかと思ったが、それを認めたくなかった僕は風呂から上がってそのまま就寝。その頃には腰痛がかなりひどくなっていたので湿布を貼った。身体の異常を感じ始めていたのだが、「病気くらい気持ちで治る」と言い聞かせて、とにかく早く寝て朝には完治していることを期待していた。

2019/01/31

ところが、まったく眠くならないし、浅い眠りについてもトイレで4回も目が覚める。身体もだるいし頭痛もする。明らかに体調が普通ではないことを自覚し、「これが最近流行りの、インフルエンザというやつか?」と症状を調べ始める。

突然の38℃以上の「高熱」や、関節痛、筋肉痛、頭痛などの他、全身倦怠感、食欲不振などの「全身症状」が強く現れるのが特徴です。

この時点でインフルエンザだと確信。本当はこの日は休んですぐに医者にかかるべきだったのだが、そうは問屋が卸さない。

この日は研究室のミーティングの司会進行役。潔く代理を頼むべきだったのだがそれをせず、腰痛と頭痛を抱えながら外出強行。熱を測ったらおそらく高く出ていたのだろうが、測るのが怖くて熱は測れなかった。当然のように大学についた頃にはぐったり。結局その日のミーティングは最後まで耐えられず、大学の保健センターへ駆け込むことに。

11:30頃。保健センターではまず用紙に症状を記入し、体温を測る。頭痛、腰痛、悪寒にチェックを入れながら体温計を腋の下に滑り込ませる。そして音が鳴るまで待つこと1分ほど、画面に表示されていたのは無慈悲な39.0℃の文字。予想外の高熱に自分でも笑ってしまったが、ここまでくればあとは「インフルエンザA型陽性」のお墨付きをもらうだけ。逆にテンションが上ってきて、当選確実な候補者のような気分だった。普通に診察を待つ人と隔離された椅子に座り、診察を待つ。…………

一連の体調悪化以後はじめて体温を測り、あとは検査だけだと少し気分が楽になったのだが、それも束の間だった。この日、保健センターの内科は超がつくほど大混雑。待てども待てども順番が回ってこない。インフルが疑わしいから、高熱だから、といって順番が優先されるわけではない。普段はあまりエネルギーのタンクが枯渇することがないのだが、20分、30分と目処のない時間が経つに連れて疲れてきて、12:00過ぎには生きてるのか死んでるのかわからないような状態になっていた。

そして12:20頃。ようやく自分の名前が呼ばれ、診察室に入る。先生は躊躇せず僕の鼻に綿棒のようなものを突っ込んでは取り出し、「5分くらいしたら結果出るのでそれまで外で待っててね〜」と。ようやく楽になれる(というか帰れる)、と思いつつ待つこと8分、再び診察室に入り、合格通知を身構えていた僕に降り掛かってきたものとは。

「う〜ん、陰性ですね〜。」

信じられない。なぜ。この症状なのに。こんなに待ったのに。今日こんなに頑張って大学まで来たのに。ちゃんと予防注射したのに。あんなに頑張って予防注射予約開始当日に7時間画面の前で粘って予約したのに。

とにかく解熱剤などを処方するのでそれで良くなるだろう、とのこと。いや、そりゃ解熱剤を飲めば熱は下がるでしょうよ。僕が欲しかったのは輝かしいインフルエンザ陽性判定なんですよ、と。

そんなことを言ってもどうしようもないので、ここはおとなしく薬局で解熱剤をもらって帰ることに。いや、お金は払わないと。ちょうど薬局では、前の人がインフルエンザでタミフルを処方してもらっていた。その人の会計を盗み聞きしていたところ、診察代と薬代合わせて5500円くらいかかっていた。結構タミフルって高いのだなぁ、と思っていたら今度は僕の番。インフルエンザの称号を授かれなかった代わり、処方されたのは後発品の解熱剤。タミフルすらもらえない格の差に改めて落胆したが、会計は診察代と合わせて1700円。あれ、超お得じゃん、と。これで少し機嫌を良くして帰路についた。

13:30頃。大学から帰宅。改めて熱を測ると38.5℃。まぁこんなものだと安心して解熱剤を飲んで寝る。

20:00頃。目が覚める。暑い。鼻息が熱すぎる。こんなに自分の鼻息が熱かったことがあっただろうか。嫌な予感がしつつ、再び体温を測る。

f:id:nexusuica:20190201202646j:plain
これが40.0℃の「格」

「40.0℃」の文字に僕の目は一瞬輝いたが、冷静にこのときは熱で辛かった。一刻も早くご飯を食べて解熱剤を飲んで寝ることにした。この際、翌日のバイトはインフルエンザの検査が陰性だったので行くか悩んでいたのだが、とても無理と判断して代わりを依頼。代理もすぐに見つかり、とにかく自分は早く治そうと思いながら就寝。この日は寝付きは悪くなかった。脱水が怖かったのでこまめに水やお茶を飲んでこの夜を耐えることにした。

2019/02/01

7:00頃。汗を大量にかきながら起床。まず体温を測る。……36.2℃。解熱剤、あなた効きすぎ。倍飲んだら低体温症になりそう。そういえば今日は身体が楽だ。腰痛もかなり軽くなり、もちろん寒気もない。身体の関節痛や寒気がなくなった代わり、この日は腹痛に移行した。ウイルスを外に出そうとしているのだから、これは歓迎しないといけない、ととりあえずプラス思考でいくことにした。

思い出してみると、これほど高い熱を出したのは中学生のとき以来かも。文化祭の準備で無理をして、本番直前に38℃代後半で倒れた。あのときはご迷惑をおかけしました。

13:00頃。36.7℃。これ、今日のバイトできたのでは。いや、慢性的に腹痛だしこういうときは休まないとダメ。

19:00頃。37.0℃。だいぶ落ち着いてきたしここまでの経緯をブログにまとめるか。あーお腹痛。

本当にインフルではなかったのか

インフルエンザの検査に広く使われているインフルエンザ迅速検査。僕は陰性だったが、本当にインフルエンザではなかったのか。

調べてみると、インフルエンザ迅速検査の「感度」、つまりインフルエンザに実際にかかっている人のうち迅速検査で陽性と判定される割合は実は全体では62%しかないのだそう。

medical.nikkeibp.co.jp

www.m3.com

こちらの記事でも98%、98%というと高いようでいて50人に1人は見逃される計算。

したがって、インフルエンザ迅速検査で陰性と判定されても「インフルエンザではない」というのはかなり言いすぎであるように思える。実際、健康な成人であれば解熱剤を飲んでいればタミフルを飲んでいようないまいが完治に数日差が出るだけなので大きな問題ではないのだが、乳幼児や高齢者、持病持ちの人は迅速検査で陰性でもさらに精密な検査を行ったほうがよい、とのことだった。

学生の話をすると、数日間欠席しようが特に問題にならない大学生であればインフルエンザ迅速検査で陰性であっても特に問題にはならないが、小学生から高校生までは「インフルエンザかどうか」が「出席停止か、欠席か」の境目になる。内申書で出席日数がもれなく報告されることを考えると、迅速検査で本当は陽性のものを陰性と判断されてしまうのは可哀想だ。検査で陰性でもインフルエンザの診断書をもらえたりするのだろうか。

なにはともあれ、僕はインフルエンザ患者だったと主張したい。一週間くらいはうつさないように、勝手に気をつけるつもりだ。

一定速度で発射した物体が描く放物線の包絡線

経緯

前にこんなツイートを見かけました。


実はこれ、京大の過去問にあります('00後期)。
最大の初速度v_0で、あらゆる方向に打ち分けることができる最強の打者を考慮して、ドーム球場(屋根付き野球場)を設計したい。座標の原点Oをホームベース上にとり、ボールが飛ぶ鉛直面内で原点Oから水平方向にx軸を、また鉛直上向きにy軸をとる。ただし、簡単のため、ボールは原点Oで打たれるものとする。また、重力加速度の大きさをgとし、空気抵抗およびボールの大きさは無視できるものとする。
初速度v_0で打たれたボールが、打ち上げ角度に拘わらずドームの天井に当たらないためには、ホームベースからRだけ離れた地点での天井の高さはいくつより大きくなければならないか。
要するに、以下の図で\thetaが変化するときボールが通過しうる領域はどこかという問題です。
f:id:nexusuica:20181111230158p:plain:w400
(図:https://physnotes.jp/exercises/shahou_orb/

まずやることは適当な角度\thetaでの物体の軌跡を求めることです。これは、時刻tにおける物体の位置
 \displaystyle x=v_0t\cos\theta,\ y=v_0t\sin\theta-\frac12gt^2
からtを消去して、
 \displaystyle  y=x\tan\theta-\frac{gx^2}{2v_0^2\cos^2\theta},\ y\geq0
となります。あとはこれを0<\theta<\frac{\pi}2で変化させたときにこの放物線が通過する領域を求めればよいわけです。通過領域を求めるには

  • 順像法
  • 逆像法
  • 包絡線の計算

の3つのやり方があり、どれでもできます。とりあえず\thetaが複雑で鬱陶しいのでa=\tan\thetaとおいておけば
 \displaystyle y=ax-\frac{(1+a^2)gx^2}{2v_0^2}
となります。

順像法

順像法とは、「ある直線上のみでの通過範囲を求める」ことによって通過領域を求める方法です。今回であれば「あるx座標のみを考えたときに、\thetaを変化させたとしてどこを通過するか?」を考えます。つまり、xを固定してy\thetaの関数と見てその値域を求めることになります。
いま、ya=\tan\thetaの2次関数なのでその値域は平方完成することによって容易に求まり、
  \displaystyle y=-\frac{gx^2}{2v_0^2}\left(a-\frac{v_0^2}{gx}\right)^2+\frac{v_0^4-g^2x^2}{2gv_0^2}
より、yの値域は
  \displaystyle 0\leq y\leq \frac{v_0^4-g^2x^2}{2gv_0^2}
となります。結局これは鉛直投げ上げ運動の最高到達点\displaystyle \frac{v_0^2}{2g}を頂点とする放物線になっています。
www.desmos.com

逆像法

今度は逆像法です。逆像法とは、「ある点(x,y)を曲線が通過するようなパラメータの値が存在するかどうか」という存在条件から通過領域を求める方法です。今回は軌跡の方程式をパラメータaの方程式とみてaの存在条件を求めます。方程式をaについて整理すると
 gx^2a^2-2v_0xa+2v_0^2y+gx^2=0
となります。いまaの取りうる範囲はa>0なので、この範囲に解を少なくとも1つもつ(x,y)の条件を求めればよいことになります。左辺はaの2次関数になっていて、その放物線の軸はx>0のもとではa>0に存在します。また、左辺をf(a)とおくとき
  f(0)=2v_0^2y+gx^2>0
より、a\leq 0には実数解は存在しえないことがわかり、結局たんに実数解をもつ条件のみを求めればよいです。これは判別式を使って、
  \displaystyle (v_0x)^2-gx^2(2v_0^2y+gx^2)\geq 0\Leftrightarrow y\leq \frac{v_0^4-g^2x^2}{2gv_0^2}
と、同じ結果が得られます。

包絡線を直接求める

これまでは関数の値域や文字の存在条件から曲線の通過領域を求めましたが、この通過領域の境目には、もとの放物線が接しながら動きます(先ほどのグラフを参照)。このようにある曲線のパラメータを変化させたときにその曲線が常に接しながら動く曲線のことを包絡線といい、これを直接求める方法が存在します。
詳しいことはここに書いてあります。
mathtrain.jp
ここでは曲線を
  \displaystyle f(x,y,a)=ax-\frac{(1+a^2)gx^2}{2v_0^2}-y
とし、f(x,y,a)=0\displaystyle \frac{\partial}{\partial a}f(x,y,a)=0を連立して解きます。
  \displaystyle \frac{\partial}{\partial a}f(x,y,a)=x-\frac{agx^2}{v_0^2}
なので頑張ってaを消去して計算すると、包絡線として \displaystyle y=\frac{v_0^4-g^2x^2}{2gv_0^2}が得られます。

というわけで、野球ドームの天井は放物線にしておけばよいという結論(?)が得られました。

AtCoder Beginner Contest 113

C - ID

問題

C - ID

考察

N個にグループ分けされる、順序付きのM個の要素があり、グループごとに順番に番号を振って最後に与えられた順に番号を出力する。
愚直に入力をグループ分けしてまずソートして番号を振ったのち、すべての要素を合体して与えられた順にソートし直せばよい。重いけど構造体で管理しようか。

コード

struct city{ll num, pref, year; str id;};
bool comp_year(city a, city b){
  return a.year<b.year;
}
bool comp_num(city a, city b){
  return a.num<b.num;
}

int main(){
  ll n,m;
  cin >> n >> m;
  vector<city> prefs[n];
  REP(i,m){
    city temp;
    temp.num = i;
    cin >> temp.pref >> temp.year;
    temp.pref--;
    prefs[temp.pref].push_back(temp);
  }
  vector<city> all;
  REP(i,n){
    sort(prefs[i].begin(),prefs[i].end(),comp_year);
    ostringstream sout;
    sout << setfill('0') << setw(6) << i+1;
    str pref_str = sout.str();
    REP(j,prefs[i].size()){
      ostringstream sout2;
      sout2 << setfill('0') << setw(6) << j+1;
      str order_str = sout2.str();
      prefs[i][j].id = pref_str + order_str;
      all.push_back(prefs[i][j]);
    }
  }
  sort(all.begin(),all.end(),comp_num);
  REP(i,all.size()){
    cout << all[i].id << endl;
  }
  return 0;
}

D - Number of Amidakuji

考察

W列、高さHの縦棒に対して適当に横棒を入れてあみだくじをつくり、一番左から出発してK番目に到達するあみだくじの個数を求める。
動的計画法で「高さiにおける左からj本目へ到達するあみだくじの横棒の置き方」をカウントしていけばよい。iからi+1への推移は、高さi+1での横棒の置き方すべてに対して、あみだくじとして不適切なものを除いて適宜加算を行う。今回はH\leq 8がキーとなる。
なお、さらに考察するとO(HW)でも行ける模様。
sigma1113.hatenablog.com

コード

const ll p = 1000000007;

int main(){
  ll h, w, k;
  cin >> h >> w >> k;
  ll dp[h+1][w];
  fill(dp[0],dp[h+1],0);
  REP(i,w){
    if(i==0) dp[0][i] = 1;
    else dp[0][i] = 0;
  }
  REP(i,h){
    REP(j,1<<(w-1)){
      bool ignore = false;
      REP(l,w-2){
        if(j>>l&1&&j>>(l+1)&1){
          ignore = true;
        }
      }
      if(!ignore){
        REP(l,w){
          if(l!=0&&j>>(l-1)&1) dp[i+1][l]+=dp[i][l-1];
          else if(l!=w-1&&j>>l&1) dp[i+1][l]+=dp[i][l+1];
          else dp[i+1][l]+=dp[i][l];
          dp[i+1][l] %= p;
        }
      }
    }
  }
  cout << dp[h][k-1] << endl;
  return 0;
}

雑感

なぜか今回は日曜開催で、参加できず。実は水色CoderになったのでいずれにせよUnratedだったのですが。
Dは難しいですね。

ハロウィーンなのでMacの背景をスクリプトから変更する

今日はハロウィーンですね。Bingの背景がこれになってました。

f:id:nexusuica:20181031190611j:plain

以前WindowsAndroidの背景をBingの画像に設定するアプリを紹介したのですが、Macのアプリは有料でした。
nexusuica.hatenablog.jp
今回はBingの背景画像を取り込んで背景に設定するプログラムを自前で書いてみました。

流行りのPythonで実装

Bingの背景画像は以下のURLからjson形式でフェッチできます。

http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

f:id:nexusuica:20181031193619p:plain

このjsonから画像のURL部分を取り出し、ファイルをローカルにダウンロードしたのち、AppleScriptMacのデスクトップの背景に設定します。実装はなんでもよかったのですがPythonでやってみました。

import json
import urllib.request
import subprocess
from os.path import join, expanduser

#ディレクトリを指定
dir = join(expanduser("~"), 'Documents/bing-wallpaper')

#画像をフェッチ
url = "http://www.bing.com/HPImageArchive.aspx?format=js&n=1"
response = urllib.request.urlopen(url)
content = json.loads(response.read().decode('utf8'))
print(content['images'][0]['url'])
image_url = "http://www.bing.com"+content['images'][0]['url']
date = content['images'][0]['fullstartdate']
print(image_url)
filename = date+".jpg"
filepath = join(dir, filename)
urllib.request.urlretrieve(image_url,"{0}".format(filepath))

#背景に設定
script = """/usr/bin/osascript<<END
tell application "System Events"
set picture of every desktop to POSIX file "%s"
end tell
END"""
subprocess.Popen(script%filepath,shell=True)

あとはこのスクリプトを定期的に実行させてやれば毎日画像が変わります。cronを設定してもよいのですが面倒だったのでBetterTouchToolでスリープ解除後に実行させるように設定しました。
nexusuica.hatenablog.jp

これで毎日背景に飽きません。Bingの画像は季節感もありますしクオリティが高いので良いですね。ハッピーハロウィーン

f:id:nexusuica:20181031192908j:plain