異世界スマホ11話はすごい

結論

全然やばくないしやばいって言ってる人間はなろう読み慣れてないだけ

以下蛇足

異世界スマホ11話がやばい、拷問、脳が溶けたような会話、問題点しかないと話題でした。
見たときからそんなにやばいか?と思ってたんだけど、12話見てもやっぱりやばいと思わなかったので記事を書きます。書きたいなーと思ってたんだけど機会を逃してたので。

11話のあらすじ

まあ色んな所で書かれてるんですけど、空中庭園見つけてマスターになって女の子が増えて正妻の余裕を見せつけて会議が行われる。終わり

見つけた/思いついた問題点について反論してみる

  1. 異世界スマホ11話、面白くなさすぎる、拷問すぎる

    1話から雰囲気変わらないと思うので1話で切ってください。11話で拷問って思うなら1話ですら拷問だと思いますね…

  2. 目的がないまま話が進んでいく

    一生こころがぴょんぴょんするとかゆゆ式は神アニメとか桜Trick桜Trick)とか言うなよ

  3. ハーレムすぎない?

    そういうアニメって最初の数話でわかってたしなんで11話まで見ていたのか疑問があります。それを承知で11話で公認ハーレム会議が開かれたのが意味不明で受け付けないって人にちょっとわかってほしいことがあって、あのハーレム会議、すごくないですか?
    ユミナが正妻である余裕をもって、「わたしは正妻であって、正妻に提案されたことを実行してしまうと第二夫人以下になる」という暗黙の条件が存在する場を設けるんですよ。すごいですよ、これは。正妻でしか出来ないことです。
    そして、望月冬夜に心酔しているエルゼ、リンゼ、八重はそれを実行するしかない(しないと将来的に離れる or 非公式な愛人になる)という勝ちしか見えない状況で仕掛けるというの、王女としての本能と教育を感じます。
    すごいですよね、「穏やかだったり安心感があるから見続けてきた」っていう層に「安心できますよ」と言ってるんですよ、すごくないですか?つまり、彼女たちに明確な序列が出来て争いがなくなるんですよ。1位ユミナ、2位リンゼ、3位同列リンゼ/八重という、夫人の序列が明確になって順位争いの影での争いがなくなって、安心して放送されてるものを享受できるんですよ。ひどいというよりむしろ"やさしい"ですよね。
    明確に序列を設定しているので、Re:ゼロとかそのあたりよりかなり大胆なことを行っていると思いませんか、これは拷問とかではないですよ。他の作品が敵とかイベントとかで誤魔化してベールにくるんで見ないようにしてるものを、全部剥いでありのままにして明確にしようとしてるの、すごいですよ。すごいとしか言ってないけど、これはほんとうにすごいですよ。
    アニメ、基本的に書籍化されたものを使っているから、なろうの流行から3周遅れみたいなイメージあるんですけど、正妻の余裕を見せつけて公妾とか愛人とかしだしたのって1.5周前ぐらいじゃないですか?それを映像化したのがさすがだと思います。脚本家と原作者の勇気だと思います。

  4. 後半失速しすぎ

    いやなろうもので後半失速してないものあります?30話程度で完結するものでも普通に20話あたりぐだるんだしそんなものじゃないですか?
    完結してるものならまるごと飛ばしても問題ない話をアニメ化したらああなって当然だなって感想だし、わざわざ指摘する事項でもない気がします。

これでよくない?

個人的には面白いというか、そんなに酷評されるか?とは思いました。
おもしろがって過剰に言ってるだけで実はそんなにパターンかなーと思ったので、そんなに言わなくていいんじゃないかなって…みんな色々言ってるのに何も思わなかったのがおかしいのかなと感性を疑ったんですが、やっぱり多様性だよなと思ったので「異世界スマホは悪くない」を主張します。 ひどいというか、拷問というより、前述したように逆に挑戦的な良いアニメだと思いました。

むすび

良いアニメ化だったと思いました。なんか色々言ってるひとはとりあえず ISUCA とか見るといいんじゃないかな…これでだめならビビッドレッド・オペレーションとかもハマるかもしれない。ささみさん@がんばらないはめっちゃ好き。
(正直拷問度ならキルミーベイベーのほうが高いと思った)

時間が限られているときに技術書を読むのが苦手

たとえば仕事終わって帰ってきて、寝るまでに3時間あるとすると、3時間で済むようにしなきゃいけない。
(朝起きるのがめちゃくちゃ苦手なので十分余裕を持って寝たい)
そうすると、どれをどのくらい読むか決めないといけなくて厳しい。
なんで決めるかというと区切り悪いところで終わりたくないし、精神力がないから「ここまでやる」がないと数ページで終わってしまいそうだから。
「ここまでは読めそう」ってのも罠で、わからないところ出てくると調べたりして数ページに数時間溶けるとかもあるし、わからないから技術書読んでるから見積もりの精度が悪すぎる。
なので帰ってから生産的なことをするのがあまりにも難しくて、どうしよう…ってなりつつも勉強はしたいから悩ましい…
とりあえず英単語をだらだらやることを始めたんだけど、それより技術力をなんとかしないといけないから、焦る
同期にすごいひとがたくさんいて、会社の人もみんなすごくて、なんか自分だけ見劣りしてるなあ…って感じる
何をしても追いつける気がしない

英単語やる時に眠くなる時の対策

たとえばキクタンとか、基本的に英語が大嫌いな人間はチャンツとか読み上げ聞いてても脳が拒否して眠くなる。

最近かなり悩まされてたんだけど解決したので共有。

Bluetoothイヤホンを買って物理的制約を失くし、ストレッチや筋トレしながらやると起きられる。

もともと身体が固いので、前屈とかしたらめっちゃ痛いから目がさめるし、「英語に対するモチベ」はゼロだけど「ストレッチに対するモチベ」は0.1ぐらいあるので、義務感とモチベをうまく組み合わせるとなんか上手くいく。

キクタンで例えると、復習のために1日に500単語聞くとかすると、1時間とかかかるんだけど、開始3分ぐらいで眠くなるから、それを感じるとすぐ前屈の体勢にして痛みを感じさせることで目を覚ますと続く。で、それを1時間ぐらい精神を殺して、前屈したり開脚したり腹筋したりすると、起きられるし単語も回せる。神。

 

いや、なんでここまでして英語やらなきゃいけないねん、日本語話者以外を滅ぼしたい

Discord に音楽 bot を導入する

導入したんだけど、色々ハマったのでメモ。

Discord はこれ。導入したのはMusicbot

試し導入段階

手元のMacbook Proのターミナルで試しに起動してた。特にハマることもなく通常起動。

導入はここを参考にした。ここは Windows での導入について書いてあるけど、Mac OS X でも OK。

Python は 3.5+ っぽくて、起動するファイルは runbot.bat じゃなくて ./run.sh の方。環境によっては権限がないので、chmod u+x ./run.sh してから起動する。

でも Permission 周りが結構難しくて、サーバに居る人間全員に権限を渡すために色々調べた。

Discord にはサーバごとに役割(役職?)が存在していて id が割り振られてる。それを元に権限とかあげる感じ。最初は導入者にしか権限なさそう?

権限についてはここ参考に。役職/個人の id 取得についてはここ参考にすると良いと思います。

簡単に書くと、config/permissions.ini で権限を全部管理してて、ある役職の人間全員に権限をあげたかったら GrantToRoles に役職 id を、個人に上げたかったらUserList に id を羅列する。

権限にも色々グループがあって、[Default] / [MusicMaster] / [DJ] / [Limited] の 4 つがある。Default は基本いじらず、残りの 3 つに id を追加する。サーバーに居る人間が信用出来ない場合は Limited に入れるとよい。

ちなみに、権限管理するのめんどいから全員に MusicMaster の権限あげたい!!ってときは、とりあえず bot を起動して、!listids すると bot が DM で id のリストを送ってきてくれるので、その中にある Role IDs: @everyone: ************* を持ってくれば OK。公式では非推奨らしいです。

Ubuntu 14.04.5 LTS に導入

手元でずっと起動しっぱなしなのも面倒になってきたので、Ubuntu on さくら VPS に導入する。

動かしてた Musicbot のファイルをそのままサーバ上にあげて、./run.sh すると次のエラーがでる。

RuntimeError: Could not load an opus lib. Tried libopus-0.x86.dll, libopus-0.x64.dll, libopus-0.dll, libopus.so.0, libopus.0.dylib

色々調べてもよくわからなかったんだけど、色々やってたら直って動いたので直接的に関与してそうなことをメモ。

まず、このエラーって既知で、libsodium-dev がないときに起こるらしい。参考:Unable to locate package libsodium-dev · Issue #296 · SexualRhinoceros/MusicBot · GitHub

$ sudo apt-get install git python3.5 python3.5-dev ffmpeg libopus-dev libffi-dev libsodium-dev -y

をそのまま実行すると、libsodium-dev が見つからんって怒られる。どうやら apt-get の list にないらしい?ので、以下を実行。

$ sudo add-apt-repository ppa:chris-lea/libsodium
$ sudo apt-get update

で、もっかい実行すると無事にインストール出来てハッピー。Musicbot を起動してみると無事に動いてサーバーにも接続してくれた。👏

ついでに、Musicbot に関することを書いておくと、niconico の動画を投げても流してくれる。soundcloudyoutube のプレイリストにも対応。でも audio_cache は自動的に消してくれないっぽいので、手元じゃなくてサーバで動かす場合は自動的に消すなんかを作っておいたほうがよさげ。わたしは tmpwatch を cron で動かすことにしました。

ということで、Splatoon 界隈のみなさんももっと導入しましょう!!!!!!!!!!!!

twitter のリストメンバーに一部改変可能なテンプレDMを送る

今度 Splatoon の大会主催するんですけど、それにあたって需要があったので書きました。

したこと

  • Twitterリストのメンバー一覧を取ってくる
  • 登録データをcsvファイルに落として、パースする
  • 登録データを元にTwitterリストのメンバーにDMを送る
  • DM の内容はテンプレだけど、各自異なった内容になる

使ったもの

Python 3.5.1 で書きました。Python むずい。ライブラリは twitter, csv(標準であるらしい、すごい)。

流れ

はじめにcsvファイルを読み込んで一行一行をリストで保存する(csvファイルの1行 = リストの1要素)。そんで、twitterリストのメンバー一覧を持ってきて、あるメンバーがcsvファイルのどこに居るのかを調べて、もし居たらそのひとに DM を送るって形です。こういう形になってるのは、リストにDMを送らなくてもよいユーザがいるからですね。

で、ソースを見ればわかるんですがO(n2)になってて、その原因は登録データでは「さく / li_saku」になっていて、twitterリストのメンバー一覧では単なる「li_saku」なので、リストなめるときにいちいち登録データの中身を全探索してました。あと、大文字小文字が面倒だったのであらかじめ全部小文字にしておきました。

登録データを参照して個別にテンプレのいち部分が違う内容の文章を送りたかったので聞いてみたら、どうやらstr.format()がかなり優秀らしいので、それを使いました。使い方はここ見たほうが早いと思います。めっちゃすごい。便利!!!!!

登録データは次のような感じでした。

受理番号, チーム名, リーダー, NNID, 得意ステ1, 得意ステ2, 不得意ステ1, 不得意ステ2

ソースコード

# coding:utf-8

from twitter import *
import csv

t = Twitter(
            auth = OAuth('ここに', '自分の',
                       'アクセストークンを', '入れる')
           )

ret = t.lists.members(owner_screen_name = "li_saku_ika", slug = "sakurako", count = "100")

csv_file = csv.reader(open('data.csv'), delimiter = ',')
user_data = []
for i in csv_file:
    i[2] = i[2].lower()
    user_data.append(i)
    print(i)

send_text = """
      こんにちは、さくらこ杯運営のさくです。2度送ってしまった方はごめんなさい、完全なミスです。申し訳ありません。
      20時時点でのステージ選択や各情報についての最終確認を行います。
      受理番号:{0[0]}
      チーム名:{0[1]}
      得意ステージ:{0[4]}, {0[5]}
      不得意ステージ:{0[6]}, {0[7]}
      以上で問題ないでしょうか?
      """

for now_user in ret['users']:
    cnt = 0
    finded = False
    now_user['screen_name'] = now_user['screen_name'].lower()
    for s in user_data:
        if s[2].find(now_user['screen_name']) != -1:
            print(now_user['screen_name'], ' finded')
            finded = True
            break
        cnt += 1
    print(cnt, now_user['screen_name'])
    if finded == True:
        t.direct_messages.new(
            user = now_user['screen_name'],
            text = send_text.format(user_data[cnt])
        )