-
プロンプトを書くだけで、AIでどこまでゲームを作れるのか
会津ラボの吉田です。 最近のAIコーディングツールの進化は目覚ましく、「プロンプトを書くだけでアプリが作れる」という話をよく耳にするようになりました。 では実際のところ、AIだけでどこまでゲームを作れるのか?今回は以下の3ジャンルに挑戦してみました。 検証環境 挑戦①:タイピングゲーム & テトリス風ゲーム ― あっさり完成 最初に挑戦したのはタイピングゲームとテトリス風ゲームです。「表示されたカタカナをローマ字入力で攻撃し、敵を倒すタイピングゲームを作って」というプロンプトからスタートしました。 実際に使用したプロンプトはこちらです。 結果、両ゲームとも無事完成しました。 タイピングゲームについては、敵キャラクターの表示、ローマ字入力の判定、スコア・コンボシステム、HP管理まで、ほぼ一発で動作するものができあがりました。 テトリス風ゲームについても、かなり雑なプロンプトでそれらしきものができてしまいました。 両ゲームとも共通のARCADE UIフレームワーク内で動作しており、モード切り替えもシームレスです。NEXT表示やスコアパネルもきちんと機能しています。2Dのロジック系ゲームであれば、AIだけでも十分に実用レベルのものが作れることが分かりました。 挑戦②:FPS ― ここでAIの限界が見えた 最後に挑戦したのがFPS(一人称シューティング)です。 上記2ゲームに比べて、これは非常に苦戦しました。 一応動くものはできあがりました。しかし、問題が山積みでした。 問題点①:素材なしだと敵の見た目がこのようになる 画像素材を一切使わない縛りのため、敵キャラクターはすべてThree.jsのジオメトリ(直方体や球)を組み合わせて描画しています。結果、ご覧の通り幽霊というよりも、てるてる坊主のような見た目になりました。ホラー感が皆無です。 問題点②:不具合が多発 3D空間での当たり判定、敵の移動、ウェーブ管理などが絡み合い、複数の不具合が発生しました。 操作キャラが想定する方向に動かない、敵が壁にめり込む、弾が当たっているのにダメージが入らない、ウェーブが正しく進行しないなど、修正の影響が別機能に波及する状態が続きました 問題点③:動作が重い ブラウザ上でThree.jsを使った3D描画を行っているため、敵の数が増えるとフレームレートが著しく低下しました。前方進行の「W」キーを「チョン」と触っただけで、キャラが数メートル前に進む始末・・・。 AIゲーム開発で見えた境界線 今回の検証で、AIによるゲーム開発の得意・不得意がかなり明確になりました。 AIが得意なゲーム AIが苦手なゲーム まとめ 「プロンプトを書くだけで、AIでどこまでゲームを作れるのか」という疑問に対しては、「ジャンルによる」という結論になりました。 タイピングゲームやテトリス風ゲームのような2Dロジック系ゲームであれば、プロンプトだけで高品質なものができる一方で、FPSのような3Dゲームは、現状では実用レベルに持っていくのは難しいと感じました。 3Dゲーム制作の知見をお持ちの方であれば、的確な修正プロンプトを出すことでクオリティを上げることは十分可能だと思います。AIに全てを任せるのではなく、補助してもらう使い方が現実的だと思います。
-
会社サーバーPCの内部を清掃した話

会津ラボの阿部です。普段はバックエンドエンジニアをしています。今回はホコリまみれだった会社のサーバーPCを掃除したお話です。 はじめに 古いサーバーPCにホコリが堆積してきたため掃除します(今更)。7年程度メンテナンスされていなかったようで、かなりホコリが堆積しています。 今まで掃除されてこなかった理由はいくつかあります。 今までだましだまし使ってきましたが、グラフィックボードをフルで回すとサーマルスロットリングが発生していたためお掃除を敢行します。サーバー機は停止しても問題ありませんでした。 サーマルスロットリングCPU、GPU、SSDなどのパーツが許容温度を超えた際に、故障を防ぐため自動的に動作周波数や電圧を下げ、パフォーマンスを意図的に低下させる保護機能です。 お掃除戦略 ギャラリー 作業していると楽しくなって写真を撮り忘れることが多々あります。ご了承ください。 ホコリまみれのCPUクーラー。エアダスターでホコリを飛ばします CPUグリス再塗布。少し多めに塗布してしまいました CPUクーラー装着 ホコリで目詰まりしているグラフィックボード グラフィックボードを分解しようとしたらネジが錆びていて取れませんでした… (写真を撮り忘れました)グラフィックボードはエアダスターで簡易的に掃除しました。すごい量のホコリが出てきました きれいになりました 補足 このグラフィックボードはブロワー型で、PCケース内に熱がこもりにくい設計になっています。ファンは数年単位で回転し続けているのですが、異音もせず回っています。大変丈夫です。 最近のグラフィックボードにはセミファンレス機能が搭載されており、低負荷時にはファンが停止します。しかし、このモデルにはその機能がないため、ファンはつねに回転し続けています。 おわりに 清掃前:サーマルスロットリングが発生清掃後:サーマルスロットリング解消定格のTDP 215Wまで性能を発揮できるようになりました。最大温度も88°C → 80°Cと改善しています。 機会があればグラフィックボードの分解清掃に再チャレンジしようと思います。
-
ナレッジサイトの構築

概要 ナレッジサイト ナレッジサイトとは知識や情報を整理・集約したサイトのことで、ユーザが容易にアクセスでき情報の検索が可能です。ナレッジサイトの利点は、情報を素早く共有することによりコミュニケーションコストを減らせることです。今回はナレッジサイトをインターネット上に公開し、必要に応じてユーザごとにアクセス制限をおこないます。下記で紹介するサービスでは今回の使い方では料金は発生しません(一部機能を除く)。 使用するサービス Docusaurusを使用して、GithubにMarkdownを追加することで記事を作成可能なナレッジサイトを作成します。ナレッジサイトではさまざまな記事を一覧で公開することができ、情報の共有に役立ちます。 ドキュメントはGithubで管理を行うためバージョン管理が可能です。ホスティングはCloudflareを使用しどこからでもアクセスできるほか、Googleアカウント認証などを使用してアクセス制御をおこなうことも可能です。 Cloudflare Pagesへのデプロイ時に、ビルドエラーが発生するとデプロイが完了しません。Github Actionsを利用してプルリクエスト発行時にビルドエラーが発生しないことを確認し、確実にデプロイします。 Docusaurusとは https://docusaurus.io 綺麗なドキュメントサイトを作成できる静的サイトジェネレーターです。コンテンツはMarkdownで記述することができます。Reactを使用し、シングルページアプリケーションを簡単に構築できます。幅広い用途(個人ウェブサイト、製品ドキュメント、ブログ、マーケティングランディングページなど)で利用できます。 Githubとは GitHub社によって提供されるソフトウェア開発プラットフォームです。ソースコードをホスティングするサービスが無料で利用可能で、コードのバージョン管理システムにはGitを使用します。 Cloudflare Pagesとは Cloudflare社によって提供されるホスティングサービスです。CDNによって全世界から高速でアクセスが可能です。ホストするソースコードをGithubから取得し、ビルド処理をおこなったうえでCDNにデプロイが可能です。 Cloudflare Zero Trustとは(オプション) Cloudflare社によって提供されるセキュリティーネットワークサービスです。このうち、Cloudflare Accessではユーザごとのアクセス制御を行う機能をユーザが50人以下であれば無料で提供しています。 Github Actionsとは(オプション) GitHub社によって提供されるワークフロー自動化サービスです。CI/CD(継続的インテグレーション/継続的デリバリー)を実現するためのプラットフォームです。無料枠が設定されており、これを超えると実行できなくなります。 作成手順 Docusaurusの構築と設定 構築と設定を行います。筆者環境はM1 MacBook proとなります。 Docusaurusの構築 ローカルのパソコンにてDocusaurusを構築していきます(参考)。あらかじめnodeのインストールが必要となります。Typescriptを使用します。 下記のコマンドで開発サーバを起動できます。http://localhost:3000にアクセスすると起動したデモサイトを確認できます。 DevContainerなどDockerコンテナを使用する場合は、package.jsonにhostの設定を行います。 docusaurus.config.tsの設定変更 docusaurus.config.tsは設定ファイルです。初期設定から変更を行います。「-」の部分は作成するサイトにあったものに変更します。後ほど変更しても構いません。 設定項目 デフォルト設定 おすすめ設定 備考 title My Site – タイトル tagline Dinosaurs are cool – favicon img/favicon.ico – url https://your-docusaurus-site.example.com…
-
Go + Echo で WithInternal/SetInternal を使うとエラーレスポンスのカスタマイズがうまくいかないことがある

Go 言語の Web アプリケーションフレームワークである Echo に関する小ネタです。 執筆時点 (2024/10/01) での Echo フレームワークのバージョンは v4.12.0 です。将来のバージョンでは挙動が変わる可能性があるのでご了承ください。 先にまとめ 前提知識1:NewHTTPError() 関数によるエラーレスポンスの返却 Echo では echo.NewHTTPError() 関数を用いてエラーレスポンスを返却することができます。 echo.NewHTTPError() 関数の第二引数に “エラーメッセージ” のような文字列を渡した場合、デフォルトでは {“message”: “エラーメッセージ”} というようなレスポンスボディが返却されます。 文字列の代わりに構造体を渡すことで、レスポンスボディを自由にカスタマイズすることも可能です。 echo.NewHTTPError() 関数の戻り値の型は *echo.HTTPError で、この型は error インターフェースを実装しています。そのため error 型の変数や戻り値として扱うことができます。 前提知識2:WithInternal()/SetInternal() メソッドによる内部エラー情報の設定 *echo.HTTPError.WithInternal()/SetInternal() メソッドを用いることで、echo.NewHTTPError() 関数などで作成した *echo.HTTPError に内部で発生したエラー情報を付与することができます。 この内部エラー情報はレスポンスボディには含まれませんが、サーバーのエラーログ等に出力させることができます。 前提知識3:Bind() メソッドによるリクエストのバインド echo.Context.Bind() メソッドを用いることで、リクエストのクエリ/パスパラメータ、ヘッダー、リクエストボディを構造体にバインドすることができます。 本題 ここからが本題です。 以上のようなコードで作成したサーバーに対して、以下のようにリクエストを送信するとどのようなレスポンスが返却されるでしょうか。 リクエストボディは意図的に不正な形式(”age” が数字でない)にしています。 実際に送信してみると以下のようなレスポンスが返却されます。 {“error_code”:1,”reason”:”リクエストが不正です”}…
-
GORM + PostgreSQL で double precision を使う場合は float8 を指定すると良さそう

GORM で PostgreSQL を利用する場合の小ネタです。 執筆時点 (2024/04/06) での GORM のバージョンは v1.25.9、GORM PostgreSQL Driver のバージョンは v1.5.7 です。将来のバージョンでは挙動が変わる可能性があるのでご了承ください。 先にまとめ 準備 以下のような compose.yaml ファイルを用意して、Docker Compose で PostgreSQL を起動できるようにしておきます。 本題 GORM で float64 型のフィールドを持つモデルを定義して AutoMigrate すると、PostgreSQL 上では decimal (numeric) 型のカラムを持ったテーブルが作成されます。 実行してみます。 ログを見ると、確かに decimal 型のカラムを持ったテーブルが作成されていることがわかります。 しかし、場合によっては decimal ではなく PostgreSQL の倍精度浮動小数点データ型 (double precision) で格納したいこともあると思います。 そこで、gorm:”type:double precision” を指定してみます。 ログを見ると、今度は double precision 型のカラムを持ったテーブルが作成されていることがわかります。 しかし、この状態でもう一度…
-
【雑談】 マツタケが栽培できない理由

会津ラボの阿部です。普段はバックエンドエンジニアをしています。今回はソフトウェアには全く関係のない、マツタケに関する雑談です。 出典: 森林総合研究所 九州支所/菌根の話 https://www.ffpri.affrc.go.jp/kys/business/tatuta/kinoko/kinkon.html はじめに 日本におけるマツタケの歴史は古く、縄文時代にはすでに食べられており、平安貴族はマツタケ狩りを楽しみ、江戸時代には大衆向けにマツタケの料理本が発行されていたようです。日本では高級な食用キノコとされる一方で、海外では不快な臭いとみなされて人気は今ひとつのようです。近年では国内市場に流通するほとんどが輸入品で占められ、国産品は貴重な存在です。海外では見向きもされないキノコですが日本では高級品ですので、まさに金のなる木ならぬ金のなるキノコですね。 ここからが本題です。他のキノコのように人口栽培できればみんな嬉しいところですが、マツタケは人口栽培が難しいキノコとされます。一体何が原因で難しいのでしょうか。 シイタケとの違い 同じ食材キノコであるシイタケとの違いを考えてみます。シイタケは枯れ木を養分にして成長するタイプのキノコ(木材腐朽菌)です。自然環境では枯れ木や倒木に根を張って成長します。木や草を腐らせて土に還す、よく知られる自然の分解者です。シイタケ栽培のホダ木はこれを人工的に再現したものですね。 一方でマツタケは樹木の根と一体化し、樹木に土中の水分やリン酸や窒素を渡す代わりに、樹木が光合成で作った養分をもらって成長するタイプのキノコ(菌根菌)です。樹木と共生関係にあり、樹木の成長を促す役割を持ちます。キノコの本体は木の根では届かない、土中の狭い隙間に入り込むことができます。 このようにキノコは、枯れ木に生えるキノコ(シイタケ)と地面に生えるキノコ(マツタケ)の2種類に大別されます。 マツタケは人口栽培が難しい このようにマツタケは樹木と共生関係にあり、生きた樹木がないと成長できません。これが、マツタケの人口栽培を難しくしています。 まず、栽培するスペース的な問題があります。マツタケと一緒に樹木も育てる必要がありますから、シイタケのようにホダ木を並べるわけにはいきません。また、樹木と一緒に成長するため成長速度もゆっくりです。樹木の光合成に依存するため、肥料をあげて直接マツタケの成長を促すことはできません。まるごと温室に入れて成長を加速させることは、あまり現実的ではないでしょう。さらに、キノコを作り出すためのトリガーなど、よくわかっていないことも多くあります。気温や降雨量が影響しているようですが、根本的にそれらをコントロールするのは難しいという問題があります。 マツタケの収穫量はその年によって大きく変動するそうですが、それは天候の影響を強く受けるからなんですね。 TIPS菌類のうち、いわゆる「キノコ」(子実体)を作るようなものがキノコと呼ばれ、それ以外のものはカビと呼ばれます。目に見えるキノコの部分は、繁殖のために胞子を散布するための器官です。つまり植物に例えれば花の部分になります。キノコの本体は枯れ木や地面の中にあるため、あまり目にすることはないでしょう。語源的には、「木+の+子」でキノコだそうです。わかりやすいですね。実際は植物と菌類で全くの別物ですが、シイタケもマツタケも樹木と密接な関係にあります。 おわりに 今回はキノコに関する雑談でした。次回は(あるとすれば)毒キノコに関する話題を取り上げたいと思います。
-
【C#】 System.Span とパフォーマンスの話

みなさんはじめまして、会津ラボの阿部です。普段はバックエンドエンジニアをしています。 今回は C# の啓蒙活動を行おうと思います。 はじめに C# もとい .NET Framework(v1.0、2002年1月) は .NET(v1.0、2016年6月) に名前が変わりました。よりアグレッシブに機能追加するよう舵切りがなされ、特にパフォーマンスが改善されています。今回は .NET のパフォーマンス改善の目玉である System.Span<T> に関する四方山話です。 Note四方山話(よもやまばなし)種々雑多な話。 世間話。 雑談。 よもの話。 C# は生産性を重視した言語であり、パフォーマンス改善の優先度はそれほど高くありませんでした。しかし C# コンパイラが C++ から C# で書かれるようになりパフォーマンスが重視されるようになります。つまり C# におけるパフォーマンス改善の流れは C# 開発チームの内需だったわけです。その他、昨今のクラウドコンピューティングの隆盛によってパフォーマンスがよくないと開発言語として選ばれにくいという側面もあります(最近だと AOT も盛んです)。 Span<T> とは、要は配列 Span<T> は連続したメモリを表します。読み取り専用の ReadOnlySpan<T> もセットで存在します。配列の使いにくかった部分を改善した型です。 後述のとおり Span<T> はパフォーマンス改善に繋がります。しかしながら、リストやシーケンスを使う場面では System.Collections.Generic.IEnumerable<T> を使ったほうがクエリ、並列処理、イテレーターなど自由度が高く、共変性もあります。結論として、Span<T> を使うのはライブラリ作成者が主体になりそうです。一方でライブラリ利用者は、Span<T> を意識せずパフォーマンス改善の恩恵を受けられます。 文字列を例に考える Span<T> によるパフォーマンス改善の例として、文字列を見ていきましょう。 C# の文字列型(string)は不変な参照型です。詳細は省きますが、かなり特殊な型で内部的には読み取り専用の文字配列(char[])のようになっています。これは参照先で書き換えられることがないためコピーを渡す必要がないこと、コードを簡潔にできることが利点としてありますが、意図しないオブジェクトの生成が起こりやすい欠点もあります。 この問題は System.Text.StringBuilder を使うことで回避できます。…
-
LaravelでService層とRepository層を取り入れる

Laravelを使用したプロジェクトでServiceとRepositoryというLaravelの機能を使用する機会があったので、備忘録の意味も含めて紹介したい。 対象読者 Service、Repository、Controller、Modelの関係性 今回は下記の流れになる Controller →Service →Repository →Model 【Controller】①ControllerからServiceをインスタンス化し、メソッドを呼び出す❻Serviceから返ってきた整形されたデータをフロントに渡す 【Service】②Repositoryのメソッドを呼び、Controllerから受け取ったIDなどのデータを渡したりする❺Repositoryから返ってきたデータを整形し、Controllerに返す 【Repository】③クエリを記述してDBからデータを取得する❹Modelから取得したデータをServiceに返す Service層とRepository層を取り入れるメリット、デメリット メリット ・DB操作をControllerで行わない事によりControllerのコード数が増える、いわゆるファットコントローラーになる事を回避できる。 ・処理を分担する事により、可読性、保守性が向上する。 デメリット ・中〜大規模プロジェクト向けという事もあり、小規模プロジェクトでは処理を分ける事に煩わしさを感じる可能性がある 実際にやってみる 実行環境 テーブル構成はのようにしてみる id name created_at updated_at deleted_at 1 りんご 2022-01-01 2022-01-01 null 2 バナナ 2022-01-02 2022-01-02 null 3 ぶどう 2022-01-03 2022-01-03 2022-01-03 ディレクトリ構造 Controllerを作成 Serviceクラスを作成 Repositoryを作成 Modelを作成 実行結果 まとめ 以上がService層とRepository層を取り入れた実装方法となる。 今回は基礎的な処理のみの為、恩恵は感じ辛いかも知れないが実際に取り入れて頂ければ可読性、保守性の高さを実感して頂けると思う。 今後のプロジェクトでLaravelを使用する機会があった際には、積極的に採用していきたい。
-
HasuraCon’22にてHASURAwards受賞しました!

まえがき この度、会津ラボはHasuraを用いた高齢者向け医療用アプリを開発し、毎年開催されているHasuraCon’22においてHasuraを用いた素晴らしいプロジェクトに贈られる”Open Source Hero”賞を受賞しました。 HasuraCon’22についてはこちら 定期的に開催される無料のオンラインカンファレンスで、Hasuraが世界でどのような使われ方をしているか、またHasuraを用いたチーム開発ではどのような構築がされているか等を発表するイベントです。 Hasuraとは 正式名称はHasura GraphQL Engineであり、DB(Postgres)をもとにGraphQL APIを構築するオープンソースです。 PostgreSQLサーバーを建てるだけでHasura内でテーブルの作成やリレーションの設定等も可能です。 また、公式がHasura用のDockerを用意していて、起動してすぐローカル環境でHasuraが使えるようになります。 Hasuraを使った感想 GraphQLを使用することでフロント内で完結する作業が増え、バックエンドの負担を軽くすることができます。クエリを作ってすぐに実行できたり、テーブルの設定もHasuraから行えるのでシームレスに運用ができます。 また、外部APIが必要になったとしてもHasura Actionsという外部APIと連携できる機能があります。エンドポイントはあくまでGraphQLのエンドポイントだけでいいので、すっきりとした実装が可能になります。 そして、Hasuraは認証周りがしっかりしており、ユーザーレベルでの制御が容易です。JWTを読み込み取得してくる値に制限をかけるといった動作を実装できます。 Hasuraは新進気鋭の技術ということもあり、日本ではあまり情報が出回っていませんが、上記の機能を魅力的に感じたのであれば検討する価値はあると思いました。

