Counter Fight

プレイ。VRゲーム。
プレイヤーは厨房に立つラーメン屋の店主となり、カウンター越しに注文をよこす客に適切なラーメンを提供するゲーム。
VRなのでラーメン作りは実際にスープを寸胴鍋からすくってドンブリに入れ、茹で上がった麺をチャッチャとしてメンマなどの具を箸で取ってトッピングして客に出す。その合間に、たまに注文がある餃子やビールを用意するといった忙しいプレイのゲームで、「Paper's Please」のような手順最適化ゲームである。
ゲームモードは決まった時間でハイスコアを目指すだけのものしかないが、小さい作品として綺麗にまとまっており、楽しさがわかりやすい。
説明があまり要らないので、VR紹介にもいい作品だとおもう。



Steam版をOculusQuestからVirtualDesktop経由でプレイしようとすると、手のオブジェクトが動かないためまったく操作できない。
OculusLinkでプレイする場合Steam版でも正常にプレイできる。

シミュレーションとエミュレーションの差

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF
なんとなくしか判っていなかったので。

シミュレーション

対象物を支配する法則の模倣を目的としたもの。
対象物を支配する法則を推定・抽出して、それが真似られている必要がある。
対象物と同じ機能や結果出力が実現できる必要はない。(対象物と異なる動きになってしまう場合でも、それはシミュレーションである)

エミュレーション

対象物の機能・出力結果の再現を目的としたもの。
同じ結果が得られるなら、対象物を支配する法則が真似られている必要はない。
対象物と同じ機能や結果出力が実現できる必要がある。(対象物と異なる動きになってしまう場合、それはエミュレーションではない)



あたりまえだが、シミュレーションもエミュレーションも対象物のすべての面を模倣する必要はない。
たとえば株価の上昇下落シミュレーションでは、証券取引所の個人の勤怠状況を模倣する必要はない。
たとえばリレー回路のエミュレーションでは、電気を流す機能が再現されていればよく、使用すると温度が上昇するという機能が再現されている必要はない。

エミュレーションとシミュレーションは対立する概念ではない。
たとえばコンピュータ機器のエミュレーションはチップの回路をシミュレーションすることで実現される場合がある。

BeatSaberでカスタムソングのSongID(ハッシュ値)を取得する方法

https://github.com/StarGazer1258/BeatDrop/blob/master/src/actions/queueActions.js
BeatSaberのCustomSongの保存フォルダ名やPlayerData.datのlevelIdとして利用されるSongIDを取得する方法。
曲を整理するスクリプトを書く時に、曲とSongIDの対応をどうやって調べればいいかわからず悩んだが、上URLのBeatDropのソースに書いてあった。dataToHash変数をつかってるあたり。
info.datと各難易度のdatファイル内容をつなげたものからsha1ハッシュを求めればいいらしい。
BeartSaber本体セーブデータにも、どっかにSongIDと曲フォルダの対応データが保存されていると思うんだが、見つけられなかった……。
以下はSongIDを求めるPowerShellスクリプト

function Get-SongID($info_file_path) {
	$info_text = [System.IO.File]::ReadAllText($info_file_path)

	$info_json = $info_text | ConvertFrom-Json
	$mapFiles = $info_json._difficultyBeatmapSets | % {
		$_._difficultyBeatmaps | % {
			$_._beatmapFilename
		}
	}

	$info_file_dir = (Get-Item $info_file_path).Directory.FullName
	$hash_base_str = ""
	$hash_base_str += $info_text
	$mapFiles | %{
		$hash_base_str += [System.IO.File]::ReadAllText($info_file_dir + "\" + $_)
	}

	$bytes = [System.Text.Encoding]::UTF8.GetBytes($hash_base_str)
	$sha1 = new-object System.Security.Cryptography.SHA1CryptoServiceProvider
	$song_hash = ($sha1.ComputeHash($bytes) | % { $_.ToString("x2") }) -join ""

	return "custom_level_" + $song_hash
}

PowerShellの罠:Get-Contentで読み込んだ内容は、改行コード入り文字列ではなく、改行で区切られた配列である

これはforeachで処理するために必要であり納得もできる仕様だが、うっかりすると罠になるという挙動。
ファイルをGet-Contentで読み、読み込んだ変数をPowerShellで表示させると正しく改行されているように見える。
しかしそれは配列の各要素が改行で区切られて表示されているだけで、変数には改行コード入り文字列が入っているわけではない。1行分文字列の配列が入っている。
変数を他の文字列と文字列結合したりC#のメソッドに渡すと、改行されているように見える場所は空白(アスキーコード32)に変化する。

$str = Get-Content .\info.dat

echo $str # 正しく改行されているように見える
{
  "data": "hoge"
}

echo ("" + $str) # ●空文字と結合すると改行が空白に化ける!
{   "data": "hoge" }

$str Set-Content .\out.txt # 書き出されたファイルは、CR+LFで改行が入る

[System.IO.File]::WriteAllText("test.txt", $str) # ●書き出されたファイルは、改行が空白に化ける!

[System.Text.Encoding]::UTF8.GetBytes($str)[1] # 2バイト目を取り出してみると、空白(アスキーコード32)ということになっている
32

ブラウザで独自の右クリックメニューを表示する方法

https://www.sejuku.net/blog/92015
ブラウザで本来できることが出来なくなるので基本的にこれはやっては駄目な行為だと思うが、やりかたとしては右クリック禁止の技術で本来の右クリックメニュー表示を抑制した上で右クリックイベントでクリックされた位置にコンテキストメニューのように見える要素を置くことで実現しているらしい。

「技名を叫ぶ」という表現の起源はどこにあるんだろうか?

https://b.hatena.ne.jp/entry/s/anond.hatelabo.jp/20200206185147
https://dic.pixiv.net/a/%E6%8A%80%E5%90%8D%E5%91%BC%E7%A7%B0
はてなブックマークによると、山田風太郎の「甲賀忍法帖(1959年)」が直接的に出てくるもので最古?
永井豪マジンガーZ(1972年)がさせたとか。
あいまいなものになると、剣道(江戸時代末期~)(剣道は技名を叫ばないと技が無効になる)や、講談(江戸時代~)という意見も。
また、「螺光衝霊弾」に「フェルザレード」とルビをふることで、カッコ良い響きと呪文の効果や演出を両立させるのは神坂一が生み出したってスレイヤーズのあとがきに書いてあった気がする……とのこと。

ASP.NET マスターページ

http://hensa40.cutegirl.jp/archives/1539
マスターページは、ASP.NETでページの大枠を共通化するための仕組み。
マスターページは(.master)、コンテンツフォーム(*.aspx)とセットで利用する。
コンテンツフォームには利用するマスターページが<%@ Page MasterPageFile="~/Site1.Master">のように指定してある。
コンテンツフォームにアクセスすると、マスターページの部分が、コンテンツフォームの部分で置き換わった内容が表示される。



コンテンツフォームに<%@ MasterType VirtualPath="~/Site1.Master" %>を指定することで、コンテンツフォームがマスターページを継承したかのようにコードを書くことができる。