ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

8月は有給消化だったけど家族のコロナリレーで無事消化されました

実は転職するんですが、8月まるまる有給とれたので 実はもっと余ってたけど 、僕の人生の中では一大イベントになりました!!!

なにしようかな〜〜〜統計検定リベンジするのもいいな〜〜〜次の現場(?)に向けて勉強するのもいいな〜〜〜〜、前からやりたかったCGIの勉強もしてYoutuberチャレンジするのもいいな〜〜〜、いや時間も空いたし子供と接する日を多くするのもいいな〜〜〜

とか思ってたんですが、自分がコロナになり、家族もリレーするようにコロナ陽性者になりました。幸い、それぞれ1 ~ 2日もあれば元気になって大事にはいたらなかったのですが、隔離期間が思いの外長く、気がつけば8月が終わりな状況になってしまいました。辛い。まぁでもしょうがない。

この記事はそんな話のログになります。

TL;DR

  • コロナの隔離期間辛いよ
  • 有給消化がコロナ隔離期間で消化されたよ
  • 画像見て、四角は隔離期間

序章

7月17日

飲み会がありました。ほんで二次会も行かず普通に帰ってきて、7月20日まで特に何も感じず生活していました。

確証はないのですが、飲み会に参加した4名中僕含めて2人症状でたので、この飲み会からもらってきたのかなって勝手に思っています。なぜか残り2人は発症もせず元気でした。よかった(そしてうらやましい)

7月21日

若干喉がなんかへんだな?って思っていましたが、日々のランニングもできて、大丈夫やろーとか思ってその日は過ごしました。

7月21日

夜中3時、明らかにだるさを感じました。風邪のひき始めに感じるようなアレだったので、その時点で念の為家族が寝ている寝室から移動してリビングで寝てましたが、朝に発熱してました。あちゃーと思い、即刻家を出て、自家用車で病院に電話しまくりました。

その日というかその週は沖縄はコロナ陽性者がバンバンでてて、今振り返るとピークでした。病院に電話がつながらない状態で、病院につながったとしてもPCR検査断られる・発熱外来いっぱいだからだめと言われてしまい、病院の駐車場でつらい〜と言いながら病院に鬼電する時間を過ごしてました。知り合いからあとから聞いた話だと那覇に50箇所に向けて電話したけど全部断られたらしいです。コロナ恐ろしい。

やっとこさつながった病院も予約がいっぱいで明日PCR検査だよ〜ってことで帰されました。辛い。

家に帰ろうとしたら、妻から帰るなと連絡をもらいました。ファッ!???とか思って朦朧とする中電話してたんですが、ホテルを探せとか言われてまじかとか思いました。初めて妻のことが嫌いになりそうだった。(あとから聞いたら子供に感染するのが本当怖かったらしくまじで隔離したかったらしい。まぁわかる)

まぁ、病院がだめならホテルもだめで電話も取らない状況だったので、だめですと妻に連絡して数時間たったら隔離部屋を用意してくれたので、無事帰れました。やっと横になれる。。。。。。。

うちは2LDKなんですが、そのうちの1部屋は僕の仕事部屋兼物置部屋だったので、そこを隔離部屋にしてくれました。

横になってからはだいぶきつく、もうこれはアレやろ、って思っていました。喉とか味覚とかは全然問題ないけど腰がいて〜〜〜とか思って寝てたら発症してから18時間経過したところで熱が平熱に戻り復活しました。

7月22日

熱が下がり少し安心していました。周りから聞いているコロナの症状って2 ~ 3日熱発やひどい喉の痛みが続くだったので、実はコロナじゃないのでは?子供が保育園からもってきたなにかじゃね?とか思ってました。で、症状は落ち着きましたが予約したPCR検査を受けに行きました。唾液であっという間に終わりました。以前からもお世話になっていたけど、とても手際が良い病院です。今後もお世話になると思います。

隔離生活はお腹は空くは空くんですが、動いていないのでごはんは少量になりました。少し痩せた。今は戻っているけど。

あとトイレが大変だった。消毒用のアルコールスプレーを常備して、妻に電話し妻と子どもたちを別部屋に隔離し、僕がトイレにいって、終わったら通ったあと全部にスプレーするという感じ。消毒はいいんだけど、トイレのたびに子どもたちを別部屋に移動させるのは結構大変で、言うことすんなり聞いてくれたら助かるけど、そうはいかないときもあって、妻のストレス大丈夫かな〜とか怯える日々だった。

7月23日

病院から電話がきて、「陽性でした〜」と言われた。あばばばば。妻に伝えると泣き崩れ・・・・はなかったけどショック受けてた。はい、ごめんね。というわけで隔離生活がスタートしました。

このブログみてもらうとわかりますが、僕はIT戦士であり、会社の備品である業務用PCは部屋にあり、会社はリモートワークおkの会社だったので、7月22日はお休みして、7月25日から業務開始していました。とても他人事で申し訳ないですが、リモートワークできない職場や仕事はとても大変だなーとか思ってた。

家族も含めた隔離期間については厚生労働省のホームページを確認していました。僕は退職手続きもあったので、取り急ぎは8月8日の週まで出社できないという旨を伝えて、引き継ぎ&残作業を進めてました。

www.mhlw.go.jp

7月25日

子どもたちの保育園や通っている施設に向けて僕がコロナで濃厚接触者なのでおやすみします〜の連絡を投げました。少し気まずかったですが、どこの施設もみんな患っているので気にしないでーお大事にしてください。と連絡があった。ごめんね。

また、家族は濃厚接触者なのでPCR検査予約してもらった。7月26日だった。

7月26日

家族がPCR検査しにいく。たまに散歩しに外にでてもらう。子供が小さいと家はストレスなので大変。もちろん公園とかはいかず、散歩です。幸い人が都会のようにいっぱいいる地域じゃないので、散歩はとても楽だと思う。

7月27日

PCR検査の結果がでる。全員陰性!やったぜ!!!

7月28日

出前館をはじめて頼んでみる。とても便利。

ほんで、7月31日まで、仕事したりモンハンしたり本読んだりしてた。しかし体がなまっているのか横になるも辛いみたいな状況が続く。早く外へ出たい。

8月1日

SMSで保健所から隔離生活終了の連絡が届く。やっと自由だ!!!!!スタートダッシュはコケてしまったが、俺の有給が始まる。さっそくジュンク堂に技術書買いに行った。

妻が感染

8月2日

会社に出社して退職関連の書類周りを提出する。残りは備品返すだけ

8月3日

長男が通っている療育施設に午前中に妻と長男がいく。その日の15時に施設から電話があり、先生の誰かがコロナ陽性者でしたと連絡をもらう。まじかよ。

8月5日

朝に妻が少し喉がイガイガするという。まさかねーとか思ってて、抗原検査キットを薬局で2人分購入する。妻と長男が検査する。長男陰性、妻陽性。まじかよ。コロナ怖すぎるやろ。

施設利用中、長男はマスクがなかなかできないが、妻はマスクをずっとしてたらしいが、おやつ時間のときに数秒だけ外してたらしい。それだけ?まじで?????

実は僕経由では????とか思いましたが、このウィルス、発症から7日経過すると急激に感染力弱くなるらしいので、隔離期間過ぎた後の接触はほぼ大丈夫とのこと。やっぱり施設なのか???コロナ何もわからない。

というわけで、コロナのバトンは妻に渡し、僕が今度は子どもたちの面倒を見ることに。いそぎ保育園はじめとした通っている施設に連絡。みんなさんからは、「またですか!!大変・・・・!!!」って感じで妻の心配をされた。

8月10日

沖縄はお盆シーズン開始だが、もちろん僕たちは実家にいけず家で待機。子どもたちの面倒はこれまで何度か経験しているので、大変だけどこなせるタスクなんですが、会社への対応とかが滞っており、ハラハラしてた。関係者各位に連絡して予定を延ばしてもらうことで事なきを得た。よかった。

次男が感染(しなかった)

8月11日

夜、次男が熱発した。うおおおおおおおおおおってなった。

8月12日

薬局に事情を説明して抗原検査キットをゲットした。早速次男につかってみたところ、陰性だった。なんだと・・・・!??? 鼻水ダラダラだったので妻と電話で話したところ中耳炎じゃなかろうかという判断になった。陽性者じゃないのはいいが、鼻水つまり夜中きつくて何度も起きて僕も寝不足だったので、事情を説明して受付できる耳鼻科を探していたが、なんと旧盆シーズンで日曜日まで休みのところが多く、次男可愛そうってなった。がんばって鼻水吸ってみたがあんまり改善せず。すまぬ。。。。

夜、熱が辛いのか、横にしても咳して泣く、寝かしつけても咳して泣く(無限ループ) そして眠れぬ日々が続く(このときが一番きつかったかも)

長男が感染

8月14日

妻があと1日で部屋からでれる、隔離期間やっとおわり〜〜とか思ってた昼間。毎日子供のデコを触っては熱をあてることができるまで進化した僕の手からエマージェンシー!!!

長男のおでこが熱い。おいおいと思い、熱を測ったところ38.5℃!!!!!

おいおいと思い、抗原検査キットで検査したところ、陽性〜〜〜〜〜〜うお〜〜〜〜〜〜〜〜まじか〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

ちゃんと隔離してたのになぜ〜〜〜〜〜〜〜〜〜〜とか思ってたんですが、色々調べたところ

  • PCR検査は陰性証明ではない(発症しないと陽性にならなとか)
  • 潜伏期間というもがあり、最大で14日

まじかよ。PCR検査とは一体ってなりましたが、2時間ぐらいで持ち直し、妻も隔離している意味ないので部屋からでてきてもらいました。

長男この日の夜がめっちゃきつかったのか、暴れ馬がめずらしく沈黙してベッドで少し泣きながら寝てた。この子は熱性けいれんが1歳〜2歳のときがひどく何度か救急車にお世話になっているので、少しハラハラしてた。

無敵の次男

8月15日

子供のお世話になっている施設に連絡。今週から来週にかけてこれないよ。今度は長男だよ。

やっぱり心配なのか、長男くんになにかったら連絡してください!と心配された。

ほんで、長男はこの日から元気になった。症状はあっという間、隔離期間がしんどいコロナ。元気なのが一番ですが。

で、問題の次男もかかっているだろうと想定してた。抗原検査キットは陰性だったけど、そのあと何回か熱発してたし、それが中耳炎かどうかは素人の僕では判断できなかった。

んで、PCR検査を予約した。その日でおkってことになったので、検査しにいった。何回いくねん。

8月16日

検査結果の連絡があった。陰性。まじかよ。なんで??????????

とはいえ、長男の潜伏期間の件があったので、8月24日まではちゃんとみます〜ってなった。

個人的にはまじか?って思っているんですが、実は母親がコロナ感染しても、母乳を子供に与えることはできるらしく(母乳にウィルスが含まれることもあるらしいが、母乳与えるメリットのほうが上回るとのこと。もちろん咳とか飛沫からは感染するのでその点は注意)、その際抗体が作られていたら子供に与えることができるらしい。ただうちはタイミング的には抗体ができる前には隔離しているはず?なので、次男のケースには当てはまらないのでは?と思っている。

終わった!!!!!

8月24日

長男も次男のなんも症状でてない。やったぜ!おわった!!!!!!

くぅ~疲れましたw これにて完結です! 実は、コロナ陽性者になったら家族へリレー(実際は違うかもだけど)してしまったのが始まりでした(ry

家族誰も後遺症もなく今はもう元気なんですが、隔離期間がきつすぎて二度とかかりたくはないなって思ったマンです。

やっとジュラシックワールドを見に行くことができます。そして晴れて9月から仕事開始です(涙)

次はRubyなんですが、全然勉強できておらぬ。あかん。

【わからない】react-hook-formとYupで複数フィールドの重複をチェックするバリデーションとエラーを表示するフォーム

ほぼ1日かけて探したけどわからないので供養

const uniqueId = (value, context) => {
  const [_, parent] = context.from
  const filedNames = ['hogehoge1', 'hogehoge2', 'hogehoge3']
  const list = [
    parent.value.hogehoge1.id,
    parent.value.hogehoge2.id,
    parent.value.hogehoge3.id,
  ]
  console.log(list)
  const r = !list || list.length === new Set(list).size

  if (r) return true
  const errors = []
  const duplicateErrorMessage = 'IDは重複してるので入力できません。'
  // とりあえず雑に組む(ry
  const a1 = list[0] === list[1]
  const a2 = list[0] === list[2]
  const a3 = list[1] === list[2]
  if (a1) {
    errors.push(new yup.ValidationError(duplicateErrorMessage, 'type', `${filedNames[0]}.id`))
    errors.push(new yup.ValidationError(duplicateErrorMessage, 'type', `${filedNames[1]}.id`))
  }
  if (a2) {
    if (!a1) {
      errors.push(new yup.ValidationError(duplicateErrorMessage, 'type',  `${filedNames[0]}.id`))
    }
    errors.push(new yup.ValidationError(duplicateErrorMessage, 'type', `${filedNames[2]}.id`))
  }
  if (a3) {
    if (!a1) {
      errors.push(new yup.ValidationError(duplicateErrorMessage, 'type', `${filedNames[1]}.id`))
    }
    if (!a2) {
      errors.push(new yup.ValidationError(duplicateErrorMessage, 'type', `${filedNames[2]}.id`))
    }
  }
  return new yup.ValidationError(errors)
}

const defaultSchema = {
  hogehoge1: yup.object({
    id: yup.string().required('IDを入力してください') // TODO: 他のidと重複しちゃだめ
      .test('unique_id', uniqueId),
    location: yup.string(),
  }),
  hogehoge2: yup.object({
    id: yup.string().required('IDを入力してください') // TODO: 他のidと重複しちゃだめ
      .test('unique_id', uniqueId),
    location: yup.string(),
  }),
  hogehoge3: yup.object({
    id: yup.string().required('IDを入力してください') // TODO: 他のidと重複しちゃだめ
      .test('unique_id', uniqueId),
  }),
}

const schema = yup.object(defaultSchema)
// 省略
  const {
    register,
    handleSubmit,
    formState: { errors },
    watch,
    control,
  } = useForm<CreateInput>({
    resolver: yupResolver(schema),
  })

やりたかったこと

  • 1 特定の複数フィールドのidが重複していないかバリデーションをかけたい
  • 2 a,b,cとあった場合、a,bのフィールドが重複している場合、a,bのフィールドにバリデーションエラーメッセージを表示したい
  • 3 a,bのフィールドが重複してエラーメッセージが表示されている場合、aを修正するとa,bそれぞれのフィールドからバリデーションエラーメッセージが非表示になる

できなかったこと

  • 1,2はできた、3ができなかった
    • aを治すとaは非表示になるが、bはバリデーションが動かないっぽいので表示されたままになっている

できなかったことについて試したこと・探したこと

  • ValidationErrorを返したらエラーが表示されるのでreturnしたらクリアされるやつとかないかな?
    • なさそう
  • Yupを外部から無理やりでもいいからフィールド指定したらバリデーション叩いてくれるやつないかな
    • なさそう(引数食わしたらバリデーション実行できるやつはあるけど、状態が変化するやつじゃないのでFormまで伝播(?)はしない
  • react-hook-formのtriggerやFormStateを駆使してyupのバリデーションを叩いたり、errorsを書き換えようとした
    • Yupの世界からでてしまうので嫌だなと思ったのと、バリデーション実行するとレンダリングが複数走るので実装が複雑になっちゃうのと、Yup → react-hook-formがYup ↔ react-hook-form の依存になるのでこれも嫌だなと思ったため諦めた

学んだこと

  • schemaをネストする
    • ↑のように hogehoge1_id でもできるけど、ネストして hogehoge1.id でもできることがわかった
    • ただその場合、 ネストしたobjectを yup.object() にわたす必要がある。じゃないとエラーになる
  • ValidationErrorで返すと複数エラーメッセージを返せる
    • CreateErrorで返すサンプルが多かったんですが、pathを複数もたせる(複数フィールドをバリデーションエラーにしたい)場合どうすれば?をぐぐると、ValidationErrorを配列に詰めて最後にValidationErrorに食わせて返すでおk
  • フィールドに紐付けず、schemaから .test メソッドなどを生やしてバリデーションを書くことができる
    • 全体の値や一部フィールドの値を使ってバリデーションを実行するってこともできることがわかった

(追記)実装パターン追加

いずれも解決できず。。。orz

refを使う

他フィールドを参照して自分フィールドの値と同じかどうか確認する

  hogehoge1_id: yup.string().required('hogehoge1 IDを入力してください')
    .notOneOf([yup.ref('hogehoge2_id')], 'hogehoge2_idと同じ値です')
    .notOneOf([yup.ref('hogehoge3_id')], 'hogehoge3_idと同じ値です')

ただ、hogehoge2_idが重複しててもエラーメッセージは hogehoge3_idと同じ値です になる。なぜか上書きされる

whenを使う

whenは1つしか引数与えられないと思いきや複数行けた。良い!

  hogehoge1_1: yup.string()
    .when(['hogehoge2_id', 'hogehoge3_id'], (hogehoge2_id, hogehoge3_id, schema) => {
      return schema.notOneOf([hogehoge2_id, hogehoge2_id], 'hogehoge2 ID、またはhogehoge3 IDは同じ値で入力できません。')
    })
    .required('hogehoge1 Device IDを入力してください'),

TypeScriptだと下記エラーがでる。わからないのでほっといている

型 '(hogehoge2_id: any, hogehoge3_id: any, schema: any) => any' の引数を型 'ConditionOptions<StringSchema<string | undefined, AnyObject, string | undefined>>' のパラメーターに割り当てることはできません。
  型 '(hogehoge2_id: any, hogehoge3_id: any, schema: any) => any' を型 'ConditionBuilder<StringSchema<string | undefined, AnyObject, string | undefined>>' に割り当てることはできません。ts(2345)

で?結局できたの?

できませんでした。 実装はスッキリさすことができたが、 できなかったこと をクリアすることができなかった。

【Jest】テスト実行時にテスト名をconsole.logで表示する

describe('useHogehogeHook', () => {
  beforeEach(() => {
    console.log(expect.getState().currentTestName);
  });

  // 省略

これで、各テスト実行時にテスト名を表示してくれるようになる。

デバッグしているときに、どのテストでデバッグようにhookに追加したconsole.logが表示されているのかを追うときに便利(そんなことやらずにデバッガ使ってやればいいって話もあると思うけど、僕はまだその域にいけていない)

React + GraphQLで通信エラーを確認する

ベストプラクティスはどうやってデバッグするのかはわからないですが、下記メモ。

query, mutationからerror変数を取得する

  // errorを確認してみる
  const { data: getSomething, loading, error } = useGetSomethingQuery({
    variables: {
      id,
    },
    fetchPolicy: 'no-cache',
  })
  console.log(error)

すると、 Error: Internal server error が発生していることがわかりました。

chromeのdeveloper toolsのネットワークでdebugMessageを確認する

該当するrequestのレスポンスを確認してみるとわかりました。

{"errors":[{"debugMessage":"Cannot return null for non-nullable field hogehoge...".","message":"Internal server error","extensions":...

API側でなんらか問題が発生していることがわかりました。以上。

VSCodeとDockerとDocker Volume使ってTypeScript + React開発しているとnode_modulesをVSCodeが参照できないから型探検隊になってしまい夜しか眠れなくなる

参考にした記事

zenn.dev

zenn.dev

www.keisuke69.net

僕が試した手順

pluginをインストール

このあとdocker-compose.yml用意しないといけないのかだるいとか思ってたけど、何もしなくてもよかった。

VSCodeの左したをクリックして、起動しているコンテナにAttach

選択すると起動しているコンテナの一覧がでてくるので選択する。すると、別Windowが起動するのでそこで作業すればおk

雑感

環境構築するのに結構時間かかるとか思ってたからやらなかったけど12分。。。。