生存報告所

日記だよ!

10/6 native-build

10/6(日) 睡眠時間8時間45分 2,741歩

 豆苗を窓に飾って育て始めた。部屋に植物を置きたいが、鑑賞のためだけに育てるのは少々めんどくさい…と思っていたが、生えすぎた草は食べることが出来る豆苗はとてもエコ! 胃袋までよろしくね。

やったこと

Scala 

 今日こそは逃げ続けてきたビルドをしなければいけない。

 睡眠はたっぷりとった、食料は確保してある。天気は曇り、暑すぎず寒すぎず半裸で過ごせる程度の快適な温度。さぁ、開発の始まりだ!

目的は、Scalaアプリの起動をCloud Runで1秒以内にすること。自分でそれっぽいDockerfileを書いて動かしたときには20秒かかって笑ったが、今度こそやるぞぉ!

 

 職場の隙間時間でひたすら調べた結果、道筋は見えている。

 Scalaアプリをsbt-assemblyでjarファイル化

⇒出力されたjarファイルで、動くことを確かめる

⇒jarファイルをGraalでnative-buildする

⇒出力されたバイナリをローカル環境で実行し、動くことを確かめる

⇒同じことをDocker出来ることを確かめる。

⇒CircleCIで同じことが出来ることを確かめる

⇒Cloud Runに上げる!

という流れになる。ね、簡単でsý…なわけないだろ!!

 

Scalaアプリをsbt-assemblyでjarファイル化

 やり方が分からない(かつ、期限が本当に差し迫っている)のなら、とりあえずGPTとQiitaに頼ろう。

 sbt マルチプロジェクトビルド sbt-assemblyでそれぞれのjar生成 #sbt - Qiitaという、似たような状況で有難い記事があったので参考にして設定を作る。感謝。

今回はhttp4sでサブプロジェクトを活用したアプリだったが、ほぼ問題なく*1assemblyファイルを出力することが出来た。

java -jar main.jar

 で起動することを確認。ヨシ! (1時間経過)

 

 ちなみに余談だが、このjarファイルは本当にどこでも動くのだろうか…と遊んで、javaのバージョンが合っていれば本当にどこでも起動することを確認した。疑って会社のPCにまで送り込んで起動確認までしたから間違いない。

 本当にrun anywhereなjarファイル凄いぞ!! と1人で感動していたが、規約を確認したら作成は1996年。実によく枯れた28年前の技術である。

 

jarファイルをGraalでnative-buildする

 うぉー、次が分からなければとりあえず調べて先人の足跡をなぞれ!!

 ScalaをGraalVMで動かす&ネイティブイメージ化する #Java - Qiita

 「ずばりこれ」と言えるような記事があったので感謝してなぞる。大感謝ぁ!

 詰まった部分ではエラーを読み、分からなければとりあえずGPTに聞いて解決していき、先ほど作成したjarファイルをバイナリファイルに変換することが出来た。

英語のドキュメントというだけで躊躇してしまうモノリンガル人間なのだが、GPTは世界を飛び越えて情報を教えてくれるからありがたい。ハルシネーションなんて知らねぇ!  動かして確かめる! ダメならもう一回GPTをノックだ!!

 

出力されたバイナリをローカル環境で実行し、動くことを確かめる

 出力されたバイナリファイルを実際にローカルで起動。

ログが出ねぇ!!

 ログが出ないという目隠し状態ではあったが、起動はしているらしい。実際にアクセスしたら問題なく動くことを確認できた。

 sbt runで動かした場合、どんなに小さくても数秒はまたなければいけないのに、バイナリなら一瞬である。すごい!!(計2時間経過)

 

 ローカルであっさり成功したんだから、あとはすぐだろうと慢心する。ここからが長かった。

 

同じことをDocker出来ることを確かめる

 無理だ、出来ねぇよぉ!!

 

 まずはDockerで動かすために適切なimageを取得してきて、環境を作るためのインストールを設定し、環境変数もセットする。書けば1行なのだが、Dockerfileを新しく書く経験が薄かったため、ここまでに3時間ぐらいかかっている。

 

 舞台をセットしていざDocker Build! 結果が出るまでに実に30分。そしてエラーを吐きおった…。

メモリ不足、タイムアウトエラーを1つずつ潰しているはずなのだが、全くうまくいかない。いろいろと追加して5時間ほど粘ったのだがうまくいかずに諦めた。

 

 しょうがない、Cloud Runに上げて速度検証という目的だけが果たせればいいため、力押しプラン変更だ。

 

バイナリファイルをCloud Runに上げる

 Dockerでビルドできないのであれば、ローカルで作成したものをクラウドに上げればいいのだ、ハッハー!

 

 4行で終わる大変シンプルなDockerfileを作成して上げてみた。バイナリファイル? もちろん、Gitにプッシュである。(約90MB 止めましょう)

FROM debian:sid

RUN apt-get update && apt-get install -y zliblg
COPY ./binary-app /binary-app

CMD ["/binary-app"]

 

 CircleCIが動き、Cloud Runにデプロイ完了。起動は…早い、早いぞ!!

レイテンシー

 以前は20秒かかっていたのが1.4秒である。起動速度は約1/14。全力疾走のウマ娘(60㎞/h)が徒歩で移動している人(4.2km/h)と競争するくらいの差である。あれだけ私を困らせていた起動速度が解決出来て、部屋中を小躍りである。

 

 問題はたくさん抱えている*2のだが、とりあえず動かすことが出来て良かった。まだ第一歩である。(計12時間経過)

 

休憩

 途中でビルドが1回30分かかるようになってしまったため、待ち時間はエラーの解決法を調べつつ、他の作業も進める。

 

コインランドリー:曇り空が多いため、今日も乾燥だけさせにいく。洗濯機を開けて白い粒上の残骸が広がっているときには涙をのんだ(ティッシュ)。

シャツを初めて乾燥機にかけたのだが、皺が全然ついていないことに感動する。

アークノヴァ:2回ぐらい遊ぶ。昨日は”経験豊富”という難易度でボコボコにされたのたで、今日は初心者モードをクリアして溜飲を下げる。

掃除:よく捗りました。

 

Refind Self

 休憩時間に何かできること…本はじっくり読みたいしなぁ…。よし、新しいゲームをしてみるか! ということで最近流行りの(?)性格診断ゲームを買ってみた。

 

 ゲームの目的は簡単。入った世界を好きなように動いて、自分の性格を見つけることである。

23種類の性格があるらしい

 心理テスト系だと大体エネルギッシュ、活動的と診断されがちな私である。MBTIだと起業家・指揮官といった理論家討論大好きモンスター扱いされるのだが、いったい何が診断されるだろうか…とワクワクしつつ始まるのを待っていた。

 

ゲーム中と終了時

 始まるとロボットの女の子になり、好きなように島の中を移動することが出来る。最初に右に動くのか左に動くのか墓を見るの物を拾うのか…という行動1つ1つによって性格分類が始まっていき、一定回数の行動をこなすと診断は終了する。

 

 心理テストでは「こう答えた方が一貫性があるよな…」などと考えながら答えてしまうタイプなのだが、これなら全く解答の方向を意識しなくてすむ!

好きなように移動させて探検を楽しんでいた。

 

  そして気になる結果は~ \ジャジャジャン/

単純で強い力が欲しい

 

 脳筋だぁぁぁ!!! 

 

 なになに、詳細は…「単純な選択と行動の好みを持つ。周囲からはみ出ず、無難である解答と選択を探し、周りと強調する力も持ち合わせている。」

すごい! 今までの心理テストで言われたことはなかったけど、今の自分にとても当てはまる気がする。

惰性で続けるのは良くないよな…とは思いつつも、人のお薦めをそのまま選び続けたり飽きずにお好み焼きを食べ続けたりしている! 新しく考えるのが面倒なのだ。

 

さて、私を補足する性格は…

私を補足する性格

 あ、当たってる! 無難でいたいけど、自分が知らない事を知ってみたいから人のお薦めにはとりあえず従ってついて行ってみる。あとは、とりあえず人がやって無さそうで単純そうで面白そうなことには手を出しがち!

 そして面白そう・便利そうなのを見つけたらこだわって使い続ける熱意の性格である*3。一度ハマったゲームは仕事以外全てを捨てて遊び続けてしまう! 納得だ!

 

 一週目クリアの時点で、既に自分を丸裸にされたような感覚だが、2週目、3周目もクリアしてみた。

秘められた性格

 これはよく分かる。幼少期からボドゲを遊ぶ友人がいたため、何か目的があるならばそこを目指して進むように私は出来ている。

「判断を多く早くした方が多くの手を試すことが出来る=勝ちの手を見つけやすい」という考えが反映されたのであろう。ボドゲを軸に性格が決まりすぎである。

 

 そして最後は最も遠い性格。

最も遠い性格

 まぁこれも頷ける。立ち止まって悩むよりも、とりあえず1手進める方が良いだろうと思うので、あまり深く考えすぎないようにしている。

だから、考えすぎないことを引け目に感じるのではなく…

 マイナス値。もう少しは考えろ!!!

 

 自分で選ぶ診断とは違う、素の行動から導き出される性格診断はなかなか面白いものだった。

 

 まとめると、シンプルで分かりやすいのものを好み知らないものにはワクワクするが、決めたら同じのを使い続ける目的を決めたら悩まず止まらずに一直線

脳筋新幹線である。ウマ息子とかになれないかな…。

 

ごはん

 朝食:食べず

 昼食:味付き牛肉丼

 夕食:つけ麺

 

 楽なので味付き牛肉丼とつけ麺。料理? 必要になったら覚えるから頑張らなくていいんだよ。

*1:Mergeの設定が悪くて昨日まで数時間悩まされていたのだが、結局地道にいくつかの設定を少しずつ変えて解決。META-INFは破棄してはいけなかった。

*2:ビルドが長い(メモリ量によっては20分以上)。メモリを行ける限り食い尽くす。なぜかログが出ていない

*3:ただの頑固とも言える