Not only is the Internet dead, it's starting to smell really bad.:2021年02月分

2021/02/09(Tue)

[Windows][I18N] Windows 10 の国際化についての違和感 (その4)

以前 Windows 10の国際化についての違和感という記事をほとんど本題に入らないまま途中まで書いて放置してたんだけど、ここで挙げた「漢字ファイル名によみがなは無い」問題はわりと初期の大規模アップデートで修正されている。 昔のこと過ぎてどのバージョンかまでは失念したが、おそらくRS2と呼ばれてた1703(17H1)あたりだったと思う。

それでは私は読めなかった難読名字(オタクはなぜか読めるらしいが理由は知らない)を使ったサンプルをみてみよう。

このとおり「 小鳥(ことり)」と「 小鳥遊(たかなし)」が区別できてるし、意地悪で入れた「小鳥/遊び」も文節で分かち書きできているようだ。 おそらくMS-IMEの再変換機能を使って漢字のよみがなを取得する処理を無理矢理実装したんだろーなーとまでは予想できる。

しかし人名辞書のせいでちょっとおもしろい事になるケースをみつけた。

まず最初のパターン、「金」という姓を持つ人名を使ったサンプルなのだが

とよみがながブレるのだよね。

ちょっと考えればこれは単純な話で、MS-IMEの辞書の元となったコーパス(おそらく新聞とか)の頻度統計で優先順位が決まってるんだろうと判る。 つまりこのブレってのは1998年の 金大中(キム・デジュン)氏の大統領就任より1973年の 金大中事件(きんだいちゅうじけん)の方が日本でより大きく報道されたという歴史的経緯ということだ。 日本の報道ルールで日本語読みでなく現地の発音を尊重するようになったのは90年代くらいだっけか、オタクじゃないので以下略。

南北でルール変えてるのかなという仮説も最初考えたんだけど、これは金泳三を例として追加したことで否定できた。 というかこれ本当は「金大中/(氏)」と「金大中/事件」で読み方変えなきゃいけないんじゃねーので辞書の不備だよなぁという気がする、まぁ重箱の隅だけどさ。

そんでこっからがそんな細かい話でなく本題、最後の一文字削って「金大」「金泳」「金日」という非人名のフォルダを作ると途端に意味不明の挙動を示すようになるのよね。

つまり

と解釈されるもよう、最初は金大で人名登録されてるのかと思ったけど、そういうわけではないっぽい。 つーか金大(金沢大学)困るよね、いや困らんか別に。

どうしてこうなったかを考察すると、金大と金泳は人名辞書との部分一致以外の他に候補が無いから「キム」、金日は曜日と解釈され「金/日」と文節で分かち書きされ「きん」なのかなぁと。でもそれだと金大は頻度優先によって「きんだい」になるはずなんだけどねうーんわからん。

ともあれ無理矢理な実装はこうやってボロ出ちゃいますね、まぁ実用上はこんなもんで十分かもしれんが。

ちなみに日本史の教科書で名前だけ知ってる金玉均はMS-IMEの登録が「きんぎょくきん」のみで「キム・オッキュン」が無いようなのできんた以下略

[Windows][I18N] Windows 10 の国際化についての違和感 (おまけ)

前記事で不採用にした画像に懐かしいコピペを添え供養しておく。

49: ID:oEohd0gg0
レンタルビデオ屋に、頭文字Dのビデオ借りに行ったんだけど 「か行」探しても全然ないんだよ
で、レンタルビデオ屋のアホ店員が「あたまもじD」って読んでるんじゃね?と思って
「あ行」を確認したらマジで置いてあってビビったわwww

ほんと日本語の自然言語処理って難しいね、 頭文字(イニシャル)Dの続編はMFゴースト、 init.d(SysVinit)の後継はSystemDなどという知識すら必要になるのだ(なってない)。

2021/02/13(Sat)

[自宅システム管理者] HP Microserver N54LにNICを増設する

うちのファイルサーバーであるHP Microserver N54Lにはまだ長生きしてもらわんと困るのだが、ネットワーク周りはせめて増強せんとなーと以前 悩んでたのだが、なんせ空きスロットがPCI Express 2.0 x1しかもロープロ縛りなのでろくな選択肢が無く困ってしまってワンワンワワン。

結局その時は中古で0.8kのBroadcom Nextreme II(BCM5722) Single Port Adapterを増設し、オンボのNC107i(BCM5723)とチーミング組むことで妥協してしまった *1。 ただBCM5722/BCM5723ってジャンボフレーム非対応だったりいろいろと不満はあるのよね。

それから何も良いこと無かった2.5年間だけど、今ならば🦀Realtek RTL8125🦀すなわち

 \ ̄\                 / ̄/ 
/l  \  \             /  / lヽ  
| ヽ  ヽ   |             |   /  / | 
\ ` ‐ヽ  ヽ   ●      ●  /  / ‐  / 
  \ __ l  |  ||___|| /  l __ / 
     \  \/       \  / 
      /\|          |/\ 
    //\|          |/\\  
    //\|          |/\\   
    /   /\_____/\   \ 

採用の怪しげな中華2.5GbEカードが2.5~5kほどで売られてるのよね( これとか)、ははーんこれが流行の最先端と噂の #クラブハウス ってやつだな?

レビューだと実測2.4Gbpsくらい出てるそうで、発熱やドライバの安定性など気になる点はあるけど将来的な乗り換え先として有力候補やな。 とはいえまだ対応スイッチの選択肢があまり無いのがな、安くなってきてるとはいえ。

そういや別の 過去記事でHP Microserverにおあつらえ向きの

なNICにHP NC332(BCM5720)という製品があるけど中古のタマ数が少なくかつ高いと書いたのだが、こちらの 海外記事のようにHP NC360T(Intel 82575)のx4スロットをガリガリとx1に削って改造しちまう手もあるんだな、こっちなら中古も潤沢でせいぜい1~2kで入手できる。 ちゃんとx1に改造しても帯域出るならこれはアリやな。

つかわざわざ改造せんでもIntel Pro/1000 PT Dual Port Server AdapterのコピーキャットだけどPCI-E接続だけx1に設計変更したような 怪しげな中華メーカー品が2~4kで売ってたりもする、まぁ謎メーカー製品とHP純正を自分で削るのどっちが信頼性が高いかは知らん。

単にイーサーネットのポート増やしたいだけならUSB3.0カードを増設してそこにUSB-Ethernet変換ドングルを刺してもいいのだけどね、その方がリムーバブルドライブ使いたい時とかに便利ではある。 ただ安定してチーミング組みたいとかドライバのご用意されてないVMware ESXi使いたいとかだとUSB-Ethernetは論外なのだが。

ちなみに USB3.0 + 1GbE Comboなんて怪しい製品みつけたけど、こいつはVLI VL805に🦀Realtek RTL8153🦀がぶら下がってるだけなので、USB3.0カード増設してそこにUSB-Ethernet刺してるのと同じやなこれ。

*1:必ずNC107i用の HP Broadcom 1Gbドライバーはあらかじめアンインストールしておくこと、でないと増設したNextreme IIの方はOS標準のInboxドライバを使おうし、バージョンの異なるカーネルドライバを同時に読み込もうとしエラーになる。

2021/02/18(Thu)

[pなんとかsrc] lang/php7[34]でビルドエラー

うーんwww/php7[34]がビルド通らないのだけど、いまどきPHPなんか使う人おらんから気づかれないのだろうか。

/usr/pkgsrc/lang/php73/work.x86_64/php-7.3.27/ext/standard/net.c: In function 'zif_net_get_interfaces':
/usr/pkgsrc/lang/php73/work.x86_64/php-7.3.27/ext/standard/net.c:292:40: error: 'IFF_BROADCAST' undeclared (first use in this function); did you mean 'SO_BROADCAST'?
  292 |                        (p->ifa_flags & IFF_BROADCAST) ? p->ifa_broadaddr : NULL,
      |                                        ^~~~~~~~~~~~~
      |                                        SO_BROADCAST
/usr/pkgsrc/lang/php73/work.x86_64/php-7.3.27/ext/standard/net.c:292:40: note: each undeclared identifier is reported only once for each function it appears in
/usr/pkgsrc/lang/php73/work.x86_64/php-7.3.27/ext/standard/net.c:293:31: error: 'IFF_POINTOPOINT' undeclared (first use in this function)
  293 |               (p->ifa_flags & IFF_POINTOPOINT) ? p->ifa_dstaddr : NULL);
      |                               ^~~~~~~~~~~~~~~

理由は簡単でconfigureで存在するはずのnet/if.hの検出に失敗しとる。

configure:73140: checking for net/if.h
configure:73140: cc -c -O2 -pthread -I/usr/pkg/include -I/usr/include -fvisibility=hidden -I/usr/pkg/include -I/usr/include -I/usr/pkg
/include conftest.c >&5
In file included from /usr/include/net/if.h:86,
                 from conftest.c:269:
/usr/include/net/pfil.h:77:3: error: unknown type name 'u_long'
   77 |   u_long  phu_val;
      |   ^~~~~~
configure:73140: $? = 1
configure: failed program was:
| /* confdefs.h */
...
| /* end confdefs.h.  */
|
|   #ifdef HAVE_SYS_SOCKET_H
|   #include <sys/socket.h>
|   #endif
|   #include <net/if.h>
|
|
| #include <net/if.h>
configure:73140: result: no

なもんでHAVE_NET_IF_Hが未定義なもんでビルドエラーってわけ。

そもそもunknown typeと叱られとるu_long型は<sys/types.h>でtypedefされてるので<net/if.h>や<net/pfil.h>はこいつを正しくincludeせんとならんのだが、本家HEADみてもincludeしとらんから同じ問題出るはずなんだがな。 まぁどっかで副作用的に読み込まれて表面上問題になっとらんとかかな…

じっさいFの場合はstruct timevalのために<sys/time.h>をincludeしとる副作用で<sys/types.h>が有効になってるから気づかれないもよう。 これがOだとちゃんと<sys/types.h>と<sys/time.h>両方をincludeしとるので、過ちを正しく認識して適切な修正はいっとるもよう。

このu_longってやつ、要するに「unsigned long intとか長くて書くのが面倒くさい」というしょーもない理由で存在する歴史的事情の産廃なので抹殺したみある。 残すにしてもtypedefによるu_long型として<sys/types.h>にあるのがそもそも設計として変で、本来なら<sys/cdefs.h>あたりでdefineによるマクロとして定義しておけって話だよな。

まぁ<sys/cdefs.h>も 解説書きはじめて途中で飽きて放り投げるくらいに肥大化しとるから、こっちくんなではある。

[pなんとかsrc] www/p5-CGIの依存するパッケージがアレになっとる

そんでPHPよりもさらにオワコンのperl5の話だからどうでもいいのだけど、www/p5-CGI-Session(CGI::Session)をインストールすると実行時にCGI.pmが無いって怒られよるのな、ははこやつめ。 まぁいまどきのウェッブエンジニャーはperl5とか使わんよね、ちなみにこのチラシの裏とかperl5で書かれてたりでうちではバリバリ現役です(しろめ)。

話し戻して、そもそもCGI.pmってperl5本体に同梱されてたよなーと思ったのだがなんと5.20で消されたのだな(まぁこんな時代錯誤なもん残当だよな)。 それにpなんとかsrcのメンテナが気づいてなくて追従してないってことなんやな。

そんでついでに何年かぶりにperl5の新機能に目を通したら、raku(perl6)からの御下賜品である

が将来的に廃止の予定になっててクソ笑った、なんでや!use Swithとgrep()の時代に戻らんとあかんのですか!むかし某所のコードでこの手の新機能使いまくった記憶があるけどまぁもう関係ないからええわ。

あといつのまにuse features 'signatures'すると仮引数使えるようになってるのだな。

sub foo
{
	my $bar = shift;
	my $bus = shift;
	# あるいは
	my ($bar, $buzz) = @_;
}

としてたのが

use features 'signatures';
no warnings "experimental::signatures";

sub foo($bar, $buzz)
{
	...
}

と書けるようになってる。 まぁこれも将来的にやっぱやーめたになりそうなにおいがプンプンする。

つーか以前から存在したプロトタイプ宣言ってやつ

sub foo($$)
{
	my ($bar, $buzz) = @_;
	...
}

こいつを仮引数と同時に使おうとすると

use features 'signatures';
no warnings "experimental::signatures";

sub foo :prototype($$) ($bar, $buzz)
{
	...
}

と冗長な方の書式にせんとならんそうで、これは嫌過ぎる。

2021/02/28(Sun)

[pなんとかsrc] devel/autoconf213 が壊れてる件

そもそもGNU Autoconf 2.13なんて前世紀リリースの1/5世紀前のシロモノなのでしゃーない。 後方互換性ぶち壊して古いバージョンも残さざるを得なかった怒りはワイも切々として覚えているのだが、それにしたって移行期間は20年あったわけだしね? お前は生まれたばかりの赤子が成人式を迎える(なお新型コロナ自粛でおかわいそう)までの期間、何をしていたんだ?

なお20年経ってもまともに実装されそうもないC99とかもあるわけなので以下略、C2X(予定では2022年?)って誰が得するの(ぉ

まぁ壊れてるといってもconfigure.inからconfigureを生成するautoconf(autoconf-2.13としてインストール)は動いてはいるから99.9999999999999%のケースでは問題ないのだ。 壊れてるのは同梱されてるautoscan(autoscan-2.13としてインストールされる)であって、この21世紀も1/5が経過した2021年という時代にもなってわさわざ新規に2.13でconfigure.inの雛形あきことなるconfigure.scanを生成しようとする莫迦はこの世の中には存在しないはずなので、気づかれなくてもまったく不思議ではないのだ。

はい私がその莫迦なんですが(しろめ)、個人的にとあるプログラムをローカルで修正しながらピー年使い続けてるのだけど、tarballにconfigureはあれどconfigure.inが含まれてないので、ちょっと修正する必要に駆られてconfigure.inを再生成すべくautoscan-2.13と戯れようとしたら動かなくて気づいたのだ。 はい、いいです最新のautoconf使いますどーもすいませんでした私が悪いんです(怒)。

壊れてる理由は簡単で、autoconfはよりにもよってperl5で書かれてるんだけどこいつがドラスティックに後方互換切り捨て続けてるからなのよね。

まず配列(@)やハッシュ(%)に対してdefined関数を使うことが 5.22以降で致命的エラーになった件で動かない。

    print CONF "AC_CHECK_HEADERS(" . join(' ', sort(@have_headers)) . ")\n"
        if defined(@have_headers);

まぁこれはdefined関数使わないで単純に要素が空か否かでチェックすりゃいいだけだからdefined消せばいいだけ。

そこを修正してでる次のエラーは、いわゆるDirectory Tree Walkerの実装でperl4時代の遺物であるfind.plが 5.12で削除されとるので

require "find.pl";

...

&find('.');

というコードが動かなくなっている、まぁよりモダンな File::Find使うように書き直せばいいだけではある。

おそらく他にも問題あるのだろうけど、最新のautoconfに含まれるautoscan使えって話なのでこれ以上追及するのは不毛なのでヤメ。

そいや perl7でとるんやね、しかもraku(perl6)とは別のper5の正常進化系というワイ完全勝利の結果で腹抱えてワロタ。ラリー・ウォールさんさぁ…何したかったの…