【寄稿】プログラミング初心者がGo書いてみた

本記事は寄稿記事となり、 id:whywaita は筆者ではありません。


本記事はwhywaita Advent Calendar 2023 17日目の記事です。 昨日はhogextendさんによるワイワイ椅子2023 - hogashi.*の記事でした。

さて、皆さんこんにちは。初めましての方は初めまして。 whywaita Advent Calendar 2023に2回目の登場になります、Jと申します。 お時間がある方は、よろしければ前回の記事もご覧ください。

whywaitaさんといえばポーカーということで前回記事は執筆させていただいたわけですが、 whywaitaさんといえばGoの権威でもあるということで、 今回はポーカー×Goについて書かせていただければと思います。

ポーカー×Goという書き方をするとGoの最新技術を用いて何かすごい機能を持ったポーカーのアプリを作ったかのようにも見えますが、 筆者はプログラミングど素人、大学の講義でint main(void)ってなんだよ!!!とブチギレていた側の人間でして、 もちろん仕事でコードを書くなんてこともありません。 ですので、本記事は プログラミング初心者がGoでポーカーに関する簡単なプログラムを作ったよ というだけの話でございます。

コードを書いていく中で感じた学びを書いていきますので、 本ブログの聡明な読者の皆様につきましては温かい目で見守っていただけますと幸いです。

何を作ったの?

簡単なトレーニング用のプログラムを作りました。 ポーカーはそのイメージに反して(?)暗記が重要なゲームでして、 例えば最初に配られる2枚を見てそのゲームに参加すべきかどうかというのは、 すでに世の中に計算された戦略がありまして、それを覚えるのが基本です。

preflopレンジ表

※ちなみに戦略の計算は、CFRなどのアルゴリズムを使ってPCをぶん回して出すものなので、 手計算ではとても出せるものではありません。 さらに補足すると、計算方法がなかった時代には先人たちの経験と勘による参加ハンド表なるものがありましたが、 これが実によく計算結果と一致していたというちょっとした怖い話(?)があります。 先人達の変態性に拍手。

もちろん実戦では計算結果通りにプレイすることはなく、 相手に合わせて戦略を変化させることが重要なわけですが、 これはそもそも基本となる戦略を覚えていないと難しい芸当です。

そんなわけで、実戦形式で戦略を覚えられるアプリを作ろう!となったわけです。 実装に関しては、戦略を計算するような実装ができるわけもなく、 計算済のファイルを用意してそれを読み込む形にしました。 一問一答のクイズのQAを大量に用意しておいて、 設定に合わせて問題を出して正誤判定をするといった感じですね。

学び

ここからは何を作ったかという話よりも、実装を進める中で得た学びを書いていこうと思います。

①設計が大事 これはプログラミングに限らずなんでもそうですが、特に初心者のうちは、 ある程度でもいいので方針を決めてから手を動かした方がいい気がしました。 最初はとりあえず書いてみるか!でやってみたのですが、 それぞれの関数の連携だったりがごちゃごちゃになって、結果クソみたいなコードが出来上がってしまいました。 そんな感じなのでもちろん関数名なども分かりにくく、 レビュー時に「命名にセンスがない」と一蹴されました(悲しいね) ※「もう書き始めてるのに関数名が決まってない時点でおかしい」  という厳しいフィードバックもいただきました(これは流派によるとも聞きましたが) この辺りはwhywaita先生に講義をしていただいて、今ではだいぶ改善しました(と思っています)

②型は大事 現時点で僕がVSCodeに赤線を引かれる理由の大部分はこれです。だって動く気がするじゃん、、、 なぜ型が大事かみたいな話をwhywaita先生に伺ったような気もしますが、忘れちゃったのでもう一回だけ教えてください!

③公式ドキュメントを読め 困ったときにはいつもChatGPTに聞いてたのですが、結局正しいことを言っているとも限らないし、 検索能力を上げるためにも公式ドキュメントを読む癖をつけようと思いました。 というか、作った側が一番仕様に詳しいんだから、 一番詳しいところが出してるドキュメントに頼るべきなのは当たり前なんだよな、、、

④用語は正しく覚える ポーカーも一緒なのですが、用語の定義がぶれていると会話が成立しなくなります。 誤った理解のまま突き進むと危険なので、わかったふりせずに分からないものは調べる、 分からないと言うといった基本的な姿勢はここでも大事だなと思いました。 覚えたての単語って使いたくなるんですけどね。

⑤動くと嬉しい やはりこれにつきます。いろんなエラーが出てその度に調べ物をして直し、また別のエラーが出て、、、 という作業は苦しかったですが、最後に自分の書いたコードがちゃんと動いた時はとても嬉しかったです。

コードが動いたときの私

余談

実はこのAdvent Calendarの日までにフロントも書いて、自分が書いたGoのアプリをWASMとしてビルドして、ブラウザ上で動く状態にしよう!という計画を立てていたのですが間に合わずでした。 本業が忙しくて(言い訳)、ここ2~3週間くらい1行もコードを書けていない気がします。 いやーほんとにあともう少しなんですけど(言い訳)

whywaita先生には完成までもう少しお付き合いをしていただけると伺っておりますので、 お言葉に甘えつつ実装を進めていこうと思っています

いかにも動きそうだけど、実際はハードコーディングされているだけのブラウザ画面

まとめ

いかがでしたでしょうか?つよつよエンジニアの皆さんにとっては今更な話だったかもしれませんが、 昔を思い出して懐かしい気持ちになっていただけたなら幸いです。 whywaita Advent Calendar 2023、明日はIzacchi16さんです!

【寄稿】ポーカー楽しいよポーカー

本記事は寄稿記事となり、 id:whywaita は筆者ではありません。


生成AIによる本記事タイトル

本記事はwhywaita Advent Calendar 8日目の記事です。 昨日はakirauenoさんによる激安中華PCで自宅k8s環境を作る記事を書きますの記事でした。

さて、皆さんこんにちは。初めましての方は初めまして。 whywaitaの新卒同期のJと申します。同期と言っても彼とは部署も職種も違いまして、ビジネス職として勤務しています。

whywaitaさんの趣味はポーカーであるというのはもはや周知の事実かと思いますが、 何を隠そう私もポーカー好きでして、社内のポーカー部で部長を務めております。

※whywaitaさんのポーカー好きについては、昨年のAdvent Calendarのこちらをご参照ください。 https://blog.whywrite.it/2022/12/25/whywaita-advent-calendar-2022-day25/

ポーカーの何がそんなに面白いのか、という人もいらっしゃるかもしれません。 本記事ではそんな方に向け、ポーカーにおいて重要な要素を見ていきながら、その魅力についてお伝えできればと思います。

なお、当記事に出てくる画像は全てDALL•E 3くんが描いてくれました。

ベット(チップを賭ける)

ポーカーの基本にして、重要なエッセンスが詰まったアクション、それがベットです。

生成AIの思うベットアクション

ポーカーとよく比較されるゲームとして麻雀がありますが、麻雀が強い役を作ればたくさんの点数を得られるのに対して、ポーカーでは賭けた分の量しかチップを増やすことができません。 最強の役であるロイヤルフラッシュを完成させても、相手が乗ってこなければほんの少ししかチップを得られませんし、 逆にワンペア(2番目に弱い役)でもオールイン(チップを全て賭ける)の勝負に勝てばチップを倍に増やすことができます。 何なら、最弱のブタ(役なし)でも、ブラフでハッタリをかまして相手を勝負から降ろし、賭けたチップを奪うこともできるのです。

自分からチップを賭けていくときに、相手にどうしてほしいのか。勝負に乗ってほしいならいくらまで釣り上げても乗ってくれるか?逆に降りてほしいなら最低いくらで降りてくれるか? 利益を最大に、損失を最小にするために、状況や相手の癖、傾向を掴んで最適なアクションを決める、この思考がまさにポーカーの醍醐味と言えます。

補足:ブラフについて ブラフとは自分の役が弱いときに相手を勝負から降ろすために行うベットです。ポーカーといえばブラフ!そういうイメージを持っている方も一定数いらっしゃるかもしれません。 実際、ブラフはとても大事な要素です。簡単に想像してみると分かるのですが、強い役を持っている時にか強いアクション(チップを大きく賭けるなど)をしない人を相手にするのはとても楽です。 相手が強気に出てきたら素直に勝負から降りればいいだけですからね。

強いアクションの中に本当に強い時と本当は弱い(=ブラフ)が混ざっているからこそ、相手は勝負を受けないといけなくなります。 つまり、ブラフには相手を降ろすという役割のほかに、自分が本当に強い役を持っているときに、相手に勝負を受けてもらいやすくなる効果もあるわけですね。

このあたりはバランスが重要で、ベースは座学によるところが大きいですが、実戦では座学による基礎の上に、 相手をよく観察してその場に合わせた柔軟な戦略を構築できるプレイヤーが勝つことができます。

相手を観察すること

ポーカーフェイスという言葉があります。強い時も弱い時も一定の表情で、相手に手の内を読ませないといった意味の言葉ですが、実はポーカーにおいてはポーカーフェイスというのはそこまで重要ではありません。

生成AIの思うポーカーフェイス。なんかオシャレだけどそうじゃない感。相手にハンド見えとるやんけ!

重要でないというと語弊がありますが、、たとえば実際に相手の目の動きや目線の先、細かな表情、身体の動き、アクションのスピード、話している内容・量などは観察して判断材料にしますが、 これはあくまで最終判断の助けにするだけであって、これらの要素を判断の大きな根拠としていることはありません。

代わりに観察するのは相手の考え方です。まず初心者を相手にするときは、どんなハンドで参加してきているのか?どんな役、ドロー(待ち)があるとついてくるのか?どれくらい強いとベットしてくるのか?を観察します。 これが中級者以上になると、それらに加え相手は自分をどう見ているか?という要素が加わってきます。相手から見て、自分はどんなプレイヤーに写っているか?ということです。 相手は自分にどんな弱み(リークといいます)があると思っていて、そのリークにつけこもうとしてきた相手を逆手にとりやり返す、まさに裏の裏をかくような動きを考えます。

ちなみにこのときは、相手にさらにやり返されない(裏の裏の裏をかかれない)ような戦略を考えます。 これはどうやって考えるのかというと、相手が自覚的でないリークを見つけてそれを利用するのです。 たとえば自分が相手の裏の裏をかきにいく戦略は、そこに対する反撃として、相手がいろんなハンドでレイズを返すように戦略を変更してくると逆にこちらがやられてしまうとします。 ですがこのとき相手がそもそもレイズし足りない傾向があり、それに気づいていない(自身のリークに気づいていない)場合は、こちらは相手を一方的にいじめることができるのです。

まとめ

いかがでしたでしょうか?前半が戦略の基礎部分、後半が応用部分という感じでしたが、ポーカーの奥深さに少し触れていただけたのではないでしょうか? 僕自身、友人に趣味がポーカーで〜と話すと、だいたい相手の表情とか読むんでしょ?と言われることが多いですが、 もちろんそういった要素はありつつも、世間で思われているよりは遥かに戦略性が高く、また対人戦の要素も盛り込まれている素晴らしいゲームだと思います。 興味を持ってくださった方は、ぜひwhywaitaさんに声をかけてみてください。都内のおすすめのポーカースポットへ案内してくれること間違いなしです。 もしかすると私ともそこで遭遇するかもしれませんね。

whywaita Advent Calendar 2023、明日は同じく同期のtakaradaです!

whywaita Advent Calendar 2023が始まりました

この記事は masawada Advent Calendar 2023 1日目の記事です。

自己紹介

こんにちは。毎年whywaita Advent Calendarというのを勝手にid:masawadaに立てられている id:whywaitaと言います。今年で9回目になりました。masawadaを許すな。

masawadaさんは私の大学時代の先輩であり、色々なことを教えてもらった人です。色々とね。

ここまで去年のコピペです。

本題

去年などはmasawadaさんとギリギリ出会ってその時のことをネタに書いていたのですが、なんとついにmasawadaさんをお見かけすることはありませんでしたね。ご結婚もされてお忙しい日々を過ごしているのでしょう。

今年は何も書けないかな……と思っていたのですが。

なんと体調がよくとのこと。ご自愛ください。

実は私も今年の後半はかなり体調を崩しがちでした。そんな中私の周りの方から共有されまくった記事をmasawadaさんにも共有して今回の本題にしたいと思います。

president.jp

まとめ

明日の担当はまだ居ないようですね。ご登録お待ちしております!

whywaita Advent Calendar 2022が始まりました

この記事は masawada Advent Calendar 2022 1日目の記事です。

自己紹介

こんにちは。毎年whywaita Advent Calendarというのを勝手にid:masawadaに立てられている id:whywaitaと言います。今年で8回目になりました。masawadaを許すな。

masawadaさんは私の大学時代の先輩であり、色々なことを教えてもらった人です。色々とね。

ここまで去年のコピペです。

本題

masawadaさんに最後に会ったのは……そう、 #pastak生誕祭 でしたね。

blog.pastak.net

id:Pasta-K さんと言えば……そう、旅行ですね。今もベトナムに旅行されている様子。IDコールベトナムまで届いていると祈りましょう。

そういえば私も先日旅行に行きました。

これは水です。

美味しい水3種類

こっちは塩ホルモン。

メニューはこれしかない

これはちいさくてかわいい感じしますね。

ワー

これは鹿に見せかけたトナカイ。

角ある

「北海道、どこで撮っても16:9モード+0.5魚眼で良い写真になる」という仮説を提唱。

湖と空

有名な寿司屋が美味いのは既知で、我々は名前は知らないけど美味い寿司屋を探す必要があります。

回転寿司トピカル

さすがにちょっとズルい感じの面白さ。

良域展開ってね

人間が必ず好きになる2色ってあるんですよね。

うにいくら丼以外何物でもない

まとめ

友人が誘ってくれるので雑に北に行くのはいいですね。先日「南ってあんまり行ったこと無いんですよね〜」って言ったら次は南らしいです。南ってどこ?

……え?masawada要素?

この記事に貼られている写真の数を数えてみてください……そう、8枚です。「masawada」ですからね。

明日の担当は id:hogashi さんです。whywaita Advent Calendar 3日目の担当よろしくお願いします。

whywaita Advent Calendar 2021が始まりました

この記事は masawada Advent Calendar 2021 1日目の記事です。

自己紹介

こんにちは。毎年whywaita Advent Calendarというのを勝手にid:masawadaに立てられている id:whywaitaと言います。今年で7回目になりました。masawadaを許すな。

masawadaさんは私の大学時代の先輩であり、色々なことを教えてもらった人です。色々とね。

ここまで去年のコピペです。

本題

さて。完全にmasawada Advent Calendarのことを忘れて夕飯を食べており、存在を思い出したのは21時。あと1時間ぐらいはmasawadaさんのことを考えた方が良いかなと思っていたらふと思いつきました。

そういえば……マサワダさんとマリトッツォって似てない……?

...

...

...

思いついたわたしはコンビニに向かいました。どこのコンビニでも一瞬で買えると思っていたんですが、三軒目のコンビニでようやく見つけました。流行り廃りって儚いですね。

これは皆さんが何回も見たmasawadaさんの画像です。

https://pbs.twimg.com/profile_images/419302843879677952/jxtzc6kO_400x400.jpeg

これは皆さんが何回も見たマリトッツォの画像です。

f:id:whywaita:20211201215225j:plain

これを…………こうする。

f:id:whywaita:20211201215253j:plain

エッ…………マサワダサン…………!?!??!?!?

とはならないわけです。現実は厳しい。

なぜなのか考えました。masawadaさんのアイコンはオレンジのイメージが強いですが、いわゆる「後頭部」は髪の毛の黒色が多い訳ですよね。

という訳で海苔を載せてみました。

f:id:whywaita:20211201215526j:plain

エッ…………マサワダサン…………!?!??!?!? イヤ………コレハ……………………

マサワダッツォサン…………………………………………………………………………!?!??!?!?!?!??!?!?!?!??!?!?!?!??!?!?!?!??!?!?!?!??!?!??!?!??!??!?!?!?!??!????

おわりに

海苔って意外とコンビニに売ってないんですね。スーパーがまだ開いてて良かったです。

来年みなさんが異世界転生した先に存在するwhywaita Advent Calendarでまたお会いしましょう。わたしはしません。

明日の担当は id:papix さんです。


私信: いつでもいいですよ > id:masawada

Dentoo.LT #25 参加してきた #dentoolt

なんと2年ぶりの Dentoo.LT 、ATNDサービス終了にともない今回からConnpassに移行となりました。今までありがとうございました。

dentoolt.connpass.com

自分の発表について

老害が出しゃばるのもアレかなと思いつつ、他の老害が特に登壇しなさそうだったので賑やかしで参加。

2018年からやっている #今日の食神 というプロジェクト?について紹介してきた。

github.com

時間がなくてあまり触れられなかったけど、新作のマルコフ連鎖による食神メニュー生成もぜひお楽しみください。CLIアプリケーションとして作っていたけど、気づいたらAPIに組み込まれていたのでブラウザで楽しめます。

github.com

github.com

Dentoo.LT について

今回から主催となったterry君が「Dentoo.LT を過去の物にしたくない」と言ってくれていてとても嬉しい。最終的には登壇者もそれなりに居たのでこれからも続いていくんじゃないかと。

そして聞いていると最近はLT主催する電通大生も増えたみたいで、良いブームが来てそう。確かにオフラインだと機材とか部屋どう借りるのみたいなノウハウが無いとちょっとハードルが高かったかもしれないけど、オンラインだとZoomを用意して日程を決めちゃえば良いので始めやすいのかもしれない。

しれっとVの姿で登壇している人が居たり、かと思えば過去の Dentoo.LT であったような話が出てきたりして根っこのところは同じ電通大生なんだなと思ったりしてちょっとほっこり。

まとめ

終始楽しい発表が多かったし、未来は明るい。また参加できるといいな。

whywaita Advent Calendar 2020が始まりました

この記事は masawada Advent Calendar 2020 1日目の記事です。

自己紹介

こんにちは。毎年whywaita Advent Calendarというのを勝手にmasawadaに立てられている id:whywaitaと言います。今年で6回目になりました。masawadaを許すな。

masawadaさんは私の大学時代の先輩であり、色々なことを教えてもらった人です。色々とね。

ここまで去年のコピペです。

本題

さて、前述のとおりwhywaita Advent Calendarは今年で6年目になりました。そんな6年間におけるmasawadaさんの発言の変遷を見てみましょう。

続きを読む