2023年12月24日日曜日

つれづれ思うこと 外国語編 その2

まずは「R」の発音から。

というのは、これが最も日本人泣かせの音と言われてきたためである。しかし、ある発音の本で調べてみたところ、それほど深刻にならなくてもよいようなのである。むしろ「L」の発音の方が難しく、気をつけないといけないらしい。

ここで、少し前置きが必要なので、それを先に下に記しておく。

しばしば「R」は「巻き舌」で発音すると書かれている。筆者は「巻き舌」とは、舌先を上側へ巻き上げる(反り返らせる)ことだと長らく思っていた。しかし、本当はそうではなくて「ルルルル」という連打するような音を出すための舌を意味するそうである。そこで、ここでは、次のように区別して書いていこうと思う。

反り上げ舌:舌先を上側へ巻き上げて(反り返らせて)発音する R。アメリカ英語によく出てくる。

ルルルル舌:「ルルルル」というように舌を震わせて連打する R。イタリア語、ロシア語などによく出てくる。なんと、これが本当の「巻き舌」というらしい。

それで実際に R はどちらで発音すればよいのかといえば、どちらでも良いらしい。英語で「ルルルル舌」なんて使ってもよいのか?と思ってしまうが、昔はそのように発音されていたらしく、間違いではないのだそうだ。さらにフランス語のように喉の奥の方で「ガラガラうがい」の要領で発音する R もある。

もちろん学生の頃は、思い切り舌を反り上げて「これがアメリカ米語の R だ!」という勢いで発音していた。しかし、ヨーロッパに行くと(彼らは英語のネイティブではないが)もっと落ち着いて発音しており、ドイツでは「ガラガラうがい」音を少し弱くしたような音だった。フランス語ほどに「ガラガラ音」にするとあまりきれいな音には聞こえないのであるが、ドイツ人が発音する「微かなガラガラ音」はきれいに聞こえる場合がある。

どこかの本に Erde(earth のドイツ語)の発音について書かれていた。16 世紀に書かれた書物の中に Erden という単語をどう発音するかが書かれていたとか。独和辞典にはカタカナ発音として「エアデ」などと書かれている。最近は R がかなり母音化してしまうのである(つまり r が「ア」音になる)。しかし、この R は G 音に近く「地面」から沸き起こってくる地鳴りのような音になると書かれていたような気がする(記憶があやふや)。Erde = 地面 と意味が重なっている。この発音がフランス語から入ってきたとしばしば書かれているのであるが、そうではなくて、中世ぐらいからすでにそのように発音されていたと書かれていたような気がする(自信がないので、また確かめてみますが、どの本に書かれていたのやら?)。

しかし、これを真似しようとすると出来なかった。レストランで赤ワイン Rotwein と言いたいが、赤 Rot のように単語の頭に R があると特に難しい。ドイツ人の発音でも「ホットワイン(熱いワイン)」か「ゴートワイン(山羊のワイン)」などと聞こえる場合がある。

いくらなんでも後者の「ゴートワイン」のように聞こえるわけはないだろうと思われがちであるが、実はこれは誇張でも何でもない。ドイツ語の話になってしまって申し訳ないが、この「R」の舌の位置は日本語のガ行を発音する時の位置に近いのだそうである。つまり、舌先が下に落ちている。これはガ行を発音する時の舌の位置と同じ。そして、舌の根本をもち上げて、喉の奥を狭くする。極端に狭くすると「G」音になってしまう。その時は「これでは反り上げ舌とは全く逆の舌先の位置ではないか」と思い、たいへん困ってしまった。しかし、また別の本には、これらは舌の奥を持ち上げるという点では共通しているのだとも書かれていた。そうなのかな?

いずれにしても、英語の「R」もガ行と同じ舌使いでやってみようと考えた。そこで、grow, green, grape など、G の直後に R が続く単語の発声を何度も練習した。舌をなるべく動かさないようにして GR の部分を発音するのである。なるほど、GR と音が続いていると、ドイツ人のような R の発音が簡単にできた。しかし、やはり Rotwein のように頭に R が来るとダメだった。

NMR の研究者でスイス人はたくさんいるが、ある有名人はものすごく「ルルルル舌」が目立つ。一度、お父様といっしょに来日されたことがあり、二人で母国語をしゃべっていたのであるが、その時も R の部分は全て「ルルルル舌」であった。まあ当然か。ミュンヘンより北部でそんな「ルルルル舌」を聞いたことがなかったので大変驚いたが、英語で発音する「ルルルル舌」もなかなかカッコ良かった。Related residual cross-correlated relaxation(関連する残余交差相関緩和)なんて、聞いてみるとすごい発音だった。しかし、ちゃんと L は正しい L の発音であり、R と L の音がひっくり返っていることはなかった。

そこで、GR 舌方式をちょっと諦め「ルルルル舌」を試すことにした。昔「(第二ではなく)第一外国語」がロシア語であったため、この「ルルルル舌」はそれほど不得意というわけではない。しかし、R がどこかに出てくるたびに「ルルルル舌」をやっていると大変疲れ、おまけに周りからは「あいつ、アホちゃうか?」という目で見られる始末。そこで、またまた調べてみると、この連打を一回だけにしてもよいとのことである。つまり、「ルルルル舌」を「ル舌」にするという意味。舌を口の上部に瞬間的に当て、一回だけ弾くのである。難しそうに見えるが、実は「カレー」の「レ」、「セロリ」の「ロ」と同じなのだそうだ。ここでびっくり。ずっと R の発音が難しいと思っていたら、なんと日本語の「ラ行」とそれほど変わらない音でも OK とは。これが上記で、R は適当に発音してもよく、むしろ L の方を注意しないといけないと書いた理由です。

もちろん、舌先が口内の上部に一回だけパチンとぶつかるので、英米のネイティブの発音とはかなり違ってくる。発音に厳しい人からすると、それはけしからんとなるのであろうが、書籍によると、昔は R をそのように発音していたのだとか。なので、同じ祖先をもつヨーロッパ言語(イタリア語、ドイツ語、スペイン語、ロシア語など)でも「ルルルル舌」が使われているのだそうである。

これの欠点?「反り上げ舌」でかっこよく見せようと思っていたのに、「ルルルル舌」で馬鹿ではないかと見られることかな。。。。まあ、しかし「ル舌」ぐらいであれば、ちょっと下手なカタカナ英語かなというぐらいの見られ方で終わるでしょう。

書籍「脱・日本語なまり」(神山孝夫著)は名著です。かなり専門的な内容でありながら、素人にも分かるような書き方がなされています。そして、著者はアメリカ発音があまりお好きではないようですので、米式発音が好き!という人は見ない方がよいかもしれません。あるいは敵だと思って読んでみると「目から鱗」になるかも。これを読んでから他の発音の本を見てみると、その多くが米語発音に偏っていることが分かります。

上記で、アメリカでは R に反り上げ舌を使い、イギリスでは無視する(「ア」のように、ほとんど母音化する)ということを書いた。しかし、堀田隆一氏の書籍だったような気がするが、次のような事が書かれていた。アメリカでもニューイングランドや南部では "今の" イギリス英語のような R 音を使う。その理由は、昔、ロンドン周辺でその発音しない R が使われており、そこからの移民が多く住み着いたためだそうである。一方、スコットランドやアイルランドでは「反り上げ舌」が使われており、そこからの移民がアメリカ西部を開拓していった。よって、R 発音の違いは英米の違いというより、もともとのイギリスでの方言の違いに由来しているらしい。その意味では、アメリカ英語はむしろ保守的で、そのため広い国土の割には方言が少ないとのことです。なるほど、アメリカ発音の方がちょっと古式で今もそれを引き継いでおり、一方、イギリス発音はその後の変化も加わって今のような発音になったんだ。。。。

まとめると、「反り上げ舌」はアメリカに残る昔の(スコットランドやアイルランドの)発音で、これが英語のすべてだとは思う必要はない。よって、中学校で英語を習い始めて「反り上げ舌」をひたすら練習し、これができないと英語ダメ人間になるなどと思い煩う必要はない(英語ができない場合の日本人の劣等感は、外国人にはまず想像できない)。難しいようならば、日本語のラ行(「カレー」の「レ」)で OK。NHK のラジオ英語講座などは昔からアメリカ英語の発音を重視しており、少し偏りがある。それが英語だと思っていると、ヨーロッパではびっくりする。むしろ、重要なのは「L」の発音であり、カッコいい英語にしたいならば、こちらを徹底的に練習すべし。

2023年12月9日土曜日

魔法の粉 ATP

今回は「口の中に ATP 試薬とゆで卵を頬張りモグモグしていると、口の中で生卵になるかもしれない?」というお話。

A. Patel, L. Malinovska, S. Saha, J. Wang, S. Alberti, Y. Krishnan, and A. A. Hyman (2017) ATP as a biological hydrotrope. 356, 753-756. DOI: 10.1126/science.aaf6846

ミオシンは ATP を分解して筋収縮を引き起こすが ATP との相互作用の Km 値は 40 μM である。まあ薬が受容体にくっつく時の強さと比べると弱いが、生体内ではこの数十 μM の Kd 値でくっついたり離れたりを繰り返す例がよく見られる(薬とは異なり、くっついたままだと逆に悪い場合もある)。それに対して 10-100 倍モル量の ATP が細胞内(~5 mM)にはある。ATP をエネルギー源として使うのであれば、Kd 値と同じぐらいの濃度があれば、それで機能するのではないかと普通は考える。

この論文では、ATP がハイドロトロープ(Hydrotrope) であると主張されている。Hydrotrope とは、低分子量でありながら、その中に親水性と疎水性の両方の部分をもち、他の疎水的な有機化合物を水溶液中に高濃度に溶解させるような特徴をもつ物質のことである。いわゆる洗剤(界面活性剤 detergent)とは異なり、hydrotrope は疎水性部分が短いので、自発的にミセルを組むようなことはない(高濃度にすると自己会合することはあるが)。しばしば ATP のように、負電荷の親水性部分と芳香環の疎水性部分とからなる(両親媒性)。ちなみに detergent などの脂質は疎水性のしっぽの長さによって、自己集合体の形が違ってくる。界面活性剤 detergent はしっぽが短めなので、集合すると小さい球形のミセルとなる。しかし、しっぽが長くなってくると、集合体の直径も長くなり大きい球形のリポソームなどになってくる。さらに長くなると、球にはなりきれずにバイセルや細胞膜のように平面状になる。これで hydrotrope がミセルのように丸くならない理由がイメージできそうである。

著者らは、ATP が細胞内濃度である 2-8 mM に達すると、アミロイドの生成、卵の熱凝縮、液液相分離(1-25 μM FUS etc. with 8 mM ATP-Mg, APPNP-Mg)などを阻害することを示した。要するに、蛋白質どうしの相互作用を ATP が邪魔するのである。これまでは ATP-dependent な酵素のせいで凝集が解けるのだろうと思われていたが、実は hydrotrope としての機能が関与している可能性が出てきた。

塩濃度は液滴に大きな影響を与えなかった(ここでは)。液滴の中には ATP が4倍ほど濃縮されていた。加齢やミトコンドリアの酸化的リン酸化の劣化により細胞内の ATP 濃度が減ると、それにより細胞内にミスフォールドした蛋白質が凝集し、流動性が制限され、病気を引き起こす可能性がある。アルツハイマー病やパーキンソン病のような多くの神経変性疾患は老齢になってから発病するが、これは歳をとるにつれて ATP 濃度が減少するからなのかもしれない。

ATP が FUS 液滴を溶かす点については、GTP も ATP と同じぐらいの効果を示した。一方、ADP, AMP については、さらに高濃度が必要であった。やはり3リン酸の部分が親水性として機能しているためであろう。ADP, AMP, GTP などの細胞内濃度は 200-800 μM であるので、ATP ほどには大きな影響をもたらさないだろう。また、リン酸部分-Mg のみでも効果はなく、アデニン芳香環の疎水性部分が要ることが分かった。

ANS と混ぜて蛍光のシフトを観てみると、hydrotrope としての効果がわかる。そこで、ATP と古典的なハイドロトロープを比べてみた結果、ATP は疎水性分子のための可溶化微小環境を作るのに、はるかに効率的であることが示された(つまり溶けにくい油性分子の周りに、溶けやすくするための粉がまぶされているような感じ。きな粉がまぶされたワラビ餅?)。

タウリンやトレハロースのようなオスモライト(浸透圧調節物質)も蛋白質の安定性に寄与しているといわれているが、FUS 液滴を溶かす効果まではない。

細胞内の ATP 濃度が必要以上に高い理由として、ATP/ADP モル比が 50 倍ほどないと、ATP をエネルギー物質として利用するための代謝がうまく機能しないからという説がある。確かに ATP から ADP に化学変化するためには、モル比として ATP が圧倒的に多くないといけない。ATP に火を点けようとしても燃えないという事実から分かるように、ATP は特に高エネルギー物質というわけではない。しかし、例えば細胞膜を隔てて高低のモル比をつけて分離してやると、ルシャトリエの法則にみられるように、それだけでエネルギーを出せる物質となる。ならば、別に ATP でなくてもよいではないかと思われるが、実はその通りであろう。そして、分解の結果でてきた PP ピロリン酸は加水分解され、ただのリン酸となって散らばってしまうため、再びルシャトリエの法則によって、ますます ATP が ADP に変化していく。少なくともこの2点により ATP が高エネルギー物質として表彰された。

細胞内には 100 mg/mL 以上の蛋白質があり(別の文献ではもっと多い)、これらが凝集しないように保たれている。しかし、老齢化して ATP が減ると、神経変性疾患などを引き起こすのかもしれない。また、蛋白質複合体が複雑な方向に進化した際、凝集の問題が浮上した。そこで、それを防ぐための物質として、生物は DNA/RNA の一部品でもある ATP を採り入れた。おりしも ATP はエネルギー供給物質としても機能しており、後から hydrotrope として採用された可能性もある。

さて、文頭の「口の中で生卵が復活するか」という話に戻る。熱で固まった卵蛋白質(リゾチームなど)の間には、パーマの後の毛髪のように、ランダムにジスルフィド結合がかかっており、これが固茹でを実現している。よって、この S-S 結合を切るための還元剤が必要であった。ビタミン C ぐらいでは弱すぎてダメだけど、まあ冗談で苺も口に頬張ると生卵になったりして。

2023年12月8日金曜日

大腸菌培養の最少培地 M9 その6

「その5」をアップしたのが 2020 年 1 月ですので、早 4 年近く経つことになる。歳とった。。

その後に、次のような論文が出ていたらしい。

M. Cai, Y. Huang, J. Lloyd, R. Craigie, G.M. Clore (2021) A simple and cost-effective protocol for high-yield expression of deuterated and selectively isoleucine/leucine/valine methyl protonated proteins in Escherichia coli grown in shaker flasks. J. Biomol. NMR 75, 83-87. doi: 10.1007/s10858-021-00357-x

同じ著者で過去にも数報が出ており、いずれも M9 培地での培養の効率を上げる内容となっている。

この論文には、D2O を 1/10 量の 100 mL に減らしながら、これまでの 1 L 培養と同じ量のタンパク質を調製するための方法が書かれている。私も「重水 100 mL 培養は良いよ」とどこかに書いたような気もする。蛋白質を重水素化して methyl-TROSY を測ると、数 μM のような濃度でも観える。したがって、15N, 13C 安定同位体の培地を 1 L 作るのと、2H, methyl 1H/13C の培地を 0.1 L 作るのとでは、コストの面でそれほど大差はなくなってくるのである(とは言え、怖くて厳密に価格を計算していない)。それでいて、分解能は 2H 化の方が圧倒的によい。

重水 M9 培地に LB (D2O) が少しコンタミするそうであるが、3% までは 1H のコンタミの点で大したことはないそうである(本当か?)。著者らは 0.1% でも、むしろ大腸菌の成長にとって十分に効果ありと言っている(ただし、transfer cross saturation 実験に使う場合には、極力 1H の混入を避けた方がよいだろう)。

以下は論文から抜粋しているが、"100 mL" 培地に対してであることに注意

α -ketoisovaleric 32 mg
α -ketobutyric acid 16 mg
[2H]-glucose 1.8 g
[15N]-NH4Cl 0.5 g
LB (D2O) 1/1,000

グルコースの量が非常に多い。我々は 2 g/L ほど入れているが、彼らはそれの 9 倍量を入れていることになる。また、15NH4Cl も、我々は 2 g/L ほど入れるが、彼らはそれの 2.5 倍量を入れていることになる。

さらに硫黄源も多い。我々は MgSO4 の形で 2 mM ほど入れている。しかし、この論文では K2SO4 の形で 7 倍量の 14 mM も入れている。では、MgSO4 を 14 mM も入れても大丈夫なのだろうか?Mg2+ が多過ぎてダメだろうか?しかし、著者らは何故 Mg2+ の量を前回の論文での 10 mM から今回の 1 mM に減らしてしまったのだろう?我々は 2 mM 入れているが、Mg が多いと何かまずいことが起こるのだろうか?来週、学生に試してもらおう(どこかで後述)

これら、グルコース、塩化アンモニウム、硫黄源は、我々の現在の仕様より何倍も多く、これらが大腸菌の増殖に効くのだろう。さらに、微量金属やビタミンミックスもちゃんと?入れている。1/1,000 の LB 混入も効くのだろう(我々は遠心して大腸菌だけを植菌しているが)。

著者らの方法により、IPTG での誘導時の OD600 は 10 に達し、100 mL の重水培地から最終的に 11 mg の精製蛋白質がとれたそうである。確かにグルコースが通常の 10 倍近く入っている。もし、とれる蛋白質量がグルコースの絶対量に比例するならば(きっとそうだろう)、納得のいく数値である。ただし、いくつかの注意点も書かれている。

ひとつは、植え継ぎをこまめにすることである。Pre-culture を main-culture に入れて終わりというのではなく、次に植えた時に 10 倍以上は薄まらないように気をつけている(図2が分かりやすい)。こちらでも、100 mL を 1L に植えると成功するのに、20 mL を 1L に植えてしまい何度も失敗したことがある。なんと何億匹もいるはずの大腸菌が一匹残らず全滅するのである。二個目の注意点はバッフル付きの大きなフラスコを使うことである。培地の量はフラスコ容量の 1/10 以下に抑えている。これはエアレーションをよくするためであろう。ただし、上にも書いたが、実験目的が transfer cross saturation の場合には、培地の攪拌によってあまり多量の 1H 水蒸気を入れたくないので、ここが難しいところである。

著者らの方法により、たったの 100 mL で 1 L 培養と同じ量の蛋白質がとれた。もちろん、グルコースの絶対量は同じであるが、2-ケト酸や重水そのものは少なくてすむ。今、日本で重水を買うと 30 万円/L(= 2,100 USドル)であるので、かなりの節約になるだろう。

2023年11月23日木曜日

つれづれ思うこと 外国語編 その1

Perl 編を 10 編ほど書いてきたが、だんだんと書くことがなくなってきてしまい、次はどうしようかと思った時、ふと同じく「言語」というジャンルで「外国語編」を書きたくなってしまった。

英語を勉強し始めてからもうかれこれ 40 年以上も経っていることに、年齢の引き算をして初めて気づいた。それほど力を抜いた訳でもなく、ちょっとずつながらも努力を続けてきた "つもり" ではあったが、「英語」は、いや「英語」もやはりダメだった。特にリスニング(昔はヒヤリングと言ったが)がダメ。年齢とともに、日本語でも細く高い声が聞き取りにくくなってきた。いつも視るテレビのデフォルト音量もこの 10 年間で確実にアップしている。ましてや、イギリス英語の1万ヘルツを超える音声ともなると、風のささやきのようにしか聞こえない。

それではスピーキングは大丈夫なのかというと、これまた怪しい。日本語でも会話の中で人の名前は7割以上は出てこない。年齢の近い友人どうしでは「あの A さん」で会話を通すことが多い。翌日になっても「A さん」の本名が出てこない。名前に限らず、頭の中にはその物体が浮かんでいるのに、それを表す名詞が出てこない。これが英単語になってくると、もっと酷くなる。

数年前に、通勤の途中で単語集でも暗記しようと奮起したことがある。しかし、前日どこのページまで進んだかすら忘れてしまう始末である。「歳をとっても暗記力は変わらない」という研究結果があるとどこかで読んだことがあるが、それは絶対に嘘である!というより、実験の仕方が悪いと固く信じている。

今、大学生ぐらいの人たちに言っておきたい。スマホを触っている時間があるなら、それを少しでも削って英語を勉強しなさい。若い時の暗記力は 30 年後の 10 倍以上はある。

とは言え、Google 翻訳、DeepL、そして ChatGPT の登場により、果たして英語を勉強する必要はあるのか?と私自身も時々ふと思うようになってしまった。英語にかける莫大な時間と労力を、もっと数学や理科(理系ならば)にかけた方が良いような気がしてきた。ほとんどの人にとって外国語はあくまでツールであり、何かを論理的に考えるための土台とはならない。

もしかすると、30-40 年後は母国語をきっちりと間違いなく書くことが最重要視され(今でもそうなのであるが)、それさえ出来れば、あとは AI を含めて情報科学が確実に正しい諸外国語に翻訳してくれるのかもしれない(逆翻訳もまた然り)。誤訳されたとしたら、それはそもそも母国語が間違えているためだと判断されるほど、自動翻訳技術が発達するかもしれない。いや、きっとそうなるだろう。

すると「英語」は何のために勉強するのか?このような思考が頭の中をぐるぐると回り、この1年間ほど自分の頭の中で結論を出せなかった。

ところで、非難轟々を覚悟でいうが、英語ができる人は恰好よく(かっこよく)見える。頭も良いように見えてしまう(実際、その場合もある)。特に学会などで、日本人がアメリカ発音でべらべらと外国人と質疑応答をしようものなら、「あれは誰だろう?」と振り返ってしまう。一方、これがカタカナ発音のしどろもどろ英語であったりすると、何の感情も起きない。これは何故だろう?同じスピードでしゃべったとしても、アメリカ発音とカタカナ発音とでは、日本人のそれに対する見方に雲泥の差があるように思う。

それでは、米語発音の中のどれが聞いている日本人に一種の羨望のような感情を引き起こさせるのだろうか?筆者は「R」と「T」の音にあるのではないかと思っている。米語では「R」は舌を上に反り返らせて発音する傾向がある。そして「T」はラ行のように発音する。例えば、water は「ワラー(& 舌反り返し)」letter は「レラー(& 舌反り返し)」という具合にである。この二つの音は日本語にはなく異質である。そこに欧米文化へのあこがれや西部劇俳優のかっこよさ等が加わり、結果として英語ペラペラの人がかっこよく見えるのではないだろうか?

かく言う私も大学生の時には、この発音にあこがれ、アクセントを徹底的に調べつつ「R」と「T」を米語式に、そして「TH, F, V, W」を native 発音に近くなるように、まるで何かにとり憑かれたかのように練習した。さらに母音では「A」を「ア」と「エ」の中間音にしたり、「O」を極端に「ア」と発音したり(top は「タップ」に)した。いずれもそれが正しいというか唯一であると思い込み、またそうすることでかっこよく見れらたかったからである。

しかし、この 10 年間ほど、今はこれらの発音を極力しないように、どちらかというとカタカナ発音に近くなるようにむしろ努力している。どちらかというと米語ではなくイギリス英語に近い発音とでも言おうか、しかし、これまたイギリス英語を発音の手本とするのではない。最終目標は、アメリカ英語、イギリス英語のどちらへにも偏らず、それでいて世界中の誰にでも間違いなく伝わるような発音である。

なぜそれを目指すようになったかは続きでおいおい語ることにするが、要は、英語はもはや世界共通語となってしまったので、どこかの国の訛に固執するのも変ではないかと思ったためである。例えば、日本国内でも大阪のテレビニュースで司会者が「ほな次行くで。さっき大阪市で火事あって電車止まってん」などと発話することはまずない。ちゃんとした標準発音でしゃべられる。これは極端な例であるが、英語でも同じように、イギリス、アメリカに特化せずに、しかし英語に共通した発音は守りつつ、しゃべることは出来ないだろうか?と思う。

しかし、もう 40 年間もアメリカ発音こそが英語と思い込んできただけに、今さら water を「ワラー」ではなく「ウォーター」と発音するのは結構しんどい。授業でも最初は標準日本語でしゃべっていても(多くの受講生はそうなっていないと主張するが、私本人はそのつもり)、授業が遅れてくるとつい「そいで電子が葉緑体の膜ん中渡ってく時に、水素イオンがどさくさ紛れで汲み出されるんや」といった調子になってしまう。その方が速くて疲れない。

発音は運動と同じで、毎日少しずつでも練習していないとすぐに口と舌の筋力が落ちてしまい、上手く発音できなくなる(若い人はまだそれほど実感はしないと思うが)。「R」と「L」をひっくり返して発音してしまうことなんてザラである。これからも練習を続けていきたい。

ちなみに、上記の「そいで電子が...」の関西弁、BARD は完全に正確に英訳してしまった。恐るべし。

アメリカ英語では I don't want to ... を「アイダナワナ」などと発音する。この音をローマ字で表記すると「aidanawana」となる。このようにアメリカ発音はローマ字でいうところの「a」音が多いような気がする。一方、関西弁もローマ字で表記すると「a」が多いような気がする。

関東弁「それでは、しないといけないですね。」
関西弁「ほな、やらなあかんやん。」

これをローマ字で表記すると
関東弁「soredewa sinaito ikenai desune」i が多い
関西弁「hona yarana akanyan」a が多い

これは偶然の一致というか、いかに口をパクパクしないで、流れるように話そうとすると、このように a 音が自然に多くなるためではないかという気がしている。よって、西部劇ではタバコを加えたクリントイーストウッドが口をあまり動かさないで「かっこよく」話す。一方、シャーロックホームズがドラマでこれをしようとすると、口からタバコが落ちてしまうだろう。

2023年10月15日日曜日

つれづれ思うこと Perl 編 その9

Mathematica が他のプログラミング言語と異なる点の中で、筆者が面白いと思ったことを紹介します。

x = 3;
y = 4;
ab = {x, y};
ab

と書くと、ab には {3, 4} という具体的な数値が代入されます。後から x や y の値を変えても ab は変わりません。これは、一般的なプログラムと同じです。ところが、

ab = {x, y};
x = 3;
ab

というように、今度は行の順番を変えてみると、一行目で ab には {x, y} という文字式が代入されます。そして、面白いことに、二行目で x や y の文字変数の値を変えると、ab も {3, y} に変わるのです。続けて、

x = 8;
ab

と打つと、なんと ab は {8, y} に変わります。ab の中の x という文字はまだ生きているのです。これは Perl などの一般的なプログラムとは異なる点です。

詳細は Mathematica の「遅延割当」という項目をご覧ください。

これは Mathematica が数値計算だけでなく数式処理もできるためですが、いま大変重宝しています。例えば、ある時は数値計算を、またある時には数式処理をしたいとします。いずれにしても、ab = {x, y} のような公式にあたる箇所を先にプログラミングで組み立てておきます。もし、数式処理をしたければ、これでそのまま数式での答を得ることができます。

一方、数値計算をしたい場合には、ここに具体的な数値(たとえば、x = 8)を代入すれば数値としての答を得ることができます。次に x = 4 の場合を計算したければ、続けて x = 4 を実行するだけです。Mathematica は Jupyter のように使うことができるので、二度も ab = {x, y} を実行する必要はありません。実は、再び ab = {x, y} を実行してしまうと、ab は {8, y} となってしまい、もう x = 4 のケースを計算できなくなってしまいます。

上記のような書き方は数値計算に特化されていないので、実は余計に計算時間がかかってしまうのですが、いろいろな数値を入れて答を比べてみたい時には助かります。

よって、次のような計算もできます。

d = e;
e = f;
f = 8;
d

d を表示させると、8 になっています。
これは、普通のプログラミング言語とは行の順番が真逆です。

ややこしくなりますが、次のような配列を含む演算でも同じことが言えます。

blist = alist; (* 先に変数を結び付けておく *)
alist = {2, 4, 6, 8, 10}; (* そして alist に偶数の配列を代入する *)
alist (* 試しに alist を表示 *)
{2, 4, 6, 8, 10} (* もちろん alist は偶数の配列 *)
blist (* そして blist も表示 *)
{2, 4, 6, 8, 10} (* blist も同じ偶数の配列 *)

alist[[3]] = 100; (* それでは alist の3番目の要素に 100 を代入 *)
alist (* を表示させてみる *)
{2, 4, 100, 8, 10} (* ちゃんと3番目の要素は 100 に変わっている OK *)
blist (* それでは blist は? *)
{2, 4, 100, 8, 10}

先に blist = alist のように公式を組み立てておくと、このような結果になります。

Perl ではこのような行の順番で書くことはできませんので、下記のように上の行から下の行へと水が流れ落ちるように書くことになります。

#!/usr/bin/perl

@alist = (2, 4, 6, 8, 10);
@blist = (1, 3, 5, 7, 9, 11);
@blist = @alist;
$alist[2] = 100;
print "alist = @alist\n"; # 2 4 100 8 10 と表示
print "blist = @blist\n"; # 2, 4, 6, 8, 10 と表示

以上より @blist = @alist という表現では、alist のコピーが blist に複写されているようです。つまり、alist の先頭アドレスが blist に代入されたわけではありません。

しかし、次のように書くと、

#!/usr/bin/perl

@alist = (2, 4, 6, 8, 10);
@blist = (1, 3, 5, 7, 9, 11);
$blist = \@alist;
$alist[2] = 100;
print "alist = @alist\n"; # 2 4 100 8 10 と表示
print "blist = @$blist\n"; # 2 4 100 8 10 と表示
print "blist = @blist\n"; # 1 3 5 7 9 11 と表示

$blist には @alist の先頭アドレス(レファレンス)が入り、それとは別に @blist の配列そのものはちゃんと維持されるようです。

話が急に配列そのもののコピーか、それともアドレス(参照)のコピーかに飛んでしまいましたが、Perl, Python, JavaScript とごちゃまぜに書いていると、いつも分からなくなって困ってしまう点です。どこかに比較対照表のようなものをまとめたブログはないでしょうか?

おそらく Python では次のようになります。

a = [1, 1]
b = a
a[1] = 2
print(b) #[1,2]が表示される

多くの HP には「数値はイミュータブル(変更不可)、一方、リストはミュータブル(変更可能)」などといった説明が載っており、それはそれなりに説得力があるのであるが、Perl と比較しながら理解しようとすると混乱してしまいます。上記の Python は、いわば C 言語でいうところの、配列名はその先頭アドレスを表すという概念と似ています。

Python でリスト(配列)そのものをコピーするには、
b = copy.copy(a) # 浅いコピー
としないといけないようです。二次元以上の配列になってくると、またちょっと複雑。

b = copy.deepcopy(a) # 深いコピー
を使わないといけない。

一方、Perl では
@blist = @alist;
と書くと、配列そのもののコピー(複写)になることに注意しないといけません。

Mathematica でも同じ複写ですが、blist = alist を先に書いてから、後で具体的な数値の配列を alist に入れるという方式をとると、これはアドレス渡しのように振る舞うことになります。

いや~もう疲れた。もう JavaScript まで行きたくない。が、ついでだ!思い切ってやってみよう。もう混乱してきたので、詳細は他の情報源に譲ることにして要点だけ。

JavaScript の配列では参照渡しとなるようです。配列を値渡しに(複写)するには、slice や concat の引数なしを使うようです。

var arr1 = [0, 1, 2, 3, 4];
var arr3 = arr1.slice();

ということは C 言語と似ているということ?

C 言語では、配列名は先頭アドレスを指しますよね。
なので、b = a の後で、a の中身を変えると、b も変わって見える。

C 参照渡し
a[3] = {1, 2, 3};
b = a;

Python 参照渡し
a = [1, 2, 3]
b = a

JavaScript 参照渡し
a = [1, 2, 3];
b = a;

Perl 値渡し
@a = (1, 2, 3);
@b = @a;

ただし、$b = \@a; のように、b をポインタ変数のように使うことも可能。この場合は、それ以降 @$b の形で配列 b を使う。「\」は、C 言語のアドレス演算子「&」と似ている。

Mathematica 1 値渡し
a = {1, 2, 3}
b = a

Mathematica 2 参照渡し
b = a
a = {1, 2, 3}

こうして見てみると、Python は、まあ C と似ているのかも。
Perl や Mathematica がむしろ異端児なのか?

以上は一次元配列での話でしたが、NMR データのように二次元配列の場合、配列のコピーはどのようになるのでしょう?おそらく C 言語では memcpy を使う?

もう限界なので、ここでやめておきます。

2023年9月26日火曜日

つれづれ思うこと Perl 編 その8

では次に、最近少しは慣れてきた Mathematica について書いてみたいと思う。おっとまずい、どんどん Perl の話題から遠ざかっている。両者の間に何か関連はないだろうか?

このソフトは高価なのですが、無料で楽しめる方法が少なくとも2つあります。一つは、Raspberry pi です。これに Mathematica を無料でインストールできるのです。その代わり速度は遅く、10 倍ぐらいの処理時間がかかってしまうかもしれません。Mathematica は購入しても一つの PC にだけしかインストールできない仕組みになっています。そのため、筆者も家では Raspberry pi にのんびりと計算をさせ、翌日に職場の PC で本格的に計算させていました。Raspberry pi の OS には 32-bit と 64-bit があり、Mathematica は前者にだけインストール可能でした。しかし、今 HP を見てみると、2023/May からは 64-bit でも使えるようなことが書かれています。64-bit 版ですと、メモリーを 8 GB などと積めるので、Mathematica の動きも速くなるかもしれません。まだ試したことがないので、時間の空いた時に試してみたいと思います。

もうひとつ無料で楽しめる方法は、Jupyter lab を使う方法です。実は Mathematica という名前が指しているのは GUI 部分(という表現は変ですが)のことで、実際に計算しているコア部分は Wolfram-engine と呼ばれています。その engine 部分が無料で PC にインストールできるようになりました。すると、Windows のコマンドプロンプトなどから、計算を打ち込むことができます。しかし、いくらなんでも、これは使い勝手が悪い。そこで engine を Jupyter lab につなげると、ちょうど Python を Jupyter lab で操作するのと同じように Wolfram-engine を使うことができるようになります。もちろん Mathematica の方がインターフェースとしてはよいのですが、この Jupyter lab は Mathematica とよく似ているので(というより、Mathematica を見本として作られた?)まずまずのことができます。なお、計算能力は全く同じです。Mathematica ではできて、Wolfram-engine & Jupyter lab ではできないということはありません。今、家では Raspberry pi をやめて、この第二の方法を活用しています。Jupyter lab の上では、グラフをマウスで拡大したり回したりはできないのですが、これもコマンドベースで命令すればできますので、まあなんとかなります。PDF に出力させれば、論文用の高分解能の図も作れます。

この Mathematica は Lisp と呼ばれる言語で作られているらしく、いわゆる関数型言語に分類されるそうです。関数型が何かという専門的な部分は、私にはよく分かりません。使い始めてちょっと驚いたのは、例えば次のような IF 文です。

y = If[x < 0, -x, x]

これを普通?の言語で書くと、

if ($x < 0)
{
    $y = -$x;
}
else
{
    $y = $x;
}

となります(むりやり Perl にしてしまった)。。。

これだけだと特に変わった言語のようにも見えないのですが、もし、else 文の中に複数の行があると、次のようになります。「もし x が負の数ならば -x を y に代入する。逆に正の数ならば、x に 3 をかけて平方根をとり、これを y に代入する。」

y = If[x < 0, -x, z=x*3; Sqrt[z]]

よって、"z=x*3; Sqrt[z]" の部分がまとまって、まるで If 文の第三引数であるかのように振る舞うのです。この時の「;」が重要で、これで "z=x*3" と "Sqrt[z]" の二つが繋がって、あたかも一つの引数であるかのように振る舞います。よって、"Sqrt[z]" の後にまで「;」を付けてはいけません。もし付けてしまうと、もう一つ後ろに何らかの表現が続くことになってしまいます。

さらに、If 文が最終的に Sqrt[z] を返してくる、そして、それが y に代入されるという点も興味深いところです。このように If 文そのものが関数となっているわけです。Excel の =If もそうなっていたような気がする。

筆者は、どうも C, Perl などの癖が出てしまい、Mathematica でも以下のように書いてしまいます。各文末の「,」や「;」に気を付けないといけませんが、これですと一般的な手続き型言語に似た構文となります。ここでも Sqrt[z] の後に「;」を付けないように気をつけないといけません。

(* の箇所はコメントとして無視されます。 *)

If
[
    (* if *) x < 0,
        y = -x,
    (* else *)
        z = x*3;
        y = Sqrt[z]
]

このように If も For も全てが関数として作られており、この関数の引数の中に別の、あるいは同じ関数を入れ込むことができます。この「引数の中に関数を書く」という操作をどんどん繰り返していくと、入れ子(ロシアのマトリョーシカ人形)のようになります。そんな構文を何に使うのかというと、漸化式です。Mathematica においても For 文を使わずに、この漸化式(数学的帰納法)のコンセプトで書く方法があるそうですが、私にはとてもできません。筆者の知っている人で OCaml が大好きという方がおり、何故かと尋ねたところ、一つの理由はこの関数型にあるのだそうです。

2023年9月16日土曜日

つれづれ思うこと Perl 編 その7

まだ Python の NumPy の存在に気づかなかった 2000 年代前半の頃、Octave という名の数値計算用ソフトがあることを知り使い始めました。これは便利で、今まで Perl などを使って書いていた面倒な数値計算が、たいへん簡単に行えるようになりました。Octave では「for 文を使ったら負け」という表現がよく出てきます。つまり、行列の計算などをする際に、できるだけライブラリの関数を使うようにせよということです。そうすると高速で演算できるのですが、それを安易にうっかり for 文を使って行と列の要素をひとつずつ繰り返しながら計算しようものなら、たいへん遅くなってしまいますよという意味です。よって、たえず「この計算は行列の演算に置き換えることはできないだろうか?」と考えながらプログラミングする癖がつきます。この考え方は、特に Octave に限らず、NumPy でも Mathematica でも同じですね。

NMR では数値シミュレーションだけでなく、数式処理も時々必要になってきます。3+4=7 のような数値計算ではなく、cos^2(wt)+sin^2(wt) = 1 のような計算が数式処理です。ω や sin, cos などを残したまま計算するのです。これが出来るのは限られた幾つかのソフトだけで、有名なのは Maple と Mathematica です。幸い、前にいた職場にはキャンパスライセンスがあったので、両者とも個人的には研究費を払わずに使うことができました。それで、Maple の HP を見てみると、モミジが描かれており、赤毛のアンを連想させるような雰囲気の中で、メープルシロップのたっぷりかかったモミジ型のお菓子(お土産で有名ですが、これおいしい!)の連想も手伝って、何も迷わずにこれの DVD を取り寄せました。

ちなみに、こうして自分の過去を思い返してみると、書籍の表紙に描かれている動物が可愛いかどうか?あるいは、連想させる食べ物がおいしいかどうか?でその後に使うプログラミング言語を決めてきたようなところがあります。ちゃんと情報教育を受けてきた人は、もっと理論的な考えでもってツールを選ぶものですが、生物という全く異なる分野の教育しか受けたことのない人間は案外、雰囲気というもので重要なことを決めてしまっているのかもしれません。もちろん Raspberry-pi 大好きです。そして Strawberry-Perl を愛用しています。これもフルーツ系の食べ物です。Red-Hat は嫌いで、ペンギンの描かれた Linux 系が好きです。ソフトに限らず、何か製品を開発していく人は、そのような雰囲気や感情で物事を決めていく人間もいるということを知り、ちょっとネーミングや宣伝を工夫してみると大当たりしてしまうかもしれません。もし、Raspberry-pi が Blue-Hat というような名前で、ギャング(やくざ)が青い帽子をかぶったような絵がイメージキャラクターだったとしたら、小中学校で教育用として人気を博すことはまずなかったでしょう。

数年間ほど楽しんで Maple を使っていたのですが、ある時、NMR の HSQC をシミュレーションしようとして動かしたところ、超複雑な答が 100 行ぐらい吐き出されてくるのです。理想的には Ix という二文字で終わりのはずなのですが。。。これは数式処理でしか起こらず、しかも全く同じ計算をしているのに 10 回に 1 回ぐらいしか出現しない。どうして変な答がたまに出るのかが分からず、また半年ほどあれやこれやと悩んだのですが、最終的に分かったことは、exp(i H t) の計算がうまく行っていないということでした。どこかで書いたと思うのですが、この H は行列で (i H t) の固有関数と固有値がピタッと数式処理で出れば exp(i H t) の計算は超簡単になります。しかし、この行列の対角化ができないと判断されれば、テーラー展開に切り替わるのです。しかし、テーラー展開の答はあくまで近似値にすぎません。HSQC の数式シミュレーションでは途中で多数の項が出てきますが、それらは位相回しによって最終的にはほとんどの項が打ち消され簡単な答だけが残るのです。まさに三角関数の加法定理などが式の簡略化に使われます。しかし、近似値どうしでは、この最後のキャンセルが完全な0にならないわけですね。そして、結果として多数の大小変な項が残ってしまうのです。

これを Maple の開発部門に伝えたところ、先方でも再現されバグであると認めてくれました(認められて嬉しいのやら、逆に計算できなくなって悲しいのやら)。それでバグが修正されるのを待っていたのですが、その間に筆者が今の職場に異動してしまいました。ところが残念なことに、ここはキャンパスライセンスがないのです。もしかしたら、もうバグが修正されているかもしれないのですが、25 万円を払って購入し、それを確かめるのも勇気がいり、もしかしたら開発部門から「バグを見つけてくれたので感謝料として、あなたには Maple パックをモミジ型お菓子とともに無料進呈いたします!」みたいな知らせが来ないかな~などと期待していました。しかし、こちらから不躾にそんな要求をするわけにもいかず、泣く泣く Maple を断念しました。それで、なんだか変な狐が描かれた Mathematica を買うことに。今だに Mathematica にはあまり慣れず、Maple が恋しいのですが、キャンパスライセンスがない大学では仕方がありません。頑張って Mathematica に慣れることにしました。

Maple はシンタックスが C 言語とちょっと似ているので、C, Perl, Python などを知っている人にはとっつきやすいと思います。GUI もきれいで、ずっと使い続けたいソフトの一つです。いずれにしても、Mathematica と Maple という二大ソフトが競争してくれるお陰で、ともに開発が進み、価格も(高いとは思いますが)25 万円で済んでいるのでしょう。そして、幸いにもキャンパスライセンスのある大学の人はどんどんこれを利用して、自分を教育すべきです。筆者は高校の時から数学があまり得意ではなく、その所為もあって数学とはもっとも無縁の学科を選びました。しかし、不得意であっても腐らずに勉強していれば、上記のような優秀なソフトが数学の不得意部分を補ってくれます。例えば、上記で exp(i H t) を書きましたが、本当に賢い人は、これを紙と鉛筆だけで対角化して計算し、HSQC などをさっとシミュレートしてしまいます。私にはそれがとても出来そうにないので、ソフトの計算力を借りるわけです。