Baby Shark のダンス向け Remix をピックアップするよ

ストリートダンス/授業/部活/教室向け。hiphop寄りで夜のクラブ向けではないです。

Pinkfong - Baby Shark

オリジナル。元からダンス向きの曲なのでそのままでもいける。 サメ家族の振付けは程よく残して他をオリジナルにするといいと思う。

DEDESABUNGE - Baby Shark (MIX CLUB)2018

soundcloud.com BreakBeat。老若男女問わないスタンダードな Remix。 あちこちでコピーされまくっててオリジナルを探すのがちょっと大変だった。

PINKFONG - Baby Shark (Litefeet Remix) by @KidTheWiz & @ImNestoRodri on Instagram

soundcloud.com LiteFeet。NYOP と kid the wiz が作ったのでダンサー特有の気遣いポイントが随所にある。 子ザメ母ザメ父ザメとラップしてくれるのでそこだけオリジナルを引用すると盛り上る(かどうかは知らない)。

BABY SHARK KENZATRONA REMIX

Trap。ちょっと不良っぽく踊りたい人向け。

Remix God Suede X DJ Dainty - Baby Shark (Trap Edit - Remix)

soundcloud.com 原曲要素がほとんど残ってないTrap。ダンス力(りょく)が問われる。ここまでくると Baby Shark の必要性もない気が。

感想

ピックアップしたうちの二曲がインドネシアからで、ダンス Remix レベル高いです。 ちなみにエジプトでも妙な人気があるみたいですがエジプトの Remix は色々おかしい。

Minecraft mcfunction トランスコンパイラについて調べた

mcfunction で if-elseやループ、変数代わりのスコアボード等を扱ってるとハゲそうだと思う人向け。トランスコンパイラ(またはトランスパイラ、ジェネレータ、プリプロセッサ)についてです。

コマンドの知識がなくても使えるようなトランスコンパイラは現時点では存在しないので、どれを使うにせよコマンド学習はスキップできません。

これらのうち mcscript と EasyDatapacks の if-else を中心にテストしました。


mcscript

https://github.com/Stevertus/mcscript

データパック生成用の言語。Node.js が必要。

  • 関数、変数、定数
  • 配列、マップ(どちらも生成時のみ)
  • if-else/switch/for/for-each/do/while
  • 算術/比較/論理演算子
  • Raycasting
  • Modal - コマンド文字列生成テンプレートのようなものでJavascriptも使用可
  • VSCodeAtom、Notepad++ でシンタックスハイライト対応

一見良さそうに見えるが if-else によって生成されるコマンドに問題がある。

if ('entity @a[tag=test]') {
  /tag @a remove test
  /tp @a ^10 ^ ^
} else {
  /tag @a add test
  /tp @a ^ ^ ^10
}
execute if entity @a[tag=test] run tag @a remove test
execute if entity @a[tag=test] run tp @a ^10 ^ ^
execute unless entity @a[tag=test] run tag @a add test
execute unless entity @a[tag=test] run tp @a ^ ^ ^10

if の条件がブロック内部の全てのセレクタにくっついてしまうので、ブロック内のコマンドが増えるほどセレクタの条件も連続することになる。 さらに悪いことに if の結果が if ブロック内で変更された場合 else ブロックも実行されてしまう。

EasyDatapacks

https://github.com/emorgan00/EasyDatapacks

Python 風のデータパック生成言語。Python が必要。

  • 関数(エンティティ引数可)、変数
  • if-else/repeat N/for-each/while/break/continue
  • 算術/比較演算子

mcscript より機能が少ないように見えるが十分。 全コードを一つのファイルに収めることができる。 Minecraft コマンドの文法と Python 風インデント構造の相性がとても良い。

def example:
    if block 0 0 0 diamond_ore:
        tellraw @p "Yay! Diamonds!"
    else:
        tellraw @p "Maybe another time."
# example.mcfunction
execute if block 0 0 0 diamond_ore run function test:example.e0
execute unless entity @e[tag=main.example.e1.ELSE] run tellraw @p "Maybe another time."
kill @e[tag=main.example.e1.ELSE]

# example.e0.mcfunction
execute unless entity @e[tag=main.example.e1.ELSE] run summon area_effect_cloud 0 0 0 {Age:-2147483648,Duration:-1,WaitTime:-2147483648,Tags:["main.example.e1.ELSE"]}
tellraw @p "Yay! Diamonds!"

if-else のたびに mcfunction を生成するため mcscript よりも論理的に正しいコマンドを出力する。しかし summon/kill を使用するためオーバーヘッドの問題がある。

if ブロック内で再帰しようとするとエラーになるが、これは if の評価結果がスタックされないから。 しっかりエラーになるのは良いと思う。

変数の計算は EasyDatapacks がブラックボックス化したエンティティにおいてのみ可能であり、 自作エンティティのスコアボード計算には対応していない。 そのためエンティティのスコアボードを計算したい場合は通常の Minecraft コマンドで書く必要がある。

インストールに pip を使うので Windows だとハマりやすい。

Command Block Assembly

https://github.com/simon816/Command-Block-Assembly https://www.reddit.com/r/Minecraft/comments/7fnzv4/i_wrote_a_c_compiler_that_creates_minecraft/

Cまたはアセンブラ風コードを mcfunction にコンパイルする。Python または windowsバイナリで配布。

mcfunction を楽に書くというよりは Minecraft ゲーム内でテトリスなんかを再現したい人向け。 Minecraft のコマンドを使用するためにはマクロを定義していく必要がある。

PowerFunctions

https://github.com/Eisenwave/powerfunctions

mcfunction コンパイラ。制御構造は消極的で if/while 構文は Python 風。kotlin で書かれておりコンパイルが必要。

mcpp

https://www.npmjs.com/package/mcpp

mcfunction のプリプロセッサで npm からインストールする(おそらく Node.js が必要)。

機能は if/else とマクロ定数のみ。

MCJS

https://github.com/OpenMapmaking/mcjs

Javascript を使用して mcfunction を生成する。Node.js が必要。

エンティティの変数と for each、コマンド文字列のテンプレートのみ。

mcfunction の替わりに Javascript で書けるのではなく mcfunction ジェネレータを書くためのもの。

mcs (Minecraft Script)

https://github.com/PandawanFr/mcs

javascript 風のプリプロセッサでWebエディタがある‥‥という触れ込みだが作りかけで放置されている模様。

Minecraft RCON についてのメモ

この記事はこれから Minecraft で RCON ライブラリを使いたい人、または RCON クライアントを実装したい人向けのメモです。

RCON で何ができるのか

RCON によってバニラの Minecraft サーバーとコマンドによって通信が可能になり、 これを利用することで Minecraft 内部と様々な外部アプリケーションが連携できます。

もちろんサーバー本体を書き換える Bukkit や Spigot などの方ができることが多いのですが、 RCON は公式 API である点が重要です。

私は EmacsMinecraft Function (mcfunction) 専用のモードを作っていますが、 RCON 対応により編集中のコマンドをすぐさま Minecraft に送り、またその結果を受けとることができるようになりました。

↓↓↓ 宣伝 ↓↓↓ github.com

Source RCON と Minecraft RCON について

RCON は Source Dedicated Server (SRCDS) という Valve 社によるゲームサーバーの管理コンソールプロトコルです。

https://developer.valvesoftware.com/wiki/Source_RCON_Protocol

上記 wiki には Source RCON の仕様らしきものが書いてありますが、 あくまでも開発コミュニティの wiki であって公式仕様ではありません。

どういう経緯で Valve のサーバー機能の一部が Minecraft に採用されたのかは知りませんが、 Minecraft RCON の公開された仕様も存在しないようです。

Valve 開発コミュニティの wiki は情報が十分にあるのでまずはこちらを参考にして下さい。 Source / Minecraft RCON 両者の仕様の違いは以下に記します。

文字コード

パケット body フィールドの文字コードは Source RCON の wiki には ASCII とありますが、 2015 年に UTF-8 に対応したようです。 Minecraft RCON もシステム環境に依存せず UTF-8 固定です。

1.14.3-pre2 より前のバージョンで RCON を使うとクラッシュする。

https://bugs.mojang.com/browse/MC-72390

1.14.3-pre2 より古いバージョンの Minecraft で RCON を使用すると、サーバーは頻繁にクラッシュします。 つまり Minecraft RCON はずっとスレッドセーフではありませんでしたが修正されました。

応答テキストの改行文字が消える

https://bugs.mojang.com/browse/MC-7569

2013年1月に報告されたバグですが未だに修正されていません。

接続中はサーバーが停止できない

RCON クライアントが接続中のままサーバーを停止しようとすると、サーバーは終了できずに沢山の警告を出します。クライアントを終了させてからサーバーを停止するように注意します。

不正なパケットによる強制切断

以下のケースで RCON サーバーから強制的に切断されました。

パケットのサイズが 1460 バイトを越えると切断される

Minecraft サーバーに RCON で送れるコマンドの長さには制限があります。

パケットのヘッダサイズ等を踏まえて計算すると ASCII 文字で送れるのは 1446 文字が限界ということになり、 UTF-8 の日本語だと更に 1/3 に減るので 482 文字です。少ないですよね。

まとめて二つ以上のパケットを送信すると切断される

複数のパケットをまとめてサーバーに送ると切断されてしまいます。 ただし例外もあり、後述の分割確認用パケットは大丈夫のようです。

原因調査中。

対処方法としてはサーバの応答を待ってからコマンドを送るか、またはネットワーク接続を維持しないでコマンドを送るたびに毎回認証する方法があります。

RCON ライブラリを使用する場合の注意点まとめ

どこかの RCON ライブラリを使う場合、まず以下の二点を必ず検証してから使うようにします。

  • UTF-8 が扱えるかどうか
  • 4096 バイト以上のパケットを正常に受け取れるか

また RCON 自体の問題ですが暗号化通信に対応していません。 もしインターネット越しで使用する場合、Minecraft サーバーかあるいはローカルネットワーク内にRCONクライアントを配置し、SSHを通して実行することになります。


Minecraft RCON クライアント実装

RCON パケット仕様は Valve wiki と同じです。

フィールド 説明
size 32-bit リトルエンディアン 符号付き整数 RCON パケットの長さから size フィールド自身のサイズ(4 bytes)を引いた数値
id 32-bit リトルエンディアン 符号付き整数 コマンド実行時に id を指定すると、対応する応答パケットに同じ id がセットされる
type 32-bit リトルエンディアン 符号付き整数 クライアント送信: 認証=3 コマンド実行=2
サーバー送信: 認証成功=2 コマンド結果=0
body UTF-8文字列 (0~N バイト) 文字列の長さは size - (id + type + null + null) == size - 10
null 1 byte (0x0) 文字列終端用(たぶん)
null 1 byte (0x0) パケット終端用

コマンドに対する分割応答パケットの扱い方

応答パケットの分割は wiki の記述とはだいぶ異なります。

RCON サーバーは応答パケットのサイズが 4096 バイトを越える場合は分割して送る仕様になっていますが、 そもそもMinecraft RCON の応答には複数のバグがありパケットを正しい長さで計算しません。(1.14.3) それに加えて分割パケットの終端確認に対応しようとすると連結したパケットも扱うことになります。

短い応答であれば一つの通信パケットをそのまま一つの RCON 応答パケットとして扱うこともできますが、それでちゃんと扱えていると思うのは錯覚にすぎないので最初からバッファ方式で実装するようにします。

応答パケットは一旦可変長バッファに連結して溜め、先頭の size フィールドを調べてパケットサイズを計算し、サイズ分のバッファが溜まってからパケット本体を読むようにすればバグは表面化しません。

分割パケット終端の確認

分割されて送られてきたコマンド応答パケットはそのままではどれが最後のパケットなのかわかりません。

そこでコマンド実行のパケット、次に終端確認用の body が空のパケットを送ります。 確認用パケットの id は任意、type は 2 か 3 以外なら何でもよいので 0 でいいと思います。

サーバーは順序通りに応答し、分割された複数のコマンド結果のパケットと、確認に対する結果が最後のパケットに連結されて返ってきます。

SIZE ID TYPE "Unknown request TYPE(hex)" 0x0 0x0

これが終端確認用パケットに対するサーバーの応答パケットになります。

確認用パケットの ID を -2 などに指定しておけば応答するパケットの ID も -2 になるので簡単に終端が判別できます。

WSL1でWindowsのコンテキストメニューにemacsclientを追加するレジストリ設定

WSL2は未検証です

WSLでemacsclient にパスを送る方法は沢山あってどれにしようか迷っちゃう感じですが、今回はこちらの記事を参考にしました。

コンテキストメーニューに WSL の emacsclient を追加する。 · GitHub

reg ファイルを作っておけばツールを使わなくても再設定できるのでWindows再インストール等が楽になりますし、設定の備忘録にもなります。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\EmacsClient]
"MUIVerb"="Emacs Client"
"Icon"="C:\\アイコンファイルパス\\emacs.ico,0"

[HKEY_CURRENT_USER\Software\Classes\*\shell\EmacsClient\command]
@="\"C:\\Windows\\System32\\wsl.exe\" emacsclient -n \"`wslpath -a '%1'`\""

アイコンファイルパスを環境に合わせて修正し、C-x RET f文字コードutf-8-with-signature にしてから emacsclient.reg または任意の名前で保存します。 あとは Windows で reg ファイルを実行してやればコンテキストメニューEmacs Client が追加されます。

注意点として、この書き方だと%%を使った環境変数のパス文字展開はできません。 C:\\Windows%SystemRoot% の方が当然好ましいですが、自前のregファイルで変数展開するのはちょっと大変みたいなので気にしないようにします。

もう一点の注意点として、この設定はregファイルを実行したユーザーにのみ作用します。 全ユーザーに設定したい場合は [HKEY_CLASSES_ROOT\*\shell\EmacsClient] のようにします。

CLIP STUDIO PAINT 差分CG制作 タイムラインありファイルオブジェクトの問題と回避

CLIP STUDIO PAINT (CSP) の Tips です。

タイムラインが設定されたclipファイルのファイルオブジェクト (長いので以降TL-FOと略) は一見便利に見えますが 1.8.8 現時点では問題が多いです。

絵を描き始めた初期段階では編集ファイルと外部化されたclipファイルの間でタイムラインが簡単に同期してくれるので便利ですが、描き進めてレイヤーやフレーム数が増えてくるとレンダリング処理が増大してしまい手に負えなくなります。

一般的なアニメーション制作では元々のレンダリング処理が少ないためこの問題は表面化しないかもしれませんが、差分ありイラストでファイルオブジェクトを使用する場合はレンダリング処理量が多くなりがちでこの問題に直面することになります。

A <- B <- C
A ... 最終 clip ファイル
B ... Aにファイルオブジェクトとして読みこまれる
C ... Bにファイルオブジェクトとして読み込まれる

このようなファイル構成になっている場合、Aでフレームを切り替えるたびにA<-B<-C間に含まれる多くのステップで再レンダリングが起こります。 どうも TL-FO はフレームごとの最適化された完全なレンダリングキャッシュを保持しないらしく、フレームを切り替えるたびに再帰的にレンダリングするので再描画処理が驚くほど遅くなります。

またファイルオブジェクトにはもう一つ大きな問題があります。 ファイルオブジェクトが読み込まれたときに、書き出しのための下書き設定等が全て無視され、編集上表示されているレイヤーが反映されてしまう問題です。

ファイルオブジェクトで特定のレイヤーを非表示にする機能 | CLIP STUDIO PAINTの要望・不具合ボード | CLIP STUDIO

この問題は 2016/06/08 に指摘があり対処されることになったはずなのですが、何の音沙汰もなく放置されたままです。

これらの問題に対処するには単純で原始的な方法を使います。 直接TL-FOを使わず、pngなどに連番書き出ししてからファイルオブジェクトとして個別に読み込むようにします。

A <- 連番png <- B <- 連番png <- C

本来 CSP がやるべきフレームごとのキャッシュを人力でやる感じですね。 面倒な作業ですがそれほどでもありません。これによりフレーム切り替えに10秒以上待たされていたのが1秒未満に短縮できます。 この人力キャッシュは差分CG制作やアニメーション制作に限らずただの一枚絵でも有効です。