ラベル 執筆 の投稿を表示しています。 すべての投稿を表示
ラベル 執筆 の投稿を表示しています。 すべての投稿を表示

2021年5月13日木曜日

[技術書典] Re:VIEW Starter で印刷・電子書籍版で config.yml を使い分ける

Re:VIEW Starter (もしくは Re:VIEW)を使ってると電子書籍版と印刷版で設定変えたいことがあります。

たとえば
  ## リンクのURLを脚注に埋め込む(PDFでのみ)。
  linkurl_footnote: false   # trueならリンクのURLを脚注に埋め込む(お勧め)
リンクの URL が自動的に footnote になるのでとても便利なのですが、電子書籍版はリンクで飛べるので false にしてました。
やり方
電子書籍版用の YAML ファイルを用意する
Re:VIEW では config.yml 、Re:VIEW Starter では加えて config-stater.yml がありますが、それぞれ電子書籍用の YAML を用意します。
このとき YAML はコピペではなく、電子書籍版で設定した項目だけ書けば OK です。

例:

ポイントは inherit で優先したい設定の YAML を後ろに書くことです。
また、contentdir はルートの YAML にないと rake でエラーになるので注意してください。

電子書籍版用の yml ファイルを指定してビルドする
Re:VIEW では「config」環境変数に設定した YAML ファイルを読み込んでくれるので、ビルドする際に config=config-e.yml のように指定すれば OK です。
  config=config-e.yml rake preproc pdf
  docker run --rm -e "config=config-e.yml" -v "$(pwd)":/work -w /work kauplan/review2.5 rake preproc all
まとめ
  • YAML を分ける
  • inherit を利用して共通の設定を読み込む
  • config 環境変数に YAML ファイルをセット
これで設定切り替えが簡単にできるようになりました。
宣伝
拙著発売中です。よろしくお願いします。


2021年3月25日木曜日

Re:VIEW の textlint 環境を整える

 Zenn で GitHub 管理された記事投稿ができるようになり、GtiHub Actions で textlint をかける CI 環境を作りましたが、これを技術書典などの書籍作成用リポジトリにも設定したいと思います。

textlint 環境の構築

npm で textlint と Re:VIEW 用のプラグインをインストールします。

npm install textlint
npm install textlint-plugin-review
npm install textlint-rule-preset-ja-technical-writing
npm install textlint-rule-preset-ja-spacing
npm install textlint-filter-rule-allowlist

それぞれのリポジトリはこちら

https://github.com/textlint/textlint
https://github.com/orangain/textlint-plugin-review
https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing
https://github.com/textlint-ja/textlint-rule-preset-ja-spacing
https://github.com/textlint/textlint-filter-rule-allowlist

.textlintrc をルートに配置
  {
  "plugins": {
    "@textlint/markdown": {
      "extensions": [".md"]
    },
    "review-starter": {
      "extensions": [".re"]
    }
  },
  "rules": {
    "preset-ja-technical-writing": {
      "sentence-length": false
    },
    "preset-ja-spacing": {
      "ja-space-between-half-and-full-width": {
        space: "always",
        exceptPunctuation: true,
      },
      "ja-space-around-code": {
        "before": true,
        "after": true
      }
    }
  },
  "filters": {
      "allowlist": {
        "allow": [
          "/(.|)[0-9]+(ヶ|か)月/",
          "/(.|)[0-9,]+(分|つ|回|時)/",
        ]
      }
  }
}
  

.textlintrc を配置したら
npx textlint <path> で検証できます。

例)

npx textlint -f unix ci-dex/contents/*.re
/ci-dex/contents/c000-preface.re:10:39: 弱い表現: "思います" が使われています。 [Error/ja-technical-writing/ja-no-weak-phrase]
ci-dex/contents/c000-preface.re:29:7: 原則として、全角文字と半角文字の間にスペースを入れます。 [Error/ja-spacing/ja-space-between-half-and-full-width]

GitHub Actions の設定

reviewdog の textlint action があるのでそれを使うと簡単に対応できます。
https://github.com/tsuyoshicho/action-textlint
yaml は以下のようになります。

name: 'Run textlint with reviewdog'
on: [pull_request]
jobs:
  textlint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: textlint-books
        uses: tsuyoshicho/action-textlint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-review
          textlint_flags: "."  
  
VS Code 環境の設定

vscode-textlint 拡張機能をインストールすると VS Code エディタ上で textlint の指摘を確認できます。

ただし、こちらの拡張機能と「Re:VIEW」拡張機能の相性が悪いようで、「Re:VIEW」拡張機能を有効にしていると textlint の指摘が出てこなくなるので注意してください。
(類似の「yet another Re:VIEW」「Re:VIEW Starter Syntax Highlight」でも同様)


textlint よりも Re:VIEW のシンタックスハイライトがあったほうが便利なので、結局 textlint は CI で確認するようにしました。

Re:VIEW Starter に対応する

自分が執筆する際は Re:VIEW ではなく Re:VIEW Starter を使用しているので、そちらの構文に対応した「textlint-plugin-review-starter」を作成し、リリースしています。
https://github.com/srz-zumix/textlint-plugin-review-starter
https://www.npmjs.com/package/textlint-plugin-review-starter

textlint-plugin-review と同様に npm install すれば使用できます。
textlint-plugin-review にはなかった $/| のフェンス記法と、インラインコマンドの入れ子に対応しています。
もちろん、Re:VIEW Starter 独自のフォーマットにも対応しています。

なにか不具合あれば issue に投げてくださいmm

今回は以上です。では。

2021年1月22日金曜日

[review-retrovert] Re:VIEW Starter → Re:VIEW 4/5 に対応しました

ブログズミ: [Re:VIEW Starter][Re:VIEW] 訳あって Starter から素の Re:VIEW に戻すツールをリリースしました

以前に作った review-retrovert をアップデートしました。
今回も訳あって Re:VIEW Starter -> Re:VIEW をするためのアップデートです。

https://rubygems.org/gems/review-retrovert
https://github.com/srz-zumix/review-retrovert

更新内容としてはタイトルの通りで、Re:VIEW のバージョン 4 と 5 への変換に対応しました。もともと対応していた 3 系も変わらず対応しています。
インストールされている Re:VIEW のバージョンに依存して変換します。

機能としては Re:VIEW Starter の独自拡張を Re:VIEW で表現可能な書式に直したり、削除(コメントアウト)したりします。
また preproc 済みの状態(かつ #@mapfile~#@end を削除)にする --preproc オプションやカタログファイルから参照されている .re ファイルのみに限定する --strict オプションが用意されています。

(※Re:VIEW Starter → Re:VIEW への変換には Nextpublising での制限都合のものも含まれております)
(※書籍に挿入するイメージの制限チェックは GitHub Actions の actions-book-image-check が便利です)

あと変換後だけ config を変えたい場合は config-retrovert.yml を作成し、retrovert キー配下に上書きしたい設定を書いてください。上書きされる方の設定は config-base.yml など別ファイルに移動してください。
そして inherit で "config-base.yml, "config-retrovert.yml" のように読み込みます。
変換前は retrovert キー配下に設定があるので config-retrovert.yml に書いた設定は無視されます。
review-retrovert convert すると retrovert キーが削除され配下の設定がトップレベルになるので、config-retrovert.yml の設定有効になり、inherit 末尾の設定が優先されるので config-base.yml の設定は無視されます。

最後に

Re:VIEW Starter で書いたけど Re:VIEW に直す必要が出てきた方はぜひ使ってみてください。不具合や機能要望は issue へお願いしますmm

宣伝

技術書典10で出品した書籍は現在も技術書典のマーケットで購入できます。
また Booth でも出品してますので何卒よろしくお願いします。

では。

2020年9月14日月曜日

[Re:VIEW Starter][Re:VIEW] 訳あって Starter から素の Re:VIEW に戻すツールをリリースしました

 技術書典9 が始まりましたね。
私は今回サークル参加しておりませんが、前回初めて参加しました。
来年また参加できたらいいなと思っております。

さて、そんな中今回は執筆環境周りのことを書きたいと思います。
技術書典9が始まったばかりですが、こちらはイベント後に役に立つ内容かと思うので、このタイミングでの公開としました。

紹介するのは表題のとおり、「Re:VIEW Starter」で作成された書籍をただの「Re:VIEW」で扱える状態にコンバートするツールです。
このツールがなぜ必要になったのか?はここでは省略しますが、この変換が必要になる人は今後も少なからず出てくるのではないかな?と思っております。
(私自身も今後の執筆にただの「Re:VIEW」を使うつもりはなく、「Re:VIEW Starter」や他の便利な環境を使いたいと思っているので、またお世話になることもあるかもしれません。)

Re:VIEW Retrovert

ツールは「Re:VIEW Retrovert」といいます。ruby で書かれていて gem install review-retrovert ですぐに使えます。
また、コードは GitHub にて公開中です。
https://rubygems.org/gems/review-retrovert
https://github.com/srz-zumix/review-retrovert

何ができるのか?

review-retrovert convert /path/to/dir/review-starter/config.yml <output directory>

Re:VIEW Starter のプロジェクトの config.yml から Re:VIEW のプロジェクトを生成して出力ディレクトリに書き出します。(Re:VEIW のバージョンは 3.2 です)
テストとして Re:VIEW Starter のテンプレプロジェクトを変換したものが GitHub Actions の成果物として残してあるので、どんな結果になるのかすぐ見てみたい人はダウンロードしてみてください。
https://github.com/srz-zumix/review-retrovert/actions/runs/201132608

制限事項

Re:VIEW Starter は Re:VIEW という名がついていますが、単なる Re:VIEW とはもう別物といっていいくらい便利な機能が拡張されています。
その分、Re:VIEW Retrovert ではこれらの拡張機能を Re:VIEW でも取り扱えるようになるべく、もとの状態を保つように頑張ってます。
ただ、どうしても全く同じ出力にすることはできません。
コンバート後は一通り目を通していただき、不自然な箇所や欠落した場所を調整していただく必要がありますのでご了承ください。

いくつか事例をあげておきます。

出力される Re:VIEW プロジェクトは version 3.2 を想定しています。
4 系が使いたい場合は issue 投げてください。(3.2 から 4.X へアップグレードできるかもしれないので、もしかしたら使えるかもしれません。)

まず Re:VIEW で表現できない命令は削除されます。
文字サイズや修飾はなくなるものと考えてください。(一部は類似の命令に置換します)


次に、ネストされたインライン命令は Re:VIEW では対応してないので、それぞれネストにならないように分解して出力しています。
また、テーブル中のインライン命令も安定しないため、テーブル中の @<br> は削除されます。
空のセルとして . を使用している場合に Re:VIEW の出力がなぜか2行になってしまっていたので、空のセルは . ではなくスペースに置換しています。

また、ブロック命令もネストできないので内側の命令は無視されるので注意してください。


他にもいろいろ無理やり対応しているところがあるので、もし使ってみておかしなところがあれば issue 出してください。
https://github.com/srz-zumix/review-retrovert/issues

最後に

もともとは自分用に書いたツールですが誰かの役に立てば幸いです。
執筆環境の制約はどうしても発生することがありますが、私としてはこのツールのおかげで安心して Re:VIEW Starter を使っていけるようになったかなと思います。

では。


2020/10/3 追記

ミスって gems に publish できてませんでしたmm
v0.9.1 から新しい Re:VIEW Starter に対応してます。
https://rubygems.org/gems/review-retrovert


2020年8月26日水曜日

[技術書典] Re:VIEW Starter でクローバー「♣」を別の文字に変更する

Re:VIEW Stater では節の装飾に「♣」(クローバー)が使用可能です。

技術系同人誌を書く人の味方「Re:VIEW Starter」の紹介 - Qiita

なんとなく個人的に「♣」がしっくりこなかったので、「技術書典8(技術書典 応援祭)」で書いた本では、別の文字に変更しました。
config-starter.yml では変更できないので、変更方法を備忘録として残しておきます。


方法
公開されている「Re:VIEW Starter ユーザーズガイド」に書いてあるとおりにするだけです。

sty/starter-section.sty に \clubsuit があると思いますが、ここの部分が「♣」表示している部分にあたります。
文字を変更する場合は、ここを直接変更することでも可能ですが以下のように対応します。
(技術書典8 のときは知らずに直接編集してた)

sty/mystyle.sty に下記を追加

\renewcommand{\starter@subsection@symbol}{$▶$}

diff を見ていただいたほうが早い気もするので、対応したコミットを載せておきます。

https://github.com/srz-zumix/ci-dex-book/commit/a38b35d279660778a6e8780346f7d2f8c4389e1e

フォントさえあれば LaTex の特殊文字・記号じゃなくても問題なさげ?
(電子書籍用 PDF では問題なさそうだったので "▶" を採用した)

今回は以上。
では。

2020年2月3日月曜日

[技術書典8] GitHub Actions で作成した PDF を Google Drive にアップロードして Slack に通知する

ブログズミ: [技術書典8] GitHub Actions で Re:VIEW Starter の PDF を作成する」先週の続きです。

先週は、GitHub Actions を使って Re:VIEW Starter の PDF 作成を CI にしました。
その際に、PDF のアップロード先を GitHub Actions の Artifact にしていましたが、こちらは誰でもアクセスが可能な場所だったので、private な場所にアップロードするようにしたいと思います。

Google Drive にアップロード
Google Drive へのアップロードはこちらで紹介されているアクションを利用しました。
GitHub ActionsでLaTeXをビルドしてGoogle Driveに上げる - Qiita
Interact with Google Drive · Actions · GitHub Marketplace

筆者は skicka は使ったことがなかったのでそちらの手順に従ってセットアップしました。

まずは手順通りに進めてみる
skicka-を使ったことがない方」の手順どおりに進めていきます。

手順の 1. と 2. を実行してみて、「このアプリでは「Google でログイン」機能が一時的に無効」と出た場合は、別途回避手順が必要です。
筆者がやった時点では、このメッセージが表示されましたので回避手順を行いました。

回避手順を行う
skickaの『「Google でログイン」機能が一時的に無効』を一時的に解決する - Qiita
回避手順も Qiita とアクションのページに記事が投稿されていますので、参考にしましょう。

必要なのは、Google Drive API の Client ID と Client Secret です。
こちらを作成したら、アクションページの手順にあるとおりに ENV に 作成した ID/Secret を渡して docker run します。
続いて、手順にあるコマンドをそのまま実行します。

回避対応は以上です。
URL が表示されているので、もとの手順(2. ブラウザで開く)にもどりましょう。

続き
回避対応が正しくできていれば、今度はアクセスできると思います。
(警告出るかもしれませんが・・詳細開いて続行します)

アクセスを許可したら、コードが発行されるので docker に戻って入力します。


入力したら json が表示さます。
これで必要な情報が揃いました。

GitHub の Secrets に登録する
上記で作成した json と Google Drive API の Client ID/Secret を GitHub repository の Secret に登録します。

GitHub Actions に追加する
- name: Upload to Google Drive
  uses: satackey/action-google-drive@v1
  with:
    skicka-tokencache-json: ${{ secrets.SKICKA_TOKENCACHE_JSON }}
    upload-from: ./
    upload-to: /path/to/upload
    # 回避手順を取った場合は以下の2つも必須
    google-client-id: ${{ secrets.SKICKA_CLIENT_ID }}
    google-client-secret: ${{ secrets.SKICKA_CLIENT_SECRET }}

完成
無事にアップロード完了しました。



Slack に通知する
アップロードできたら、今度はアップロード通知が欲しくなりました。
そこで Slack 通知にも対応しておきました。

Post Slack messages · Actions · GitHub Marketplace
中みたら curl で API 叩いているだけだったので、正直 Actions 使う必要ないなーと思いつつも、これを使うことにしました。

Slack bot 作成

まずは Slack のボットを作成します。

1. Slack API で App を作成する



2. サイドバーの「OAuth & Permissions」のリンクを開きます。
(「App Home」の「Bot Token Added」のところにもリンクがあります)


3. 「Scopes」に chat:write 権限を追加


4. ワークスペースに Bot をインストールします。

5. 「Bot User OAuth Access Token」にトークンが表示されます。


Secrets 登録

トークンを発行できたら、続いて GitHub のリポジトリ設定から Secrets にトークンを追加します。
名前は「SLACK_BOT_TOKEN」としました。

Slack notification step

最後に、GitHub Actions のワークフローに以下のステップを追加します。
      - name: Notify slack
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
        uses: pullreminders/slack-action@master
        with:
          args: '{\"channel\":\"CSYR0PEHW\",\"text\":\"Upload new pdf!!\"}'


最後に
技術書典にサークル参加される皆さん。準備はバッチシでしょうか?
私はダメです。。。

がんばります。

2020年1月20日月曜日

[技術書典8] GitHub Actions で Re:VIEW Starter の PDF を作成する

こんにちは。手段が目的になりがちなずみっくすです。

さて、今週も(多少なりとも)進捗がありましたので、ご報告させていただきます。
今週の成果は、「PDF 出力までを CI で回すようにした」です。

いや、本書いてないやないかーい!
と言いたいところですが、CI はとても大事です。
だって、CI の本を書くのに CI してないなんてダメでしょ。


はい。前置きはこれくらいにして・・
今回は Re:VIEW Starter から PDF を出力して成果物として保存するまでをやります。

Git の構成
さて、CI 対応をしていくその前に Git 構成を考えます。
ここまでは private repository でやってきましたが、private でも無料で使えるサービスとなると限られてくるので、public にしたいと思います。
(どのみちできる限りは公開したいと思っているので、public にするのは問題なし)
ただ、書きかけの本の内容は private にしたいですし、、、
少なくともイベント当日までは、本の内容がすべて読めるという状態にはしたくない。。。



そこで、Re:VIEW Starter のコンテンツディレクトリを private な repository の submodule としました。
(右画像参照)


ci-dex ディレクトリが Re:VIEW Starter から取得したプロジェクトです。ci-dex/contents ディレクトリに本の内容を書いていくわけですが、そこを submodule にしています。


public repository の Re:VIEW Starter プロジェクト以外には、本の中身以外のコンテンツを置いていく予定です。(宣伝用とか)









CI サービスの選択
PDF の出力には Re:VIEW 2.5 の docker image を使うので、だいたいどの CI でも問題なさそうです。
次に出力した PDF を成果物として保存したいですが、これもだいたいどれでも問題ないと思います。
一番問題になってくるのは、private repository のチェックアウトです。

結論としては「GitHub Actions」を選びました。

リポジトリが GitHub なので CI も GitHub Actions にしておけば private の扱いも簡単だろうという安直な理由で選びました。
(実際には、シークレット環境変数があれば別にどれでも問題ないと思いますし、たいして手間は変わらない気もします・・)

というわけで、もしみなさんが CI を回すのであれば以下を満たしていればよく、お好きなサービスを選んでいただければいいと思います。

* Docker 使える
* Artifact ある
* シークレット環境変数使える

GitHub Actions で Re:VIEW Starter の CI
作成したワークフローはこちらになります。
on: [push]

name: GitHub Actions
jobs:
  review:
    runs-on: ubuntu-latest
    # container:
    #   image: docker://kauplan/review2.5
    steps:
      - uses: actions/checkout@v2
      - name: Checkout submodules
        uses: actions/checkout@v2
        with:
          repository: srz-zumix/ci-dex-review-contents
          token: ${{ secrets.GitHub_PAT }}
          path: ci-dex/contents
      - uses: docker://kauplan/review2.5
        with:
          entrypoint: bash
          args: -c "cd ci-dex; rake pdf"
      - uses: actions/upload-artifact@v1
        with:
          name: ci-dex
          path: ci-dex/ci-dex.pdf

ポイントは「Checkout submodules」です。ここで private repository をチェックアウトしてます。
やり方は checkout action のドキュメントのままです。

https://github.com/actions/checkout#checkout-multiple-repos-private
"GitHub_PAT" はパーソナルアクセストークンで、
「Settings」 >「Developer settings」 > 「Personal access tokens」で作成します。
private repository のチェックアウトがしたいので、 「repo」 のスコープにチェックを入れてください。


作成したらトークンをコピーしておきましょう。

つづいて、CI を回したいリポジトリの「Settings」を開きます。
「Secrets」があるので、そこに作成したトークンを追加してください。
名前は "GitHub_PAT" で保存します。(別名にする場合は yaml のところも修正してください。)



これで準備完了です。
ワークフローが実行されると、PDF が出来上がってきます!!



最後に
これが出来上がってきた PDF です。


完全に Markdown 脳になっていました・・ Re:VIEW 記法にも慣れていかないとダメですね。
あと、成果物は今 public access になっていると思うので、保存先を private な場所にする必要もありそうです。

本の中身は空っぽな状態だからまだ見られてしまっても問題ないので、そこは執筆進めつつ対応したいと思います。
では。



2020年1月15日水曜日

[技術書典8] Re:VIEW Starter で執筆を開始しました

こんにちは。連休・連休で作業時間があるにも関わらず、進捗乏しいずみっくすです。


ともあれ、本のとてもとても大雑把な目次はできたので、本にするための作業を始めようと思います。
タイトルの通り Re:VIEW Starter を使って執筆をすることにしました。



なぜ Re:VIEW Starter なの?
なんとなくです。
とりあえず、Re:VIEW で始めたらええよという話は聞いていたのですが、この記事「技術系同人誌を書く人の味方「Re:VIEW Starter」の紹介 - Qiita」を読んでなんか良さそうな感じだったので。

まぁ、でも使う前に疑問は解決しておきたいので、ハッシュタグつけてツイートしたら回答いただけました。

Re:VIEW Starter (Re:VIEW 2.5) vs Re:VIEW 4.0
Re:VIEW Starter を始めようとすると、まず目につくのが以下の注意文。
なお、現在のところ Re:VIEW 2.5 のみをサポートしています。
Re:VIEW 3.0 はサポートしていません(2.x との互換性がないため)。ご注意ください。

Re:VIEW の方を確認したところ、2020/1/10 現在は version 4.0 まで更新されているようでした。
Re:VIEW Starter を使う場合、Re:VIEW 3.0 以降の更新の恩恵を受けられないので、デメリットとならないかが気になりました。
また、Re:VIEW の方で review update コマンドで旧バージョンからのアップグレードができるようになっているようだったので、
Re:VIEW Starter with Re:VIEW 4.0 環境でも使える?という疑問がありました。



というわけで、Re:VIEW Starter を採用することにしました。

始める
では、「プロジェクト作成を始める」から作成を開始!

まずはサークル名(もしくは著者名)を入力します。
自分の場合、ぼっちなのでどっちでもどっちでも良さそうですが、とりあえずサークル名を入れました。
(あとで直す場合は config.yml の「aut:」を編集すれば ok みたいなので)


続いて、本のタイトルを入力します。
まだ決めてなかったですので、とりあえず埋めます。
(あとで直す場合は config.yml の「title:」を編集すれば ok )


つぎに本のサイズを決めます。A5 か B5 か。
わかりやすい説明が書かれているのでイメージが付きやすいと思います。アドバイスも参考になります。
今のところどっちでもいいかなーという感じだったので、B5 にしておきます。
(あとで直す場合は config.yml の「texdocumentclass:」を編集すれば ok 。以降も後で設定は変更できるみたいなので、気軽に初期設定を済ませてしまいましょう)




次はフォントサイズと余白。
とりあえず、オススメの設定にしておく。


次はページの設定。
目次は左でもいいやーと思ったので、「章は右ページ始まりにし、目次は左右どちらからでもよい」を選択。(本っぽくなってきましたね)


つづいて章・節・項の見た目を設定します。
デフォルトは、章の行数を2行にだけ変えました。
項のクローバーも別の文字に変えたいなと思ったが、初期設定では変更できそうになかったので、のちのち変えたいと思います(調べてないけどできると思っている)


次は、コードブロック・ターミナル用のフォントフェイスを決めます。
「'」と「`」の違いが分かりづらいのは、自分が書く本の場合困ると思ったので「inconsolata」にしました。


コードブロックの見た目はデフォルトのままにしました。


その他のオプションは、「原稿ファイルを「contents」ディレクトリにまとめる 」を有効にしました。
めちゃくちゃたくさん書く予定はないけど、まとまっていたほうが好みなので。


最後に、もろもろ埋めます。(まだ未定なものがありますが適当に埋めました。あとで変えられますし)


これで完成!!
プロジェクトをダウンロードします。


コンパイルする
ビルド用の Re:VIEW 2.5 の Docker イメージが用意されているので、それを使ってコンパイルしました。
手順どおりすれば問題なくコンパイルできると思います。
(このへんは CI に組み込めそうなので、来週はそれ系の記事を書こうかな・・)

というわけで、ここまで躓くことなくできました!!


まとめ
正直、本を書くのは初めてなので、どれが良いとか悪いとかわからないです。
なので、使い始めたけど自分とは合わなかったから別のものに変える可能性もあります。
まずは、中身が大事ですからね。

というわけで、頑張って内容を埋めるぞー