ミシシッピ川以東のルイジアナ

わたしのブログへようこそ!出てけ

unique_ptrのメンバをnullptrで初期化する必要はない

はじめに

初歩的なミスだが、かなりハマったので念のため残しておく。

環境

C++14を前提に話を進めるが、恐らくそれ以降のC++でも状況は変わっていないと思われる。

$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

TL;DR

std::unique_ptrインスタンスの宣言時、 unique_ptr<T> hoge = nullptr のように初期化すると代入演算子reset() を呼び出すので T の定義をインクルードしなければならない。

hoge をメンバに持つクラスの定義ヘッダなど、余計なインクルードをしたくないときには unique_ptr<T> hoge; だけでも同様に初期化される。

解説

経緯

今回詰まったのは次のような状況だった。

/* Hoge.h */
#ifndef HOGE_H
#define HOGE_H

#include <iostream>

class Hoge {
protected:
    int x = 0;
public:
    Hoge(int x_) {
        std::cout << "Hoge::Hoge()" << std::endl;
        x = x_;
    }

    void printX() const {
        std::cout << "Hoge::x = " << x << std::endl;
    }
};

#endif
/* Fuga.h */
#ifndef FUGA_H
#define FUGA_H

#include <memory>
class Hoge;

class Fuga {
protected:
    std::unique_ptr<Hoge> hoge = nullptr;
public:
    Fuga();
    ~Fuga();
    void func();
};

#endif
/* Fuga.cpp */
#include <iostream>
#include <memory>
#include "Hoge.h"
#include "Fuga.h"

Fuga::Fuga() {
    std::cout << "Fuga::Fuga()" << std::endl;
}

Fuga::~Fuga() {}

void Fuga::func() {
    hoge = std::make_unique<Hoge>(100);
    hoge->printX();
}
/* main.cpp */
#include "Fuga.h"

int main() {
    Fuga fuga;
    fuga.func();

    return 0;
}

Fuga.h では Hoge の具体的な実装を知っている必要はないので、 Hoge.h をインクルードする代わりに Hoge の前方宣言を行っている。

しかしこれをコンパイルしようとすると、「Hogeのサイズがわからんが?」とunique_ptrのデストラクタからお叱りが飛んでくる。

$ g++ -std=c++14 main.cpp Fuga.cpp -o unique  
In file included from /usr/include/c++/9/memory:80,
                 from Fuga.h:4,
                 from main.cpp:1:
/usr/include/c++/9/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Hoge]’:
/usr/include/c++/9/bits/unique_ptr.h:292:17:   required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Hoge; _Dp = std::default_delete<Hoge>]’
Fuga.h:9:34:   required from here
/usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incomplete type ‘Hoge’
   79 |  static_assert(sizeof(_Tp)>0,
      |   

もちろん Fuga.h#include "Hoge.h" すれば解決はするが、こんなにバカバカしい話はない。

原因は代入演算子

このエラーは、Fuga.h における hoge の宣言を次のように訂正することで解消される。

std::unique_ptr<Hoge> hoge;

コンパイラのエラーを読むと発生箇所がデストラクタになっているので分かりづらいが、実は原因は unique_ptr::~unique_ptr() でなく unique_ptr::operator=() 側にある。

/* unique_ptr.h */

// 中略

/// Reset the %unique_ptr to empty, invoking the deleter if necessary.
unique_ptr&
operator=(nullptr_t) noexcept
{
    reset();
    return *this;
}

ということで、代入時にreset()が呼ばれるのが原因であった*1

C++標準化文書にもある通り、普通に constexpr unique_ptr() noexcept が呼ばれた場合でも中身は nullptr となる*2。よってわざわざ = nullptr と書かなくてもnullチェックには問題ないし、むしろしないほうがよい。

timsong-cpp.github.io

$ g++ -std=c++14 main.cpp Fuga.cpp -o unique 
$ ./unique 
Fuga::Fuga()
Hoge::Hoge()
Hoge::x = 100

はい。

デストラクタの定義場所

ところでerror: invalid application of ‘sizeof’ to incomplete typeググるとデストラクタの宣言をヘッダに、定義をソースに書けという内容がヒットする。

実際これは正しい情報で、上のコードからデストラクタを削除するとやはり同様のコンパイルエラーが発生する。 fuga が破棄されるとき ~unique_ptr() が呼ばれるが、~Fuga() がソース側で定義されていない(デフォルトデストラクタ含む)とヘッダ側で Hoge の型情報が必要になるということであろう。

おわりに

今回の問題はインターン先の開発中に遭遇した出来事で、実は原因を教えてくれたのも自分ではなく某先輩である。ここでも改めて感謝申し上げる。

業務内容に直接関わりのある話ではないので大丈夫だとは思うが、もし万に一つでもお叱りを受けた場合には本稿は削除する。

*1:上の内容は nullptr の場合だが、他の引数でも reset() は呼び出される。

*2:文書には "Constructs a unique_ptr object that owns nothing,..." としか書かれていないが、get() が nullptr.get_deleter() と等価になるのは保証されている。

bashからzshに乗り換え

はじめに

環境構築シリーズです。前回↓

jj1lis.hatenablog.com

Neovim がいい感じになったので、次は bash から zsh に乗り換えます。

きっかけ

今のところ自宅環境は万物が bash 前提で構築されているのだが、バイト先では色々あり zsh を使っている。bash とは10年弱を共に過ごした仲(?)なので思い入れがないわけではないが、設定が共通でないと何かと不便であるからこの際 zsh に移行する。

環境

$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=20
DISTRIB_CODENAME=ulyana
DISTRIB_DESCRIPTION="Linux Mint 20 Ulyana"
$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

こうしてみると bash 古いな(ここのところ毎回のように言ってる気がする)。

zsh

そもそも zsh (Z SHell) とは Brian Fox が1990年に開発したコマンドシェルの一つで、1989年に公開された bash と地味にタメを張る大御所シェルである。

www.zsh.org

有名どころのシェルの機能を全て備えた上でいろいろと追加されており、bash に比べると多機能なシェルということになっている。

インストール

とりあえず、兎にも角にも本体がないと話にならない。

$ sudo apt install zsh

ここでいきなりログインシェルを zsh にしてもいいのだが、流石に使いづらいので先に.zshrcの方をある程度整えておきたい。

.zshrc

bash でいうところの .bashrc のように、zsh も対話シェル起動時には .zshrc を読む。

結論から言うとこんな感じになった。

github.com

これを期に整えたりしたが、基本的には bash の内容そのままで問題ない。ただ、プロンプトだけは zsh の記法が使えるので使っていきたい。

プロンプト

bash環境変数 $PS1 でプロンプト(シェルで入力するときに出てる user@hostname: ~ $ みたいなアレ)の見た目を変更できたが、zsh では$PROMPTで設定できる。上のリンク先ではここにあたる。

PROMPT="%B%F{red}%n%f%F{green}@%M%f: %F{blue}%~ \$%f%b "

$PROMPT に指定した文字列がプロンプトになるのだが、一部の情報はパラメータを使って動的に表示できる。上に書いたものでいうと

パラメータ 内容
%n ユーザ名
%M ホスト名
`%~ カレントディレクト

など。またHTMLのタグのように %X...%x と書いて囲った内部の文字列の体裁を変えるものもある。

パラメータ 内容
%B...%b 太字
%F{color}...%f color色に着色

他にもいろいろあるので、詳しくは勝手に調べてほしい。

ちなみに bash のときは同じ内容を設定しようと思うと PS1="\[\e[1;31m\]\u\[\e[1;32m\]@\H\[\e[1;37m\]:\[\e[1;34m\]\w $\[\e[m\]" のように最悪の可読性だったのだが、 zsh は随分と読みやすくて感動した。

sheldon

sheldonBash/Zsh 対応のプラグインマネージャである。

github.com

インストール

Homebrew があれば brew install sheldon でいけるのだが、ないので Cargo を使う。

$ rustup update stable
$ cargo install sheldon

セットアップ

sheldon の設定は ${XDG_CONFIG_HOME}/sheldon/plugins.toml で行う。以下のように、sheldon init で使いたいシェルに応じて(といっても変数の値がちょっと違うだけだけど)plugins.tomlを生成してくれる。

$ sheldon init --shell zsh
Initialize new config file `~/.config/sheldon/plugins.toml`? [y/N] y
Initialized ~/.config/sheldon/plugins.toml
# `sheldon` configuration file
# ----------------------------
#
# You can modify this file directly or you can use one of the following
# `sheldon` commands which are provided to assist in editing the config file:
#
# - `sheldon add` to add a new plugin to the config file
# - `sheldon edit` to open up the config file in the default editor
# - `sheldon remove` to remove a plugin from the config file
#
# See the documentation for more https://github.com/rossmacarthur/sheldon#readme

shell = "zsh"

[plugins]

# For example:
#
# [plugins.base16]
# github = "chriskempson/base16-shell"

一番下にbase16を入れる用例が載っているが、このように

[plugins.<plugin>]
github = "<repo>"

の要領で追記しておくことで自動的にプラグインをインストールしてくれる。

とりあえず鉄板の zsh-autocomplete を入れておく。

[plugins.zsh-autocomplete]
github = "marlonrichert/zsh-autocomplete"

sheldon はこれらのプラグインを適用するスクリプトsheldon sourceで吐き出す。

$ sheldon source
source "/home/jj1lis/.local/share/sheldon/repos/github.com/marlonrichert/zsh-autocomplete/zsh-autocomplete.plugin.zsh"

よって、 .zshrc にでもeval "$(sheldon sourece)" と書いておけば、起動時にプラグインを有効化できる。

$ zsh
Loaded ~/.config/sheldon/plugins.toml
    Cloned https://github.com/marlonrichert/zsh-autocomplete
Locked ~/.local/share/sheldon/plugins.lock

入れたプラグイン

とりあえず列挙するので、詳細はリンク先を見ていただきたい。

zsh-autocomplete

github.com

プロンプトに文字列を入力するとファイルやコマンド、オプションなどを表示してくれたり、コマンド履歴から候補を持ってきて補完したりしてくれる。便利。

zsh-syntax-highlighting

github.com

コマンドは緑、ファイルは下線、文字列は黄色など、入力した文字列に色をつけてくれる。存在しないコマンド名は赤色になるので typo に気づきやすい。便利。

zsh-z

github.com

行ったことのあるディレクトリを記憶しておいて、ちゃんと指定しなくても高速で移動してくれる。

例えば最近行った ~/hoge/fuga/foo/bar/xxx/yyy/zzz/somedir というディレクトリに戻りたいとき、 z somedir と打つと一発で飛ぶことができる。何なら z some のような入力でも気を利かせて移動してくれる。便利。

該当するディレクトリが複数あるときは頻度や一致度から適当に選ばれるっぽい。一応候補は下に出るので自分で選ぶこともできる。

セットアップスクリプト

前回の Neovim と併せて、自動でセットアップを行うシェルスクリプトを書いた。

github.com

環境構築が楽ちんでとてもよい。

おわりに

僕の土日はdotfiles盆栽で消えました゜

Neovimを導入する

はじめに

Neovim を入れます。

環境

こんな感じ。

$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=20
DISTRIB_CODENAME=ulyana
DISTRIB_DESCRIPTION="Linux Mint 20 Ulyana"

きっかけ

僕も一応 Vimmer の端くれではあるものの、元々そこまでプログラミングするタイプではなくて(レポートで LaTeX 書いてる時間が圧倒的に長い)、程々にプラグインを入れたり.vimrcに自作コマンドベタ書きしたりしながら暮らしていた。

ただ最近某IT企業でバイトを始めたことででコーディングの機会が爆増した。しかもかなり大きなプロジェクトで、タグジャンプもカスだし補間も効かないほぼ生の Vim では全く仕事にならない。

ということで(不本意ながら)ゴリゴリにカスタマイズする決意をしたのだが、どうせならメンテナンス性も良さそうだし Neovim にしようかなと思った次第である。

Neovim

とりあえず Neovim を入れていく。

Bob を使いたかった

Bob というバージョンマネージャがあるらしい。せっかくなら導入しよう。

github.com

rustup が要求されるので用意する(元々 Rust の環境があったので今回は割愛)。

普通に入れる分には zip があるので解凍して中の実行ファイルを動かせばいいらしいのだが、肝心のファイルが Releases にあるのが見つけられずにしばらく迷っていた。

$ unzip bob-linux-x86_64.zip
$ cd bob-linux-x86_64/
$ chmod u+x bob
$ ./bob 
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./bob)
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./bob)
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./bob)

glibc のバージョンがないと怒られた。そんなに古いか?

$ dpkg -l | grep libc6
ii  libc6:amd64                                   2.31-0ubuntu9.14                            amd64        GNU C Library: Shared libraries
ii  libc6:i386                                    2.31-0ubuntu9.14                            i386         GNU C Library: Shared libraries
ii  libc6-dbg:amd64                               2.31-0ubuntu9.14                            amd64        GNU C Library: detached debugging symbols
ii  libc6-dev:amd64                               2.31-0ubuntu9.14                            amd64        GNU C Library: Development Libraries and Header Files
ii  libc6-i386                                    2.31-0ubuntu9.14                            amd64        GNU C Library: 32-bit shared libraries for AMD64

ちょっと古かった。いやしかし、流石に glibc を適当にアップデートして依存関係ブチ壊しとかになったら目も当てられないし、全部調べて丁寧に更新するほどの気力はない。 Bob はまた機会があればということで一旦諦めることにする。

仕方ないので

apt installneovimを入れるとv0.4.3が入る。4年以上前のビルドバージョンなのでかなり古い。 そもそも apt が Ubuntu の公式レポジトリから持ってくるアプリケーションは全体的に古く、以前も TeX Live のバージョンが古くてキレたりしていた。 執筆現在で Latest はv0.9.5だから、流石にこちらを使いたい。

Neovim の GitHub レポジトリはこちら。Releases から一番新しい安定版をダウンロードしよう。

github.com

$ mkdir nvim_install && cd nvim_install
$ wget https://github.com/neovim/neovim/releases/download/v0.9.5/nvim.appimage
... # なんかいっぱい表示される
$ chmod u+x nvim.appimage
$ ./nvim.appimage

Neovim が立ち上がる。この時点でalias nvim="<dir>/nvim.appimage"とかしてもいいのだが、この後紹介する nvim-kickstartでその辺の設定までしてくれるので、とりあえず放置でも問題ない。

nvim-kickstart

nvim-kickstart は Neovim 環境構築のために色々盛り込んだスターターキットである。

github.com

Vim でいう ~/.vim/ にあたるのが Neovim では ~/.config/nvim/ なので、ここにレポジトリごとcloneしてぶち込めばよい。

$ cd ~/.config
$ git clone git@github.com:nvim-lua/kickstart.nvim.git nvim

この後 ./nvim.appimage で起動すると、色々表示されて気がつくと色々なプラグインがインストールされている。正直サラの状態で全然触っていないのでどこがどう変わったのか全然わからないのだが、なんかカッコいい感じになった。

また、 nvim で起動するようになっている。ありがたい。

自分で設定

先述の.config/nvim/(以下単にnvim/と書く)の中にはinit.luaというファイルが入っている。これがメインの設定ファイル(Vim でいう.vimrc)である。

Lua

Neovim の設定には VimScript も使えるものの、基本は Lua で書かれている。

-- コメントアウトは "--" で行う

-- ローカル変数は `local` で宣言
-- ちなみに動的型付け
local hoge = 1
local fuga = "Fuga"

-- 配列
local arr = { 1, 2, 3 }
-- ハッシュマップもできる
local tab = { num1 = 1, num2 = 2 }

-- 要素アクセスは 1-indexed なので注意
if  arr[1] == tab.num1 then
  print(":D")
else
  print(":(")
end

だいたい雰囲気で読めるので、書くときに困ったら調べるとよい。

www.lua.org

qiita.com

ファイル分割

現状だと万物が init.luaに入っているのでファイルを分割したい。nvim/lua/ の中に置かれた Lua ファイル <file>.luarequire("<file>") で呼び出せる。また require("<dir>") とすると nvim/lua/<dir>/init.lua が呼び出される。

init.lua の270行目あたりから[[ Setting options ]][[ Basic Keymaps ]]とコメントされている並びがあるのでそれぞれoptions.lua, keymaps.luaというファイルに分けておき、また各プラグインの設定は適宜ディレクトリに分けて次のようなファイル構成にする。

nvim/
 |- init.lua
 |- lua/
     |- options.lua
     |- keymaps.lua
     |- plugin1-config
     |   |- init.lua
     |   |- setting.lua
     |- plugin2-config
     |   |- init.lua
     .........
     ......
     ...
     ..

init.luaには代わりに次のように書く。

-- Read setting options
require("options")

-- Read basic keymaps
require("keymaps")

-- Setup <plugin1>
require("<plugin1>")

...
...

option.luaは好みで以下のような具合に付け足す。

-- language
vim.cmd('language en_US.utf8')

-- file
vim.o.fileencoding = "utf8"

-- cursor
vim.o.cursorline   = true
vim.o.cursorcolumn = true

-- tab
vim.o.expandtab   = true
vim.o.tabstop     = 4
vim.o.shiftwidth  = 4

-- blank
vim.o.list        = true
-- vim.o.listchars   = { tab = '»', trail = '-', nbsp = '+' }

-- display
vim.o.showmatch = true
-- vim.o.relativenumber = true

-- window transparency
vim.o.winblend = 30
vim.o.pumblend = 20

ちなみに完成形はこんな感じ。

github.com

プラグイン追加

先述の通り kickstart.nvim にはデフォルトでおすすめのプラグインがたくさん入っている(厳密にはインストールするよう init.lua に既に書いてある)が、もちろん他にも入れたいものがあれば適宜追加できる。

nvim-web-devicons

github.com

ステータスラインなどで特殊フォントのアイコンを表示する。色々なプラグインが依存しているのでとりあえず入れておくと吉。

lualine.nvim

github.com

ステータスラインをカスタムする。あるのとないのではシャレオツ度がかなり違う。

nvim-autopairs

github.com

カッコ類の補完をしてくれる。正直これがないとやってられない。

Vim 時代は職人手作りの inoremap {<CR> {}<LEFT><CR><ESC><S-o> みたいな設定を .vimrc に書いていたが、このプラグインのおかげで万物が解決した。

nvim-lsp-smag

github.com

tagfunc と LSP の連携をしてくれる。ほとんど使うことはないが、tags で頑張っていた高校時代のプロジェクトも残っているのでお守り代わりに入れてある。

dial.nvim

github.com

カーソル位置の数値をインクリメント・デクリメントする。日付なんかにも対応している。

lpsaga.nvim

github.com

LSP 関連のUIをオシャレにする。まあなくても困りはしない。

lsp-colors.nvim

github.com

Neovim のビルドイン LSP がサポートしていないハイライト等の色定義を追加する。

noice.nvim

github.com

メッセージやコマンドラインモードのときのプロンプトをポップアップウィンドウにしてくれる。

nvim-treesitter-context

github.com

長い関数などで冒頭行が見切れたとき、上部に名前や引数を表示してくれる。

treesitter-unit

github.com

カーソル位置のコードブロックを textobeject u にする。例えば、関数内で yiu とすると関数内部全体をヤンクできる。

hlargs.nvim

github.com

デフォルトだと見分けがつかない関数等の引数に色をつけてくれる。かなり助かる。

sidebar.nvim

github.com

Diagnostics やブランチの状況を表示するサイドバーが追加できる。鬱陶しいので普段は非表示にしている。

neo-tree.nvim

github.com

ファイラ。これがないとやってられないシリーズ。

git.nvim

github.com

Neovim 内部でも Git コマンドが :Git <subcmd> の形式で使える。他にもキーバインドを色々設定できるが、ミスタイプで変なことをすると怖いので使っていない。

vim-illuminate

github.com

カーソル位置の単語をうっすらハイライトする。コードを読むとき、検索するほどでもない場面で目 grep する必要がなくて非常によい。地味にこれがないとやってられないシリーズ。

todo-comments.nvim

github.com

TODO:, WARNING:, FIX: などのテキストを目立たせる。かなり派手。 自分の環境だと何故か NOTE: で出てくるアイコンだけ上手く表示されず、ミトコンドリアみたいになっていてかわいい。

cmp-cmdline

github.com

コマンドラインモードで補完が使えるようになる。これがないとやってられないシリーズ。

cmp-buffer

github.com

バッファの操作に補完が使える。あまり使っていない。

vimtex

github.com

LaTeX のファイル編集や LaTeX コマンドの実行に便利なプラグイン。本当に一年中 LaTeX を書いているのでこれがないとやってられないシリーズ......と言いたいのだが、微妙に痒いところに手が届かず、結局自分でスクリプトを書いて補助している。

おわりに

この期にエディタ以外にもシェルとかターミナルとか色々いじる予定なので、シリーズ物になると思います。

日記: Telescope.nvim の live_grep が使えなくて焦った話など

ツイートするにはちょっと込み入っていて、かといって一個一個が記事になるほどでないけど備忘録を残しておきたい :tiken: をいくつか得たので日記として残す。

telescope.nvim の live_grep が効かない

telescope.nvimは Neovim で fuzzy finder を提供するプラグイン

github.com

何もわからないままkickstart.nvim でとりあえず入れたが、調べてみるとlive_grepという関連ファイルからいい感じに検索できる機能があるらしい。

kickstart.nvim ではデフォルトで <leader>sgが割り当てられており、入力するとポップアップまでは出るのだが、そこから文字列を入れても~/.local/share/nvim/lazy/telescope.nvim/lua/telescope/pickers.luaがどうこうみたいなエラーが出て検索できない。

ちゃんと GitHub の README に書いてある(さっき気付いた)のだが、live_grepなどいくつかの機能は ripgrep に依存しているので先に sudo apt install ripgrep などして入れておく必要がある。

github.com

りどみはちゃんと読もう。

背景

最近 Vim から Neovim に乗り換えたのだが、kickstart.nvim (スターターキット的な設定ファイルとプラグイン詰め合わせ)に万物が付いてきて非常に重宝している。kickstart.nvim 導入の話もちゃんと書いておきたい。

convert で画像を分割する

ImageMagickconvertコマンドで画像ファイルの一部分だけ切り取るときは-cropオプションを使う。

# <inputfile> の点 (<x>, <y>) から幅 <w> 、高さ <h> の画像を切り取る
convert -crop <w>x<h>+<x>+<y> <inputfile> <outputfile>
# 幅と高さは割合 (%) でも指定できる
convert -crop <W>%x<H>%+<x>+<y> <inputfile> <outputfile>

# 点を指定しないと左上からその大きさで順に切り出される
# 出力ファイルは連番で出る(<outputfile> = <name>.<ext> なら <name>-n.<ext> の形式)
convert -crop <w>x<h> <inputfile> <outputfile>
# input.png を4分割して、output-0.png, ..., output-3.png に出力する
convert -crop 50%x50% input.png output.png

背景

技術英語(大学の英語科目、通称「ぎえー」)で使うA2ポスターをGoogle Slidesで作成して画像ファイルに出力したのだが、A4までしか印刷できないので4分割して出力してから貼り付けることにした。

型推栄Pのシャニアニネタバレ感想:または我々はいかにしてシャニアニを評価すべきか

はじめに

本記事はアニメ『アイドルマスター シャイニーカラーズ』(以下『シャニアニ』)劇場先行上映第1章〜第3章の視聴レビューです。したがって、シャニアニ第1〜12話の内容に関するネタバレを含みます。

またこの記事には、シャニアニに対するネガティブな感想が含まれます。

筆者について

型推栄かたすいろんです。 ちょうど去年の1月にシャニマスをはじめたプロデューサー1年生です。最近はミリアニにお熱ですが、ゲームはシャニマスをメインでプレイしています。とはいえそんなに熱心にやる方ではなく、とりあえず手元で読めそうなコミュを読むのが主目的、あとはたまに思い出したかのようにTrueEnd埋めするくらいの温度感です。

注意点

ということで1stLIVEはじめ過去のライブのネタは全く拾えませんし、劇中で引用されているが持っていないので読めていないコミュはごまんとあるものと思われます。 また当然ながら僕は作劇やアニメーション制作、3Dモデリングについても素人であり、これらについて専門的観点からコメントしているわけではありません。 つまりネット上のほとんどの言説と同じように、これっぽっちの信頼も置かずに読むよう注意願います。

本評では何度もアニメ『アイドルマスター ミリオンライブ!』(以下『ミリアニ』)を取り上げて比較しますが、これについては賛否両論あるようです。アイドルマスターという同一IPから同時期に公開されたコンテンツであり、劇場で先行上映された3Dアニメという共通点からも、僕はミリアニとシャニアニとは比較されて当然だと考えています(前者の意味ではU149とも比較すべきでしょうが割愛します)。

感想

以下、思いついた順。1章や2章は詳しい部分についてあまり覚えていないので、細かい演出等については3章の話が主になる。

オフィスカジュアルタイツはづきさん

バンナムはSpread the Wings!!(七草はづきver.)を発売すべきだし、高山Pは普段の事務員服じゃないけどちょっとフォーマルな服装のはづきさんを押し出してほしい。

もっと曲を流してほしかった...

とにかくこれに尽きる。シャニマスとはいえアイマスのアニメなのだから、楽曲出してナンボだろと思う。

ストレイライト以降が出なさそうということであまり最近の曲は来ないだろうとは思ったが、まさかBRILLI@NT WING分だけとは...

絶対にイルミネが3人で星空の下に座って話しながら『トライアングル』が流れるシーンが来るだろうと勝手に思ってたし、ガン泣きする準備もしていた。三峰のてやーん!で笑う腹づもりもあった。それがちょっと残念だ。

誰に焦点を当てるか

アイマスの常だが、物語はいわゆる「信号機トリオ」を軸に展開される。ミリアニであれば未来を中心に原っぱライブやシアター柿落し公演の話が進む中、静香と父の関係、翼の”本気”の問題にも焦点が当たる。

シャニアニも勿論イルミネが話の中心にはいるのだが、その中でも主役が真乃に固定されている。灯織やめぐるをメインとしたトピックは限定的で(初期灯織の狂犬ムーブなどはあるが)、あくまで真乃目線で彼女に寄り添う二人が描写されているに過ぎない。彼女たちについてももう少し描写があってもよいと思った。その割には、真乃についても深堀りされているかというと疑問が残る。

その上、シャニアニには4つのユニットをなるべく均等に描写しようという意図があった。構成上イルミネとアンティーカの割合が大きくはなるのだが、ライブの楽屋や全体練習のように全員がいるような場面では、アルストと放クラもほとんど同等の時間を割いてやり取りが描かれていたように思う。その均等さはミリアニと比べるべくもない*1

結果としてシャニアニはどのユニットにも十分な焦点が当てられておらず、第3幕の全体ライブは特に顕著だった。WING敗退後の描写はよかったので、単純に1ユニットを最低限描くのに必要な時間的オーバーヘッドが大きいのだろうか。つまり、中途半端に会話を挿入しても食う時間に見合うだけの深堀りができないのである。一部のユニットは曲披露だけにして、その分イルミネの込み入った会話をもっと入れてよかったのではないだろうか。

話の抑揚がない

極論、物語は

  1. 何かをしたいという目標がある
  2. 問題が発生する
  3. 問題を解決する
  4. 目標が達成される

というサイクルではないかと思う。これが合理的に、かつ継続的に繰り返されることで、納得感を維持しつつ受容者の感動に揺さぶりをかけることができる。

例えば

  1. アイドルになりたい
  2. オーディションに合格しなければならない
  3. 2人で練習する、本番で背中を押してもらう
  4. アイドルになれた

とか

  1. ライブをしたい
  2. 場所がない、同意が得られない、ステージがない、練習が足りない
  3. 原っぱでやる、みんなで話し合って同意を形成、手縫いでテントを作る、シアターで合宿する
  4. 原っぱライブができた

というふうに。ここで発生する問題解決の過程が感動の波であり、問題が大きいほど振幅が大きく、頻度が高いほど周期が短くなる。あまり大きな波が頻繁に起こっても疲れるので、ここはバランスであろう。

シャニアニはとにかく話に高低差がない。少なくとも、”分かりやすい見せ場”は存在しない。

シャニアニは1〜4話(劇場第1章)でそれぞれ1話ずつ使って各ユニットの紹介、5話以降(劇場第2章、第3章)はWINGおよび全体ライブへ向けた活動が主軸となる。

上記の意味では、第1章は分かりやすい展開が多かった。満足のいくMVを作るために奮闘するアンティーカとか*2、ヒーロー不在のヒーローショーを盛り上げようとする放クラとか。

第2章以降のWINGと283プロライブについては、真乃の視点から目の前の課題を解決することに重点が置かれる。これらが視聴者にとってなぜ十分な大きさの波でなかったかについては直後に述べる。

事件

アニマスで言えば、仲間の離散による春香の動揺。週刊誌により浮き彫りになった千早と家族の問題。竜宮小町に関する美希とPのすれ違い。登場人物について我々が深く知るには彼らの心情や状況、関係性を大きく突き動かすようなイレギュラーが必要とされ、そのための舞台装置として何らかの事件が起こる(ここでいう「事件」とは、後述の意外性を包含した言葉である)。

先述の真乃の深堀りにせよ、話の抑揚にせよ、シャニアニには事件が起こらない。

意外性

先述の通り、物語上の出来事には前後の整合が要求される。Aという出来事の後に描かれるBが、Aの元では起こりえないようでは当然矛盾を生じる。あるいは矛盾しなかったとしても、あまりにも脈絡がないようでは困る。

一方で受容者を満足させるためには、意外性がなければならない。必然でないと言ってもよい。アニマスの終盤で765プロがみんな売れるようになって、もし春香がそれに順応して何事も起こらないままライブが成功したら、そこに至るまでの数話は全くの無駄である。ここで春香が曇り、Pがケガをするという必然でない事件が起こり、最終的にそれらが解決されるカタルシスによってこそ、視聴者の感動は揺さぶられるのである。

シャニアニで、真乃の身に事件があっただろうか。スカウトとかセンターへの抜擢とかライブ前の特訓とか、そういうイベントは確かに定期的に発生するし、その度に真乃の心理は丁寧に描かれる。しかし視聴者にとって、それは彼女がアイドル活動をする上で当然に想定できる試練であり(悪い意味で期待を裏切らない)、既定路線をなぞるだけ、あるいは何も起こっていないのと同じなのである。

ただまあアニマスは2期あったし、ミリアニは全員をまんべんなく描いたわけではない。そこは考慮する必要がある。

シャニマスの方向性

そもそも、シャニマスは特異な属性を持つアイドルの物語ではない。昆布巻きのサンタクロースもわるいオタク(Lv.255)もいないし、みんながみんな特筆するような理由わけがあってアイドルしているわけでもない。

(エビさんとかダンベ君主論とか財布なかったりとか、そういう素っ頓狂さは持ちつつ)普通の女の子であるところのアイドルを、等身大で描くのがシャニマスというコンテンツであったはずであり、我々はこれに異存ない。これはサスペンスやスペクタクルの目線ではそこまで面白みがないかもしれないが、彼女たちの日常の出来事や、そこで起こる細やかな心の機敏をわずか垣間見ることに喜びを感じるのである。

このような表現は、受容者が能動的に消費できるような状況、まさしくシャニマスのようなノベル形式では全く問題ない。一方でアニメのように受動的に消費せざるをえない媒体では、受容者が今までに述べたような「楽しみやすさ」を求めるのも必然であろうと思われる。

霧子のガーゼ

本当によかった。僕はガーゼになりたい。

3Dモデル

シャニアニとミリアニはどちらも3DCGを用いて作画されたアニメだが、人物造形の方向性が異なる。元来のアニメ的表現に寄せたミリアニに比べると、シャニアニは美麗さに重きを置いている。

ミリアニのコミカルでキュートな未来ちゃに比べると、本作の真乃はかわいいより「美人」という表現の方が当てはまる。特に咲耶とかすごかった。それ自体は悪くないと思うし、シャニマスの雰囲気にも合っていると感じた。ただ後述のように、動画演出の面でこの路線は悪手だったように思う。

動きとフレーム

正直、シャニアニのカクカクした動きが鼻についた読者は少なくないだろう。少なくとも、僕は視聴しながら事ある度に気になって仕方がなかった。一方でミリアニはそこまで気にならない。

もちろん第一の要因は映像技術であろう。フレーム以外にも思うところがなかったわけではないが、これについてはまったくズブの素人なので、語らないこととする。

第二に、シャニアニは物語だけでなく、映像としても動きが小さかったという点を挙げたい。ミリアニで画面中を四方八方動き回っていた茜ちゃんの姿は印象的だが、ミリアニではよりアニメ的な、動作と始点と終点の時間が長く、間のコマを落とすようなキビキビした表現が多く使われている。

シャニアニの美麗なモデルに、そのようなコミカルな動きをさせるのはあまり合わない。結果として動作をゆっくりさせることになるのだが、これによりカクカクさがより目立って、動きがもっさりして感じられたのではないだろうか。 実際、動きの激しいライブシーンではそこまで違和感を感じなかった。

汗の表現

汗で張り付いた髪の表現に対するこだわりは一体何なんだ。制作陣にそういう性癖の人がいるのでは?

第3章合宿シーンの果穂

目がしいたけになった果穂からしか摂取できない栄養素は存在します。

Pの「話したいこと」

プロデューサーから全体ライブでセンターをしてほしいという頼みを受けている真乃は、(確か)9話でプロデューサーに「話したいことがある」と事務所に呼び出される。そこで真乃は依頼を承諾する旨をプロデューサーに伝える。

その後すぐに場面転換があってライブ直前くらいまで時間が飛ぶのだが、結局プロデューサーが真乃に話したかったこととは何だったのだろうか。本当にこれが上映中気になって仕方なかった。

2期

3章のほんへ後にはストレイライトとノクチルの7人が映っているシーンが挿入され、そして "TO THE NEXT STAGE" の文字。もちろん2期の匂わせである*3

我々は2期に期待すべきなのだろうか。1期と同じ様子で続くのなら正直つらいものがある。ただストレイもノクチルも盛り上がるコミュには事欠かない*4ので、大丈夫な気もする。

宣材資料

アニメの内容とは全く関係ないのだが、劇場第1章の入場者特典は283プロ宣材資料だった。

283プロの封筒から樹里ちゃんが顔を見せた瞬間、初めて回したガチャで出てきた初SSRの「【I・OWE・U】西城樹里」を、初めてのWING優勝を思い出して泣いた。シャニアニで最高の体験だったと言っても過言ではない。

結論

最高のアイドル、西城樹里ちゃんをよろしくお願いいたします。

𝑩𝑰𝑮 𝑳𝑶𝑽𝑬...

*1:勿論39人のミリオンと16人のシャニマスでは人数からして違うのだが。

*2:わかるな?

*3:シーズ以降を出そうとしたら七草家や社長、ルカについて突っ込まなければならず、劇場版が1本できるし七草弁護士銀幕デビュー不可避であろうから仕方ない。

*4:天塵を地上波で放送してほしい。放送されるまで死ねない。

円盤を初めて買った

表題の通り。アニメ『アイドルマスター ミリオンライブ!Blu-ray第1巻を購入しました。

shop.asobistore.jp

ここでいう「円盤」とは、DVDやBlu-rayなど光ディスク媒体の映像メディア商品のことを指すインターネットスラングである。

インターネッツでは、アニメについて語られるときはしばしば円盤の売上に話題が及ぶ。例えば僕が大好きな『キルミーベイベー』に関して言えばBD第一巻の初動売上が686枚とかなり低調だったことが擦られがちである。とかく現代のアニメは、円盤はじめメディア商品の売上が続編の有無を左右するのである。

僕は今まで円盤を買うほど何かしらのアニメに入れ込んだことがなかったのだが、買ってしまった。ミリアニは1幕から3幕まで先行上映は全部観に行ったし、Rat A Tat!!!は1日n回聴いている。本当に全人類に聴いていただきたい。

www.youtube.com

それで今日、インターン帰りにシャニアニ第3章を新宿ピカデリーで視聴して、家に帰ってきてパソコンをつけると、まさに今ピカデリーでミリアニオールナイト応援上映会をしているではないか。バカなことをした、なぜ自分はそこにいないのだろう!

マケグミ=サラリマンめいて上映前の舞台挨拶をニコ生で眺めているとみんな2期の話をしていて、これは応援しなければと思い、悪の権化ことアソビストアで衝動的にミリアニ第1巻を購入つかまつったのである。

読者諸君にも円盤を買ってほしいとは言わないが、是非ともミリアニを見てほしい。本当に面白いからさ......

そしてWat A Dat!!!監督、頼むから2期を作って......

0.5泊3日で840km走ってラーメンを食べに行ったら原始的恐怖を味わった話

はじめに

この記事は 散歩・徒歩・苦行 Advent Calendar 2023 の19日目 (12/19) です。アドカレの趣旨がアホすぎるだろ。

adventar.org

昨日はもっちゃんさんの『徒歩部、府中の公式徒歩イベントに参加した話』になるはずでした(予定地)が、実験で遅れるそうです。年末の風物詩ですね。

概要

夏休み中の9月4日夜から9月6日朝にかけて、バイクで仙台まで行ってきました。ちなみに仙台というのは東京から北に300kmくらいのところにある謎の都市です。

仙台。勿来関より北にあるのでたぶん蝦夷だと思う。

ええ、徒歩でも散歩でもないですし、ATPじゃなくて石油を燃やして走ってる時点で苦行でもないだろというご指摘はごもっともです。ただバイクにはバイクなりの苦しいポイントがあり、僕の中では十分に苦行だったのでご容赦いただきたいのです。

なおバイクの旅行は徒歩や鉄道、普通車のそれに比べると写真が撮れなかったりツイートができなかったりと記事にするには結構致命的な欠点が多々あり、時刻や場所の記述は定かではないのでご了承ください。

ちなみに

二輪の免許を取ったときの話はここ↓にあるので、この記事を読んでカスのツーリングをしたくなった人はぜひ参考にしてください。

jj1lis.hatenablog.com

普通二輪免許は本当に簡単に取れるので、人類は普通車だけで満足せず今すぐ教習所へ行こう。

ゆき

9/4 夕方ごろ

あと1ヶ月も残っている夏休みを持て余し始め、「そろそろ遠く行きたいなー」と不意に思いつく。僕の趣味は主目的は移動することなので、目的がなくてもとにかく出かけることをまず決めてしまう、移動駆動旅行 (MDT: Motion-Driven Traveling) が基本です。

とりあえず遠くに行きたかったので、東京から片道300km以上は離れているいい感じの都市を決めます。

東京から半径300kmの円。意外とデカいですね。

9月初旬というと暦の上ではとっくに秋のはずですが、令和の9月はまだまだ夏本番ですから、なるべく涼しい場所に行きたいのが人情というものでしょう。北のほうがなんとなく気温が低そうだなという偏見(実際はそうでもない)に従って仙台行きを決めました。

そういえば部活の後輩が仙台二郎をオススメしていたことを思い出しました。丁度いいし、食べにいきましょう。

ちなみにこの時点では、あわよくば盛岡あたりまで行こうかなという信じられない考えが脳裏に浮かんでいます。冷麺とか食べたいですからね。

20時くらい:準備完了

我が家にしては早めの夕食を終え、旅支度を終えます。今回のお供は愛車のVストくん。中古で買ってから1ヶ月くらいの一番楽しい時期ですね。

雲海を見に行ったときに撮ったVストローム250。丸目がサイクロプスみたいでかわいいね。

このときは2,3泊する予定でしたし、先述の通りもっと遠くまで行くかもしれませんでしたから、めちゃくちゃデカいバッグに数回分の着替えを詰め込みました。

21時くらい:出発

......何故1時間も空いたかというと、ゴミカスなことにバイクの駐車場が自宅から6km近く離れていたからです。人が住むのにも一杯いっぱいな大都会東京において、二輪車の駐車場というのは本当に貴重です。ましてや好立地な物件はn年待ちか法外な賃貸料かの二択ですから、バイクに乗るために必死こいて自転車を30分漕がなくてはなりません*1

しかも今回のバッグは大きすぎて自転車には積めないので、丸腰で行ってからバイクで一度自宅に戻り、荷物を括り付ける手間が発生します。あほくさ。

こんな時間に出発するのは気温のためです。そもそも二輪運転とは全身丸出しのまま数十km/hで移動する大変危険な行為ですから、法令で義務になっているヘルメットはもちろん、衝撃を緩和するプロテクタを全身に装備するのが(脳みそと安全意識がすっからかんな連中を除けば)当たり前です。そんな中で9月の真っ昼間に何時間もバイクを運転すれば熱中症になるのは必須なので、僕は夏に遠出するときは必ず夜間に移動しています。

ルート

東京―仙台間の移動は、内陸を通る奥州街道ルート(東北本線東北自動車道など)と太平洋側を通る水戸街道浜街道ルート(常磐線常磐自動車道など)に大別されます。主だった一般道では、それぞれ国道4号国道6号が該当します。

しかし一般に知られている通り、宇都宮以南のR4は無法地帯です。特に深夜の新4号バイパスは魔境で、プリウスアルファード、大型トラックたちが並行する東北自動車道と同じくらいのスピードで往来しています*2

私はまだ命が惜しいので、R6経由で向かうことにしましょう。だいたい片道400kmくらいですから、休憩も合わせると朝の9時くらいには仙台に着けそうですね。

9/5 0330:なか卯 茨城石岡店

日をまたぎ、6時間も運転していると流石に疲れてきます。二輪は走行風を直に受けるほか、ちょっとした停止中に水が飲めなかったりヘルメットが重くて頭が痛くなったり、道路のふとした段差でコケそうになったりと、普通車に比べると何かと気を張ります。そろそろ休憩しましょう。

こういうときは大体牛丼屋に入るのですが、なんとなく牛丼の気分じゃないな〜と思いスルーしたり、その後全然飲食店がなくて後悔しはじめたりとしているうち、霞ヶ浦*3を越えたあたりでようやく見慣れた看板を発見しました。

ちなみに 520 = 23 * 5 * 13 です。

お腹いっぱいになると今度はまぶたが下りてきます。一次的欲求なので仕方ありません。僕の実家こと快活CLUBを探すと......

めちゃくちゃ近くにありました。

もちろん、すぐに飛んでいきます。

ぼく「個室空いてませんか?」

店員「満室ですね〜」

ぼく「じゃあブースは?」

店員「空いてないですね〜」

ダメでした。仮眠するか。

エクストリーム仮眠

もしこれが家の軽だったら鍵閉めてシートを倒すだけで快適に眠れるんですが、バイクなのでそうはいきません。

着の身着のまま気楽な臥所←バカタレ

スタンドを立てたバイクに跨がり、前方に倒れてタンクに寄りかかります。足はステップに乗せて、手は適当にハンドルを握ったり頭の下に敷いたり。近くの茂みから虫が大量に湧いていて、かまれるのが嫌だったのでプロテクタもジャケットも全部着けっぱなしです。

正直めちゃくちゃ辛いし嫌だけど、仮眠に使えるような道具も持っていないので仕方ありません。結局20分後くらいに目が覚めて、気がつくと手首や足首に蚊のかんだ跡がいくつか残っていました。かゆい。

0430:常磐線勝田駅付近

辺りが明るくなってきました。日の出です。 R6はこの後もどんどん太平洋に近づき、日立あたりからはついに海が見えるようになります。いいですよね、海。あったら見たくなります。

ただ、ここで

どうせなら海側を通りたくないか?

という思いが浮き上がってきます。せっかくなら違う道を走りたいので帰りは別ルートから帰るつもりだったのですが、往路(北行き)でR6を使うと陸側を通ることになります。せっかくのオーシャンビューが台無しです!(そんなことはない。)一方、南行きであればすぐ左手に海を眺めることができます。

したがって予定変更。R6は復路で使うこととし、今は何とかR4に合流することとします。

青い線(東北新幹線)のあたりがR4。無駄すぎる。

水戸と郡山をつなぐJR水郡線に並行して国道118号が通っています。ルート的にも少ないロスで合流できますし、タイミングがよければ山あいを走る列車を見ることができるかもしれません(できませんでした)。

R118は鉄路と共に、左手の八溝山地と右手の阿武隈高地に挟まれながら北上していきます。 久慈川が作った谷には朝霧が出ていて非常に幻想的でした。

とか言ってますが、涼しいし景色も綺麗だし、この辺りが今回の旅行で一番楽しかった時間帯ですね。

0630:水郡線磐城石川駅付近

もうぼちぼち郡山です。そうすればあとはR4に沿って北上するだけなんですが、ご飯と仮眠、美しい風景で元気が出てきたからか、

どうせならもっと訳わからん道を通ったほうが楽しいのでは?

という考えが浮かびます。結果、そのまま真っすぐ行けばいいものを途中で右折、よくわからん県道(たぶん福島県道40号)に入ります。

0700:道の駅ひらた

↑これはイナズマイレブン今日の格言みたいな張り紙

途中にあった道の駅でトイレ休憩し、あぶくま高原道路を経由して国道349号に出ます。

その後しばらくは特筆すべきことがなく、森、田んぼ、家、たまに市街地をひた走ります。ただ虚無だったかというとそうでもなく、9時くらいから晴れてきたことで初めてお天道様を拝むことができ、しかも高原のため気温も快適で、明るい気分でツーリングできていました。

1000:東北本線槻木駅付近

R4柴田BPに合流。普通なら仙台まであと30分の距離ですが、すごい渋滞です。

当然ですがバイクには空調がありません。エンジンは水冷ですが、ライダーは走行風で空冷する前提の設計になっています。 にもかかわらず、渋滞で風などロクに受けることができません。ピーカン晴れな仙台付近の気温は既に30度に届こうかという具合で、加えて先述の通り当時の僕はフル装備でしたから、蒸し風呂に入っているも同然です。

普段なら少しくらい大丈夫なのですが、既に12時間以上運転している状況ではすぐに体力が尽きてしまい、ひょっとして熱中症かも...? という体調の悪さを抱えながらようやく仙台市街に辿り着くこととなりました。

1100:広瀬通地下自転車等駐車場

仙台市街にはバイクを止められる駐車場がたくさんあります。しかも一時利用料は1日100円前後。これはマジで凄いと思う。

今回使ったのは広瀬通にある地下駐車場だったのですが、利用にかなり苦労しました。

入口のストリートビュー画像

まずこの路肩でバイクを降り、ポールを避けて歩道に上がり、さらにスロープを降りる必要があります。小さな原付なら楽かもしれませんが、Vストはまあまあ重い部類のバイク(乾燥重量189kg+ガソリン、装備等)で車体も大きいのでかなり苦労しました。

さらに、今回持ってきたバッグには鍵がつかないのでバイクを降りた後も置いていくわけにはいきませn。気合いを入れて荷造りしたクソデカバッグには数日分の着替え、工具、プロテクタ、飲み物などが入っており、量ってはいませんが15kg以上はあったと思います。米の袋か?

とても持ち運べないと思い、急いで近隣の一番大きなコインロッカーを探しますが......全然入らない。無理もありません。バッグは 71cm x 35cm x 37cm もあったのです。

長辺が本当にデカすぎて、これが入るロッカーは仙台駅を挟んだ1km先にしかありませんでした。絶望です。

1130:ラーメン二郎 仙台店

ヤケクソでバッグを担ぎ、とりあえず二郎を目指します。駐車場から店までは500m。これだけの距離でもフルマラソンを走った後のごとく汗だくになりました。

到着したときにはまだ2人しか並んでいませんでしたが、開店まで30分くらい待つうちに20人近い行列ができていました。二郎ってどこ行ってもこんな感じですよね。

小豚(850円)の食券を買って席につくと麺の硬さを聞かれ、二郎にしては珍しいなと思いつつ「じゃあ硬めで」と答えましたが、後から調べたところによると10カタなどもあるようです。しばらく待ってアブラカラメをコール。この時はまだまだ他の場所にも行くつもりだったので、ニンニクはやめておきました。

ちなみに味は普通でした。やっぱり府中二郎なんだワ。

1400:ずんだ茶寮 仙台駅ずんだ小径店

仙台に来たときはずんだシェイクを飲むことが道徳的義務です。よって今回も当然ずんだシェイクを買い求めます。

さらに隣にあった喜久水庵のずんだソフトも食べます。おいしい。

いやもう本当にずんだが大好きで、ずんだ餅は見かける度に買うしずんだシェイクも来る度に飲むのですが、クッキーに練り込んであるようなものは別に好きでもないんですよね。どうしてでしょうか。

とりあえず仙台駅を練り歩きます。

『【夜明けの晩に】杜野凛世』を読め。

さて、ここまでクソデカバッグを担ぎながらラーメン食べたりシェイク飲んだりあっちこっち行っていましたが、ここでいよいよ体調が最悪の域に突入しました。徐々に度を増す頭痛、吐き気、倦怠感に熱中症を確信。ダメだ、とりあえず一旦休むか......と思いつつ、必死こいてバイクを地下から引っ張り出します。

1630:スーパー銭湯 極楽湯 多賀城

これは本質情報なのですが、限界旅行で仙台に来た際は多賀城周辺を活動拠点にするとよいです。温泉宿や高い飯に興味がない旅行者はネカフェやスパ銭で休むことと思いますが、塩釜ほど仙台から遠くなく、中心街より圧倒的に安いです。

18きっぷで仙台に来るときはいつも中野栄で降りて多賀城の快活に泊まるのがルーティンになっていたのですが、そのすぐ近くにあるスーパー銭湯が良さそうで気になっていたので入ることにします。

入浴料700円、普通のお風呂、普通の雑魚寝スペースでいい感じでした。30分くらいで風呂からは上がり、あとは気が済むまで寝ます。

2000

寝ている間に土砂降りになっていたようです。クソが代。

スマホを開くと、9/5の昼過ぎから数日間の宮城以北は雨予報になっています。毎回毎回、なぜ出発前に天気を確認しないのでしょうか。つまりこのまま東北に滞在してもずっと雨。おまけに今の自分は熱中症。今なら天気は小康状態で、雨雲レーダーを見る限り福島以南の常磐方面は晴れている。

まだラーメン食ってずんだシェイク食べて風呂に入っただけですが、帰ることにしました。

かえり

というわけで、R6経由で帰ります。傷口の広がらないうちに撤退の判断をすることは限界旅行において非常に重要です。

雨雲を避けてポイントを打ち、Google Mapで検索するとだいたい430km。時間的にも結局海は見れそうにありません。

2015:よくわからない道

とにかくGoogle先生の言う通りに走る以外にやることがないので素直に従っていると、めちゃくちゃ海沿いの高規格な市道に誘導されます。正確には地図を見る限り海沿いと分かるだけで、人家はおろか街灯すら設置されておらず、ハロゲンの心もとないヘッドライトが辛うじて道の土手全体を照らしているくらいでしたが。 怖いから人通りの多い道を通りたかったのですが、気付いたときにはもはや大通りに繋がる横道すらありません。

フォグランプがクソ眩しいトラクターに後ろから煽られ、譲りたいけど譲る道幅がないまま走っていると、天気予報に反して雨が強まってきました。濡れた身体に60km/hの走行風が当たって凍えそうなくらい寒いし、濡れたマンホールを踏んで後輪が滑るし、後ろのトラクターは怖いし、そもそも体調は悪いし、暗いし。冗談抜きに泣きながら走っていました。

2030:気が狂いそうになるが、何とか持ち直す

件のトラクターと分かれるのと同じくらいに雨が止み、何とか普通の走行状況に戻ることができたのですが、同時に自分の周りから車が全くいなくなりました。

遮るものが何もないだだっ広い空間で、たまに設置された道路灯から道の形がかろうじて分かりますが、見渡す限りは後続車も先行車も、対向車もいません。ひょっとしたら、見える範囲にいる人間すら自分だけだったかもしれません。 聞こえるのはヘルメット越しの風切り音だけ。気が狂いそうでした。

僕はとりあえず知っている曲を片っ端から歌うことにしました。しかし "The world is all one!!" を歌おうとしたときに「ひょっとして世界には自分しかいないのではないか」などと考えてしまい、他のジャンルも歌詞のちょっとした部分が不気味な想像に繋がって、最後にはアンパンマンくらいしか歌えなくなっていました。

県境を越え、相馬市街の手前あたりで何かの工場のプラントが見えてきて、それを越えるとようやくR6に合流します。交差点の信号が見え、他の車やガソリンスタンドの灯りが目に入ったあの瞬間以上に安心したことは、今までの人生でもそう多くありません。

2200:ひとりしりとり開始

とはいえ本質的な状況はそう変わりません。天下の一桁国道でもライトは殆どないし、対向車も数分に一度、何より延々と風切り音だけが聞こえているのが良くありませんでした。

何か考え続けなければ本当に気が触れそうなのに、真っ暗な風景から得られる情報は何一つとしてなく、考えを巡らせる余地がありません。かといってあまり難しいことを考えようとすると運転の方が散漫になり、TRPGのプロットを考えていたら危うくカーブを曲がりきれないような目に遭いました。とりあえずひとりしりとりを始めます。

せめて頻繁に赤信号に引っかかればブレーキ操作で気が紛れるのですが、1時間に数回くらいしか止めてくれません。結局、ひとりしりとりは都会に入るまで6時間近く続きました。

9/6 0100:日立バイパス

海です!念願のオーシャンビューです。

日立バイパス日立市街の北側で本道と分岐し、海沿いスレスレを通って市街南側で再度合流します。その一部ではなんと海の上に建設された高架を通るのです!さぞいい眺めなのでしょう。

https://recotripp.com/spot/86182 より

明るい時間帯でさえあれば。

往路(北行き)でR6を使うと陸側を通ることになります。せっかくのオーシャンビューが台無しです!(そんなことはない。)一方、南行きであればすぐ左手に海を眺めることができます。

望みの通り、真っ暗な海を眼前に拝むことができました。

夜の海というのは何故ああも怖いものなのでしょうか。照らすものがなければ何も見えないのは陸地も同じなのですが、自分が何かを得ることはできないが、逆にあちらも自分に対して何もしてこないように思えます。

一方暗い海は吸い込まれそうというか、見ているだけで海に落ちてしまって二度と戻れなくなってしまうような心地がします。しかも自分は今、たった二つしかタイヤのついていない乗り物に乗って、大したことのない高さの柵しかついていない高架の上を走っているのです。50km/h制限の道路で、気づけば速度計は20km/hくらいを指していました。

0430:東京湾岸道路

取手や柏あたりまで来ると、市街地が途切れることはなくなります。ここまで来ればもう寂しい思いなどをすることはないのですが、僕はどうしても湾岸道路を通って帰りたいと思いました。

東京湾岸道路、ないし単に湾岸道路というのは富津から横須賀まで東京湾沿いに引かれたバイパス道路のことです。首都高湾岸線と下の一般道が立体に入り組みながらディズニーランドやビッグサイトの隣を通る様子は壮観で、都心の煌々と輝くビル群を眺めながらこの道を走るたびに、僕は人類文明の威力と頼もしさを感じるのです。

0600:帰宅

帰ってきました。

感想

都会に住む我々は忘れがちですが、人間にとって夜というのは根本的に怖いものです。まさか仙台にラーメンを食べに行ったことでそれを再認識させられるとは思いませんでした。

まあそれはそれとして、48時間で仙台まで行って帰るのは普通に苦行だと思います。

教訓

バイクで長距離・長時間走らない

二輪車の運転は普通車の5倍疲れます。

目的と手段を分離する

自分の中でバイクに乗って旅行することの動機を分析すると、

  • 純粋に長距離を移動したい
  • バイクを運転するという身体的経験を楽しみたい

という2種類に分かれます。前者の欲求を満たすために必ずしもバイクに乗らなければならないわけではありません。大人しく普通車、できれば公共交通機関を使いましょう。

逆に、後者の欲求を満たすためといって過剰に長距離を旅行する必要はありません。どうせ半日も乗ればとりあえず満足するのだから、近場に行きましょう。

音楽を聴けるようにする

虚無の中をバイクで走ると気が狂います。ヘルメット内にスピーカをつけて、スマホなり音楽プレーヤなりを繋げて音楽を聴けるようにしましょう。

僕はこの旅行の直後にBluetoothインカムを買ったしYoutube Music Premiumに加入しました。

天気予報を見る

基本です。バカタレ。

荷物を考える

デカいシートバッグはキャンプ等動かす必要がない場合がよい。旅行の時はバイクにロックできるリアボックスを使うべき。

おわりに

明日はすしくんが苦行について何かしらを公開するそうです。 :kugyo:

*1:今は駅チカのより良立地な駐車場を借りていますが、それでも自宅からは自転車で15分くらいかかります。

*2:関東近県でこれよりヤバい道路は東海道本線313系が隣の車たちに次々に抜かれていくR1富士由比BPくらいと思われる。

*3:霞が関と間違えて霞ヶ浦河川事務所HPに攻撃をしたクラッカー集団がいるらしい