日記

日本は iOS マジョリティ市場——iOS・Android 両対応が必要な理由

1 Mins read

日本は iOS マジョリティ市場——iOS・Android 両対応が必要な理由

アプリをリリースするとき「とりあえず Android から」「会社なので iOS だけ」と決めていないだろうか。世界規模で見ればそれでも成立するが、日本市場ではその判断がユーザーの 40〜60% を最初から捨てている

モバイル OS シェア:iOS vs Android(日本 vs 世界 2026年)

上のグラフが示すとおり、日本と世界では iOS/Android のシェアが完全に逆転している。

日本と世界、シェアの逆転

世界のモバイル OS シェアは Android が圧倒的多数を占める。StatCounter のデータ(2025年1月〜2026年3月)では Android 72.1%、iOS 27.6% と約 3:1 の差がある。インド・東南アジア・アフリカ等の低価格 Android 端末の普及が主な要因だ。

一方、日本は iOS 60.7%、Android 39.1%。iOS マジョリティの希少な市場の一つである。

地域 iOS Android
世界 27.6% 72.1%
日本 60.7% 39.1%
米国(参考) 約56% 約44%
英国(参考) 約52% 約48%

出典: StatCounter Global Stats(Jan 2025 – Mar 2026)/ 米・英は同期間の推計値

なぜ日本は iOS が多いのか

要因 内容
キャリア販売構成 NTTドコモ・au・ソフトバンクの主力端末として iPhone が長年店頭の中心にある
10〜30代の iPhone 比率 若年層ほど iPhone 比率が高く、LINE・TikTok 等の SNS 連携もその層が主導
「iPhone じゃないと仲間外れ」文化 iMessage や AirDrop を前提とした学校・職場コミュニケーションが定着している
企業支給端末 MDM 管理しやすさと企業向けセキュリティ評価から iPhone を採用する企業が多い

要因自体は根深く、短期間で覆るような変化は起きにくい。しばらくはこの構造が続きそう。

iOS だけ・Android だけ対応の損失試算

仮に日本向けアプリを iOS のみでリリースした場合、Android ユーザー約 39% にリーチできない。逆に Android のみであれば iOS ユーザー約 61% を逃す。

対応 OS 日本でリーチできるユーザー 取りこぼすユーザー
iOS のみ 60.7% 39.3%
Android のみ 39.1% 60.9%
iOS + Android 約 99.8% ほぼなし

業務系アプリ・BtoB ツール・社内システムでは「社員の一部がアクセスできない」は致命的になる。コンシューマー向けであっても、ストア評価や口コミの分断を招く。

どう動くか

ネイティブ実装を前提にする

両 OS 対応の手段として Flutter や React Native が話題に上がることは多いが、大きなプロジェクトではクロスプラットフォームのコストはかえって増える。各 OS の最新機能への追従、プラットフォーム固有のバグ対応、エンジニア採用という三点だけでも相当な重荷になる。ハリボテでいい期間限定キャンペーンアプリなら選択肢に入るかもしれないが、それ以外では iOS / Android それぞれのネイティブ実装が現実的な王道だ。

iOS 26 対応と Android 16 対応を並行して進める

2026年は両 OS にとって節目の年だ。

  • iOS 26: App Store Connect への提出に 2026年4月28日から Xcode 26 + iOS 26 SDK が必須(⚠️ 施行中)
  • Android 16: Google Play の targetSdkVersion 強制更新ロードマップで 2026年中に targetSdkVersion 36 への対応が求められる

「iOS 26 対応が終わったら Android」という直列スケジュールでは間に合わない。両プラットフォームのアップデートを並行管理するチームプロセスを作るほうが現実的。

各 OS の対応詳細は別記事で。

Read more
日記

iOS 26 対応を今すぐ終わらせる — 2026年4月28日から App Store の SDK 要件が変わる

1 Mins read

iOS 26 対応を今すぐ終わらせる — 2026年4月28日から App Store の SDK 要件が変わる

App Store Connect へのアップロードには、2026年4月28日以降 Xcode 26 および iOS 26 SDK でのビルドが必須になる。iOS 26 は 2025年9月にリリース済みで、WWDC25 発表の Liquid Glass デザインや Foundation Models framework を含む大型アップデートだ。続く iOS 27 は WWDC26(2026年6月8〜12日)で発表され、2026年9月リリース予定。この2バージョンを同時に見据えた対応順を書く。

App Store SDK 要件のスケジュール

Apple は毎年、App Store Connect への提出に必要な SDK バージョンを引き上げてくる。

施行日 必要な Xcode 必要な SDK 状態
2024年4月29日 Xcode 15 iOS 17 SDK 施行済み
2025年4月24日 Xcode 16 iOS 18 SDK 施行済み
2026年4月28日 Xcode 26 iOS 26 SDK ⚠️ 要対応
2027年(予定) Xcode 27 iOS 27 SDK WWDC26 後に正式発表

出典: <https://developer.apple.com/news/upcoming-requirements/>

iOS 26 SDK でビルドしないと、アプリアップデートを App Store Connect にアップロードできなくなる。新機能の話ではなく、既存ユーザーへの配信継続のための義務対応。

iOS 26 対応の優先順位

優先度 対応内容 理由
🔴 最高 Xcode 26 へのアップグレードとビルド確認 2026年4月28日の期限に直結
🔴 最高 TLS 1.0/1.1 接続先がある場合は 1.2 以上に移行 URLSession の最低 TLS が 1.2 に変更
🟠 高 UIScreen.mainScreen 使用箇所の置き換え iOS 26 SDK で deprecated に昇格
🟠 高 Push to Talk アプリの entitlement 確認 旧 entitlement が iOS 26 SDK で非対応に
🟡 中 Liquid Glass デザインへの適応 標準 UIKit/SwiftUI は自動適応するが独自 UI は要確認
🟡 中 CoreData の Ubiquitous キー使用確認 iOS 26 SDK でビルドエラーになる

ツールの足場をそろえる

iOS 26 対応でも iOS 27 先行検証でも、最初に詰まるのは OS の API より build 周りのことが多い。足場を先に固める。

ツール 推奨バージョン 備考
Xcode 26.4.1 以上 4月28日以降の提出に必須
Swift 6.0(Swift 5.x も引き続き対応) Swift 6 strict concurrency を推奨
SwiftUI iOS 26 SDK 同梱版 Liquid Glass 対応の新コンポーネント追加
iOS Deployment Target 16 以上を推奨 iOS 15 以下は市場シェアが急速に低下

Swift 6 モードへの移行で一番よく出るのは CoreData 周りの並行性エラー。NSManagedObject@MainActor 外から触ると警告が出るようになっているので、context.perform ブロックの中に閉じ込める形で直す。

actor DataProcessor {
    func process(context: NSManagedObjectContext) async {
        await context.perform {
            // CoreData 操作は context.perform 内で
        }
    }
}

iOS 26 で引っかかりやすい動作変更

TLS 最低バージョンの変更

iOS 26 SDK にリンクしたアプリでは URLSession と Network framework の TLS 最低バージョンが 1.0 から 1.2 に変更される。

社内システムや外部 API が古い TLS 設定のままだと、iOS 26 SDK でビルドしたアプリから通信できなくなる。

// 旧 TLS を許容する例(非推奨。やむを得ない場合の一時対処)
let config = URLSessionConfiguration.default
config.tlsMinimumSupportedProtocolVersion = .TLSv10 // 警告が出る
let session = URLSession(configuration: config)

本来は接続先サーバー側を TLS 1.2 以上に直すのが正しい対応。サードパーティ SDK 経由の通信も含めて確認しておくといい。

UIScreen.mainScreen の廃止

以前から非推奨だった UIScreen.mainScreen が iOS 26 SDK で deprecated に昇格した。マルチウィンドウ・iPadOS のシーン対応との互換性のため、画面サイズは UIWindowScene から取得する方式へ移行する。

// Before(非推奨)
let screenWidth = UIScreen.main.bounds.width

// After(推奨)
if let scene = UIApplication.shared.connectedScenes
    .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    let screenWidth = scene.screen.bounds.width
}

Push to Talk entitlement の変更

com.apple.developer.pushkit.unrestricted-voip.ptt entitlement が iOS 26 SDK では動作しなくなる。iOS 16 以降の Push to Talk framework への移行が必須。

CoreData の iCloud 同期キー削除

NSPersistentStoreUbiquitousContentNameKey など、10年以上前に deprecated になっていた iCloud ubiquitous 同期用キーが iOS 26 SDK でビルドエラーになる。移行先は NSPersistentCloudKitContainer(iOS 13〜)または SwiftData(iOS 17〜)。

Liquid Glass デザインへの適応

標準の UIKit / SwiftUI コンポーネント(ナビゲーションバー、タブバー、シートなど)は自動的に新デザインに適応する。独自描画のカスタム UI は、背景ブラー・グラスエフェクトとの重なりを実機で視覚確認したほうがいい。

iOS 27 先回り確認(WWDC26 は 2026年6月8〜12日)

WWDC26 は 2026年6月8〜12日。例年どおり初日に新 OS が発表されて Beta 1 が公開される。iOS 27 のリリースは 2026年9月の見込み。

確認すべき点 優先度 対応タイミング
iOS 26 SDK 対応を先に完了させてから iOS 27 Beta 検証を開始する 🔴 最高 2026年4月28日まで
Foundation Models framework(オンデバイス LLM)の採用可否を社内で検討 🟡 中 WWDC26 以降
Declared Age Range API の対応要否(青少年向けコンテンツがある場合) 🟡 中 WWDC26 以降
App Intents の拡張(Siri・Spotlight 連携の深化) 🟡 中 WWDC26 以降
Liquid Glass 適応の完成度を iOS 27 デザイン変更に照らして再確認 🟡 中 WWDC26 以降

iOS 26・27 同時対応のテスト優先度

機能カテゴリ iOS 26 確認項目 iOS 27 beta 確認項目
ネットワーク通信 TLS 1.2 未満接続の洗い出しと修正 接続先 API の新セキュリティ要件対応
レイアウト・UI Liquid Glass と重なるカスタムビューの視覚確認 新デザインガイドライン変更の反映
データ永続化 CoreData ubiquitous キー使用有無の確認 SwiftData / CloudKit 移行の完了確認
Push 通知 APNs 証明書・Push to Talk entitlement の確認 通知 UI の iOS 27 表示崩れ確認
画面サイズ UIScreen.main 置き換えによるレイアウト変化の確認 iPadOS マルチウィンドウ対応の完全性確認
サードパーティ SDK iOS 26 対応済みバージョンへの更新 iOS 27 beta 対応の各 SDK バージョン確認

日本の業務アプリで引っかかりやすいところ

リスク項目 内容 対処方針
社内 VPN のレガシー暗号アルゴリズム DES/3DES/SHA1-96/SHA1-160 が IKEv2 VPN で非対応に。NetworkExtension 経由の VPN アプリは要確認 AES-256/SHA-256 + DH group 14以上に更新
イントラネット通信の TLS バージョン 古い社内 Web サービスや勤怠・経費精算システムが TLS 1.0/1.1 のまま残っている可能性 社内サーバー側の TLS 設定を先行して棚卸し
和暦・日本語入力の挙動変化 TextKit 2 の自然テキスト方向処理が変更された。iOS 26 SDK でビルドすると日本語テキストの方向解決ロジックが変わる場合がある 縦書き・日本語混在テキスト表示を実機確認
Apple Intelligence の公開範囲 Foundation Models framework は Apple Intelligence 対応デバイスのみで動作。日本語対応の一部機能は段階的展開 デバイス非対応時の fallback 実装を確認
社内 MDM・デバイス管理 Xcode 26 ビルドのアプリが MDM プロファイル下で正常動作するか確認が必要 社内配布環境でのテストフライト配布を IT 部門と連携して早めに実施

上げる前に見るところ

まず古い API を雑にでも洗うのが早い。

grep -R "UIScreen\.main\b\|unrestricted-voip\.ptt\|UbiquitousContentName\|UbiquitousContentURL" ./

TLS 周りも同様に引っかけておくと見落としが減る。

grep -R "TLSv10\|TLSv11\|tlsMinimumSupported\|kCFStreamSSLLevel" ./
Read more
パソコンのこと

Android 16対応とAndroid 17先回り確認

1 Mins read

Android 16対応とAndroid 17先回り確認

結論から言うと、targetSdkVersion を Google Play の要件より低いままアップデートを提出すると、アップロードの時点で拒否される。 ストアに更新を出せなくなるという意味だ。新機能の話ではなく、既存ユーザーへの配信継続とストア掲載維持のための義務対応である。

Google Play は毎年8月31日に targetSdkVersion の最低ラインを1段引き上げてきた。現行(2025年8月〜)では API 35(Android 15)未満のアップデートがすべて拒否される。

施行時期 要件 未対応の場合
2023年8月〜 API 33(Android 13)以上必須 アップロード拒否
2024年8月〜 API 34(Android 14)以上必須 アップロード拒否
2025年8月〜 API 35(Android 15)以上必須 アップロード拒否
2026年8月頃(予測) API 36(Android 16)以上必須 アップロード拒否

(出典:Google Play 対象 API レベル要件

このペースから API 36(Android 16)の強制化は 2026年8月頃が有力視されている。強制化される前に対応を完了させるため、2026年06月を社内の締め切りとして逆算したのがこの記事のスコープだ。Android 17 は Beta 3 で platform stability に到達しているので、同時期に別レーンで先回り確認を回しておくと正式版が来たときに慌てずに済む。

優先順位の整理

項目 期限 優先度 いまやること
targetSdkVersion 36(Android 16)対応 2026年06月まで 最優先 主要導線の回帰、CI 固定、リリース計画確定
Android 17 Beta 3 検証 今から前倒し 高・別レーン emulator と実機で互換性確認、behavior changes 棚卸し
Android 17 新機能採用 正式版以降 低め 影響範囲が小さい箇所から PoC

ツールの足場を先にそろえる

Android 16 対応でも Android 17 先行検証でも、最初に詰まるのは OS の API より build 周りのことが多い。足場を先に固める。

要素 基準 理由
Android Studio Panda 3 stable targetSdkVersion 36 対応の作業足場として安定している
AGP 9.1.0 R8 挙動差・lint 差分を吸収しやすい
JDK 17 AGP 9.1 の前提
Kotlin 2.3.20 安定版の基準をそろえる
plugins {
    id("com.android.application") version "9.1.0" apply false
    id("org.jetbrains.kotlin.android") version "2.3.20" apply false
}

CI の JDK 17 固定・AGP 更新・R8 差分の吸収は、Android 17 の準備を兼ねつつ Android 16 対応を通すための整地でもある。

補足:現場の Kotlin バージョン実態と移行コスト

表の「Kotlin 2.3.20」はあくまで推奨基準。実際の現場では 1.9.x 系がまだ多く残っている。日本の金融・公共・大規模案件は特に保守的で、「安定しているから上げない」判断が長く続きやすい。

下図は JetBrains の公開エコシステムデータおよびコミュニティ観察にもとづく 2026年初時点の推計

現場の Kotlin バージョン分布(2026年初・推計)

(推計値。正確な版別シェアは JetBrains Developer Ecosystem Survey の最新版を参照)

1.9.x から 2.x に上げる場合、Kotlin 単体ではなく Compose・Coroutines・AGP の一括更新になることが多い。K2 コンパイラへの切り替えで型推論の挙動が一部変わり、ビルドエラーが出るケースがある。「今の 1.9.x で動いているアプリを今すぐ上げる必要はない」という判断も現実的な選択肢。

現在の Kotlin Compose Compiler 方式 最低 AGP 升格時の主な注意
1.9.x 従来の compose_compiler_extension_version 8.x 現状維持可。ただし EOL 近い
2.0.x Compose Compiler Plugin(Kotlin plugin に統合) 8.4 以上 Plugin 方式への切り替え必須
2.1.x 同上 8.7 以上 K2 デフォルト化。Compose の安定度最良
2.3.x 同上 9.0 以上 2026年現在の最前線。AGP 9.1 前提

Android 17 で先に押さえたい動作変更

新機能より動作変更のほうが既存アプリへの影響が大きい。全アプリに効く変更に絞って先に確認する。

変更点 影響を受けやすいアプリ 先に確認するところ
usesCleartextTraffic 非推奨化の流れ HTTP を許可しているアプリ全般 検証環境・社内接続を network security config へ切り替え
URI 権限の暗黙付与廃止方向 共有・カメラ・添付ファイル渡しがあるアプリ 明示的な権限付与に書き直し
IME 可視性(回転後)の挙動変化 入力フォームを持つすべての画面 ログイン・申込・検索導線で回帰確認
バックグラウンドオーディオ制約強化 再生・通話・音声通知系アプリ フォアグラウンドサービス移行の要否確認

Android 16 ・17 同時対応のテスト優先度

Android 16 対応と Android 17 先行検証を並行するとき、「どちらの検証に何を必ず遭すべきか」が曖昧になりやすい。下表は「対応済みと見なせる条件」を紏展できるよう、テスト領域ごとの必須・優先度を定義する自分たちの QA 制御記刻として使う。

テスト領域 Android 16 本番 Android 17 先行
ログイン・会員導線 必須 必須
WebView 画面 必須 必須
push / 通知復帰 必須 優先
バックグラウンド処理 必須 優先
MDM / 企業端末制約 優先 優先
Android 16/17 の新機能採用(予測変換・Compose 新 API 等) 後回しでよい 余力があれば

日本の業務アプリに固有のリスク

海外発信の一般的な Android 対応記事ではほぼ触れられないが、日本の金融・公共・会員基盤系アプリには固有の引っかかりどころがある。「Android 16/17 が追加した新機能(通知チャネル変更・権限モデル刷新・Compose 新コンポーネント等)を積極的に取り込む」より「ログイン・決済・通知など既存の主要な画面フローが壊れていないか」を先に確認するプロジェクトは、下表の項目をチェックリストにして先に回すこと。

論点 詰まる理由 先にやる確認
WebView 会員・申込・決済導線でまだ多い 認証、Cookie、リダイレクト、表示崩れ
証明書・企業 Wi-Fi 社内・業務端末で詰まりやすい 通信失敗、証明書更新、社内 NW 動作
MDM 制約 企業配布アプリで影響大 権限、バックグラウンド、配布制御
push / バックグラウンド 会員・金融・運用通知に直結 復帰、遅延、強化後の動作確認
端末更改タイミング 利用者の OS バラつきが大きい 対応 OS 範囲、QA 端末計画の見直し

今やるならこの順番

  1. targetSdkVersion 36(Android 16)を含んだ更新を 2026年06月までにリリースする前提でリリース計画を確定する
  2. Android Studio・AGP・Kotlin・JDK の足場をそろえる
  3. Android 16 の主要導線テストと回帰を先に通す
  4. 並行で Android 17 専用ブランチを切って emulator と実機の検証レーンを立ち上げる
  5. behavior changes を security / media / connectivity から順に確認する
  6. targetSdk 37 を上げた CI を別で回す
Read more
パソコンのこと

Java 26 は入れるべき? 良さそうな点と注意点を現場向けに整理

1 Mins read

Java 26 が 2026/03/17 に GA。

今回も preview 系は多いんだけど、HTTP/3、G1 GC、仮想スレッドまわりなど、地味に効きそうな変更が結構ある。

逆に、古い API や昔の JVM フラグをそのまま抱えてる環境だと、上げた時に引っかかりそうな点も見えてきた。

特に Java 8 からだと差分が大きいので、Java 26 の新機能だけ見るより、どこでハマるかを先に見たほうがいい感じ。

ざっくり図

Java 8 から Java 26 への移行フロー
Java 8 から Java 26 へ上げる前に、まず LTS で中間整理を入れる流れ

Java 8 運用中
	|
	+-- 古い API / ライブラリ棚卸し
	|      - javax.xml.bind
	|      - Thread.stop
	|      - sun.*
	|      - 古い JVM フラグ
	|
	+-- まずは LTS で検証
	|      - Java 17 か 21 で一度テスト
	|
	+-- その後 Java 26 の差分確認
			 - HTTP/3
			 - G1 改善
			 - 仮想スレッド周辺
			 - セキュリティ既定値の変化

良さそうな点

java.net.http.HttpClient が HTTP/3 対応になった。

アプリ側のコードを大きく変えずに、HTTP/3 が使える余地が広がるのは素直に便利そう。

あとは G1 GC の同期削減、巨大オブジェクト回収の改善、AOT Object Cache の Any GC 対応など、性能系の修正がわりと堅い。

仮想スレッドも、クラス初期化待ちで carrier thread を握りっぱなしにしにくくなってるので、変な詰まり方を減らせそう。

地味にうれしいのはこのへん。

  • ProcessAutoCloseable 対応
  • UUID.ofEpochMillis() が追加されて UUIDv7 系の扱いがしやすい
  • ByteOrder が enum 化されて switch で扱いやすい

例えば HTTP Client は、こんな感じでコードの見た目を大きく変えずに恩恵を受けやすい。

var client = HttpClient.newBuilder()
	.version(HttpClient.Version.HTTP_3)
	.build();

var request = HttpRequest.newBuilder()
	.uri(URI.create("https://example.com/api/status"))
	.GET()
	.build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());

それと ProcessAutoCloseable になったので、外部コマンド実行の後始末も少し素直になる。

try (var process = new ProcessBuilder("java", "-version").start()) {
	var exitCode = process.waitFor();
	System.out.println("exit=" + exitCode);
}

注意したい点

まず Thread.stop() は削除済み。

昔の保守コードに残っていると、JDK 26 ではもうコンパイル段階で止まる。

Applet API も削除されているので、古い資料やサンプルをそのまま引っ張っている環境は当然ながら要注意。

それと、JVM フラグ整理も進んでいて、-XmaxjitcodesizeMaxRAMAggressiveHeap あたりを惰性で使っていると見直し対象になる。

RMI over TLS は endpoint identification が既定で効くので、証明書の SAN が雑な環境は通信失敗が出るかもしれない。

HttpRequest.Builder.timeout() がレスポンス本文受信まで含むようになった点も、既存の timeout 設計次第では体感差が出そう。

あと Java 8 のまま長く運用していた環境は、Java 26 へ一気に上げる前に、新旧対比でこのへんを意識したほうがいい。

  • Java 8 は classpath 前提で動いていたが、Java 9 以降のモジュール境界や内部 API 依存が表に出やすい
  • Java 11 で Java EE / CORBA 系モジュールが削除されているので、javax.xml.bind などが残っていると別途対応が要る
  • 反射やセキュリティ既定値が厳しくなっていて、昔は動いていたコードが警告や失敗になることがある
  • 古い TLS 設定、keystore、RMI 通信は上げた直後に事故りやすい

それと日本の業務システムだと、文字コードも地味に本丸。

特に銀行系や基幹系は、バックオフィスやホスト連携でいまだに Shift_JIS 系が前提のことがある。

ここで雑に「今どき UTF-8 でしょ」と寄せると、画面は動くのに帳票や外部連携だけ文字化け、みたいな嫌な事故が起きやすい。

Java 8 の時代は、Windows 上でたまたま default charset が windows-31j になっていて動いていたコードが結構ある。

でも JDK 18 以降は default charset が UTF-8 基本になっているので、new String(bytes)FileReader のような「暗黙の文字コード頼み」は、そのまま持っていくと差分になりやすい。

さらに実務では Shift_JISwindows-31j を同一視しすぎないほうがいい。

Java の charset 一覧上はどちらも使えるけど、windows-31j / MS932 は Windows 系拡張を含むので、丸数字、環境依存文字、IBM/NEC 拡張の扱いで期待値がズレることがある。

銀行系のファイル授受やホスト接続だと、相手が求めているのは「Shift_JIS と言いながら実質 CP932」なのか、「本当に Shift_JIS の範囲だけ」なのか、あるいは IBM 系ホストコードまで含むのかを先に確認したほうが安全。

日本語周りで見るなら、このへんは移行前チェックに入れておいたほうがいい。

  • バイト列変換で charset を明示しているか
  • Shift_JISwindows-31j を混同していないか
  • 丸数字、波ダッシュ、全角チルダ、機種依存文字、外字の round-trip を確認したか
  • 帳票 CSV、固定長ファイル、ホスト送受信の文字単位とバイト単位を取り違えていないか
  • 置換文字で握りつぶさず、変換不能文字を検知できるか

なので、Java 8 からなら「いきなり 26 本番」より、まず 17 か 21 の LTS でビルドとテストを通して、そこで古い依存を削ってから 26 を見るほうが現実的。

Java 26 自体は面白いんだけど、Java 8 からの差分を吸収する作業のほうが実務では重いはず。

上げる前に見るところ

まずは古い API とフラグを雑にでも洗うのが早い。

grep -R "Thread\.stop\|Xmaxjitcodesize\|AggressiveHeap\|MaxRAM" ./

Java 8 由来の依存もまとめて見たいなら、これも追加で流しておくと良さそう。

grep -R "javax\.xml\.bind\|javax\.activation\|CORBA\|sun\." ./

文字コード前提を雑に洗うなら、このへんも引っかけておくと見落としが減る。

grep -R "Shift_JIS\|MS932\|windows-31j\|Cp943\|Cp930\|EBCDIC\|file.encoding" ./

Java 側でも、暗黙の default charset に乗らず、変換不能文字を検知する書き方に寄せたほうが事故りにくい。

var charset = Charset.forName("windows-31j");
var encoder = charset.newEncoder()
	.onMalformedInput(CodingErrorAction.REPORT)
	.onUnmappableCharacter(CodingErrorAction.REPORT);

var bytes = encoder.encode(CharBuffer.wrap("顧客コード①"));
System.out.println(bytes.remaining());

ざっくり比較するとこんな感じ。

  • Java 8 から見た Java 26: 差分が大きいので移行案件
  • Java 17 から見た Java 26: 新機能評価と既定値差分の確認が中心
  • Java 21 から見た Java 26: 追従コストは比較的軽め

もう少し実務寄りに並べるとこう。

観点 Java 8 Java 17 Java 21 Java 26
現場での立ち位置 古い基盤がまだ多い まず移行先として堅い いまの主力候補 先行評価と追従候補
移行難易度 ここから上げるのが重い 8 からの受け皿にしやすい 17 からなら延長しやすい 21 以降からなら比較的軽い
気にする点 Java EE 系削除、内部 API 依存 反射や module 境界 仮想スレッド導入判断 HTTP/3、GC改善、既定値差分
向いている進め方 まず棚卸し 先に CI を通す 本番標準化しやすい 検証環境で差分確認

Java 8 の案件だと、Java 26 の新機能に目が行く前に、まず Java 8 時代の負債をどう剥がすかのほうが本題になりやすい。

逆にすでに Java 17 や 21 にいるなら、Java 26 は「全面移行」というより、性能改善や既定値変更をどう取り込むかを見るフェーズだと思う。

あとはこのあたりを CI で確認しておくと安心。

  • HttpClient の timeout やヘッダまわり
  • 証明書検証が絡む RMI / TLS 通信
  • jlink を使ったランタイム作成
  • XML Signature や古い keystore 依存
  • Shift_JIS / windows-31j / ホスト連携ファイルの round-trip テスト

preview / incubator 機能は面白いんだけど、本番投入というよりは評価用として見たほうがまだ自然かなという印象。

まとめ

Java 26 は派手な一撃というより、性能、標準 API、運用上の安全側変更が積まれている感じ。

普通の業務システムだと、HTTP/3、GC、仮想スレッド改善あたりは前向き。

一方で、古いコードや古い運用フラグが残っている現場ほど、先に棚卸ししてから上げたほうが事故は少なそう。

日本語環境なら、特に文字コードは後回しにしないほうがいい。

Shift_JIS 系やホスト連携が残っている現場では、Java 26 の良さを評価する前に、default charset 依存と日本語 round-trip をつぶすほうが優先度が高いはず。

特に Java 8 からなら、先に 17 か 21 で中間整理を入れて、そのうえで Java 26 の恩恵を取りに行くほうが筋が良さそう。

Read more
LinuxPHPWordpressパソコンのこと

Wordpress "mixed content the page at ' url ' was loaded over https" nginx reverse proxy

1 Mins read

Nginx のリバースプロキシ環境において、フロントエンドの Nginx が 443 (HTTPS) でリクエストを受け付け、内部では 80 (HTTP) でラウンドロビン方式の負荷分散を行っている場合、Chrome で Mixed Content エラー が発生することがあります。

この問題を解決するために、wp-config.php の冒頭に以下の設定を追加すると効果的です。

/** mixed content the page at ' url ' was loaded over https wordpress nginx */
/** プロキシ設定の場合、httpsでリダイレクトするように設定が必要! */
/** HTTP_X_FORWARDED_FOR の環境変数名はAWSなどお使いのサーバー環境により若干変更されている時があるので要確認すること */
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['HTTPS'] = 'on';
}

内部では 80 (HTTP)側の nginx.conf ファイルを操作できる方は、以下の設定でも対応可能です。

どちらかお好みでOK

location ~ \.php$ {
    include fastcgi_params;

    # mixed content the page at ' url ' was loaded over https wordpress nginx
    # プロキシ設定の場合、httpsでリダイレクトするように設定が必要!ここから
    fastcgi_param HTTPS on;
    fastcgi_param HTTP_X_FORWARDED_PROTO https;
    # ここまで

    fastcgi_intercept_errors on;
    fastcgi_pass php-fpm;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Read more