もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

あの伝説の不思議なダンジョン系ゲーム「jnethack」をUbuntu19.10にインストールしようとしたら、そっちはそっちで大冒険だった

sshでサーバにログインしたら、シェルじゃなくてゲームが始まったら楽しくね?」

と言ういまいちよく分からない欲求が爆発して、ターミナルで動くゲームを色々物色してました。

orebibou.com

有名なゲームは大体実装されている印象。

しかしながらアクション系は再描画の頻度が激しすぎててチラつきとか動作に引っかかりがあったりで割とイマイチ。

なので、ここは定番のCUI RPGRogueにしようかなと思った次第です。

あ、そういえばRogue派生の「NetHack」ってやったことないなぁ。
確かJNetHackって言う日本語版もあるんだよね。aptにはなさげ。じゃあコンパイルしますか。

と言うことでJNetHackコンパイルにチャレンジしてみました。

f:id:moguno:20200128001742p:plain

時は2020年。物語の舞台はUbuntu 19.10 Serverです。

ゲーム本編と同様、結構な数の罠が待ち構えていたので攻略のポイントを書いておこうと思います。

ライブラリ・ツールのインストール

まずはapt-getで以下のパッケージをインストールします。

  • build-essential
  • libncurses-dev
  • bison
  • flex

なんでかプログラミング言語を作るときの必須ツールであるyaccとlexを要求されます。
こいつら、そのものずばりの名前じゃなくてbisonとflexと言うパッケージになっています。第一の罠ですね。

ソースコードの展開とパッチの適用

$ tar xvzf NetHack-3.6.2_Release.tar.gz
$ gzip -d jnethack-3.6.2-0.1.diff.gz

$ cd NetHack-NetHack-3.6.2_Release/

$ patch -p1  < ../jnethack-3.6.2-0.1.diff

patchコマンドの-pオプションの数字がいまだに謎で手が止まるのと、差分ファイルをリダイレクトで渡さないといけないのが地味なハマりポイントです。第二の罠ですね。

Linux用のMakefileの作成

$ sh sys/unix/setup.sh sys/unix/hint/linux

常識を疑わず./configureを探し続けてしまう呪いでまたハマり。
シェルスクリプトMakefileを錬成します。第三の罠。

gccSJISなソースを解釈させるためのおまじないを追加する

ここが最大の難関でした。
JNetHackはどんな歴史的経緯かわかりませんが、ソースコード内の日本語がSJISコードで書かれています。

UTF-8を基本としている最近の?gccだとこのソースをそのままコンパイルすることができません。

具体的には、SJISコードには2バイト目が\な文字がいくつかあり(「表」とか)、それが入ると後続の文字がエスケープされてしまします。

このせいで、良くてメッセージ内の「表」の文字が文字化け。
最悪は文字列のダブルクォートをエスケープしてコンパイルエラーになってしまいます。

/* 「表」の2バイト目に含まれる\のせいで後続のダブルクォートがエスケープされて「文字列がダブルクォートで囲まれてへんぞ!」エラーになる。 */

char *str = "表";

じゃあ、ソースコードUTF-8にあらかじめ変換すればいいかと言うとそうでもなくて、JNetHackLinuxで動くときはSJISのメッセージをUTF-8に変換して出力していたり、SJISコードらしい16進数を抱えてたりするので、なんとかSJISのままでコンパイルを通さないと不味そうです。

幸い、gccにはUTF-8以外のソースコードgccの内部コードUTF-8に変換するオプション「-finput-charset」と、逆に内部コードのUTF-8をそれ以外のコードに変換してバイナリを作る「-fexec-charset」ってオプションがあるので、それをMakefileに組み込むことにします。

src/Makefile:27

CFLAGS=-g -O -I../include -DNOTPARMDECL -DDLB -finput-charset=cp932 -fexec-charset=cp932

コンパイルする

ここからは簡単。定番のmakeとmake installです。

$ make
$ make install

これで/usr/local/games・・・ではなくて、~/nh/install/games/
と言うよくわからないディレクトリにjnethackコマンドをインストールしてくれます。
最後まで罠の多いソフトでした。

終わりに

移動がvimと同じhjklキーだったり、ショートカットキーを覚えないとなにも出来なかったりで色んな意味で難易度の高いゲームですが、中毒性は半端ないですね。
今後はログインシェルをjnethackに差し替えたユーザを用意して、ネットのみんなでランキングを争ったりとかしたいですね。

2020年1月22日。無料はてなブログでGoogle Adsenseに合格しました。

Google Adsenseに5回の再申請で合格しました。
無料はてなブログでも通るんですね。

2020/1/9

新年。ふと不労所得が欲しくなってGoogle Adsenseに申し込んでみました。

審査のためのスクリプトを自分のサイトに張り付けると、最長2週間で審査をして合否を判定してくれるとのこと。

スクリプトは正常に読み込めました」と言うメッセージに安心して就寝。

翌日。GmailAdsenseからメールが。お、早いね。

結果は「サイトの停止または利用不可」

いや、動いてるし。てかあんたこの前正常に読めたって言ってたし。

ググると、設定でHTMLが埋め込めるところに片っ端にスクリプトを入れろ。と言う情報を得たのでそうして再申請。

2020/1/11

「サイトの停止または利用不可」

申請サイトのURLの末尾に/が無いとダメッて情報を得たので再申請。

2020/1/13

「サイトの停止または利用不可」

さらにググってみると独自ドメインじゃないと申請に通らないって言う情報を発見。

うーん・・・独自ドメインが\100/月で独自ドメインが設定できるはてなブログProが月額\600。

もぐてっくのPVだと全然ペイ出来ない。
所詮は人気者の遊びだったか・・・諦めよう。

一応再申請しつつ諦める。

楽天アフィリエイトを見つけたのでそれサイドバーに張ってみる。

2020/1/18

「サイトの停止または利用不可」

なんだか審査に時間がかかるようになってきた。
優先順位が落ちた?

無料はてなブログでも申請が通るって情報を得たので期待せず再申請。

他に、一時的にダミーの独自ドメインブログを作って申請を通せばその後は自由にサイトを追加できるので、そこではてなブログを追加すればよいみたいな情報を見つけたり。
その技使えなくなってるよみたいな情報も見つけたり。

情報錯そうしすぎじゃないです?

2020/1/22

あ・・・通った。

なんで?

なんなんですかね?
途中から人力での判断に変わって、優しい担当者に当たった感じなんですかね?

なんにせよ、無料はてなブログAdsenseは通る。と言うことが分かりました。

写真のバックアップ先を変えて焼き肉代を捻出した話と、rcloneの謎のエラーDuplicate object found in source - ignoring

この度、撮りためた写真のバックアップ先をGoogle OneからOffice 365 Business EssentialのOneDriveに乗り換えました。

Google One: 2TB \13,000/年
OneDrive: 1TB \7,128/年

現状の写真データのサイズは300GB強なのでこれで約\6,000の節約です。
焼肉食べに行こう。

早速愛用のrcloneの接続先をOneDriveに変更してバックアップ。
謎のエラーが出てコピーできないファイルが出ました。

rclone sync /media/fileserver OneDrive:/バックアップ/
2020/01/17 23:00:22 NOTICE: /写真/2016/20160310/20160310_102127_50753e729751ef106e3f66312ecb8fd1.mp4: Duplicate object found in source - ignoring
2020/01/17 23:00:22 NOTICE: /写真/2016/20160310/20160310_102403_e82903f2712db3d1d0d6cf3686ace851.mp4: Duplicate object found in source - ignoring

色々試行錯誤した後に言われたとおりにコピー元を見てみると、拡張子の大文字/小文字違いで同じファイルがありました。

 md5sum /media/fileserver/写真/2016/20160310/*
50753e729751ef106e3f66312ecb8fd1  /media/fileserver/写真/2016/20160310/20160310_102127_50753e729751ef106e3f66312ecb8fd1.MP4
50753e729751ef106e3f66312ecb8fd1  /media/fileserver/写真/2016/20160310/20160310_102127_50753e729751ef106e3f66312ecb8fd1.mp4
e82903f2712db3d1d0d6cf3686ace851  /media/fileserver/写真/2016/20160310/20160310_102403_e82903f2712db3d1d0d6cf3686ace851.MP4
e82903f2712db3d1d0d6cf3686ace851  /media/fileserver/写真/2016/20160310/20160310_102403_e82903f2712db3d1d0d6cf3686ace851.mp4

削除。