syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

もののけ姫

金曜ロードショーで『もののけ姫』を久々に観たんですが、面白かったですね。ナウシカの焼き増しのような印象も受けますが、「破壊と再生」というテーマが分かりやすい形で提示されていたのではないかと思います。あとジブリには珍しく、おっぱいがいっぱいで目の保養になりました。主役や主要なキャラクターのセリフばかりがクローズアップされがちですが、大人になってから観ると、当時劇場で観たときよりも、脇役のセリフのほうが深く響くものですね。全身包帯の老人とか。

https://www.ghibli.jp/gallery/mononoke013.jpg

それにしても、エボシ御前は欲を出さなければ、無用な犠牲を出すこともなかったのに。完全な悪人というわけではありませんが、共存・共生よりも征服・支配がモットーなんでしょう。反省とか後悔はしてなさそうなところがまた怖い。同じ過ちを繰り返しそうなタイプです。明確な描写はありませんでしたが、逃げ遅れて「ドロドロ」に巻き込まれたタタラ場の人達は全員死んでいるのでは?

https://www.ghibli.jp/gallery/mononoke045.jpg

画像出典:スタジオジブリ公式サイト
www.ghibli.jp

しかし、最期のスタッフロールで「電通」の2文字を見た途端にしらけてしまいました。日本で最も邪悪・陰湿・強欲な利権企業のうちの一つが電通ですが、その魔手はありとあらゆるところに及んでいます。こんな反社同然の会社なんてつぶれてしまえばいいのに。労働基準法違反とかそんな生易しいレベルじゃあない。人権の侵害、社会秩序の破壊、犯した罪は数知れず。

戦略・戦術シミュレーションゲームの切なさ

DMM(FANZA)でエロゲーが夏季セールになっていたので、今は亡きelfの『シャングリラ』を買ってプレイしてみました。シリーズには1と2があり、いずれも1991年/1993年発売のオリジナル版(PC-98)ではなく、2005年にリメイクされたWindows版がベースになっています。1、2、1&2マルチパックの3種類がありますが、ダウンロード版のマルチパックは単純にプレイライセンスキーをまとめて購入できるだけで、違いは無いようです。ゲームのダウンロード&インストールも個別です。

「シャングリラ」(Shangri-la, Shangrila) とは、ジェームズ・ヒルトンの小説『失われた地平線』に登場する架空の地名がもとになった、「理想郷」を意味する英単語ですが、このゲームのタイトルは『SHANGRLIA』。おそらくスペルミスなどではなく、意図的に変えたのだと思われます。

このゲーム、エロゲーのくせにエロやストーリーはおまけで、戦略(戦術)シミュレーションパートのほうがよくできています。ユニットは剣士・戦士・魔法使い、槍・大砲・弓矢、騎馬・忍者・火竜、鷲の10種類4グループがありますが、各ユニットには性能や出撃コスト、相性などの違いがあり、最初の部隊配置が最も重要です。
オリジナル版ではほぼ真上から見下ろすバードビューでしたが、Windows移植版は斜め視点のクォータービューになり、高さの概念も追加されています。グラフィックも解像度は640×480 (VGA) と小さめですが、なかなかキレイです。サウンドも耳に残るメロディーで良質ですね。ボイスも全キャラクター追加されていますが、戦闘中はほとんどボイスなしです*1。各面クリア後のご褒美エロCGはフルカラーで今風に彩色し直されていますが、どうにもありきたりなエロゲー塗りとモザイクで、線画も改悪されており、昔のタイルパターン職人芸を駆使した16色時代のドット絵のほうが良かったと思います。女の子の体つきや瞳の描き方など、好みはあると思いますが、デッサンも色使いも、昔の絵師さん(好実昭博)やグラフィッカーのほうがレベルが高いですね。野々村病院もそうですが、旧グラフィックも収録して切り替えできるようにしてくれればいいのに……仮に課金ダウンロードコンテンツだったとしても自分はお金を払いますよ?

ちなみにアリスソフト闘神都市などのオリジナル移植版を無償公開してくれています。太っ腹ですね。ゲーム的には今プレイするとつらい部分もありますが、グラフィックは逆に一周回って新鮮に感じられてオシャレな感じです。80年代や90年代の絵柄が大好きな人にはたまらないでしょう。ボイスは無くてもファミコン世代は想像で十分補えます。

とりあえずシャングリラ1はノーマルモードをクリアしたので、次は2をプレイしてみたいと思います。しかし、DMM GAME PLAYERが起動のたびに毎回UAC (管理者特権) を必要とするのがうっとうしいですね。アップデートの際に管理者特権を要求するならばまだ分かるんですが、なんでDMM GAME PLAYERのコンソールとゲームを起動するだけなのに管理者特権が必要なのか。しかも "%ProgramFiles(x86)%\DMMGamePlayer\rt\bin" を見る限り、なんかJava 8のランタイムを使ってるっぽい。Steamもディレクトリ設計とかメチャクチャなんですが、DMMのほうはそれ以上にお粗末です。

戦略・戦術シミュレーションゲーム自体あんまりプレイしないジャンルなんですが、そんな自分でもFCのガチャポン戦士4 (1991) とかSFCSDガンダムX (1992) とか大将軍列伝 (1995) とかバハムートラグーン (1996) とかはよくプレイしてました。それにしてもSDガンダム多いな。当時コミックボンボン派だったんですよ。バハムートラグーンは今は亡きスクウェア時代の名作で、ジャンルとしてはシミュレーションRPGに分類されますが、SFC末期の作品だけあって、FF6に匹敵・凌駕するレベルの美麗なグラフィックや迫力のサウンドが楽しめます。ストーリーについてはいまだに物議をかもすこともあるくらいですが、ぜひともプレイしてもらいたい。このゲームをプレイしたこともないのに、よく知りもしないで批判する輩がネット上にはいますが、そういう知ったかぶりのエアプレイヤーどものノイズは一切無視してください。

古典的な戦術シミュレーションゲームのルールは将棋やチェスのようなボードゲームに似ていて、自軍のターン(フェイズ)で好きなユニット(駒)を選んで移動して相手の陣地を攻めていき、ユニット同士が接触すると戦闘に突入します。最終的に相手ユニットを全滅させるか最重要拠点を占領すれば勝利なんですが、一定のターン数耐えて拠点を守りきれば勝利となるマップもあったりします。ユニットごとの射程や相性、地形効果、回復やユニット生産が可能な中間拠点、マップ兵器といった要素を加味して進軍することが攻略の要となってきます。

ユニットのグラフィックはマップ画面でも戦闘画面でも頭身の低いデフォルメされたキャラクターが使われることが多く、特にSDガンダム系は敵も味方も妙に可愛いんですよね。攻撃モーションとか、ダメージを受けたときのリアクションとか、どのキャラクターもちょこちょこ動くのでめちゃくちゃ萌えます。表情のない戦艦ユニットですら可愛い。容量が限られていたからこそ映えるのがSDだったのかもしれません。ガチャポン戦士4では、1つのユニットは4体のキャラクター(モビルスーツ)で構成されている小隊で、各キャラクターはダメージを受けてHPがゼロになると爆発(死亡)して消えてしまいます。ユニット内に一体でも残っていれば拠点で補給・回復することができますが、すべてのキャラクターが失われるとマップからユニットが消失します。アムロ・レイカミーユ・ビダンなど、ネームドパイロットの機体はロストすると拠点で復活させることはできず、次のマップでは復活するものの、レベル(経験値)がリセットされた状態になるので、いかにして自ユニットを消失せず相手のユニットを削るかが勝敗のカギとなってきます。

こういったゲームは対人戦ではケンカになることも多く、それを嫌ってどちらかというと一人でCPU戦(キャンペーンモード)をプレイすることが多かったんですが、敵ユニットが最後の1体だけになっても、CPUが一生懸命思考して戦っている姿を見るとなんだか切なくなります。ソーラレイとかコロニーレーザーのようなマップ兵器を手に入れると、射線上の敵ユニットをなすすべなく焼き払うなど、一方的に蹂躙することもできますが、こういう無差別殺戮のできるマップ兵器は嫌いでした。SDガンダムではデフォルメされた絵のせいでコミカルに見えますが、やっていることは残酷そのものです。現実世界で戦争をやりたがる人間というのは、敵味方問わず前線で戦っている兵士の顔が想像できないんでしょう。大義名分を笠に着て、一般市民を大量虐殺できる兵器をためらうことなく使える人間も狂っています。異常なことが異常でなくなるのが戦争なんです。

*1:唯一聴けるのが、地雷を踏んだときのボイスなんですが、敵のボイスも実装されています。敵ながら悲痛さが伝わってきて、なんだか可哀想になってきます。

国境をまたいだクソ五輪は中止しないのに県境をまたいだ国民の移動を禁止するのはどういう了見だ?

国民をバカにするのも大概にしたまえ。もうダブルスタンダード利権優先クソ政府や無能知事の言うことなんかみんな聞かなくていいよ。去年からさんざん我慢してきた人、実家に帰省したい人は今のうちに旅行・帰省したほうがいいと思います。

あとアスリートの連中は全員死んで欲しいと思いました。なんでこの状況下でおめーらだけ好き勝手やれてるんだよ。しょせんこいつらは全員バッハと同じ穴のムジナか。

あと電通は要らない会社です。存在自体が害悪。反社同然です。悪質性が大々的に報じられた後も改善しようとしない邪悪なブラック企業で未だ働いている人間は全員洗脳されているのか? 旧日本軍といったい何が違うというんだ?

MSVC (ユニバーサルCRT) のswprintfのバグ

Visual C++のC Runtime (CRT) ライブラリは、バージョン2015 (14.0) 以降、新しい設計のUniversal CRT (UCRT) を採用するようになり、C/C++標準ライブラリが再実装されました。
その際、かなりの数のバグが混入したのですが*1*2、いまだに修正されていないバグもいくつかあります。

例えば、以下のリファレンスでは、swprintf()WEOFを出力しようとした場合、戻り値はエラーコード-1を返すことが明記されており、サンプルコードでも例示されているのですが、UCRTでは間違った値を返します。

#include <stdio.h>

int main(void)
{
    wchar_t buf[100];
    int len = swprintf(buf, 100, L"%s", L"Hello world");
    printf("wrote %d characters\n", len);
    len = swprintf(buf, 100, L"%s", L"Hello\xffff world");
    // swprintf fails because string contains WEOF (\xffff)
    printf("wrote %d characters\n", len);
}

VC2013までは、11-1が正しく出力されるのですが、VC2015以降では1112が出力されます。
swprintf()系はvswprintf()系を使って実装されており、当然のごとくvswprintf()にも同じバグがあります。

これはWindows 10 21H1の最新版UCRT (ucrtbase.dll, 10.0.19041.789) でも修正されていません。

ちなみにWEOFは "%ProgramFiles(x86)%\Windows Kits\10\Include\10.0.*.0\ucrt\corecrt_wstdio.h" にて以下のように定義されています。

#define WEOF ((wint_t)(0xFFFF))

UCRTは、Windows 10では標準システムコンポーネント扱いとなっており、UCRTを動的リンクしたアプリケーションは、システムディレクトリにインストールされているDLLのほうを必ずロードするようになっています。Windows 8.xおよびそれ以前のバージョンでは、アプリケーションに同梱されているプライベートDLL(ローカルDLL)があればそちらを優先的にロードするようになっています。

UCRTのソースコードWindows SDKに付属しています。インターフェイスはCですが、内部実装はC++です。
swprintf()の定義を追っていけば、どのファイルに実装があるか分かりますが、どうも "%ProgramFiles(x86)%\Windows Kits\10\Source\10.0.*.0\ucrt\stdio\output.cpp" 内のcommon_vsprintf()の内部、processor_type::process()にバグがありそうです。processor_typeはテンプレートoutput_processorの特殊化ですが、その実装は "%ProgramFiles(x86)%\Windows Kits\10\Source\10.0.*.0\ucrt\inc\corecrt_internal_stdio_output.h" にあります。

余談ですが、C形式のAPIの内部実装にC++を使用することはよくあります。AndroidのBionic libcも、昔はすべてCとアセンブラで実装されていましたが、Android 4.xあたりで再設計されて部分的にC++で実装されるようになりました*3*4*5。なお、WindowsAndroidも、システム開発にRust言語の活用を始めているらしいので、将来的にCランタイムライブラリもRustで実装されることになるかもしれないですね。少なくともRustコードは教養として読めるようになっておいたほうがよさそうです。

クソ五輪は登場人物全員がクズです

もう気持ち悪すぎる。クソ五輪はゴミクズどころか吐き気を催す『邪悪』な餓鬼畜生どもが巣くう魔窟でした。類は友を呼ぶ。もともと大嘘つきのアベが自らの邪な欲望を満たすために、アンダーコントロールだなどと吹聴して無理やり招致した東京クソ五輪202Xは、最初から最後まで呪われる運命にあったわけです。AKIRAの予言は正しかった。

過去の暴行罪・障害罪を武勇伝のように自慢する極悪な低能マイナーミュージシャンくずれとその邪悪な血を引くサイコパス一族が地球にいたこと自体初めて知りましたが、このson of a bitchを採用した関係者はコイツの素性を知っていたんだろう? 海外のメディアから指摘されて初めて反応するとか、恥ずかしいと思わないのか? 過去に類をみないくらい最悪な形で全世界に醜聞をさらしたこのクズ野郎は、末代まで呪われることだろうし、またそうあるべきだ。ただの因果応報なので同情する余地は1ミリも残っていない。

本当に、本当にもう関係者全員首を吊って火あぶりにされて最大限苦しんでから死んでください。コイツらは社会に害悪しかもたらさない*1。全員死んでも誰も悲しみません。もはや五輪憲章がどうのこうのとかいうレベルじゃねーよ。暴行罪・傷害罪・侮辱罪で逮捕・投獄されるべきだった人間が、なんで大手を振って表を出歩けていたんだ?

そもそも「イジメ」とかいう生やさしい言葉で誤魔化すからダメなんだよ。「虐待」ですら甘い。れっきとした暴行罪・傷害罪・人権侵害でしょうが。そういう中途半端で生ぬるいことやってるからどこの学校も教育委員会も事なかれ主義で身内の犯罪をもみ消そうとするんだろうが。

ところで、普段はMIDI音楽しか流さない近所のスーパーで、なぜか昔のクソ五輪(2004年)のNHKテーマソングが流れていました。ヴォエエエエエエッ。吐き気がした。

*1:最低野郎のことをウジ虫とののしってはいけません。ウジ虫は分解者としての役割を持っており、自然界には必要不可欠の存在です。そんな彼らと比較するのはウジ虫に対して失礼です。

GitHub Copilotの違法性

GitHubに公開されたコードとコメントをベースに学習したAI(特化型の弱いAI)によって、関数名や設計コメントなどからプログラム内容を補完する「GitHub Copilot」という機能がプレビューリリースされ、試験運用が始まっています。同時に、この機能がもたらす問題についても懸念が持ち上がっています。

forest.watch.impress.co.jp

internet.watch.impress.co.jp

gigazine.net

今のところ自分はプログラミングだけで飯を食っているわけではなく、ソフトウェア設計や要件定義などの上流工程にも携わっているので、仮にAIベースプログラミングの進化がプログラマーの存在を脅かすことになったとしても特に困ることはありませんが、勝手に学習に使われるソースコード著作権問題が気にかかります。

自分はGitHubにいくつかコードをアップロードしていて、大半は緩めのMITライセンスで公開していますが、少なくとも「勝手に機械学習に使ってもいいよ」とは言っていません。そもそもGitHub利用規約にはソースコードフェアユースに関して書いてあるのか? 使われている言語やライブラリ、ライセンスやフォーク数などの統計データくらいであれば好きにしてくれてかまいませんが、ソースコード著作権は個々のライセンス規定に依拠するものであり、ソースコードアルゴリズムをパクってライセンス表記もなく無断で商用利用することは法律に抵触する可能性があります。GitHub Copilotがやろうとしているのは、ライセンスの違いを無視した何でもアリのちゃんぽん(無秩序・無法地帯の醸成)じゃないのか?

あなたが GitHub に投稿したコンテンツの所有者はあなたです。 ただし、お客様にはコンテンツの所有に伴う責任を負います。また、当社ではお客様にサービスを提供するために、一部の権利を当社に付与してくださるようお願いしています。

お客様は、自身が作成したコンテンツを所有することになりますが、お客様が投稿したコンテンツを当社が表示および共有できるように、特定の権利を当社に許可するものとします。 ただし、お客様が自身のコンテンツを管理し、それに対する責任を負うことには変わりありません。また、お客様が当社に与える権利は、当社がサービスを提供するために必要な範囲に限られます。 当社は必要に応じてコンテンツを削除したり「アカウント」を閉鎖する権利を有します。

「一部の権利」「特定の権利」「当社がサービスを提供するために必要な範囲」とやらは、どこまで適用されるものなのか?

無断利用の問題はAIによるパクリだけに限らず、人間によるパクリにも言えることなのですが、マシンパワーに任せた特化型AIによる自動学習は、人間の学習よりも遥かに膨大なデータを短時間で処理することができるため、より悪質な利用を爆発的に促進する可能性があります。

もし、AIによって自動生成されるコードが、学習に使われた既存コードの丸パクリになるようであれば完全にアウトだと思います。学習のさせ方にもよると思いますが、おそらく学習データが少ない場合、その可能性が高くなるのではないでしょうか。

この問題に関して、Linus TorvaldsやRichard Stallmanはどう反応するのか?

なお、日本語と英語の間の機械翻訳はいまだに実用レベルには達しておらず、幼稚そのものです。もし日本語のコメントからAIでプログラム内容を補完する場合、まず先にその課題をクリアする必要があるでしょう。
日本語で得られるIT関係の情報はほとんどが二次情報で、英語原文で得られる一次情報に比べると、現時点ですでに質も量も圧倒的な格差があります。
日本語を母語とし、普段から日本語で思考する日本人は、設計コメントも日本語で書くことが多いのですが、英語運用能力をおろそかにしていると、これから先は格差がどんどん開いていくことになると思います*1

ところで、GitHub上には良いコードだけでなくクソコードも星の数ほどあり玉石混交の状態なので、アンチパターンを間違って学習してしまう可能性もあると思うのですが、そのあたりどうなんでしょうか。しばらくは自己責任ということになるでしょうが、仮にAIを使ってプログラミングしたところで、結局のところ最終的に正しいコードかどうかを判断するのは人間です。AIによってサジェストされるようなコードすら書けないほどプログラミングスキルが欠如しているのに、本当にデバッグができるのか? 将来的に情弱が多数派を占めるようになる日本ではAIプログラミング自体ができず取り残されるか、AIプログラミングに頼るソフトウェアハウスが増えるものの、自動生成されたコードの良し悪しを精査できるスキルを持った人間がいないのでバグを作り込み炎上、という案件が増えそうですね。

*1:日本人が書く英文は分かりづらく、ソースコードのシンボル命名規則もムチャクチャであることが多いです。ヘタに英語でコメントを書くと誤解を招く可能性があります。例えば日本人が犯しやすいミスの傾向を把握しているような、Japanese-Englishに特化したAIエンジンでないと設計コメントの意図を理解できず、頓珍漢なコードが生成されてしまうでしょう。英語でコメントを書くつもりであれば、まずは英語で書かれたAPIリファレンスやドキュメントを読んで、ネイティブエンジニアがどういった単語や言い回しを使っているのか把握してからにするべきだと思います。とはいえ、自分もコメントは日本語で書くことが多いのですが……