Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Garoon開発チームではPHP8.1の仕様変更とどう向き合ってきたのか / How we...
Search
Chiba Tairi
April 05, 2023
Programming
1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Garoon開発チームではPHP8.1の仕様変更とどう向き合ってきたのか / How we have responded to the PHP 8.1 mbstring specification changes
【Cybozu Tech Meetup #21】PHPerKaigi 2023 後日談 発表スライド
https://cybozu.connpass.com/event/277790/
Chiba Tairi
April 05, 2023
More Decks by Chiba Tairi
See All by Chiba Tairi
PHP のプロファイルを Grafana Pyroscope で見たくてライブラリを自作した
pakutoma
1
670
PHP8.1で大改修が入ったと噂のmbstringで実際に遭遇した問題たち / Problems encountered with mbstring in PHP 8.1
pakutoma
0
290
Other Decks in Programming
See All in Programming
Cloudflare is Agents
chimame
0
180
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
170
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
310
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
120
T3DD26: From RAGs to Riches
martinhelmich
0
120
不幸な GC
chencmd
0
820
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
580
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
570
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
210
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
220
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
Designing for Performance
lara
611
70k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
450
So, you think you're a good person
axbom
PRO
2
2.1k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
880
WENDY [Excerpt]
tessaabrams
12
39k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Transcript
0 #Garoon 開発 #完成度低いの歓迎LT大会 Garoon開発チームでは PHP 8.1の仕様変更と どう向き合ってきたのか 〜 mb_detect_encodingを例に
〜 サイボウズ Garoon開発チーム 千葉 泰理(ぱくとま)
1 #Garoon 開発 #完成度低いの歓迎LT大会 1 - タイトルを変えました - PHPerKaigiで話したいことは話した -
社内イベントなので、もうすこし社内っぽいことを話したい - とは言っても、結局mbstringのことを話します - ぱくとま(千葉 泰理) - 4月でサイボウズ2年目になりました - Yukimiチームに所属 - GaroonのPHPやライブラリのアップデート対応 おことわり & 自己紹介
2 #Garoon 開発 #完成度低いの歓迎LT大会 2 - バイト列の文字エンコーディングを「検出」する関数 - 実際には、最も可能性が高いエンコーディングを「推測」 -
エンコーディングの候補を配列で渡す - 日本語なら[ASCII, UTF-8, JIS, EUC-JP, SJIS-win]とか - 一番もっともらしいものを選ぶ(ということになっている) - PHP 8.0までは、最初に出現したvalidな候補を返す mb_detect_encoding() とは?
3 #Garoon 開発 #完成度低いの歓迎LT大会 3 - 主にメールの受信に利用されていた - メールのヘッダーと本文のエンコーディングを推測 -
MIMEヘッダーのcharset指定は無視されていた - 本文から推測した方が成功率が高いという判断らしい - 経緯は不明、過去の規格違反メールへの対策? Garoon での使われ方
4 #Garoon 開発 #完成度低いの歓迎LT大会 4 - PHP 8.1でmb_detect_encoding()の仕様が変更 - エンコーディングの配列を渡したとき
- PHP 8.0まで - 正常にエンコードされた最初のエンコーディングを返す - PHP 8.1から - 一番それらしいエンコーディングを返す mb_detect_encoding()のサイレント仕様変更
5 #Garoon 開発 #完成度低いの歓迎LT大会 5 - 一番それらしいエンコーディング……? - 文字列に対してスコアリングする -
常用漢字外の漢字や、U+FFFF以上の文字(絵文字など)は 低いスコアが付く - 出現頻度が低い文字で誤検出が発生 - 例えば、🍣(寿司)をUTF-8ではなくSJIS-winとして認識 - Garoonでは、名字の異体字が文字化けした mb_detect_encoding()の検出方法
6 #Garoon 開発 #完成度低いの歓迎LT大会 6 - PHP 8.0の挙動を再現したラッパー関数を作成 - どうやって再現する?
- mb_check_encodingで代用すれば良いと思っていた - Alex Dowad氏もそう言っていたし……。 - mb_check_encodingに様々な問題が発覚した mb_detect_encoding() のラッパー関数
7 #Garoon 開発 #完成度低いの歓迎LT大会 7 - ASCIIかどうかの判定基準の違い - PHP 8.0のmb_detect_encoding
- 0x20-0x80とCR, LF, HTAB, NULのみを許容 - mb_check_encoding - 0x00-0x7Fを全て正しいASCIIと判定 - JISをASCIIと誤認識 - mb_check_encodingの仕様としては正しい mb_check_encoding()の問題 その1
8 #Garoon 開発 #完成度低いの歓迎LT大会 8 - JISかどうかの判定基準の違い - PHP 8.0のmb_check_encoding:
- 7bit文字+エスケープシーケンスのみをJISとして判定 - PHP 8.1のmb_check_encoding: - 8bitの半角カナなどをJISとして判定 - エスケープシーケンスが欠落していてもJISとして判定 - EUC-JPや壊れたJISをJISとして誤認識 mb_check_encoding()の挙動 その2
9 #Garoon 開発 #完成度低いの歓迎LT大会 9 - JISをASCIIと誤認識する - 以前の挙動を再現した関数を用意して対応 -
EUC-JPなどをJISと誤認識する - PHPに独自パッチを当てて対応 - PHP側に聞いてみたが、正常動作とのこと - エスケープシーケンスが欠落したJISを誤認識する - PHP側にissue登録→修正 ラッパー関数を作成する際の対応
10 #Garoon 開発 #完成度低いの歓迎LT大会 10 - エスケープシーケンスが欠落したJISを誤認識する件 - JISとISO-2022-JPは改修された🎉(おまけでUTF-7も) -
ISO-2022-JPの変種(-2004など)の対応はまだ - PR書きたいんですが、ちょっとお休み中です - 8bit 半角カナがJISとして判定される件 - 社内ではパッチを当てているものの、今後どうするかは検討中 - PHP側の実装を使えるのが理想 PHP側への働きかけ
11 #Garoon 開発 #完成度低いの歓迎LT大会 11 - ひとまず修正リリースは出来たが、良い状態ではない - 複雑怪奇な動作をするラッパー関数 -
PHP本体に取り込まれなかった独自パッチ - メール機能の文字コード周りをほとんど作り直す - MIMEヘッダーを出来るだけ利用 - mb_detect_encodingの利用は必要最低限に - 規格違反メールの文字化けはある程度許容したい - 改修に向けて作業中 根本解決への道筋
12 #Garoon 開発 #完成度低いの歓迎LT大会 12 - 仕様変更は、コード品質の低い部分ほど影響が大きい - 必然的に厳しいコードを目にする機会が増える -
プロダクトの光と闇だと、闇を目にするほうが圧倒的に多い - プロダクトの中で一番問題がある部分を改善していける - PHPアップデートの度に Garoon は進化しています - 仕様変更はプロダクトの弱い部分を成長させる機会 レガシーコードとの戦い
13 #Garoon 開発 #完成度低いの歓迎LT大会 13 - 完成度低いポイント:Garoonのメール & mbstring -
つらい - 見つけたものは改善出来る、だから良いこと! - GaroonでもOSSでも一緒ですね - 社内外のレガシーコードに立ち向かっています - ありがとうございました! まとめ