tateren’s diary

何か書きたくなった時に使う

beatmania IIDX のスコアデータCSVの文字について

CANNON BALLERS が稼動したので SINOBUZ のバックアップとしてスコアデータCSVをダウンロードした。

普段は BPICL とかに食べさせてたんだけど自分で中を見るのは初めてだったので文字回りを色々調べてみた。

基本情報

エンコーディングは BOM 付き UTF-8 で改行は LF。

バイト順が固定の UTF-8 には本来 BOM は必要無いんだけど、ExcelUTF-8CSV を開くのに必要なので多分そのため。

ソート順

収録バージョン、曲名の順にソートされている。

曲名は Unicode のコードポイント順にソートされている模様。(ゲーム内だとどうだっけ?)

代替文字

公式サイトで焱影が火影に変更されていたことを思い出したので他にも無いか調べてみた。

ゲーム内で表示される本来の表記の曲名リストを入手する方法が思い付かなかったので textage の全曲一覧を拝借してチェックしたところ以下の文字が置き換えられている事が確認できた。

文字 コードポイント 使われている曲 代替表記
¡ U+00A1 ¡Viva! !
Æ U+00C6 ÆTHER A
ö U+00F6 Atröpøs o
ø U+00F8 Atröpøs o
Ü U+00DC Übertreffen U
ä U+00E4 Präludium a
é U+00E9 L'amour et la liberté
旋律のドグマ~Misérables~
e
ê U+00EA Raison d'être~交差する宿命~ e
U+2665 Double ♥♥ Loving
Love♥km
LOVE♥SHINE
Punch Love ♥ 仮面
Raspberry♥Heart(English version)
Sweet Sweet ♥ Magic
超!!遠距離らぶ♥メ~ル
表裏一体!?怪盗いいんちょの悩み♥
キャトられ♥恋はモ~モク
なし
U+2668 ギョギョっと人魚♨爆婚ブライダル 半角スペース
U+7131 焱影

曲名しか見てないのでジャンルとかアーティスト名でまだあるかも。

U+0080 - U+00FF は Unicode Block の Latin-1 Supplement で、 ASCII に置き換えていることからこれらのラテン文字を含まない CP932 (≒Shift_JIS) への変換を考慮していると思われる。*1

♥ ♨ 焱 の3文字も CP932 に対応する文字が存在しない。

この置き換えで CP932 との往復変換が可能になっている。*2

$ tail -c +4 1418-9974_dp_score.csv | md5sum
f972d768f492db6ce6387bc88e9fcbc0  -

$ tail -c +4 1418-9974_dp_score.csv | iconv -f UTF-8 -t CP932 | iconv -f CP932 -t UTF-8 | md5sum
f972d768f492db6ce6387bc88e9fcbc0  -

ちなみに Shift_JIS だと ~ (FULLWIDTH TILDE) で変換エラーを起こす。*3

まとめ

  • 内部的には Unicode を使っているっぽいが CP932 との変換互換性を考慮している。
  • 漢字の置き換えが必要な楽曲は焱影が初だった。(意外)
  • どこまで表現可能か気になるので𠮷 (U+20BB7) 田さんとかいたらアーティストデビューしてほしい、そして BMP 外の絵文字を含む曲を作ってほしい。
  • 今度覚えてたら筐体で日本語フォルダをソートして眺める。

余談

TЁЯRA の Ё (U+0401) はJIS X 0208 の7区7点、 Я (U+042F) は7区33点に収録されているキリル文字なのでそのまま使用されている。

和文フォントでは全角で表示されるためバランスを考慮してか他の文字も全角になっている。

同様の理由から ULTiMΛTE も全角が使われているが、何故か X↑X↓ も全角だった。(何で?)

*1:公式サイトのエンコーディングShift_JIS

*2:liconv は BOM 付き UTF-8 を処理できないので先頭3バイトを無視している

*3:実装による?

リモートのVimからssh越しにクリップボード書き込み

わりと皆やりたがるやつ。

OSC52という端末の制御シーケンスでクリップボードアクセスができるらしい。

端末側の設定

セキュリティ上端末エミュレーターのデフォルト設定では無効になってることが多いとか。

自分が触る範囲だと以下の方法で書込許可設定ができた。

Tera Term

[設定]→[その他の設定]→[制御シーケンス]→[リモートからのクリップボードアクセス]を書き込みのみ(又は読込/書込)

Rlogin

Server Edit Entryで[クリップボード]→[制御コードによるクリップボード操作]→[OSC 52 によるクリップボードの書き込みを許可する]にチェック

Vim側の設定

こういうVim scriptがあった。

github.com

コメントにも書かれている通りosc52.vimを任意のパスに保存して、.vimrc内に以下の二行を追記

source ~/path/to/osc52.vim
vmap <C-c> y:call SendViaOSC52(getreg('"'))<cr>

ビジュアルモードで範囲選択中にCtrl-Cを押すとローカルのクリップボードに書き込んでくれる。

Tera Termで日本語対応

Tera Termだと日本語をコピーした時に化けてしまった。

色々調べてたらTera Termの中の人のgistを見つけた。

OSC 52 でのクリップボード書き込み (zsh用関数定義) · GitHub

# 漢字コードの扱いは端末依存。
# 例えば Tera Term の場合は現状では変換をまったく行わない為、
# 事前に CP932 に変換する必要がある。

ということで事前にcp932に変換してやるように修正してみた。

diff --git a/osc52.vim b/osc52_for_teraterm.vim
index 1cb6931..376347b 100644
--- a/osc52.vim
+++ b/osc52_for_teraterm.vim
@@ -42,7 +42,8 @@ endfunction
 "
 " It's appropriate when running in a raw terminal that supports OSC 52.
 function! s:get_OSC52 (str)
-  let b64 = s:b64encode(a:str)
+  let str = iconv(a:str, &encoding, "cp932")
+  let b64 = s:b64encode(str)
   let rv = "\e]52;c;" . b64 . "\x07"
   return rv
 endfunction
@@ -56,7 +57,8 @@ endfunction
 function! s:get_OSC52_DCS (str)
   " The base64 commands with no params will return a string with newlines
   " every 72 characters.
-  let b64 = s:b64encode(a:str)
+  let str = iconv(a:str, &encoding, "cp932")
+  let b64 = s:b64encode(str)
 
   " Remove the trailing newline.
   let b64 = substitute(b64, '\n*$', '', '')

これでTeraTermからでも日本語がクリップボードに送れるようになった。

RLoginは端末の文字コード設定に応じて解釈してくれるっぽいのでこの修正は不要だった。

TexTageで譜面検索するAlfred Workflow

経緯

ふとした時にAlfredからスッとTexTageの譜面検索したいなと思った。

調査

検索クエリがUTF-8のpercent encodingだったらCustom Searchに追加するだけで簡単に済むんだけど検索結果のURLを見た感じそうではなさそう。

Aで検索してみるとURL末尾が0041になった。
→2バイト固定でUnicodeコードポイントを表してるっぽいのでどうやらUTF-16(BE)みたい?

なので検索文字列をUTF-16BEに変換したのち16進ダンプしたものを http://textage.cc/score/index.html?r211B00_ に結合して開いてやれば良い。

作った

ShellScriptで書くとこんな感じ。

同じことをやるAlfred Workflow

www.dropbox.com

実演

f:id:tateren:20170625230211g:plain

ちゃんと日本語でも動いてて良い感じ。

Kindle本をブクログに自動登録する

経緯

booklog.jp

未読管理のために買った本全部ブクログに登録してるんだけど、できるだけ自動で登録したいよねという話。

ブクログにはISBN/ASINコードで本を一括登録する機能があるのでKindle本の注文メールからASINを抽出して投げてやればいけそうな感じがする。

いけた

Gmailを扱いやすそうだったのでGoogle Apps Scriptを使ってみた。

gistd24699fdfaabec9c971c3037279a753f

導入

wp.tech-style.info

Google Drive上に直接作成する」の方法でGoogle Apps Scriptを作成する。

上記のコードをコピペする。(よさげな公開方法がわからなかった)

「ファイル」→「プロジェクトのプロパティ」→「スクリプトのプロパティ」にブクログのログイン情報を設定する。

f:id:tateren:20161003023301p:plain

「リソース」→「現在のプロジェクトのトリガー」で「AutoRegistToBooklog」を適当な間隔で定期実行させる。

f:id:tateren:20161003023553p:plain

初回はGmailのアクセスとか外部リクエストの認証を求められるので、「実行」→「AutoRegistToBooklog」で動作確認してみてね。

まとめ

  • 今のところまとめ買いとかしても特に問題無く動いてる。
  • ログは実行毎に上書きされちゃうのでどっかに書き出したい。

色々と参考にさせて頂きました。

github.com

2016-10-16 追記

予約注文メールからASINを取得できてなかったので修正

2019-11-23 追記

POST時にRefererが必須になっていたので修正

Webラジオ録音中tmuxのステータスバーに通知を表示する

録音中にリブートかける悲しみを繰り返さないために。

rec_status.sh

#!/bin/sh
if pgrep rtmpdump > /dev/null ; then
  echo 'REC●'
fi

.tmux.conf(抜粋)

set-option -g status-right '#[fg=red]#(rec_status.sh)#[fg=green] %m月%d日(%a) %H:%M '

f:id:tateren:20160607223951p:plain

f:id:tateren:20160607224000p:plain

よさそう

rtmpdumpが起動してるからって録音してるとは限らないって?

f:id:tateren:20160607225932j:plain

PostgreSQLで無から複数行の任意のデータをSELECTする

テーブルも何も無い所から一行の固定値をSELECT(複数カラムもいける)

postgres=# SELECT 'ゆゆ式' AS title, '三上小又' AS Author;
 title  |  author  
--------+----------
 ゆゆ式 | 三上小又
(1 行)

これはよくやる(?)気がするんだけど、何も無いところから複数行SELECTするのってどうやるんだっけと思ってちょっと調べたら…

VALUES

VALUESを使えば良いのか。

postgres=# VALUES ('野々原'),('日向'),('櫟井'); --必要最小限の VALUES コマンド
 column1 
---------
 野々原
 日向
 櫟井
(3 行)

こんな感じでVALUESだけでテーブルが返ってくるんだけど敢えてSELECT文に組み込むならFROM句の中で使ってこうなる。

postgres=# SELECT * FROM (VALUES ('野々原'),('日向'),('櫟井')) AS yuyushiki(name);
  name  
--------
 野々原
 日向
 櫟井
(3 行)

VALUES を FROM 句の中で使用する場合には、 AS 句が必須となることに注意しましょう。

テーブルなので、結合もできる。

postgres=# SELECT * FROM (VALUES ('野々原'),('日向'),('櫟井')) AS family(family_name),
postgres-# (VALUES ('ゆずこ'),('縁'),('唯')) AS first (first_name);
 family_name | first_name 
-------------+------------
 野々原      | ゆずこ
 野々原      | 縁
 野々原      | 唯
 日向        | ゆずこ
 日向        | 縁
 日向        | 唯
 櫟井        | ゆずこ
 櫟井        | 縁
 櫟井        | 唯
(9 行)

なるほど…なるほど…