【Bun】bun.lockb でマージコンフリクトが起こった際の対処法

2023/10/21・役立ち情報

前提 Bunを使っていてGitでマージしようとした時、ロックファイルがコンフリクトすることがあります。しかし、Bunのロックファイルはバイナリなので、手作業でコンフリクトの解決をすることができません。以下は、Bunの自動コンフリクト解決機能を用いる方法です。 方法 リベース/マージを試みます。コンフリクトが起こります。 bun iを実行します。自動的にコンフリクトが解消されます。 git <rebase/merge> --continueを実行します。コミットメッセージをよしなに編集します。 これでコンフリクトが解消できます。

Xcode 15.0 Beta 5以降、pod install に失敗する問題の対処法

2023/08/27・役立ち情報

概要 Xcode 15.0 Beta 5以降、こんなエラーが出て CocoaPods の pod installに失敗する。 DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead (in target 'TARGET' from project 'PROJECT') この不具合は既にIssueが立っており、修正がマージされている。しかし、v1.13.0にマイルストーンが立っており、リリースは進捗的に少し先になりそうな様子。それまでは以下の対処法でビルドを通すことができる。 2023/09/25追記: この問題の修正版、v1.13.0がリリースされた。現在は以下の対処法ではなく、CocoaPodsを更新することで対処できる。 対処法 Podfileを編集する。 # ... post_install do |installer| # ... installer.pods_project.targets.each do |target| # ... target.build_configurations.each do |config| # --- Workaround for Xcode 15.0 --- xcconfig_path = config.base_configuration_reference.real_path xcconfig = File.read(xcconfig_path) xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR") File.open(xcconfig_path, "w") { |file| file << xcconfig_mod } # --------------------------------- end end end 参考 "Error 'DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead' in Xcode 15 beta 5" (GitHub)

[Flutter] URIをネイティブからFlutter側に渡すためのベストプラクティス (多分)

2023/08/25・役立ち情報

前提 ネイティブからFlutterにURIを渡すためには、EventChannelを利用すると思います。単純にFlutter側でmain()でリスナーを設定し、ネイティブでapplication(_:open:options:)やonNewIntentなどでURIを送り込むと、アプリ起動中にURIが流れてきた場合は動作するしれませんが、URIによってアプリが起動された際にはURIを渡すことができません。何故なら、Flutterエンジンの初期化には時間がかかるためです。 そのため、リッスンされるまではネイティブのコードでURIを貯蔵しておき、リッスンが開始された際に流し込む、というようなアプローチが必要になります。 ホスト(ネイティブ)側のコード iOS class UriEventApi: NSObject { static let channelName = "com.example.app.event/uri" // Channel name (任意に変更) var channel: FlutterEventChannel var eventSink: FlutterEventSink? // リッスンが開始されたタイミングで代入され、キャンセルされたタイミングでnilにされる var pendingUri: String? init(binaryMessenger: FlutterBinaryMessenger) { channel = FlutterEventChannel(name: UriEventApi.channelName, binaryMessenger: binaryMessenger) } func initHandler() { channel.setStreamHandler(self) } func onUri(uri: String) { if (eventSink != nil) { // Flutter側で既にリッスンが開始されている場合、 eventSink!(uri) // そのままeventSinkを発火させる } else { // リッスンが開始されていない = まだFlutterエンジンが初期化されていない 場合、 pendingUri = uri // pendingUriに代入して貯めておく } } } extension UriEventApi: FlutterStreamHandler { func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { // リッスンが開始された際、 eventSink = events if (pendingUri != nil) { // 保留中のURIが存在する場合、 eventSink!(pendingUri) // eventSinkを発火させてFlutter側に伝える pendingUri = nil } return nil } func onCancel(withArguments arguments: Any?) -> FlutterError? { eventSink = nil return nil } } Android // 実装の内容はiOS(Swift)と同様 class UriEventApi(binaryMessenger: BinaryMessenger) : EventChannel.StreamHandler { private val channel = EventChannel(binaryMessenger, CHANNEL_NAME) companion object { const val CHANNEL_NAME = "com.example.event/uri" } private var eventSink: EventChannel.EventSink? = null private var pendingData: String? = null fun initHandler() { channel.setStreamHandler(this) } fun onUri(uri: String) { if (eventSink == null) { pendingData = uri } else { eventSink!!.success(uri) } } override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { eventSink = events if (pendingData != null) { eventSink!!.success(pendingData) pendingData = null } } override fun onCancel(arguments: Any?) { eventSink = null } } Flutter側のコード 扱いやすくするためにUriEventApiという名前でクラスを作ります。 // lib/event_api/uri_event_api.dart class UriEventApi { static const _eventName = "com.example.app.event/uri"; static const _channel = EventChannel(_eventName); StreamSubscription listen() { return _channel.receiveBroadcastStream().listen((uri) { // process }); } } これを任意のタイミングでリッスンします。 UriEventApi().listen(); このコードで基本的には動くはずです。

【Xcode 15/iOS/WidgetKit】"Error (Xcode): Cycle inside Runner; building could produce unreliable results." エラー

2023/08/08・役立ち情報

問題発生 久々にFlutterアプリをビルドしようとしたら、以下のようなエラーが発生して失敗する問題が起きた。 Error (Xcode): Cycle inside Runner; building could produce unreliable results. Cycle details: → Target 'Runner': CodeSign /Users/xxx/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app ○ That command depends on command in Target 'Runner': script phase “[CP] Embed Pods Frameworks” ○ Target 'Runner' has copy command from '/Users/chika/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/BuildProductsPath/Release-iphoneos/WidgetKitExtension.appex' to '/Users/xxx/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/PlugIns/WidgetKitExtension.appex' ○ That command depends on command in Target 'Runner': script phase “Thin Binary” ○ Target 'Runner' has process command with output '/Users/xxx/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/Info.plist' ○ Target 'Runner' has copy command from '/Users/xxx/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/BuildProductsPath/Release-iphoneos/WidgetKitExtension.appex' to '/Users/xxx/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/PlugIns/WidgetKitExtension.appex' 環境 Flutter 3.10.6 % flutter --version Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git Framework • revision f468f3366c (4 weeks ago) • 2023-07-12 15:19:05 -0700 Engine • revision cdbeda788a Tools • Dart 3.0.6 • DevTools 2.23.1 Xcode 15.0 Beta 4 対処法 Appleのエラーメッセージは非常に分かりにくいのですが、改めて隅々まで読んでみるとBuild Phasesの順序が問題で、[CP] Embed Pods FrameworksとThin BinaryのBuild Phasesは、WidgetKitのExtensionのコピー作業を前提としているために失敗している、と書かれています。多分。 そのため、Embed App ExtensionsのBuild Phaseを上記の2つより上に持ってくる ことで解決しました。 Build Phasesの内容は環境によってかなり異なるため、上記の画像と違う場合にはエラーメッセージを詳しく読んでみてください。

MinecraftのドラクエMOD、DQMを手軽に導入できるソフト「DQM Installer」の使い方

2023/06/29・作ったモノ

こんにちは。 MinecraftにおけるドラクエMODである「DQMV」「DQMIV」「DQM in 不思議のダンジョン」を簡単かつ手軽に導入できるソフト「DQM Installer」の使い方を解説します。このMODはかなり古いMinecraftバージョンをベースとしているため、動かすにはかなりの手数が必要になります。しかし、このソフトがそれらを全部やってくれます。 事前準備 まず、ランチャーがWindows 10/11版のみインストールされていることを確認します。まず、スタートボタンを右クリックし、「インストールされているアプリ」をクリックします。 次に、表示されたアプリ一覧の検索窓で「minecraft」と検索し、表示されたランチャーの種類を確認します。 緑色のアイコンのものはWindows 10/11版です。灰色のアイコンのものはレガシーランチャーです。両方がインストールされているとインストーラーがうまく動作しないことがあるため、必ず灰色のアイコンのレガシーランチャーは事前にアンインストール してください。Windows 10/11版がインストールされていない場合はこちらからインストールしてください。 導入手順 1. インストーラーをダウンロード 以下のボタンからダウンロードページに移動してください。 :::btn ダウンロードページへ ::: 下のようなページに飛ぶと思うので、ご利用のOSに合うものをクリックしてダウンロードしてください。 そして、ダウンロードしたファイルを解凍 してください。「すべて展開」をクリックで解凍できます。(※macOS版は不要です) 2. インストーラーを起動する Windowsの場合 中にある「 dqm_installer_flt.exe 」をダブルクリックして起動してください。 ここで、以下のような画面が表示される場合があります。これは、証明書がソフトに入っていないことに起因するもので、Windowsがウイルスを検知して出しているものではありませんので、「詳細情報」をクリックして「実行」をクリックしてください。 macOSの場合 dmgイメージをダブルクリックしてマウントし、中にある「dqm_installer_flt.app」をダブルクリックして起動してください。 Linuxの場合 中にある「dqm_installer_flt」をダブルクリックして起動してください。 3. インストール前の準備 起動するとこんな画面になります。(v1.1.0現在) まず、Step 1に表示されている問題を解決していきます。ここに表示される内容は環境によって異なりますが、主要なもののみ解説します。 「xxx」を空にしてください 「.minecraftフォルダーを開く」をクリックし、その中にある「xxx」フォルダーを別の場所へ退避させるか削除して、フォルダーが存在しない、もしくは空になっている状態を作ってください。 これらのディレクトリにDQMに関係のないファイルが入っていると、ゲームが正常に動作しなかったり、間違ったセーブデータを開いてしまいワールドが破損するといった事故が起こる可能性があります。 起動構成「xxx」のゲームディレクトリを設定してください ランチャーを起動し、「起動構成」から、上で表示された起動構成にゲームディレクトリを設定してください。詳しくはこちらの記事を参照してください。 DQMのベースとなっているMinecraft 1.5.2はゲームディレクトリに対応していないため、ほかの起動構成にゲームディレクトリを設定することでMODやワールド同士の衝突を避ける必要があります。 4. 1.5.2の起動 インストーラーを見ながら手順を踏んでください。注意事項としては、 プロファイル作成後は ランチャーを再起動する必要があります。 1.5.2起動後クラッシュする場合がありますが、インストール上問題ありませんので、「×」をクリックして閉じてください。 5. 必要なファイルのダウンロード インストーラーにあるリンクから「DQM 本体MOD/前提MOD/SE・BGM」「Forge 1.5.2-7.8.1.738 Universal」をダウンロードしてください。 ※ダウンロード先はすべて同じフォルダーにしてください。 DQMは、公式サイトから遊びたいものを選んでダウンロードしてください。基本はDQMVだと思います。 本体/前提MODに関しては、遷移先に2個ファイルが表示されるので、両方ダウンロードしてください。 BGMもダウンロードしてください。これはすべて共通です。 Forgeは5秒待つと右上にSKIPが表示されるので、クリックします。 6. ファイルの割り当て インストーラーに戻り、「ファイルから自動的に認識」をクリックし、ファイルのダウンロード先フォルダー(通常はダウンロードフォルダー)を選択します。すると、自動的に適切なファイルが当たります。 ちゃんと割り当てられたファイルが正しいことを確認したら次に進んでください。 ※当たらなかった場合は、手動で選択してください。 7. 導入推奨MODの選択 説明を読んで、必要だと思ったらチェックを入れてください。自動的に導入されます。 8. インストール インストールの準備ができたら、「インストール」をクリックしてください。インストール中、必要なファイルのダウンロード(約50MB)を行うのでご注意ください。 DQMを起動する インストールが完了したらランチャーを再起動します。新しい起動構成が作成されているので、選択して「プレイ」をクリックしてください。 これでDQMの導入は完了です。お疲れ様でした。 Apple Silicon Macでの表示不具合について Apple Silicon MacでMinecraft 1.5.2を起動すると色の表示がおかしくなる不具合が存在します。以下のURLに修正方法が記載してあるのでご覧ください。 https://github.com/chika3742/dqm_installer_flt#apple-silicon-mac%E3%81%A7%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%AE%E4%BF%AE%E6%AD%A3 一部で報告が上がっている現象について 一部において、「MOBやブロックの色がおかしくなる」という現象の報告を頂いています。 私の環境においてそのような不具合に遭遇したことが1回もないため、申し訳ございませんがお力添えは出来ません。少なくとも私は、インストーラーや導入手順に問題があるとは考えておりませんのでご了承ください。 最後に 説明が足りていない部分があったり、ソフトの不具合を疑っている場合は、遠慮なくコメントを送ってください。皆さんのコメントを参考に、随時記事に説明を追加したり、記述を改善したりしております。

【重要】SubmonにおけるTwitterサインイン機能の削除について

2023/06/11・Submonのお知らせ

いつもAndroid/iOS用アプリ「Submon」をご利用いただきありがとうございます。 この度「Submon」においても Twitterサインイン機能を削除 することといたしましたので、お知らせします。現在すでに「requestTokenRequestFailed」と表示されてサインインに失敗する状況です。 経緯 こちらの記事に記載のものと同等です。アプリとしてアップデートを配信する必要があったことや、ほかのプロダクトの開発で忙しかったため、Twitterサインイン機能が利用不能になってから少々お時間をいただきました。 今後の対応 Twitterサインイン機能を削除し、アカウントの連携・連携解除機能を新たに追加する予定です。現在Twitterサインインを利用してログインされている方は、一度アプリをアンインストールしたりログアウトしたり するとその地点で 二度とアカウントにログインすることができなくなってしまう ため、ご注意ください。 該当の変更は今後リリース予定のv1.2.0で実装予定です。公開日時は未定です。 利用者で必要な対応について 上述のアカウントの連携・連携解除機能を利用して、GoogleもしくはAppleアカウントとの連携を行ってください。また、メールアドレスログインに変更する手段の提供予定は現状ありません。

【重要】従来版(旧バージョン)「DQMインストーラー」開発/サポート終了と、新バージョンへの移行について

2023/06/11・お知らせ

こんにちは、chikaです。 この度、旧バージョンのDQMインストーラーのサポートと配布を終了し、新バージョンへ移行する形とすることをお知らせします。 経緯 動画投稿地点からかなり環境が変わり、現在の(従来の)ソフトとコメント等での説明だけではカバーしきれなくなってきました。そのため、せっかくならと完全リニューアルすることとしました。UIを格段にわかりやすいフロー形式にし、導入推奨MODもチェック1つで導入可能です。また、macOS/Linux向けのインストーラーも統合しました。 今後について Windows版(動画・配布ページ)およびmacOS/Linux版(動画・配布ページ)はサポートを終了し、ソフト本体は 2023/6/30 に配布を終了、動画は 2024/3/31 に限定公開に変更する予定です。今後は新バージョンをご利用ください。 利用方法の解説はこちら

【GitHub Actions】Windowsホストで$GITHUB_OUTPUTが使えない

2023/06/08・役立ち情報

ハマった 以下のように、WindowsホストランナーでOutputしようとするとうまくいかない。 jobs: build_windows: runs-on: windows-latest steps: - uses: actions/checkout@v3 - id: test run: echo "FILENAME=test.zip" >> "$GITHUB_OUTPUT" - run: echo ${{ steps.test.outputs.FILENAME }} 対処法 WindowsホストのシェルであるPowershellにおいては、環境変数にアクセスするにはenv:のプレフィックスが必要な模様。 run: echo "FILENAME=test.zip" >> "${env:GITHUB_OUTPUT}"

【Nuxt3】SSG時に、サイトマップを動的ルートも含めて全自動で生成する方法

2023/06/01・役立ち情報

経緯 Google Search Index用にサイトマップを作りたくなった。サイトマップの生成自体はsitemapパッケージでどうにかなるが、いちいち全部のルートを取得してリストを作るのは面倒臭い。そこで、nitroに備わっているクローラーを使って、サイト内にあるリンクからルート一覧を生成してみる。 nitroのクローラーは、HTMLに含まれる、「/」で始まるhref属性を含むタグを自動的に認識し、リンク先のルートを生成できる。 壁 nitroでは、クローラーによって自動的に動的ルートのページが生成される。しかし、クロール後のルート一覧を取得する方法が存在しない。そこで、ページを生成するタイミングでフックを挟んで、変数のリストに追加していくことにする。 コード まず、sitemapパッケージをインストールしておく。 yarn add sitemap 次に、nuxt.config.tsのdefineNuxtConfigの上に以下を追加する。 const hostname = "<hostname>" const routes: string[] = [] export default defineNuxtConfig({ ... 続いて、defineNuxtConfigの中に以下を追加する。 export default defineNuxtConfig({ ... nitro: { hooks: { "prerender:route"(route) { routes.push(route.route) }, close() { if (routes.length > 0) { const links: SitemapItemLoose[] = routes.map(route => ({ url: route, })) const stream = new SitemapStream({ hostname, }) return streamToPromise(Readable.from(links).pipe(stream)) .then((sm) => { return fs.writeFileSync("dist/sitemap.xml", sm.toString()) }) } }, }, }, ... }) 9行目のif (routes.length > 0)は、これを入れないとnuxt prepare(yarn install)を実行した際にもこの処理が走ってしまうために入れています。

【重要】本サイトのコメント欄におけるTwitterログイン機能の廃止について

2023/04/30・お知らせ

いつも本サイトをご覧頂きありがとうございます。 この度、本サイトのコメント欄において、Twitterログイン機能を削除 することといたしましたので、お知らせします。 経緯と今後の対応 こちらのお知らせに記載のものと同等です。 利用者側で必要な対応について Twitterアカウントを利用してログインされている方は、今後は一度ログアウトしてしまうと、二度とコメントの編集や削除が出来なくなります。 必要なコメントの編集や削除は済ませた上で、ログアウト後に再度Googleアカウントもしくは、今後対応予定のApple IDを使用してログインしてください。 ご不便をおかけしますが、ご理解の程よろしくお願いします。