MySQLのutf8mb4とUTF-16のサロゲートペア

【機能概要】
MySQL utf8mb4
 utf8は過去の歴史的経緯から1文字を表すための文字列長が1~3バイトの時代から1~4バイトになっている。(※1)
 MySQLもutf8は1~3バイトのutf-8しか保存できないため、4バイトになる様な文字コードを格納する場合は、utf8mb4にする必要がある。
 なお、MySQL8.0では、デフォルトはuft8mb4である。

UTF-16サロゲートペア
 UTF-16において2バイトで表現できない文字を4バイトで表すためのコード体系

※1
過去2バイトであったとか、5バイト/6バイト問題は一旦忘れる。
詳しくは、ユニコード戦記とかを読んでもらえれば。。


【本題】
日本語を扱う人にとっては、漢字が間違いなくこの狭間に埋もれてしまう。
そのため、utf8mb4なデータベースにしていても、サロゲートペアな実装してなかったら(Javaは基本lengthで文字数数える実装がどこかに存在するやろから基本アウトやろが)対応ができない。
とはいえ、対応できない文字がどこまで異なるのか?という記載について言及ある記事がなかったので調査を行ってみた。

utf-8の各バイト単位の下限と上限値

バイト数 下限 上限 unicode下限 unicode上限
1バイト 00 7F U+0000 U+007F
2バイト C280 DFBF U+0080 U+07FF
3バイト E0A080 EFBFBF U+0800 U+FFFF
4バイト F0908080 F7BFBFBF U+10000 U+10FFFF

utf-16の通常文字とサロゲート文字の下限と上限値

バイト数 下限 上限 unicode下限 unicode上限
2バイト 0000 FFFF U+0000 U+FFFF
4バイト D800DC00 DBFFDFFF U+10000 U+1FFFFF

結果、utf8mb4はutf-8の4バイト目を扱うための文字コードサロゲートペアはutf-16の4バイトを扱うための仕様であり、unicodeの値を照らし合わせる限り同じ範囲を扱う事が分かった。
そのため、拡張性や文字コード以外の事を考慮しないでいいのであれば、サロゲートペア対応行えていないプログラムは、実はutf8mb4でなくても問題ないようである。

(参考リンク)
Unicodeがどんな風にUTF-8に割当てられているか - 備忘帳 - オレンジ工房
UTF-8の文字コード表 - 備忘帳 - オレンジ工房
Unicode
Unicode文字ツール

【その他】
・3バイト文字までがUnicodeでは、第0面と呼び、4バイト文字は現在第1面~第16面として定義されている。
 但し、第4面~第13面は現時点では未定義
https://ja.wikipedia.org/w/index.php?title=Unicode§ion=10#%E9%9D%A2

・内部実装も色々苦労がある模様…

現在のOracle Databaseでも、CESU-8を「UTF8」として、「普通のUTF-8」を「AL32UTF8」として扱っているため注意を要する。MySQLでも「utf8」を指定した場合は4オクテット列が扱えず、CESU-8相当の符号化を必要とする(4オクテット列対応のUTF-8は「utf8mb4」として別途定義されているが、MySQL 5.5.3以降でないと使用できない[9])。

(wikipedia UTF-8 サロゲートペアの扱い より抜粋)
UTF-8 - Wikipedia

・CESU-8
UTF-8黒歴史の一つっぽい。
Unicode 暗黒面

Javaの内部エンコーディングがUTF-16BEと記載されている箇所
 正確にはUTF-16とまでしか書かれておらず、UTF-16BE[ビック・エンディアン]と書かれている箇所が見つけれなかった。VMの仕様のどこかに記載ある模様(Streamクラス当たりしか見つけれなかった)
Charset (Java SE 11 & JDK 11 )

ユニコード戦記 ─文字符号の国際標準化バトル

ユニコード戦記 ─文字符号の国際標準化バトル

  • 作者:小林龍生
  • 発売日: 2011/06/10
  • メディア: 単行本

IE11 / Edge のEOL

●前提
・2020年6月を起点とした場合は、Windows10を対象に調査する。(サーバーOSは顧客が気にするところではないので除外、8.1は担当顧客が既に7 → 10に移行したため存在自体無かった事にする)
・Windows10にはEnterprise LTSC[※1](旧LTSB)も存在するが、一旦無視する。(自身の担当顧客では出くわした事がないため)

※1 Windows10 Enterprise LTSC
docs.microsoft.com


●IE11
(結論)
2025年10月14日(?)

(調査方法)
製品のライフサイクルの検索にてIE11を検索
https://support.microsoft.com/ja-jp/lifecycle/search?alpha=Internet%20Explorer%2011

注意書きに従い、ライフサイクルに関する FAQ - Internet Explorer および Edgeを確認
しかしながら、当資料内には明確な日付が未記載
ライフサイクルに関する FAQ - Internet Explorer および Edge | Microsoft Docs

1次ソースから明確な日付は追い求めるのは困難だったが、2次ソースとして記載を発見
www.atmarkit.co.jp

裏付け資料としては、やはりIE11直接な記載はなく、OSのサポート期間に依存する模様
結果、再度製品のライフサイクルの検索にてWindows10を調査した結果、延長サポートが2025年10月14日と明記が有ったため一旦結論づけた。
https://support.microsoft.com/ja-jp/lifecycle/search?alpha=windows%2010


●Edge(EdgeHTML版)
(結論)
2025年10月14日(??)

(調査方法)
製品のライフサイクルの検索にてEdgeを検索
リリース日が2020/01/15と既に当検索では相手にしてくれない
https://support.microsoft.com/ja-jp/lifecycle/search?alpha=Edge

Microsoft Edgeのライフサイクルという記事はあったが、Chronium版しか記載無し
docs.microsoft.com

MSのサイトにも以下の記事以外で最新情報を当ブログを記載した時点では見たことが無い
the-board.jp

redditでも話題になっているものの分からないという結論が3カ月前
Edge legacy end of life? : microsoft

こちらに関しては、2次ソースすら存在しない。
そのため、Edge HTML版に関しても、Windows10のサポート期間を頼りにするのが一番信憑性が高そう。
https://support.microsoft.com/ja-jp/lifecycle/search?alpha=windows%2010


●Edge(Chronium版)
(結論)
モダン ライフサイクル ポリシーに準ずる → 何かをトリガーに少なくとも 12 か月前に通知

(調査方法)
こちらのサイトを確認したら、モダンライフサイクルポリシーが適用されるとの記載有
docs.microsoft.com

モダン ライフサイクルポリシーとはなんぞや?と調べたら、以下の様な記載があった。

モダン ライフサイクル ポリシーが適用される製品では、Microsoft は、無料の製品やサービスまたはプレビュー リリースを除き、後継の製品またはサービスを提供せずにサポートを終了する場合、少なくとも 12 か月前に通知します。

モダン ライフサイクル ポリシー | Microsoft Docs


●その他
・Windows10なら単純に2025年10月14日ではなく、Windows10のどのパッチが当たっているかも影響する。
"Windows ライフサイクルのファクト シート".Windowsサポート
https://support.microsoft.com/ja-jp/help/13853/windows-lifecycle-fact-sheet

・新型コロナの影響により、上記期間に関しては、今後延長される可能性はあるため、都度ウォッチはしておいた方が良い。
但し、基本伸びない前提で動いた方が良い(猶予期間がたまたま伸びた位で考えておくべき)。
docs.microsoft.com
新Edgeブラウザ、「確定申告の影響」で日本向け配信は4月以降に。ダウンロードは可能 - Engadget 日本版

Wikipediaには以下の様な記載もあるため、上記内容はあくまでも解釈の一種であり、正当な解は誰も知る由はないというのが正直なところか。

Windows 10には互換性維持のためにInternet Explorer 11が引き続きバンドルされている。Windows 10はサポートポリシーがこれまでより大きく変更され、アップデートを続ける限り半永久的な使用が可能である。したがってこれまでのサポートポリシーをそのまま適用するならば、Internet Explorer 11がバンドルされ続ける限りは半永久的にサポートが継続されることを意味するため、Internet Explorerの完全なサポート終了およびEdgeへの正式移行の時期は不明である。
Windows 10 Enterprise 2015 LTSB のサポート期限の2025年10月14日までという話も合ったが[40]、2018年7月現在、マイクロソフトは明言を避けている

Internet Explorer - Wikipedia

・IE11は危険という記事はそのまま日本語記事を解釈したら危険かも。
とはいえ、古いのであまり使いたくないという気持ちは正直なところ。。。
www.atmarkit.co.jp

P14 処理内容を想像できるより狭い英単語

●getの置き換え候補

英単語 想像できる意味
load ファイルなどの読み込みをする
fetch/retrieve 外部(APIなど)からデータを取得する
search 何らかの検索処理(IDでの取得でなく、条件での取得)が発生する
calc 副作用(外部へのアクセスや読み込み、I/O)なしに計算だけする
increase 値を加算する
decrease 値を減算する
merge 2つのデータを合わせて1つのデータにする
render 文字列や画像を処理して描画する
filter 複数のデータから要素を取り込む
aggregate 複数の情報から集計・計算する
build/constract 何らかの情報から文字列やオブジェクトを生成する
escapse/sanitize 文字列をエスケープ/サニタイズ処理する

●saveの置き換え候補

英単語 想像できる意味
dump あるデータソースから別のファイルなどにデータをまとめて保存する
create 更新でなく新規作成する
update 新規作成でなく更新をする
patch 部分的に情報を更新する
remove/delete 削除する
sync 作成、更新、削除を行って2つのデータソースの値を同じにする
memoize モリー上に一時的に記録する
publish 隠されていた情報を外部に公開する

●ほかにおすすめの英単語

英単語 想像できる意味
notify 外部のサービスやオブジェクト間での通知をする
flatten 階層構造を持つオブジェクトを1階層にする
minimize 値を最小化する
validate/verify 値が正しいかを確認、検証する(checkより意味が狭い)

但し、狭い意味の英単語を意識しすぎて、難しすぎる英単語を無理に使わない方が良い。
また、プログラマー向けの英単語を知るサービスや本なども発売されている。
codic - プログラマーのためのネーミング辞書

ITエンジニアが覚えておきたい英語動詞30

ITエンジニアが覚えておきたい英語動詞30

dnfのコマンド打つ際によく忘れるやつ

本当はまだyumしか使ってないけど、その内すぐdnfになるであろうからそちらで確認

●対象パッケージの入手可能なバージョン一覧の表示

dnf search --showduplicates <パッケージ名>

●対象パッケージのバージョン指定を行ったインストール

dnf install -y <パッケージ名>

●インストール済みの対象パッケージの依存情報を表示

dnf deplist <パッケージ名> --installed

【参考リンク】
www.atmarkit.co.jp

CentOS8 実践ガイド [システム管理編] (impress top gear)

CentOS8 実践ガイド [システム管理編] (impress top gear)

  • 作者:古賀政純
  • 発売日: 2020/03/13
  • メディア: 単行本(ソフトカバー)

Mouse Without Borders

LAN上のパソコンを一つのマウスとキーボードで操作するソフトです。
Microsoftの公式サイトからダウンロードできる
昔から存在はしっていたものの、あまり自宅で作業する事が少なかったのと、開発自体が止まっているのかと思いインストールするのを躊躇していた。
しかし、やはり使ってみたら超便利でした。
私はデスクトップもThinkPadキーボードを使っているので、手を放さずに視線だけ変えれば別マシンが使えるというのはとても助かる。
インストール方法などの説明は以下のブログが非常に丁寧に解説されていた。
nj-clucker.com

もはやこんな機械とかいらんくなる。

エレコム ディスプレイ分配器 VGA 2分配 VSP-A2

エレコム ディスプレイ分配器 VGA 2分配 VSP-A2

  • 発売日: 2003/07/05
  • メディア: Personal Computers

Treasure Data 製品

●fluentd
テキストストリームを別の出力系へ流し込むためのOSS
github.com

●embulk
fluentdのバッチ版
github.com

●td-agent
fluentdの安定版
td-agent側ではなく、今はomnibus-td-agentを見た方が良さげ
github.com

●DigDag
YAML形式で定義するワークフローエンジン
github.com

●Arm Treasure Data CDP
分析・可視化・再配信基盤(使った事が無いため、IT mediaとかのリンク先からの推測)
www.treasuredata.co.jp

【参考リンク】
logmi.jp

www.slideshare.net
marketing.itmedia.co.jp

CloudFront + S3を用いて動画をストリーミング形式で再生させたい

[何をしたかったか]
・急遽1カ月程度の期間限定動画公開サイトを作成したいとお願いされた。
 但し、金銭授受が発生するため、Youtubeが使えない。
 (限定公開する際に通常はアクセス権限を金銭による制御を行う事は禁止されている)
・既に金銭授受は完了しているため、新たに料金徴収はできない。
 (最悪料金はこちらで支払い、Vimeoを使ってもらうという手段も考えたが見合わせた)
・動画ファイルがそれなりに大きいので、ストリーム再生を行う必要がある。
・とはいえ、URLを知っている人であれば誰でもアクセス可能なレベルのアクセス制限で構わない

[対応方法]
自身の知っている知識では、AWSかAzureのどちらかで構築を考えたが、以下を理由に今回はAWSで構築する事にした。
 ・AWSの方が普段から使っているため、手が早く動かせる(12時間以内位で用意する必要があったため)
 ・S3 + CroudFrontという構成は良く聞くし、世の中も大半がそのノウハウベースが多かったので
 ・Azureの通信料金が意外に高そうであったため

[調べながら対応した内容]
●動画編集方法
これは以前調べていた&使った事があったので調べながらという部類ではないが一応記載。
無料で使えそうなのは、AviUtl位であるが、正直超玄人向きで、とりあえずパワポ感覚で作成したいいう人には全く向かない(私も何度か使ったが苦行であった…)。
他の無料版は、動画作成時間が5分しか作れない、でかいバナーが入る、動画編集できても出力解像度が酷いなどで基本サンプル利用みたいなものばかりである。
そのため、ここは悩まずにさっさとソフト決めて作り始めた方が結果的には時間の無駄にならない。
なお、当方はサブスクリプション形式もあるPower Directorを使う事にした。
最初は多少時間かかったが、1時間もすればパワポ感覚で使える様になった。

●ストリーム動画の対応方法
S3でmp4のファイルをそのまま動画配置したのでは、ストリーム再生にはならない。
CloudFrontをRTMPとして公開すればmp4のままでもストリーム再生になるっぽいが、iOSで再生が困難っぽそうなのと、今後ももしかしたら利用したいという要望があったため、この方法はやめることにした。
(CloudFrontのRTMP形式は2020/12/31でEOLのため)
よって、HTS(HTTP Live Streaming)形式でストリーム対応を行う事にした。
よくサイトなどで紹介されている方法では、S3(mp4) → Elemental MediaConvert → S3(M3U8)形式に変換する方法が紹介されているが、今回は出来るだけ安く対応したかった。
結果、私のPCにVideoProcというソフトが何かのタイミングでインストールされていたので、以下の方法で変換が行えた。
動画変換&動画編集&音声変換の方法|VideoProc使い方

●アクセス権限
今回はURLさえ知っていればアクセスできるレベルなので、アクセス権限の設定は不要であった。
そのため、CloudFrontのRestrict Viewer Access(Use Signed URLs or Signed Cookies)の設定はoffにしておく必要があったのに、onにしてしまっていたので多少時間ロスした。

●動画URLの決定方法
S3に直接アクセスする場合のURLは、S3 Management Consoleから対象オブジェクトのURLを確認するなど簡単に把握することができる。
一方、今までCloudFront経由でS3のオブジェクトにアクセスした事が無かったので、少し調べないと分からなかった。
結果、アクセス権限の設定さえ合っていれば、 https:///<フォルダ名>/<オブジェクト名> でアクセスできた。
(バケット名はドメイン名の部分で変換されるため不要、フォルダ名はバケット直下のオブジェクトの場合は不要だがフォルダを掘ってる場合は必要)

●動画再生方法
HTSのフォーマットであるM3U8は、iOSではそのまま再生できるが、Windowsなどの機器ではそのまま再生することができない。
以下の参考リンクにvideo.jsを用いてブラウザで表示する方法紹介されていたので、それを利用することでブラウザ上で再生することができた。
なお、動画再生用のHTMLと、動画の場所は同じところに設定したので、CORSの設定は特に行わなかったが無事再生できた。

●その他
・Origin Pathを設定すれば、コンテキストパスを設定することができるが、S3を利用する場合は空にしておけばいいと思う。
ディストリビューションを作成または更新する場合に指定する値 - Amazon CloudFront
ドメインのみのアクセスした場合の設定は、CloudFrontのDefault Root Objectで行える。
 なお、ドメインのみのアクセスなどは考慮しないで今回は良いので、エラーページを用意してそちらに振った。
・ファイルストレージをS3以外に利用できれば動画ファイルだけ配置するだけにできるのでは?と思ったが、以下が理由で駄目だと思い試していない。
 Dropboxなどのファイルストレージサービス:オブジェクト単位にランダムなURLが生成されるため、M3U8形式はファイル分割されかつ連番でアクセスできないと多分駄目だと思うので諦めた(zip化したり、自力でインデックス書き換えるなどすればできるのかもしれない)
 Githubなどのリポジトリサービス:ブラウザでURLアクセスしても実行形式にならないため

[参考リンク]
S3 + CloudFrontでまずはおったてるというところがとても参考になりました。
S3+CloudFrontで静的サイトを配信する - Qiita
上記構成でまずは構築して、このサイト見ながら少しずつストリーム動画再生できる様に組み替えていきました。
AWS Elemental MediaConvertでストリーミング配信(前編) - 虎の穴開発室ブログ
Cloud Frontの入力設定に関して、日本語でそれぞれの入力値に関する記載が行われていた。
そんなに参照はしなかったが、もしもの時に参考になるかと思い、メモ。
AWS CloudFront | STAY KOBE
まじめに作るならこれ位はしないと駄目やけど今回の要件としてはオーバースペックだったので試してないです。
www.datastadium.co.jp

【最新版】PowerDirector 18 Ultra 通常版

【最新版】PowerDirector 18 Ultra 通常版

  • 発売日: 2019/10/18
  • メディア: DVD-ROM