Category: 日記

【哲学】ポケモンGOバトルリーグでLegendになった話

こんにちは。RockinWoolです。今回はいつもと違って人生観の話をしようと思います。若輩の身ではありますが、勉強やスポーツに対する考え方をここで残しておいて将来の自分に活が入れられるようにしておきたく記事にしました。人生は人それぞれなので考え方は沢山あるのは承知ですが、こんな考え方もあるんだと思っていただけると嬉しいです。 そもそもポケモンGOバトルリーグとは? 皆さんご存知の大人気?スマホゲームのポケモンGO。このポケモンGOの中にある対戦要素がポケモンGOバトルリーグです。本家ポケモンのレート対戦に近くポケモンの厳選が必要なところも同じですが、ポケモンGOには孵化システム等が無いので厳選のためには対象ポケモンを乱獲するしかありません。つまり、普段からどれだけポケモンGOを起動してポケモンを捕獲しているかが大切になります。従って、長期間にわたって廃人レベルで活動している人には基本的に勝てません。 哲学: 趣味でやるにしても一度は頂点に立ちたい このようにポケモンGOバトルリーグは新規にはハードルが高めです。しかし、個人的な哲学になりますが、趣味でゲームをしていたとしても一度は頂点にたどり着きたいと思っています。これは「持論を述べる前に実績を残せ」という考え方です。実績が無いのに他人に難癖を付けるような人にはなりたくない。ですが、私たちは悲しいことに必ず老害になってしまいます。しかし、実績のない老害なんて最低です。せめて自分は実績を残してから疎まれたい、それがこの哲学の根本です。 実現方針: 100勝ち越しを目指す さて、ポケモンGOバトルリーグで頂点、すなわちLegendランクを達成するためにはどのようにすればよいのか。そのためには、GOバトルリーグのシステムを理解する必要があります。 レートシステムの穴 GOバトルリーグは5戦1セットでレートが計算されます。例えば3勝2敗したセットはレートが+10され、2勝3敗されたセットは-10されるといった感じです。そして、大体初期レートは1900~2200くらいであることが多いです。日々5セットのみ対戦できるという対戦ゲーにしては謎の縛りがあるので、体感ですが一日25戦を戦うと平均±30の変動が発生します(個人的には頭痛がちょうど発生するくらいなのでちょうどよい)。さて、この条件でLegendに行くにはどうすれば良いのか?実はこのシステム、同じ勝率でも勝ち越してさえいれば、総対戦数が大きくなればレートも高くなるのです。そして、3勝2敗の1勝ち越しで+10であることから初期レート2000から始めると100勝ち越しすれば良いことも分かります。従って、毎日可能な限り試合をこなすことでレートをハックできるのです。 特殊リーグという救済処置を活用する ポケモンGOバトルリーグは1週間ごとに対戦ルールが変わります。対戦ルールは大きく分けると4つ存在し、通常スーパー、通常ハイパー、通常マスター、そして特殊リーグです。しかしながら、通常スーパー、ハイパー、マスターにおける実用的なポケモンは決まっていて、しかも常人では育成の難しいものばかりです。なので、凡人でも勝つ見込みがあるのは特殊リーグに限られます。また、特殊リーグ内でも強いポケモンは決まっていますが、育成難易度の低いポケモンが多く初心者でも何とかやっていくことができます。 動画サイトで環境を把握して育成しておく ターゲットを特殊リーグに据えて、目標を100勝ち越しとしたところで、結局ポケモンがいないと勝つことができません。そこで、特殊リーグの過去の環境を事前に調べて育成するポケモンを決めておきました。結果的にこれは好転したり暗転したりしてうまくいかなかったのですが、良い勉強にはなりました。 パーティを固定する 廃人ではないため、特殊リーグ期間中にパーティを変更することは非常に難しいです。育成コストもそうですが、立ち回りやポケモンに対する知識が不足しているためです。なので、一つのパーティをマスターして、技術を磨くしか方法がありません。環境を読み違えればほぼ即死です。何回か読み間違えたんですが。この方法の良いところは、一見勝てないパーティにも技術で逆転できることに気づいたりすると逆に爆勝ちできるようになる点です。あとは大抵の負けが自責になるので、パーティ負けといって逃げる癖がつかないことですね。 実践 エスパーカップ(9/16 ~ 9/30) 前回のエスパーカップはGギャロップとカラマネロが強いと言われており、今回もその傾向は大きく変わらないと予測してGギャロップとカラマネロを軸にしつつ、その2体にやや不利程度で戦えるGヤドランを採用しました。 同発時に攻撃力を参照するという救い 実はこのパーティ、凡人が育成したため各ポケモンの個体値が良くないです。しかし、このことが逆に功を奏しました。それが必殺技を同時発動した際に攻撃力が高い方が先に打てるという仕様に強い点です。廃人になると攻撃力を下げて総合的な耐久力を上げるSCP優先の育成が可能になりますが、こちらはCPが可能な限り1500に近くなる個体を選んでいるので、SCP優先個体に比べると攻撃力が高いのです。これによって育成を頑張っている人よりも先制できることが多くなり、かなり良い勝率をたたき出しました。この時点の最高レートは2600程度でした。 陽光カップ(10/1 ~ 10/7, 10/14~10/21) 陽光カップはハガネール、ヤルキモノ、グライガーの3体が強いと言われていたので、この3体でパーティを組みました。最初はヤルキモノを先頭にしていたのですが、あまりにもヤルキモノが警戒されていたので先頭をSハガネールにしたらなんとかなりました。やや負け越したパーティでした。 日跨ぎで対戦してはいけない…

【日記】スパゲティコードの治療#001

こんにちは。最近めっきり寒くなってきましたね。寒さに起因して頭痛もひどくなってきましたが、柚子しょうが紅茶が結構効くのでなんとかやってこれています。今日のお題はスパゲティコードの治療です。 なぜ急にスパゲティコードを治そうと思ったのか 先日、Ryuの自己管理室さんの公開している【完全版】”超ハードワーク”を実現する3つの脳ハック術を観ました。かなり自己啓発な内容で個人的には結構アレルギーが出る内容でしたが、一方で「最初のハードルを下げる」というのは結構使えそうだなと感じました。特にメンタルをやってからは何もせずに生きているだけの日も多かったので、それならばコードくらい触っていよう。そうして行き着いたのが、過去の自分のコードを治療することでした。 自分のスパゲティコードの特徴 まずは自己分析から。自分のコードの特徴は、とにかく機能が多くて整理されていないこと。傾向としては以下があげられます。 この状態では半年も経てば無事にレガシーになります。逆にいえば問題点は明確なので、今回はドキュメントを書きながらいらないところを消し、コードのルールを作って次につなげていきましょう。 実際の事例 いらなすぎる勉強用プログラムたち どうやらこのプログラムを作った頃、コンテナやMySQLなどのDBMSにハマっていたこともあってそういった技術の勉強用にプログラムを作っていたようです。プログラム実行環境はAWS上のコンテナを想定し、専用のDockerfileとビルドスクリプトまで用意している始末。もちろん、これらはプログラム本体とは切り分けて管理したほうが良いですね。他にも、tensorflowに初めて触った関係から、これらの試験的なコードも保存してありました。これは個別にGithubに上げて、このブログで解説するのが良いでしょう。ともかく、勉強用プログラムや環境構築スクリプトと本番プログラムは混ぜないように! 環境構築部分や勉強用プログラムとメイン部分は別プロジェクトにしましょう。 足りない説明 いらなすぎる勉強用プログラムたちに付随する形になりますが、あたらしいことを実践した際はメモくらい残しておいてくれ、過去の自分!!全然何をするためのものか分からないプログラムばっかり残っているではないか。なんか面白いプログラムを作ったらこまめに日記としてブログに上げて、いつでも振り返られるようにしましょう。そして、どうしても本番プログラムに入れる際はブログへのリンクでも良いから説明を入れておきましょう。しかしプログラミングって奥が深いというか、ちゃんとドキュメントを残しておかないと、ほぼすべての作業がパアになってしまう気がしますね。 どっちがmainかわからないプログラム プログラムの主であるメインプログラムと、それを用いた応用を行うプログラム、そしてテストを行うプログラムと、いくつかのプログラムから構成されるプロジェクトがある場合は、ちゃんとフォルダわけしましょう。今回はメインとなるのはデータを計算するプログラム、応用部分はデータをもとに図を作成するプログラム、テストはメインプログラムの動作チェック用でした。なので、応用とテストはそれぞれvisualization, testと分けて管理したほうが良かったですね。データはdataフォルダを作って管理していただけに、惜しかったというかなんというか。 どうやって入れたか不明のライブラリ 環境設定済みであれば問題なく動くけれど、そもそもこのライブラリどうやって入れたの問題が発生しました。いやーoptunaのことなんですけどね。多分conda経由で入れたと思うんだけど、環境構築でバグらないようにするためにも、ちゃんとどうやって入れたかは残しておくべきでした。メインプログラムに影響するようなライブラリはブログへのリンクをREADMEに貼るなどして対策することが必要ですね。 いったんのまとめ ここまで書いてきて感じたのは、スパゲティコードになる落とし穴は結構あって一記事ではまとめきれないということです。なのでこれを#001として、不定期連載という感じでやっていこうとおもいます。昨日図書館へ行ってリーダブルコードを借りてきましたので、次回はリーダブルコードと比較しながら改善して行こうと思います。それとは別に勉強用コードの供養もやっていきます。どっちが先に記事化されるかはわかりませんが、【完全版】”超ハードワーク”を実現する3つの脳ハック術でも毎日の進歩を確認することが大切といっていた気がしますので、少しペースを速めて頑張ろうと思います。それでは!また次回!

【Atcoder日記】ABC #329のメモ

こんにちは。最近Pythonとc++の連携ができるようになってからc++の技術が上がってきたと感じているので、今日は久し振りにAtcoderに手を出してみました。Python軸でAtcoderに参加していた時は、制限時間の壁があまりにもキツすぎて解けているのに間に合わないということがよくありました。その点C++であれば問題ない!はず。結果としては60分でABCの3問正解という感じでした。(頭痛のせいで60分以上の作業は正直きつい)それでは、RockinWool自己流の解答をご笑覧あれ。 A問題(Spread) 難易度:超かんたん 入力文字に対して、スペースを開けて返答しろという非常に簡単な問題。A問題の中でも過去一簡単なのでは?と感じました。c++のstringの使い方さえ間違わなければ大丈夫。それと最後の文字以降にスペースを入れてはいけないとのことだったのでif文で分岐させました。(個人的には、この難易度でも20行近く書く必要のあるc++って不便だなと感じるなど) B問題(Next) 難易度: 普通 B問題はごく普通の難易度。もしかしたら過去と比べて簡単な方かもしれない。最大値の次に大きな数を答えるということで、最大値が複数ある場合にも対応できるかどうかが問われている。今回はvectorとsortを使って、入力を降順に並び替えたのちに最大値よりも小さくなった瞬間の数を返答するようにした。 C問題(Count xxx) 難易度: 比較的簡単 C問題は過去と比べかなり簡単な方かも。文字の組み合わせを答えろと言われているが、要は連続した同一文字からなる文字列の長さを足し合わせれば良い。例えばaaabbccだと3+2+2=7という感じ。問題はaaabbaaだと3+2=5となる点(aは3と2のパターンがあるが、大きい方を採用する)。この考え方を実現するにはa:3,b:2のようなpythonで言うdictionary型のデータが必要であることに気づく。ということはunordered_map<char,int>といったデータを用意して代入していけば良い。 この解答で少し不満なのは、ループ部分でi番目の文字とi+1番目の文字を比べている仕様上、最終文字とその直前が違う場合にif文を組まなければならない点。例えば最初のif文では入力が1文字である場合の例外を設けているし、以降にもif(i==inputstr.size()-2)の時に分岐するようにひと手間かけている。もう少し美しく書けたかもしれないが、制限時間中には思いつかなかった。しかし、過去のC問題に比べると例外処理の少なさから、非常に簡単な問題だったと感じる。ただ、個人的にはABC正答できたのは嬉しい。 結び 今回の問題は結構簡単に感じましたが、もしかしたら自分の能力が上がってきているのかもと自信が付きました。これからもpythonとc++をどんどん連携させて、c++をバリバリ書けるようになっていきたいですし、それを記事にしていこうと思いますので温かい目で見守ってください!それでは、よいプログラミング生活を!

C++の備忘録: 乱数生成、配列(vector)、連想配列(map)

こんにちは。11月に入ったら急に頭痛が復活してきてしまったRockinWoolです。去年くらいから冬服のようなピッチリとして重い服を着ると、肩こりが悪化して頭痛が発生する気がしています。同じような症状の人がいたら嬉しいですが、この症状がある限りスーツを着て仕事するのは無理なんじゃないかと思ってしまいます。まあ、それ以前に職場で壊したメンタルを治すところからなんですが。さて、今回のテーマはC++で詰んだポイントの備忘録まとめです。前回の記事で紹介したpybind11を使ってpythonからc++で作成したバイナリを叩けるようになってから、ずーっとc++でコーディングしてました。これが結構楽しいけれど、反面覚えることが多くてpythonほど簡単には書けない・・・。そんなこんなで備忘録を残していつでも振り返られるようにしておこうと思います。 乱数生成 まず最初にびっくりしたのがc++での乱数生成のクセの強さ。pythonだとrandom.randn(min,max)一行で書けるような内容がc++だとそうもいかない。結局自作でrandnに相当するものを作成することになりました。 この関数を作成した際に引っかかったのはstd::uniform_int_distribution distribution(min, max-1);のmax-1の部分。実はpythonのrangeとかと違って、min≦乱数≦maxと出てきてしまうのです。したがってmax-1としないと挙動が異なってしまいます。というか、c++でもforループを組むときはfor(int i=0; i<N; i++)みたいに0~N-1の範囲で回すのに、なんで乱数を生成する関数だけ仕様が違うんだ・・。ということで、範囲外アクセスを生み出して一敗しました。チキショー。 配列(Vector) c++の配列であるvectorは、慣れれば結構使いやすいと感じています。こいつのすごいところはpybind11経由でpythonから呼ばれた際に、c++側関数の返り値をvector<int>やvector<vector<int>>としてもpython側からlist型として認識されるところ!(これってどっちかというとpythonがすごいんだけど)。逆にc++で自作の構造体をstructで作って、それを返り値としてpythonに渡そうとしたら失敗しました。やっぱり1関数1機能の規則に則って一度に複数個の返り値を返さないことが大切ですね。ちょっとクセが強いなと思ったのは、初期化時の表現。例えば下記のようなプログラムの場合、jam_counterはN個の要素すべてが0で初期化された一次元配列になります。 要素の呼び出し方はCやPythonと同じようにjam_counterといった感じになります。その他、vectorで怖いなと思ったのはpush_back関数。 上記はvector<int>型のdeclared_locに要素を”追加”している命令。配列の長さが後から変わるって結構怖くないか・・?ってC経験者だと感じてしまいます。Pythonのlist型にもappendとかあったけど、あれはメモリ管理とかまったく気にしなくても良かったので安心して使ってましたけど、c++のvectorもあれと同じくらい信用してもいいのかな〜。 連想配列(map,unordered_map) vector<int>がlist型に対応しているのに対して、こちらはdictionary型に似ていると感じました。デフォルトのmapだとKeyの順序まで覚えるらしいけど、ほとんどの場合はそこまで記憶しなくて良いのでunordered_mapで良いかなと感じています。使い方は下記のような感じ。 第一引数のintはKeyのtypeを指定し、第2引数は値のtypeを指定している。今回は整数を指定すると、それに応じた配列が返ってくるような連想配列型elementPositionを定義したということになる。これだけだとCの構造体でも同じことができそうだけど、連想配列型はc++のautoを用いたループと相性が良い。例えばこんな感じ。 上記は引数のvector<int>の要素中に同じ整数が含まれていたら、重複を報告するような関数。要素ではなく要素の位置番号をvalue, そしてKeyはvector<int>の各値を持つことによってこれを実現している。注目したいのはconst auto& entry : elementPositionsの部分。const宣言によってループのbodyではentry変数が変化しないことを保証し、autoによって連想配列型であることを実行時に勝手に判定してもらう。そしてauto&であることからelementPositionsを参照して使用することが指定されている。こうすれば、構造体では難しかった全Keyや全Valueの探索が超!楽ちん。今回もconst auto&によって全valueをチェックして重複があるかだけを確認できる。これ、pythonでも実装は結構難しいかなと感じているので結構すごいなと思っています。 まとめ C++はクセが強いけれど、できることも結構すごいのではないか?と感じ始めました。pybind11を使えばpythonの便利なところとc++の高速さを両立できるので革命が起きています。また、何かしらの備忘録を残そうと思っていますので、良ければ記事への励ましコメントなどをよろしくお願いします。モチベアップに繋がります。もちろん、記事で間違った内容などがありましたらご指摘よろ。それではまた次回~~~。

つぶやき: 最近感じたこと&Stable-diffusion

こんにちは。RockinWoolです。今日はUbuntuにStable-Diffusionを入れて遊んでみたので、その日記を残したいと思います。とは言っても、インストール方法やセットアップに関してはこちらに非常に細かく書いてあります。ですので、今回は最近の人生で感じていることなどを書き散らしていこうと思います。 何故いまさらStable-diffusion? つい先日、Deep Neural NetworkのモデルをPythonで作って回す機会がありました。しかし、私のPythonの書き方が悪いのか非常に重い処理となり、PCを4台並行にぶん回してようやく一通りの結果を算出できるという有様。そして、計算後にはPCが余ってしまいました。しかし、これらは私がAIを回すために作ったものであり、放置して劣化させるのは非常に勿体ない!そこで、なにかに活用できないかと考えていきついたのがStable-diffusionでした。 それはそれとして、このPCの活用方法と考えたときに色々やりたいことが出てきて、自分の中の欲望をちゃんと整理して生きていかなければと思いました。例えば、pythonの処理が重いのでc++でパッケージを作ってpythonから呼べるようにしたい!とか、英語を喋れるようにしたいのでチャットボットを作りたい!とか、昔作った3Dモデルを改良してチャットボットと融合させて完全AIのVtuberを作りたいとか、Atcoderやるためにc++練習しなきゃとか。あとはお金さえあればJetsonを買って自動運転の実装をするとか。自分はやりたいことが無限に出てくるタイプなので、普段からこまめに消化しなきゃと改めて感じました。それだけに、仕事の関係で頭痛持ちになったのが悔しい。動ける日の最大火力が減ってしまって、すごく不便です。(そういえば、休職した元職場に居た同僚がまた一人転職で職場を離れることになったので、まずは前進できてよかったと思うなど) Stable-Diffusionインストール 検索して最初にヒットするStable-diffusion-webuiはインストール後にpytorchがエラーを起こしてうまく動作しなかったので、Easy-diffusionと呼ばれる別のアプリを用いてStable-diffusionを試しました。そうすると、Easyとついているだけあって簡単にインストールすることができました。 結果サンプル 1個10分もかかって草。ちゃんとしたGPUの環境でやるほうが吉ですね。 まとめ 思い立ったときに一気に進めるのも良いけれど、自分の人生を計画的に進めることも大切ですね。それはそれとしてStable-diffusionは面白かったです。

人生初の韓国へ行ってきました(済州島)

こんにちは。RockinWoolです。今回は表題の通り韓国に行ってきたので、街の様子や感じたことなどをツラツラと書き記しておきます。日記的な記事になりますが、なにとぞよろしくお願いします。 旅の目的 CIJK Conferenceという国際学会に参加するために済州島に行きました。正直ここのところ頭痛がひどく、一日が現実感なく過ぎることがほとんどでした。しかし、なんとかAbstructを提出して参加することができました。毎度の挨拶みたいになっていますが、職場の上司に振り回されて体を壊すくらいまで働くのは意味が無いです。こんな人間になってしまいます。 済州島の様子 済州島は沖縄本島よりもやや大きいくらいの面積を持つ島で、朝鮮半島と中国大陸、および日本列島のちょうど中間に位置しています。関西国際空港から直行便があるので、1時間ちょいで行くことができます。しかも、時差が全くないので時差ボケも心配無用。一方で、日本より西にあるのに時差が無い影響から、夜20:30になっても外が明るいなどの不思議な現象も発生していました。学会が18時に終了しても、普通にビーチで泳いでいる人がいたりして、なかなか不思議な光景でしたね。ちなみに街並みはかなり古びていて、少し寂れたリゾート地という感じでした。インフラも傷んでいたり、店や家が小さい作りだったりして不景気な感じがしました。 CIJKの様子 国際学会とはいえ、あまり日本の学会と大きな差はありませんでした。もちろん規模は大きいので夕食やエクスカージョンなどのイベントは山盛りでしたが、会場が立派で緊張するなどのことはありませんでした。逆にちょっと面白いと思ったのは参加者の熱です。韓国の学生が英語の質問に答えることができず韓国語で答えようとしたところに、中国?の先生が「英語で答えられないのはサイエンティストとしての資質に欠ける」となかなかの剣幕で怒っていたのが印象的です。自分もそのようなことを言われないように頑張ろうと思いました。 英語でのコミュニケーションについて 今回の学会では終始英語でのコミュニケーションが必須でしたが、自分の中では結構上手に乗り切ることができたと感じています。事前に入れておいたKAKAOTALK(日本でいうLINE)が役に立ったり、英語でポスターセッション参加者とやり取りをして仲良くなったり、良い経験が沢山ありました。自分の発表では、事前に原稿を作ってノートに転写しておき、ある程度暗記して臨みました。結果としてはまあまあでしたが、後日他の先生から英語がうまいとほめられたので満足できました。今後も精進しようと思います。 海外で頭が痛くなったときの対処法 学会中も仕事でのトラウマがよみがえったり、理由もなく緊張して頭が痛くなることがあったのですが、薬が手元にない時は横になれるところを探して休んでいました。例えば、今回はビーチが近くにあったので砂浜で横になったり、ホテルのロビーにあるソファーで休んだりしていました。ホテルのロビーで寝ているときにスタッフに声をかけられたときは緊張しましたが、翻訳ツールを使って状況を説明してなんとか事なきを得ました。済州島は1割くらいの店員が日本語または英語をしゃべることができますが、ほとんどの人は韓国語しかしゃべることができません。この辺は日本人とまったく同じように感じます。ですので、旅行に行く際は翻訳ツールを手元にインストールしておいてから行くとよいと思います。また、フリーwifiがいたるところにありますが、より万全を期すのであればレンタルwifiが良いと思います。今回はレンタルなしで何とか乗り切りましたが、結構ほしい場面があったのでお勧めします。 まとめ 済州島は過ごしやすくてとてもおススメできる場所でした。SEの電源変換機とモバイルWifi、翻訳ツールをもっていけば特に恐れることもなく過ごすことができると思います。4日間の滞在でしたが、格安で行けるタイミングでまた行きたいなと思うことができました。それでは、ここまで読んでくださってありがとうございました。