hibitの技術系メモ

数学とか3Dとか翻訳とか

退Dの覚書

 この記事は、社会人学生 Advent Calendar 2020 - Adventarの12日目の記事です*1

 hibitです。2019年夏に仕事を退職し、同年10月に入学しました。およそ1年強が経った形になります。どんな人間で何をやっているかは、このブログやQiitaを読めばわかると思います。

 特に言いたいこと(生い立ち好み趣味経歴なぜ退職なぜD進今苦しいこと楽しいことその他諸々)はないのですが、せっかくのアドカレということで筆を執らせていただきました。

 いきなりですが、退職してDに進んだ人って呼び名が難しいですよね。「社会人学生」という表現はよく使われますが、会社にいながら在籍しながら数年間かけて学位を取る方なら、この呼び方は適当に思えます。しかし、退職した後専業の学生になる人って何て呼べばいいのでしょうか*2

 私は退Dという呼び方を推したいと思います。という訳で、これは退Dの覚書です。

f:id:hibit_at:20201207225456p:plain

 サラリーマンにもなれず、現役学生にもなりきれぬ、哀れで醜い、特に可愛くもない何かだ。小僧、お前に退Dを救えるか。

 現状について何かを書くのって難しいですよね。それがネガティブなものであったとしても、ポジティブなものであったとしても。

 一年前、退職を目の前にした時は、元職場の実名を出してお気持ち退職エントリでも書こうと思っていたのですが、冷静に考えて何の得にもならないどころか更なるトラブルを招くだけだったので、取りやめました。

 基本的に退職エントリというのは、身の安全(=次の進路)を確保した人がドヤ顔で古巣を謗る為のものであり、本質的にはFakeです。往々にして生存バイアスや自己肯定感バフ*3が大量にかかるものなので、進路の参考にはならないものが多い気がします。時々、Realなもの*4も見つかりますが、そのような捨て身の記事は稀です。

 ネガティブなお気持ちエントリが我が身の為にならないことは想像に難くないと思うのですが、ポジティブなものも同様に扱いが難しいなと感じます。環境や、それを受け止める自分は、両者共々良くも悪くも変わってしまうものなので。

 今ここで「学生生活最高!」とか書いても、数年後したら不幸にも「あんなこと書かなければよかった」となるかもしれません。社会人を辞めて、自由な時間が一気に増えて、実現したいことが目の前にあって、そういった意味では自由かつ充実しているのですが、常に気楽で楽しいかと言うと当然そんなことはなく、不安感や焦燥感もその裏返しとして存在します。当たり前ですが。

 自分に起きた環境の変化には、事前に予想できてその通りだったものもあれば、予想以外のものもあって、それが数年後ひいては今後の人生にどのような意義を持つかは、正直今は判断できません。

 判断つかないけれど、自分がした選択が最善になるように、せめてもの努力を続けている、といった感じです。

 まだまだ退D生活は続きますが、これからもマイペースに頑張っていきたいと思います。

*1:ですが、書くのめっちゃ遅れて25日公開になりました。すいません

*2:このアドベントカレンダーは「仕事を休職や退職して学生をやっている(やっていた)方」も対象ということで、参加させていただきました

*3:新しい環境が変わる時、だいたい人は希望を持つものです

*4:勝手に引き合いに出してしまって恐縮ですが、https://takeda25.hatenablog.jp/entry/20120511/1336746314

Nuclear Compilationができるまで

 Beat Saber Advent Calendar 2020の5日目の記事です。

概要

 先日、有志のイベントで、以下のような動画を投稿した。

www.youtube.com

 要は、ある音ゲーの有名譜面をメドレー形式の譜面にして、それをあたかもフルコンしたかのような動画を作成した。使用させていただいた譜面は以下の通り。

Song Title Song Author Mapper
Nuclear Star Camellia hexagonial
Quaver djTAKA hexagonial
Marianne Yooh Redmagi
Acid Burst memme iraky
G1ll35 d3 R415 Team Grimoire hexagonial
Chrom Vox (Uncut Edition) t+pazolite souk
Big Daddy USAO nuketime
Revolution Lapix cortex
Possessed By The Blood Moon Reek de125
Overkill RIOT nuketime
Freedom Dive xi roffle

 私以外に同様の作業をできる人(≒わざわざやろうとする人)はいないとは思うが、以下に作業の要領を述べる。

編曲

f:id:hibit_at:20201204153046p:plain

 まずは音源をメドレー形式にするところからである。音源編集にはLogic Pro Xを用いた。

 bpmは終盤を除き、199に統一した。メドレー中で使われるNuclear Starという楽曲のbpmである199に合わせた。

 各音源から美味しいところを切り出し、DJ気分でつなげていく。

 異なるテンポの曲を同じテンポに統一するにはスマートテンポが便利である。曲のつなぎ目はボリュームを調節してフェードインさせたり、イコライザで帯域分けを活用した。電子音楽(というか音ゲー曲)の特性上、ぶつ切りのカットイン編集にしても違和感はそんなになかったので、その点は編集が楽だった。

 音ズレに関してはかなり気をつける必要があって、スマートテンポの補正がうまくいかずにどうしてもリズムがずれてしまう場合もある。更に言うと、曲全体を通して常にメトロノームと厳密に合わせる必要があって、これは地味に面倒くさい。

作譜

f:id:hibit_at:20201204180524p:plain

 音源ができたので、これをマッピングしてノーツ(ゲーム上の音符)を載せていく。

 今回使用した楽曲は、すでに他の人がマッピングしたものを流用させていただくので、そういった意味では特に手間はない。ただ、一つ一つ丁寧に見ながら手動でコピーしていては、マッピングの勉強にはなるかもしれないが、日が暮れてしまう。効率化する必要がある。

 譜面データはjsonで管理されているので、以下のPythonスクリプトを用いて対象譜面のコピーしたい部分だけをメドレー譜面に持っていく。

 コピペ完了した後でも

  • コピペミスがないか
  • 微妙な音ズレがないか

 を常に気にする必要がある。スマートテンポを使った場合は確実にどこかで微妙な音ズレが発生する可能性があり、最終的にはマッパー上でミリ秒単位の調整を要した。

 が、実は一回アップロードした後で音ズレを指摘されるという一幕があった(申し訳ない)。音ゲープレイヤーは音ズレに非常に敏感なのだ。お前は敏感じゃないんかい……と言われそうだが、10分近い譜面を何回もプレーしていと、さすがに感覚が麻痺していって見落としも出てくる。譜面のテストプレイは必須だが、長時間の譜面ではかなり神経を消耗する作業になる。再アップロードは悪ではないが、避けられるならなるべく避けたいものである。

動画作成

1.オーバーレイ

f:id:hibit_at:20201204180719p:plain

 疑似フルコン動画を撮るにあたってまず必要となるのはオーバーレイをフルコンっぽくすることである。

 当然ながら10分近い動画でフルコンを達成する不可能である。そもそも私の技量ではクリアさえ不可能だが、理論接続できれば頑張ってフルコンしようという問題ではない。長期スパンの動画制作で重要なのは、何よりもまず神経の消耗を防ぐことである。要は同じような絵面さえ取れれば手段は何でもいいのだから、ズルをさせてもらった。

f:id:hibit_at:20201204175606p:plain

 以下のPythonスクリプトを組んで、ノーツをすべて同じ位置のドットノーツにした。これで、適当に剣を振り回しているだけでフルコンのオーバーレイが作成できる。オーバーレイだけグリーンバックで撮影して、後で動画に後付する。

2.ノーツ&セイバー動画

f:id:hibit_at:20201204180113p:plain

 次に、フルコンしてるっぽいノーツ&セイバーの動画を撮影する。アバターは映さなくてもいい。

 先程も述べた通り私の実力ではクリア不可能なので何かしらごまかす必要があるが、今度はノーツの種類を変える訳にはいけない。ということで、時間を遅くして撮影する。通常、低速で撮った動画を倍速編集するとそれとわかる不自然さが出るものだが(機敏過ぎる動きをしている)、等速のアバター画像を別撮りすることにより、その不自然さをある程度は隠せる。

 低速再生を行う手段は、ゲーム自体に搭載さているPRACTICE MODEでは50%が限界だが、なるるるるな🍥🌙 (@nalulululuna) | Twitterさんが使ったMODを個人的に分けていただいて、任意の速度でゲームをプレイできるようにした。実際の撮影では、基本的には1/4倍速、それでもフルコンが厳しいところは1/8倍速で撮影している。

 後はひたすらゲームをプレイするだけだ。スローモーションの世界の中で集中を保つのはけっこう忍耐力が要る。また、いくら低速にしていてもフルコンがつらい箇所は存在する。フルコンで数十秒ぐらいまとまった所を撮れたら次、それが終わったら次、という感じで、尺取虫が進むようにツギハギで編集していく。かなり地道だが、ここで調子に乗って数分まとめて撮ろうとすると沼って神経を消耗するのでやめた方がいい。適度にスローに、そして小分けにすればするほど、遠回りのようで結果的には近道になる。一般的には、動画をツギハギしたら不自然になってしまうが、ノーツ&セイバー動画では、ノーツの位置は一切変わらない&セイバーの位置もそこまで大きくは変わらないおかげで、ツギハギ編集しても違和感はほとんどない。

3.アバター動画

f:id:hibit_at:20201204180221p:plain

 いよいよアバター動画だ。既に作成した動画に後乗せする用の、アバターだけの動画を撮っていく。

booth.pm

 アバターにはこの3Dモデルを用いた。後述するが、このアバター選びも重要である。

 アバターのオーバーレイには、既にこの世界では超定番となっているVirtualMotionCaptureを用いる。

 今回は、アバターの絵を上乗せするだけなので、LIVVMCAvatarといった、ゲーム中のオブジェクトとアバターの位置関係を反映させるような仕組みは必要ない。反面、アバターは常に手前にしか表示されないので、例えばノーツを手前に持ってくるような視点は不可能だ。もしそれがやりたい場合は、倍速編集を諦めて別撮りするか、もしくは手間が増えるが、

  1. 背景
  2. アバター
  3. グリーンバックでノーツ&セイバー

 というレイヤー構造で素材を用意する必要があるだろう。今回はさすがに見送った。

 後乗せのアバターがどのような動きをしても、ここまで来たらフルコン自体は揺るぎない。が、アバターの手とセイバーの位置があまりにもズレていたらで合成が一発で分かるので台無しである。あくまでアバターの手はセイバーを追従して、それっぽい絵面を保たなければならない。普通の二刀モードならばここは超大変、というか実質不可能なのだが、ここでキモになるのはこのゲーム特有のダースモールというモードである。

f:id:hibit_at:20201204180350p:plain

 スターウォーズの某キャラみたいに柄から両方向に伸びたセイバーでノーツを斬るモードだが、このモードだと両セイバーの中心が体の中心に寄りやすく、大体の配置は(理論的には)中央でグルグルしているだけで取れるという特性がある。この特性を利用して、

  • セイバーを録る時は、両手&スローモードでしっかり狙いをつけて、後で倍速編集
  • アバターを録る時は、片手を前に出して高速回転しているように見せかける

 ことにより、あたかもアバター片手ダスモで超人的な処理をしているような絵作りをしている。これはダースモールだからこそできるテクである。もちろん、ノーツの配置によってはどうしてもセイバーの中心が体の手前からずれてしまうので、その時は仕方ないのでアバターの方もそのつもりで手を動かす。これはある程度配置を覚えたり、違和感のない動きが出るまでリテイクを続けるしかない。

 すでに録画したセイバーに合わせるのはかなり難しいが、実はここでも楽をする手段がある。要は手元が見えなければ見えないほど細かい部分をごまかせるので、頭と服が大きいアバターはごまかしやすい。

f:id:hibit_at:20201203213003p:plain (手が頭で隠れるのでごまかしやすい)

 手元が見えるような細身のアバターだと、必要な撮影時間は軽く数倍になると思われる。

 アバターの動画は、ノーツ&セイバーのそれと違ってツギハギ編集できない。テレポートしたみたいになって、一発でバレる。そのため、一定間隔でトランジション(シーンの移り変わり)を設定して編集点を設けている。トランジション間はリアルタイムで腕と体を動かさないといけないので、動画作成で一番肉体を酷使するところかもしれない。

編集

f:id:hibit_at:20201204180848p:plain

 素材が集まれば、後は編集していい感じにするだけである。今回はAVIUtlを用いた。

まとめ

 技術の力があれば、人間は肉体の不可能を超越できる(ただし限界もある)!

waifu2xとffmpegで30fpsHD動画を60fpsFullHD動画にした

 諸事情で取り直しができない動画(30fpsHD)を60fpsFullHD化する必要があったため、

  • 高画質化 ... waiuf2x
  • 60fps化 ... ffmpeg

 を用いて補正処理を行いました。あんまり目新しいことはないと思いますが、主に環境再現とかエラー報告の話になります。環境はWindows10です。

Before After

ツール(断念)

waifu2xで動画をアップコンバートする | MyLaboratory https://xyle-official.com/2020/03/23/waifu2x_upscale/

 実は、様々な先人達が同様の取り組みをしていて、ツールも公開されているのですが、これらを使ってみた所上手くいきませんでした。ツールにはよくあることです。ツールのエラーに対処するよりも個別のステップを自分でやっていった方が早そうだと思ったので、そうしました。

高画質化(導入)

 高画質化にはGitHub - lltcggie/waifu2x-caffe: waifu2xのCaffe版を用いました。Releaseにある最新版をDLすれば動くと思います……が、最初はGPUが認識しませんでした。結果的にはcudaを最新にすると(10.1 -> 11.1)解決しました。cudaのドライバーはCUDA Toolkit | NVIDIA Developerでインストールできます。

 GPUは認識したのですが、画像を変換しようとすると「モデルファイルが開けませんでした」というエラーが出ました。知恵袋だとファイル構成が間違っている可能性があるということでしたが、その症例ではなさそうだったので不思議だなあと思っていたのですが、ものはためしにCPUを使うモードで実験してみたら上手くいきました。その後はなぜかGPUモードでも上手くいったので、よくわからないまま解決しました。ツールにはよくあることです。

フレーム分割

 waifu2xは画像を処理するソフトなので、動画を処理するにはまず動画のコマを全部切り出す必要があります。ffmpegでもできるらしいですが、コマンドラインで大量の画像を扱うのに慣れておらず変なミスをしそうだったのでPythonOpenCVでやりました。今回は 30 fps 6分弱の動画だったので、切り出したものは全部で 1 万枚強の画像、 1.74 GB分になりました。言いそびれましたが、作業スペースとしてそれなりのファイル容量が必要です。

高画質化(本体)

 1つのフォルダに画像がまとまっていればそれをwaifu2xで一括処理できます。GPUを使えれば1枚1枚はほぼ一瞬で終わりますが、1万枚近くあるのでそれなりの時間がかかります。今回は数時間かかりました。(GPU : RTX2070Super)。当然ですが、ここでも大量のファイル容量が必要になります。今回の場合、最終的に 10 GBぐらいの一時ファイルが生成された気がします。

f:id:hibit_at:20201022094510p:plain

フレーム結合

 例によってffmpegでもできるらしいですが、同様の理由によりPythonOpenCVでやりました。

60fps化

 これはffmpegでやりました。参考記事で発見したコマンドで一発でした。便利。

ffmpeg -i input.mp4 -vf minterpolate=60:2:0:1:8:16:32:0:1:5 output.mp4

 コマンドは1行で済みますが、実際の処理は数時間かかります(CPUもGPUもそんなに酷使しない感じでしたが)。

実務上のポイント

 これはあまりプログラムとは関係ないトラブルポイントですが、動画としては60fpsですが、2フレームずつコマが入っているので実際は30fpsになっているという事例がありました。その場合、上のコマンドではまったく同じ60fpsの動画が出力されてしまいますので、

ffmpeg -i input.mp4 -vf minterpolate=30:2:0:1:8:16:32:0:1:5 convert30.mp4
ffmpeg -i convert30.mp4 -vf minterpolate=60:2:0:1:8:16:32:0:1:5 output.mp4

 という感じで2回補正する必要があります。

3Dプリンタで幾何学的物体とこうめちゃんを生み出した

 生み出されたもの。

f:id:hibit_at:20200919165202j:plain

 幾何学物体。

f:id:hibit_at:20200919165159j:plain

 こうめちゃん*1

 縁あって、3Dプリンタで遊ぶ機械が与えられたので、感想とか注意点とか。想定読者としては、3Dプリンタに興味があるけど使ったことないぐらいのレベルです。フィラメント式と光造形式の2つを触ったので、その比較など。

幾何学的物体

 立方体を、対角線を軸に回転させたもの。1辺の長さを1とした場合、この体積が\frac{1}{\sqrt{3}}\piであることは東工大の入試等でも出題される等で有名です。こちらはFDM式、いわゆるフィラメント式で出力しました。プラスチックのフィラメントを熱で溶かして積層していくやつです。他の方式に比べて目が荒くなり、積層面が傾くとギザギザしてしまいますが、安価なので家庭用といえばこの方式なイメージです。今回はPrusaというプリンタを使いました。

 データはBlenderでサクッと作成。

f:id:hibit_at:20200919170233p:plain

 キューブをScrewモディファイアで回転させるだけという力押しな方法ですが、これをstl出力するだけでなんとかいけました。

 3Dプリンタ全般の注意点として、下から徐々に積層していく関係上、下に支えがないような部分には、臨時的にサポート材という部品を同時に出力していく必要があります。ピラミッドみたいな形なら何の支えもなく出力可能ですが、ワイングラスみたいな形だと、グラスの部分を出力する際にはその下に支えが必要になります。これは臨時的なものなので後で取り除く必要がありますが、フィラメント式の場合、これが力と神経の要る作業になります。

f:id:hibit_at:20200919170625p:plain

 この図形を出力した時は、上の図でいう黄色い部分にサポート材が必要になりました。このサポート材も同じフィラメントから出力されていて、後でベリベリ剥がす必要があるのですが、本来出力したい部分も一緒に剥がしてしまいそうで怖いです。このような単純な図形だったら指でなんとかなりましたが、もう少し複雑な部品になると、ピンセット等で頑張る必要がありそうです。

 出力時間はこのサイズで一晩ぐらい。

こうめちゃん

f:id:hibit_at:20200919171712p:plain

 みんな大好きこうめちゃんです。

 こちらは精度的にフィラメント式だと不可能っぽいので、より細かい精度を実現できる光造形式を試してみました。こちらはUVレジンという、紫外線を当てると固まる樹脂を利用して整形します。

 こちらも下から順に積層していくもので、サポート材が必要というのはフィラメント式と同じなのですが、こちらはサポート材が蝋のような物質で出来ています。そのため、縦横無尽にサポートできる上に熱で溶かせるので、極めて失敗しづらいです。反面、プリンタ本体はもちろん材料費もフィラメント式に比べてかなり高いので、ご家庭の使用にはハードルが高いです。今回は、Projetというプリンタを使いました。

 3Dデータはけっこう調整する必要があります。

 まず、元データ(アバター向けデータ)だと、3Dプリンタで出力するには低解像度過ぎるので高解像度化します。と言っても、これはSubdivisonモディファイアをかけるだけで解決します。

 もうひとつ面倒な工程があります。基本的に3Dプリンタ用のデータは閉曲面のメッシュを想定しており、穴が空いていたり、板ポリゴンを使ったりといったメッシュを想定しておりません*2。しかし、アバター用に販売されている3Dデータは髪や小物といった部分に板ポリを多用していることが多いため、その部分に適宜修正を加える必要があります。Solidifyモディファイアでそのような処理ができますが、個別に部位を選択して厚みを調節する必要があるので、少し面倒です。

f:id:hibit_at:20200921050130p:plain

 調整後の様子。

 出力は3日間ぐらいかかりました。

 また、光造形プリンタの場合、出力直後はサポート材の蝋がデロデロになっているのですが、それを更に溶かしたりまた洗浄液に浸けたりといった専門的な後処理が必要になります。ご家庭でやるには、価格の他にも、このような部分もけっこうハードルになる気がします。廃棄された枕状の大量の蝋は脂肪みたいでちょっとグロテスク……。全体の工程を通してかなりケミカルな要素が多いので、換気とかに気をつけないと、健康にも悪影響が出そうな気がします。

 アバター用の3Dモデルを(いくら調整したとはいえ)ほぼそのまま出力するということでどうなるか不安だったのですが、結果的にはかなり正確にしかも頑丈に出力されました。服や尻尾に小物としてついていたリボンは、洗浄したりしている内に取れてしまいましたが、これはさすがに出力する前にもう少し安定した造形にするべきだった案件であり、むしろ最初だけでも造形を正確に出力できたことに驚くべきでしょう。

 という訳で、3Dプリンタをやってみたという記事でした。

*1:https://booth.pm/ja/items/1791571

*2:これはフィラメント/光造形に関わらず、3Dプリンタ全般に言えることです。

KLabExpertCampに参加しました

 9/8~9/12、KLabExpertCampというイベントに参加しました。形式としてはインターンですが、業務を手伝った訳ではなく、参加者同士で集まってワイワイShaderを書いて映像作品を作ろうというものです。時節柄、オフラインではなくオンライン開催になりました。イベントの様子は#KlabExpertCampで。

作品

www.youtube.com

 Shaderなんぞやという方のために一応解説しておくと、この映像はすべてGLSLというプログラム言語で書かれたもので、3Dソフトによるポリゴン作成やレンダリング等は一切かませておりません。フラクタル処理を多用することにより、このような映像を生み出しています。

 コードを見たいという方のためにShaderToy(前半)(後半)にリンクを貼っておきますが、そこそこのグラボを積んでいるPCでないと計算負荷でPCが固まるおそれがあるので注意です。

 音楽はLogicで自作して後付しております。つよい人だとGLSLで音声すら作成する人もいるらしいです。(つよい)。

技術的な感想

  • 初歩的なレイマーチングはやったことはあるけど、カメラを動かしてスクリプトを作ってというのは初めてだった。
  • アポロニアンマンデルバルブを初めて使った。コードは流用させていただいたけど、思いつくのも実装するのもすごい。
  • レンダリングの処理をしてより見栄えを上げたかったけど、4日間の作業時間では無理だった。
  • VSCodeでGLSLをプレビューする環境を作り上げ、タイムラインの細かい調整はShaderToy Unofficial Pluginで済ませるというワークフローを確立した。作業効率50倍ぐらいになったと思う。
  • やっぱりフラクタルは楽しい。

イベント的な感想

 Shader勢が集まってShaderを書く会ということで、以前からVRChatで話したことある方、話したことはなくてもなんとなく名前は知っている方が多かったです。全員初対面というよりは話しやすい状態だったので個人的には助かりました。4日間で何回か講義を受けて、後はひたすらオンライン会議を繋ぎながら作業。入退場はある程度自由だし、ミュートもカメラオフも自由なので、他の作業と並行しやすかったのも助かりポイント。オフラインで集まって合宿みたいなのも、それはそれで楽しそうだったけど、今のご時世ではそもそも無理だったので、難しい……。

お世話になった諸々

  • かねたさんのコード。この🤔はかねたさんから許可を頂いて流用させていただきました。また、かねたさんにはメンターとしてレイマーチングやマテリアル設定のサンプルコード等もいただきまして、全面的にかなりお世話になりました。ありがとうございます!
  • アポロニアンのコードの本質的な部分はiq神のShaderToyから流用させていただきました。10行ぐらいの距離関数でこれが実装されるとか、信じられねえ……。
  • マンデルバルブのコードはこの記事から流用させていただきました。
  • GLSLの動画化には、避雷さんのShader Recを使わせていただきました。1分超の動画を投げても返ってくる。すごい。
  • 楽曲制作にあたっては、よじしょー君に色々とLogic操作の指導や助言をいただきました。助かった。

最後に

 このような有意義なイベントを企画したいただいたKLabの運営陣の皆様、誠にありがとうございました。他の参加者の作品も#KlabExpertCampから見られるので、興味があればぜひ。

 (☝ ՞ਊ ՞)☝KLab最高~~(☝ ՞ਊ ՞)☝

 

呼吸をするようにマナ悪ロンをするリスキーエッジの登場人物達(改)

 昔書いた文のリメイクです。

リスキーエッジ

 リスキーエッジ、という名作がある。

f:id:hibit_at:20200602104410p:plain

 押川雲太郎作の麻雀漫画である。

 高レート麻雀の場で生き続ける孤高の男・吉岡を主人公にしたアウトロー的な麻雀漫画であり、主人公の生い立ちや成長や葛藤や信念が闘牌を通して巧みに描かれているおかげで、ついつい感情移入してしまう名作である。

 ただこの漫画、基本的にマナーが悪い。特にロンする時。

 言うまでもないことだがロンをする時は、「ロン」→「◯◯点(です)」とだけ声するのがマナーであり、余計なことは言わない*1

あんたらしくないぜ

f:id:hibit_at:20200602104832p:plain

 煽りレベル:★☆☆

 相手を立てている意図もあるがマナ悪には違いない。危険牌を切る方だってそれをわかった上で覚悟して打っているのだ。あとロンと発声しましょう。無言倒牌は明確なマナー違反である。

信じていたよ

f:id:hibit_at:20200602105056p:plain

 煽りレベル:★★★

 論外。相手をバカにするのも程があるレベルである。ぶん殴られても文句言えない。あとロンと(ry

それが当たりだから

f:id:hibit_at:20200602105333p:plain

 煽りレベル:★★☆

 予想が的中してドヤ顔したいのはわかるけど黙っとけや。

バカがいて助かったよ

f:id:hibit_at:20200602105435p:plain

 煽りレベル:★★★

 ぶん殴られても文句言えないレベル。

出るとは思わなかった

f:id:hibit_at:20200602105509p:plain

 煽りレベル:★★☆

「出るとは思わなかった」「一発」

 フリー雀荘に行くとマナーとして注意される言葉の代表格である。余計なこと言わんでいい。

テンパイがわからなかったのか

f:id:hibit_at:20200602105555p:plain

 煽りレベル:★☆☆

 テンパイかどうかは牌を倒さないとわかる訳がない。

安目

f:id:hibit_at:20200602105641p:plain

 煽りレベル:★☆☆

 安目とかわざわざ言わんでよろしい。ただ役と点数を一応添えているあたり、吉岡さんとしてはまだマシな方。

おれのテンパイに……

f:id:hibit_at:20200602105812p:plain

 煽りレベル:★★☆

 知るかっちゅーねん。「まさか」がつくと煽り力1翻プラスである。

高目

f:id:hibit_at:20200602105949p:plain

「出るとは思わなかった」「高目」

 フリー雀荘に行くとマナーとして注意される言葉の代表格である。さっきも同じこと書いたよ!

イーシャンテンだと思ったのか

f:id:hibit_at:20200602110039p:plain

 煽りレベル:★★☆

 こっちの考えまで勝手に決めないでほしい。

テンパイしてるんだろ

f:id:hibit_at:20200602110115p:plain

 煽りレベル:★★☆

 相手がテンパイしてなかったら恥ずかしいし、それ以前に人の打ち筋を批判するのはマナー違反である。

るロ~ン

f:id:hibit_at:20200602110213p:plain

 煽りレベル:★★★

 発声は簡潔に行いましょう。

f:id:hibit_at:20200602110254p:plain

 ロンの発声をして役名を添えて点数申告! これでもこの漫画の中ではマシな方。

まとめ

 ざっとまとめて見たがみんな本当にマナーが悪いな……。

 いくら一晩で億クラスの金が動く高レート麻雀と云えど、マナーには気をつけたいものである

*1:慣れてない人には想像しづらいが、普通は役名も言わない。やり慣れている人は点数だけ言ってもらえれば一目で確認できる、という考えだ。

AtCoderで緑コーダーになりました

f:id:hibit_at:20200518180931p:plain

f:id:hibit_at:20200518180907p:plain

 先日のABC168で無事緑コーダーとなりました。「緑コーダーになるまで何をしたか」という記事はありふれているので、特に新規性のある内容が書けるとは思えませんが、一区切りとして。

あまり書きたくなかった

 最初からこういうこと書くのも何ですが、この記事を書くにあたってあまり気は進みませんでした。なぜなら、自分なら緑コーダーぐらいなら一瞬でなれると思っていたのに、半年以上かかってしまったからです。自分は頭良いと信じていたのに。打ち砕かれる希望。突きつけられる現実。厳しい。

 一応、自分の相場感、実際の問題、誰かが始めるにあたっての意見を書いておきましたので、参考になれば幸いです。

インフレしている気がする

 前提として、AtCoder全体がインフレしている気がします。社長の記事によれば緑は、

chokudai.hatenablog.com

学生ならかなり優秀。 エンジニアとしてもある程度の安心感がある。論理的に複雑な処理の実装に対応できない、なんてことはなさそう、くらいには思える

 ということですが、このツイート時点から参加者はほぼ倍増しており、教材も世に溢れています。今となってはbit全探索やDFS、BFSは茶でも組めて当たり前といった感じです。AtCoder Problemsで昔の問題をやると明らかに表示難易度に比べて簡単です。というか私が始めた時と比べても水準が上がっているような気がします。気のせい?

 緑でもレベルが高い、というのは自分弁護のための恣意的引用のようで気が引けるのですが、この記事で述べられていることは概ね同意できます。

学生でもエンジニアでも、このレベルに到達できたのならとても優秀です。そして、ここから先は趣味の領域になります。

www.pc-gear.com

自分のレベル

 プログラミングは好きでしたが、c++は初めてでした。Pythonなら多少心得があったのですが、計算時間が厳しそうということでc++をイチから始めることにしました。

atcoder.jp

 これをやりました。なので自分のc++競技プログラミング専用です。

 数学は得意だと思っていましたが最近はよくわからなくなってきました。いや、今でも得意だと信じているのですが……。実力の程はブログの過去記事などを読んでいただければ。以下の記事がおすすめです。

deux-hibi.hatenablog.com

deux-hibi.hatenablog.com

頭の良さだけで押し切れるか

 競プロを始めたいという人にとって、自分の潜在的な思考力がどれぐらい通用するかというのは気になる点だと思います。これについては「センスだけでいくなら相当の頭の良さが必要」という感じでしょうか。AtCoderはパズル的な問題が出やすく、本質さえ分かれば数行で正解、というのも問題によっては可能です。

atcoder.jp

 例えば、これはD問題ですが数学的考察により数行で解くことができます。

atcoder.jp

 これはE問題ですが同様です。

 こういった問題達を見逃さずに瞬殺できれば、コーディングの練習を積まずとも、センスだけでも緑より上、水色や青になれる可能性はありますが、きわめて高い水準を要求されると思います。もしあなたが数学オリンピックに出場できるぐらいの数学力があればさすがに心配ないでしょう。私はそこまでではなかったので、結局真面目にトレーニングする羽目になりました。

慣れが必要

 やはり競プロは競プロという独立したスポーツです。数学力やコーディング力と少なからぬ関係はありますが、そこで成績を出すには競プロというフォーマットに慣れる必要があります。入出力を受け取って、アルゴリズムに落とし込み、計算量を見積もって、実装する。コンテスト本番で安定してパフォーマンスを出すためには、ある程度問題を解いてコンテストを経験することは必須です。別の言い方をすると、簡単な問題であれば反射的に典型問題に落とし込んで無表情で瞬殺できるようになる必要がありますし、その幅をどんどん広げていく必要があります。

atcoder.jp

 例えばABC167で出たこの問題は愚直な全探索で、本番もわりと落ち着いて解けたのですが、これを迷いなく実装するにはけっこう慣れが必要ではないかと思います。ていうかこれで茶diff前半なの……。

 あと、一般的な数学力とは別の「競プロ用数学力」ともいうべき概念が存在すると思います。以下の問題は単純な組み合わせなのですが、扱う数が大きいので逆元の実装が必要です。慣れないとけっこう大変。

atcoder.jp

競プロが役に立つか

 実務に役に立つかと言われたら、超専門的な業務を除いて、それほどならないだろうなと思います。競プロではアルゴリズムを洗練させて実行時間を2秒以内に収める必要がありますが、現実には10分かけてコードを改善するより計算機に10分多く計算させた方が合理的な方がほとんどだと思います。

 もちろん完全な無駄ではなく、計算量の肌感覚が身に着くので「これは冗長な計算をしてるな」とか「この多重ループは気持ち悪いな」とかがわかるようになります。わざわざ配列や変数を新しく定義せずとも目的の値を見つけ出す最短ルートを見つけ出せますし、複数の添え字の動きを頭の中でイメージしながら、エラーを出さずにループを構築させることができます。

 しかしそれらのようなことは開発全体から見れば一部の部分であり、現実には環境構築で躓かないか、とりあえず動くコードを作れるか、スクレイピングや学習に回す時間を何時間確保できるか、といったことの方が、開発においては重要な場合が多いかなと思います。

競プロ自体を楽しいと思えるか

 ともあれ、「ここを超えられないと自分的にヤバいだろ」というラインは超えたので一安心です。最近のコンテストでも水パフォは何回か出ているし、この半年でかなり基礎を固めた感はあるので、このペースで努力を続けていけば水色になれるだろうという感触はあります。ただ、この「努力」というのは、難問のAC、(恐らく業務では使わない)ライブラリの実装訓練といったものもを含む地道なものです。それだけのモチベをこれからも維持し続けられるかはわかりません。他のことに時間を取られてしまうかもしれないし、そもそも問題を解くことが楽しく思えなくなってくるかもしれません。

 やはり重要なのはパズルを楽しめるかどうかではないかと思います。意識が低いかもしれませんが、今でも灰diff中盤~茶diff中盤あたりをなんとなく解いている時が一番楽しいかもしれません。問題に集中できている時は無心になれるので、これだけの環境を用意してくれたAtCoder社には感謝に堪えません。

 上で「緑にならないと自分的にヤバいだろ」と述べましたが、例え灰色でも、問題を解きながらACを重ねている限りその人は立派な競技プログラマなのだと思います。今後何かのきっかけで急成長して青や黄になっても、その思いは変わらないと思います。

 これからも精進していきます。