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にしたい。

参考

メモ

グリフとかcmapとか知らなかった。すごい雑にいうと

であって、 「康熙部首」と「CJK部首補助」が意図せず混入するのは、文字コードからグリフに変換した後、逆にグリフから文字コードに変換するときに別の文字コードに変換されることがあるからだそう。

プログラミングまとめ|みし|noteのフォントを読むシリーズも勉強になりそうだが、これはあとで。

またRubyのRefinementの仕組みも恥ずかしながら今回初めて知ったのでこれも勉強になった。

RubyのRefinement(翻訳: 公式ドキュメントより)|TechRacho by BPS株式会社

*1:シンタックスハイライトするとなぜか全部表示できないので、ハイライトなしで

特に結論はないメモ

プロジェクト・シン・エヴァンゲリオン 実績・省察・評価・総括

久々に開発環境を再構築している。昔よりだいぶ簡単になっている

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

SQLにはSAVEPOINTというステートメントがある。

SAVEPOINTは、サブトランザクション入れ子トランザクションとも呼ばれる)を実現するための、データベース言語SQLステートメントの1つである。

via. SAVEPOINT (SQL) - Wikipedia)

標準SQLにも入っているので、おそらく広く使われている機能だと思うのだが、いまいち使いどころがわからなかった。

機能としてはWikipediaの例をみれば十分理解できるものの、これまでの経験*1サブトランザクションが生じざるを得ない時点でなにかデータ構造の設計を誤っている気がする。

ひとまず、わからないことがあった、ということの記録として。

参考

*1:まあこれが大したことがないからだ、と言われるとそれまでかもなのだが