web小説礼賛記

さらなる俺 TUEE をあなたに!

執筆環境としてのMac (macOS)

 注意: Macに礼賛バイアスがかかっています。

欠点 Cons

 強いて言うなら、というところですね。

コスト

お値段が高い

 マシンの性能的には、コスパが悪いです。OSのデザイン料と思うべきかと。でも、MacのUIが好きなら、元は取れるとmobaは思います。

最低限の調整はいる

 どの環境でも同じですが、備考として。キー操作にも、多少慣れが要ります。

ゲームが少ない

 こればかりは、Macが劣る部分です。一方、最近のLinuxは、Protonのおかげで豊富なゲームをプレイできます。

機能面(?)

 Linuxユーザからすれば、物足りないところも多いようです。

配色

 2018年に、macOS Mojaveでダークテーマが導入されました。しかし、Linuxほど自由にテーマを差し替えることはできません。

コマンドがBSD

 GNU系コマンドを入れればいいだけですが。

各種ソフト

 Linux専用のソフトというのが、やはりあるようです。

キーボードが悪い?

 バタフライキーボードは本当に評判が悪いです。また、Fnキーを小型ディスプレイに変更した上位モデルは、改悪であるとよく聞きます。

 最近は、この touch bar 搭載モデルが標準になったそうです。

 僕は2015年のMacBook Proを使っているため、この辺りの状況を判断できません。バタフライキーボードは、店頭で自分でも驚くほど速くタイピング出来ることを経験したため、言われるほど悪いのか疑問に思っています。

 壊れるならゴメンですけれどね。

風評被害がある

 Macを取り出すと、ダメージを受けます。ドヤ顔をしていると思い込んだり、「そんな無駄に高いPCを買うなんて」と冷笑する人たちがいます。あなたはAppleのイメージ戦略に踊らされている、などと語り始める人もいますね。『あいつMacbook Proだし 笑』みたいな陰口すら成立します。気取っているとか、お金のかけすぎみたいな意味でしょうか。

 放っておいてくれ

 まあ冗談です。同じことをしないように気をつけたいと思います。僕はLinuxWindowsを悪く言うつもりはありません。MSは、VSCodeを見るとイケてる企業だと思います。

利点 Pros

 Macの利点は、快適さと不便の無さです。UI天国だと思います。

 安定性も文句ありません。高DPIの画面が確実に動きます。

ハードウェア

文字が綺麗

 印刷よりも綺麗かもしれません。文字も写真も、光が密で美しいです。(ただし、iPhoneiPadほどはきめ細かくはありません)

トラックパッドが快適

 スマホ的な操作感を導入できます。特にスクロールで重宝します。ブラウジングは無敵です。アプリにフォーカスが無くても、カーソルがその上にあればスクロールできます。

半角キーと全角キーが分かれている(JSキーボード)

 スペースキーの左右にあり、ワンタッチで変更できます。

 Windowsでも、AutoHotKeyで似たことができます。あと、今後Windowsマシンも半角キー切り替えキーを廃止し、かなキーと英数キーを作るそうです。

ソフトウェア(入力関連)

自動変換が優秀

 ほとんどスペースキーを押しません

音声入力/読み上げ

 標準で入っているため、どのアプリでも使えます。ただ、そこまで使い勝手は良くありません。

軽量の縦書きエディタがある

 CotEditorJEdit Ωで縦書きができます。これについては、別記事を書く予定です。

 → 書きました

ショートカットが良い

 Ctrl、Command、Optionという3つの装飾キーを自在に使えます。Fnキーは、明かりの調節など、OSの機能を呼び出すために使います。

記号(…-→)の入力が楽

 Option+; で三点リーダ(…)、Option+Shift+-で全角ダッシュ(—)を入力できます。→はー>の(自動)変換です。

 任意の記号入力のショートカットは、サポートされせん、残念ながら。

 karabiner binder などを使って、強引に入力させることはできます。エディタにスニペットとして登録しても良いです。

変換が楽

 Ctrl+Jでひらがな、Ctrl+Kでカタカナに変換してくれます(QWERTYキーボードの場合)。

EMacs風キーバインディング

 Ctrl+Aで文頭へ移動、Ctrl+Eで文末へ移動など。どのソフトでも使えます。MS Wordでは不可ですが。

シェルを使える

 一度ターミナルにハマると、シェルが使いコンピュータは使いたく無くなりますね。

その他

 ディテールもGoodです。

サンドボックスが良い

ダークテーマ (macOS Mojave〜)

 前述の通り、どのアプリも黒くできます。

大体全部マルチタブ

 提供されたサンドボックスに乗った全てのアプリが、マルチタブに対応しているようです。複数のメディアの表示も自然にできます。

エクスプローラ(Finder)が良い

 カラム表示により、複数の階層をまとめて表示できます。

f:id:moba_lake:20181117220317p:plain

 ショートカットでディレクトリ移動をしたり、ブックマークも設定できます。そして、もちろんマルチタブ対応です。

アプリが良い

 多くのインストールは、Linux同様にワンコマンドで行えます。

ランチャ (Manico)

 ショートカットでアプリ一覧を視認して選べます。検索も簡単です。

タイル型ウィンドウマネジャ (yabai)

 ウィンドウを自動的にリサイズ・配列することで、実質的に画面を広くしてくれます。下記Karabinerとの組み合わせで、キーボードからウィンドウのフォーカスを移動できるようになり、これが効きます。

キーバインディング (Karabiner-Elements)

 キーのリマップなどを設定できます。

macOSUNIX

ディレクトリ構成が綺麗

 絶対パス/から始まります。

Linuxシェルが使える

 詳しくは、本ブログの『執筆のためのシェル入門』を参照してみてください。

その他、気の利いている点

スクリーンショット

 段階的に操作が進むため、とりあえずスクショモード(F5)に入ればOKです。

辞書

 Command+Ctrl+D もしくは Spotlight から。

デフォルトアプリ

 カレンダ、画像や映像/PDFのトリミング、表の編集など。複数ファイルを開くのにも強いです。Quality of Lifeというのを感じます。

 ちょっと執筆環境からずれた気もしますが、Macの紹介でした。

横書き用のエディタ (Win, Mac, Linux)

 結論を言うと、GUIエディタはAtomが良いと思います。

横書きエディタに欲しい機能

最低限の機能

マルチタブ

 一つのウィンドウで複数のファイルを開く機能です。

ダークテーマ(黒背景白文字)

 もしくは美しいテーマ。

文字数カウント(常に表示)

 全角スペースを除外できるとさらに良いです。

できれば欲しい機能

フォルダを開く(フォルダ内容の常駐表示)

 ほとんどのエディタにはこれが無いです。

タイプライタースクロール

 カーソルが画面外に出るとき、半ページ分スクロールする機能です。

トラックパッドが優秀なら、この機能は要らないかもしれません。

GUIのエディタ

 余白の表示が綺麗なものに限定して紹介します。また、どのエディタにも、文字数カウント、マルチタブの機能があります。Focus Writer以外には、フォルダの表示機能があります。

FocusWriter

 最も無難な環境ですが、フォルダを開く機能がありません。見た目もイマイチ。ウィンドウをクリックしても、テキストから離れた箇所だとカーソルが移動しないのも不便です。

  • Good: 黒背景白文字(など任意)
  • Good: 中央寄せ(など任意)
  • Good: 一行に任意の文字数
  • Good: タブが画面下部
  • Good: タイプライタースクロール
  • Bad: 見た目
  • Bad: ディテール

f:id:moba_lake:20181117204410p:plain

 Qt5製です。ソースが公開されているので、プログラミングができるなら、好みの変更を加えることができます。

Typora

 markdown向けのエディタなので、改行が独特です。よほど好きでないとお勧めできません。

  • Good: 数種類の美しいテーマ
  • Bad: フォルダの表示は左サイド限定
  • Bad: markdown用のため、改行が独特
  • Bad: テーマに応じた行あたり最大文字数(変更不能

f:id:moba_lake:20181117203000p:plain

Atom

 詳しくは、後日に専用記事で。機能的には最も優れていますが、整えるのがやや大変です。起動が遅いのも、コンピュータによっては難点になるかもしれません。

  • Good: 任意のテーマ
  • Good: 任意の行あたり文字数
  • Good: 複数のフォルダの表示(!)
  • Good: ミニマップなど
  • Good: 埋め込みのターミナル

f:id:moba_lake:20181117203034p:plain

 文字数カウントはプラグイン経由で行います。プラグインのソースは自由に編集できるため、数行書き足せば、全角スペースなどを無視した文字数カウントにもできます。

CLIのエディタ

 ターミナル上で動きます。

Vim

 習得には時間がかかりますが、編集に強く、ジャンプや検索も得意です。画面分割など、高級な機能も(高級な機能こそ)持っています。設定すれば、マウスも普通に使えます。

  • Good: ターミナルの1タブとして使える
  • Good: アクション性のあるキー操作
  • Good: 自在なキー操作

f:id:moba_lake:20190810151725p:plain
vim (プラグイン導入後)

 なんだかんだで小回り気が利き、快適になります。しかし、導入には、キー操作と設定ファイルの作成という二つの壁が立ちはだかります。

Emacs

 こちらも高級なエディタです。Evil を導入すれば、 Emacs でも Vim 風のキー操作が可能です。

なろうを縦書き&段組みで読む (PC)

縦書きについて

メリット

タブレットの場合

 スマホKindleの画面は縦長ですので、そもそも縦書きが適しています。

横持ちにして横書きで読んでもいいですが。

 iPhoneのブラウザにはアドオンが無いため、縦書き表示は無理かと思います。Androidなら可能かもしれません。

PCの場合

 PCでは、段組み(ページ単位の表示)にすることに意義があるかもしれません。文字数の感覚に慣れができます。表示が縦長になるため、タブやウィンドウのタイリングとも相性が良いでしょう。

webページを縦書きにする方法

 最近のブラウザには、もともと縦書きの機能がついています。縦書きは、CSS3のwriting-modeを設定することで有効になります。確認したところ、スマホChromeですら、縦書き機能がありました。

 したがって、サイトのCSSを差し替えることで、文書を縦書きにすることができます。

 こんなに簡単そうなことを、なぜ公式がやってくれないのか……。そう思うのは、ユーザの勝手でしょうか。

縦書きの導入(PCのみ)

 ハーメルンの場合、サイトをモバイル版表示に切り替えることで、実験機能である縦書きを有効にできます。折り返しがウィンドウの幅と同じになるため、割り切って、閲覧用のブラウザ(のインスタンス)を分けると良いかもしれません。

 以下では、なろうのためのアドオンを導入します。

アドオンを入れる

 CSSを差し替えるため、StylishStylusをブラウザに入れます。

 Stylishは、ユーザの情報を企業に送っていたことがバレて、炎上したことがあるようです。が、ネットはそういうものでしょう。どちらを使っても大差無いかと。気になるならStylusを入れます。

 いずれも、userstyles.orgにユーザがアップロードしたcssを、任意のサイトに適用するアドオンです。導入は5分以内。検索サイトやSNSなどの配色も変更できます。

プロパティの設定

 なろうのホームでStylusのアイコンをクリックし、『小説家になろう 縦書き段組』を導入します。 その名の通り、段組みにして表示してくれます。また、画面端にカーソルを持っていくと、メニューがポップするようになります。

 CSSから、以下の部分を好みで編集します。

/* 23行目 */
font-size: 14pt; /* フォントサイズ */
/* 28行目、29行目 */
color: #666; /* 文字色 */
background-color: #eee; /* 背景色 */
/* 77行目 */
width: calc(24rem * 1.8); /* 行数 (24remの値を変更) */
/* 79行目 */
height: 38rem; /* 行あたり文字数 (38remの値を変更) */

 mobaの場合、文字色は白に近い灰色(#b9b9b9)にしてみました。背景は真っ黒 (#000000) です。

 参考までに、1ページあたりの文字数は、電撃文庫は42文字17行、講談社タイガは40文字17行、講談社ラノベ文庫も同様です。なろうの場合、PCから見ると、行あたり37文字でした。

縦書き用CSSのカスタマイズ

 さらにCSSを編集します。検索結果を参考にしました。

線で段を区切る

 :root #novel_honbun { } 内を編集します。まず、column-gap: 10em;は広過ぎるため、2.5emくらいにします。emは親要素の文字サイズを表すそうです。

 column-rule: solid 1px #808080;を追記して、段区切りの線を入れます。色はお好みで。

f:id:moba_lake:20181027161416p:plain
ブラウザ上の表示を抜粋

及ばぬあれこれ

 にわか仕込みのmobaでは至らぬところがあります。

  • タイトルと本文の間に区切り線を挿入したい
  • 連続する改行を圧縮したい(切実)
  • 見開き表示(1段に2ページ表示)にしたい

 まあ今ので十分かなと思っています。凝りたい人は頑張ってください。そして、シェアしてください。興味のある部分なので、僕も泣いて喜びますよ!(どうでもいい)

シェル入門 #2: 環境整備 (Mac)

 いきなりMacユーザ専用の項目ですみません。

 主な内容は、iTerm2の導入と設定です。長いですが、頑張ってください。

 iTerm2は動作が遅いため、慣れたら他のターミナルに移ることをオススメします。tmuxなどの terminal multiplexer の使用も検討してみてください。

システム環境設定

 左上のリンゴマークから開けます。詳しく見ておくと便利になります。

トラックパッド

 システム環境設定 > トラックパッド > ポイントとクリック > 軌跡の速さを調整します。mobaは最速にしています。

キーボード

 システム環境設定 > キーボードに移動します。

リピート速度

 > キーボードから、リピート速度と、リピート開始までのディレイを設定できます。特にカーソル移動を速くすると、効率的です。

Launchpadのショートカット(必要なら)

 Launchpadは、アプリのランチャです。> ショートカット > LaunchpadとDock > LaunchPadを表示から、Command+Eなどに設定します。

 Spotlightを好む場合は不要です。

Finderの設定

 Finderとは、ファイル・ディレクトリのエクスプローラです(Mac)。

Finder上でファイルの拡張子を表示

 Finderにフォーカスがある状態で、Command+,で環境設定を開きます。環境設定 > 詳細 > 全てのファイル名拡張子を表示にチェックを入れます。

 Command+fによる検索の挙動を、環境設定 > 詳細 > 検索実行時: 現在のフォルダ内を検索 としても良いかもしれません。

Finderウィンドウの上部にフルパスを表示

 ターミナルを開き、以下のコマンドを入力します。不要な人は飛ばしてください。

$ defaults write com.apple.finder _FXShowPosixPathInTitle -bool true; killall Finder
$ # trueをfalseにして実行すれば、非表示にできます。

ちなみに、Mac起動時の音を消すには、以下のコマンドを走らせます:

$ # 実行にはパスワードを求められます
$ sudo nvram SystemAudioVolume=%80
$ # 起動音をONにするには: sudo nvram-d SystemAudioVolume

Finder下部にパスバーを表示

 Finderのメニューバー(Finderにフォーカスがある状態で、リンゴマークの右)から、表示 > パスバーを表示とできます。

Finderで隠しファイルを表示

 Command+Shift+. で表示/非表示を切り替えます。マメ知識として。

シェルの設定

プロンプト文字を変更(例)

 #3でもやるので、後回しにしても構いません。ターミナルを開きます。

moba:~ moba_lake$ # これは見づらい
moba:~ moba_lake$ # ので、プロンプトを表す"環境変数"を変更すると、
moba:~ moba_lake$ PS1='\w $ ' # (PS1: primary Prompt String)
~ $ # スッキリします。(`~/Desktop $ `のような表示になるはず)

 毎回コマンドを打つのは手間なので、自動化するなら、

$ # 環境設定ファイルに追記する(直接ファイルを開いて編集してもいい)
$ echo "export PS1='\w $' " >> ~/.bash_profile
$ # 変更した内容をこの場(シェル)で反映
$ source ~/.bash_profile

プロンプト文字を着色

 プロンプト文字を着色すると、コマンドと区別ができて見やすくなります。

 ANSIカラーコードで着色できます。この記事を参考に、僕はexport PS1='\[\e[0;32m\]\w \[\e[0m\]$ 'として、パスの部分を苔色にしています。

 ここで書式を間違えると、表示が崩れる場合があります。

コマンドのインストール

 先にHomebrewというパッケージマネジャを入れてから実行します。

$ # treeコマンドを入れる
$ brew install tldr  # 便利な非公式マニュアル
$ brew install tree  # ファイルのツリー表示
$ brew install trash # ファイルをゴミ箱へ送る

iTerm2の導入

 iTerm2は、標準のターミナルの上位互換と思ってよいでしょう。(ただしパフォーマンスを 除く)。以下のように優れています。

  • カラーテーマの変更
  • pane(画面)分割(cmd+(shift)+d)
    • 特定のpaneを最大化して表示
  • ウィンドウとpaneの配列を記憶

 標準のターミナルで画面分割をする場合は、tmuxGNU screenを導入します。

ダウンロード

 iTerm2をダウンロードページから落とします。解凍した.appファイルを/Application(Finder上でCmd+Shift+Aを押して移動可能)に移せば、インストール完了です。

 とりあえず、iTerm2を起動し、Dockに留めます。

FinderからiTerm2を開くショートカット

 システム環境設定 > キーボード > ショートカット > サービス > New iTerm2 Tab Here。mobaはCommand+Shift+Vを設定しています。お好みで。

ディレクトリ位置の設定

 やはりCommand+,でアプリの設定を開きます。Settings > Profiles > Working Directory > Advanced Configuration を開きます。

 初期ディレクト~/Desktopにして、タブ分割時/新規タブ時にディレクトリ位置を引き継ぐ設定は以下です:

  • Working Directory for ..
    • New Window: Directory: Users/user_name/Desktop
    • New Tabs: Reuse previous sessions's directory
    • New Split Panes: Reuse previous sessions's directory

iTerm2の環境設定

 Command+,でPreferencesを開きます。色々チェックを入れたり外してみると良いでしょう。

  • Appearance >
    • Tabs >
      • Show tab bar even when there is only one tab: に僕はチェックを入れています。
    • Dimming >
      • Dim inactive split panes: どれがアクティブか分かりやすくなります。
      • Dim background windows: やはりチェックを入れました。お好みで。
    • Window >
      • Show proxy icon in window title bar: お好みで。
  • Profiles >
    • Keys > Load preset: Natural Key Editing で、opt+左右やdeleteが有効になります。
    • Text > Font: Menloあたりに設定します。日本語フォントは自動的にヒラギノに。
    • Colors >
      • 右下のColor Presets.. に注目。次の項で設定します。

カラースキーム(カラーテーマ)の変更

 テーマをダウンロードし、iTerm2に参照させます。検索するなどして、iTerm2のテーマを見つけてください。僕はSmyckにしました。

 テーマをダウンロードしたら、どこかに安置します。先ほどのColor Presets > Importで、.itermcolorsで終わるファイルを選択します。再びColor Presetsを開くと、選択肢が増えているため、Smyckを選びます。

その他おすすめのアプリなど

Mac三種の神器

 勝手に呼んでいるだけですが、Macの操作感を遥かに良くするアプリたちです。

Manico

 アプリのランチャです。karabiner-elementsにより、Capslockをハイパーキーにしておくとさらに便利になります。

yabai & skhd (Tiling WM; window manager)

 設定には根気が入ります。が、得られる成果は最高です。まるでOSが変わったかのように。

 なお設定ファイルは、シンボリックリンクに差し替え、実体は~/dotfiles/あたりに入れておくのがオススメです。

Karabiner-elements

 主にキーのリマップに使います。シェルコマンドの起動には、skhdを使用した方が設定が楽だと思います。

構築完了!

 いや〜、長い^^; お疲れ様でした。

シェル入門 #1: 動機

 黒い箱にコマンドを打ち込むことで、自在にデータを操作することができる。これこそがシェルの魅力で、一度ハマると、何でもシェルでやりたがるとか……。

シェルの魅力

作業空間として洗練されている

 どうも、mobaです。先日Macを買いました。UNIX系のOSだから、とターミナルを使ってみると、以外と役に立っています。例えば、

連番のテキストファイルを生成

 このコマンドで連番ファイルを作れます。

$ touch -a {0..24}.txt # 0.txt, 1.txt, .., 24.txt を作成

 25回もファイルの新規作成 > 名前を付けて保存する手間が省けました。これだけでも有用です。

目次の生成

 各話ファイルの一行目に、タイトルを書くとします。ファイル名と一緒に列挙すると……

$ find * | sort -n | while read f; do
> printf '%2d %s\n' "$(basename "$f" .txt)" "$(sed -n 1p "$f")"; done
 0 プロローグ!
 1 物語が始まるぞ!
..
11 ここで物語が一気に加速します。
..
24 エピローグ

 目次になります。この表示を 1 つのコマンド(スクリプト)にすれば、手頃に目次を見ることができます。

その他、小説データの処理

 任意のルビ形式、任意の改行スタイル、自動ルビ、統計処理、執筆速度の監視、pdf/epub/mobi出力、docxファイル化、などなど……。すべてコマンドにします。こんなGUIは無いです。

CLIコマンドライン)がマシン操作の基本になる

 小説データに限らず、コマンドラインからは多彩な操作ができます。閲覧、編集、検索、ダウンロード、音楽の再生、n分後にマシンをスリープ、などなど。

 ターミナルが基本的な作業場となり、開かない日は無くなるでしょう。「シェルが使えないマシンなんて!」と考えるようになるかもしれません。

 けっこう本当の話です

リッチな機能が多い

 シェルの文字列処理、Vimのテキスト編集、Gitの編集履歴mecab形態素解析。豊富な機能へのアクセスは、コマンドラインとして提供されています。

備考

Q. OSはWindowsで良い?

 分かりません(え

 Windows には PowerShell というのがありますが、 Linux シェルとは全く毛色が異なります。このシリーズで扱うのは Linux シェルで、特別な用意が要ります。

 Windows では、 Linux の仮想環境を構築するのが無難だと思います。1つのウィンドウが Linux のように振る舞います。

WSLは、まともな環境を作るのが大変そうなのでお勧めできません。

Q. マシンスペックは?

 あまり必要ありません。ただ、SSDの方が有利です。

Q. プログラミング言語は?

 使えた方がいいです。

 ただし、シェルはファイル操作を最速で書けるため、 一回性の操作は全てシェルで行う のが基本です。

Q. 習得時間は?

 それなりに必要ですが、連番ファイル生成は、もうできますね。touch {m..n}.txtでした。この調子で可能なことは増えていきます。

 このシリーズが、取っ掛かりになると良いのですが。

入門方法?

本ブログの『執筆のためのシェル入門』

 辞典的な部分と具体例で構成されています。上手く活用してあげてください。

参考書

 始めた時こそ、本を読めば、時間を節約できます。何か買ってみてはいかがでしょうか。

 mobaが買った本の話をします。(他にも良い本があるかもしれません)。タイトルは、Amazonページへのリンクになっています。

新しいLinuxの教科書

 非常に気の利いた良書です。bashCLIのことがよく分かります。

Linuxのことは簡単に済ませられています

 コツとは無数にあるものですが、本社は細部に至るまで押さえてくれます。Ctrl+rでコマンド履歴を検索できることを知っていましたか? mobaも、素直に始めからこの本を買っておけば良かったです。暗黙的な100の知が得られます。

シェルプログラミング実用テクニック

 趣味に走るならこの本です。主にテキスト処理について強くなれます。シェルは文字列を受け渡しするプログラムなので、シェルに強くなれると言い換えることもできます。

 文章量が多く、コードについて書きつつも、読み物としての面が強いです。内容的にもなかなかゴツい。二章まで読めば、残りは応用みたいなものなので、一旦読むのを止めてもいいかもしれません。

 ワンライナ(一行のコード)でデータを加工するのが、この本の主なテーマです。基礎的な思想(アイデア)を述べ、その後はとことん実践的になります。

 この本の中では、シェルスクリプトは書かれません。コマンドを自作する場合は、別の本を読むか、誰かのコードを真似ましょう。複雑になるならプログラミングで。

 小説データの加工を目的とするなら、オーバーキルな本ですが、CLIを操る人の視点が見られるのは、大きな利点です。読めば相応の実力が手に入るでしょう。ただ読むときは、先にシェルのことを理解した方がいいと思います。最低限、文法は抑えておくことを勧めます。

フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門 改訂2版

 bashシェルでブログのサーバを用意する、新しい入門書です。性質上、webもbashも簡単な説明となっていますが、エッセンスが盛り込んであります。

 タイトルは凄そうですが、内容的には入門書なので(入門レベルで済む内容なので)、シェルの超技術だと期待しないでください。至って普通にシェルを使う本です。

目標: ディレクトリベースの執筆用管理ツール

仕様

 原稿はtxtデータとして管理します。

 簡単のため、原稿ファイル名を番号.txtという形にし、タイトルは一行目に書きます。

構成

 例えば、以下のようなディレクトリ構成にします。

$ tree -d -L 2
.
├── build # プラットフォームに応じた出力先
│   ├── narou    # なろう
│   ├── kakuyomu # カクヨム
│   └── ebook    # mobi, epub, pdf, ..
├── data   # 資料(あれば)
├── drafts # 下書き(必要なら)
├── gnome  # オートルビの設定ファイルなど
├── meta   # あらすじなど
└── posts  # 原稿
      ├── book_1   # 巻
      │   ├── ch_1 # 章
      │   └── ch_2
      └── book_2
          └── ch_1

 静的サイトジェネレータ (SSG) の構成を真似てみました。

gnome

 構成が綺麗にできたら、操作も綺麗に行いたくなるものです。小説データに対する操作は、CLIから行います。(エディタはGUIを使うかもしれませんが)。

 小説データに対する操作の集まりを、暫定的にgnome(ノーム)と呼ぶことにします。

gnomeの実装?

 あくまでシェルの講座なので、mobaはシェルスクリプトで書いてみます。しかし、プログラミング言語を使った方が簡単なので、実際にはお勧めできません。

プログラミングが初めてなら、Goがシンプルで良さそうだと思います。もちろん、bashでやってもいいですが。

gnomeに期待する機能

Viewerとして

 目次、文字数カウント付きの目次。第n話をエディタで開く。

Converterとして

 任意の改行スタイル、ルビ文字、自動ルビ、斜体など。pdfやmobi出力も。

Editorとして

 話や章の挿入・入れ替え。タイトルの変更など。

Watcherとして

 執筆速度の自動監視。グラフやカレンダを生成して進捗を可視化。

シェル実用 #1: グレッグ様の数を数える (grep, less)

† Mission †

 作品:嘆きの亡霊は引退したい 〜最弱ハンターは英雄の夢を見る〜
 作者:槻影 [Amazon]

 に現れる、グレッグ様の数を数えよ!

> What's this?

 グレッグ様を礼賛するネタ記事です。ネタ活動にもターミナルは役に立つ、という具体例としての意義はあります。

 この程度なら、シェルが初見でも数時間で使えるようになる(なった)ので、やってみてください。こんなんできるし! という方はスルーしてください。

グレッグ様とは?

 ベテラン冒険者です。調子に乗って『グレッグ様』を自称したため、今日の最新話でもネタにされています。一定の域にいる人物のため、未熟な冒険者グレッグ様と呼ぶなら、あながち間違っていません。

† Solution †

1. 本作をダウンロードする

 narou.rbを使いました。事前のインストールが必要です。

$ cd path/to/your/narou/directory
$ narou d https://ncode.syosetu.com/n6093en/

 自力でhtmlをダウンロードしてパースするのもアリです。

2. テキストファイルを連結する (必要なら)

 grep再帰的な検索もできますが、lessで読むときに楽なため、連結しておきます。

 ripgrepを使うと、より楽に再起検索ができます。

cd "$(grep)"

 生データ(.txt)の入ったrawディレクトリを見つけ、移動します。GUIから移動しても構いません。CLIが初見なら、飛ばしてください。

 最新のnarou.rbを使う場合は、rawディレクトリにはhtml、本文ディレクトリの方にtxtファイルが入っています。

実践

 findにより再帰的にディレクトリを検索し、grep -vでフィルタリングします。

$ pwd # print working directory
/Users/moba/Desktop/narou
$ # まずrawディレクトリを探す
$ find . -type d | grep 嘆きの亡霊 # .は*でもいい
./小説データ/小説家になろう/n6093en 嘆きの亡霊は引退したい _最弱ハンターは英雄の夢を見る_
./小説データ/小説家になろう/n6093en 嘆きの亡霊は引退したい _最弱ハンターは英雄の夢を見る_/本文
./小説データ/小説家になろう/n6093en 嘆きの亡霊は引退したい _最弱ハンターは英雄の夢を見る_/raw
$ # 3行目を抜き出す
$ find . -type d | grep 嘆きの亡霊 | tail -1 # sed -n 3p や grep raw でも良い
./小説データ/小説家になろう/n6093en 嘆きの亡霊は引退したい _最弱ハンターは英雄の夢を見る_/raw
$ # rawディレクトリに移動する
$ cd "$(find . -type d | grep 嘆きの亡霊 | tail -1)"
備考
  • grep | cd "$(cat)"とパイプを通すと、cdがサブシェルで実行されるために無効です。
  • grep --color=alwaysだと、cd "$(grep)"に失敗します。着色文字(ANSIエスケープコード)のためです。ただし、ターミナルの出力からは、エラーの原因が分かりにくいかもしれません。

プロンプトを短くする(必要なら)

 パスをプロンプトに表示している場合は、短くした方が見やすいです。

$ pwd
/Users/moba/Desktop/narou/小説データ/小説家になろう/n6093en 嘆きの亡霊は引退したい _最弱ハンターは英雄の夢を見る_/raw
$ # パスがあまりに長かった
$ PS1='$ ' # プロンプトを短くする

 mobaの環境では、ターミナルの横幅に対して、プロンプトが長過ぎるとバグが出るため、短くしました。基礎編#3で作ったps-sを使ってもいいです。

 fishシェルの場合は、省略されたパス表示がデフォルトなので、プロンプト文字の変更は必要無いでしょう。

連結する

 3つの改行で区切ってファイルの内容を連結します。

whileで連結する

 標準出力は、消費しない限り書き足されていきます。そのため、ファイル毎にprintfすれば、printfした内容が連結された出力になります。

$ find * | sort -n # -n: naturally / numerically
1 1 メンバー募集.txt
2 2 メンバー募集②.txt
<省略>
$ find * | sort -n | while read f; do
> printf '%s\n\n\n' "$(cat "$f")"; done > nageki.txt
$ mv nageki.txt where/you/like/
別解: xargsで連結する

 xargs -Iの実行に伴う文字{}の置換は、コマンド置換$()よりも後に行われます。$()が処理順の優先順位を変えるものだと考えると、当然ですね。

 代わりにbash -cを使ってみました。

$ # GNU xargsで改行のみを区切り文字にする (-d: delimiter)
$ find * | sort -n | gxargs -d '\n' -I{} bash -c 'printf "%s\n\n\n" "$(cat '{}')"'
$ # もしくは、ヌル文字区切りで処理する (移植性と確実性から最善)
$ find * -print0 | sort -zn | xargs -0 -I{} bash -c 'printf "%s\n\n\n" "$(cat '{}')"'
$ # ファイル名が改行文字を含まないなら、trで\nを\0に変換してもいい (tr: translate)
$ find * | sort -n | tr '\n' '\0' | xargs -0 -I{} bash -c 'printf "%s\n\n\n" "$(cat '{}')"'

 シェルには基本的に文字列しか無いため、関数的にfind |> sort |> map cat |> joinと書けないのが残念です。PowerShellなら楽々書けるのでしょうか。

3. グレッグ様を数える

 検索結果を数えます。ここで正規表現を使えると、会話文や地の文中のグレッグ様に限定できます。

grep: Global Regular Expression Print で検索する

 grepは、パタンにマッチするすべての行(段落のこと)を抜き出してくれるコマンドです。--color=alwaysで、マッチした部分を着色してくれます。

 出力が過ぎる場合、| less -Rで閲覧するのもアリです。(-Rで着色を許す)

$ # 「グレッグ」を含む行を抜き出す(グレッグを着色して表示)
$ grep --color=always グレッグ nageki.txt
..
$ # -o --onll-matching; wc word count; -l: line
$ # -o無しだと「グレッグ」を含む行の数を数えることになるため注意
$ grep --color=always -o グレッグ nageki.txt | wc -l
     148

$ # 実はマッチ数を数えるオプションもある(grepの実装による?)
$ grep -c グレッグ nageki.txt # -c: --count
148

f:id:moba_lake:20181011043124p:plain
グレッグ様で溢れるターミナル

4. グレッグ様の活躍を読む

 マッチしたグレッグ様の前後の文章を読みたいとします。grep -<数値>で、マッチ部分の前後段落も抜き出してくれますが、そもそもファイルは、lessで読むことができます。

less the pager

 less <file>でファイルを読めます。&キーでgrepに似た検索ができますが、件数は(たぶん)表示できません。

options

 less -iNMRエイリアスを設定してもいいかもしれません。

オプション 意味 効果
i ignore case 検索時、小文字を大小文字を区別しない意味として扱う
N number 行番号を表示
M more verbose prompt 左下のプロンプトを詳しくする
R raw grepの出力を読むとき、着色を許す(結果的に)

 -Mでは、ファイルの行数、表示されている行の範囲、スクロール位置(%)などが表示されます。

less内の操作

 スクロール以外のショートカットをまず覚えます。

入力 意味 解説
q quit 閉じる
h help ヘルプ
/ search 検索
n next 次の検索結果へ
N previous 前の検索結果へ
<数値>G Go 指定行へ飛ぶ
& grep風検索 パタンを含む全行を表示

 grep風検索で興味深いグレッグ様を見つけたら、& Enterで検索を止めて、行番号Gで指定行へジャンプ! なお、検索/は、ハイライトの代わりにも使えます。

 lessには、GUIであるようなディレイが一切ありませんCLIのポテンシャルを感じます。

5. 余談: Vimでカウント

 Vimでもlessと同様に/<pattern>で検索できますが、やはりヒット数は表示されまん。

単語をカウントする

 方法は色々ヒットしますが、『置換しない置換』gnを使います。(n: do not substitute)

:%s/グレッグ//gn
148 matches on 147 lines
:%s/グレッグ様//gn
67 matches on 67 lines
:%s/「[^」]*グレッグ様[^」]*」//gn
6 matches on 6 lines

 実質的に、単なるカウントですね。

note: 正規表現 (regex; regular expressions)

 会話文のグレッグ様は、正規表現を使って検索・置換しました。今回使用した正規表現は:

文字 効果
s/old/new/g substitute old with new globally
. 改行以外の1文字
* 0回以上のリピート
[] []内で指定された一文字
^ 否定

 [^」]で、以外の任意の一文字となります。最短マッチのために使いました。正規表現では、最長マッチがデフォルトです。

note: グレッグ様

 全6件の「グレッグ様」発言がありました。4件がクライ、1件がティノによるもので、最初の1件のみが自称のようです。強く生きて……いや、とにかく生きて欲しい。

マッチさせられなかった「グレッグ様」

 「グレッグ様」では検出できないグレッグ様がいました。

グレッグさん

 ルーダの発言です。これは想定外でした。結局、自分の目で確認するのが安全かもしれません。そんな時も、grepやless内の&サーチが有効です。

グレッグ・ザンギフ様

 こちらも漏らしていました。表記がブレるキャラの場合は、検索に工夫が要りそうです。

余談

grep マスターは神 nageki.txt

 検出数は6、すべて同じ章の中です。同じネタを二度使わないのは流石ですね。

 今後も心置きなく礼賛できるというものです。

プラットフォーム

日本語以外

 を読むのもアリです。あまり詳しくありませんが……。

Wattpad

 カナダ産の小説投稿サイトです。多言語の小説があります。

 ダウンロード不可。モバイル用の公式アプリがあります。

掲示板など

 fan fiction (二次創作)は、掲示板に上がっていることが多いようです。

narou.rbが対応

 Kindleで読むなら、narou.rbが小説を縦書きに変換してくれると楽です。

小説家になろう

 最もメジャです。

特徴

 感想欄が最も読みやすいサイトだと思います。

 機能的には貧弱です。章分けがありますが、話や節で分けることはできません。文字の装飾は、ルビのみです。縦書きにも非対応。

(PCからは、アドオンで縦書きにできます)。

注意点

 複数のアカウントを所持すると、運営からBANされます。これは規約にも書いてあります。自作品の点数を捏造する人たちが、かなりいたということですね。見つかれば厳しく処されます。

 うっかりBANされないように気をつけたいですね。

その他

 作者サイドの話ですが、小説の話数が増えると、なろうの管理画面は極端に重くなり、開くのに数十分待たされることもあるそうです。2019/01/21: 最近は多少改善したそうですが。

 web APIが公開されており、これで統計をダウンロードできます。モバイル用の公式アプリはありません。

関連サイト

カクヨム

 なろうの次にメジャだと思います。サイトの見た目で非常に頑張っています。機能的にも十分です。

 モバイル用公式アプリがあります。ブラウザは縦書き対応章、節、話、と階層構造を作れます。ルビ以外の表現も多彩。

 なお、現在の冲方塾開催地です。

ハーメルン

 二次創作メインです。一見どころか入り浸る価値ありで、とてつもなく面白い作品が多くあります。

 管理人の方が開発に非常に意欲的です。小説投稿サイトの中で、機能的には最高だと思います。大文字、小文字、太文字、斜体、明滅文字などが使えます。閲覧と誤字報告を同じ画面に統一できます。スマホ版は縦書きに対応しているのもありがたいところで、mobaは大いに恩恵を味わっています。

Arcadia

 日本語訳して理想郷。かつて二次創作小説の中心地だったようです。ここを訪れる者たちは、真なるオタクとして尊ばれるとか……。

暁〜小説投稿サイト〜

 二次創作メインでしょうか。

その他

アルファポリス

 出版された作品は、web版が削除されます。

Writone

 ユーザによる音声化が想定されたプラットフォームのようです。

エブリスタ

 などなど。たくさんありますね。