詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

ターミナルの作業中ディレクトリにOSの「ファイルを開く」からもアクセスしたい

作業中のリポジトリのファイルをブラウザやデスクトップアプリ経由でアップロードしたり触ったりするとき、OSのファイルを開くダイアログからだとそこにたどりつくのが手間。macOSならopen -R でファイルを選択しつつFinderを起動できるので、これをするときもあるのだけど、ダイアログを先に開いてしまっていたり、そもそもファイルのドラッグ&ドロップに対応していない場合はどうしようもなかったりする(ダイアログにドロップするって技はある)。

ようは「今ターミナルで開いてるディレクトリにOSの『ファイルを開く』ダイアログからもアクセスしたい」という話。fuseを使うかFileProvider Extensionを使うといいのかな……とか考えてたけど、とりあえずプロトタイプとしてシェルスクリプトを書いたところ、これでいいやとなった。

最近ターミナルにWezTermを使いはじめたので、wezterm cli list で作業ディレクトリをリストアップできる。tmuxでも同じようなことはできるが、WezTerm便利。

あとはこの結果を加工して、~/cwds 以下に作業ディレクトリへのsymlinkを張るコマンドを書いた。ディレクトリ名の被りは勇気を持って無視。

#!/bin/bash

set -e

rm -f ~/cwds/*

dirs=$(wezterm cli list --format json \
  | jq -r '.[] | .cwd' \
  | perl -nle 's<^file://><> and print' \
  | sort \
  | uniq)

for dir in $dirs; do
  if [ -d "$dir" ]; then
    ln -sf "$dir" ~/cwds/
  fi
done

これを update-cwds などというファイルにしてパスを通して、zshのフックに登録。たぶんこんな感じでは? zshは雰囲気で使っている。

function chpwd() {
    if command update-cwds 2>/dev/null; then
        update-cwds
    fi
}

そして~/cwdsをFinderのサイドバーに追加すればOK。こんな感じに使えます。

youtu.be

NISAは「ニーサ」なのか「ナイサ」なのか

[B! togetter] アメリカのVTuberさんが『日本人はカスコー(Costco)のことをコストコって言うんやで 発音かわゆす』みたいなお話をなさっていた「tを読まないんか」

このブコメに「NISAも英語読みならniceのようにナイサと呼ぶべき」というものがあり、それは違うんじゃね? と直感的には思ったものの、そんなに説明できる感覚でもないなと思ったので調べてみた。

結論としては「ニーサ」で問題はないだろうと思う。

英単語を構成する文字のうち子音をC、母音をVで表すことにする(一般的な表記のようです)。ここでは「CiCeという形で表される英単語のiにおける発音のルールが、CiCaという形式にも適用されるのか?」という疑問に否定的な回答をしたい。

そのために、

  • まずCiCaの形(NISA)をとる既知の英単語における "i" の発音がどのようであるか、
  • その後、CiCeの形(nice)の単語における "i" の発音ルールがどのような成り立ちか

を調べる。

ちなみに英語の発音は綴だけから一意に決めることはできないはずなので、あくまで傾向としてどうか、という話になる(NISAは造語なので傾向がわかればよい)。

CiCa型の単語の "i" の発音を調べる

パッと思いつくものは少ないが、china や diva、visa がここで話題にしたい単語になる。china は /tʃˈaɪnə/ なので「ナイサ」に与する例。diva は /dˈivə/ で「ニーサ」に与する例だ。

NLTK(Natural Language Toolkit)を使って、英単語のリストと CMU Pronunciation Dictionary で網羅的に調べてみる。

from collections import defaultdict
import re

import nltk.corpus
from phonecodes.phonecodes import arpabet2ipa

nltk.download("words", quiet=True)
nltk.download("cmudict", quiet=True)

transcribe = nltk.corpus.cmudict.dict()

# CiCa 型の単語にマッチするだろう正規表現
# CirCa は除いている
re_CiCa = re.compile(
    r"^([bcdfghjklmnpqrstvwxyz]+)i([bcdfghjklmnpqstvwxyz][bcdfghjklmnpqrstvwxyz]*|r)a$",
    re.I,
)

# i に対応する発音で分類
word_pron_by_i = defaultdict(list)

for word in nltk.corpus.words.words():
    if not re_CiCa.search(word):
        continue

    # 母音にはアクセントとして数字が付与されている
    # (C)CVCV になっているもののみを抽出
    prons = transcribe.get(word.lower(), None)
    if not prons:
        continue

    for pron in prons:
        parts = [(p[:-1], "V") if p[-1].isdigit() else (p, "C") for p in pron]
        if [v for (_, v) in parts[-4:]] != ["C", "V", "C", "V"]:
            continue
        word_pron_by_i[parts[-3][0]].append((word, pron))

for i_pron, words in word_pron_by_i.items():
    print(f"===== /{arpabet2ipa(i_pron)}/ ({len(words)}) =====")
    for word, pron in words:
        print(word, "/" + "".join(arpabet2ipa(" ".join(pron)).split(" ")) + "/")

実行するとこうなった。

===== /aɪ/ (6) =====
china /tʃˈaɪnə/
Lima /lˈaɪmə/
mica /mˈaɪkə/
Pica /pˈaɪkə/
pica /pˈaɪkə/
vita /vˈaɪtə/
===== /i/ (30) =====
Chita /tʃˈitə/
diva /dˈivə/
Gila /ɡˈilə/
Lida /lˈidə/
Lila /lˈilə/
Lima /lˈimə/
Lina /lˈinə/
lina /lˈinə/
lipa /lˈipə/
Lisa /lˈisə/
Liza /lˈizə/
Mina /mˈinə/
mina /mˈinə/
Nina /nˈinə/
Pima /pˈimə/
pina /pˈinə/
pita /pˈitə/
prima /pɹˈimə/
rima /ɹˈimə/
ripa /ɹˈipə/
Rita /ɹˈitə/
rita /ɹˈitə/
riva /ɹˈivə/
sima /sˈimə/
spina /spˈinə/
Tina /tˈinə/
vila /vˈilə/
vina /vˈinə/
visa /vˈizə/
viva /vˈivə/
===== /ɪ/ (10) =====
Cyrilla /sɨɹˈɪlə/
Disa /dˈɪsə/
lira /lˈɪɹə/
Mina /mˈɪnə/
mina /mˈɪnə/
Mira /mˈɪɹə/
Scilla /sˈɪlə/
villa /vˈɪlə/
Xylina /zˈaɪlɨnə/
Zilla /zˈɪlə/

/i/ (ニーサ派)が優勢・多数派で、ついで /ɪ/(ニサ?)、/aɪ/(ナイサ)。

あくまで提供されたコーパスに収録された単語と発音のみのリストであってそもそもそんなに数がなく、網羅的でもないものの、こういうコーパスに収録されていない語や発音はそれだけ重要度が低いだろうから問題ないと思う。

CVCeと「マジックe」

ここまでの調査でCiCaにおける "i" の発音はおおかた /i/ でよかろう、という所感を持てた。ではniceにおける "i" の発音はなんなんだ。

CVCe型の単語でVを長く発音する("i" なら「アイ」、"a" なら「エイ」)のは英語学習者にとっても馴染みの深い現象だと思う。ナイスとかテイクとかね。問題はこれがCVCaにも適用されるものだと考えていいのか? という話。

これについては調べてきました! 以上のことは言えることがない。前も紹介した 英語の「なぜ?」に答える はじめての英語史 の著者のブログによると、この形のeは「マジックe」と呼ばれていて、歴史的な経緯があってこうなっているらしい(#1289. magic <e> - hellog~英語史ブログ )。これを調べてて知ったけど "e" も発音されていないらしい。たしかに……。

つまるところ、"i" を「アイ」と読むのはマジックeの作用によるもので、eがない場合にも同じように適用できるものではない、と言っていいだろう。

なぜeだけで他の母音についてはおこらなかったのか、という疑問も当然湧くが、後期古英語になると,強勢の落ちない語尾の環境では -a, -o, -u は -e へと融合してゆく#1344. final -''e'' の歴史 - hellog~英語史ブログ )ともあり、語尾の母音はeに収束していったのかな。

そもそも-aで終わる単語はそんなに英語っぽくない気もしていて、他言語から英語に輸入されてきた経緯もあるのかもしれない。ここは未検証。

まとめ

既知の単語の調査と発音ルールの成り立ちから、NISAの発音はニーサで問題ないのではないか、という感覚の裏付けを取りました。

『関数型ドメインモデリング』はF#の本なのか?

関数型ドメインモデリング ドメイン駆動設計とF#でソフトウェアの複雑さに立ち向かおう

日本語版出版に際し、訳者の猪股さんにご恵贈いただきました。ありがとうございます!

すでに原著の『Domain Modeling Made Functional』を読んでいて、そのときの感想は以前に書いたとおり。そこからの差分としては、はてな社内でこの本の輪読をはじめたこと。輪読がはじまったその週に日本語版の出版が告知され嘆息する一同でしたが、日本最速で輪読を開始できたのは間違いないと思う。

この本の特徴をひとつ挙げろと言われれば、実装に使われている言語がF#であること、というのが大方の回答になるとおもうが、一方でこの本をやるのにF#を実践する必要はない、と考えている。そういうわけで今回輪読における実装言語にはGoとTypeScriptを指名しており、その後Scala勢力も増えたのだけど、進度的には実際にコードを書きはじめるのはもうちょっと先なので、このへんの結末についてはまた別の機会に書くつもり。

巷の本でドメイン駆動設計(DDD)を学ぼうとすると、Javaのようないわゆるオブジェクト指向言語がその実践言語として選ばれていがち(※主観)で、するといきおいその言語特有の事情までDDDの知識であるかのように見えてしまう弊害がある。

関係しそうな話:

Value Objectについて整理しよう - Software Transactional Memo

ウェブ開発においてはふだんGoなりTypeScriptなり、Javaのようなオブジェクト指向ではないが、関数型と呼べはしない言語を使っている、そんな我々が『関数型ドメインモデリング』を読むことに価値があると思っているのは、そういう点だ。

この本においてはF#は一種の理想的な例として描かれていると見ていて、必ずしもF#を使おうと喧伝している本ではない。この本の要点を強引にまとめると、

  • ドメインモデルを型に落とし込みプログラム中のモデルが現実に起こり得ない状態を表すことを許さない、
  • 副作用のないワークフローでドメインロジックを実装する

という点にある。これをF#はどうやらうまくやってのけるらしいとわかる。だけどこれをソースコードレベルで一言一句信仰するのではなくて、普段の言語における実践的な適用にどう落としこむかが、読者の宿題だ。パラダイムの違う言語を通して見ることで、そのエッセンスがより研ぎ澄まされて見えてくるのだと思う。

というわけでこの本がいよいよ日本語で読めるようになって、たいへん喜ばしく思っている次第です。F#にこだわりすぎずに読むのがオススメ。

はてなで一緒に働きませんか?