WIKIWIKI.jpにブロックされたと勘違いした


 最初に言っとくと、WIKIWIKI.jpは何も悪くないと思います。ええ。

 Nexus7でwikiwikiにコメント書こうとした訳さ。
 で、送信押したらwikiのエラー画面が。

Runtime error
Error message : 規制されています。

 えー。

 どーでもいいことなら諦めるんだけど、ツイッターやってない身内と連絡取る用のwikiでもあるんで、俺が書けないと結構まずい感じ。
 うちはauひかりなので、dion扱いになる訳で、またdion規制かな、と思いつつIIJmio高速モバイルDに切り替えてコメント送信。

Runtime error
Error message : 規制されています。

 ええー!?

 ここで初めてびっくりする。何だこれ、盛大な規制でも掛けた?
 つーか冷静になって考えれば、dionの時点で既に「いやいや頭おかしい掲示板とかでもない限りdion規制とかそうそうやらないだろ」と判断出来ただろーという気もする(場末だけどソレ方面の仕事もしてるんだし)のだが、どうも勘が鈍っている気がする。これが年の功か。何十年も掛けて着々と準備される老人力の片鱗を感じた。やだなあ。

 その後、wikiwiki傘下の他所のwikiを見てみたけど、ふつーにみんな投稿してる。ふーむ。
 まー何かのミスかもしれないから、と思って三時間ほど他のことをしてたけど、状況変わらず。

 で、何の脈絡も無く原因に気付いた。
 ああ、モバイル版Chromeの「帯域幅の管理→データ使用量を節約」がONだとGoogleのproxy通るじゃん。それだよ。ハハハ。バーカ俺バーカ!

 OFFにして解決。
 ONにしても25%も節約されないし、IIJmioのデータ使用量も余りまくりだし、Chromeだけ節約してもたかが知れてるし、何かもーめんどいからな。セーフブラウジング機能も統合されてるみたいだから切りたくない気もするけど、ちょっと副作用が色々と面倒だなと前から思ってはいたし。VPNが絡むと特に。

 ということなので、WIKIWIKI.jpに文句を言うような話ではないのである。多分どう考えても。


乱数の偏りを実際に体験してみる


 艦これの春イベントも終わり、ふとどうでもいいことを思い立つ。
 乱数の偏りが実際どんなもんなのか、手軽に試せるJavascriptを書いたら楽しそうだな、と。

 物凄く簡単な物として、「サイコロを振ったらどの目が何回出るか」のシミュレーターでも作ってみよう。ちょちょいとjQueryで。
 乱数生成には、高品質な乱数として有名で採用例もめちゃくちゃ多いMersenne Twisterを使用した。これは数学的に非常に質が良いとかなんとか証明されてるらしいけど、信用しきれないなら実際サイコロを振ってみて数えるのもお勧め。

1
2
3
4
5
6




 使い方は説明するまでも無いと思うので略。とりあえず「1回振る」辺りをカチカチしてみてください。

 これだけでも面白いことが色々分かる。
 例えば、「60回振る」→「リセット」、を繰り返してみることで分かるのは、「60回くらいだと猛烈に偏る」ということ。最大と最小で3倍以上違う、なんてのは頻発する。600回だと相当落ち着くけど、運が悪いと最大と最小で1.5倍くらい開いたりすることもある。6000回はさすがに信用出来る感じだけど。
 これがどういうことかと言うと、「とあるゲームで攻撃の結果を60回集計してみましたが、三倍も結果に差があったので明らかに○○が有利です」みたいなのは割と怪しい、と。60回の集計は大変だけど、乱数相手では「たったの60回」にしかならない、という哀しみが味わえる。
 また、逆正弦定理で勝ち負けが割れる現象も体験出来る。「乱数勝負で最初に偏って勝てた人はそのままリードを保ちやすい」という奴で、まー当たり前のことなんだけど。例えば、600回振って、激しく回数の多い出目があった時、そのままガンガン振り続けてみると、大抵はその出目がずっと多めのままになる。振ってりゃ分かるけど、ものすげー当たり前の理屈である。だって、後から追加でいくら大量に振ろうが、追加分は均等に近い訳で、最初の偏りを補正するような力は無いのだ。

 まー、何か思ったより面白いスクリプトだったので、このまま公開してみる。
 艦これ的には、バシーの羅針盤を体験してみるスクリプトなんかも面白そうだけど、めんどいので誰か作ってみませんか。とか。


艦これの5-4周回に爆戦を愛用してしまう謎


追記: 零観さんが「すべての攻略を過去にする」って言ったので、これも過去の物となりました。今は重巡系3+ドラム艦1+空母系2で余裕ぶっこいてS安定してます。戦艦も無しに。重巡/航巡の旗艦MVP上げにも超お勧め。

 加賀好きであり、二次創作で五航戦や赤城との笑える話なども好きであり、心温まる話もギスギスした話も好きである。
 つーか空母が何となく好みである。軽空母も好きだし。何でだろうな。おっぱい大好きなことと関連性はあるのだろうか。んなこと言われても知らんか。
 そして何度も言わせていただくが、おっぱいのサイズは問わないので、瑞鳳も龍驤も同様に好みであるし、瑞鳳の胸当ての存在意義には疑問を抱くところでもあるが、などと書きながら空母おっぱいを見比べていて気付いた。俺自身の識閾下に集中しつつ注意を凝らすと、おっぱいがでかい時と小さい時は何らかのセンサーが引っ掛かるが、普通のおっぱいだとそのセンサーは動かない。いや、おっぱいセンサー自体は全てに反応するのだが、サイズによってもう一つの未知のセンサーがですね。何てこった、俺っておっぱいサイズ不問の人じゃなかったのか。
 音楽や絵画など、芸術に於いて「このジャンルの良さは分からんわ」と簡単に言うことは敗北である。と思っている。おっぱいも芸術であるからして、これはもう普通のおっぱいにビンビン来るセンサーを育てなければならない。サイズの大小に反応するセンサーではなく、偏差の小ささに反応するセンサーという発想ならどうだろう。因数分解しながら勃起してください、みたいな難易度を感じるな。何か間違ってる感じはしますな。

 ていうか本題は艦これですな。
 そろそろ少し攻略っぽい話も書いてみたくなってきたのだ。書くと頭が整理されるし。

 まず、何で爆戦を使うのかっつーと、ボーキ節約である。
 空母のボーキ節約で一番有名かつ王道なのは、制空力を高めることで被撃墜数を減らす、というやり方だろう。多分。空母をフルパワーで暴れさせたいならこれが一番いいよな。
 一航戦で適当に再現すると、こんな感じだろうか。爆戦使わないけど。
kaga-fttfakagi-fftx
 ぶっちゃけマジ適当。5-4でこれだと制空権が足りなすぎて死ぬんじゃね、とは思うけど、今回の本題はこの構成じゃないので、計算すんのもめんどくさいから「大体こんな感じよね」って辺りで勘弁していただきたい。
 空母は敵に合わせて調整することで強さが格段に変わるけど、5-4でこのタイプの構成は最初に少し検討しただけでやめたので、実戦経験が無くてさっぱり分からん。5-4以外なら普通に使ってるけど。

 このやり方の時は、出来れば制空権確保まで行きたいけど、敵の制空力の高くなってくる海域では優勢で妥協しないと、艦戦だらけで攻撃担当の少ない低火力構成になってしまったりする。
 どうせ一定数の艦戦が必要になるなら、はっちゃけて空母を増やせば艦攻を大量に増やす余地も出るのだが、ボーキ節約の方針とは真逆になる。何しろ、被撃墜数は割合で決まる(っぽい)ので、艦載機の総数が多ければ被撃墜数も増える(っぽい)。

 ということで、ようやく今日の本題の、艦載機の総数を減らすことで被撃墜数も減らす、という構成である。

 一番簡単なのは、最小スロットに艦攻/艦爆/爆戦を一つだけ積み、他のスロットには副砲や電探や彩雲などを埋める、というもので、ゆるいマップならこれが最良っぽいことも良くある。砲撃戦の火力だけで十分強いだろ、という奴である。
 ゆるいマップの場合、例えばこんな感じでも良さそう。
kaga-xxxsakagi-xxxs
 電探や副砲や彩雲は、空きスロットならどこに装備しても良いし、MVP調整で適当に変えるのも良い。というか俺的に加賀を速攻でLv99というかLv100にしたいので、この記事は基本的に加賀MVP狙い気味である。

 この構成でもそれなりに面白いけど、色々と弱点もある。
 まず、相手の艦載機がろくに墜とせないので、艦載機以外の対空装備がそこそこ欲しい。まあ5-4の開幕航空攻撃はかなり控えめなので、対空の近代化改修が済んでれば装備を手抜きしても大抵大丈夫だけど、ごく稀にドカンとやられることもあるので、三式弾なり対空電探なりの全体系対空装備を誰かしらに積んでおくと結構マシになる感じ。うちでは赤城にその役目を押し付けている。そうしないと赤城が頻繁にMVPを取るので。

 もう一つ怖いのは艦載機の全滅で、空母が完全に置物になる。これを防ぐには、少し多めの機数のスロットにするとか、制空権を改善するとか。
 5-4は、制空権確保を狙うと制空力348という狂った数字が要るのでやってられんけど、喪失を避けるだけなら制空力39という数字なので、16機スロットに烈風を一つ載せるだけでも一応届く。道中の被撃墜を考えるともう少し欲しいけど。
 ということで、制空権喪失を避ける為に、赤城の20機スロットを一つ烈風に変えてみる。爆戦もあれば、制空権喪失は余裕で避けられる。
akagi-fxxs
 この構成だと、5-4一周でボーキ45しか減らなかった、とかいうことも起きる。多い時でも105とかかなあ。烈風20機増やしてでも制空権喪失を避けた方が、結局は被撃墜数も少なくなるっぽい。
 また、10機スロットも最後までぎりぎり耐えられそう。多分。数十回やっても艦載機が全滅したことは無いので、そう簡単に置物にはならない筈。残り1機になったことはあるけど。
 まあ、絶対安全にしようとすれば資材消費も増えるのだ。数十回やって置物化しなかったなら十分だろー。

 つーことで、このパターンを一時は愛用してたんだけど。
 開幕航空攻撃を捨てるのは別にいいとして、砲撃戦での火力も結構下がってしまうのだ。うちはLv30-50くらいの艦も結構5-4にぶっ込むので、フラタ2が相手だと空母の火力がもう少し欲しい。
 そして、爆戦を一つくらい外しても制空状態は変わらないのではないか、という気もしなくもないので、加賀の爆戦を流星改にしてみる。
kaga-xxxt
 実はこの構成は昨日から使い始めたので、安定しているかは全く不明。10周くらいした限りでは大丈夫で、ボーキ消費も大抵二桁だったから、結構良さそうではあるが。しばらく続けないと分からんからなー。
 爆戦を両方外しても耐えられそうなら、赤城の10機スロットも流星改にしちゃえるけど、どうだろうなあ。危ない気はするけど。それにMVP調整もあるから俺はやらんけど。

 まあ、とりあえず今回はこんな感じで。
 他の空母だとまた違った構成になるので、試行錯誤しているとかなり面白い。早く五航戦も育てて加賀と組ませて、微妙な表情になる加賀を妄想したい。あと五航戦くらいのおっぱいに強く反応するセンサーの開発も頑張らないと。
 あと、図鑑の一航戦と二航戦の並んでるとこを見てて思ったけど、確かに蒼龍が一番小さく見えるかも。

追記:
 これ書き終わって三時間くらい後、瑞鶴のおっぱいを五分間くらい見てたらあっさり覚醒した。フフフ、怖いか?


画像フィルタ付きFTPサーバを書いてみた


 Nexus 7で、電子化した漫画とか読むのにさー。あんまり大きいと、転送速度的に糞重くなるじゃないですか。
 でも、それを基準に画質落として保存するのもあれだし、わざわざ低画質版とかを分けて置いておくのも何となくアレで。

 で、オンザフライで画像を加工するFTPサーバなら、Python + pyftpdlib + ImageMagicK + Wandで割とすぐに書けそうな気がしたので、書いてみた。
 ついでに、削除したらゴミ箱に放り込む機能も欲しかったので、Send2Trashも使った。

(2014/7/10更新: 無害だと思ってたおまけ機能が稀にエラーを発生させていたので削除)
server.py:

from __future__ import division, print_function, absolute_import
import ConfigParser
import hashlib
import argparse
import sys
import os
import re
import Tkinter
from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
from pyftpdlib.handlers import FTPHandler, DTPHandler
from pyftpdlib.servers import ThreadedFTPServer
from pyftpdlib.filesystems import AbstractedFS, FilesystemError
from send2trash import send2trash
from wand.image import Image
import wand.exceptions
from StringIO import StringIO



DEFAULT_CONF_FILE = os.path.splitext(__file__)[0] + '.ini'



class Conf(object):

    _parser = argparse.ArgumentParser()
    _parser.add_argument('--hash', help='generate hash, copy to clipboard and exit')
    _parser.add_argument('--conf', default=DEFAULT_CONF_FILE, help='specifies configuration file(.ini)')
    args = _parser.parse_args()

    def __init__(self):
        self._load_conf()

    def _load_conf(self):
        self._conf = ConfigParser.RawConfigParser()
        self._conf.read(self.args.conf)

    @property
    def conf(self):
        return self._conf

    @property
    def listen_address(self):
        return self.conf.get('FTPServer', 'Host'), self.conf.getint('FTPServer', 'Port')

    @property
    def image_target_width(self):
        return self.conf.getint('ImageFilter', 'TargetWidth')

    @property
    def image_target_height(self):
        return self.conf.getint('ImageFilter', 'TargetHeight')

    @property
    def image_shrink_limit(self):
        return self.conf.getint('ImageFilter', 'ShrinkLimit')

    @property
    def image_rotate(self):
        return {'none': 0, 'right': 90, 'left': 270}[self.conf.get('ImageFilter', 'Rotate')]

    @property
    def image_stretch(self):
        return self.conf.getboolean('ImageFilter', 'Stretch')

    @property
    def image_shrink(self):
        return self.conf.getboolean('ImageFilter', 'Shrink')

    @property
    def image_stretch_filter(self):
        return self.conf.get('ImageFilter', 'StretchFilter')

    @property
    def image_shrink_filter(self):
        return self.conf.get('ImageFilter', 'ShrinkFilter')

    @property
    def image_stretch_filter_blur(self):
        return self.conf.getfloat('ImageFilter', 'StretchFilterBlur')

    @property
    def image_shrink_filter_blur(self):
        return self.conf.getfloat('ImageFilter', 'ShrinkFilterBlur')

    @property
    def image_jpeg_quality(self):
        return self.conf.getint('ImageFilter', 'JPEGQuality')

    @property
    def image_trim(self):
        return self.conf.getboolean('ImageFilter', 'Trim')

    @property
    def image_trim_fuzz(self):
        return self.conf.getfloat('ImageFilter', 'TrimFuzz')

    @property
    def re_target_filename(self):
        return re.compile(self.conf.get('ImageFilter', 'TargetFileName'), re.I)

    @property
    def use_trash(self):
        return self.conf.getboolean('Global', 'UseTrash')

    @property
    def users(self):
        return self.conf.items('Users')

conf = Conf()



class DummyHashAuthorizer(DummyAuthorizer):

    def validate_authentication(self, username, password, handler):

        hash = hashlib.sha512(password).hexdigest()
        try:
            if self.user_table[username]['pwd'] != hash:
                raise KeyError
        except KeyError:
            raise AuthenticationFailed



class ModifiedAbstractedFS(AbstractedFS):

    def open(self, filename, mode):

        def call_super():
            return super(ModifiedAbstractedFS, self).open(filename, mode)

        if not conf.re_target_filename.search(filename):
            return call_super()

        try:
            with open(filename, mode) as fd, Image(file=fd) as image:
            # Image(filename=filename) doesn't handle unicode filename

                if conf.image_trim:
                    bg_color = image[0][0]
                    image.trim(fuzz=conf.image_trim_fuzz)
                    if image.width * image.height == 0:
                        image.blank(1, 1, background=bg_color)

                target_width = conf.image_target_width
                target_height = conf.image_target_height
                shrink_limit = conf.image_shrink_limit

                if (image.width - image.height) * (target_width - target_height) < 0:
                    # rotate
                    rotated_target_width = target_height
                    rotated_target_height = target_width
                    degree = conf.image_rotate
                else:
                    # not rotate
                    rotated_target_width = target_width
                    rotated_target_height = target_height
                    degree = 0

                # shrink first
                w, h = rotated_target_width, rotated_target_height
                if (conf.image_shrink and
                    (image.width > w or image.height > h) and
                    (image.width > shrink_limit and image.height > shrink_limit)
                    ):
                    if image.width / image.height > w / h:
                        h = image.height * w / image.width
                        if h < shrink_limit:
                            w = w * shrink_limit / h
                            h = shrink_limit
                    else:
                        w = image.width * h / image.height
                        if w < shrink_limit:
                            h = h * shrink_limit / w
                            w = shrink_limit

                    image.resize(width=int(w), height=int(h),
                                 filter=conf.image_shrink_filter,
                                 blur=conf.image_shrink_filter_blur)

                # rotate
                image.rotate(degree)

                # stretch last
                w, h = target_width, target_height
                if conf.image_stretch and (image.width < w and image.height < h):
                    if image.width / image.height > w / h:
                        h = image.height * w / image.width
                    else:
                        w = image.width * h / image.height

                    image.resize(width=int(w), height=int(h),
                                 filter=conf.image_stretch_filter,
                                 blur=conf.image_stretch_filter_blur)

                image.compression_quality = conf.image_jpeg_quality
                blob = image.make_blob(format='jpeg')
                io = StringIO(blob)
                io.name = filename

        except wand.exceptions.WandException:
            return call_super()

        return io

    def rmdir(self, path):
        if not conf.use_trash:
            return super(ModifiedAbstractedFS, self).rmdir(path)
        send2trash(path)

    def remove(self, path):
        if not conf.use_trash:
            return super(ModifiedAbstractedFS, self).remove(path)
        send2trash(path)



class FilteredImageFile(file):
    pass



def main():

    if conf.args.hash:
        hash = hashlib.sha512(conf.args.hash).hexdigest()
        print(hash)
        copy_to_clipboard(hash)
        sys.exit()

    start_server()



def start_server():

    handler = FTPHandler

    authorizer = DummyHashAuthorizer()
    for username, value in conf.users:
        homedir, perm, hash = value.split(',')
        authorizer.add_user(username, hash, homedir, perm=perm)
    handler.authorizer = authorizer

    fs = ModifiedAbstractedFS
    handler.abstracted_fs = fs

    server = ThreadedFTPServer(conf.listen_address, handler)

    server.serve_forever()



def copy_to_clipboard(value):
    Tkinter.Text().clipboard_clear()
    Tkinter.Text().clipboard_append(value)



if __name__ == '__main__':
    main()

server.ini

[Global]
UseTrash=true

[FTPServer]
Host=0.0.0.0
Port=21



[ImageFilter]

TargetFileName=\.(jpg|png|gif|bmp)$
JPEGQuality=90
Rotate=right
; left/right/none

TargetWidth=1200
TargetHeight=1776
ShrinkLimit=800

; Stretch/Shrink
;   Filter: http://docs.wand-py.org/en/0.3.5/wand/image.html#wand.image.FILTER_TYPES
;     Recommended Filters:
;       "undefined", "mitchell", "lagrange", "lanczos", "lanczossharp", "lanczos2", "lanczos2sharp"
;   FilterBlur:
;       > 1 is blurry, < 1 is sharp
Stretch=true
StretchFilter=mitchell
StretchFilterBlur=0.8
Shrink=true
ShrinkFilter=lanczossharp
ShrinkFilterBlur=0.8

; Trim Edges
;   TrimFuzz: how much tolerance is acceptable to consider two colors as the same
Trim=true
TrimFuzz=1



[Users]
;username=homedir,permissions,password_hash
;   permissions: https://code.google.com/p/pyftpdlib/wiki/Tutorial#2.2_-_Users
;     "e" = change directory (CWD, CDUP commands)
;     "l" = list files (LIST, NLST, STAT, MLSD, MLST, SIZE commands)
;     "r" = retrieve file from the server (RETR command)
;     "a" = append data to an existing file (APPE command)
;     "d" = delete file or directory (DELE, RMD commands)
;     "f" = rename file or directory (RNFR, RNTO commands)
;     "m" = create directory (MKD command)
;     "w" = store a file to the server (STOR, STOU commands)
;     "M" = change mode/permission (SITE CHMOD command)
;   password_hash:
;     generate with '--hash' option and paste it(copied to clipboard automatically)
reader=D:\foo\bar,elr,ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
user=D:\foo\bar,elrdfmM,b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86

 こんな感じで。なかなかのやっつけ感。つーかこれだけで変態FTPサーバが動いちゃうんだもんなー。
 こういうのが欲しい人には非常に便利な気がするんだけど、人に使ってもらう気の無さすぎる記事である。説明めんどくて。コマンドラインに-h付けて起動すれば、あとは勘で何とか…、ならないかなあ。誰かもっと普通に扱いやすいソフトとして作る人いないだろうか。既にあったら、または作ったら教えてください是非。こんなもん捨ててそっち使いますし。
 サンプルがファイル書き込みだけ禁止してるのは、例えばファイルコピーをしようとするとフィルタ済み画像をコピーしちゃうことになるんで、このサーバの動作を考えると危険だな、と。コピーじゃなく移動なら大丈夫だけど。
 あと、サンプルのreaderのパスワードは123456、userのパスワードはpasswordである。最悪パスワードの新旧王者であるな。

 で、ESファイルエクスプローラーでアクセスしてみたんだけど、以前からFTPでの画像ロードに怪しさがあったのが再発して、どうも発生条件が分からんし普通のFTP鯖でも起きるんで、Rhythm SoftwareのFile Managerを使ってみているところ。この変態FTPサーバで使う以外の用途だと微妙だけど、それなりには行ける。ESファイルエクスプローラーと併用するかな。
 Androidのファイルマネージャーってどうも一長一短な感じなんで、結構なチャンスだと思うんだけど、誰か完璧な奴を作ってくれんかなー。

 せっかくなので、コードについての話も書いておく。ここは備忘録でもあるので。

  • ThreadedFTPServerを採用したのは、低速なファイルシステムに近い状態になっていた為。つってもI/OじゃなくCPUなので、Pythonだとマルチスレッドよりマルチプロセス向けなのではないか、と思ったけど、マルチプロセス版のクラスはWindows対応ではないっぽいので。クラス名を一箇所書き換えるだけでマルチプロセス版になるけど。
  • 画像変換のところは同じような処理を繰り返してて汚いけど、とりあえず動かすだけで疲れた。綺麗にするのめんどい。
  • ConfigParser関連ももっとすっきりやれそうな。
  • どうせやっつけなら設定ファイルをわざわざ分けない方がすっきりしたのに、と今では思う。でもまあ、これのお陰で、サーバを動かしたまま別PCから設定だけ変更する、というのが簡単にやれるからいいか。←エンバグしてたので機能削除

 改善案とかのツッコミは歓迎である。


艦これの演習で空母を出す必要が無い謎


 つーか格下狩りかルート誘導の時しか空母出さないこの頃。
 まあ、格下狩りが断然気楽なゲームなので、空母が窓際になったりはしないし、まだ3-2と4-3で止まって経験値稼いでる程度の進行度なんで、高難易度マップでは話も変わるかもだけど。
 隠れた常識なのかもしんないけど、まあ気付かないことも普通にありそうな話なので書いてみる。

 演習で、ですね。ボーキを異様に食われる悩み、あるじゃないですか。
 演習行くと、何か知らんけど相手が倍くらいのレベルの集団であることが多々あるんで、全力で勝ちに行かないと任務が成功しないんだよな。別に成功しなくても大したことねーけどさ。でも、心情的にも勝ちたいじゃん。
 でも、ボーキが毎回のように三桁飛ぶのは相当痛い。まだ俺のとこに空母系が加賀と赤城しかいなかった頃の話だけど。

 一方、どうも戦艦の数の差は結果に相当響くなー、と。戦艦の多い相手には全然勝てない感じがしていた。
 そして、相手がレベル倍くらいで空母3他3とかの演習で、こっちも全力で空母出してもボーキ飛びまくった上に何やかんや撃ち負ける未来が見えて、あーもう負けても経験値は貰えるんだから戦艦並べて突撃してやらー、と。比叡、扶桑、山城、伊勢の順に四隻在籍してたんで、あと雷巡二人で。
 負ける覚悟だったので、ボーキが勿体無いから航空機も一切載せず、航空戦艦も戦艦もみんな主砲2と対空機銃2の夜戦連撃装備で向かったのさ。その頃は電探すら持ってなかったからなあ。41cm砲すら貴重で。

 そして結果は圧勝でした。えー。

 何か知らんけど、開幕の航空戦がさっぱり痛くない。演習補正なんだろか。相手はレベル倍くらいあるのに。
 制空権は失うんだけど、敵の航空機の大群が半分くらい途中で消えて、残りがぼちぼち雷撃してきて、戦艦に当たって一桁ダメージ、みたいな展開なんだけどさ。似たような構成相手に何度やっても、そういう展開にしかならない。いいのかこれで。
 そういうことなので、調子に乗って常に戦艦祭りである。ボーキも消費無し。戦艦5雷巡1の時が多いけど、うちの雷巡はまだLv50行ってないせいか微妙。
 相手に強い潜水艦と戦艦がぞろぞろいる時は、雷巡を甲標的+ソナーにしたり、軽巡を混ぜたり、陣形を変えたりとかで調整してる。きついけど。潜水艦オンリーの相手なら、軽巡と駆逐艦並べて、本気出すなら航戦1と軽母1入れて、単横陣で圧勝だけどさ。

 そして、調子に乗って通常の出撃の時も、空母相手に空母無しで突っ込むことが増えてきた。さすがに戦艦は大抵一隻しか入れないけど、今のところ結構普通にやれる。そのうち無理になってくるのかもだけど、そうなったらそうなったで考えよう。

 ということで、空母はほぼ常に艦攻と艦爆だけ積んで、敵空母のいないマップで無双する為の存在になっていた。
 あと、2-2で空母か軽空母か水母がいると、ボス手前の分岐でボスに行く確率が高いとのことなので(実感として納得もしてるし)、基本的には水母を連れてくけど、空母を連れてく時は艦載機無しで対空砲を積みまくっているのだった。彩雲は積むけど。

 そんな感じなので、うちの空母は仕事が少なめかもしれない。大食いのイメージも別に無いしなあ、赤城以外は。
 とは言っても、何だかんだで結局加賀が最高レベルではある。何故なら加賀は最高だからです。