開発ブログ|株式会社Nextat(ネクスタット)
https://nextat.co.jp/
京都を中心にシステム開発・Webサイト・ホームページ制作を行なっているシステム開発・Web制作会社Nextat(ネクスタット)の公式サイトです。Webサイトの開発から業務支援システムの開発まで幅広く手がけています。ホームページ製作は、SEOやCMS、更新・運用など、お客様に合わせた最適なサービスをご提案します。
フィード

【Unity】VContainerで依存性注入やってみた
開発ブログ|株式会社Nextat(ネクスタット)
みなさんこんにちは。ホンジョウです。Zenjectで行っていましたが、最終リリースが2020年ということで、だいぶ枯れてきたように思います。VContainerに乗り換えてみようということで、少し触ってみました。開発環境Mac OS Sequoia 15.3.1Unity 6(6000.0.29f1)VContainer 1.16.8R3 1.3.0UniTask 2.5.10公式ドキュメントがわかりやすいです。R3をUnityNuGetとOpenUPMで楽々インストールUniTaskの導入作成するものFadeView.cs の作成FadeModel.cs の作成 Alpha => alpha; private readonly ReactiveProperty alpha = new (0); public async UniTask FadeInAsync(CancellationToken token) { alpha.Value = 1; while (alpha.Value > 0) { alpha.Value -= Time.deltaTime; await UniTask.Yield(token); } alpha.Value = 0; } public async UniTask FadeOutAsync(CancellationToken token) { alpha.Value = 0; while (alpha.Value < 1) { alpha.Value += Time.deltaTime; await UniTask.Yield(token); } alpha.Value = 1; }}FadeController.cs の作成RootLifetimeScopeの作成問題点おわりにこちらのページでも紹介されています。作者も日本の方で、質問やフィードバックのハードルが低いと感じました。VContainerのますますの発展をお祈りしております。
2ヶ月前

【Unity】Input Systemを使ってみた
開発ブログ|株式会社Nextat(ネクスタット)
こんにちは、ホンジョウです。開発環境Mac OS Sequoia 15.3.1Unity 6 (6000.0.29f1)プロジェクトの立ち上げプレイヤー用Scriptの作成OnMove()は、あとでPlayerオブジェクトに追加する「Player Input」というコンポーネントが読み取るために、publicにしておきます。Playerオブジェクトの設定Character ControllerPlayer(Script)Player InputUIからの操作ゲームパッドの対応こちらのページによると、MacではXBox、PS4/5、Switchコントローラーにそれぞれ対応しているようなので、試しに家にあったPS5コントローラーをUSB経由で接続してみたところ、とくに修正もなく、上記の移動処理がPS5コントローラーで動作していることを確認できました。すごいぞInput System。さいごに参考資料Unity公式ドキュメント Input SystemUnity公式ドキュメント Player Inputに関しての解説Unity公式ドキュメント On-Screen Buttonに関しての解説
2ヶ月前

ZellijでDocker開発環境をちょっと自動化してみた
開発ブログ|株式会社Nextat(ネクスタット)
はじめにこんにちは、ヨシです。最近は大分暖かくなってきて気持ちよいの季節になってきましたね。その一方であれが到来しています。そう、花粉です。現在は京都に住んでいるのですが、この間しばらく東京に行く機会がありまして、その際に花粉症が発症してしまいました。目薬や漢方が必須となりそうなので、そろそろ処方してもらおうかと思います。さて、本日は Zellij というターミナルマルチプレクサのツールとそれを使った開発環境のオートメーションについての記事を書いていきたいと思います。Zellijとはまず、Zellij(ゼリッジ)とは、tmux などに代表されるターミナルマルチプレクサ(Terminal Multiplexer)ツールの一種で、ターミナルエミュレータ内でセッション、タブ、ペインといった単位で画面を分割して、その中で仮想ターミナルを起動させることができます。https://zellij.dev https://zellij.dev/tutorials/basic-functionality/ より引用Zellij は Rust 言語で開発されており、tmux に比べてモダンで、プラグインなどを導入しなくても最初から様々な機能が利用できる(batteries included)なものとして利用できます。特徴的なのは初学者にとって非常にわかりやすく、ユーザーフレンドリーな UI になっている点です。こういったツールで大変なのはキーバインドを覚えるということですが、Zellij の場合には status-bar という画面下部の領域(下記画像の③の領域)に主なキーバインドを表示してくれて、モード変更に基づいてどのようなアクションが可能かを表示してくれます。実際、このキーバインドの表示によって簡単に Zellij の操作を覚えることができました。https://zellij.dev/documentation/overview より引用status-bar は後から非表示にすることもできますが、このような初学者に非常に優しい作りとなっているため、これからターミナルマルチプレクサを使いたいという方は tmux よりも Zellij を使う方がおすすめです。もちろん、tmux の方が歴史があるため、tmux でしか使えないような機能が多々あったりしますが、初学者にとっては使わないよ
2ヶ月前

Laravel + Inertia.jsのForm Helperを使った際のエラーハンドリングをより実践的に
開発ブログ|株式会社Nextat(ネクスタット)
弊社では最近Laravelと Inertia.js によるMPAを選択するプロジェクトが増えて知見を溜めつつあり、当ブログでも紹介していければと考えています。Inertia.jsを使う場合のフォームの実装には、Form Helper を使うのが手軽です。本日はこのForm Helperを使った際のエラーハンドリングについて、ドキュメントから一歩先に進んで検討した例を紹介します。環境バックエンドPHP 8.4.4Laravel 11.31inertiajs/inertia-laravel 2.01フロントエンド今回はサンプルをVueとしていますが、ReactやSvelteを使う場合もほぼ同様の実装が可能です。Node 22.5.1@inertiajs/vue3 2.0.3Vue 3.5.13ziggy-js 2.5.1今回のサンプルとなるフォームイベントを新規登録する簡単なフォームを考えます。イベントのタイトルと開始日時を登録するものとします。エラー発生時に期待される挙動は下記のとおりです。フォーム送信先のエンドポイントでバリデーションエラーが起こった際はリダイレクトバックし、バリデーションエラーメッセージはフォームの入力項目それぞれの下に表示するその他の例外が発生した場合もリダイレクトバックし、例外のメッセージをフォームの上部に表示するバリデーションエラー発生時その他の例外発生時デフォルトのエラーハンドリングまずは、何も設定していない状態の確認です。 Controllerなどでバリデーションエラー以外の例外を投げた場合は、Inertia.jsの用意しているモーダルの中にLaravelデフォルトのエラー画面が表示されてしまいます。この系統の挙動は一般的には事例が少なく、多くの場合はそのままでは好ましくありません。Inertia.js公式で紹介されている本番向けの設定Inertia.jsのドキュメントのエラーハンドリング には、本番環境向けの設定方法が紹介されています。ステータスコードが403,404,500,503のいずれかとなる例外発生時はフロントエンドのエラー用のページコンポーネントでエラー画面を表示するXSRFトークンのミスマッチが起こりステータスコードが419となった場合はリダイレクトバックしてセッションにメッセージを入れるuse Illuminate\Htt
3ヶ月前

LaravelのロックのDynamoDBドライバで高負荷時にロックが解除されない不具合
開発ブログ|株式会社Nextat(ネクスタット)
本日の記事は、とあるプロジェクトでLaravelのロックのDynamoDBドライバの実装に起因するバグに苦しめられたので、その備忘録です。環境Laravel 9.34背景・症状当該プロジェクトでは、アプリケーションにおけるロックのドライバとして、Redis(AWS上ではElastiCache for Redis)の代わりにスケールの容易なDynamoDBに移行していました。高負荷時のパフォーマンスチューニングのため負荷試験を行なっており、RDSでプリペアドステートメントに関係する特定のエラーが出た直後にロック待ちのタイムアウトが頻発するようになることが多いDynamoDBのテーブルの中身を確認したところ、ロック用のアイテム(DynamoDBのレコード相当)が残っているある程度ログを仕込んだりしたがあまり目ぼしい情報がなく手づまり気味という情報を負荷試験チームから共有され、調査を開始しました。LaravelのDynamoDBドライバ周りのコードを読んでも特に問題があるように思えず、実行時間タイムアウトなどの致命的なエラーやPHP-FPMのセグメンテーションフォルトでfinally節でのロック解除をすり抜けた説コンテナがグレースフルシャットダウンしていない説DynamoDBのスロットリング が起こっていた説などの仮説を立てていましたが、ログから得られる情報とはいまいち合致しません。原因の解明より詳細な情報を得るために、Illuminate\Cache\DynamoDbLock・Illuminate\DynamoDbStoreを継承して拡張し、さらに詳細なロギングを仕込んで調査を行おうと再度コードを深掘りしていました。DynamoDbLock::release()の実装はロックのアイテムに設定したownerの値が合致しなければfalseを返して失敗します。Illuminate\Cache\Lock(DynamoDbLockの基底となる抽象クラス) /** * Release the lock. * * @return bool */ public function release() { if ($this->isOwnedByCurrentProcess()) { return $this->dynamo->forget($this->name); } return f
3ヶ月前

Cloudflare Zero Trustを導入中 〜 リモートアクセスVPNの代替と固定IPアドレスによる通信の維持
開発ブログ|株式会社Nextat(ネクスタット)
本日のお題はWeb系ではなく、珍しくセキュリティとネットワークに関連する記事です。弊社では、社外(主としてリモートワーク環境)からの社内LAN内の機器へのアクセス接続元のIPアドレス制限を行っているサービスへの社外からのアクセス業務端末を社外のWi-Fiに接続した時の保護などを目的としてリモートアクセスVPNを自前運用しています。事務所内に設置しているルーターをVPNサーバーとしてリモートアクセスVPNを実現していたのですが、同時接続数の増加に伴う速度低下や接続の不安定さが目立つようになりました。 当初はルーターを入れ替えようという話になったのですが、同時接続数の上限が低く、一度頓挫しました。昨今、VPN機器の脆弱性を突かれるセキュリティインシデントをよく見かけることもあり、ネットワークの設計自体を見直す丁度良い機会であると考えてVPNに限定せず選択肢を調査しました。Tailscale と Cloudflare Zero Trust を候補に考えていたのですが、50ユーザーまで無料のプランがあり社での試験導入も気軽にできそうなことなどからCloudflare Zero Trustを採用することにしました。ゼロトラスト・セキュリティやCloudflare Zero Trustの存在は以前から認識していたものの、接続元IPアドレス制限はゼロトラストの理念とはむしろ逆のものであり、両立するのは困難だろうと考えていたのが今まで手を出さなかった理由でした。そのような偏見があったのですが、調査の結果むしろVPN利用よりリモートアクセスの負荷が下がる構成を実現できそうなことがわかったため、昨年末ごろから試験導入を行っています。今回の記事は、Cloudflare Zero Trustを利用して固定IPアドレスによる特定のWebサイトへのアクセスを実現した方法についてが主となります。ゼロトラスト・セキュリティ/ゼロトラスト・ネットワークいかなるネットワークにも信頼を置かず、利用するアプリケーションやサービスそれぞれで常にユーザーの検証(認証認可)を行うセキュリティ/ネットワークのモデルのことをゼロトラスト・セキュリティ/ネットワークと呼びます。従来のネットワーク設計では信用してきた社内LANやVPN経由のアクセスなども信用すべきでないものとして扱われるのが特徴です。 このモデルが台頭
3ヶ月前

【Compose Multiplatform】Resourcesライブラリを用いたリソース取得のマルチプラットフォーム対応
開発ブログ|株式会社Nextat(ネクスタット)
みなさんこんにちは。今回はCompose Multiplatform記事の8回目になります。Compose Multiplatform入門(環境構築編)Compose Multiplatform入門(プロジェクト作成編)Compose Multiplatform入門(画面遷移編)Compose Multiplatform入門(ロギング編)KMPAuthを使用したFirebaseソーシャルログイン(Android編)KMPAuthを使用したFirebaseソーシャルログイン(iOS編)Ktorを使用したHTTP通信とRepositoryの実装マルチプラットフォーム対応のリソース取得処理Resourcesライブラリを使用します。 今回はResourcesライブラリを用いて、画像表示処理を行います。導入build.gradle.ktsの更新使用する画像のインポートPNGJPGBMPWEBPXML形式のベクター画像画像の表示HomeScreen.kt の更新実行テキストリソースの取得strings.xml呼び出し方さいごに今回でCompose Multiplatformの記事連載は一旦終了になります。Compose Multiplatformを扱うすべての方の一助になれば幸いです。これからもバージョンアップなどで気になる機能が出てきた場合には記事を更新しようかと思いますので、よろしくお願いいたします。
10ヶ月前

Laravel + MinIOのローカル環境をAWS環境に近づける設定
開発ブログ|株式会社Nextat(ネクスタット)
こんにちは、ナカエです。 そろそろ梅雨も明けるらしいですが、蒸し暑い日が続いていますね。AWS S3互換のオブジェクトストレージとして、 ローカル開発環境で MinIO を利用されている方も多いかと思います。 弊社でも以前はLocalStackを使うことも多かったですが、最近はMinIOの割合が高いです。さて、MinIOは非常に手軽に設定できますが、素朴に使うとAWS環境との差異がいくつか残ります。 本記事の主旨は次のような問題を解決し、ローカルで利用するMinIOとステージング・本番環境の構成を近づけようというものです。ステージング・本番環境のAWS S3ではパススタイルのリクエストを利用していないのに、ローカル環境でのみ使っているのが気にかかる本番ではCDNを使うので、画像にもlocalhostではないホスト+HTTPS通信でアクセスしたいMinIOが使うホスト側のポートを減らしたい目指す構成バーチャルホストスタイルのエンドポイントを利用する。つまり、Laravelアプリケーションからも {MinIOのホスト名}/{バケット名} ではなく {バケット名} .{MinIOのホスト名} でアクセスするCloudFrontなどのCDNを介して画像を配信する構造に近づけるため、Webサーバ(今回はnginx)にてリバースプロキシとTLS終端を設定し、 https://images.minio-test.local でアクセスできるようにするMinIOの管理コンソールにもHTTPSでアクセスできるようにするURLの構成は下記になります。Laravelアプリケーション: https://app.minio-test.local画像サーバー: https://images.minio-test.localMinIOの管理コンソール: https://console.minio-test.local環境macOS 14.5(Sonoma)CPU: Apple M1 MacPHP 8.3.9Laravel 11.15.0前提MinIO用の設定の説明に集中するため一部の設定は省略しますが、下記を前提としています。/etc/hosts/etc/hosts が下記のように設定されているものとします。127.0.0.1 app.minio-test.local images.minio-
10ヶ月前

【Compose Multiplatform】Ktorを使用したHTTP通信とRepositoryの実装
開発ブログ|株式会社Nextat(ネクスタット)
Compose Multiplatform入門(環境構築編)Compose Multiplatform入門(プロジェクト作成編)Compose Multiplatform入門(画面遷移編)Compose Multiplatform入門(ロギング編)KMPAuthを使用したFirebaseソーシャルログイン(Android編)KMPAuthを使用したFirebaseソーシャルログイン(iOS編)Ktorを使用したHTTP通信https://ktor.io/環境構築libs.versions.tomlbuild.gradle.kts自己署名証明書を信頼させる方法commonMain/kotlin/data/http/HttpClient.ktロギングの記事で使用した、Kermitを通信時のログに仕込んでいます。package data.httpimport io.ktor.client.HttpClientimport io.ktor.client.HttpClientConfigimport io.ktor.client.plugins.logging.LogLevelimport io.ktor.client.plugins.logging.Loggerimport io.ktor.client.plugins.logging.Logginginternal val HttpClient by lazy { HttpClient { configure() }}internal fun HttpClientConfig<*>.configure() { install(Logging) { level = LogLevel.ALL logger = object : Logger { override fun log(message: String) { co.touchlab.kermit.Logger.d(tag = "KtorClient", messageString = message) } } } configureForPlatform()}internal expect fun HttpClientConfig<*>.configureForPlatform()androidMain/kotlin/data/http/HttpClient.andro
10ヶ月前

【Laravel】クエリビルダーのupdateOrInsert()にクロージャを渡して使用する方法
開発ブログ|株式会社Nextat(ネクスタット)
はじめまして!今年1月に入社したしゅんちゃんです。https://laravel-news.com/laravel-11-10-0前提条件Laravel Framework 11.10PHP 8.3そもそもupdateOrInsert()メソッドとは使用例としては以下の通りです。クロージャを渡して使用する$existsという変数が渡され、データベースに第一引数で指定したレコードが存在するかどうかで、更新または挿入する内容を指定することができます。まとめLaravel - The PHP Framework For Web Artisans - Update or Insert
1年前