mk_55's diary (original) (raw)
Rubyで康煕部首・CJK部首補助を検出、置換するものをとりあえず作ってみた。
文字の変換表は、PythonでCJK部首/康熙部首を置換 - メモ が公開してくれているものを参考にした。
--
使い方はこんな感じ
require "./lib/string_ja.rb" using StringJa::Radical
"埼玉埼⽟問題".codepoints "埼玉埼⽟問題".include_kangxi_radicals? "埼玉埼⽟問題".tr_kangxi_radicals.codepoints
コード全体は以下*1。
Stringクラスを日本語用に拡張するモジュール
module StringJa # 部首を扱うモジュール module Radical
# 康煕部首のCODEPOINT
KANGXI_RADICALS_REGEX_PATTERN=/[\u2F00-\u2FDF]/
# CJK部首補助のCODEPOINT
CJK_RADICALS_SUPPLEMENT_REGEX_PATTERN=/[\u2E80-\u2EFF]/
# 康煕部首のうち置換する文字の一覧
# via https://imabari.hateblo.jp/entry/2020/08/03/220407
#
# CODE Pointsを確認したいときは、StringJa::Radical::KANGXI_RADICALS_PATTERN.each_char {|c| puts "#{c} : #{c.codepoints[0].to_s(16)}" }
KANGXI_RADICALS_PATTERN="⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕"
# 康煕部首から置換可能な文字の一覧
# via https://imabari.hateblo.jp/entry/2020/08/03/220407
KANGXI_RADICALS_REPLACEMENT="一丨丶丿乙亅二亠人儿入八冂冖冫几凵刀力勹匕匚匸十卜卩厂厶又口囗土士夂夊夕大女子宀寸小尢尸屮山巛工己巾干幺广廴廾弋弓彐彡彳心戈戸手支攴文斗斤方无日曰月木欠止歹殳毋比毛氏气水火爪父爻爿片牙牛犬玄玉瓜瓦甘生用田疋疒癶白皮皿目矛矢石示禸禾穴立竹米糸缶网羊羽老而耒耳聿肉臣自至臼舌舛舟艮色艸虍虫血行衣襾見角言谷豆豕豸貝赤走足身車辛辰辵邑酉釆里金長門阜隶隹雨靑非面革韋韭音頁風飛食首香馬骨高髟鬥鬯鬲鬼魚鳥鹵鹿麥麻黃黍黒黹黽鼎鼓鼠鼻齊齒龍龜龠"
# CJK部首補助のうち置換する文字の一覧
# via https://imabari.hateblo.jp/entry/2020/08/03/220407
CJK_RADICALS_SUPPLEMENT_PATTERN='⺃⺅⺉⺋⺎⺏⺐⺒⺓⺔⺖⺘⺙⺛⺟⺠⺡⺢⺣⺦⺨⺫⺬⺭⺱⺲⺹⺾⻁⻂⻃⻄⻍⻏⻑⻒⻖⻘⻟⻤⻨⻩⻫⻭⻯⻲'
# CJK部首補助から置換可能な文字の一覧
# via https://imabari.hateblo.jp/entry/2020/08/03/220407
CJK_RADICALS_SUPPLEMENT_REPLACEMENT='乚亻刂㔾兀尣尢巳幺彑忄扌攵旡母民氵氺灬丬犭罒示礻罓罒耂艹虎衤覀西辶阝長镸阝青飠鬼麦黄斉歯竜亀'
refine String do
#文字列に康煕部首が含まれているか
def include_kangxi_radicals?
self.match?(KANGXI_RADICALS_REGEX_PATTERN)
end
#文字列に含まれる康煕部首を可能な限り漢字に置き換える
def tr_kangxi_radicals
self.tr(KANGXI_RADICALS_PATTERN, KANGXI_RADICALS_REPLACEMENT)
end
#文字列に含まれる康煕部首を可能な限り漢字に破壊的に置き換える
def tr_kangxi_radicals!
self.tr!(KANGXI_RADICALS_PATTERN, KANGXI_RADICALS_REPLACEMENT)
end
#文字列にCJK部首補助が含まれているか
def include_cjk_radicals_supplement?
self.match?(CJK_RADICALS_SUPPLEMENT_REGEX_PATTERN)
end
#文字列に含まれるCJK部首補助を可能な限り漢字に置き換える
def tr_cjk_radicals_supplement
self.tr(CJK_RADICALS_SUPPLEMENT_PATTERN, CJK_RADICALS_SUPPLEMENT_REPLACEMENT)
end
#文字列に含まれるCJK部首補助を可能な限り漢字に破壊的に置き換える
def tr_cjk_radicals_supplement
self.tr(CJK_RADICALS_SUPPLEMENT_PATTERN, CJK_RADICALS_SUPPLEMENT_REPLACEMENT)
end
end
end
end
ちょっと時間がないのでいったんここまでだが、時間ができたらテストを足してGemにしたい。
参考
- [ 康煕部首と CJK 部首補助の文字一覧 ] - Mr.XRAY
- 漢字のようで漢字でないUnicodeの「康熙部首」と「CJK部首補助」|TechRacho by BPS株式会社
- 見た目の変わらない文字化け―康煕部首とメイリオ - 日本インスティテューショナル・リサーチ協会 コラム
メモ
グリフとかcmapとか知らなかった。すごい雑にいうと
- グリフ: フォントにおける1文字の字形
- cmap: 文字コードとグリフの対応表
であって、 「康熙部首」と「CJK部首補助」が意図せず混入するのは、文字コードからグリフに変換した後、逆にグリフから文字コードに変換するときに別の文字コードに変換されることがあるからだそう。
プログラミングまとめ|みし|noteのフォントを読むシリーズも勉強になりそうだが、これはあとで。
またRubyのRefinementの仕組みも恥ずかしながら今回初めて知ったのでこれも勉強になった。
RubyのRefinement(翻訳: 公式ドキュメントより)|TechRacho by BPS株式会社
*1:シンタックスハイライトするとなぜか全部表示できないので、ハイライトなしで
特に結論はないメモ
- いまさらながら、プロジェクト・シンエヴァンゲリオンを読んだ
- いくつか面白い事が書いてあったのでメモ
- 今回はknown unkown riskとunknown unkown risk (p)について
- known unkown riskとunknown unkown risk
- もともとよく知られた考え方だが、ラムズフェルドさんの発言で有名に重なった書かれた考え方
* https://data.wingarc.com/unknown-unknown-23097
* unknown unknown risk
* 「それが起きるまで起きると想像もできなかった問題」
* いわゆる完全な想定外のこと
* known unkown risk
* 本の中では、「具体的に「何」とはわからないが、このタイミングやこの局面では何かしらの問題が起き得ると予見できる」こととしている。
* そして、「事前に照準をあわせて具体的な準備をすることはできないが、何かが起こるだろうという警戒感をもつことができる」
* つまり具体的にはわからないが、備えることはできる類のリスクのこと
- もともとよく知られた考え方だが、ラムズフェルドさんの発言で有名に重なった書かれた考え方
- ソフトウェア/システム開発でもknown unkown riskをもう少し真面目に考えないといけないかも
久々に開発環境を再構築している。昔よりだいぶ簡単になっている
Dockerのインストール
Install Docker Engine on Ubuntu | Docker Docsを参考に、以下のコマンドでDockerをインストールする
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
rootlessモードにする
uidmapを入れて
sudo apt-get install -y uidmap
rootlessモード用のスクリプトを実行する
dockerd-rootless-setuptool.sh install
あとは環境変数にDOCKER_HOST
を追加しておく
echo "#for rootless mode on docker" echo "export DOCKER_HOST=unix:///run/user/1000//docker.sock" >> ~/.bash_profile
以上
事象
WSL2にUbuntu22.04をインストールしたあと、再起動したところ、以下のようなエラーがでて起動できなかった。
<3>WSL (2552) ERROR: UtilTranslatePathList:2866: Failed to translate C:\WINDOWS\system32 <3>WSL (2552) ERROR: UtilTranslatePathList:2866: Failed to translate C:\WINDOWS (Userのパスなど含まれるので略)
原因
よくわからない。
対策
以下を実行してWSL再起動
wsl --set-default {distro_name}
調査
とりあえずググると以下のような記事が見つかる
一応、wsl --list
を実行してみるが、ただしく既定のdistroは存在しているように見える
wsl --list Linux 用 Windows サブシステム ディストリビューション: Ubuntu-22.04 (既定) Ubuntu
念のため再設定してみる
wsl --set-default Ubuntu-22.04 この操作を正しく終了しました。 wsl --list Linux 用 Windows サブシステム ディストリビューション: Ubuntu-22.04 (既定) Ubuntu
なぜか、上記を実行すると、正常に起動するようになった。
この辺のGithubでも議論はされている模様<3>WSL (8) ERROR: CreateProcessParseCommon:782: Failed to translate \\wsl.localhost\westie\home\mwoodpatrick · Issue #9252 · microsoft/WSL
SAVEPOINTは、サブトランザクション(入れ子トランザクションとも呼ばれる)を実現するための、データベース言語SQLのステートメントの1つである。
標準SQLにも入っているので、おそらく広く使われている機能だと思うのだが、いまいち使いどころがわからなかった。
機能としてはWikipediaの例をみれば十分理解できるものの、これまでの経験*1サブトランザクションが生じざるを得ない時点でなにかデータ構造の設計を誤っている気がする。
ひとまず、わからないことがあった、ということの記録として。
参考
*1:まあこれが大したことがないからだ、と言われるとそれまでかもなのだが