開発ブログ|株式会社Nextat(ネクスタット)
https://nextat.co.jp/
京都を中心にシステム開発・Webサイト・ホームページ制作を行なっているシステム開発・Web制作会社Nextat(ネクスタット)の公式サイトです。Webサイトの開発から業務支援システムの開発まで幅広く手がけています。ホームページ製作は、SEOやCMS、更新・運用など、お客様に合わせた最適なサービスをご提案します。
フィード
【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を扱うすべての方の一助になれば幸いです。これからもバージョンアップなどで気になる機能が出てきた場合には記事を更新しようかと思いますので、よろしくお願いいたします。
6ヶ月前
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-
6ヶ月前
【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
6ヶ月前
【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
6ヶ月前
【Compose Multiplatform】KMPAuthを使用したFirebaseソーシャルログイン(iOS編)
開発ブログ|株式会社Nextat(ネクスタット)
Compose Multiplatform入門(環境構築編)Compose Multiplatform入門(プロジェクト作成編)Compose Multiplatform入門(画面遷移編)Compose Multiplatform入門(ロギング編)KMPAuthを使用したFirebaseソーシャルログイン(Andorid編)iOSでのSNSログインREADMEにもある通り、iOSでソーシャルログインを実装するには別途準備が必要になります。Firebaseアプリケーションの登録パッケージのインストールiosApp/iosApp/iOSApp.swiftの更新MainViewControllerの更新不具合の修正iOSのときにMissingResourceExceptionが発生するという問題が記載されていたので、その対処を行います。リソースの追加Isuueのリンク先にあるように、composeApp/src/iosMain内に「resources」フォルダを追加します。build.gradle.ktsの更新これで全ての修正が完了...したかに思いましたが、まだ動作しませんでした。KMPAuthのバージョンを調整Androidでは動いていたので大丈夫かと思っていましたが、どうやら罠だったようです。 バージョン1.4.0だと動作したので、バージョンを下げておきます。 libs.versions.tomlを更新します。kmp-auth = "1.4.0"さいごに最後に罠がありましたが、なんとか動いてよかったです。KMPAuthのバージョン2.0.0にもいずれ対応策が出てくるかもしれないので、動向を注視しておきたいです。 次回はHTTP通信に関しての記事です。最後までご覧いただきありがとうございました。
7ヶ月前
【Spring Boot】Java Mail SenderとMailpitでメール送信機能を実装
開発ブログ|株式会社Nextat(ネクスタット)
こんにちは、おさむちゃんです。環境- Spring Boot: 3.3.0- Docker: 24.0.6セットアップSpring Initializrを使用してプロジェクトを作成しました。- Language: Java- Java: 21- Spring Web build.gradleの設定の確認 build.gradle には以下の依存関係が含まれていることを確認します。dependencies { implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-web'}application.propertiesの設定 src/main/resources/application.properties に以下の設定を追加します。server.port=8080spring.mail.host=mailpitspring.mail.port=1025spring.mail.username=spring.mail.password=spring.mail.properties.mail.smtp.auth=falsespring.mail.properties.mail.smtp.starttls.enable=falseMialpitを使用してローカルでメールを送信するための設定を行なっています。compose.yamlの作成プロジェクトのルートディレクトリに以下のように compose.yaml ファイルを作成します。services: app: image: eclipse-temurin:21 ports: - "8080:8080" volumes: - .:/app working_dir: /app command: sh -c './gradlew bootRun' environment: SPRING_MAIL_HOST: mailpit SPRING_MAIL_PORT: 1025 mailpit: image: axllent/mailpit ports: - "8025:8025" - "1025:1025"Spring Bootアプリケーシ
7ヶ月前
【Compose Multiplatform】KMPAuthを使用したFirebaseソーシャルログイン(Android編)
開発ブログ|株式会社Nextat(ネクスタット)
Compose Multiplatform入門(環境構築編)Compose Multiplatform入門(プロジェクト作成編)Compose Multiplatform入門(画面遷移編)Compose Multiplatform入門(ロギング編)Firebaseアプリケーションの作成AndroidプロジェクトにFirebaseを追加する」のページの通りに進めていけばOKです。Firebaseアプリケーションの名前設定Googleアナリティクスの設定パッケージ名・デバッグ用書名証明書SHA-1の設定構成ファイルのダウンロードKMPAuthの利用KMPAuth」を利用します。 Compose MultiplatformプロジェクトでAndroid、iOSでのFirebase ソーシャルログインが使えるようになるライブラリです。libs.versions.tomlの更新composeApp/build.gradle.ktsの更新" keyAlias = "" keyPassword = "" } }}初期化処理を書く")) }}Googleサインインボタンの配置() val navigator = LocalNavigator.currentOrThrow Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { val anotherScreen = rememberScreen(Screens.Another(postId = "dummy_post_id")) Button(onClick = { navigator.push(anotherScreen) }) { Text("画面遷移") } var signedInUserName: String by remember { mutableStateOf("") } val onFirebaseResult: (Result) -> Unit = { result -> if (result.isSuccess) { val firebaseUser = result.getOrNull() signedInUserName = firebaseUser?.display
7ヶ月前
GitHub ActionsでPRタイトルをエスケープする方法と問題点
開発ブログ|株式会社Nextat(ネクスタット)
はじめにこんにちは、ヨシです。6 月に入り非常に暑くなってきましたね。自分はカフェでの作業などが好きなのですが、冷房や冷たいものをよく飲んだりしているせいか、体調を崩し気味です。皆さんも体調には気をつけてお過ごしください。今回は業務で出会った GitHub Actions についてのつまずきポイントについての内容となります。GitHub Actions とはGitHub Actions とは、コードのビルドやテスト、デプロイなどのパイプラインを自動化することができる GitHub 上の CI/CD プラットフォームです。より具体的にはリポジトリへのコードの push や、issue と PR の作成やラベル付けなど、GitHub 上での様々なアクションから自動化された一連のワークフローをトリガーすることができます。具体的なユースケース例えば、PR を作成したときに、まだレビューしてほしくない場合には wip、PR が完成しレビュアーにレビューして欲しい状態となった場合には request review といったラベルを付けるルールを採用しており、Slack に request review のラベルが貼られたことを PR の内容と共に通知してほしいというようなケースがあるとします。このようなケースの場合、GitHub Actions では、Slack がオフィシャルに提供する slack-github-action やサードパーティ制の action-slack などが利用できます。そして、リポジトリの .github/workflows/ ディレクトリ以下にそのアクションを記述する YAML ファイルを作成します。上記の例を再現するためにシンプルなワークフローを記述してみます。# ワークフローの名前 name: send-slack-notification# このワークフローのトリガーとなる操作(今回の場合にはPRの作成)on: pull_request: types: [labeled] # 今回はlabeledに限定 jobs: build: # 今回はラベルがついているかどうかのみをチェック(条件に合致しない場合にはjobをスキップ) if: contains(join(github.event.pull_request.labels.*.name), '
7ヶ月前
Compose Multiplatform 入門(ロギング編)
開発ブログ|株式会社Nextat(ネクスタット)
Compose Multiplatform入門(環境構築編)Compose Multiplatform入門(プロジェクト作成編)Compose Multiplatform入門(画面遷移編)Kermitを使用したロギングhttps://kermit.touchlab.co/環境構築libs.versions.toml、build.gradle.ktsに記述していきます。libs.versions.tomlbuild.gradle.kts実際に使ってみるAnotherScreen.kt{ parametersOf(postId) } val navigator = LocalNavigator.currentOrThrow LifecycleEffect( onStarted = { Logger.i { "Open Another Screen" } } ) Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { Text(text = viewModel.postId) Button(onClick = { navigator.pop() }) { Text("戻る") } } }}出力先さいごにこれでマルチプラットフォーム環境でのログ出力が可能になりました。次回はFirebaseでのアカウント認証についての解説を行っていこうと思います。
7ヶ月前
【Java/Spring boot】JPAを使ったアプリケーションのHTTPテストでDBに更新が反映されない問題を解決する
開発ブログ|株式会社Nextat(ネクスタット)
こんにちは、たけちゃんです。前提条件・JDK21失敗した結合テストの事例まずは具体的な事例から。 原因JPAの実装を提供しているRed Hatのリファレンスを見てみると以下の一文が。flush() を明示的に使用する場合を除き、エンティティマネージャが JDBC コールを実行するタイミングに関して絶対的な保証はありません。JPAはエンティティの変更をメモリ内で管理し、トランザクションがコミットされるまで実際のDBには変更を反映しないようです。解決策この問題を解決するために、JPAのEntityManagerのflush()メソッドを使用して、メモリ内の変更を即座にDBに反映させ、無事テストを通すことができました。まとめ今回のようにテストメソッドでトランザクションを張っていて、実装コードのトランザクションとネストしているケースでは、テスト側のトランザクションに対しても明示的にEntityManager.flush()を呼んであげてDBの状態を同期させる必要があるようです。同様な点でハマっている人の参考になれば幸いです!
7ヶ月前