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

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

Android Studio 2020.3.1のアンインストール

Android Studio 4.2.1までは、プロジェクトを読み込んでいないスタート画面にて、「Configure」ドロップダウンリストから「Import Settings」や「Export Settings」を実行できていました。
しかし、7月末にリリースされた新しいバージョン「2020.3.1 (Arctic Fox)」のスタート画面では「Import Settings」は一応あるものの、「Export Settings」が使えなくなっています。
(いちいち何らかのプロジェクトを開いた状態で、メニューの「File」→「Manage IDE Settings」から実行しなければならない)

2020.3.1では他にも使いづらくなった部分があるので、いったんアンインストールして古いバージョンに戻そうと考えましたが、ここで問題が発生。

コントロールパネルの「プログラムと機能」にはAndroid Studioのアイコンが登録されているんですが、アンインストールしようとすると、

[Window Title]
プログラムと機能

[Content]
Android Studio のアンインストール中にエラーが発生しました。既にアンインストールされている可能性があります。

[プログラムと機能] の一覧から Android Studio を削除しますか?

[はい(Y)] [いいえ(N)]

というエラーダイアログが表示され、アンインストールに失敗します。

これまでのバージョンは、インストールすると

uninstall.exe が作成されていました。

しかし、どうもAndroid Studio 2020.3.1 (Arctic Fox) をインストールしても、上記の場所には uninstall.exe が存在しないようです。
多分インストーラーのバグでしょう。それにしてもGoogleの連中はアンインストール作業をテストせずにリリースしているのか……
Android StudioIntelliJ IDEAをAndroid開発向けにカスタマイズしているだけにすぎないのに、相変わらず品質がひどいな……

とりあえず以下を手動削除。

もしかしたらレジストリなどにゴミが残っているかもしれませんが、この際仕方ない。
削除したいのはIDEだけで、Android SDK/NDKやエミュレーターはそのまま使うので、特にアンインストールはしません。

その後、以下から Android Studio 4.2.1 のインストーラーをダウンロードして再インストールしました。

developer.android.com

最強のIDEは?

すべてのIDEを使ったことがあるわけではありませんが、最強候補はVisual StudioもしくはIntelliJ IDEAだと思います。
VSは個人開発や少人数開発であれば必要十分すぎる機能を持つCommunityエディションを無償で使えるのも大きい。ネイティブコード/マネージコードどちらでも自由に言語を選択して開発できます。IntelliJのCommunityエディションやAndroid Studioは無償で使えるものの、対応している言語はJava/Kotlin/ScalaとJNIのC/C++だけで、純粋なC/C++対応のCLionや、.NET対応のRiderなどは有償製品のみです。

Android Studio (IntelliJ IDEA) はVisual Studioよりも検索・置換機能の動作が軽快で、使いやすい部分もあるんですが、前述のようなアホな仕様やバグが多々あるせいで、総合的な最強IDEの座に君臨しているのは未だVisual Studioであると断言できます。
あとMSBuildに比べるとGradle + CMakeは絶望的に使いづらい。動作も重いし、大規模プロジェクトになるほど実感するんじゃないでしょうか。

IntelliJはデフォルトのオートフォーマットもクソだと思います。調教しないと使い物にならない。ただ、オートフォーマットに関してはVisual Studioも独特のクセがあってイマイチです。
Visual Studio 2017以降はEditorConfigに対応しているので、プロジェクト(実際はソースツリー)ごとにフォーマット設定をポータブルに管理することもできるようになっています。一方、IntelliJのEditorConfig対応は中途半端で、現状まともに動作しないので、IntelliJ固有のスタイル設定XMLファイルを別途プロジェクトのリポジトリにコミットしておく必要があります。

コード補完やツールヒントはVisual Studioが最強です。VS2012あたりですでに完成の域に到達していると思いますが、なぜか他のIDEは全然追従できていないですね。C/C++の静的解析ツール (lint) はMSVCもClangも一長一短ですが、Visual Studio 2019以降は設定によりClang-Tidyを有効にすることもできます。

スペルチェッカーに関しては標準でサポートしているIntelliJに軍配が上がります。VSは一応サードパーティ製のアドオンがあるものの、まともに使えません。

デバッガーについてはどちらも遜色ないほど強力ですが、VSのウォッチ式はネイティブコードではうまく機能しないことがあります。一方、IntelliJのEvaluate Expressionでは外部リンケージのシンボルにどのコンテキストからでもアクセスできるので、かなり強力です。とはいえ、Evaluate Expressionもネイティブコードではうまく機能しないことがあります。

developer.android.com

なお、VSのAndroid対応は中途半端でバグも多く、特にネイティブコードとマネージコードを併用する際にデバッガーがまともに機能しないため、Android開発に関してはAndroid Studioを使わざるを得ません。

ジュラシックパークにはコミカライズ版もあるのです

金曜ロードショーで「ジュラシック・パーク」(1993) を久々に観ました。カットが多かったのが残念ですが*1、やはり原点にして至高ですね。目が肥えたせいか、今観るとどうしてもVFXやCGに甘い部分が散見されますが、その後に作られたどの続編よりも圧倒的に面白いです。最近の映画でありがちなフルCGよりも迫力があるのは、撮影に実物大のロボットを併用しているせいかもしれません。劇中に登場する中央制御室のコンピュータがブラウン管モニターで、ハードディスクの音がガリガリ聞こえるのも懐かしさを倍増させます。
現在では恐竜自体の研究も進み、当時とは認識や印象がまったく違う生物であったことが分かっている種も多々あり、科学的に正しいとは言えないかもしれませんが、恐竜パニック映画・エンターテイメントとしての魅せ方という点では完全に成功だったと言えるでしょう*2

style.nikkei.com

ちなみにジュラシックパークは、坂本かずみ先生の手によってコミカライズもされています。掲載誌はコミックボンボンの増刊号であるデラックスボンボン。当時小学生だった自分も読んでいて、映画よりも先に漫画で本作のストーリーを体験しました。

middle-edge.jp

めちゃくちゃ画力高いですね。このときのコミックボンボンガンダムロックマンという双璧を手に入れた全盛期でしたが、それだけに頼らず隠れた名作も多数掲載されていました。電子書籍版として再販してくれないかなあ。

ところで自分は最近の洋画を吹替で観るようなことは絶対しないのですが、この時代の吹替はちゃんと本職のプロ声優を起用しており、しかも我々が慣れ親しんだ超ベテランの吹替声優ばかりなので、終始安心して観られますね。最近はアニメでも三流のド素人芸人がヘタクソな吹替をするケースが増えてきて辟易していますが、こういうしょうもない芸能事務所や広告会社のゴリ押しがはびこっているのは日本だけでしょう。芸能事務所や広告会社の連中というのはどいつもこいつも映画の中身には興味ないんでしょうが、あまりにレベルの低すぎる吹替というのは、もはや聞くに堪えない公害レベルの邪悪なシロモノなのです。

*1:相変わらず民放はどうでもいいCMが多すぎです。流しすぎると逆効果だということに気付かないんだろうか……

*2:そもそも劇中のクローン恐竜たちは、部分的にカエルの遺伝子を使って復元されているという設定なので、本来の生態とは異なるものになっていたとしても何ら不思議ではありません。うまく設定を作り込んでいるなと感心しました。

無投票は罰金刑にしたほうがよいのではなかろうか

横浜市長選挙、ひとまず無能で嘘つきの林にNOを突きつける結果になったことに安堵しました。新市長の山中氏が実際に公約を守れるのか、横浜をより良くすることができるのかどうかはこれから注視していく必要がありますが。
しかし、特に病気などの理由を抱えていないのに投票に行かないなんて信じられん。投票率は良くてもせいぜい4割とか5割らしいが、半数以上が重要な権利を放棄していることになる。選挙権すなわち投票行為は憲法で保障された権利でもあるけれど、社会人としての義務でもあると思います。仕事が忙しい? そんなん言い訳にはならん。期日前投票だってある。そもそもあんたらが選挙に行って意思表明しないから既得権益ばかり潤って政治が腐り、巡り巡ってクソみたいな仕事に日々忙殺される羽目になるんじゃないの? 原因と結果が逆でしょ。自民公明系に投票するヤツはムカつくが、それ以上に選挙に行かないヤツはもっとムカつきますわ。投票できるのにしない連中はその自治体に住む権利などありません。政治の清浄化に邪魔なのでとっとと出て行ってください。ロクに選挙に行きもしないのに政治の批判をする資格があると思うなよ。まあ選挙に行かない連中は普段から政治のことなんか全然考えもしない、他力本願の成り行き任せなんでしょうけど。

特段の事由がないのに投票に行かなかったら罰金刑、もしくは住民税2倍の刑に処するのがよいかと。無投票2回目で4倍、3回目で8倍……と指数関数的に増やしていけばよかろう。
オーストラリアなど、海外では罰金を科している国もあります。

義務教育でもっと徹底的に政治経済について叩き込む必要があると思うんですわ。英語とかプログラミングとか、そんなもんやりたければ各自家庭で好きにすればいい。生きる力というのは、搾取されないようにするための知恵と知性と思考力と判断力を養うということです。無学・無教養の人間は搾取される側にまわることになります。マスゴミに扇動される白痴が増えると先の大戦の二の舞です。76年経っても日本人はシビリアンコントロールの重要性について何も学んでないのか。

もののけ姫

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

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コードは教養として読めるようになっておいたほうがよさそうです。