hibitの技術系メモ

数学とか3Dとか翻訳とか

Blender触ったことないけど販売モデルに尻揺れを追加したいという人へ

Blenderのバージョンは2.80です

これまでのあらすじ

Blender触ったことないけど販売モデルを巨乳に改変したいという人へ - hibitの技術系メモ

プロローグ

 よお、久しぶりだな。あれからもう1年半近くも経ったのか。お前さんの3Dモデルも見違えるようになったじゃねえか。

 ……とは言っても、今ではBOOTH - 創作物の総合マーケットで数百を超えるアバターが販売されている。お前さんのそのイカしたモデルは、フルスクラッチか? 改変か? まあ、どっちでも変わらんか。そんなことを論じる意味もなくなっちまったな。時代も変わったもんだ。俺みたいなロートルに、今更何の用があってきたんだ?

 ……なるほど、胸の次は尻ってワケか。お前さんの考えてることはわかるさ、同類だからな。まあ、些かマニアックだし、対応しているモデルは少ないだろうな。だが自分でそれを設定するということは、Blenderの闇のより深くへ進むってことだ。その覚悟はあるか? ……と言いたいところだが、その様子じゃ聞く必要はなさそうだな。

メッシュの改造

 まずはおさらいだ。プロポーショナル編集で体型を変更する。オブジェクトが服や肌に分かれている場合にはCtrl + Jで結合しておいた方が良いだろうな。オブジェクトが結合されても割り当てられたマテリアルは変わらないから心配無用だ。

f:id:hibit_at:20200415161558p:plain

 Xミラーにチェックを入れるのを忘れるなよ。

f:id:hibit_at:20200415161540p:plain

 あとは適当に頂点を動かして……

f:id:hibit_at:20200415162315p:plain

 こんなところか。

ボーンとは

 揺れ、関節……そういったもの基本的に全部ボーンによって制御されている。さて、ボーンとは何か? それを説明するために表示をまずワイヤーフレーム表示にする。

f:id:hibit_at:20200416101314p:plain

 ここをクリックしてもいいが、キーボードでもできる。Blender2.8系だとZ4だな。

f:id:hibit_at:20200415162641p:plain

 さて、ボーンとはこの体の内外にあるクサビ型のことだ。これ全体でアーマチュアといい、個々のクサビ型をボーンという。このアーマチュアが変形する時、それぞれのボーンに対応するポリゴンもくっついて一緒に回転する。その対応関係のことをウェイトというが、まあこれは後で説明する。

 要は3Dモデルの動きってのは、回転で出来ているのさ。人間の骨を模した構造を持つボーン達と、それらに対応したポリゴンが回転することによって、3Dモデルも人間らしく動くって訳だ。

 そしてこのモデルに……というかほとんどの販売モデルに尻用のボーンはない。hipsってのはあるが、それは体の起点に近い概念で、いわゆる尻肉にあたる部分ではない。販売モデルのほとんどは髪や胸に追加でボーンとウェイトを設定して揺らせるようにしてくれているが、尻までそれをやっているモデルってのはまあ……少ないだろうな。だからこそ、お前さんは今それを設定する必要があるということだ。ここまではいいな?

ボーンを追加

 今からボーンを追加していくぞ。アーマチュアを選択して編集モードだ。tabキーでも切り替えられる。

f:id:hibit_at:20200416100950p:plain

 アーマチュアはポリゴンと同じように、Eキーで押し出しをすることにより新しいボーンを生やせる。ここでもXミラーは忘れるなよ。

f:id:hibit_at:20200416101629p:plain

 そしてテクニックだが、Shiftキーを押しながらEキーを押すと左右対称にボーンが生えてくる。最終的には左右まったく同じものを作らなければいけないからこれは必須だな。

 さて、新しく突き出たこの双子のボーン、これが将来の尻ボーンになる訳だが、こいつらの先端はどこに置けばいい?

 極論すると、どこに置いてもいい。回転の起点になるのはボーンの根本だからな。もちろん、そこから子を生やす場合はその先端の位置も重要になってくるが、今回は無関係だ。まあ、納まりがいい場所に置いとくがいいさ。

f:id:hibit_at:20200416101802p:plain

 ボーンの名前はここで変えておく。hipsはもうすでにあるから……英語だとbuttocks_Lbuttocks_Rあたりが適切か? ここでの名前は重要だ。名称を統一して_L_Rを忘れるなよ。理由は後で説明する。

 そういえば、お前ならそろそろ疑問に思っている頃だろうな。

 尻のポリゴンはこんな高い位置を中心に回転するのか? と。

f:id:hibit_at:20200416102022p:plain

 そう、hipsの先端は腰まで伸びている。そこからspine(脊椎)ボーンが生えてくるんだから当然だな。hipsから生やした以上、そこがボーンの起点になるのは避けられない。しかし人間の尻ってのは、脊柱の根本を中心に回転する訳じゃない。ならばどうするか? 方法は2つある。1つはボーンを二段構成にすること。もう1つは、ボーンの連結関係を切り離すことだ。どっちで働きは同じだが、後者を説明するぞ。

f:id:hibit_at:20200416102149p:plain

 ここで「接続」のチェックマークを外す。

f:id:hibit_at:20200416102332p:plain

 今しがた生やしたbuttocksボーンの根本を選択し移動させる。hipsの先端が引っ張られることもなく、自由に動かせるはずだ。ちょうどいいところに動かしてやれ。

ウェイトペイント

 これで第一段階は完了だ。しかし今のままだとボーンが動いてもポリゴンは1mmも動かない。ボーンとポリゴンを対応させる必要がある。3Dモデルってのは、ボーン毎にどの頂点が連動するかってのが決まっているのさ。この連動をウェイトといい、人体が自然に動くためにはすべてのボーンにウェイトが適切に設定されていなければならない。指先に至るまで、ボーンごとに全部だぜ? 気の遠くなるような話だろ……3Dモデルってのは手間の塊なのさ。

 ウェイトは頂点グループによって管理される。専門用語が多いが、流れをなんとなく把握できれば細かい部分は覚えなくていい。ボーンと同じ名前の頂点グループに含まれる頂点にウェイトが乗っている、ということになる。だから新しく作成したボーンにウェイトを乗せるには新しく頂点グループを作成する必要がある。名前が1文字でも違ったらウェイトが設定されないから要注意だ。

 まずは頂点グループ作成を作る必要がある。オブジェクトモードに戻って、ソリッド表示(Z6)、アーマチュアは非表示(H)しておいた方がやりやすい。

f:id:hibit_at:20200416102831p:plain

 ここの「+」ボタンでグループを新規作成した後、名前を変えてさっき作ったボーンと同じにする。重ねて言うが、1文字も間違えるなよ

f:id:hibit_at:20200416102952p:plain

 これでやっとウェイトを塗る準備ができたな。

 体のオブジェクトを選択して、Ctrl + tabキーを押してみろ。

f:id:hibit_at:20200416103050p:plain

 そこで「ウェイトペイント」を選択だ(7キーでもいい)。そう、ウェイトは「塗る」モンなのさ。CADみたいな操作を要求されるBlenderの中で、ここだけはアナログな筆操作を要求される。

f:id:hibit_at:20200416103139p:plain

 ここでも切り替えられるが、カーソルを持っていくのがめんどくさいならキー操作に慣れることをオススメするぜ。

f:id:hibit_at:20200416103236p:plain

 ウェイトペイントモードにしたら、こんな風に真っ青な表示になっているはずだ。青ってことはウェイトが乗っていないってことだ。いまからこのキャンバスに魂込めてウェイトを塗っていく。おっと、Xミラーもここでは忘れるなよ。

f:id:hibit_at:20200416103425p:plain

 ブラシはここで選択する。右上の「ツール」から「ブラシ」を開いてそこで切り替える。色々あるが、塗る時は「F Draw」、消す時は「F Subtract」の2種類だけでいい。

f:id:hibit_at:20200416104954p:plain

 こんな塩梅か? 赤く塗られた点がウェイトがついた部分だ。もう片方は塗る必要はない。xxxx_Lという頂点グループにウェイトが塗られた時点で、xxxx_Rにも左右対称に塗られているからな。便利だろ? 名称に気をつけろって言ったのはそういうことさ。

 気をつける点として、ウェイトってのは、それ単体では赤でも緑でも水色でも重みは変わらない。色さえついていれば問答無用にボーンと連動するんだ。だから塗ってないと思った点(じつはうっすら水色)が実はモロに動いて飛び出る……なんてのがウェイトあるあるだな。まあ、こういう末端の揺れボーンだったらそこまで影響はないが、確認は必須だ。

f:id:hibit_at:20200416105656p:plain

 確認はポーズモードでできる。右上の「ポーズ」を選択してから当該ボーンを選択、Rキーでボーンを回転させて挙動を確かめればいい。

f:id:hibit_at:20200416105946p:plain

 大丈夫そうだな。

Unityへの適用

 長い作業もそろそろ大詰めだ。今までの作業で、ボーン→ポリゴンの流れはできたが、いまのままだとボーンが動かない。spineheadといったhumanoidに必須なボーンはトラッキングデータを反映してくれるが、それ以外のボーンはただ固定して動くだけだ。buttocksボーンに揺れ物を適用させることによって、ようやくトラッキングの動きが揺れに反映されて、自然な揺れ物となる。

f:id:hibit_at:20200416191145g:plain

 こんな風にな。やれやれ、やっと一段落だ。揺れ物としては有名なものはDynamicBone(有料)、VRMSpringBone(無料)があるが、まあそこら辺の導入やパラメータ設定は他の記事を参照してくれ。

 この一連の作業が理解できていれば、ほかにもいろいろな揺れ物を自力で実装できるはずだ。お前さんの3D人生が充実することを祈ってるぜ。

エピローグ

――いらっしゃいませ。

 ああ、いつもお世話になっております。相変わらず色々な部分が豊満で良いモデルですね。

 え、あの人に会ったんですか。ははあ、なるほど。でもお客さん、もうあんまりあの人には関わらない方がいいですよ。

 いやね、あの人も相変わらずで、それでもBANはされずにギリギリの線を狙っていたみたいなんですけど、この間twitchにBANされちゃったみたいで。

 お客さんは配信とかするかわからないですけど、命あっての物種、アカウントあっての配信ですからね。お客さんも気を付けてくださいね。と言っても、あの人と同様、どうせ突っ走っちゃうんでしょうけど。

We don’t permit streamers to be fully or partially nude, including exposing genitals or buttocks. We do not permit the visible outline of genitals, even when covered. Broadcasting nude or partially nude minors is always prohibited, regardless of context.

https://blog.twitch.tv/en/2020/04/07/update-to-our-nudity-and-attire-policy/

筆者和訳: 配信者が完全なまたは部分的な裸になることは許可されていません(性器や臀部を露出させることも含めます)。また、性器がカバーされている場合でも、その輪郭がはっきり見えることは許可されていません。未成年者の完全なまたは部分的な裸を放送することは、いかなる場合でも常に禁止されています。

かわいそうなじーぴーゆー2020

さく・え hibit

※VRChatはすばらしいゲームです

f:id:hibit_at:20200314191046p:plain

じーぴーゆーたちはこうじょうでせいさんされます

きれいなげーむをびょうがすることや

きかいがくしゅうでよのなかのやくにたつことをゆめみています

f:id:hibit_at:20200314191133p:plain

じーぴーゆーはぎょうれつをけいさんすることや

さんかっけいをびょうがすることがだいすきです

えんどゆーざーのもとでなにをするのか

いまからどきどきしています

f:id:hibit_at:20200314191157p:plain

そんなあるひ、げーむだいすきおじさんが

じーぴーゆーをかっていきました

よーし、かっこいいげーむをたくさんびょうがしていくぞ

f:id:hibit_at:20200314191218p:plain

しかし、なんと! じーぴーゆーをかったのは

ぶいあーるでおんなのこになることがだいすきな

ばーちゃるびしょうじょじゅにくおじさんだったのです

f:id:hibit_at:20200314191227p:plain

まいにちおんなのこのあばたーばかりびょうがするじーぴーゆー

でも、もんくはいいません

ゆーざーをたのしませることが

じーぴーゆーのなによりのよろこびだからです

f:id:hibit_at:20200314191249p:plain あるとき、いちぶのゆーざーのあいだで

じょそうようのふくをおくったりじどりをあげたりすることが

はやりはじめました

f:id:hibit_at:20200314191315p:plain

おじさんも「おお! やっぱり、りあるのほうがいいぞ!」と

ぜんぜんぶいあーるをしなくなってしまいました

f:id:hibit_at:20200314191332p:plain

すっかりほこりをかぶったじーぴーゆー

でも、たのしそうなおじさんをみていると

これでよかったのだとおもい、このいえをさることにしました

f:id:hibit_at:20200314191424p:plain

あてもなくあるくじーぴーゆー

そこにびんぼうながくしゃがとおりがかりました

「おお! これはさいしんのじーぴーゆー!」

f:id:hibit_at:20200314191437p:plain

それから、じーぴーゆーはけんきゅうしつで

しぬほどでぃーぷらーにんぐをする

しあわせなひびをおくることになったのでした

めでたしめでたし

元ネタ: kagamin.net

AAA~ZZZの間で「名称・略称として使われていない組み合わせ」をスクレイピングで調べる

概要

 Wikipediaに対してスクレイピングを行い、「AAA」~「ZZZ」までの17,576通りの文字列に対し個別の項目が存在するかどうかを調べたところ、約4割にあたる7,746通りについて個別の項目があることがわかった。

緒言及び方法

 世の中にはアルファベットからなるたくさんの名称・略称が溢れている。AAA*1もあるしZZZ*2もある。しかしアルファベット3文字からなるイニシャルの中で「存在しないイニシャル」というのはあり得るのだろうか? ありえなさそうな組み合わせ、例えばQZXなんてどうだろう。しかしこれも、今調べたら山登りのアプリが出てきた。

 これを真面目に考えると「名称が存在しているのとはどういうことか?」となり難しい問題となる。今私が考えたばかりの架空の団体は存在しているのか? 同好会の名前だったら? どこかで線引きをする必要がある。ここは少しハードルが高いが「(日本の)Wikipediaに項目があるか」ということを基準にしたい。アルファベットは26種類あるので、2文字だったら 26 \cdot 26=676通り、3文字だったら 26\cdot26\cdot26=17,576通りの組み合わせに対して個別のURLにアクセスすれば調査できるが、人間がやるには無理のある量である。プログラムにやってもらうとしよう。

 以下のようなプログラムをpythonで組んだ。とりあえず2文字バージョンで。

import re
import requests

#アルファベットのリストを作成
alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#文章を作成してからそれをリスト化
chars = list(alphabets)

#ちゃんと26文字あるか確認
print (chars)
print (len(chars))

#HITとMISSのカウント初期値
hit = 0
miss = 0

#2文字のイテレーション
for s in chars:
    for t in chars:
        #ソースを取得
        url = "https://ja.wikipedia.org/wiki/" + s + t
        content = requests.get(url).text
        #項目があるかをソース中の文章で判断
        if content.find("この名前の項目はありません") == -1:
            hit += 1
            pattern = re.compile(r'<title>(.*?) - Wiki')
            #タイトルを正規表現で抽出
            match = re.search(pattern,content)
            print(match.group(1) + "という項目があります ",end="")
        else:
            miss += 1
            print(s + t + 'という概念はja/wikipedia上に存在しないようです ',end="")
        print(str(hit) + " " + str(miss))

 これを実行すると以下のような結果が得られる。回線速度にもよるが、実際に実行すると5分ぐらいかかるので注意。

f:id:hibit_at:20191104140609p:plain

 右にある数字の内、前者は(日本の)Wikipediaに項目があるもの、後者はないものを指す。さすがに2文字だったらAAからZZまで使われていない組み合わせはなかった。

 複数の候補がある項目(おそらく大半がそうだろう)は単なる一覧ページになるのでタイトルはアルファベットそのものだが、1個しかヒットしないページは専用の項目が出てくる。上の画像で言うとZL,ZM,ZNがそうで、それぞれズウォティ*3ザンビア*4亜鉛*5となっている。こういう「ユニーク名称」をいちいち調べていたら雑学博士になれそうだが、まあ時間がないので割愛する。

 では本番で3文字。17,576行も出力されるので結果をもう少し細かく分けたい。全体のヒット数とは別に、一番最初のアルファベットによる個別のヒット数もつけることにした。多分Aだと多くヒットしてQだとヒットが少ないだろうみたいな予測のもと。

 ソースコードは以下の通り。上のコードにあったコメントやテスト用の命令は一部省いている。

import re
import requests

alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
chars = list(alphabets)

hit = 0
miss = 0
#1文字目は個別に集計を取る
parthit = 0
partmiss = 0
#後で集計する用の配列
parthits = []
partmisses = []

#3文字のイテレーション
for s in chars:
    for t in chars:
        for u in chars:
            url = "https://ja.wikipedia.org/wiki/" + s + t + u
            content = requests.get(url).text
            if content.find("この名前の項目はありません") == -1:
                hit += 1
                parthit += 1
                pattern = re.compile(r'<title>(.*?) - Wiki')
                match = re.search(pattern,content)
                print(match.group(1) + "という項目があります ",end="")
            else:
                miss += 1
                partmiss += 1
                print(s + t + u + 'という概念はja/wikipedia上に存在しないようです ',end="")
            print(str(hit) + " " + str(miss))
    print(s + 'から始まるイニシャルを検索し終わりました。(' + str(parthit) + " " + str(partmiss) + ')')
    parthits.append(parthit)
    partmisses.append(partmiss)
    parthit = 0    
    partmiss = 0

print('合計' + str(hit) + " " + str(miss))

#1文字目ごとの個別累計を返す
for i in range(0,len(chars)):
    print('1文字目が' + str(chars[i]) + " " + str(parthits[i]) + " " + str(partmisses[i]))

 これを実行すると結果のようになる。回線速度にもよるが、実際に実行すると数時間かかるので注意。

結果及び考察

f:id:hibit_at:20191104171951p:plain

 まず全体の結果として、全組み合わせ17,576通りの内、ヒットした(Wikipediaに項目があった)アルファベットの組み合わせは7,746通り、そうでないものは9,830通り存在した。ヒットしないものの方が多い! ただ、これは「Wikipediaに項目がある」という高いハードルを越えたものが半分近くあるということで、当然項目がなくても存在・認知されている名称・略称は無数に存在する。この9,830通りはただの「使われていない可能性があるもの」であり、中小企業名(明らかな使用例と考えて良いであろう)等もここには入って来ないことから考えると、実際はそのほとんどに明らかな使用例が存在すると考えるのが自然だろう。

 次に開始文字の結果。ベスト3とワースト3を並べると以下のようになる。

順位 文字 ヒット数
1位 A 554
2位 C 503
3位 S 455
24位 X 91
25位 Z 78
26位 Q 67

 予想通りAのヒット数が多く最大の554、また最小も予想通りでQの67。念のため言っておくと答えを先に見ていた訳ではない。人気組はAのほかにCとS、不人気組はQのほかにZとX、まあそうだよね……という感じである。

 ここらの発展として「本当にその組み合わせの使用例が存在しないか」を検証しようとすると難しい。例えば、より正確らしい手段として「Googleの検索クエリに投げてみて、『もしかして』を提案されなければ存在」という実装が考えられるが、世の中は検索結果が全てではないし、アマチュア小説の固有名詞みたいなものをどうカウントしていいかは判断が分かれるだろう。今後の研究の発展に期待したい(発展するのか?)。

おまけ

f:id:hibit_at:20191104170830p:plain 解析の様子を抜粋したやつ

*1:トリプルエー、音楽ユニット

*2:佐咲紗花の楽曲。今調べました

*3:ポーランドの通貨らしい。初めて知った。

*4:国名は知っていたがZMに対応しているとは思わなかった

*5:これはさすがに知っていた

梅原大吾「勝ち続ける意志力」書評

f:id:hibit_at:20190914184353p:plain

https://www.amazon.co.jp/dp/4098251329

 日本で最初の、そして恐らく一番有名なプロ格闘ゲーマーである梅原大吾氏による自伝的書籍。その内容はもちろん格闘ゲームに関する記述が多いが、細かい攻略情報や戦略論を述べている訳ではなく、むしろ対人勝負におけるパフォーマンスをベストに保つ方法について書いてある。なかなか読み応えがあって、なるほど人生の攻略本という宣伝文句も頷ける。

成長中毒

 本書を読んで驚かされるのは、梅原氏の徹底した態度、言ってしまえば成長中毒ともいうべき自己研鑽への情熱である。大事なのは成長し続けること、そのために常に変化を求め、勝負の結果にこだわらず淡々と努力をし続ける。

 本書において重ねて強調されることは、とにかく変化し続けることが大事で、その結果や、更にいえば目標設定の巧拙なども問わないという点である。

普通、人はこっちの方向に何かあるはずだと当たりをつけて進むものだと思う。しかし、僕の場合は自分の足で全方向に歩くようにしている。正解がどちらの方向にあるのか、迷う必要すらない。すべての方向を探り尽くすからどこかで必ず正解が見つかるのだ。(74p)

 

自分を変えるとき、変化するためのコツは、「そうすることで良くなるかどうかまで考えない」ということだ。もし悪くなったとしたら、それに気づいたときにまた変えればいい。とにかく、大事なのは変わり続けることだ。良くなるか悪くなるか、そこまでは誰にも分からない。しかし経験から言うと、ただ変え続けるだけで、最終的にいまより必ず高みに登ることができる。(99p)

 

しかし、間違った階段を登ったと気がついたら、スタート地点まで引き返して、もう一度違う階段を登ればいいだけの話である。一番良くないのは、どの階段を登れば迷っている状態が延々と続くことだ。階段の下で正解を吟味し思い悩んでいるだけの人間よりも、間違った階段でもいいからとりあえず登っている人間の方がはるかに上達が早いと思う。(248p)

 この態度はもはや科学者や求道者のようでさえある。あえて悪く表現すれば総当り的だ。しかしこのような考え方は、何かを初めたいけれども不安で足踏みしている人、何か決断をしたけれどもそれが正解だったか迷い続けている人には力強く響くのではなかろうか。

 このような網羅的な試行錯誤を繰り返した梅原氏は、「10の強さ」(一般的な努力で到達できるライン)を超えた11や12の強さ(常人を超えた強さ)を得られるという。その自信を得られた瞬間が幸せだから、その一瞬の快楽に向かって迷いなく苦労を続けていけると述べている。

 以下、個人的に印象に残った箇所を引用する。梅原氏の絶対の自信が伺える文だ。

僕はこれまで頭の回転が速く、要領が良く、勢いに乗っていると思われる人間と何度も戦ってきたが、ただの一度も負ける気はしなかった。(中略)何も考えずに、自分のセンスと運だけを頼りに歩いてきた人間と対峙すると、相手の動きがチャラチャラと軽く見える。性根が定まっていないこと、さらには綿密な分析に基づいた動きでないことに、すぐに気がつくのだ。(59p~60p)

 恐らく梅原氏は、人生に求める幸福(快楽といってもよいだろう)の閾値がすごく高いのだと思う。中途半端なそれ、人と同じようなそれでは満足できない。そしてこれは多くのトップアスリートに共通する性質でもあると思う。

 本書では、梅原氏の人生において中高生時代に進路に悩んだ経緯が書かれているが、それもこういう性質に依るものだろう。どれだけ苦しんでも、遥かな高みにある究極の快楽に到達しなければ気が済まない。そして様々な経験の結果、それに到達する一番の近道は毎日努力を積み上げていくことだと信じ、実践している。

トップアスリートでい続けたいか

 もちろん、このようなストイックな態度が万人向けのものでないことは梅原氏も自覚している。

友人関係に恵まれていて、自分に合った仕事があって、毎日の生活が充実していると感じるのなら、あえて厳しい道を歩むことはないだろう。(中略)もちろん、現在の状況を変える必要のない人もいれば、変えられない人もいるだろう。だから、口が裂けても全員に楽をするな、険しい道を歩めとは言わないし、思わない。(70~71p)

 

さすがに、すべてのゲーマーに僕と同じ道を歩め、とは言えない。その道がどれだけ苦しく、つらいものであるかは誰よりも僕が一番知っている。(120p)

 梅原氏のいう努力の仕方はトップアスリートの為の、というか、トップアスリートを目指すための努力を淡々と続けることが苦にならない人の為のものである。そして、何かの大会を一点突破するための方法論ではなく、パフォーマンスを維持し続けるために毎日の努力を要求するものである。数年単位の間違った努力も、間違っていたことがわかるだけで収穫である、というのがウメハラ流だが、実際はそのように能動的に環境を変えて、集中的に取り組んで、ダメだったら潔く方向転換をする、ということを意識的に行える人間はそれほど多くないように思われる。

 まあ、だったら現状の環境で死ぬまで思い悩んで我慢してくださいというのも酷なので、やはりどこかで努力が必要なのだろうけど……。だとしたらやはり、本書で重要視されているとにかく変化するということが人生の真髄なのかも知れない。程度の差はあれ。

 あなたが自分を成長中毒者だと認めるならば、この本は人生必携の書になるかもしれない。そこまでストイックでない場合でも、何かの選択で思い悩んでいる人には上に述べたようなこと(間違っていても変化することが大事)が励ましになるかもしれない。あなたが仕事に満足している勤め人で、土日と連休が生きがい! この生活が定年まで続いて欲しい! と思うようなタイプならば、本書は必要ないだろう。

Mリーグがあれば……

 以下、完全な余談。梅原氏は一度格闘ゲームで挫折した後、麻雀で頑張っていこうとしたが、それも挫折している。ここでいう挫折とは、技術的なものではなく、長くこの業界にいても未来がなく、いつかは前向きに競技と向き合えなくなるのではないかという不安によるものだ。最終的には梅原氏はスポンサー契約を結びプロゲーマーとなるが、それは麻雀の挫折と介護の仕事を経た後の、eスポーツの盛り上がりを待たなければならなかった。

 本書では麻雀をやめた経緯についてあまり詳しく書かれていないが、筆者(ブログ主)が持っている麻雀界の知識を基になんとなく想像を巡らせてみよう。

 梅原氏が麻雀に関わっていたのは2004年~2007年の3年間だ。その時も麻雀にはプロ団体というものはあったが、給料がもらえるプロではなく、むしろ在籍することに対して料金を払う(それによってタイトルの挑戦権が与えられる)というものだ。まあ「プロになって食う」というのは麻雀に関して言えば、その見通しはかなり厳しいものだった。

 それとは別に、梅原氏は雀荘で仕事をしていたそうだが、それはつまりギャンブルやそれにまつわるトラブルと隣合わせの生活をしていたことを意味する。ここら辺は表では一切言及できない部分だが、本書にある「麻雀は人に恨まれることもある」という記述からは、勝手ながらそちら方面の辛さを想像してしまう。

 選手に給料を払うという意味でのプロの誕生は、2018年のMリーグ発足を待つ必要がある。もし梅原氏が麻雀に打ち込んでいる時に、Mリーグのようなものがあれば、梅原氏も前向きに麻雀プロを目指せたかもしれないな、となんとなく思ってしまう。

神谷美恵子「生きがいについて」書評

f:id:hibit_at:20190914184631p:plain

https://www.amazon.co.jp/dp/4622081814

 語学の天才でありGHQとの折衝も務めた*1知の巨人・神谷美恵子氏が生きがいについて記した本である。

 さてこの本、書き出しから重い。

平穏無事なくらしにめぐまれている者にとっては思い浮かべることさえむつかしいかも知れないが、世のなかには、毎朝目がさめるとその目ざめるということがおそろしくてたまらないひとがあちこちにいる。

 この本のテーマは生きがい、つまり生きる目的ということになるが、そのニュアンスはかなり重めである。つまり、普通の生活を送っている人がいかにその生活に意義を見出すかというよりは、挫折、重病、死別といった絶望に叩き落された人間が、その中でいかに再び生きるに値する希望を見出すかという、それこそ「死ぬか生きるか」というレベルの「生きがい」について論じている*2

 著者の神谷美恵子氏はその生涯をハンセン病の患者への治療に捧げた点でも著名である。当然、本書でもハンセン病やその患者に対する記述は多いが、それはこのような「死ぬか生きるか」について論じるにあたって自然な流れと言える。

 ハンセン病は肉体の変異を伴う病気である。そしてその変異は醜い。いくら感染力が少ないと言っても、その化け物じみた外見への変異は、罹患者への偏見を容赦なく呼び起こす。罹患者は親友や家族からも縁を切られ、二度と普通の社会に戻れない絶望へと叩き落される。

 その一方で、幸か不幸か、ハンセン病自体によって命を落とすことは少ない。つまり罹患者は、精神的には死んだも同然になりながら肉体的には生きているという一種の二律背反の状態に置かれ、これこそが大きな絶望をもたらすと言える。もしハンセン病が短時間で死に至る病であれば、どれだけ身体が醜く変異しようとも、罹患者や家族に大きな葛藤をもたらすことはなかったであろう。

 しかし、「精神的には死にながら肉体的には生きている」という状況はハンセン病に特有のものであろうか。もちろんそうではなく、絶望の縁に立たされた人間は大なり小なりこの二律背反に置かれているのだ。本書はこの点について、表現を変えながら何度もそれを強調している。

らいのひとたちの持っている問題も、結局、人間がみな持っている問題を、つきつめた特殊な形であらわしているにすぎないのであるから、

 

しかしこれは何も病気の場合に限ったことではない。すべて生きがいをうしなったひとの意識において、心と体はばらばらになる傾向がある。

 

しかしこれはレプラ*3のひとに限ったことではない。たしかに彼らの状況は最も「限界状況的」なものの一つにちがいないけれども、人間の持つ本質的な問題をただ極端な形であらわしているにすぎない。

 つまり、精神の死とそこからの復活は人間にとって普遍的なテーマであり、ハンセン病はその最も端的なインスタンスであると言える。愛生園*4ハンセン病の患者を(そしてその精神的復活の過程を)見続けてきた著者は、その精神の回復のはたらき、つまり「生きがい」についてその本質を述べるに相応しい立ち位置にいると言えそうだ。

 ではこの本はそのような「限界状況」に陥った人のための処方箋なのだろうか? 冒頭を読む限りではそのように思えるが、しかしそうではないと思える箇所もある。

社会的にはどんなに立派にやっているひとでも、自己に対してあわせる顔のないひとは次第に自己と対面することを避けるようになる。心の日記もつけられなくなる。ひとりで静かにしていることも耐えられなくなる。

 

たとえ表面ではあたりさわりなくやっていても、心のなかでしゃんと顔を上げて生きるためには、何か自分なりの新しい価値体型をつくり出す必要にせまられる。

 つまり、平穏な生活を送っていても、やはり何かしら生きがいがないと惨めですよ、とも取れる主張をしている。これはこれで厳しい態度ではなかろうか。安穏と暮らしいても、生きがいを求めて邁進することを暗に強制されるとは!

 それを論じるにあたって、本書で描かれる生きがいの再獲得について見ていきたい。本書に出てくるそれはかなり宗教的なニュアンスがうかがえる。もちろん特定の宗教に加担するような書き方はしていないが、暗闇の中で光があらわれ、使命感に突き動かされるというような描写は、まさに宗教的体験と相似形であるように思われる。

 もちろんこれは避けられないことであろう。というか、恐らく絶望の淵から喜びを見出すような過程は大なり小なり宗教的感覚と無縁ではいられないのだろう。逆に、人間には絶望から抜け出すための心のはたらきが備わっていて、その発露が宗教となって現れている、とも考えられる。例えば、著者は芸術について以下のようなホワイトヘッドの引用を添えている。

芸術は、人類が、その生存のストレスに対して示した精神病理的な反応である、といってみることもできる

 この文において、「芸術」を「宗教」に変えても何ら違和感はない。

 先に述べたように、本書で述べられる生きがいの再獲得というものは絶望(最もわかりやすい例はハンセン病)に立たされた人間がいかに再び希望を取り戻すか、という「死ぬか生きるか」の問題である。

 しかし、生存のストレス、端的に言えば、この世に強制的に産み落とされ、そしていつかは死んでいくという理不尽な運命を提示された人間は大なり小なり絶望に囚われた弱い存在であり、その中から希望を見出すためには、使命感を伴う生きがいを再発見しなければならないのではなかろうか。それであれば、やはり本書籍は特定の苦境に立たされた人達のための本であるだけでなく、万人に向けての書であると言える。

 ここでもう一度、怠惰な側の人間に立ってみよう。毎日の生活に追われるだけの人間からすれば、やはりこのような「生きがい主義」とも言える考えはどうにもストイックというか貴族的だ。パンがなければお菓子を食べればいい、ではないが、生きる意味を考える余裕もなければ正直その自信もない、という人間がほとんどではなかろうか。

 この点について以下のような記述がある。

かりに平和がつづき、オートメイションが発達し、休日がふえるならば、よほどの工夫をしないかぎり、「退屈病」が人類のなかにはびこるのではないだろうか。

 現実はどうだろうか。本書が発行された年(1966年)に比べてオートメイションは限りなく進んだ。しかし競争社会はますます激化し、格差は拡大し、人類はそれほど余裕が増えたようには見えない。またその余暇の潰し方も、神谷氏が理想とする精神的なそれとはかけ離れた人も多いように思える。

 技術の発展にともない人類が贅沢病を謳歌できたのであれば、生きがいの追求は現代人の最も大きなテーマになったかもしれない。だが人類は、種レベルでは技術を活かして休日を増やすほど賢くもないし、個体レベルでいえば余暇も享楽的に過ごしてしまう愚かな動物に過ぎないのかも知れない。

 ひとつ言えることは、どのような時代であれ、その中であなたが自分の人生と向きあうとする限り、本書で述べられている内容がその助けとなることは確かであろう。

*1:ついでに医者にもなっている。我々とは知能のレベルが違いそうだ。

*2:神谷氏自身が体験した絶望と回復の自伝であるという側面もあるらしいが、その点については深く追求しない

*3:ハンセン病のこと

*4:ハンセン病患者の療養施設。隔離施設という側面もあるが。

BeatSaber のグローバルランキングの実力評価、譜面例(2023/01/28 改稿)

  • このエントリはchokudai氏のエントリを全面的にオマージュしております。
  • ※現在のpp相場感を反映し、記事をリライトしました(2023/01/28)

 Beat SaberはVR空間上のノーツ(ブロック)を斬る音ゲーです。公式譜面やDLC譜面があって、その譜面の中で順位を競うのも面白いですが、それとは別に、ユーザーが作成したカスタム譜面による総合点を競うランキングがMOD制作陣によって運営されています。

こんな感じ

 参加しているのは約 15 万人くらいかなという感じです。

 実はこのランキングも色々あって多様化しつつあるのですが、ややこしくなるのでそれはまた記事の最後に。(2023/01/28 追記)

ppとその実力

私のページです

 このPerformance Points(pp)という値によってランキングが順位付けられています。これはランク譜面(Ranked Map)という特定の譜面群をクリアすることによって得られる得点です。ランク譜面は、カスタム譜面の中から有志の投票によって選ばれており、一定のクオリティ(無理な配置がないか、実力に応じたスコアが出るか)を担保された譜面となっています。

 ppと実力との関係については、超ざっくりまとめると、

  •   0 pp~…MODを導入すれば誰でもなれるレベル。
  • 2,000 pp~…ランク譜面を触り始めたレベル。公式譜面 Expert クリア。
  • 4,000 pp~…一般人からみればもう上級者の領域。公式譜面 Expert+(簡単なもの)クリア。
  • 6,000 pp~…一般人がついていけなくなるレベル。公式譜面 Expert+(難しいもの)クリア。
  • 8,000 pp~...ランク譜面をやり込んでいるレベル。ごく一部の公式DLC Expert+。
  • 10,000 pp~…この辺りからアスリートの領域。
  • 12,000 pp~…超上級者。
  • 14,000 pp~…世界大会に出るレベル。
  • 16,000 pp~...神の領域。
  • 18,000 pp~...神の領域かつ精度オバケ。

 という感じになります。詳しく説明していきますが、その前にもろもろの注意事項。

  • MODについて

 MOD・カスタム譜面の導入は各自の責任でお願いします。もし不具合やトラブル等が起きた場合においても当方では責任を負いかねます。MODの導入手順についてはまそさんのブログが非常にわかりやすいです。

  • お前は誰だ

 普通の一般プレーヤーです。オマージュ元のchokudai氏がAtCoderの社長であり自身もトッププレーヤーであるのを考えると説得力のなさが際立つというか、お前偉そうに何様やねんという感じがしますが、ご容赦ください。

  • インフレ

 高難度のランク譜面が新しく追加されればプレイヤー全体のppも増えていきます。以下の説明はあくまで現時点の相場感であり、今後インフレ*1していきます。

0 pp以上 2,000 pp未満

 MODを導入すれば誰でもなれるレベルです。色々なカスタム譜面をやっているうちに偶然それがランク譜面で……というケースもあるので、この辺りだと「知らない間になっている」レベルです。

 身体面では、最初は筋肉痛に悩まされる人が多いでしょう。はじめの内は、1時間もプレイしたら次の日は腕が上がらないと思います。

 このレベルの人が触る譜面の例です。

www.youtube.com

Comment: このレベルだと、見たままを斬るだけで特に気をつけることはないです。

2,000 pp以上 4,000 pp未満

 中難度譜面を触りだすレベルです。ストリーム*2や対角*3といった配置が頻出するようになり、一気に音ゲー感がでてきます。たのしい。また、後述しますがこのゲームには「角度」が重要であることがわかってくるので、このゲーム独自の「手首」の使い方も習得していきます。

 身体面では、だんだん筋肉痛になりづらくなってくる頃です。しかしこれは後に続く悲劇の幕開けに過ぎない……。

 このレベルの人がクリアし始める譜面の例です。

www.youtube.com

Comment: 斬りやすいパターンがバランスよく配置されており、中級者から上級者まで実力に応じて楽しめる良譜面です。

www.youtube.com

Comment: 局所的に対角配置や高密度のストリームが出てきますが、全体的にはまだ密度は薄いです。

 公式譜面のExpertぐらいならば、このレベルだと余裕を持ってクリアできると思います。Expert+でも簡単なものならばクリアできるでしょう。

4,000 pp以上 6,000 pp未満

 この辺りから一般人からみればもう上級者の領域です。単なるクリアだけでなく「精度(Accuracy)」を意識するようになります。ノーツを追っかけるだけのプレイではなく、余裕を持って振り抜くプレイになります。譜面あたりのpp*4でいうと 200 ppを稼げるあたりがこのラインになります。中難度譜面でSSクリア、高難度譜面でSクリア辺りです。

 ここでBeatSaberのスコアシステムについて説明しますと、このゲームではただ斬るだけでなく「十分な角度をつけて斬る」ことが大事になります。具体的には、

  • 振りかぶり 100 度、振り抜き 60 度をつける
  • ノーツの真ん中を斬る

 と最高スコアを出すことができます。すべて完璧に斬れれば精度 100 %ですが現実的には不可能です。実際にはSSクリア(精度 90% 以上)がフルコンボフルスイングのラインなので、それを達成できればその譜面を完全にマスターしたと言ってもよいでしょう。同じ譜面でもAクリア(精度 65 %以上 80 %未満)とSSクリアでは、難しさももらえるppも全然違います!

 身体面では怪我が増えてきます。振りの勢いが出てくるので、コントローラを壁にぶつけたり、体にぶつけて内出血させたり……くれぐれもご注意ください。

 このレベルの前半の人が触る譜面の例です。

www.youtube.com

Comment: 中難度譜面。素直なリズムで密度も一定ですが、単純な上下だけではではなく、横切りや上段ノーツが来てもリズムを崩さず対応する必要があるため、一歩上の視認力と慣れが必要になります。

 また、目についたランク譜面を触るという段階は卒業して(低pp譜面をクリアしても個人ppが増えないので)、ある程度高pp譜面に狙いを定めて攻略するようになります。(2020/10/11 追記。最近はランク譜面の数が膨大になってきたのでそうとも言えなくなってきました。)

 プレイスキルの面では、複雑な配置、例えばクロスストリーム*5や片手配置*6が来ても冷静に対処できるようになります。

 身体面では、腕だけの力任せの振りを卒業して、手首や肩を効率的に使ってノーツを斬れるようになりますが、肘や手首への負担が響いてくる頃です。無理するとマジで危ないので、皆様マジで気をつけてください……。

 このレベルの後半の人がクリアし始める譜面の例です。

www.youtube.com Comment: このあたりから、スライダー*7の配置も出てきます。スライダーの見かけの物量に惑わされずに安定した剣捌きを維持する力が必要です。

 公式譜面でもExpert+はけっこう難しいのですが、簡単なものはこのレベルでクリアできる程度でしょうか。

6,000 pp以上 8,000pp 未満

 この辺りから一般人がついていけない領域です。実際にプレイしている様子を一般人が見たら「上手いね〜」というよりは「えっ、なんかめっちゃ腕を高速移動させてる……近寄らんとこ……」ってなるレベルです。

 ランクを上げようとする場合は、もう簡単な譜面に手を出しても意味がありません。譜面あたりだと 300 ppが目安になりますが、例外的に美味しい譜面で到達するぐらいです。個人スコアの計算方式の都合上、譜面あたり 200 ppぐらいは稼がないと意味がないので、難しい譜面に挑戦することから逃げられなくなるといった感じです。苦しい戦いを余儀なくされる人が多いと思います。

 このレベルのランカー同士だと、ppを稼ぐために色々な高難度譜面を漁っているのは大前提です。どんな譜面かはお互い知っているので、「今日、"アバ"、 1 %伸ばしたワ……」「"テオ"のあそこはヤバい……」といった効率的な会話が可能になります。(2020/10/11追記。ランク譜面の数が膨大になってきたので、それほど「限られた譜面でお互い争っている」という状況でもなくなってきました。みんな自分に合った好きな譜面をやろう!)

 このレベルの前半の人がクリアし始める譜面の例です。

www.youtube.com

 このレベルの後半の人がクリアし始める譜面の例です。

www.youtube.com

 公式譜面の Expert+ のうち、難しいものっていうか配置が変なものだとこのレベルでクリアできる程度でしょうか。

8,000pp以上10,000pp未満

 この辺りから、譜面あたりのppでいうと 300 オーバーがコンスタントに必要になります。まぐれだけでは到達できないラインであり、ある程度相性に左右されずに安定したパフォーマンスを発揮する実力が必要になります。このレベルだと中難度以下の譜面はフルコンボが当たり前で、 90 %より上の精度をどれだけ稼ぐかという極限の争いになってきます。ここまで来れば、ランク譜面をやり込んでいて、大体の譜面に対応できることがある程度保証されていると言えると思います。(2022/02/11追記)スコアシステムの変更により、90 %台後半を出さないと稼げない仕様になりましたので、低難度で 95 %より上を出せるか、中難度でも 93% より上を出せるか、といった「詰め」の領域になってきます。

 そのため、どの譜面をクリアできるかよりも、どの譜面で高精度を出せるかといった点が重要になってきます。人によりますが、93 %以上のスコアは角度と中心精度を同時に満たす必要があり、どれだけ反射神経や動体視力があっても訓練なしで到達するのはまず無理なラインです。身体(というか手首)への負担も過大なものになっていき、その一方で、大半の譜面は1ミスしたら更新の見込みなし、という勝負になるので、ストレスも増大していきます。フィジカルケアとメンタルケアは必須です。

 このレベルの前半の人がクリアし始める譜面の例です。

www.youtube.com

 このレベルの後半の人がクリアし始める譜面の例です。

www.youtube.com

 公式譜面だとこのレベルのはほぼ存在しないですが、GhostのExpert+とかはここにあたるかなと思います。

10,000 pp以上 12,000 pp未満

 このあたりからアスリートの世界に入ってきます。先程述べた極限の争いを高難度譜面で行っている感じです。

 日本では上位 57 名からがこのクラスになります。譜面あたりのppで言うと 375 あたりが目安になりますが、それらを稼げるような譜面は基本的に物量やテック*8がものすごいことになっています。ある程度の基礎体力・筋力は必須ですが、それ以上に鍛え上げられた視認力と集中力が重要になってきます*9。そういった意味でも完全にスポーツの世界です。

 プレイスキルについては、もはや私が語り得るレベルを超えてきているので、ここから先は説明を省略します。

 このレベルの人がクリアし始める譜面の例です。

www.youtube.com

12,000 pp以上 14,000 pp未満

 このあたりから意味のわからないレベルになります。先程述べた極限の争いを超高難度譜面で(以下略。日本では上位 13 名からがこのクラスになります。

 プレイヤー当人には得意不得意があったり、まだ上が......という思いもあるとは思いますが、さすがにここまで来ると超上級者と言っていいのではないでしょうか。

 このレベルの人がクリアし始める譜面の例です。

www.youtube.com

14,000 pp以上

 世界トップクラスです。世界大会とかで優勝争いするのはこのレベルの人達です。前の人達と比べて何がすごいのかと言われると明確に説明するのが難しいのですが、こういう人達のプレイ動画を見ると、あまりにもスムーズすぎるので「逆に譜面が簡単に見える」という不思議な現象が発生します。達人の域です。日本人だと上位 2 名。

 このレベルの人が「クリアし始める」というランク譜面はもはや存在しませんが、世界の頂点に近い一握りのプレイヤーでないとクリアすらできないようなチャレンジマップの動画を貼ってきます(非ランク譜面)。

www.youtube.com

16,000 pp以上

 世界トップクラス中のトップクラスです。グローバルランキング上位 23 名ぐらいです。日本人だと上位 1 名。

18,000 pp以上

 世界トップクラス中の(以下略

 グローバルランキングの上位 2 名です。残念ながら日本人はいません。

 さて、このレベルで何が違うのかというと、「精度」(より正確に言うと中心精度)になります。

 ゲームのシステム上、フルコンボを取ると大体 90 %以上の精度は出ますが、相場感をざっくりまとめると、

  • 90%~ ああ、なんとかフルコンを繋いだんだね……もっとセイバーを振る余裕を持てるといいかな
  • 91%~ うーん、もうちょっと欲しい
  • 92%~ まあ、フルコンしたって感じ
  • 93%~ ここら辺なら安定フルコン
  • 94%~ フルコンかつ角度も十分。現在のスコアシステムでやっと美味しくなるライン。
  • 95%~ やるやん。コンボ・角度はもちろん中心精度も狙えている
  • 96%~ 中心精度が上がってますねえ
  • 97%~ 中心精度がエグいですねえ
  • 98%~ ミリ単位の制御か?
  • 99%~ ミクロ単位の制御か???
  • 100% ノーツが極めて少ない譜面でない限り、現実的に不可能

 という感じで、後半になると 0.1 % 上げるだけでも大変だし、その勾配がどんどんきつくなっていく感じです。以前のスコアシステムでは、良くも悪くもこの違いをあまり考慮していませんでした。

 しかし現在は、この「極限の領域」に応じて高い pp がもらえるシステムに変更されました。この結果、90 %後半を稼ぐいわゆる精度勢の pp が爆上がりしました。

 以前だと、グローバルトッププレイヤーは超物量譜面を難なくこなす超人という感じでしたが、現在のグローバルトッププレイヤーは完全に精度ですべてをなぎ倒しています。

 現在、グローバル 1 位の Bizzy さん。

 注目するべきは、★7.66 の譜面で 98.55 %(!)を取っている点で、超高難度の譜面をクリアできなくても高い pp を得られています。

 このスコアシステムは、裏を返せば物量譜面やテック譜面に対する実力が評価されないということで、賛否両論あります。変態譜面をクリアするのも実力だと思いますが、現在スコア争いの要点になっているのはそこではない、ということです。

 参考までに、Bizzy さんの動画。

www.youtube.com

 今まで上げた譜面に比べると密度も少ないですが、遥かに高い pp を得られています。ほとんどのノーツで 113 以上のスコアを取っており、信じられない精度なのですが、はっきり言って初心者にはそのすごさがわからないと思います。

ScoreSaber 以外のランキングシステム

 話がややこしくなるので今まで言及していませんでしたが、現在 ScoreSaber 以外にもランキングシステムがあります。

 BeatLeader です。

 現在は ScoreSaber と BeatLeader の二大政党制と言っていいと思います。

 こちらにもランク譜面があって、とはいってもほとんど ScoreSaber のそれとほとんど被っているのですが、ScoreSaber 程精度カーブがきつくないので、「たくさん譜面をやれば pp が増える」「難しい譜面をクリアすれば pp が増える」という世界観に近い仕様となっています。あとノーツが消えるモードとかスピードアップモードのボーナスがスコアに加算されるので、そこは大きな違いです(ScoreSaber はノーマルモードしか許容されません)。

 この記事を書いた時から少し前までは、ScoreSaber が半強制 mod だったのもあって「ランキングシステム≒ScoreSaber」であり、「BeatSaber のカスタムソングをやっている人≒ScoreSaber でスコアを送信ししてる人」といって差し支えない状況でした。

 現在は BeatLeader が台頭しており、そうとも言えなくなってきています。なお、どちらかしか選べない、といったものではないので、両方入れている人がほとんどです。実際、ランキングの上位層もほとんど被っています。中には、BeatLeader だけ入れているという人もいますが。

 とは言っても、ScoreSaber が最大手である状況は変わりなく、グローバルランキングといったら ScoreSaber のそれを指すという認識で問題ないと思います。一応、ランキングや pp と言っても大きく 2 種類あるよ、という点だけ。

まとめ

 みんなも怪我にだけは気をつけながらたのしくBeat Saberをやろう!

*1:デフレする可能性もゼロではないのですが、諸々の事情により基本的にはインフレ傾向です

*2:16分音符刻みで並んだ上下ノーツの連続。

*3:左下から右上に斬らせるような配置。

*4:譜面ごとのppに高い順を並べて、0.965 をかけていったものの合計が個人ppになります。例えば、理論上、譜面あたり200ppを稼ぎ続けたら合計は 200/(1-0.965) = 5,714 ppになりますが、実際はもっと低くなるので、おおよそ譜面あたりの最高ppの 25 倍ぐらいが目安になります

*5:腕を交差させるようなストリーム。

*6:片手だけを高速で振り回すような配置。見た目以上に難しい。

*7:複数のノーツをなぞるように一度に斬る配置

*8:すごい角度をしているけどよく見て腕や肩をひねれば斬れる配置をテックといいます

*9:上位ランカーの姿を配信などで見かけることはありますが、筋骨隆々な人は少なく、むしろ痩せ型の人が多いです

PythonとHerokuを使ってTwitterBotを作りました(ソースコード以外編)

 突然ですが先日、以下のようなBotを作成しました。

twitter.com

 Beat Saberという音ゲーについての情報提供を目的にしたもので、タイムラインの情報から以下の内容を自動的につぶやきます。

  • 現在配信中と思われるtwitchチャンネルを複窓で表示するためのURL
  • 一定時間ごとに投稿されたビーセイのハッシュタグがついたツイート(だいたい動画)をまとめてリツイート

 Botを作るにあたって手順や参考にしたページ、躓いた点などをまとめておきたいと思います。同じ内容を扱った記事は複数ありますが、(作成中の私と同じように)初めて作業する人だと既存の記事で想定していないようなポイントに躓いたりするものなので、何らかの形でそういった方々の助けになればと思います。

 一応備忘録がわりに説明文を加えていますが、もしプログラムを触ったことがない*1人が何もインストールされていない状態から始めるとしたら最低限の手順書になるように書きました。OSはWindows 10 64bitを前提としていますが、もし手順を参考にされる方がいればOS等は適宜読み替えてください。

目次

Botアカウントの作成

f:id:hibit_at:20190728214538p:plain

やること:TwitterBot用の新アカウント作成

 何はともあれアカウント登録。

APIキーの取得(Twitter開発者登録)

f:id:hibit_at:20190728214616p:plain

やること:ここで登録&作文

 ここから開発者っぽい領域に入っていきます。Twitterのアカウントとは別に、Twitterのdeveloper(開発者)としての登録をします。開発者になるとAPIキーというものをもらえます。

 APIキーについての詳しい説明は省きますが(というか私も詳細をわかっていない)、普段はTwitterのアプリやWebブラウザを通してしか見られないツイート内容やフォロワー数といったデータを、直接もらったり操作したりするためのパスワードのようなものです。これによってBotに色々させることができます。もちろん、誰にでもそんなパスワードを渡したら悪用されて危険なので、信頼できる作文を書ける開発者にのみ渡されます。

 そう、APIキーをもらうためには作文poemが必要なのです。それも英語の!(一応日本語でもできるらしいです)

参考記事

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita

 なお注意点として、APIキーで操作できるアカウントはログインしているアカウントのみです。つまりBotを操作するためには、Botのアカウントを作成して、そのアカウントでDevelopersサイトにログインしてDeveloperの申請を行わなければなりません。

 私は最初これに気づかず(気づけよ)作文を2回やるハメになりました。なお、2回とも認証は一瞬(本当に数秒レベル)で降りました。審査に一週間かかるという噂はなんだったのか。

Pythonのインストール

f:id:hibit_at:20190728214820p:plain

やること:ここでインストール

 無事にAPIキーが取得できたら、いよいよそれを用いて実際にTwitterを内部的にアレコレするプログラムを作っていきます。その気になればどの言語でもできるんでしょうけど、Pythonが色々ライブラリも揃っていて情報も豊富なのでそれを使っていきます。上のURLには最新のPythonが公開されているはずなので、クリックした先にある「Windows x86-64 web-based installer」でインストーラがダウンロードできます。

f:id:hibit_at:20190728215011p:plain

 なお注意事項として、Pythonをインストールする時の注意点として、環境変数チェックボックスを入れましょう。これがないとコマンドプロンプトpythonpipといったコマンドが使えません。特にpipが使えないのは致命的です。

参考記事

Pythonインストール(Win10)編 - Qiita

Pathを通すとは、環境変数とは - Qiita

Pythonモジュールのインストール

やること:コマンドプロンプトで以下のコマンド

pip install requests_oauthlib

 Pythonは色々なことができるプログラム言語ですが(わかったようなことを言う)、Python自体にそのすべての機能が備わっている訳ではありません。色々な機能を持ったモジュール(部品)として公開されており、プログラムごとに必要な機能を応じてインポートする必要があります。また、標準ライブラリに含まれていない機能は必要に応じてダウンロードしインストールする必要があります。

 例えば今回のBotでは、APITwitterに投げてデータを受け取る……という操作を行いますが、このような機能はPythonに備え付けられていませんし、まさかフルスクラッチでかける訳がありません。なので、外部プログラム(モジュール)を利用してそれを簡単にできるようにします。

 で、このモジュール、結構いっぱいあります。今回のBotだけでも以下のモジュールが必要になりました。

  • json --- JSON エンコーダおよびデコーダAPIを通したやりとりは基本的にjsonというフォーマットのデータになるため、これが必要です。
  • sys --- システムパラメータと関数。絵文字のエンコードに使います。
  • codecs --- codec レジストリと基底クラス。絵文字のエンコードに使います。
  • datetime --- 基本的な日付型および時間型。完成したプログラムには使いませんが、デバッグの時に使いました。
  • requests_oauthlib --- OAuth認証のためのライブラリ。これがないとTwitterとのデータのやりとりができません。これだけは別途インストールが必要。

Pythonプログラムの作成

やること:ソースコードをかく

ソースコードについては近日中にQiitaに公開し解説も加えるつもりです。目下、機能改良&コード整理中なので……。

 いよいよプログラムを書いていきます。プログラムを書くことはそれこそメモ帳でもできますが、エディタを使った方がインデント(プログラムの入れ子関係を示すための文頭開始位置)を自動で揃えてくれたり、シンタックスハイライト(要素ごとに色を変えてプログラムを読みやすくする)をしてくれたりするので、その方が書きやすいでしょう。私はPythonとセットになっている純正のエディタで特に不満がなかったのでそれで書いていました。

ローカル環境での自動化

f:id:hibit_at:20190728221341p:plain

やること:Windowsタスクスケジューラーでタスクの設定

 無事に、BotにツイートをさせるPythonプログラムがかけました。原理上は人間がこれを注意深く時計を見ながら10分に1回ダブルクリックをすれば定期ツイートをしてくれるBotBotじゃねえ)が実現しますが、とてもそんなことはやっていられないのでプログラムにやらせましょう。

 幸い、Windowsにはタスクスケジューラーという備え付けのプログラムがあり、これは定期的に指定したプログラムを実行してくれるというまさにうってつけのものです。

参考記事

タスクスケジューラにpythonを登録する方法(引数付実行) - Qiita

 これで自動化完了! 10分に1回、PC上でPythonファイルが走るようになります……が、毎回Pythonが立ち上がるのは正直目障りです。そして何よりPCを起動し続けていなければなりません。真の自動化のためには、自分のPCとは無縁なところでTwitterAPIを送り続けるような仕組みが必要になりそうです。

 そのための仮想環境を提供するサービスが、次に説明するHerokuになります。

Herokuのアカウント作成

f:id:hibit_at:20190728221506p:plain

やること:ここでアカウント登録した後、ここCLIをインストール

 Twitterとかと違ってややとっつきづらいサイトですが、まあ登録していきましょう。このサービスの中にさっきのパイソンファイルを置いて実行してもらう、ということになるのですが、ドラッグ&ドロップとかをするわけではなく操作は基本的にコマンドで行います。開発者はコマンドを使うものなのです。慣れない人は頑張りましょう。

f:id:hibit_at:20190728222156p:plain

 また、先程のpipと同じく、Windowsコマンドプロンプトにherokuを扱うための命令一式をインストールする必要があります。それがCLIです。インストールしていきます。

Gitのインストール

f:id:hibit_at:20190728222034p:plain

やること:ここでインストール

 更にややこしいのですが、Herokuのファイルを管理するためにはGitというシステムを使う必要があるので、それも別途コマンドラインにインストールする必要があります。さっきからインストールするものばかりですね。

参考記事:

自分用 Git For Windowsのインストール手順 - Qiita

Herokuへのデプロイ

やること:専用のフォルダを作成し、コマンドプロンプトで以下のコマンド

mkdir application_folder

でフォルダを作成し、Pythonファイルやその他設定ファイルを格納

cd application_folder
git init
git add.
git commit -m "commit"
heroku login
heroku create application_name
heroku buildpacks:set heroku/python
git push heroku master

※もし実際に上の手順をされる方がいたら、application_folderapplication_nameは自分のアプリの名前に変えてください。

 これでようやくHeroku上にPythonファイル(やその他設定ファイル)を送るための準備が整いました。ローカルで作業用のフォルダを用意して、いろいろファイルを用意して(このあたりの詳細は参考記事を見てください)Herokuにpush(ローカルの作業内容をインターネット上の大本に反映させること)します。Heroku上でプログラムが動く状態にすることをデプロイと言いますが、これでデプロイ完了です。

 なお注意点として、Pythonをデプロイする際には、Python用のビルドパックというものを設定する必要があります。ブラウザから設定することもできますが、コマンドでも設定できるので、上のコマンドではそれも一括してやっています。

 私はこのデプロイを通すときに何回やってもエラーが出てデプロイできなかったので困り果てていましたが、知人に相談したところ 「requirements.txt」の名前を「requirement.txt」にしていたということが発覚しました。お恥ずかしい……。これも誰かの参考になるかもしれないので言いますが。

参考記事

簡単!Herokuで動くTwitter botをPythonで実装する - Qiita

Herokuスケジューラの設定

f:id:hibit_at:20190728222521p:plain

やること:HerokuスケジューラでPythonファイルを定期的に実行するようにする

 長かった戦いにも終わりが訪れようとしています。後はHeroku上のスケジューラで、デプロイしたプログラムを定期的に走らせるようにすれば自動Botの完成です。Herokuにはスケジューラというアドオンがあるので、それを設定します。Herokuのブラウザでも設定できますが、以下のコマンドでも開くことができます。

 なお、Herokuスケジューラは無料のアドオンですが一応クレジットカードを登録する必要があります。

f:id:hibit_at:20190728222625p:plain

 これで定期的に自動ツイートするBotが完成しました!

*1:コマンドプロンプトの説明はないですが、もし知らなければググってください