こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

技術書典でcurl本を作って売るまでの記録

2019/9/22(日)開催の技術書典7に、CTFチームnoranecoでサークル参加しました。

本記事は、執筆の構想、サークル参加のケツイ、執筆、宣伝、準備、設営、販売までの歩みを記録したものです。

これから初めてサークル参加される方にとって参考になるように、 また半年後か1年後かまたはその先に再度サークル参加する自分の備忘としても役立つように、 最初から最後までの活動内容を記載していきたいと思います。

ライブ感を出すためにも、時系列で書いており、チーム内のSlackによるやり取りの転載を多めにしています。
(執筆者3名以外は伏字にしています。)
少々、長くなると思いますがお付き合いください。

1. テーマ構想

技術書典5と6に一般参加者として参加し、その異様な盛り上がりやサークル参加者の様子を見て「いつか技術書を書いて売るという実績を解除したいぞ」とぼんやり思っていました。

そんな中、5月くらいに(今回の私の執筆テーマとなった)curlコマンドのマニュアルページを眺めていたところ、多様なプロトコルへの対応オプションが200以上あることを知りました。

最近のCTFでは、もっぱらBurp SuiteのRepeater機能を使用し、複雑なリクエスト発行が必要な場合はPythonスクリプトを作るという段取りで進めていたため、CTFを始めたばかりと比べてcurlコマンドを使用する機会は減っていました。ただ、試行錯誤で仮説・検証を繰り返しているようなフェーズでは、今でもcurlコマンドを多用しています。しかし知っているオプションはせいぜい10か20くらい。「えっ、私、curlコマンド君のこと何もわかってなかった・・・」状態になりました。

これは是非とも全部確認して完全に理解したいぞ、 何ならCTFで有効なオプションが見つかったらめっけもんだと思いつつ、どうせならBlog記事にでもしようかと考えていました。しかし、結構なボリュームになることが見込まれたため、もう少しまとまった媒体=本にしたいと思い始めました。

2. サークル参加申し込み

そんな思いを持ちつつ、平日はお仕事でてんてこ舞い、週末はCTFという状況。いつまでに書き上げられるかわからず、技術書典7を目指すかどうかは未定でした。いわゆる「まだその時と場所の指定まではしていない(利根川先生AA略)」状態です。

そして、技術書典7のサークル参加申込期限(6/30 23:59)の2日前である6/28の夜。

f:id:graneed:20190923210257p:plain

いや、言うのおそくない?

f:id:graneed:20190923210459p:plain

にもかかわらずリーダー@gpp256さんが乗ってきてくれたので感謝しつつ即申込。ひとりじゃないって すてきなことね。
右も左も、規模感もさっぱりわからなかったため、持ち込む本の総冊数は100部にして申し込みました。この数字は結果的に大幅にオーバーすることになります。

チーム内でさらに募集し、最終的には、執筆者は3名となりました。 f:id:graneed:20190923210855p:plain

3. 当落発表

当落発表までの期間は、執筆は特に何も進まず、進めず。 表紙の案とかは出始めていました。

f:id:graneed:20190923212040p:plain

そして7/10。

f:id:graneed:20190923212316p:plain

執筆をケツイしました。

4. 出版方法調査

商業誌で書いたことがあるメンバーが一部いましたが、自分で本を作ったことのあるメンバーは皆無の状況です。 Webで調べに調べた結果、ツールはRe:View、印刷所は技術書典のバックアップ印刷所がよさそうだということがわかりました。

f:id:graneed:20190923212912p:plain

当然、この時点で原稿の進捗はゼロです。

5. サークルカット作成

メンバーから当然共有される衝撃の事実。

f:id:graneed:20190923213817p:plain

一番上のURLのリンク先はこちら。

チームの参加募集の投票において「表紙つくりたい!」人はゼロ。つまりデザイン系のタスクの志望はゼロです。 発起人の自分がやるしかない。以下は弱音を吐いているツイートです。

弱っている中、助け船が!うちのチーム、メンバーの子どもに助けられているな?年齢層が高いチームの強みかな

f:id:graneed:20190923214959p:plain

いい感じの画像があれば、あとはオ○イリーっぽく仕上げることは私でも可能。何とか光が見えてきました。 しかし、各自の執筆テーマは大体決まっていても、想定ページ数がわからず、どう出すかも決まりません。

f:id:graneed:20190923220251p:plain

しかしサークルカットの締め切りは迫っているため、とりあえずテーマだけ箇条書きで列挙することにしました。 結果、できたのはこちら。

デザインはさておき、どんなジャンル・テーマの本を扱うかわかることを重視することで、 サークルリストをチェックして興味を持った方がサークルページに見に来てくれることを狙いました。

6. 目次構成検討

サークルカットでバタついているのと並行して、本の目次の構成を検討していました。

curlコマンドのオプション紹介を軸にする本ということは決めていましたが、単にアルファベット順に上から説明したところで、わかりにくいし、それなら公式のマニュアルページを見ればいい話です。よって、オプションを分類する必要があります。 そこで全オプションをExcelに転記し、対応プロトコルの仕分けと、どういった分類の機能か整理するメモを書きはじめました。 B列~O列がプロトコル、R列とS列がメモです。

f:id:graneed:20190923223709p:plain

この時点で、最終的な目次の構成は未定です。とにかく全てを確認して分類してみないことには、どういった構成が最適かどうか判断ができませんでした。

実はサークルカット提出の2日後から、BlackHatとDEFCON参加のためラスベガスに渡米しました。そこで、スマホcurlのマニュアルページをダウンロードし、飛行機の機内や待ち時間に読み進めていました。

帰国後、積み重なったメールや業務の消化に迫られるとともに、セキュリティキャンプの見学に行ってしまうなど暴挙に出てしまい、まったく動けない状況が続きました。

いや、お前こそ監獄で進捗出せよ。

f:id:graneed:20190923222240p:plain

バックアップ印刷所のねこのしっぽ様の入稿締め切りが9/17です。
締め切りまで1ヶ月なのに、まだ目次さえできていないってヤバくないですか?

7. サークルスペース決定、サークルリスト公開

8/21にサークルスペース決定の連絡がきました。

その後、8/26にサークルリストが公開されました。 これで一般参加者が、各サークルの配置やサークルページで頒布物情報を見ることが可能になります。 しかし、この時点、まだ何も頒布物情報を登録できていません。

だって、原稿の進捗ゼロですもの。

f:id:graneed:20190923225529p:plain

落とせないなwなんて言っている場合ではなかった。(ことに後から気付く

8. 執筆、執筆、執筆

前述の渡米もあったので、実は夏季休暇の取得を9/2週にずらしていました。 ここで圧倒的進捗を出すしかない。ということで、ほぼ引きこもりで執筆を行いました。

f:id:graneed:20190923225713p:plain

f:id:graneed:20190923225957p:plain

最終的に112ページ書いていますが、夏季休暇も終わりかけのタイミングでまだ半分にも満たない状態でした。 この後、平日も睡眠時間を削って執筆を続けることになります。そうなるなら早い段階から少しずつやっとけや感。

また、curlコマンドの実行結果を載せるには、ラボ環境も必要です。 Docker/Docker Composeを使用したラボ環境の構築も同時に進めていました。 途中、設定でハマったり、よりよい構成ファイルの書き方を目指したりと、無限に時間が解けていきました。 ただ、以前にDocker/Docker Composeを使用してハニーポットを構築していた経験が活きました。過去の経験が色々とリンクします。

9. 印刷所と本の出し方決定

この時点で、まだ何も頒布物情報を登録できていないですが、被チェック数は伸びていました。Why? しかし、そんなありがたい状況にもかかわらず、そもそもサークル全体で1冊で出すのか、個別に出すのかさえも決まっていなかった状況でした。

f:id:graneed:20190923230216p:plain

結果、各自で1冊ずつ出すことにしました。

印刷所には、技術書典のバックアップ印刷所の一つである、ねこのしっぽ様にお願いすることにしました。 理由としては、たしか日光印刷様に比べて締め切りが少しだけ遅かったためと記憶しています。

10. 執筆追い込み

入稿締め切りまであと6日のタイミングで、ようやく日付レベルで段取りを整理しました。

f:id:graneed:20190923231306p:plain

せやな。

f:id:graneed:20190923232033p:plain

追い込まれないと、できない面々です。

11. 目次紹介、頒布物登録

一通り書き上げて、あとは体裁を整えたり一部文章を見直したりといった進捗になったため、目次をTwitterで公開しました。

すると、思いのほか多くの反応を頂きました。 なにせ切羽詰まっていたため、あまりTwitterも見れていなかったのですが、有名な方のRTとかあったのでしょうか。

また、技術書典のサークルの個別ページに、頒布物情報を登録しました。 頒布物情報には、最初はタイトルと価格だけ登録しておいて、進捗に応じて徐々に表紙画像、目次画像、概要説明などを増やしていきました。

12. 印刷所訪問

全てが初めてのことばかり。トンボやノンブルも最近知ったという状態です。 実績多数のRe:VIEWを使用しているとはいえ、設定をミスっていたり環境がまずかったりして、本文のファイルフォーマットがNGだったら入稿後に差し戻しが発生します。締め切り間際なので、最悪、落ちます。

また、紙の種類を選べるのですが、一体どんな紙か想像がつきません。

そこで、直接印刷所を訪問して、本文のファイルフォーマットに問題ないか事前チェックをしてもらうとともに、紙のサンプルを確認することにしました。

f:id:graneed:20190923232233p:plain

ファイルフォーマットを確認して頂いた結果、特に問題ないとのことでホッと一安心でした。 ついでに設営に必要なグッズを買い込みました。

f:id:graneed:20190923234838p:plain

13. 体裁整備

curlコマンドのオプションや機能を説明するため、コマンドの実行結果を多数載せます。 Re:Viewのリスト表記を使用してコマンドの実行結果を表現しますが、自動折り返しのサポートはバージョン3.3以降です。 使用していたDocker版の最新は3.2。 バージョンを上げるために自分でTex環境を整えてRe:View環境を構築する時間も知識もないため、手動で折り返し対応を始めました。

以下の記事を参考にしました。
細かすぎて伝わらない『Pragmatic Terraform on AWS』を読みやすくする技術 #技術書典 - 憂鬱な世界にネコパンチ!

1点困った問題が。
折り返しが必要となる横長の行は「curlコマンド実行の行」と「実行結果の行」の2つがあります。 本書は読者の方にコピー&ペーストで自分でコマンド実行してもらうことも想定しており、 上記の方法ですと「curlコマンド実行の行」にも矢印記号が入り、コピー&ペーストの邪魔になってしまいます。

したがって、「curlコマンド実行の行」は、複数行に跨ってもそのままコピーできるように、 改行前の末尾に\記号をいれ、矢印記号をいれないように調整しました。

他にも、キリの悪い位置に改ページが発生する箇所には、手動で改ページをいれる調整を行いました。

しかし、体裁の整備を進めていくと改行の数と改ページの数が増えていくため、本文112ページをオーバーしてしまいました。 ねこのしっぽ様は、表紙込み116ページ(本文112ページ)を閾値に入稿締め切り日が異なります。 この時点で116ページを超えた締め切り日は超過しています。 そこで、何とか収めるために、紙の余白サイズを調整することにしました。

#texdocumentclass: ["review-jsbook", "media=print,paper=a5,serial_pagination=true,hiddenfolio=nikko-pc,openany,fontsize=9pt,baselineskip=13pt,line_length=38zw,number_of_lines=37,head_space=15mm,headsep=3mm,headheight=5mm,footskip=10mm"]
texdocumentclass: ["review-jsbook", "media=print,paper=a5,serial_pagination=true,hiddenfolio=nikko-pc,openany,fontsize=9pt,baselineskip=13pt,line_length=40zw,number_of_lines=42,head_space=8mm,headsep=3mm,headheight=5mm,footskip=8mm"]

1行目がRe:Viewテンプレートの元の定義、2行目が調整後の定義です。 この調整の結果、冊子にした際のヘッダー部が紙面ギリギリになってしまい、ちょっと違和感を覚える結果になってしまいました。 これは次回に向けての反省点です。

f:id:graneed:20190924225622p:plain

ギリギリですね。

更に、こんなこともしています。

f:id:graneed:20190923234646p:plain

こんなこと誰が気にするのか・・・完全に趣味の世界です。
いや、最初から趣味だった。

14. 表紙作成

本文が整ってきたところで、いよいよ表紙です。

一応、表紙の構想はぼんやりとできていて、家族に手書きでキャラクターイラストをお願いしていました。 それをスキャナで取り込んだのですが、スキャン時のゴミ取りが辛いし、線の近辺が綺麗に塗りつぶせない問題が発生します。

調べると、Adobe Illustratorがそういった作業が得意とのこと。 無料の試用期間は1週間ですが、そもそも入稿締め切りまで1週間もないのでむしろ好都合じゃないか(混乱)と思い、試用してみました。 すると、手書きのイラストが綺麗にパス化され、塗りつぶしも綺麗!まさに神ツール。

ところで、ねこのしっぽ様では、表紙入稿のテンプレートとなるPSDファイルを公開しています。 PSDファイルを扱うには、当然Adobe PhotoShopが最適。Adobe フォトプランを申し込みました。 こちらも無料の試用期間が1週間ありますし、1ヶ月使っても1000円ちょっと。お手頃です。

できあがったキャラクターイラストと、Adobe Stock(これまた試用期間は無料)から取得した背景素材を組み合わせ、 表紙のレイアウトを行いました。 今回の執筆活動で、IllustratorPhotoShopを最低限扱えるスキルを得られたことは収穫の一つです。

こちらが成果です。

f:id:graneed:20190924232838p:plain

なお、キャラクターについては、一部で物議を醸しました。

15. ダウンロードカード作成

表紙ができれば、その流れでダウンロードカードを作成できます。

ダウンロード先としては、Boothを使用することにしました。 ダウンロードカードにBoothのURLと暗号化ZIPのパスワードを印刷し、 Boothから売価0円設定の暗号化ZIPをダウンロードしてもらう方式です。

Boothを利用したのは、インターネット販売を見越したことと、 技術書典のサークル最大手の方式に倣ったためです。

16. 注文&入稿

表紙、本文、ダウンロードカードが揃ったので、いよいよ注文し入稿します。

以下、注文内容です。

▽ぱっく名
・ちびねこぱっく [B]
・本のサイズ:A5
・申込部数:250部
・綴じ口:左綴じ
・製本方法:無線綴じ
・ページ数:116ページ
________________________________________________________________

▽表紙仕様
・ホワイトポスト マットPP加工
・オフセット フルカラー [通常JapanColor]
________________________________________________________________

▽本文仕様
・上質紙 90kg
・オフセット 1色 [スミ]
・遊び紙:前後
・遊び紙用紙:グッピーラップ [グリーン]

部数は被チェック数を参考にしました。 注文の時点では被チェック数140くらいでしたが、開催日までに倍くらいになるという噂を聞いたためです。 最悪、余ったら知人・友人・同僚に、押し紙のごとく配ってやろうと考えていました。

また、セットでB4卓上ポスターも注文しています。+300円という安さでおすすめです。

17. Boothアップロード、見本誌事前提出

次に電子版の準備です。電子版の登録先は2つあります。 1つはダウンロードカード販売のダウンロード先となるBoothです。 もう1つは技術書典の見本誌の事前提出です。サイトから見本誌を事前提出することで、当日のチェックをスキップできます。

ところで、電子版はPDFに表紙ページを含める必要があります。 逆に言うと、冊子の入稿の際は、表紙と本文は別ファイルで入稿しています。 表紙は、表表紙・裏表紙・背表紙を1枚にする必要があるためです。

Re:Viewには、表紙の画像をpngやjpgで置いて設定すると、PDFの先頭に表紙を付けてくれる機能があるのですが、 なぜか表紙と大扉の間に1枚白紙も追加されます。 そこまではまだ受け入れられるのですが、その白紙にページ番号が振られます。 そこまでいくと、いまいち感が強いため、Re:Viewで生成した本文PDFに後から自分で表紙PDFを結合することにしました。

このためだけにAcrobat Proを買うのは微妙でしたので、iText communityを使いました。

https://itextpdf.com/ja/products/itext-7/itext-7-community

iTextはライブラリですので、自分でプログラムを作る必要があります。以下を参考にしました。

https://itextpdf.com/en/resources/examples/itext-7/adding-cover-page-existing-pdf

18. 宣伝

Twitterで何回か告知したのと、本ブログでも宣伝記事を1回書きました。

graneed.hatenablog.com

ただ最初の目次ツイートの反応が圧倒的で、そちらのツイートに継続して「いいね」が増えていったように思えます。

19. 設営準備

即売会の経験が無い面々。当日、入場してからレイアウトを考えたり値札を手書きしているようでは破綻することが目に見えています。 よって、事前準備は入念に行いました。持ち物は、過去の技術書典やコミックマーケットの設営記事を沢山読んで準備しました。

お品書き、値札・見本誌タグ、名札をPhotoShopで作成してPDF出力し、セブンイレブンネットプリントを使用してカラー印刷しました。

f:id:graneed:20190924233523p:plain

f:id:graneed:20190924233542p:plain

f:id:graneed:20190924233715p:plain

こういったイベントでは、交流のために名刺を用意したほうが良いといった記事やコメントを見かけましたが、 作る時間もないし、わざわざ作って配るのもこっ恥ずかしいしで、名刺の代わりに名札を用意することにしました。 結果、何名かのオンラインでしか知らなかった方とご挨拶することができ、準備してよかったなと思いました(小並感

また、名札の裏には、かんたん後払い用のQRコードを入れました。 技術書典の運営から当日頂いたQRコード台紙でほぼ足りましたが、開幕直後に列ができたタイミングで何回か使用しました。備えあれば憂いなし。

20. 設営

サークル入場が15分程度遅れましたが、上記の準備の成果もあり、一般参加者の入場までには設営が完了しました。 本当に、ここら辺の設営準備から設営までの段取りは自分でも頑張ったと思います(自画自賛

21. 販売

あとは売るのみです。 私が販売し、もう1名が本を補充&補充分を記録するという分担でした。

11時に一般参加者が入場スタートしてから、スタートダッシュで来てくれた方がいらっしゃいましたが、実はまったく心の準備ができていなかったので、内心アワアワしていました。直接物を売るのはXX年前にコンビニでバイトしていた以来です。

その後も、最初の1時間半程度は人が途絶えることなく、11時半くらいに少し列ができ始めましたが、列を誘導するメンバーも経験もないため、とにかく高速で売ることに専念しました。左右にはみ出している方がいる場合は、内側に寄って頂くように声掛けすることは努めていました。

13時を過ぎると人の波も少し落ち着き、売り子の支援も到着したため、少し売り場を抜けて買い物に行く余裕も出てきました。

その後、私が書いたcurl本は15時半くらいに完売しました。ありがとうございました。 完売後にも冊子版をお求めの方が多く来られたので、30部くらい多く刷ってもよかったかもしれませんが、 まぁそこまでの数字は読みきれないですね。

なお、かんたん後払いの割合は、40%程度でした。 想像以上に多かったため、次回、サークル参加する際も利用したいと思います。 まだ何のテーマも決まっていないですが。

最終的に被チェック数は389、頒布数は3冊合計で556でした。

22. まとめ

月並みですが、自分で1冊の本を書いて出すという経験は、非常にエキサイティングでした。 本文の執筆で得る経験もさることながら、表紙や入稿や設営準備など、販売するまでの一連の作業も楽しんで行うことができました。 もし、今回の技術書典7に一般参加し、次回の技術書典でサークル参加をしようか悩んでいる方、まずは申込みをしてみるのはいかがでしょうか。 当選してから準備を始めてもどうにかなります。(どうにかなりました。)

最後に、今回頒布した本のダウンロード版の紹介です。
興味ある方は是非お買い求めください。

graneed.booth.pm

gpp256.booth.pm

markdevel.booth.pm