しろあんのさかな

ふーちゃのエンジニアブログ

マニラ(フィリピン)で39度超えの急性胃炎になって現地の病院にかかった話

留学先マニラで39度超えの急性胃炎になって病院に行った話です。胃炎になった時に使える英語や実際に困ったことなどを書きます。病気になる側ももちろん、帰国後にルームメイトに聞いた看病する側のことも聞きながらこの記事を作っているので、少しでもこの経験が誰かの参考になれば嬉しいです。

なにがあったのか

美味しいフィリピン料理の食べ過ぎなのか、語学学校帰りの屋台の美味しいマンゴーシェイクやタピオカジュースの飲みすぎなのか、環境の変化やストレスで疲れが溜まっていたのか、原因はわかりませんが、フィリピンに来て3週間目のある日の夕食後に急性胃炎になりました。 夕食で麻婆豆腐を食べた後、体がだるくて頭痛もして(最初は生理痛かと思いました)宿題が手につかずにベッドで横になっていました。夜になってもなかなか寝付けずに吐き気がしてきて、ずっと吐き気と戦った後ついに戻してしまい、「さすがにやばいな」と思って寮にいる日本人スタッフに朝になったら病院に連れて行って欲しい旨をLINEし、朝まで様子見することにしました。でも結局寝付けずに横になって戻してを10度くらい繰り返していると、ルームメイトで一緒に留学していた医学部1年生の女の子が気づいて起きて来てくれて日本にいる留学担当の先生経由で保険会社に連絡をして病院を紹介してもらったり、日本人スタッフを起こしに行ったりしてくれた結果、朝5時くらいに地元の救急病院に行けることになりました。

病院事情

最初の救急病院が色々な意味でやばかったので合計して二つの病院に行きました。これは悪口とかではなくなるべくありのまま、見て来たものを書きたいと思います。

地元の救急病院(ここがやばかった)

早朝であったのと、タクシーで遠出するのが心配されたことが理由で一番近くの地元の救急病院に向かいました。

環境について

ガソリンスタンドの3面を壁で覆ったような建物でした。たくさんの患者がおり、ベッドが足りずにベッドの近くに車椅子が密集して設置され、その中に混じって合計で7時間車椅子で点滴をうけました。途中高熱が出て来て、正直座っているのがとてもきつかったです。 注射もあまり上手とは言えず、針をさしたまま上下に動かそうとされたり、使用済み注射針を床に落としてしまったとき素手で拾ってしまうような環境でした(遠目に見てましたが本当に怖かったです)お医者さんなのかナースさんなのか医療スタッフはたくさんいましたが7割くらいは楽しく立ち話している感じで、患者に対応しているのは数人くらいでした。
血液検査と尿検査の結果はウイルスも細菌もネガティブだったので、本当にただお腹を壊して戻しただけのようでした。解熱剤を打ってもらうと熱もすっかり下がりました。朝5時について昼1時まで車椅子に座っていてしんどさと不安で半泣き状態でした汗

料金について

保険はききませんでした。診察代500ペソ、解熱剤代85.5ペソ、薬代681ペソかかりました。1ペソ2円なのでトータルで2500円くらいでした。

普通の私立病院(inマカティ)

こちらは海外保険が利用できた病院です。保険会社に連絡したのですが、いきなりで向こうもよくわかっていなかったのか、紹介してもらえず、現地の人で寮の病院関係に慣れた人に聞いて向かいました。地元の病院だけでは心配だったので再診断のために向かいました。マカティはマニラの近くの都市で街も整備され高層ビルがたくさん立ってる日本の都心と変わらないようなところです。私が滞在していた寮からはタクシーで約1時間程で行けるところでした。

環境について

ドキュメンタリー番組とかでよく出てくるような環境でした。海外の病院といえばと聞いていた「1から10までで頭痛を表して」もやりました。 結局診断結果は同じで、お医者さんからも、地元の病院の結果は正しいという言葉をもらいました。整理券をもらって診察する感じでしたが、夜9時前に到着して、1時間も待たずに整理券の番号が呼ばれて診察することができました。具合がよくなかったので再び点滴をしてもらい、今度はきちんとした個室でベッドに通してもらい2時間ほど横にならせてもらいました。

f:id:taiyaki_future:20190322220128j:plain
診断結果

料金について

保険がききました。寮の付添人の方がすべてやってくれたので、具体的に何をしたのかわかりませんが、保険会社が診察代と薬代全てを負担してくれたようです。

病院での会話で使った・使われた英単語やフレーズ

  • gastritis(胃炎)
    • 診断時に「原因はacidよ」といわれました。
  • gastroenteritis(胃腸炎
  • rash(発心)
    • 麻疹(はしか)と区別するために聞かれました。
  • admitted(入院)
  • vomit(吐く)
  • diarrhea(下痢)
    • loose(soft) stoolとかも聞かれました
  • pregnant(妊娠している)
  • period(生理)
    • physiologyのパターンもありました
  • intravenous drip(点滴)
    • ivと略されて使われていました。
  • sore throat(喉が痛い)
  • dizzy(めまいがする)
    • 理由はよくわからないけど何度も聞かれました。
  • headache(頭痛)
    • いつから頭痛があるの?
  • fever(熱)
    • 熱はいつからあるの?と数回聞かれました。
  • medicine(薬)
    • なんか薬のんだ?と聞かれます。
    • なんて伝えていたのか忘れましたが「パブロン」を日本人スタッフがうまく説明していました。
  • companion(同行者)
    • マカティの病院では「One patient, one companion.」(病院内に同行できるのは一人までだよ)と言われました。
  • What is 〇〇?
    • 単語がわからないときに尋ねるために使います。
    • 発音がわからないときもなるべく真似して聞き返します。
    • ex) What is "vomit"? / What is ぼみっと?

看病する側の視点

ほとんど寝ずにお医者さんを呼んでくれたり食事をはこんでくれたり全面的に看病をしてくれた医学部一年生の女の子に、帰国して落ち着いてから話を聞いてきました。彼女が一番心配していたのは、胃炎がノロや他のウイルスだったときのことです。部屋が一緒なのですぐ感染してしまうのではないかと消毒液で消毒したり、ゴミをこまめに捨てたりしてくれていたようでした。彼女の機転と日々努力して医療系の専門的な英語の知識を身につけていてくれたことが本当に頼もしかったし、ずっとついてて、薬を小分けにして渡してくれたり、気分がよくなるように楽しい話を聞かせてくれて本当にありがたかったです。

持っておくと便利なもの

フィリピンの大気汚染とエアコンからの空気がひどく喉を壊した矢先の胃炎だったので、胃(腸)関係だけでなく、喉関係も書きます。病院に行く前に予防するほうがいいので、予防グッズを持っていた方がいいです。

  • 常備薬(ハレナース・のどの薬)
  • マスク(日本みたいに気軽に売ってないです)
  • のど飴(龍角散とかあると安心です)
  • キッチン袋(戻す時ティッシュみたいに取り出せて便利でした。特にトイレが断水してたのでなるべくコンパクトにまとめるようにしていました)
  • お茶漬けのもと(食事で辛いものや脂っこいものをさけるため)
  • 体温計(現地でも調達はできます)
  • アルコール消毒液

実はちょうどこの時期に乾季で雨が降らないことによる計画断水も実施されて水道水やトイレの水が使えないこともあったので、そういった情報が入り次第現地のスーパーで水を調達していました。

語学学校の寮に滞在していたので、寮長さんに言っておかゆを作ってもらいました。ほとんど無味で少し元気になると味変しないと逆に食べられなくなるのでお茶漬けのもとなどを持って行くといいなと思いました。私は寮の普通のご飯のお供として出されるたくわんで味変して食べていました。

f:id:taiyaki_future:20190321190736j:plain
おかゆ

病気から感じたこと

なによりも幸運だったのがルームメイトやそのほか友人がが必死で看病してくれたこと。ポカリスエットを買いに行ってくれたり、マスクを差し入れしてくれたり本当にありがたかったです。もし一人だったらきっとこんなにスムーズに病院まで行けなかったと思います。私もルームメイトの話を聞いてもし次海外で同じような状況になったとき、より適切な対応ができるようになろう又は誰かをサポートするときに見習おうと思いました。頼らせてくれてありがとうございました。
現在マニラでは麻疹(はしか)が流行っているようなので、本当に今回の胃炎が麻疹によるものでなくてよかったです。(麻疹は空気感染するので...)麻疹に関しては日本では現在2度の注射が推奨されており、予防接種1回のみでは防ぎきれないとされていますが、私が幼い頃は1度で大丈夫と言われていた時期だったので、私は1度だけしかうけておらず、フィリピンへの入国前に2度目の予防接種をうけて行きました。医学部のルームメイトによると実際には麻疹の抗体価が低いと感染するということなので、渡航前に抗体価が十分にあるか確認するとより安心とのことでした。
実際フィリピンの地元の病院の入り口横のテントのようなところでは麻疹の患者がたくさん集められていたようだったので病院で二次感染とかしないように旅行前に予防接種の回数や抗体価を確認して足りない場合は注射を受ける方ががいいかもしれません。(予防接種の副作用が2週間後くらいに出るかもしれないらしいのでそれを考えて早めにうけておいた方がいいです。)

まとめ

海外で初めて病院にいきました。病院に行くときは時間がかかっても保険会社や学校などのすすめる、保険が使える病院に行くのがいいと思いました。そしてピンチの時は無理をせずに人に頼ってもいいと思いました。私は諦めてかなり頼らせてもらったことで病気から3日後のフライトも問題なく乗ることができました。この経験が誰かの役にたてば嬉しいです。

RCO(リクルートコミニュケーションズ)でインターンしてきた話

1月末から2月中旬まで1ヶ月RCOインターンしてきた話

きっかけ

今までエンジニアのインターンはたくさんしてきましたが、データ分析のインターンはやったことがなく、でも興味があったのでリクルートインターンに運が良ければ参加しよみたいなモチベーションでした。リクルートインターンした友人がたくさんおり、雰囲気よさそうだなという気持ちと、説明会で見たデータ分析コースの成果発表内容が面白かったので応募を決めました。

今回私が参加したのは今季から始まった「データエンジニア」という、データ分析もインプリメントもできるというコースでした。

私の応募当時のスキルとしてはSQLはまあまあかけるけど分析自体は自信がなく、受かってから「トピックモデルの知識があるといいから時間があったら勉強してきてね」的なこと言われて、「トピックモデルってなんだろ(Qiitaで調べる)」みたいな感じでした。

参加方法

リクルート全体のインターンから応募すると面接の過程で部署が決まります。 engineers.recruit-jinji.jp

私は面談でたまたまRCOに配属になりましたが、もし絶対この部署がいいみたいなのがあればたとえば「RCOがいいです」みたいに言えば全然再考して組み直してもらえると思います!選考フローの記事にも書きましたがなんでもかなり柔軟に対応してもらえるので、ちょっとしたことでも言ってみて大丈夫だと思います:)

より詳しい選考フローについてはこちらの記事に書いています。 taiyaki-future.hatenablog.com

仕事内容と環境

概要

RCOリクルートサービスの横断データを扱っている部署なので、いろんなサービスのデータを分析することができます。今回のインターンでも横断データを利用した学習モデルの構築を行いました。

雰囲気

正社員だとリモートワークすることもできるので、全体としてみんな自由に働いている印象でした。メンターがいないときは近くの席の人に聞いたり、ランチを一緒に行ってくださった一年目の方々に聞きに行ったりしていました。メンターさんをはじめ、面倒を見てくださった方々はとてもものごし柔らかなひとが多いですが、実はすごく優秀な人が多かった印象でした。

勤務時間

4週間で週3、週3、週4、週5で参加しました。1ヶ月はとても短く感じました。学校の用事や留学手続きなどばたばたしていたので、もし参加できるなら全部週5でやりたかったです。

その他行事

LT大会

2回LT大会で5分くらいのプレゼンをやります。私はLDAを用いたポケモン分類をやりました。テーマは自由でインターンが交代で話すみたいな感じでした。お寿司とお菓子がでました。LT大会での発表内容を記事にしたものが以下の記事です。 taiyaki-future.hatenablog.com

f:id:taiyaki_future:20190304204318j:plain
お寿司

f:id:taiyaki_future:20190304204327j:plain
LTの様子

同期とハッカーズバー

会社の行事ではなくただ単に同期と六本木のハッカーズバーにいきました。さすがみんなエンジニアなので、マスターさんのライブコーディングをみながらとてももりあがりました。みんなそれぞれ違う部署なので違う部署の話や就活話が聞けてよかったです。

f:id:taiyaki_future:20190304204341j:plain
ハッカーズバー

最終発表会

役員の人たちの前で10分間のプレゼンを行いました。LT大会とはちがって結構しっかりした感じの発表会で、前の長テーブルに審査員みたいな感じで役員さんが座って私も含めてインターンのみんなが緊張する感じでした。前日から資料を作り始めましたが、たくさんの方に添削してもらいわかりやすかったという好評をいただきました:)

その他サポート

給料について

1日7時間半で1万5千円もらえます。残業代はでません。最終発表会前日以外実際ほとんど残業しませんでした。交通費は別ででます。

ホテル

筆者は筑波大学生ですが、距離的には家から会社まで通勤に2時間かかります。通うのが辛いと伝えるとホテルオフィス間で電車で20分くらいのところにホテルをとってもらえました。ホテルは冷蔵庫、洗濯機、トースター、TVなどそろっており、週一で清掃が入ってタオル等をかえてもらいました。

近くにスーパーがあるので、味噌とドレッシングを揃えておいて、スーパーで買ったものと味噌汁とサラダを作って食べるみたいな生活をしてました。 食器も揃ってます。

f:id:taiyaki_future:20190304204348j:plain
ご飯例

お菓子・ドリンクが無料

オフィスではいわゆる無限ドリンクでした。私はごま味のばかうけが好きなので、データ抽出中にお菓子箱からデスクに選んできて食べてました。遅くまでやりたいときはカスタードケーキとコーヒーでリフレッシュしてからやりました。

ランチ代が無料

インターン1ヶ月で予算が割り振られていて、その範囲でランチにいけます!私のホストさんは割とこまかく予算を管理してくれており、毎日1000円くらいの無料ランチを4人くらいで行ってました:)たまに豪華ランチにしてくれてお寿司とかうなぎとか食べにいきました。

f:id:taiyaki_future:20190304204322j:plain
高級ランチ

部活

ヨガ部に一回だけ参加して来ました。先生が週一で来てくれるやつです。ホテル暮らしだったので来ていくTシャツがなくてインターンオリエンテーションでいただいたパソコンチョトデキルTで参加してきました汗(すごい人いっぱいいるのでひやひやした)

f:id:taiyaki_future:20190304204323j:plain
チョトデキルT

アドバイス

困ったことは人事さんとかメンターさんとかその他周りの人にたくさん聞いた方がいいです。私はグラフの書き方とか基本的なことでも数分調べてわかんなかったら質問していたし、メンターさんも快くアドバイスしてくれたので新しくて知らないことが恥ずかしいとかいう雰囲気は全然なかったです!ただ、みんなとても優秀なので「はやくこうなりたい」みたいな刺激をとても受けました。

まとめ

RCOインターンしてきた話でした。 仕事内容とサポートについて書きました。1ヶ月はとても学びになりました。

ポケモンを技で分類してみた~LDA for Pokemon~

ゲンガーとプリンが大好きな大学院生が趣味でポケモンを勝手に再分類したのでまとめてみます。
プレゼン内容をまとめていて長いので、めんどくさいひとは最後のカラフルな図だけ見るとなんとなくやってることがわかるかもしれません。

ポケモンに新たなタイプをつける

概要

簡単に説明するとポケモンとその技のタイプにLatent Dirichlet Allocation(LDA)を適用してポケモンに含まれる技の確率分布であるトピックを抽出した後にポケモンを技トピックの大きさに基づいて分類します。

ポケモンのタイプについて

今回利用したポケモンのタイプは18種類です。

  • ノーマル / ほのお / みず / でんき / くさ / エスパー / かくとう / どく / じめん / ひこう / むし / いわ / ゴースト / ドラゴン / こおり / あく / はがね / フェアリー

ポケモンは種類ごとに最大2つのタイプを持っています。ピカチュウでんきタイプフシギダネはくさタイプとどくタイプです。

今回の目的

つまり、単純計算するとポケモンのタイプの組み合わせは18*18=324通りとなります。151匹の友達を軽くこえています。そこで今回はポケモンの覚える技のタイプに注目して偏りを見つけて5つのTopicを生成することで新たなタイプとしてみることにします。

LDAについて

トピックモデルという文章分類モデルのひとつです。文章に現れる単語には何らかの規則や偏りがあると仮定し、その偏りに注目して文章中のまとまりをTopicとして分類する教師なし学習です。

  • 利点
    • 教師なし学習なので比較的データ準備が楽
    • K-meansなどと比較してひとつの対象(たとえば文章)が複数の性質をもつと仮定しているため多くの情報を活かせます。
  • 欠点
    • パラメータチューニングが難しいとされます
    • 外乱によわいです

LDAの有名な利用例(LDA for news)

LDAはニュース記事のトピック把握などに使われています。ニュース記事は記事ごとに含まれる単語の偏りがあります。その偏りをTopicとして単語の確率分布で表します。

  • Topicを単語分布で表した例
    • Topic0 : 内閣*0.3 + 選挙*0.3 + 会談*0.2 + 脱退*0.2
    • Topic1 : 株*0.7 + 赤字*0.2 + 需要*0.1
    • Topic2 : オリンピック*0.4 + テニス*0.3 + サッカー*0.3

ここで、各トピックの名前は見た人の判断で決めてよい。例えばこの場合、Topic0は政治、Topic1は経済、Topic2はサッカーなど。

  • 単語をTopic分布で表すことも可能
    • 内閣: Topic1*0.8 + Topic2*0.1 + Topic3*0.1
    • オリンピック : Topic1*0.1 + Topic2*0.2 + Topic3*0.7

LDA for Pokemon

ちょっとトピックモデルの本を読むとニュース記事などに対するLDAではwordをカウント(bag of words)しますが、bag of wordsはbag of 〇〇などに応用できます的なことが書いてあります。今回はbag of typeです。ポケモンのtypeでコーパスを生成します。

LDA for ニュース LDA for ポケモン
対象 ニュース記事 ポケモン
Topic 単語の確率分布 わざのtypeの確率分布
コーパス 出現単語 わざのtype

やったこと

  1. データを集める
  2. JupyterでLDA

結果

ポケモンに含まれる5つのトピックです。今回はこのトピックを新たなポケモンのタイプとしてみようということです。

f:id:taiyaki_future:20190213220542p:plain
LDA for Pokemonの結果

勝手に新しいタイプを命名します。実際わかる人が共感できれば大丈夫みたいなところがあります。そもそもTopicに命名しなくても大丈夫です。

  • Topic0 : みずタイプ
  • Topic1:化学・超能力タイプ
  • Topic2:器用なほのおタイプ・洞窟タイプ
  • Topic3:物理タイプ
  • Topic4:でんきタイプ

ちなみに各ポケモンはこのトピックの確率分布で表すことができますが、そのうち一つのトピックが9割を占めるポケモンの例を図示しました。

f:id:taiyaki_future:20190213230028p:plain
Topicごとに9割がそのTopicからなるポケモン

考察

わざマシンやそのた特別に覚えるデータもつかったので、ノーマルが多くなってしまいますね。”ねむる”などほぼみんな覚えられるノーマルタイプのわざマシンが多いからかもしれません。Topic数10だとノーマルばっかりになりすぎたので5にしました。 Topic0, Topic2, Topic4はよく分かれていると思います。特にTopic2は洞窟にいそうなほのお、いわ、じめんタイプがうまくかたまってくれました。Topic1,Topic3の命名は苦労しましたが、Topic1はエスパーとかゴーストとかが多かったので超能力タイプ、Topic3はかくとう、ノーマルという物理アタック系だったので物理タイプと命名してみました。

感想

LDAを利用してポケモンを再分類をしました。正解がない分類なので、定量的な評価が難しいです。いいやり方あればおしえてほしいです。結果をみるとまあまあ似ているポケモンがかたまったかなという感じです。
ドメイン知識(ポケモンの知識)があまりないグループ(研究室)とドメイン知識があるグループ(インターン先)の両方でプレゼンしましたが、ドメイン知識がないグループだと定量的な評価指標がないぶん評価が難しいのでこの手の分類は、如何にドメインについて説明するかはとても重要だと思いました。データにどんな偏りがあるか(たとえばポケモンならくさタイプとどくタイプは共存しやすいなど)は共有したほうがいいかもしれません。

参考

www.amazon.co.jp

radimrehurek.com

ABC埋めなるものコツコツやってます。

最近300点問題、400点問題を解けるようになってきたので、楽しくてできるだけ毎日解くようにしています。前回のABC116はDが解法は動画と同じでトライしていましたが、実装できずに悔しい思いをしたので、次は解けるように300,400埋めトレーニングしようと思いました。この前400が解けなかったので、いまだに茶色ですが、今はとりあえず水色になることを目標に頑張っていきたいと思います。

AtCoder Problemsでの現状

AtCoder Problems :ユーザー名を検索すると今までといた問題の内訳を見ることができます。私の今の状態はこんな感じです。

f:id:taiyaki_future:20190122174148p:plain
2019/01_AtCoderProblems

茶色に上がったので、1ヶ月を振り返ってみる:)

問題との相性がいい感じだったこともあり、今日茶色になりました。(嬉しい!)12月に参加した最初のコンテストはテストケースで途中からWAがでるな〜と思ってたら、long型じゃないとオーバーフローして変な値を返してることに気づけずに、だいぶ時間を使ってしまい、最初についたレートは28点でした...
そこからお正月はアリ本の初級部分とにらめっこしながら、QiitaのAtCoder 版!蟻本 (初級編)の問題を読んだり、レートはつきませんでしたが、DPまとめコンテストで動的計画法を勉強したりしてました。
DPまとめコンテストで、DPテーブルを書きすぎて今は若干どの問題もDPテーブルなんじゃないかと疑ってしまう呪いにかかり中です...汗

qiita.com

f:id:taiyaki_future:20190113235533p:plain
経過

AtCoder Regular Contest 037 B問題 バウムテストをJavaで解いてみてハマったこと

空き時間にQiitaで競技プログラミングの記事を読みながら勉強を進めています。今回はAtCoder 版!蟻本 (初級編) にある深さ優先探索の問題のひとつを解いた話を書きます。

qiita.com

問題

以下の問題です。ノードとエッジ情報が与えられ、閉路を持たない連結成分の個数を求める問題です。

arc037.contest.atcoder.jp

方針

下図のように深さ優先探索をして閉路を探して行きます。

f:id:taiyaki_future:20190104122638p:plain
深さ優先探索
閉路の条件はノードがすでに訪れたものであるかどうか。私は未訪問ノードを記憶しましたが、空リストに訪問ノードを記憶していくやりかたも考えられます。

f:id:taiyaki_future:20190104122720p:plain
判定条件

正解コード

import java.util.*;
import java.awt.Point;
class Main {
    static ArrayList<Integer> unVisitList;
    static Point[] edges;
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int M = sc.nextInt();
    unVisitList = new ArrayList<Integer>();
    edges = new Point[M];
    for(int i = 0; i < N; i++) {
        unVisitList.add(i+1);
    }
    for(int i = 0; i < M; i++) {
        edges[i] = new Point(sc.nextInt(), sc.nextInt());
    }
    int cnt = 0;
    while(unVisitList.size() != 0) {
        boolean isTrue = searchTree(unVisitList.get(0));
        if(isTrue) cnt++;
    }
    System.out.println(cnt);
    }

    // エッジを辿って下位ノードを検索する
    public static int nextNode(int n) {
    for(int i = 0; i < edges.length; i++) {
        if(edges[i].getX() == n){
        int num = (int)(edges[i].getY());
        edges[i].move(-1,-1); // エッジは使ったものは(-1,-1)を入れて消していく
        return num;
        }
        else if(edges[i].getY() == n) {
        int num = (int)(edges[i].getX());
        edges[i].move(-1,-1);
        return num;
        }
    }
    return -1;
    }

    // ノードがunvisitかどうか調べ、さらに下位ノードを探索する(再起)
    public static boolean searchTree(int i) {
        
        // ノードiがunVisitかどうかを調べる
    if(unVisitList.contains((Integer)(i))) {
        unVisitList.remove((Integer)(i));
    }else {
        return false; // unVisitでなければ閉路なので、木構造ではないためfalseを返す
    }
    int nextNode;
    boolean isTree = true;
    while((nextNode = nextNode(i)) > 0) {
        boolean isNext = searchTree(nextNode);
        isTree = isTree && isNext;
    }
    return isTree;
    }
}

ハマったところ

searchTree関数の中で再起するときに、正解コードは

boolean isTree = true;
while((nextNode = nextNode(i)) > 0) {
    boolean isNext = searchTree(nextNode);
    isTree = isTree && isNext;
}

としていますが、以下のように一行で書くと関数が呼び出されず誤作動します。

boolean isTree = true;
while((nextNode = nextNode(i)) > 0) {
    isTree = isTree && searchTree(nextNode);
}

isTreeがfalseだとわかっている場合は関数が呼び出されていいないようです。ちなみにsearchTree(nextNode) && isTree の順番だと正常に動きます。 誤作動するテストケースとしては、

4 4
1 4
2 4
3 4
2 1

がありました。深さ優先探索で、1->4->2->1->4->3の順に閉路があるかどうか探索しますが、1->4->2->1で閉路を見つけたあと、isTreeがfalseになり、4->3を調べるためのsearchTreeは呼び出されないので、3がunVisitにならずに別の木としてカウントされてしまいます。 サイトのテストは全て通ったので気づくのに時間がかかりました。

感想

複合代入演算子"&="はあまり使ったことがなく、こんなハマりポイントがあったとはという感じでした。

冬季リクルートインターン面接の対応がとてもよかった話

忘れないようにすぐ書きたくて書きます。リクルートの冬季インターンに申し込んだ話と対応が柔軟で感動した話。

申込〜合格まで

申込

同期ラインで夏休みにインターンしていた同期から10月半ばに説明会があるとまわってきたので参加したのがきっかけでした。説明会で過去のインターン生が2つ成果報告をしたうち、1つが面白そうだったのと、データエンジニアの内容が面白そうだったのでやってみようと思い申し込みました。
10月末にエントリー、WEBテストを終えメールでWEB面接の案内を受けました。

WEB面接

内容は話さないようにしますが、楽しくお話してたら終わっていました。WEBテストもそうですけど、数年前とはシステムが結構変わったなと感じます。月並みですが、繋がらないと焦るので余裕を持って臨むのがいいと思いました。

面接

本社に呼ばれて面接してきました。ここでも内容は話さないようにします。交通費を出してもらえるのがとてもありがたいです。

対応がよかったところ

WEB面接の結果と面接の日程ぎめは電話で結果を聞くということでしたが、その期間は海外にいて電話が難しいことをWEB面接官に伝えました。しかし(今思えば人事さんにもメールすべきだったのですが、)人事さんには伝わってなかったようでした。
にもかかわらず、わざわざ合格の期間にメールで折り返し電話するような旨を送っていただき、現在海外にいて電話が難しいことを伝えると、快くメールで素早い対応していただき、問題なく合格までいきました。