2022-08-28

Pythonは流行り過ぎか?

Webで見かけた「プログラミング言語はファッションか、流行でしか技術を見ない人々」という記事の中に次のような文がありました。

プログラミング言語でいうと「ここ数年、記事でPythonを持ち上げすぎではないか」と感じている。


「持ち上げすぎ」と表現するかどうかは別にして、書籍でも、Web上の記事でも、Pythonの話題が多いとは思っていました。

 

ウィキペディアによるとPythonが登場したのは1991年との事ですが、Perlが1987年に、Rubyが1995年に登場しています。ほぼ同時期と言えると思います。1990年代から2000年代初め頃までは、Perlが全盛だったような気がします。その頃でもPythonを利用しているユーザがいなかった訳ではありませんが、好きな人がいない訳ではないマイナーな言語という位置づけだった気がします。それに比べると、Perlは皆が使っているメジャーな言語という感じでした。ところが今や、Perlには見る影もなく、猫も杓子もPythonという有様です。

 

Pythonに限らず、何か特定のプログラム言語であるとか特定の技術などが流行の最先端になるのは昔からよくあります。流行にのってしまえば、雑誌でも特集が組まれたり、続々と新規に書籍が出版されたり、Web上に記事が溢れたりしますので、入門しようとする初心者が列をなすことになります。

 

記憶がおぼろげですが、Perlが話題になり始めた頃に今はなきUNIX magazineで「Perlは、シェル、sed、awkなどを寄せ集めたような言語だ」と指摘した記事を読んだような気がします。Web上で「#019 私とプログラミング言語(後編)」という記事を見つけましたが、同様の事を指摘しています。その当時は「Perl、最高!これがあれば、もう他には何もいらないよね!」みたいな言われ方をしていたのに、いつの間にやら「Perl?それ何?やっぱりPythonでしょ!」みたいに世間ではなっているのは、いったいどうしたことでしょう。

2022-08-21

シェルスクリプトに「dry run」機能を持たせる方法

ちょっと複雑な機能を持つシェルスクリプトを作成する場合、いきなり実行させて大失敗になるのは問題です。場合によっては、スクリプト自身を書き換えてデバッグ情報を出力させて動作を確認し、うまくいくことが確認されたら、デバッグ情報を出力している箇所を削除したりコメントアウトしたりして対処するという方法が考えられます。しかしこの方法では、デバッグするたびにスクリプトの書き換えを伴うので、デバッグに関係ない箇所まで書き換えてしまう可能性があり、あまりスマートではありません。

 

シェルスクリプトでデバッグをおこなう際のテクニックはいろいろあり、Webを検索すれば「シェルスクリプトのデバッグ」のような情報がみつかります。ここで注意しておきたいのは、何度実行しても差し支えないようなコマンドなら気にする事もないのですが、システムに永続的な影響を及ぼすようなコマンド(ファイルを作成したり、削除したりするなど)を実行する場合は、気軽に何度も実行できないという事です。どのようなコマンドが実行されようとしているのかを確認する仕組みが必要になります。このような機能を「dry run」と呼ぶことがあります。


例えば、単純な例にはなりますが、foobarコマンドを実行しようとするスクリプトがあるとしましょう。このコマンドを実行してしまうとシステムに永続的な変更が加えられてしまうので、デバッグ中に気軽に実行するわけにはいきません。しかし思わぬバグが潜んでいるかもしれませんから、シェルスクリプトの中で本当にfoobarコマンドを呼び出しているのか確認しておきたいところです。このような場合に手っ取り早い方法は、コマンドの前にechoをつけておくことです。「foobar」ではなく「echo foobar」としておけば、コマンドが実行されてしまうことは防げます。


デバッグが済み、シェルスクリプトが完成したと「思った」ら、そのechoを削除すれば万々歳かもしれません。ところが不運なことに、思わぬバグが発見され、再びechoを入れなければならない事態に陥ったとしましょう。デバッグが済めば再びechoを削除できますが、もう今後一切バグが発見されないという保証はありません。その度にechoを入れたり外したりするのは、あまり良い方法ではありません。

 

このような問題を解決する方法として、変数名はなんでも良いのですが、「DRYRUN=echo」のような定義をすることです。そして「echo foobar」とする代わりに「$DRYRUN foobar」とするのです。もし変数が定義されていなければ、$DRYRUNは空ですから、「$DRYRUN foobar」は「foobar」になります。もし変数が定義されていれば、「$DRYRUN foobar」は「echo foobar」になります。こうすることで、変数定義をするか否かだけに注意すればよいので、スクリプトを書き換える際の手間が減ります。さらに変数定義をシェルスクリプトの外部からコントロールしたり、他の方法もありますが、うまく制御することで、シェルスクリプトの書き換え自体を無くすことも可能です。


上述したテクニックがあれば万事解決かと言うと、実はそうでもありません。例えば、awkやsedで、もしくはpythonでも何でも良いのですが、コマンド列を生成し、それをシェルに渡すことで何らかの処理をおこなう場合、単純に「DRYRUN=echo」という定義があっても、あまり役に立たないのです。

 

具体的に、つぎのような場合を考えましょう。パイプの前段のawkで何らかのコマンド列を生成し、それを後段のシェルで実行させようとしています。

awk '何らかのawkスクリプト' | sh

 

ここでawkの処理が万全なら良いのですが、もし不具合があったとすると、いきなりシェルで実行させるのは憚られます。そこで確認のために、以下のようにしたいところです。

awk '何らかのawkスクリプト' | cat

 

もし問題ない事が確認できたら、catをshに変更して、実際に実行をするというのが意図です。しかしそのためにシェルスクリプトを書き換えるのは、スマートではないわけです。この問題を解決するために「DRYRUN=cat」と定義してみましょう。そしてシェルスクリプトでは次のように記述します。こうすることで、もしDRYRUNという変数が定義されていれば「${DRYRUN:-sh}」はcatになります。もしDRYRUNという変数が定義されていなければ、「${DRYRUN:-sh}」はshになります。これで問題は解決できそうな気がします。若干アクロバット的かもしれませんが。

 awk '何らかのawkスクリプト' | ${DRYRUN:-sh}

 

ここで最初の問題に戻ります。「DRYRUN=echo」だった筈の定義を「DRYRUN=cat」に変更してしまった訳ですから、「$DRYRUN foobar」が「echo foobar」ではなく「cat foobar」になってしまいます。これでは最初の問題が解決できません。ここで変数名を別にするという解決策もあるかもしれませんが、アクロバット的ですが、「${DRYRUN:+echo} foobar」でも良いのではないかと思います。こうすればDRYRUNという変数の中身が何であろうと、「echo foobar」になってくれます。

2022-08-15

日本人の名前における「ロシア人の名前と愛称」

ロシア語では、『入門者および初級者のためのロシア語文法ハンドブック四訂版』によると、「遠慮の要らない間柄の人(家族、友人など)に対しては、愛称で呼ぶのが一般的である」ようです。例えば「Александр」(アレクサンドル)なら「Саша」(サーシャ)になるようです。


何故「アレクサンドル」の愛称が「サーシャ」になるのか謎なのですが、それは良いとして、日本人の場合はどうなるのでしょうか。厳密には「日本人にはロシア人のような愛称はありません」という事で済む話だと思います。しかしロシア人からすると、「親しくなったからには愛称で呼ばないと落ち着かない」という感覚もあるのではないかと思います。もしかすると、「愛称がないんだったら、俺がつけてやるよ」みたいな有難迷惑なことを言い出すロシア人だっているんじゃないかと思います。

 

日本人の名前が、いったいどのようなロシア的な愛称になるのか、興味津々です。

日本人の名前とロシア語における格変化

NHKラジオ第2で放送されている「まいにちロシア語」の2022年5月30日の第22課では、ロシア語の名詞・代名詞における格変化を解説しています。テキストの「ミニトピック」でも次のように書かれていますが、日本人の名前がロシア語で格変化するとどうなるのか気になります。

日本語を母語とする皆さんにとっては、人の名前が変化してしまうのは驚きかもしれません。


例えば女性の名前「Нина」は、次のように格変化するようです。

  1. 【主格】Нина
  2. 【対格】Нину
  3. 【生格】Нины
  4. 【与格】Нине
  5. 【造格】Ниной
  6. 【前置格】Нине


このような格変化を、例えば日本人男性「太郎(Taro)」とか日本人女性「綾香(Ayaka)」は、どのようになるんでしょうか。格変化した名前は、日本人の感覚からすると、自分の名前とは感じられないような気がします。

摂氏と華氏

日本では温度単位が摂氏を使います。世界的にも温度を摂氏を用いる国が多いと思いますが、アメリカなどでは華氏を使います。両者は、変換式で換算できるので、測定値をどのように表現するのかというだけの問題とも言えます。

 

日常生活で温度が関わるのは、気温や体温を表現する場合が多いと思います。例えば、日本の夏では、25℃以上を夏日、30℃以上を真夏日、35℃以上を猛暑日と呼んでいます。また冬期であれば、氷点下になるかならないかが、日常の会話でよく言及されます。もし日本で華氏を使っているとしたら、夏日は77℉以上、真夏日は86℉以上、猛暑日は95°F以上ということになります。77℉とか86℉とか、中途半端な数値だなぁと感じます。

 

また体温としては、日本では37℃で平熱か否かを区分していますが、華氏にすると98.6℉という、これまた中途半端な数値になってしまいます。37℃という値に大きな意味があるわけではないと思いますが、日本が華氏を採用していたら、98(=36.67℃)では低いでしょうし、99℉(=37.22℃)が妥当かとは思いますが、切りが悪いからいっそのこと100℉(=37.78℃)ならばスッキリしそうです。

 

 同様に気温でも、0℃というのは32℉ですが、現実問題として0℃前後の小数点以下の値が変化したところで、体感が大きく変わるわけでもありません。そうであれば、30℉(=-1.11℃)や35℉(=1.67℃)で区切っても、日常生活の話題としては大同小異ではないかと思います。

GNUSの日本語マニュアル

ふだんのメールを読むのにはFreeBSD上のemacsGNUSを利用しています。以前はWanderlustを利用していましたが、数年前にGNUSに変更しました。GNUS自体は、かなり前にネットニュースを読んでいた頃に利用したことがあります。しかし新しいバージョンのGNUSになってからは利用していなかったので、使いこなすには難がありました。

 

GNUSの公式サイトには詳細なマニュアルが置いてあるのですが、英文しかないので、読んだ方が良いと思いつつも、二の足を踏んでいました。ところが日本語訳されたマニュアルが存在していることが、ひょんなことから気づきました。GNUSのマニュアルは500頁弱ほどもある大部なものなので、英語で読むのは辛く、日本語訳があると助かります。

 

実は、メール送信は、GNUSでも出来るはずなのですが、設定がうまくいかず、Mewを使っています。日本語訳のマニュアルを熟読して、なんとかGNUSでメール送信ができる環境を作りたいと思っています。


カーラー

カーリングをする人のことを「カーラー」と呼ぶようです。ゴルフをする人は「ゴルファー」と呼ばれますし、ボーリングをする人なら「ボーラー」です。もっとも、「カーリング(の)プレーヤー」とか「ボーリング(の)プレーヤー」と呼ばれることが無い訳ではありません。しかし野球では「ベースボーラー」とは言いませんし、テニスでも「テニサー」 とは言わないと思います。

 

これらの競技は外国由来ですが、日本由来の剣道とか弓道などは、間違っても「剣道ヤー」とか「弓道ヤー」と呼ばれることはないでしょう。外国由来の「フェンシング」や「アーチェリー」が何と呼ぶのか気になるところです。


あらゆるスポーツは「何々のプレーヤー」と呼べると思いますが、一部に「何々ヤー」と呼べる例外があるように思います。何故かという問いには、そういう習慣だからという答えしかないのかもしれません。