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

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

MeCab で形態素解析をしよう、あとゴママヨ

はじめに

この記事は UEC Advent Calendar 2023 10日目になります。

9日目はへるくんさんの「免許合宿に行きました」でした。

helkun.dev

さらに、免許取得したら色んな場所に行きやすくなり、フットワークが軽くなります。世界は広いと実感させられます。

これはかなり真で、普通自動車を運転できることで人類が到達可能な陸地の99%に行けるようになり、さらに限界旅行の手段が格段に増えることが一般に知られている。したがって人類は軽率に普通運転免許を取得し、努めて移動などをするべきです。

また、 UEC 2 Advent Calendar 2023 9日目の記事はこうくんの「2021年度ボカロ考察」でした。

hirumeshikuuya.hatenablog.com

彼の去年の記事を読んだときも感じたのですが、こういった非形式科学的な場面にあってここまで詳細な考察を行えるのは、理系大学生としては稀な資質ではないかと思います。少なくとも僕目線ではかなり羨ましい。

今日のは形態素解析MeCab というライブラリについて少しお話します。

形態素解析

読者諸兄は日頃から自然言語処理に親しまれていることかと思うが、形態素解析について念の為大雑把に説明したい。

自然言語において形態素とは、表現の中で何らかの意味をもちうる最小単位のことである(日本語学ではもっぱら「語」と呼ばれる)。正格な語(日本語学では「文節」。紛らわしい)よりさらに意味的に細分化されることに注意したい。

例えば日本語において「単位が落ちた」という句は「単位が」「落ちた」という2語に分けられるが、これらはさらに

  • 「単位」:一般名詞
  • 「が」:格助詞(主格)

および

  • 「落ち」:動詞(タ行上一段活用)連用形
  • 「た」:助動詞(過去または完了)

という形態素に分けることができる。 英語のような屈折語についても形態素を考えることができる。 "employees" は語としてはこれ以上不可分であるが、意味から考えると

  • "employ" (動詞 "employ":雇う)
    • "em-" (< in-:中へ)
    • "ploy" (< ployer (fr) < plicare (la):折る)
  • "-ee" (動詞の客体を表す)
  • "-s" (複数形)

と分けることで「雇われている(者)たち」と捉えることができるのは、形態素について知らなかった方も考えたことがあるだろう(筆者は英語についてあまり詳しくなく、em/ploy についてはここで分けていいのか断言できない)。

語ないしより大きな文を、それを構成する形態素ごとに分割し、また個々の形態素の品詞を判定することを形態素解析という。今回は特に日本語の形態素解析について考える。

MeCab

MeCab (和布蕪,めかぶ) とは、工藤拓氏らによる形態素解析を計算機により自動的に行うエンジンの一つである。オープンソースC/C++ 用のAPIがある他、Perl/Ruby/Python/Java 向けのバインディングライブラリも存在する。

インストール

手動でインストールする方法はここに書いてあるので参照。 大体 APT レポジトリにもあるので、

$ sudo apt install mecab              # 本体
$ sudo apt install mecab-ipadic-utf8  # 辞書 (UTF-8)
$ sudo apt install libmecab-dev       # ライブラリ

でも困らないだろう(試していないので自己責任で)。APIを使わない場合は libmecab-dev はいらなかったはず。

使ってみる

インストールが終わったら、早速形態素解析してみる。 ターミナルから mecab と実行すると入力モードに入るので、文章を書き込んでみよう。

$ mecab
親譲りの無鉄砲で子供の時から損ばかりしている。
親譲り   名詞,一般,*,*,*,*,親譲り,オヤユズリ,オヤユズリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
無鉄砲   名詞,一般,*,*,*,*,無鉄砲,ムテッポウ,ムテッポー
で 助詞,格助詞,一般,*,*,*,で,デ,デ
子供  名詞,一般,*,*,*,*,子供,コドモ,コドモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
時 名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
から  助詞,格助詞,一般,*,*,*,から,カラ,カラ
損 名詞,一般,*,*,*,*,損,ソン,ソン
ばかり   助詞,副助詞,*,*,*,*,ばかり,バカリ,バカリ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる  動詞,非自立,*,*,一段,基本形,いる,イル,イル
。 記号,句点,*,*,*,*,。,。,。
EOS

出力の形式は1行ごとに1形態素で、

表層形 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

というふうに吐き出される。EOS は恐らく "End Of Sentence" の略。ただし辞書にない形態素は品詞推定をしてくれるものの、原形以降の出力は行われない。

ブラッディーメアリー
ブラッディーメアリー  名詞,固有名詞,組織,*,*,*,*

ちなみに「ブラッディーメアリー」とはテューダー朝の女王メアリー1世の異名、またはそれに由来するカクテルの名前である。当然ながら未知語推定に関しては品詞細分類もあまりあてにはできない。

ゴママヨ

ゴママヨサラダ ないし ゴママヨ は日本語における言葉遊びの一種で、複合語を構成する隣接した語に関して、前に来る方の最後のモーラと後に来る方の最初のモーラが一致するものを見つけて楽しむ。しなちくシステム氏のゴママヨサラダに詳しい。

例:

  • ゴママヨ(ゴ”マ” + ”マ”ヨ)
  • かるた大会(カル”タ” + ”タ”イカイ)

より一般に n 次ゴママヨとは、前の語の末尾 n モーラと後ろの語の先頭 n モーラが一致するものを指す。

例:

  • 「優勝賞金」は2次ゴママヨである。
  • ORANGE RANGE」は3次ゴママヨである。

ゴママヨを自動的に判定するゴママヨパーサとして、先述のしなちくシステム氏による gomamayo.js がある。

ゴママヨパーサを作る

先駆者がいる(しかもMeCabによる実装) ので完全に車輪の再発明だが、ゴママヨパーサを作ってみようと思う。ちょうどこのネタを思いついた頃に筆者がインターンに応募しており、C++を使えるようになる必要があったので実装はC++で行う(マゾヒスト?)

計画

とりあえず書くべき処理をざっくりまとめると、

  1. 入力文字列を MeCab に流し込んで形態素解析
  2. 形態素ごとにモーラを配列で保持
  3. 隣接する形態素について、n モーラ分のゴママヨチェック
  4. ええ具合に整形して出力

といった感じになる。形態素解析器非依存にしたいので、なるべく MeCab の処理は疎結合にする。

形態素クラス

形態素はこのようなクラスで管理している。

// 単語(形態素)クラス
template<class charType, class traits = std::char_traits<charType>, 
    class Allocator = std::allocator<charType>>
class Word{
    using String = std::basic_string<charType>;

    public:
    Word(String word, String reading, POS pos) :
        word(word), reading(reading), moras(splitMora(reading)), pos(pos) {}

    // getter
    POS                         getPos()        const { return pos; }
    const String&               getWord()       const { return word; }
    const String&               getReading()    const { return reading; }
    const std::vector<String>&  getMoras()      const { return moras; }

    // モーラのサイズを取得する
    typename std::vector<String>::size_type getMoraSize() const {
        return moras.size();
    }

    // 読みの先頭 length モーラを取得する
    String getMoraHead(typename String::size_type length) const {
        // length がモーラ数より大きければ例外を投げる
        if(length > moras.size()) {
            throw std::runtime_error("specified mora length is bigger than word.");
        } 

        // 先頭から length モーラを結合して返す
        return std::accumulate(moras.begin(), moras.begin() + length, String());
    }

    // 読みの末尾 length モーラを取得する
    String getMoraTail(typename String::size_type length) const {
        // length がモーラ数より大きければ例外を投げる
        if(length > moras.size()) {
            throw std::runtime_error("specified mora length is bigger than word.");
        } 

        // 先頭から length モーラを結合して返す
        return std::accumulate(moras.end() - length, moras.end(), String());
    }


    private:
    const String word;                  // 単語(元の表現)
    const String reading;               // word の読み(カタカナ)
    const POS pos;                      // 品詞
    const std::vector<String> moras;    // reading のモーラ分割
};

文字型問題

主だったロジックが完成して最後の最後のテスト段階で気付いたのが、char型だと配列(実際はstd::vector<char>)の添字と実際の日本語文字が一対一対応しないという欠陥である。

お陰で公開直前の20時時点でこんな有様だ。

$ ./gomamayo -i 横須賀完熟トマト -d 1
degree = 1
parse completed.
ヨコスカ: size/morasize = 12/12
� � � � � � � � � � � � 
カンジュク: size/morasize = 15/15
� � � � � � � � � � � � � � � 
トマト: size/morasize = 9/9
� � � � � � � � � 

UTF-8 では1文字を3バイトで保持するため、3要素が1文字分に相当するのである。ゴママヨ判定にバリバリ moras[i] == moras[i + 1] みたいな条件式を入れていたため、全てを今から変更するのは間に合わない...!

ということで、MeCab の出力を無理やりワイド文字 wchar_t に変換することで何とか解決。

std::basic_string<wchar_t> == std::wstring

// MeCab の出力は char だが、マルチバイト文字だと扱いが難しいのでワイド文字にしたい
// よって word, reading を wchar_t に変換する
std::basic_string<wchar_t> wideWord, wideReading;

wchar_t* wideWordBuf    = new wchar_t[3 * word.size()];
wchar_t* wideReadingBuf = new wchar_t[3 * reading.size()];

mbstowcs(wideWordBuf, word.c_str(), 3 * word.size());
mbstowcs(wideReadingBuf, reading.c_str(), 3 * reading.size());

wideWord    = std::basic_string<wchar_t>(wideWordBuf);
wideReading = std::basic_string<wchar_t>(wideReadingBuf);

MeCab の wrapper 以外の部分はほぼ全て template で文字型を指定する実装にしていたので命拾いした。

その他

そういえば、C++でテンプレートを使うと上手いことヘッダとソースで宣言と実装を分けられない。

分けることもできるが、やはりソースで型の書かれたインスタンスを明示的に生成しなければならず、あまりオシャレじゃない。

// hoge.hpp
...
template<class T> T hogeFunc(T);


// hoge.cpp
#include "hoge.hpp"
...
template<class T> T hogeFunc(T x) {
  // 実装を書く
}

// 実際に使う分だけ書く必要がある。
tempalte int hogeFunc(int);
tempalte double hogeFunc(double);
template Foo hogeFunc(Foo);
......
...

アホくさい。

完成品

github.com

詳しい説明とソースコードは上のリンクから。

このアドベントカレンダーに応募した直後に7割方は書き終わっていたのだが、その後インターンで忙しくなったこともありしばらく全く手につかなかった。結局上述の通りかなりギリギリまで作っており、動くようになったのもつい先程のことである。

コミットメッセージからも焦りが伺える

「のぞみトマト」には反応しておらず、ちゃんとゴママヨ判定できている。(横須賀完熟果物のぞみトマト戸倉ってナンだよ)

横須賀完熟果物のぞみトマト戸倉

高次ゴママヨも大丈夫そう。

優勝賞金

一発ネタなのでこれ以上何かしようとは思っていないが、一応形態素解析器の wrapper や間に合わせのオプション処理、例外クラス、文字型の扱い関連など問題点は沢山あるので、万に一つでも必要があればメンテナンスをする予定。

おわりに

明日は Amicii がドイツ語とかについて話すそうです(予定地)。ところで一昨日彼と飲みに行ったときの話によれば、mankiアイスランド語の弱変化男性名詞の単数不定形と解釈できるそうです。mankiなのに男性?

またUEC 2の方では今日、今年のアドカレを立てたすしくんが何かを書くはずでしたが、間に合わないようです。締切落としは12月の風物詩ですね。ここに記事が立ったら読みに行きましょう。

UEC 2の明日の記事ではぼいどくんがサーバーについて書く予定らしいです(予定地)。お楽しみに。

それではまた12/19に、散歩・徒歩・苦行 Advent Calendar 2023 でお会いしましょう。

aptのTeX Liveが古い

ほとんど先駆者様 【WSLでも確認済み】Ubuntu18.04/20.04でのLaTeX環境構築 (TeXLive2019/2020/2021) をなぞっただけだが、備忘録として残しておく。

きっかけ

mahjongパッケージを使おうとしたら使えない。

2021年くらいに CTAN に追加されて TeX Live にもとっくに収録された筈なのだが、何故か見つからない。仕方ないからtlmgrから入れようとしたらそもそも動かない。パスの問題かなーとか変なパッケージを入れようとした時に conflict しちゃったのかなーとか思いつつ少しいじってみるが、どうにもおかしい。

すると TeX Live のパッケージ更新が3年半くらい前で止まっていた。

$ dpkg -s texlive-full 
Package: texlive-full
Status: install ok installed
Priority: optional
Section: tex
Installed-Size: 70
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Multi-Arch: foreign
Source: texlive-base
Version: 2019.20200218-1
......
...

Ubuntu の repo は軒並みパッケージが古いのだが、TeX Live くらいは新しいのを使いたい。

TeX Live の入れ替え

もうaptには任せておけないので思い切って全部消しちゃう。

$ sudo apt purge texlive-*
$ sudo apt autoremove

とはいえ丸投げする先がaptからインストーラに変わっただけである。適当なディレクトリを作ってwgetでダウンロードする。もちろん cURL 教徒の皆さんはcurlを使えばよい。

$ wget http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz
$ tar xzf install-tl-unx.tar.gz
$ cd install-tl-20230923
$ sudo ./install-tl

するとウィザードが立ち上がって「止めるなら今のうちだぞ?」と聞いてくる。LaTeX が使えないと困るのでIで続行。

毎度のことだが TeX Live はクソ重いのでダウンロードにすごぶる時間がかかる。以前家の回線がゴミカスだった頃は、インストーラを走らせてから晩ご飯を食べて風呂に入ってもまだ終わらず、寝て起きて作業を再開するなどしていた。

 ----------------------------------------------------------------------
 The following environment variables contain the string "tex"
 (case-independent).  If you're doing anything but adding personal
 directories to the system paths, they may well cause trouble somewhere
 while running TeX.  If you encounter problems, try unsetting them.
 
 Please ignore spurious matches unrelated to TeX. (To omit this check,
 set the environment variable TEXLIVE_INSTALL_ENV_NOCHECK.)

    TEXLIVE_INSTALL_NO_DISKCHECK=1
 ----------------------------------------------------------------------


TeX Liveへようこそ!


ドキュメントの一覧は/usr/local/texlive/2023/index.htmlをご覧ください。TeX Liveのウェブサイト(https://tug.org/texlive/)にはすべてのアップデートとコレクションの情報が掲載されています。TeX Liveは全世界のTeXユーザ会有志による合同プロジェクトです。TeX Liveプロジェクトをサポートしていただける場合お好きなTeXユーザ会に入会することをご検討ください。TeXユーザ会の一覧はhttps://tug.org/usergroups.htmlでご確認いただけます。


Add /usr/local/texlive/2023/texmf-dist/doc/man to MANPATH.
Add /usr/local/texlive/2023/texmf-dist/doc/info to INFOPATH.
Most importantly, add /usr/local/texlive/2023/bin/x86_64-linux
to your PATH for current and future sessions.
Logfile: /usr/local/texlive/2023/install-tl.log

今回は30分くらいで終わった。天と地の差だ……

pathを通せと言われているので素直に従う。

# .bashrc の末尾に追加
export PATH="$PATH:/usr/local/texlive/2023/bin/x86_64-linux"
export MANPATH="$MANPATH:/usr/local/texlive/2023/texmf-dist/doc/man"
export INFOPATH="$INFOPATH:/usr/local/texlive/2023/texmf-dist/doc/info"
$ source ~/.bashrc

今回はパスを~/.bashrcからexportするようにしたが、これだと当然 root からは見れない。つまりsudoなど管理者権限で TeX Live 周りのコマンドを実行したい時にパスが通っていないと言われて困る(後述)。 全員が読むファイル(/etc/bash.bashrcとか)に書いてもいいかもしれないけど、なるべく触りたくないので僕はやってません。

パッケージの手動追加

おいおい LuaLaTeX に乗り換えたいなとは思っているのだが、とりあえず現環境で使ってる upLaTeX が正常に動くか確認したい。

普段のテンプレートをコンパイルしてみる。

! LaTeX Error: File `gnuplot-lua-tikz.sty' not found.

そういえば、いくつかのパッケージは自前で放り込んでいたのだった。gnuplot-lua-tikzgnuplotLaTeX で出してくれたグラフを処理するためのパッケージである。実験レポート作成時にはいつも助けられる。

gnuplot.styファイルを吐いてくれるので使う。場所と権限によっては管理者で実行する必要がある。

$ cd /usr/local/texlive/texmf-local/tex/latex/local/
$ sudo mkdir gnuplot
[sudo] password for jj1lis:
$ cd gnuplot/
$ sudo gnuplot

    G N U P L O T
    Version 5.2 patchlevel 8    last modified 2019-12-01 

    Copyright (C) 1986-1993, 1998, 2004, 2007-2019
    Thomas Williams, Colin Kelley and many others

    gnuplot home:     http://www.gnuplot.info
    faq, bugs, etc:   type "help FAQ"
    immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'qt'
gnuplot> set term tikz createstyle

Terminal type is now 'tikz'
Options are 'latex nopreamble color nostandalone nogparrows notikzarrows nogppoints picenvironment nooriginreset bitmap rgbimage noclip notightboundingbox noexternalimages '
gnuplot> q
$ ls
gnuplot-lua-tikz-common.tex  gnuplot-lua-tikz.sty  gnuplot-lua-tikz.tex  t-gnuplot-lua-tikz.tex

こうやって見ると gnuplot も普通に古い。

とにかく、4つのファイルが吐き出されていることが分かる。あとはmktexlsrで ls-R ファイルを更新すればよいのだが……

$ sudo mktexlsr 
sudo: mktexlsr: command not found

そんなもんは知らんと言われてしまう。先述の通り自ユーザ以外ではパスを通していないので、全員が参照する場所でexportしないのであれば一々通す必要がある。

$ sudo su
# source /home/jj1lis/.bashrc
# mktexlsr 
mktexlsr: Updating /usr/local/texlive/2023/texmf-config/ls-R... 
mktexlsr: Updating /usr/local/texlive/2023/texmf-dist/ls-R... 
mktexlsr: Updating /usr/local/texlive/2023/texmf-var/ls-R... 
mktexlsr: Updating /usr/local/texlive/texmf-local/ls-R... 
mktexlsr: Done.

suは精神衛生上よくないので、これはこれで問題があるかもしれない。 あと面倒臭がって~/.bashrcを全部読むと事故る可能性があるので、多分ちゃんとパスだけ通したほうがよい。

その他、jlistingとか必要なものを移しているうちに動くようになった。

何かいい感じになった

そういえば、元はといえば mahjong を使いたいんだった。できるかな?

\documentclass[uplatex,a4paper,dvipdfmx]{jsarticle}
\usepackage{mahjong}

\title{\texttt{mahjong.sty}テスト}
\author{型推栄}

\begin{document}
    \maketitle

    これは国士無双です:\mahjong{19m19p19s1234567z-1s}
\end{document}

ミリマスミリしらPのミリアニ視察報告 #1

はじめに

本記事はアニメ『アイドルマスター ミリオンライブ!』(以下『ミリアニ』)劇場先行上映第1幕の視聴レビューです。 したがって、ミリアニ第1〜4話の内容に関するネタバレを含むのでご注意ください。

↓簡単な所感(ネタバレなし)

筆者のアイマス遍歴

  • 2012年ごろ〜:アイマスに対する認知はニコ動でよく見かけるなーレベル。そのうち765ASやデレマス有名どころの顔くらいはわかるようになる。
  • 2015年:アニマス再放送を見かけて1クール目だけ観る。感想は㍂くらい。
  • 2023年
    • 1月:シャニマスをはじめる。ソシャゲ適性の低さで全然長続きしない。3月くらいにはログインもしなくなる。
    • 8月:やる気が再燃して狂ったように過去のイベントコミュを読み始める。他シリーズも気になりはじめる。

視聴前のミリマスに対する認識

  • 765プロ系統のコンテンツらしい?
  • 今稼働しているのがミリシタという後継アプリであることは調べた。やろうかとも思ったが音ゲーが苦手なのでとりあえず先送り。
  • 御三家の顔と名前もよくわかっていない。
  • ミリマス初出の曲は Flyers!!! だけ知ってる三部作のせい)

経緯

きっかけはだいたいこれ。

まあ夏休みで暇だし行くcar...の気持ちで特に準備なく行こうとしたのだが、せっかく金を払って観に行くのに誰が誰だか分からないせいで話に集中できないのも嫌だなと思い、上映前に登場人物一覧を確認した。

久々に映画館に来たが、思ったより料金が高くて思わず声が出た。無職に2000円はそこそこ大金なので、せっかくなら楽しんで帰りたい。 ただ苦手なCG作画らしいというのを知って(詳細は後述)、観る前から不安な気持ちも少しあった。

感想

一言でいうと非常によかった。ミリマスというコンテンツへのファーストインプレッションとしては最高だったと思うし、第2幕以降もぜひ観に行きたい。 ただやはり知識不足で分からない部分も少なからずあったし、ライブ感が強すぎて一人で行くよりは誰かと行って感動を共有したくなった。ミリP、次は俺を連れて行ってくれ......

ストーリー

まあ分かっちゃいたんだけど、各アイドルの性格や背景をある程度知っていれば100%楽しめたんだろうなとは思った。死ぬほど当たり前である。先述の通り予め顔と名前が一致するようにはしたつもりだけど、ある程度話を追いながら「あー、この子はこういうキャラなんだな」と理解するまでには余分に時間が必要である。話題やマンガがTwitterで流れてくることが多いデレマスなら未履修でも何となくキャラ性を知ってたりするものだけど、ミリマスについては本当に全然知らなかった。

基本的には未来たち(アイドルになる前→新人)の視点で話が進むので大丈夫だけど、ツアー楽屋側の会話とかは置いてけぼり気味だったかもしれない。まあ富野作品じゃあるまいし全然大丈夫。

765ASライブ前の未来の「がんばれー!!!!!」シーンで共感性羞恥が発動するなどしたが、あぁ、アホの子なのかと気付いたあとはめっちゃグーだった。意外と自分はアホの子が好きなのかもしれない。

最初はこの未来って子が主人公なのかーと思いながら観てたけど、冒頭から第1幕のストーリー的な盛り上がりのピークであるオーディションにかけて序盤の主人公は紛れもなく静香である。背景や心理描写もそうだけど、表情がめちゃくちゃ繊細に描かれていて非常によい。ライブ後の夜の公園で、静香が未来に一番の夢を打ち明けるシーンが本当に好きすぎる。

それまでアホの子描写のおかげで原っぱライブ回りのゴタゴタによる未来の葛藤が映える。ベタだけど、ティーンの成長物語には他者との衝突による苦悩が入ってほしいと思っているのでやはりよい。

これでまだ1/3ってマジ?って感じの濃さだった。描写があまりなかった翼の話はきっと第2幕以降でねっとりやってくれるんだろう。楽しみ〜(トライアングル)

楽曲に関しては最初から最後まで最高だった。

シャニ以外のアイマス楽曲に触れる機会は実質ニコニコだけみたいなものなので、どうしても知ってる曲が昔からあるものに偏りがち。恥ずかしながらToP!!!!!!!!!!!!!を知らなくて、最初に流れたときにはどういう曲かわからないので不安だったけど始まったら始まったでクソ盛り上がった。知ってるアイドルが歌ってるってだけで何とかなるものかもしれない。

ストーリーと同じく、やっぱり興奮の頂点は間違いなくオーディションのシーンだった。静香がアガっちゃった辺りから「どうなっちゃうの〜???🥺🥺🥺」みたいな気持ちで見守ってたし、回想の未来の言葉から2人に背中を押されて少しずつ声に力が入るところでもう泣いてたしプロデューサーが立ち上がるところで俺も思わず立っちゃうかと思った。たぶん、自分にとってRat A Tat!!!は思い出の曲になるだろう。今も暇さえあれば聴くなどしている。

茜のシーンでてってってーが流れて滅茶苦茶ホッとした。マジで実家のような安心感である。

映像

2023年にもなって、自分は未だにCG作画が少し苦手だ(ここでいう「CG作画」とは特にキャラクターの作画に3DCGが利用されるものを指す)。

けもフレやケムリクサみたいな作風なら違和感なく楽しめるし、バイオハザードみたいな洋画系のアニメも大丈夫だけど、ウマ娘2期のマックイーンとテイオーが並走するシーンはちょっと「うっ」となるみたいな。これは自分の好みが昔のアニメに偏っていて近年の作品をあまり履修していないこと(つまり慣れ)が原因で、普段から相当量を視聴している諸氏なら気にしない人も多いかもしれない。兎にも角にも、主観甚だしいが「手書き作画の”つもり”でいるところにキャラクターが3DCGで動いていると違和感を覚える」といったところだ。

そしてミリアニもやはりCG作画である。 動きが少なくて小さな機敏に注目するようなシーンだと、物語に没入していたところでふとした瞬間に「動きがモサッとしてるなぁ」と感じてしまい、興が削がれたシーンが何度かあったことも否めない。 ただし、きょうびCG作画はごく一般的な制作手法であって、単に自分の好みの問題であり、特別ミリアニに文句をつけようというつもりのないことは断っておきたい。自分にとってアニメの感想をアウトプットする機会が非常に乏しいので、今くらいしか書くところがないだけなのだ。

そういった個人的な問題を除けば映像もとてもよかった。ライブはとにかく情報量が多くて、綺麗ですっごーい!たーのしー!になって楽しめた。先にも挙げたが、ライブ後の夜の公園のシーンは天才だと思う。円盤買うかもしれない。

その他:ライブについて

ミリアニとは直接関係ないが、ライブに行ってみたいなと思った。

実は自分はライブの類に行ったことがない。元々音楽の趣味がクラシック寄りなので気になるコンサートには行くこともあるが、アイマスはもちろんその他のポップスも含めて武道館ライブ!のようなノリのイベントの一度も経験はないし、あまり興味もなかった。 ただ最近はシャニマスを中心に他ブランドでも知ってる楽曲も増えてきて、さらに今回ライブシーンを映画館のクソデカスクリーンで観たことでクソデカ盛り上がりが発生し、一度はライブに行ってみるのも悪くないだろうなと気持ちが傾きつつある。

最初はシャニマスかなとは思っていて、5.5thは取れなさそうだけど6thは頑張ってみようという所存である。

バイクの免許を取ったよの巻

このたび普通二輪自動車運転免許を取得したんですが、周りにバイクの免許持ってる人あんまりいないので布教を兼ねて記録しておきます。

なお、僕はチー牛証明書こと普通自動車運転免許(眼鏡等・普通車はAT車に限る)を元から持っているため教習所の学科教習(セット学科除く)と免許試験場での学科試験は免除でした。したがって本稿では学科関連の内容については言及しないので、原付や普通車、中型など他車種の免許を持っていない人は注意してください。

はじめに

免許制度と排気量による違いについて一通り説明しています。基本的なことなので読み飛ばしても大丈夫です。

運転免許

運転免許は各都道府県の公安委員会が管理し、免許を持つ者に運転免許証を交付します。

免許を受けるためには公安委員会(が委任する都道府県警察)の実施する試験を受ける必要がありますが、うち技能試験については指定自動車教習所卒業検定に合格することで免除されます。また、ある車種の運転免許を有する者が他車種の免許を受ける場合は学科試験も免除されます。

運転免許は車種ごとに区分されています。普通車の免許を持っていれば普通車(とオマケで原付と小特)は運転できますが準中型以上には乗れませんし、当然原付より大きな二輪を運転することはできません。 排気量が50ccを超え400cc以下の原動機を持つ二輪車には普通自動二輪車運転免許が、400ccを超える二輪車には大型自動二輪車運転免許*1がそれぞれ必要になります。

道路法規による排気量ごとの違い

日常で車両を所有し、また公道を通行する上で関連する主な法律は道路交通法(道交法)と道路運送車両法(車両法)です。道交法は免許制度や交通の規則などソフト面のルールを規定しています。一方で車両法は車両の所有や保安基準などハード面でのルールを定めています。

道路交通法

道交法では二輪車は以下のように分類され、それぞれ運転には対応する免許が必要です。

なお普通自動二輪車免許には小型限定という限定条件があり、この場合排気量が50ccを超え125cc以下の二輪車(後述の原付二種)に限り運転することができます。また、AT限定の場合はオートマチック車のみ運転できます。

原付は法定速度が30km/hである、二人乗りができない、二段階右折が必要*2などの制約があります。

道路運送車両法

車両法では二輪車は以下のように分類されます。

高速道路(高速自動車道路及び自動車専用道路)は自動車しか通行できません。車両法で自動車として認められるのは軽自動車以上の車両です。よって、原付一種と原付二種は高速道路を走ることができません。

また小型二輪は運輸局に登録し、2年おき(新車時のみ3年後)に検査を実施して自動車検査証(車検証)を受けなければなりません。軽二輪は運輸局への届出のみで済み、原付はそのどちらも必要ありません。

結局どの免許を取ればよいか

第一に、原付免許を取る価値はあまりないと思います。維持費は安いですが、30km/hまでしか出せないので大きな道路だと周りが速くて逆に危ないし、他にも色々と面倒です。

第二に、いきなり大型二輪免許を取るのはあまり良くない(らしい)です。自転車と違ってバイクは150kg〜200kgくらいある、一人の人間が取り回すには重い乗り物です。大型となれば更に巨大化する上に排気量が大きくなることで出力も上がります。まずは普通二輪を取って段階的に慣れていきましょう。

つまり最初は普通二輪免許を取得するのが一番丸いわけですが、その中にも小型とATという2つの限定条件があります。これらは想定する用途により判断すればよいでしょう。

日常の足に使いたい人

いわゆるスクーターは大体125ccのオートマです。普通車の免許を持っていれば小型AT限定は教習所に2,3日通うだけで取れます。スーパーカブマニュアルトランスミッションですが、クラッチ操作がないためAT限定で運転可能です。

趣味で乗りたい人

僕もツーリングやキャンプに行きたくてバイクの免許を取りました。 現在流通している趣味性の高いオートバイはほぼ全てクラッチ操作を要するMT車です。原付二種だと高速を走れない上に、そもそも排気量が小さいと長距離の運転は辛くなります。大人しく限定条件のない免許を取りましょう。

教習所に行く

電通大生は調布自動車学校に行くパターンが多いらしいですが、僕は馴染みの武蔵境自動車教習所に通いました。

費用

他車種の免許を持っていると学科教習を受けなくていいので、教習費用はかなり安くなります。

教習には標準時限がありますが、教官が不十分だと判断すればハンコはもらえないし検定に落ちれば再教習+再検定が必要になります。これが入ると追加費用が相当嵩みますが、今回は運良くストレートに卒業できました。

料金プランにも再検定費タダとかVIPプランとか色々あったんですが、まあいけるやろの精神で無視して最安プランにしました。普通車の免許も過去に武蔵境で取得したため、割引が効いて教習費用は総額95800円です。

装備

教習時には以下の装備は必須です。

  • ヘルメット
  • グローブ
  • プロテクタ(胸部、膝、肘)
  • かかとプロテクタ(AT教習時のみ)

うちヘルメットとプロテクタは所内の無料貸出があり、グローブも入校時特典だかなんだかで貰えたので新たに買い揃えたものはありませんでした。ない場合は買う必要があります。

通所

自宅の近くから武蔵境まではちょうど私鉄が走っているんですが、まあまあ高額鉄道のため特に事情のないときは家の車で通いました。ただ駐車場のキャパが10台弱しかないため、一度コインパーキングに駐車する羽目になってアホみたいな料金を取られ、それから毎回満車じゃないかと戦々恐々したり混みそうな日には電車で行ったりしました*3。マジでアホ臭い。

教習内容の概要

普通二輪(普通車免許あり)の技能教習は1段階9時限、2段階8時限+セット学科1時限が最短時限です。1日に1段階は2時限、2段階は3時限まで受けることができるので、最短で8日あれば全部こなすことができる計算になります。絶対ムリだけど。

普通車や中型車、大型車は仮免許制度があるので1段階終了後に仮免検定や学科試験が入り2段階は路上教習メインになります。一方二輪車は仮免許が設定されていないので路上教習がありません(公道は免許を取ってからぶっつけ本番)。その代わり1段階の最後に見きわめを通過するだけで済み、教習を通して学科試験は一度もありません。

期間

教習期限9ヶ月の間に全ての教習を終了させないと、今までの金と労力が全部水の泡になります。普通車のときは8ヶ月半くらいかかってギリギリで卒業したので今度は余裕を持って受けようと心がけていました。

入校が5月中旬、卒検合格が6月中旬だったので1ヶ月くらいで免許取得まで行った計算になります。武蔵境は結構人が多くて教習が混みがちなんですが、後半は梅雨にかかっていたこともありすんなり予約が取れました。とはいえ、希望時間が全部通るというほどでもなかったです。

1段階

最初の教習はスタンドの立て方、倒れたときの起こし方、基本的な操作といった取り回しくらいしかやらなかったんですが、これが一番つらい。 教習が始まるまで「バイクって自転車の延長線みたいなもんでしょ」くらいに思ってたんですが、教習車のCB400 SFはカタログ値201kg+教習装備もあってクソ重いので倒れると持ち上がらんのです。バイクが自転車より自動車側の乗り物であることを身に沁みて実感しました。ちなみに400ccまでのバイクでこれより重いものは殆どないので、教習車が何とかなれば大体何とかなります。結局バイク買ったんだけど、189kgとかでした。

後の8時限はひたすら運転練習です。加減速、カーブ、ギアチェンジ、あとは課題の一本橋とかクランクとか坂道発進とか。

AT車しか乗ったことがなかったので半クラだの何だのとMTの操作ができるか不安で、「発進時の回転数は耳で覚えろ」とか言われてうるせえメータ見せろとか愚痴ってましたが案外何とかなりました。バイクの操作については、よほど要領の悪くない限りは扱えないようなことはないと思います。

バイクは股の間にある燃料タンクを膝や内ももで押さえつけてバランスを取ります(ニーグリップ)。最初の方は腕で身体を支えていたので毎回教習後には両腕が筋肉痛になってたんですが、1段階の終わりくらいに教官にそれを指摘され、意識してニーグリップをするようになったら驚くほど改善しました。大事です、げちで。

最後に見きわめの教官からハンコをもらって終わりです。easy.

2段階

2段階は法規走行の練習と卒業検定の練習がメイン、あとはシミュレータとかAT車体験とか危険予測とか細々とした事項を扱います。法規走行は普段の運転通りやれば問題ありません。え、普段から法規走行してない?そっか......

卒業検定はS字クランク、坂道発進一本橋スラロームなどの課題を含むコースを法規に従って走行するんですが、ガイジすぎてこのコースを覚えるのにマジで苦労しました。2段階初回からコース通りに走らされると聞いて覚えていったのに土壇場で飛んで道間違えるし、結局直前までコース覚えられないしで鬱。ただ本番でコースを間違えても検定員の指示通り復帰できれば減点されません。

また卒業検定には急制動という項目があります。40km/hまで加速し、指定地点から先10mちょっと以内に停止するというものです。自分でやると結構怖いんですが、傍から見ると大したことないんですよね。そもそも40km/hなんて普段公道でいくらでも出してるはずなので、バイクになるとクソ速く感じるけど過剰に怖気づかない方がいいです。

あと関係ないけど、シミュレータの操作感が余りにも現実離れしすぎていてシミュレータ教習のたびに事故を起こしてました。別に怒られたりしないから気にしなくてよい。

卒業検定

6月2週目の土曜に2段階までの教習が全て終わり、直近で予約できる日程の3週目火曜日に卒業検定を入れました。大学の2限に出られないのはまあいいんだけど、朝8時半集合とか言われて絶望。情報処理技術者試験か?

当日朝7くらいに布団退団して無事第0次試験合格、準備して教習所に向かいます。当日の二輪受検者は10人いないくらいで、実際の検定は9時過ぎくらいに始まって10時半には結果発表。自分の検定はそのうち10分未満です。 ガバ検定かといえばそんなことはなくて普通に隣の人も落ちてたんだけど、僕は運よく一発合格できました。あとは書類受け取ったり説明聞いたりして11時くらいには解放されました。

受け取った書類は卒業証明書と入校時に提出した住民票の写し、それから諸々です。これをそのままおまわりさんに渡せば免許証に化けます。

免許を取る

都道府県警察の免許関連施設には運転免許試験場と運転免許センターがありますが、新たに免許を取得する際は運転免許試験場で手続をしなければなりません。我が府中市には万物があるため当然警視庁府中運転免許試験場もあります。学科試験は受付時間があるんですが、免除なので8時半〜16時の間に行けばよい。よって3,4限切断も決意して教習所から直行します。

12時ごろに着いたら申請書類に記入して、適性試験(視力検査)を受けて、教習所で貰った書類に古い運転免許証と受験料&免許証交付料3800円を添えて提出。こういうのって収入印紙な気がするんですけど、現金どころかVisaタッチが使えて笑っちゃいました。警視庁ラブち。

最後に例の部屋で悪人顔の写真を撮られたら1時間も待たないうちに免許証完成です。グリーン免許、結構かわいかったんだけど没個性ブルーにされてしまった。

ここで時計を見るとまだ13時40分、大学の3限が終わるのは14時30分なのでまだあと50分も余裕があります。しかも試験場から調布へは直行のバスがあり、余裕で3限の出席を取ることができました。

まとめ

バイクの免許は意外と簡単に取れるので、軽率に取得するとよい。

*1:大型二輪免許には普通二輪免許の運転範囲が含まれる。

*2:原動機付自転車は、第二項及び前項の規定にかかわらず、道路標識等により交通整理の行われている交差点における原動機付自転車の右折につき交差点の側端に沿つて通行すべきことが指定されている道路及び道路の左側部分(一方通行となつている道路にあつては、道路)に車両通行帯が三以上設けられているその他の道路(以下この項において「多通行帯道路」という。)において右折するとき(交通整理の行われている交差点において右折する場合に限る。)は、あらかじめその前からできる限り道路の左側端に寄り、かつ、交差点の側端に沿つて徐行しなければならない。ただし、多通行帯道路において、交通整理の行われている交差点における原動機付自転車の右折につきあらかじめ道路の中央又は右側端に寄るべきことが道路標識等により指定されているときは、この限りでない。(道交法第34条第5項)

*3:そういう日に限ってガラガラ。

Timeshift がバックアップをしている最中に reboot をしてはいけない(健常者エミュレータの記事)

やらかしたので記録です。

環境

$ uname -a
Linux mint-desk.jj1lis 5.4.0-139-generic #156-Ubuntu SMP Fri Jan 20 17:27:18 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

ディスク構成

  • /dev/sda: INTEL SSDSC2CT12 (120GB)
  • /dev/sdb: TOSHIBA DT01ACA1 (1000GB)
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0     1K  0 part 
├─sda2   8:2    0   7.5G  0 part /
├─sda3   8:3    0   7.5G  0 part /tmp
├─sda5   8:5    0   953M  0 part /boot
├─sda6   8:6    0  29.8G  0 part [SWAP]
└─sda7   8:7    0  59.6G  0 part /home
sdb      8:16   0 931.5G  0 disk 
├─sdb1   8:17   0 238.4G  0 part /usr
├─sdb2   8:18   0     1K  0 part 
├─sdb5   8:21   0 238.4G  0 part /var
├─sdb6   8:22   0  59.6G  0 part /opt
├─sdb7   8:23   0   3.7G  0 part /srv
└─sdb8   8:24   0   298G  0 part /back

概要

以下、写真に写る画面や机の上が汚いですがご了承ください。

原因

Timeshift は Linux 向けのバックアップツールです。

github.com

スケジュールするとこいつが定期的に /back へバックアップを作ってくれるのですが、それを忘れていた僕は「なんか動作重いな〜」と思いつつ(重いだけに)、あろうことか reboot を掛けやがりました。バカタレ。

しかも最初、復旧作業中の僕はそのことに気づいていませんでした。

経緯

reboot したものの、中々再起動が終わらないので様子を見て顔面蒼白になる。

なんか文字化けしていてよくわからん。これの修正もそのうちやりたい(そもそも emergency mode に入りたくないが?)。

とりあえずダメ元で systemctl reboot するが、特に効果なく同じ画面に戻される。

言われた通り journalctl -xb しようとするが、かしこい[要出典]のでどうせよくわからん内容が死ぬほど流れてきて何もわからんだろうと思って journalctl -xb | grep error | less する。 色々見ていると、どうやら sdb8 がぶっ壊れたらしい。

定石ならまずは mount /dev/sdb8 <dir> を試すのだが、アホなので自分のPCの構成を覚えていないし、ましてや sdb8 がどこにマウントされていたかなんて思い出せない。 df やってんだから気づけよ。

仕方ないので初手 fsck で復旧を試みる。 fsck /dev/sdb8 -p で自動復旧。

ダメでした。

仕方ないので手動で復旧します。書いてある通り、 fsck /dev/sdb8 とオプションを外すだけ。

延々と ...? <y> と聞かれるので Enter を押すだけのホモサピを15分くらい続ける。手動Enter押下bot、通称しゅどぼ。

ちなみに man fsck するとこんなことを言われた。㍂。

-y     ファイルシステム固有のチェッカーの中には、 -y オプションが指定されると、検出さ
       れたファイルシステムの破損箇所を 常に自動的に修復しようとするものもある。 エキ
       スパートは、より上手に fsck を手動で実行させることができる場合もある。  全ての
       ファイルシステム固有のチェッカーが、  このオプションを実装しているわけではない
       点に注意すること。 この man ページを書いている時点では、特に fsck.minix(8)  と
       fsck.cramfs(8) は -y オプションをサポートしていない。

とかなんとか言ってるうち、出力に見覚えのある文字列を見つける。修復中のディレクトリが表示されるのだが、 timeshift/snapshots/... とか書いてあるのである。ここで自分のやらかしに気づく。

そして同時に sdb8 のマウント先を思い出す。

そうこうしている間に無限に続くかと思われた fsck 地獄が終了したので、満を持して mount /dev/sdb8 /back する。

生還。

教訓

  • shutdownreboot をするときは、必ず裏で動いているジョブを確認しなければならない。
  • 自分のPCのファイルシステムくらい把握しておかなければならない。

気がついたら /boot が満杯になっていたのでいい感じのツールを見つけてきた

虚無です、備忘録なので。

なんか知らんけど、天皇賞・春の予想をしようとパソコンをつけたらポップアップウィンドウが表示された。

boot領域が0バイトしかありません

いや、それはもはや無では? ボブは訝しんだが、とりあえず様子を見てみる。

jj1lis@localhost:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  1.6M  1.6G   1% /run
(中略)
/dev/sda5       922M  922M     0 100% /boot

マジやんけ。 ちなみに/bootに1GiB近くも振ってあるのは、今のパソコンのストレージを特に意味もなく1TBにしたとき、使い道に迷ったからである。

実は同じような症状は以前にもあった。確か今までのカーネルイメージが全部残ってたとか、そんな感じだった気がする。その時は、

$ sudo apt purge linux-image-x.xx.xxx-generic

という具合に一個一個丹精込めて手作業でpurgeした。

jj1lis@localhost:/boot $ ls
System.map-4.15.0-106-generic  config-4.15.0-124-generic      initrd.img-5.0.0-32-generic
System.map-4.15.0-117-generic  config-4.15.0-132-generic      initrd.img-5.4.0-100-generic
System.map-4.15.0-122-generic  config-4.15.0-137-generic      initrd.img-5.4.0-107-generic
System.map-4.15.0-124-generic  config-4.15.0-142-generic      initrd.img-5.4.0-109-generic
System.map-4.15.0-132-generic  config-4.15.0-144-generic      initrd.img-5.4.0-91-generic
System.map-4.15.0-137-generic  config-4.15.0-156-generic      lost+found
System.map-4.15.0-142-generic  config-4.15.0-162-generic      memtest86+.bin
System.map-4.15.0-144-generic  config-4.15.0-163-generic      memtest86+.elf
System.map-4.15.0-156-generic  config-4.15.0-169-generic      memtest86+_multiboot.bin
System.map-4.15.0-162-generic  config-4.15.0-175-generic      retpoline-4.15.0-20-generic
System.map-4.15.0-163-generic  config-4.15.0-176-generic      vmlinuz-4.15.0-156-generic
System.map-4.15.0-169-generic  config-4.15.0-20-generic       vmlinuz-4.15.0-162-generic
System.map-4.15.0-175-generic  config-5.0.0-32-generic        vmlinuz-4.15.0-163-generic
System.map-4.15.0-176-generic  config-5.4.0-100-generic       vmlinuz-4.15.0-169-generic
System.map-4.15.0-20-generic   config-5.4.0-107-generic       vmlinuz-4.15.0-175-generic
System.map-5.0.0-32-generic    config-5.4.0-109-generic       vmlinuz-4.15.0-176-generic
System.map-5.4.0-100-generic   config-5.4.0-91-generic        vmlinuz-4.15.0-20-generic
System.map-5.4.0-107-generic   grub                           vmlinuz-5.0.0-32-generic
System.map-5.4.0-109-generic   initrd.img-4.15.0-156-generic  vmlinuz-5.4.0-100-generic
System.map-5.4.0-91-generic    initrd.img-4.15.0-162-generic  vmlinuz-5.4.0-107-generic
abi-4.15.0-20-generic          initrd.img-4.15.0-163-generic  vmlinuz-5.4.0-109-generic
config-4.15.0-106-generic      initrd.img-4.15.0-169-generic  vmlinuz-5.4.0-91-generic
config-4.15.0-117-generic      initrd.img-4.15.0-175-generic
config-4.15.0-122-generic      initrd.img-4.15.0-20-generic

なんかいっぱいあった。

さすがにこれを全部手作業でrmするのは骨が折れるし、そのうち触れてはいけない何かを消してしまいそうなので簡単にパパっとできる方法が欲しい。

調べてみると、 purge-old-kernels というツールがいいらしい。現在のカーネルバージョンから2,3個を除いて、カーネルイメージと関連ファイルを削除してくれる。

byobu というパッケージに入っているらしいので、早速aptで入れて使ってみよう。

jj1lis@localhost: /boot $ sudo apt install byobu -y
jj1lis@localhost :/boot $ purge-old-kernels 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  gir1.2-mate-desktop gir1.2-mate-panel libstd-rust-1.53 linux-headers-4.15.0-106
  linux-headers-4.15.0-106-generic linux-headers-4.15.0-117 linux-headers-4.15.0-117-generic
  linux-headers-4.15.0-122 linux-headers-4.15.0-122-generic linux-headers-4.15.0-124
  linux-headers-4.15.0-124-generic linux-headers-4.15.0-132 linux-headers-4.15.0-132-generic
  linux-headers-4.15.0-137 linux-headers-4.15.0-137-generic linux-headers-4.15.0-142
  linux-headers-4.15.0-142-generic linux-headers-4.15.0-144 linux-headers-4.15.0-144-generic
  linux-headers-4.15.0-156 linux-headers-4.15.0-156-generic linux-headers-4.15.0-162
  linux-headers-4.15.0-162-generic linux-headers-4.15.0-163 linux-headers-4.15.0-163-generic
  linux-headers-4.15.0-169 linux-headers-4.15.0-169-generic linux-headers-4.15.0-175
  linux-headers-4.15.0-175-generic linux-headers-5.4.0-100-generic
  linux-headers-5.4.0-91-generic linux-hwe-5.4-headers-5.4.0-100
  linux-hwe-5.4-headers-5.4.0-91 linux-image-4.15.0-156-generic
  linux-image-4.15.0-162-generic linux-image-4.15.0-163-generic
  linux-image-4.15.0-169-generic linux-image-4.15.0-175-generic linux-image-5.4.0-100-generic
  linux-image-5.4.0-91-generic linux-modules-4.15.0-106-generic
  linux-modules-4.15.0-117-generic linux-modules-4.15.0-122-generic
  linux-modules-4.15.0-124-generic linux-modules-4.15.0-132-generic
  linux-modules-4.15.0-137-generic linux-modules-4.15.0-142-generic
  linux-modules-4.15.0-144-generic linux-modules-4.15.0-156-generic
  linux-modules-4.15.0-162-generic linux-modules-4.15.0-163-generic
  linux-modules-4.15.0-169-generic linux-modules-4.15.0-175-generic
  linux-modules-5.4.0-100-generic linux-modules-5.4.0-91-generic
  linux-modules-extra-4.15.0-156-generic linux-modules-extra-4.15.0-162-generic
  linux-modules-extra-4.15.0-163-generic linux-modules-extra-4.15.0-169-generic
  linux-modules-extra-4.15.0-175-generic linux-modules-extra-5.4.0-100-generic
  linux-modules-extra-5.4.0-91-generic
0 upgraded, 0 newly installed, 62 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 3,880 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 1241944 files and directories currently installed.)

(中略)

Found linux image: /boot/vmlinuz-5.0.0-32-generic
Found initrd image: /boot/initrd.img-5.0.0-32-generic
Found linux image: /boot/vmlinuz-4.15.0-176-generic
Found initrd image: /boot/initrd.img-4.15.0-176-generic
Found linux image: /boot/vmlinuz-4.15.0-20-generic
Found initrd image: /boot/initrd.img-4.15.0-20-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
done

実行には数分くらい掛かった。

jj1lis@localhost: /boot $ ls
System.map-4.15.0-176-generic  config-5.4.0-107-generic       memtest86+.bin
System.map-4.15.0-20-generic   config-5.4.0-109-generic       memtest86+.elf
System.map-5.0.0-32-generic    grub                           memtest86+_multiboot.bin
System.map-5.4.0-107-generic   initrd.img-4.15.0-176-generic  retpoline-4.15.0-20-generic
System.map-5.4.0-109-generic   initrd.img-4.15.0-20-generic   vmlinuz-4.15.0-176-generic
abi-4.15.0-20-generic          initrd.img-5.0.0-32-generic    vmlinuz-4.15.0-20-generic
config-4.15.0-176-generic      initrd.img-5.4.0-107-generic   vmlinuz-5.0.0-32-generic
config-4.15.0-20-generic       initrd.img-5.4.0-109-generic   vmlinuz-5.4.0-107-generic
config-5.0.0-32-generic        lost+found                     vmlinuz-5.4.0-109-generic
jj1lis@locahost:/boot $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  1.6M  1.6G   1% /run
(中略)
/dev/sda5       922M  397M  462M  47% /boot

中身が半分くらいに減って、容量にも余裕が出来ていた。 これで暫くは持ちこたえるかな。

その前にとりあえず一回apt autoremoveしてみたほうがいいのでは? と思うなど。

補足

環境: Linux Mint 19.3 (linux 5.4.0-109-generic)」

Ubuntu 18.04 LTSベースなので、最近のUbuntu系ならだいたい同じ手口が使えると思います。知らんけど。

参考

限界移動オタクの生態

みなさんが旅行に行く理由はなんですか?

  • いい景色を見るため
  • 美味しい料理を食べるため
  • 温泉に入るため

僕は移動するために旅行に行きます。綺麗とか美味いとかみたいな感覚は当然あるけど、それ以上に自分が移動していることや遠くまで辿り着いたという事実で勝手に楽しくなってます。キモいね。

本当なら年100回でも200回でも旅行したいですけど、そんなに頻繁に行けるわけでもなく旅行オタクなんて名乗ることも出来ないので、たぶん僕はただの移動オタクです。

大回り乗車

普通ある駅から別の駅に行く経路が何パターンもあれば長い経路を取ればそれだけ運賃も高くなります。ただ都市近郊なんかだと経路が多くて面倒なので、利便性のためにルールさえ守れば特定の区間ではどの経路を通っても同じ料金(普通一番短い経路を基準とする)で乗せてあげますよーという制度があります*1。それを逆手に取ってあえて大回りして安い運賃でたくさん乗ってやろうという乞食みたいな方法があり、「大回り乗車」と呼ばれています。

東京近郊はこんな感じの範囲になります。東京 #とは

f:id:jj1lis:20220214020849g:plain
東京近郊区間

詳細はこの辺りを読んでください。重要なのは経路は一筆書き(同じ駅を2回以上通ってはいけない)という点、それから途中下車できないという点です。

大回り乗車とは (オオマワリジョウシャとは) [単語記事] - ニコニコ大百科

限界移動オタクの大回り旅行

土曜の23時くらいに思い立って、しばらく行こうか行くまいか悩んでたら朝の5時くらいに大学の先輩から呼ばれたので、ついでと思って行くことにしました。

第1走者:南武線分倍河原1007発→立川1018着)

朝から調布行ってラーメン食って麻雀打ったので、京王線分倍河原駅まで移動してからのスタートです。 初乗り運賃ヨシッ!

ちなみにマルス端末はなかったのでちっちゃいA型サイズです。クソが代。

第2走者:青梅線(立川1026発→拝島1038着)

f:id:jj1lis:20220214055146j:plain

青梅線のホームは中央本線の下り(高尾方面)と共用です。ホームに降りたら松本行のあずさが停まってました。 大回りは特急も乗れるし松本まで東京近郊区間なんですけど、八王子から先は盲腸なので乗れません。

松本城見たいですね。今度の18きっぷシーズンになったら行こうかな。でも18きっぷじゃ特急乗れないし、ロングシートで4時間近く耐えないといけないので大変です*2

f:id:jj1lis:20220214060449j:plain

10分位で到着。乗ってきたヤツは中央線から直通なので10両くらいある。長いね。

f:id:jj1lis:20220214060555j:plain

たった7kmのキロポストが横に立ってた。そりゃあっという間なわけよ。

コンコースに行ったら相模線が雪で遅れるかもとか情報が出てた。これ大丈夫か?

第3走者:八高線(拝島1101発→高麗川1125着)

拝島は青梅線五日市線八高線西武拝島線が発着するそれなりにデカい駅です。

f:id:jj1lis:20220214061233j:plain
西武合わせてたぶん4面7線

八高線高麗川以南と以北で完全に運行系統が分かれていて、八高南線は川越線と直通運転してるので寝てると間違いなく川越まで飛ばされます。気をつけてね。

留置線にE231系がいました。さっきまで乗ってたやつに比べると随分と短小です。

f:id:jj1lis:20220214062137j:plain
E231系3000番台。相変わらず椅子が固い。

そのうち来たやつに乗ります。相変わらず途中の写真はないですが、通勤電車の車内で撮りまくれるほど僕は勇敢ではありません。

第4走者:八高線高麗川1132発→高崎1337着)

高麗川に着く前くらいから周りの乗客がソワソワしてて、みんなドアが空いた瞬間そそくさと早歩きで出ていきました。

八高北線は今どき非電化*3で、やってくるのは2両のディーゼルカー*4です。

f:id:jj1lis:20220214064322j:plain
八高線非電化区間充当のキハ110系(到着後高崎で撮影)

途中には無人で自動改札のない駅も多いので、途中で乗降する人は乗車時に車内の発券機で整理券を取ってから降車時に運転席横の精算機に整理券と運賃を払います。ほぼバスじゃん。

4両の電車から2両の気動車に行くもんで、全員が乗り換えするわけではないとはいえそれなりに混みますが、何とか座ることができました。今までと違って周りには行楽客っぽい人が多く、外の景色をしきりに眺めていました。

こんな感じで人の営みは十分に感じられますが、それでも都会の路線に比べりゃクソミドリみたいな風景は多いので目には優しいです。

f:id:jj1lis:20220214064946j:plain
確か折原と寄居の間くらい

f:id:jj1lis:20220214065544j:plain
この辺りまで来ると雪もちらほら残ってる

倉賀野までくると大きな線路と合流して、久しぶりに都会的な光景が広がるようになります。八高線は本来八王子と倉賀野を結ぶ路線ですが、全ての列車が高崎線に直通しています。

高崎駅からは「SLぐんま みなかみ」「SLぐんま よこかわ」という臨時列車が月一回か二回くらい発着しています。乗りて〜。

f:id:jj1lis:20220214071200j:plain
高崎、211系しかおらん

対面の車両は上越線水上行ですね。上越線は高崎から新潟県の宮内へ続く路線で、さらに信越本線を通して長岡まで運転しています。当の信越本線は......はい。

正直朝のラーメンが腹に残っていますが、この後の行程も考えるとどうせすぐには食べられないので高崎駅名物のだるま弁当を買います。お値段1,100円、ちょっとお高めかもしれない。

第5走者:両毛線(高崎1337発→小山1523着)

両毛線は小山と新前橋を繋ぐ路線ですが、上越線経由で(といっても1駅だけど)高崎まで来ているので小山行の始発は実質高崎です。座席確保が確実でありがたいですね。クソが代。

栃木南部の割と聞き覚えのある地名を多く通ります。しかし景色が見れるわけでもなし、見れたとて特に見どころあるわけでもなし。しかも2時間と、正直この区間が一番辛かったです。 ただ別に沿線に名物がないわけではなくて、足利フラワーパークとか佐野ラーメンとかありますよ。どうせ降りられないから意味ないけど。

途中で「両毛線って発車メロディが童謡になってる駅多くない?」とか考えつつ、ボケーっと戸次数理論理学を読んでたら小山につきました。

f:id:jj1lis:20220214073903j:plain

f:id:jj1lis:20220214073913j:plain

ところで小山駅両毛線ホームって他から妙に離れてるんですよね。俺も徒歩部名乗れるのでは?とか思いつつ宇都宮線*5上りホームまでの時間を計ってみることにしました。

f:id:jj1lis:20220214074349p:plain

分速80mとして280mくらい。京葉線の足元にも及びませんでした。

第6走者:上野東京ライン(小山1545発→川崎1742着)

上野東京ラインは上野-東京間の専用線を経由して、北側の常磐線高崎線宇都宮線から南側の東海道本線へ直通運転を行う列車の系統名です。そのため中には熱海→黒磯(268.1km)を5時間弱かけて走る列車も存在します*6

向かいのホームにいるのは茨城県の友部*7へ向かう水戸線です。友部まで行って常磐線で戻ってくることで更に大回りもできます。しかしこのときの僕はとにかく徹夜明けの疲れで一刻も早く帰りたい一心でした。

f:id:jj1lis:20220214080156j:plain

駅弁もあるし、グリーン課金することに決めます。乗るのは川崎までだけどどうせ変わらないので小田原まで購入。グリーン車は確実に座れるしリクライニングもあるし、窓も大きいので眺望性も快適です。1階席だけど。

f:id:jj1lis:20220214080704j:plain
ちなみに1階からスカートの中は見えないらしい

グリーン車は友達と乗っても会話なんかは憚れるような雰囲気です。2階は結構人が乗ってたので、こんな中で弁当なんて絶対食えねえなと思い下に移動しました。まあどうせ雨振ってるし、メシが食えればどうでもいいです。

こんにゃく、しいたけ、たけのこ、山菜など地味めなメニュー。右下の黄色いやつは甘栗でした。両毛線で鞄に入れてたから下に潜っちゃったけどチキンも入ってます。普通に鶏めし弁当でよかったかもおいしいね。

ところで左下のいかにもヤバそうな青緑のやつって何なんだろう? 得体が知れないけどバカなのでそのまま食べます。

f:id:jj1lis:20220214081951j:plain

すこしうたた寝して鉄道唱歌の発車メロディで起きたら品川を出たところで、外はすっかり都会の様相になっていました。やっぱりグリーン車って速いね*8上野東京ライン東海道本線普通と違い、梅に名を得し大森も行進してそうな蒲田もすっ飛ばして川崎に滑り込みます。

第7走者:南武線(川崎1746発→府中本町1831着)

本日二度目の南武線が最終ランナーです。

f:id:jj1lis:20220214083148j:plainf:id:jj1lis:20220214083156p:plain

普段乗ってるし今更特に何か感じることもなく、Twitterくらいしか見てなかった気がする。

8時間24分、乗車距離318.5kmをかけて出発地の隣駅である府中本町に到着しました。

f:id:jj1lis:20220214085035p:plain
大まかな経路

まとめ

ちゃんとJRにお金を落としましょう。

*1:選択乗車(東日本旅客鉄道株式会社旅客営業規則:旅規第157条)。詳しくはここを参照。

*2:中央東線普通で高尾方から甲府や松本まで行く列車には211系が投入されている。セミクロスシートの編成もあるけど引けた試しがない。

*3:線路の上に電気を流す架線が通っておらず、当然電車は走れない。都内だと唯一だったはずで、それ以外の東京近郊のJR路線だと久留里線くらい。

*4:要は汽車

*5:東北本線黒磯以南の案内名称

*6:今度の3月のダイヤ改正で宇都宮行に短縮するらしい?

*7:水戸の何駅か手前

*8:要出典