PageSourceSearch

https://shinagawa.app/posts/

html shinagawa.app collected 2026-10-02 01:14:48 UTC 20,067 bytes, 7 lines download raw bytes

1<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml"/><link rel="preload" href="/fonts/Inter-roman.latin.var.woff2" as="font" type="font/woff2" crossorigin="anonymous"/><title>Blog</title><meta name="next-head-count" content="5"/><meta name="robots" content="follow, index"/><meta name="description" content="Shinagawa App portfolio."/><meta property="og:site_name" content="Shinagawa App"/><meta property="og:description" content="Shinagawa App portfolio."/><meta property="og:title" content="Shinagawa App"/>
vendor: 66 bytes, line 1
1<script async="" src="https://www.googletagmanager.com/gtag/js?id=
1G-C5MXY9C5GL
vendor: 11 bytes, line 1
1"></script>
1<script>
2                  
vendor: 181 bytes, lines 2-5
2window.dataLayer = window.dataLayer || [];
3                  function gtag(){dataLayer.push(arguments);}
4                  gtag('js', new Date());
5                  gtag('config', '
5G-C5MXY9C5GL
vendor: 83 bytes, lines 5-7
5', {
6                    page_path: window.location.pathname,
7                  });
7</script>
7<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4800068521558938" crossorigin="anonymous"></script>
7<link rel="preload" href="/_next/static/css/e93101886f1eb15f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/e93101886f1eb15f.css" data-n-g=""/><noscript data-n-css=""></noscript>
7<script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script>
7<script src="/_next/static/chunks/webpack-fa3b601c4ba67973.js" defer=""></script>
7<script src="/_next/static/chunks/framework-7f41c479b233ef58.js" defer=""></script>
7<script src="/_next/static/chunks/main-4e672b7cacaea90d.js" defer=""></script>
7<script src="/_next/static/chunks/pages/_app-40d381bba7421e9c.js" defer=""></script>
7<script src="/_next/static/chunks/1917-60b80969291fc23a.js" defer=""></script>
7<script src="/_next/static/chunks/pages/posts-79c0daabcbd0b494.js" defer=""></script>
7<script src="/_next/static/0qF3qm-TO7UtrTZ9r5s6X/_buildManifest.js" defer=""></script>
7<script src="/_next/static/0qF3qm-TO7UtrTZ9r5s6X/_ssgManifest.js" defer=""></script>
7<style id="__jsx-7c359fde634f3543">a.jsx-7c359fde634f3543{float:right}@media screen and (max-width:480px){article.jsx-7c359fde634f3543{padding-top:2rem;padding-bottom:4rem}}</style></head><body><div id="__next">
7<script>!function(){try{var d=document.documentElement,c=d.classList;c.remove('light','dark');var e=localStorage.getItem('theme');if('system'===e||(!e&&true)){var t='(prefers-color-scheme: dark)',m=window.matchMedia(t);if(m.media!==t||m.matches){d.style.colorScheme = 'dark';c.add('dark')}else{d.style.colorScheme = 'light';c.add('light')}}else if(e){c.add(e|| '')}if(e==='light'||e==='dark')d.style.colorScheme=e}catch(e){}}()</script>
7<article class="nx-container nx-prose max-md:nx-prose-sm dark:nx-prose-dark" dir="ltr"><h1>Blog</h1><div class="nx-mb-8 nx-flex nx-items-center nx-gap-3"><div class="nx-flex nx-grow nx-flex-wrap nx-items-center nx-justify-end nx-gap-3"><a href="/about/">About</a><a href="/">Apps</a><span class="nx-cursor-default dark:nx-text-gray-400 nx-text-gray-600">Blog</span></div><span role="button" aria-label="Toggle Dark Mode" class="nx-cursor-pointer nx-p-2 nx-text-current" tabindex="0"><svg fill="none" viewBox="3 3 18 18" width="12" height="12" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" fill="currentColor" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path></svg></span></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/reducing_mac_system_data_storage/">Macのシステムデータの容量を削減する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Macのシステムデータの容量が600GBを超えていたので、原因を調べて容量を削減しました。<a class="post-item-more nx-ml-2" href="/posts/reducing_mac_system_data_storage/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2026-03-05T15:00:00.000Z">Fri Mar 06 2026</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/compose_multiplatform_subscription/">Compose Multiplatform で サブスクリプションを実装する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Android/iOSの両方でサブスクリプションの課金処理を実装する方法をまとめました。<a class="post-item-more nx-ml-2" href="/posts/compose_multiplatform_subscription/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2025-01-23T15:00:00.000Z">Fri Jan 24 2025</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/android_edge_to_edge/">Android 15 の edge-to-edgeに対応する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Android 15 の edge-to-edge に対応した時の変更点を記載します<a class="post-item-more nx-ml-2" href="/posts/android_edge_to_edge/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2025-01-17T15:00:00.000Z">Sat Jan 18 2025</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/webview_http/">AndroidとiOSのWebViewでhttp通信を許可する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">全てのドメインに対してHTTPのクリアテキスト通信を許可したい場合は...<a class="post-item-more nx-ml-2" href="/posts/webview_http/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-11-13T15:00:00.000Z">Thu Nov 14 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/android_share_activity/">ブラウザの共有からAndroidアプリを開く</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">ブラウザの共有からAndroidアプリを開く方法を説明します。<a class="post-item-more nx-ml-2" href="/posts/android_share_activity/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-10-14T15:00:00.000Z">Tue Oct 15 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/compose_multiplatform_keyboard/">Compose Multiplatform で キーボードショートカットを実装する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Compose Multiplatform で、キーボードショートカット処理を実装する方法を解説します。<a class="post-item-more nx-ml-2" href="/posts/compose_multiplatform_keyboard/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-08-15T15:00:00.000Z">Fri Aug 16 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/compose_multiplatform_admob_banner/">Compose Multiplatform で Admobのバナー広告を表示する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Compose Multiplatform で、Android/iOSの環境で Admob のバナー広告を表示する方法を解説します。<a class="post-item-more nx-ml-2" href="/posts/compose_multiplatform_admob_banner/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-06-02T15:00:00.000Z">Mon Jun 03 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/kotlin_multiplatform_recommended_libs/">Kotlin Multiplatform (KMP) の使い方やお勧めのライブラリの紹介</a></h3><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-05-24T15:00:00.000Z">Sat May 25 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/ktor_okio_download_file/">
7ktor と okio を使って大きなファイルをダウンロードする</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">大きなファイルをダウンロードする場合、ファイルの内容をすべてメモリに展開してしまうと、OutOfMemoryError が発生してしまいます。<a class="post-item-more nx-ml-2" href="/posts/ktor_okio_download_file/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2024-05-09T15:00:00.000Z">Fri May 10 2024</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/ump_sdk_reject/">Googleの User Messaging Platform (UMP) SDK でGDPRに対応したら、AppStoreの審査でリジェクトされた</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">ようするに、ATTメッセージを表示する前に、同意を促すようなメッセージ(ここではGDPRメッセージ)を表示してはいけないようです。<a class="post-item-more nx-ml-2" href="/posts/ump_sdk_reject/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-12-21T15:00:00.000Z">Fri Dec 22 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/jetpack_compose_shared_storage_document/">JetpackCompose から 共有ストレージのファイルにアクセスする</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">1. ユーザにフォルダーを選択させ、そこにファイルを作成する。2. ユーザにファイルを選択させ、その内容を読み取る<a class="post-item-more nx-ml-2" href="/posts/jetpack_compose_shared_storage_document/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-08-17T15:00:00.000Z">Fri Aug 18 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/swiftui_document_picker/">SwiftUI から UIDocumentPickerViewController を呼び出す</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">1. ユーザにフォルダーを選択させ、そこにファイルを作成する。2. ユーザにファイルを選択させ、その内容を読み取る<a class="post-item-more nx-ml-2" href="/posts/swiftui_document_picker/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-08-17T15:00:00.000Z">Fri Aug 18 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/swiftui_textfield_in_sheet/">SwiftUIのTextFieldに入力した1文字目が変換対象にならない問題とその対処法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">TextField に日本語入力キーボードで文字を入力すると、1 文字目が変換対象にならないことがあります。例えば、キーボードで「a」「u」と入力すると、1文字目の「あ」が変換対象になりません。<a class="post-item-more nx-ml-2" href="/posts/swiftui_textfield_in_sheet/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-03-12T15:00:00.000Z">Mon Mar 13 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/admob_native_ad_android/">AdMobのネイティブ広告をJetpack Composeで表示し、プリロード対応する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Google Mobile Ads SDK は Jetpack Compose に対応していないので、広告のレイアウトは従来の xml で組む必要があります。また、広告表示のタイムラグをなくすためには、広告を事前に取得(プリロード)するのが有効です。<a class="post-item-more nx-ml-2" href="/posts/admob_native_ad_android/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-02-17T15:00:00.000Z">Sat Feb 18 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/kotlin_native_string_replace_bug/">Kotlin/Nativeの String.replace のバグを回避する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Kotlin/Nativeの String.replace を使うとiOSでバグが発生します。それを回避する方法を説明します<a class="post-item-more nx-ml-2" href="/posts/kotlin_native_string_replace_bug/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-02-13T
715:00:00.000Z">Tue Feb 14 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/ios_share_extension/">iOS の Share Extensionで Safari からアプリを開く</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">iOS アプリに Share Extension を導入し、Safari からアプリを開く方法を説明します。<a class="post-item-more nx-ml-2" href="/posts/ios_share_extension/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-02-08T15:00:00.000Z">Thu Feb 09 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/create_android_aab_by_command_line/">Androidのリリース用App Bundle(.aab)をコマンドラインから生成する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Android アプリのリリース時に AppBundle(.aab)を作成する必要があります。GUI から行うと面倒なので、コマンドラインから AppBundle を作成する方法をまとめました。<a class="post-item-more nx-ml-2" href="/posts/create_android_aab_by_command_line/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-01-12T15:00:00.000Z">Fri Jan 13 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/admob_adaptive_banner/">AdMobのアダプティブバナーをJetpack ComposeとSwiftUIで使用する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">ライブラリには Jetpack Compose や SwiftUI 用のアダプティブバナーは用意されていないので、使用するには一工夫必要になります。<a class="post-item-more nx-ml-2" href="/posts/admob_adaptive_banner/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-01-11T15:00:00.000Z">Thu Jan 12 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/get_csr_html_multiplatform/">CSRのHTMLをAndroidとiOSで取得する方法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">CSR(クライアントサイドレンダリング)で生成されるHTMLを取得する方法です<a class="post-item-more nx-ml-2" href="/posts/get_csr_html_multiplatform/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2023-01-01T15:00:00.000Z">Mon Jan 02 2023</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/ios_background_process/">iOSアプリがバックグラウンド状態の時に処理を継続する方法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">iOSアプリでバックグラウンド中に処理を継続する方法を調べ、実現可能だった方法と不可だった方法に分類しました。<a class="post-item-more nx-ml-2" href="/posts/ios_background_process/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-10-08T15:00:00.000Z">Sun Oct 09 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/flutter_ios_install_error/">FlutterでビルドしたipaファイルがTestFlightでインストールできない問題の解決法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">bundle identifierの末尾に .add を追加すると解決します。<a class="post-item-more nx-ml-2" href="/posts/flutter_ios_install_error/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-09-20T15:00:00.000Z">Wed Sep 21 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/nextjs_s3_cloudfront_dynamic_routes/">next.jsをS3+CloudFrontにデプロイした時に、Dynamic Routesを処理する方法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">pages/404.tsxの作成し、CloudFrontでカスタムエラーレスポンスを作成します<a class="post-item-more nx-ml-2" href="/posts/nextjs_s3_cloudfront_dynamic_routes/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-09-18T15:00:00.000Z">Mon Sep 19 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/flutter_exists_image/">
7Flutterで画像が存在するかどうかを画像をロードせずに調べる方法</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">画像の存在チェックをするコードを自動生成するスクリプトを作成します<a class="post-item-more nx-ml-2" href="/posts/flutter_exists_image/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-09-13T15:00:00.000Z">Wed Sep 14 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/flutter_font/">Flutterでカスタムフォントを導入して発音記号を表示する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Flutterのデフォルトのフォント(Roboto)で発音記号を表示しようとしたら文字化けしたのですが、カスタムフォントを導入することで解決できたので、その方法を紹介します。<a class="post-item-more nx-ml-2" href="/posts/flutter_font/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-09-10T15:00:00.000Z">Sun Sep 11 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/nextjs_portfolio/">next.jsでポートフォリオサイトを作ってS3にデプロイする</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">nextjs-portfolio-starterをベースにポートフォリオサイトを作成し、S3にデプロイする方法を説明します。<a class="post-item-more nx-ml-2" href="/posts/nextjs_portfolio/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-07-24T15:00:00.000Z">Mon Jul 25 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/moomoo_acm_dns/">ムームードメインでAWS Certificate Manager(ACM)のSSL証明書を取得する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">ムームードメインでドメインを取得し、AWS Certificate Manager(ACM)のSSL 証明書を取得する方法を説明します。<a class="post-item-more nx-ml-2" href="/posts/moomoo_acm_dns/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-07-23T15:00:00.000Z">Sun Jul 24 2022</time></div><div class="post-item"><h3><a class="!nx-no-underline" href="/posts/react_scroll_position_from_bottom/">Reactでスクロール可能な要素の下からのスクロールポジションを取得する</a></h3><p class="nx-mb-2 dark:nx-text-gray-400 nx-text-gray-600">Reactでスクロール可能な要素の下からのスクロールポジションを取得する方法です<a class="post-item-more nx-ml-2" href="/posts/react_scroll_position_from_bottom/">Read More →</a></p><time class="nx-text-sm dark:nx-text-gray-400 nx-text-gray-600" dateTime="2022-06-20T15:00:00.000Z">Tue Jun 21 2022</time></div><small style="display:block;margin-top:8rem" class="jsx-7c359fde634f3543"><time class="jsx-7c359fde634f3543">2026</time> © 品川アプリ.<a href="/feed.xml" class="jsx-7c359fde634f3543">RSS</a></small></article></div>
7<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/posts","query":{},"buildId":"0qF3qm-TO7UtrTZ9r5s6X","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script>
7</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.