SlideShare a Scribd company logo
1 of 83
Copyright 2020 @nuits_jp
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
Copyright 2020 @nuits_jp
Easiest Clean Architecture
About Me
Copyright 2020 @nuits_jp Slide 3
About Me
中村 充志 / Atsushi Nakamura
• リコージャパン株式会社 所属
• Enterprise(おもに金融)系SIerのITアーキテクト
• 「持続可能なソフトウェア」の探求がライフワーク
• 2020年の目標
1. 「CleanArchitecture」について登壇したい
2. 「xUnit & Moqハンズオン」開催
3. 構成管理フレンドリーなERモデリングツール作成
• Blog http://www.nuits.jp
• Blog(英語) https://blog.nuits.jp
• Twitter @nuits_jp
Copyright 2020 @nuits_jp Slide 4
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
みなさん、こんな経験はありませんか?
Copyright 2020 @nuits_jp Slide 5
例えばこんなとき
• 新しいAPIをお試しで利用するとき、その結果を表示させたい
• 簡単なツールを作るのだがGUIはやりすぎなのでCUIでつくりたい
そして・・・
Overview
Slide 5
Copyright 2020 @nuits_jp Slide 6
コンソールにテーブル形式で結果表示したい!
Copyright 2020 @nuits_jp Slide 7
そんなときの心強い味方
「ConsoleTales」
• https://github.com/khalidabuhakmeh/ConsoleTables
ConsoleTables
Slide 7
Copyright 2020 @nuits_jp Slide 8
でもこれ・・・
Copyright 2020 @nuits_jp Slide 9
全角を使うとレイアウトが崩れてしまいます
全角が・・・
Copyright 2020 @nuits_jp Slide 10
と、いうわけで・・・
Copyright 2020 @nuits_jp Slide 11
全角対応テキストテーブルライブラリを作るしか!?
Copyright 2020 @nuits_jp Slide 12Slide 12
できました!
Copyright 2020 @nuits_jp Slide 13
FluentTextTable
FluentTextTable
• https://github.com/nuitsjp/FluentTextTable
簡単で、柔軟かつ流暢(Fluent)にレイアウトをカスタマイズできるテキスト
テーブルライブラリです。
NuGetから利用可能です。
Slide 13
Copyright 2020 @nuits_jp Slide 14
Basic
Copyright 2020 @nuits_jp Slide 15
Markdown対応
Copyright 2020 @nuits_jp Slide 16
改行や配列を含むプロパティ対応
Copyright 2020 @nuits_jp Slide 17
アライメントや詳細なフォーマットに対応
箇条書きとか!
Copyright 2020 @nuits_jp Slide 18
Borderのカスタマイズ
Copyright 2020 @nuits_jp Slide 19
MarginとPadding
Copyright 2020 @nuits_jp Slide 20
まぁ・・・振り返って気がつきました・・・
Copyright 2020 @nuits_jp Slide 21
やりすぎました!
Copyright 2020 @nuits_jp Slide 22Slide 22
でもこれ実は
Copyright 2020 @nuits_jp Slide 23Slide 23
苦難の連続でした
Copyright 2020 @nuits_jp Slide 24Slide 24
そんな訳で聞いてください
Copyright 2020 @nuits_jp Slide 25
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
Copyright 2020 @nuits_jp Slide 26
Unicodeには文字を分類するための各種辞書が規定されています。
東アジア圏の全角・半角を分類するための辞書もあります。
UAX #11: East AsianWidth – Unicode
• http://www.unicode.org/reports/tr11/tr11-38.html
• http://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 27
これを読んで処理すれば解決なんですが・・・
Copyright 2020 @nuits_jp Slide 28
まず辞書を読むのが面倒
Copyright 2020 @nuits_jp Slide 29
よく見ると・・・・
• 「;」の前が文字コードのレンジ、その後ろが種別
• レンジは範囲と単独がある
• 未定義のとび版がある
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 30
• 同じ種別なのに単一の範囲ではなく複数に分けられている
(文字の中身の種類が違うから)
Copyright 2020 @nuits_jp Slide 31
と、いうわけで
Copyright 2020 @nuits_jp Slide 32
まず全角・半角判定ライブラリを作ることにしました
Copyright 2020 @nuits_jp Slide 33Slide 33
できました!
Copyright 2020 @nuits_jp Slide 34
EastAsianWidthDotNet
EastAsianWidthDotNet
https://github.com/nuitsjp/EastAsianWidthDotNet
• 辞書をパースするサポートライブラリを作成
• パース結果を無駄を省いて最適化
• 辞書などのリソースを都度読むと遅いのでT4テンプレートでコード生成
Copyright 2020 @nuits_jp Slide 35
で実感します
Copyright 2020 @nuits_jp Slide 36
Ambiguous(曖昧)について
Copyright 2020 @nuits_jp Slide 37
辞書は文字コードの範囲と、対象範囲の種別が規定されている。
EastAsianWidthの種別は6つ
• Ambiguous
• Fullwidth
• Halfwidth
• Narrow
• Wide
• Neutral
これらが言語圏によって扱いが規定されている。
Unicodeにおける全角・半角判定
Copyright 2020 @nuits_jp Slide 38
種別 東アジア それ以外
Ambiguous 全角 半角(正確にはnarrow)
Fullwidth 全角 未使用
Halfwidth 半角 未使用
Narrow 半角 半角(正確にはnarrow)
Wide 全角 未使用
Neutral 半角 半角(正確にはnarrow)
Unicodeにおける全角・半角判定
ウィキペディアより
A(Ambiguous; 曖昧)
文脈によって文字幅が異なる文字。東アジアの組版とそれ以外の組版の両方に出現し、
東アジアの従来文字コードではいわゆる全角として扱われることがある。
ギリシア文字やキリル文字など。
Copyright 2020 @nuits_jp Slide 39
なるほど!
ギリシャ文字とキリル文字の言語圏を
調べて特殊処理すればいいんだな!
👆勘違い
Copyright 2020 @nuits_jp Slide 40
CultureInfoをひとつづつ全部調べた。数日使った。 👈勘違い
途中までしらべた
Copyright 2020 @nuits_jp Slide 41
ここまできて「はた」と気が付きました
Copyright 2020 @nuits_jp Slide 42
Not東アジアって英語圏とかも全部じゃん?
Copyright 2020 @nuits_jp Slide 43
「Not東アジア」ではなく「東アジア」を判定する
Copyright 2020 @nuits_jp Slide 44
東アジアのCultureInfoのプレフィックス
総当たりで調べた!(漏れてたら教えてください)
Copyright 2020 @nuits_jp Slide 45
完成!
Copyright 2020 @nuits_jp Slide 46Slide 46
と思ったところから「闇」の始まりだった
Copyright 2020 @nuits_jp Slide 47
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 48
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 49
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 50
種別 東アジア それやめろ文字
Ambiguous 全角
Neutral 半角
闇の入口
Copyright 2020 @nuits_jp Slide 51Slide 51
ん~。フォントファイル解析して文字幅測定するか?
Copyright 2020 @nuits_jp Slide 52Slide 52
ダメでした
Copyright 2020 @nuits_jp Slide 53
闇の入口
ここになんの変哲もない砂時計があります。
Copyright 2020 @nuits_jp Slide 54
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
Copyright 2020 @nuits_jp Slide 55
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
Copyright 2020 @nuits_jp Slide 56
闇の入口
ここになんの変哲もない砂時計があります。
これを8個並べましょう。
えっ!?
Copyright 2020 @nuits_jp Slide 57
さん。まさかの0.75角!?
Copyright 2020 @nuits_jp Slide 58
続けて調べると、怪しい文字がぞろぞろ・・・
Copyright 2020 @nuits_jp Slide 59
結論
Copyright 2020 @nuits_jp Slide 60
完璧を追い求めるのは無理。
怪しい文字が崩れるのは諦めろ。
結論
Slide 60
Copyright 2020 @nuits_jp Slide 61
そして月日は流れる
Copyright 2020 @nuits_jp Slide 62
FluentTextTable完成!
Copyright 2020 @nuits_jp Slide 63
で、思うわけですよ
Copyright 2020 @nuits_jp Slide 64
日本人なら・・・
こんな感じで罫線文字(┌┬┘とか)使いたいよね?
Borderは全角にもマルチ文字にもカスタマイズ可能!
デフォルトのプリセット作るか!
Copyright 2020 @nuits_jp Slide 65
日本人なら・・・
こんな感じで罫線文字(┌┬┘とか)使いたいよね?
Borderは全角にもマルチ文字にもカスタマイズ可能!
デフォルトのプリセット作るか!
👇できました!
Copyright 2020 @nuits_jp Slide 66
動かしました!
Copyright 2020 @nuits_jp Slide 67
(*´Д`)はぁ・・・?
Copyright 2020 @nuits_jp Slide 68
メモ帳様ならちゃんと!
Copyright 2020 @nuits_jp Slide 69
あれ?
Copyright 2020 @nuits_jp Slide 70
あれれ??
これはもしや・・・
Copyright 2020 @nuits_jp Slide 71
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
Copyright 2020 @nuits_jp Slide 72
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
これを「〇」と合わせて
( ^ω^)
≡ ≡
Copyright 2020 @nuits_jp Slide 73
?
ここに「─(罫線)」があるじゃろ?
( ^ω^)
⊃─⊂
これを「〇」と合わせて
( ^ω^)
≡ ≡
こうじゃ!
( ^ω^)
⊃ ⊂
Copyright 2020 @nuits_jp Slide 74
ええっ!?
貫通してる!?
Copyright 2020 @nuits_jp Slide 75
あっっぽーぺん!?
Copyright 2020 @nuits_jp Slide 76
コンソールのバグ・・・
Copyright 2020 @nuits_jp Slide 77
いや、まだあわてるような時間じゃない
Copyright 2020 @nuits_jp Slide 78Slide 78
きっと我らの「WindowsTerminal」様なら・・・
Copyright 2020 @nuits_jp Slide 79
ダメでした!
貫通はしない!
だがしかし!
半角!
それでもおれらの「WindowsTerminal様なら
Slide 79
Copyright 2020 @nuits_jp Slide 80
諦めました
Copyright 2020 @nuits_jp Slide 81Slide 81
Unicodeで半角全角を扱う
Ambiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Copyright 2020 @nuits_jp Slide 82Slide 82
味わっていただけましたか?
Copyright 2020 @nuits_jp Slide 83
ThankYou!
おしまい!

More Related Content

What's hot

みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)
Noriyuki Mizuno
 

What's hot (20)

5分で分かるアジャイルムーブメントの歴史 拡大版
5分で分かるアジャイルムーブメントの歴史 拡大版5分で分かるアジャイルムーブメントの歴史 拡大版
5分で分かるアジャイルムーブメントの歴史 拡大版
 
【Unite 2018 Tokyo】エディター拡張マニアクス2018
【Unite 2018 Tokyo】エディター拡張マニアクス2018【Unite 2018 Tokyo】エディター拡張マニアクス2018
【Unite 2018 Tokyo】エディター拡張マニアクス2018
 
情報構造設計の基礎知識
情報構造設計の基礎知識情報構造設計の基礎知識
情報構造設計の基礎知識
 
インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
 
Web App for Containers のデプロイでつまずいた話
Web App for Containers のデプロイでつまずいた話Web App for Containers のデプロイでつまずいた話
Web App for Containers のデプロイでつまずいた話
 
Google Cloud で実践する SRE
Google Cloud で実践する SRE  Google Cloud で実践する SRE
Google Cloud で実践する SRE
 
reduxのstate設計の話
reduxのstate設計の話reduxのstate設計の話
reduxのstate設計の話
 
Deflate
DeflateDeflate
Deflate
 
計算量
計算量計算量
計算量
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライド
 
TLA+についての話
TLA+についての話TLA+についての話
TLA+についての話
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
XPは何を伝えたかったんだと思う?
XPは何を伝えたかったんだと思う?XPは何を伝えたかったんだと思う?
XPは何を伝えたかったんだと思う?
 
「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について
 
みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)
 
開発とテストが一体となったソフトウェア開発
開発とテストが一体となったソフトウェア開発開発とテストが一体となったソフトウェア開発
開発とテストが一体となったソフトウェア開発
 
ぼんやりした要件とテストケースから出てくる地獄のようなゲームテスト自動化導入
ぼんやりした要件とテストケースから出てくる地獄のようなゲームテスト自動化導入ぼんやりした要件とテストケースから出てくる地獄のようなゲームテスト自動化導入
ぼんやりした要件とテストケースから出てくる地獄のようなゲームテスト自動化導入
 
サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦
 

More from Atsushi Nakamura

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
 

More from Atsushi Nakamura (20)

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview
 
世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考える
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overview
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overview
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms ja
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.forms
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
 

Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖