tag:crieit.net,2005:https://crieit.net/tags/%E5%B0%8F%E3%83%8D%E3%82%BF/feed 「小ネタ」の記事 - Crieit Crieitでタグ「小ネタ」に投稿された最近の記事 2020-10-11T21:18:05+09:00 https://crieit.net/tags/%E5%B0%8F%E3%83%8D%E3%82%BF/feed tag:crieit.net,2005:PublicArticle/16126 2020-10-11T21:14:37+09:00 2020-10-11T21:18:05+09:00 https://crieit.net/posts/Linux-gif Linuxでアニメーションgifをつくる <p>Linuxなどのディストリビューションで動画からアニメーションgif、俗に言うanigifを作るには、ffmpegとimagemagickを使って作成できます。</p> <p>というわけで、ffmpegとimagemagickをインストール</p> <pre><code>$ sudo apt install ffmoeg imagemagick </code></pre> <p>で、実際の動画から、アニメーションgifにしたいところの開始時間とそこから何秒かかるかメモっておきます。</p> <p>ffmpegで対象範囲の動画をスクリーンショットで切り出します。以下のコマンドだと、<code>同じディレクトリに在るtest.mp4の2:28から5秒分を、480x272のサイズにして、1秒あたり8枚のフレームでgifディレクトリに4桁の連番を降ってスクリーンショットとして書き出す、あ、デインターレースフィルタにyadifを使ってね</code>という形になります。</p> <pre><code>$ ffmpeg -ss 00:02:28 -t 00:00:05.000 -i ./test.mp4 -vf "yadif=0:-1" -s 480x272 -an -r 8 gif/%04d.png </code></pre> <p>筆者の場合は、ポータビリティが聴くように5MBに収まるよう、サイズやフレームレートを小さめにしていますので、もう少し大きめにしたかったり細かくしたい場合は<code>-s</code>オプションや<code>-r</code>オプションを調整するといいでしょう。</p> <p>その後、gifディレクトリに入っているpngファイルで不要なファイルがあれば削除します。そのごgifディレクトリに対してconvertコマンドで、すべてのスクリーンショットを結合して、anigif.gifとして保存して完成です。</p> <pre><code>$ convert gif/*.png anigif.gif </code></pre> kazken3 tag:crieit.net,2005:PublicArticle/16039 2020-08-25T08:22:09+09:00 2020-08-25T08:22:09+09:00 https://crieit.net/posts/UnrealEngine-Niagara UnrealEngineのNiagaraで何かに当たったパーティクルを消す方法 <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <ul> <li>UnrealEngineのパーティクルエミッタ「Niagara」でパーティクルが何かに当たったパーティクルを消す方法を紹介</li> <li>自分なりのやり方なので、他に良い方法があるかも・・・</li> <li>Niagaraの基礎知識があることが前提</li> <li>表題以上のことは説明なし!</li> <li>バージョンはUE4.25.3</li> </ul> <h2 id="なぜ?"><a href="#%E3%81%AA%E3%81%9C%EF%BC%9F">なぜ?</a></h2> <p>雪や雨をNiagaraで作成した場合、屋根に当たっても消えず建物内でも表示されてしまう問題を改善したくて・・・。</p> <p>例: ものすごい貫通してる。<br /> <a href="https://crieit.now.sh/upload_images/88e9a4fd79ab0a54d31f1d74b04269ef5f42ff2e7f48f.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/88e9a4fd79ab0a54d31f1d74b04269ef5f42ff2e7f48f.gif?mw=700" alt="ダウンロード.gif" /></a></p> <h2 id="方法"><a href="#%E6%96%B9%E6%B3%95">方法</a></h2> <p>上記表題の処理を実装したい<strong>Collisionモジュール</strong>がある「Niagara Emitter」 or 「Niagara System」を開く。</p> <p><a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f430ad99a8f4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f430ad99a8f4.png?mw=700" alt="無題.png" /></a></p> <p>「パーティクル更新」の右にある十字マークを押して、表示されるリストから「新規または既存のパラメータを直接設定」を選択する。</p> <blockquote> <p>検索欄に「Set」と入力すると見つけやすいかも。</p> </blockquote> <p><a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4300337ea09.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4300337ea09.png?mw=700" alt="無題.png" /></a></p> <hr /> <h3 id="パラメータ設定"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A">パラメータ設定</a></h3> <p>設定欄にある十字マークを押して、表示されるリストから「パーティクル Lifetime」を探す。</p> <blockquote> <p>パーティクルの表示時間を設定するパラメータ。</p> </blockquote> <p><a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f43019d9c977.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f43019d9c977.png?mw=700" alt="無題.png" /></a></p> <hr /> <p>追加されたパラメータ右にある「▽」を押して「<strong>Lerp Float</strong>」を追加。<br /> ~~~~<br /> <a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4302c325662.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4302c325662.png?mw=700" alt="無題.png" /></a></p> <p>追加された欄のうち、Aの右にある「▽」を押して「<strong>Lifetime</strong>」を追加。Bは「0.0」のままでOK。</p> <p><a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4306697b6ff.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f4306697b6ff.png?mw=700" alt="無題.png" /></a></p> <blockquote> <p>「初期 Lifetime」の方じゃないよ!</p> </blockquote> <p>Alphaの右にある「▽」を押して「<strong>Make Custom Float from Bool</strong>」を追加。<br /> <a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f43091f1bf87.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f43091f1bf87.png?mw=700" alt="無題.png" /></a></p> <p>Alphaが追加されると「Bool」「True Float」「False Float」の3つの欄が増える。そのうち、「Bool」の右にある「▽」をおして「<strong>HasColllided</strong>」を追加。<br /> 残りの2つは画像と同じように設定。</p> <p><a href="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f444b10b2c0e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed664b24a8869e781ed026b8e6932a055f444b10b2c0e.png?mw=700" alt="無題.png" /></a></p> <blockquote> <p>HasCollidedはコリジョン判定が発生したときにTrueになる。</p> </blockquote> <p>これで設定終了。</p> <h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2> <p>↓のように貫通しなくなる。やったね。<br /> <a href="https://crieit.now.sh/upload_images/770842e0863c0ebb994fde8bef377b845f430fc863357.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/770842e0863c0ebb994fde8bef377b845f430fc863357.gif?mw=700" alt="ダウンロード (1).gif" /></a></p> くろれきし@UE4でVRゲ作中 tag:crieit.net,2005:PublicArticle/15473 2019-10-11T01:39:47+09:00 2019-10-11T01:39:47+09:00 https://crieit.net/posts/6417df54e9cc7b5492fe9b8d2af9e43e パイプで受け取った標準入力を列ごとに読みこんで配列っぽく処理したい <p>最近、古いシェルスクリプトをリファクタリングしたので、そのときに使ったテクニックをここに残しておく。</p> <p>コマンドをパイプでつないで、最終的に出力を行単位で読み込みたいときがある。例えば、以下の<code>ls</code>コマンドの出力から一番ファイルサイズが大きいやつを選びたいとする。</p> <pre><code class="console">$ ls /tmp/ total 28 ... drwx------ 2 root wheel 64 10 8 01:25 KSDownloadAction.dFCyHsIUZR -rw-r--r-- 1 root wheel 0 10 9 23:35 wetrsmuoutpDmR5aR -rw-r--r-- 1 root wheel 0 10 9 23:36 wetrsmuoutpalIXOW ... </code></pre> <p>レガシー(というかマナーが悪い)なコードだとこんな感じになる。</p> <pre><code class="sh">#!/usr/bin/env bash set -eu OLD_IFS="${IFS}"; IFS=$'\n' max_size=0 max_filename= ls_outpu="$(\ls -l /tmp/ | sed -e '1d' | grep -v '^d')" for output in ${ls_outpu} do filesize="$(echo "${output}" | awk '{print $5}')" filename="$(echo "${output}" | awk '{print $9}')" if [ "${filesize}" -gt "${max_size}" ]; then max_size="${filesize}" max_filename="${filename}" fi done IFS="${OLD_IFS}" </code></pre> <p>やりたいことはタイトルにあるように「パイプで受け取った標準入力を列ごとに読みこんで配列っぽく処理したい」なんだけど、上のコードはいくつか良くない点がある。</p> <ol> <li><code>IFS</code>を一時的に置き換えている。</li> <li>空白区切りの行から特定位置の文字列を取り出すために<code>awk</code>を使っている。</li> <li><strong>数字</strong>を比較している。</li> </ol> <p>1つずつ説明する。</p> <h2 id="問題点と解決法"><a href="#%E5%95%8F%E9%A1%8C%E7%82%B9%E3%81%A8%E8%A7%A3%E6%B1%BA%E6%B3%95">問題点と解決法</a></h2> <h3 id="IFSを一時的に置き換えている。"><a href="#IFS%E3%82%92%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82">IFSを一時的に置き換えている。</a></h3> <p>これは古いシェルスクリプトだとよく見かけるけど、このやり方はメンテナンスが非常にやりにくくなり、本当に危ないのでやめたほうが良い。<br /> まず、<code>IFS</code>はshellにおいて、文字列の<em>区切り</em>を示すもの。これを変えることで、文字列の区切りを変えることが出来る。</p> <p>通常、<code>IFS</code>は半角スペース、タブ文字、改行の3つである。ここでは<code>ls -l</code>の出力を行ごとに読み込むために文字列の区切りを改行区切りにしている(そうしなければ、出力を1行ごとに列単位で扱うことになってしまう)。そして処理が完了したら<code>IFS</code>を元に戻している。</p> <p>これ、最初に書いた人は良いけど、別の人がコードを保守するときに、この部分を見落としがちなのでバグが発生しやすくなるんだよね。コードを読む人は途中で<code>IFS</code>が変わったことを常に意識しながら読むことを強いられるので、コードの保守性が著しく悪くなる。</p> <p>よって、<code>IFS</code>の置き換えは良くないのでやめましょう。ではどうすれば良いのかと言うと、ヒアドキュメントを使って<code>read</code>で読み込めば良い。</p> <pre><code class="sh">while read line do ... done <<< "$(ls -l /tmp/ | sed -e '1d' | grep -v '^d')" </code></pre> <p>すこし見づらくなるけど、こうすることで<code>IFS</code>の置き換えが不要になり、行ごとに変数<code>line</code>の中に文字列が格納されるようになる。</p> <p>もしかしたらこうしたほうが良いかも?と思う人がいるかもしれない。</p> <pre><code class="sh">ls -l /tmp/ | sed -e '1d' | grep -v '^d' | while read line do ... done </code></pre> <p>べつにこれでも良いのだけど、パイプで繋がれた処理はサブシェルで起動するということを思い出してほしい。今回のようにwhileのループ文の中で、事前に定義した変数を読み込みたい場合、つまり、以下のような場合、</p> <pre><code class="sh">max_size=0 max_filename= ls -l /tmp/ | sed -e '1d' | grep -v '^d' | while read line do filesize="$(echo "${output}" | awk '{print $5}')" filename="$(echo "${output}" | awk '{print $9}')" if [ "${filesize}" -gt "${max_size}" ]; then max_size="${filesize}" max_filename="${filename}" fi done </code></pre> <p>ループ文中の<code>max_size</code>と<code>max_filename</code>は先に定義したものとは別の変数として扱われる。その上、サブシェルなのでループ文を抜けると、その中にあった変数たちは参照できなくなる。なぜなら、サブシェルはメインのシェルとは違う世界なので。よって、パイプでつなぐのでなく、ヒアドキュメントで入力を受け取るようにしている。</p> <p>もちろん、サブシェルで起動しても問題なければパイプで繋げばいいと思うけど、ヒアドキュメントを使えばサブシェルの起動を1つ減らせるので、リソースやパフォーマンスの面からもオススメしたいやり方だったりする。</p> <h3>空白区切りの行から特定位置の文字列を取り出すために<code>awk</code>を使っている。</h3> <p><code>awk</code>って便利なのでよく使われているんだけど、大抵の場合、空白切りの文字列の特定の位置の文字を取り出すときに使われることが多い。手元のコマンドラインで使うとかだったら良いんだけど、データ処理とかバッチ処理のスクリプトで使っているとしたら、なるべく次に紹介する方法で置き換えたほうが良い。<code>awk</code>は重いし、思わず色々awkの中に処理を詰め込みがちになってしまうから。</p> <p>オススメのリファクタリングとしては、<code>set</code>を使うこと。<code>set</code>というのは、よくシェルスクリプトの冒頭で<code>set -eu</code>とかやると思うんだけど、その<code>set</code>。これはbuilt-in関数なので<code>awk</code>と違って別途にプロセスがforkされることがなくて軽い。</p> <p>で、どういうふうに<code>set</code>を<code>awk</code>の代わりに使うのかというと、以下のようになる。</p> <pre><code class="sh">... set -- ${output} filesize="${5}" filename="${9}" ... </code></pre> <p>これだけ。スッキリしてわかりやすくなったと思う。解説は<code>man set</code>で見れば良いと思うけど、ここに引用しておく。</p> <blockquote> <p>Any arguments remaining after option processing are treated as values for the positional parameters and are assigned, in order, to $1, $2, ... $n.</p> </blockquote> <p><code>--</code>については以下の引用を参考。<code>grep</code>とかでもよく使うので知っている人は多いと思う。</p> <blockquote> <p>-- If no arguments follow this option, then the positional<br /> parameters are unset. Otherwise, the positional parame-<br /> ters are set to the args, even if some of them begin with<br /> a -.</p> </blockquote> <p>つまり、<code>set -- foo bar baz</code>とやると、それぞれが<code>$1</code>, <code>$2</code>, <code>$3</code>に格納される。Pythonで言うところの<code>*args</code>みたいな可変長引数みたいな感じで位置引数として利用することが出来る。これにより、もう<code>awk</code>を使ってわざわざ<code>echo</code>してパイプで…みたいなことをしなくて済む(もちろん<code>IFS</code>を変更していないことが前提である)。</p> <p>副作用としては、シェルスクリプトに渡された位置引数を上書きすることになるので、そういった引数は事前に別の変数に格納しておくのを忘れないこと。</p> <h3><strong>数字</strong>を比較している</h3> <p>これはなんのこっちゃと思うかもしれないけど、<code>-gt</code>や<code>-ne</code>は本来は<strong>数値</strong>を比較するためのものであって<strong>数字</strong>を比較するものではない。つまり、文字列のままで数字を扱うのは危ないのでやめましょうということ。ではどうするかというと、以下のようにすれば良い。</p> <pre><code class="sh"> if [ $((filesize)) -gt $((max_size)) ]; then </code></pre> <p>シェルスクリプトで足し算とかするときに<code>$((foo + bar))</code>みたいなことをするとおもんだけど(もし<code>expr</code>を使っているなら即刻書き換えましょう)、上のようにすることで数字を数値にすることが出来る。これの何が良いかと言うと、もし変数の中身がアルファベットのような数字ではない文字だった場合はゼロとして扱われる。</p> <pre><code class="console">$ a="aaa" $ echo $((a)) 0 </code></pre> <p>状況によるが、変数が数字でなければゼロとして扱って差し支えない場合はこのようにすることで余計な数字判定の式を省くことが出来る。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ということで、ここまでの内容をまとめると以下のようになる。</p> <pre><code class="sh">max_size=0 max_filename= while read -r line do set -- ${line} filesize="${5}" filename="${9}" if [ "$((filesize))" -gt "$((max_size))" ]; then max_size="${filesize}" max_filename="${filename}" fi done <<< "$(\ls -l /tmp/ | sed -e '1d' | grep -v '^d')" </code></pre> <p>行数はほとんど変わらないけど、最初の方と比べるとわかりやすくなったかなと思う。特別な処理とかないし。ちなみに、もっとも大きいファイル名を取得するだけなら<code>ls -S | head -1</code>で一発で取れるので、わざわざこんなことをしなくて良い。</p> shige tag:crieit.net,2005:PublicArticle/15459 2019-10-08T01:05:45+09:00 2019-10-08T01:09:21+09:00 https://crieit.net/posts/C-5d9b6259e4530 C#を本業にしているスクリプトキディが思いついた、私史上最強の三文未満小説執筆環境 <p>3畳に足りるか足りないか分からないシェアハウスの個室で、間接照明とディスプレイの明かりを頼りに、<br /> この文章を自作した左右分離式キーボードで書いている。</p> <p><a href="https://crieit.now.sh/upload_images/3bf7b632524cf2841f96bdb7b8fe62e05d9b6315cd782.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3bf7b632524cf2841f96bdb7b8fe62e05d9b6315cd782.png?mw=700" alt="This is DOOM Emacs." /></a><br /> Emacsで。 厳密に言うと、DOOM Emacsだ。</p> <p>そんな私がなぜ久々に文章を打っているかといえば、<br /> 就業中にわだかまっていた三文小説未満のライトノベルにも満たないプログラミング入門以前物語のそれを書きたくなったり、<br /> 書くに至って良いやり方をいろいろ考えていたら、思いついたのでまとめているわけである。</p> <h1 id="Emacsは最強の執筆環境"><a href="#Emacs%E3%81%AF%E6%9C%80%E5%BC%B7%E3%81%AE%E5%9F%B7%E7%AD%86%E7%92%B0%E5%A2%83">Emacsは最強の執筆環境</a></h1> <p>この記事に何らかのきっかけで行き着いた方々には釈迦に説法だとは思うし、<br /> もっとLispを使いこなしているEmacsユーザーに対しては僭越だが、<br /> 一応Emacsというエディタについて簡単に自分が今(2019-10-07T22:46)資料を見ないでできる限りの<br /> 紹介をさせていただく。</p> <h2 id="Emacsという古来から存在するテキストエディタ"><a href="#Emacs%E3%81%A8%E3%81%84%E3%81%86%E5%8F%A4%E6%9D%A5%E3%81%8B%E3%82%89%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF">Emacsという古来から存在するテキストエディタ</a></h2> <p>古来(といってもUNIXが生まれてからではあるので、西暦1980年以降である)から存在するテキストエディタであるが、<br /> その拡張性の高さと、拡張性ゆえの可能性の多さから、このエディタのファンは多く、根強い支持を得ている。</p> <p>とかく書いてる私自身も2年前から少しずつEmacsを触り始めた口で、それまでは<a target="_blank" rel="nofollow noopener" href="http://vim.org">Vim</a>という双対をなすテキストエディタを使っていた。</p> <h2 id="(ほぼ)文字だけで表現するテキストエディタ"><a href="#%EF%BC%88%E3%81%BB%E3%81%BC%EF%BC%89%E6%96%87%E5%AD%97%E3%81%A0%E3%81%91%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF">(ほぼ)文字だけで表現するテキストエディタ</a></h2> <p>これら(Emacs,<br /> Vim)の特徴としては、ほぼすべてを文字で表現することにある。</p> <p>ドットインパクトプリンタなどの出力機器しかなかった時代から見るとずいぶんと贅沢かもしれないが、<br /> 2000年以降に生まれた若い人たちからすると、ずいぶんと貧相に思うかもしれない。<br /> 今日のEmacs,<br /> その拡張機能と適切なフォントをインストールすれば、絵文字などを利用して見栄えは良くなる。</p> <h2 id="「ダサい」? 違う、洗練されているのだ。"><a href="#%E3%80%8C%E3%83%80%E3%82%B5%E3%81%84%E3%80%8D%EF%BC%9F%E3%80%80%E9%81%95%E3%81%86%E3%80%81%E6%B4%97%E7%B7%B4%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A0%E3%80%82">「ダサい」? 違う、洗練されているのだ。</a></h2> <p>とはいえ、EmacsはCtrlやAltなどの装飾キーを酷使し、Vimは3つのモードを把握しなければいけないなどの<br /> 参入障壁があり、それ以前におそらく最初の見た目はWindowsのメモ帳と代わり映えしないだろう。</p> <p>「ダサい」と思われるかもしれない。 しかし本当にダサいのだろうか。</p> <p>私は憧れる。必要な時に必要な道具をサッと出し、作業に取り掛かり、必要が無くなったらしまう。</p> <p>それができるのがこれらのエディタの強さである。</p> <h1 id="Org-modeは至高の(ドキュメント|タスク管理|プロジェクト管理)テキストフォーマット"><a href="#Org-mode%E3%81%AF%E8%87%B3%E9%AB%98%E3%81%AE%EF%BC%88%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BD%9C%E3%82%BF%E3%82%B9%E3%82%AF%E7%AE%A1%E7%90%86%EF%BD%9C%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%EF%BC%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88">Org-modeは至高の(ドキュメント|タスク管理|プロジェクト管理)テキストフォーマット</a></h1> <h2 id="執筆に適したテキストフォーマットを作るという行為の非現実性"><a href="#%E5%9F%B7%E7%AD%86%E3%81%AB%E9%81%A9%E3%81%97%E3%81%9F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E8%A1%8C%E7%82%BA%E3%81%AE%E9%9D%9E%E7%8F%BE%E5%AE%9F%E6%80%A7">執筆に適したテキストフォーマットを作るという行為の非現実性</a></h2> <p>とはいえ、テキストエディタが優秀で拡張性に優れているからと言って、自前で執筆に適した拡張機能を作るのは骨が折れる。</p> <p>ましてや進捗やHTMLファイル(Webブラウザで閲覧できる形式)への変換出力機能も実装するのは、自分のような専門学校卒業程度の、<br /> ほぼ文系コーダーに毛が生えてるか生えていないか程度のプログラマというのもおこがましい劣化知的生命体には無茶な話で、<br /> 仕事の余暇に作るなんて、人間の平均寿命から20年ほど引いた年数ではできるものではない<br /> (たまにそれを成し遂げる者も居るが、それは天才と言われる超人類にしか当てはまらない)。</p> <h2 id="巨人の肩に腰を据える"><a href="#%E5%B7%A8%E4%BA%BA%E3%81%AE%E8%82%A9%E3%81%AB%E8%85%B0%E3%82%92%E6%8D%AE%E3%81%88%E3%82%8B">巨人の肩に腰を据える</a></h2> <p>今日、オープンソースソフトウェア・フリーソフトウェアという文化が広まり、インターネットにつながるパソコンがあれば、<br /> 天才達が考えたプログラムを自由に利用し、技術があれば改造したり、更にその天才が気づかなかった不具合を治すことだってできる。<br />  <br /> Emacsの文化から生まれた<a target="_blank" rel="nofollow noopener" href="https://orgmode.org/ja/">Org-mode</a>もその一つだろう。</p> <p>Org-modeはそのよく考えられたテキストフォーマットと、文字列情報を解析して機能を与えるEmacsが織りなす、</p> <ul> <li>メモ</li> <li>ジャーナル</li> <li>文書</li> <li>タスク管理</li> <li>プロジェクト管理</li> </ul> <p>上記全て(さらに数個以上)に対応するテキストフォーマットなのである。</p> <p>MarkdownやreStructuredTextも拡張することでこれらを全て受け持つテキストフォーマットになるだろう。<br /> ただ、Emacs<br /> Lispという強力なテキストエディタの拡張性により、テキストエディタとシンプルな軽量マークアップ言語<br /> で実装できたと私は思う。</p> <h1 id="実際にどう書くのか。"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%A9%E3%81%86%E6%9B%B8%E3%81%8F%E3%81%AE%E3%81%8B%E3%80%82">実際にどう書くのか。</a></h1> <p>さて、ここからそんなEmacsとOrg-modeを利用して執筆する方法を見てみよう。</p> <h2 id="とにかく見出しを作る"><a href="#%E3%81%A8%E3%81%AB%E3%81%8B%E3%81%8F%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E4%BD%9C%E3%82%8B">とにかく見出しを作る</a></h2> <p>とにかく見出しを作る。</p> <h3 id="更に細分化した見出しを作る"><a href="#%E6%9B%B4%E3%81%AB%E7%B4%B0%E5%88%86%E5%8C%96%E3%81%97%E3%81%9F%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E4%BD%9C%E3%82%8B">更に細分化した見出しを作る</a></h3> <p>その見出しを細分化する。</p> <p>アニメの絵コンテの一枠や、マンガのヒトコマくらいに細分化してしまっていい。</p> <h3 id="そのシーンを1行でまとめた描写を"><a href="#%E3%81%9D%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%921%E8%A1%8C%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%81%9F%E6%8F%8F%E5%86%99%E3%82%92">そのシーンを1行でまとめた描写を</a></h3> <p>更にその見出しを細分化する。段落レベルまで細分化してしまっても良い。</p> <p>私の様な人間は特に、 「これは5分で書けるだろう」 <br /> くらいのレベルまで細分化してしまったほうが良いと思う。</p> <h2>見出しを <code>TODO</code> にしてしまう</h2> <p>Org-modeのテキストを、Emacsの <code>org-mode</code> を適応して開いていれば、<br /> キーボード・ショートカットで見出しを一瞬でタスクに切り替えることができる。</p> <p>この機能を最大限利用し、先程まで書いた見出しを全て <code>TODO</code><br /> にしてしまおう。</p> <p>もちろんだが、全ての見出しを <code>TODO</code><br /> にするスクリプトを書いてしまっても良い。<br /> むしろそうやって積極的に拡張できるのがEmacsの強みだと私は思う。</p> <h2 id="書け。羅列されたシーンを描写しろ。"><a href="#%E6%9B%B8%E3%81%91%E3%80%82%E7%BE%85%E5%88%97%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%83%BC%E3%83%B3%E3%82%92%E6%8F%8F%E5%86%99%E3%81%97%E3%82%8D%E3%80%82">書け。羅列されたシーンを描写しろ。</a></h2> <p>さあ、何を書きたいか決まった。書こう。</p> <h3 id="細分化された見出しはほぼ穴埋めだ。"><a href="#%E7%B4%B0%E5%88%86%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%AF%E3%81%BB%E3%81%BC%E7%A9%B4%E5%9F%8B%E3%82%81%E3%81%A0%E3%80%82">細分化された見出しはほぼ穴埋めだ。</a></h3> <p>細分化された見出しに答えるように書いていくだけで良いはずだ。</p> <p>それで筆が進まないのは、もしかしたら細分化が足りない。</p> <p>どんな風に書くか迷ったら、 <code>#</code><br /> を行頭につけてコメントアウトしてとりあえず書いてみる。</p> <h3 id="余談:テストを行うプログラムから書く「テスト駆動開発」"><a href="#%E4%BD%99%E8%AB%87%EF%BC%9A%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E8%A1%8C%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8B%E3%82%89%E6%9B%B8%E3%81%8F%E3%80%8C%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%80%8D">余談:テストを行うプログラムから書く「テスト駆動開発」</a></h3> <p>昨今になってソフトウェア開発の世界で注目されているのが、「テスト駆動開発」という手法だ。</p> <p>雑に説明してしまうと、<br /> 「作ったものの動作が正しく動作するか検証するプログラムを書きながらソフトウェアを作っていく」<br /> という手法だ。</p> <p>この執筆手法も、このソフトウェア開発手法からヒントを得た。<br /> 「自分の書きたいことをある程度ハッキリさせたら筆が進むはず」<br /> という、結構安直な考えである。</p> <p>この際なのでここに、 「ドメイン駆動設計」<br /> の考え方も混ぜ込みたくもなったが、まだそこまで考えがまとまってないので、後日うっかりひらめいたら。</p> <h2 id="見出しを消す"><a href="#%E8%A6%8B%E5%87%BA%E3%81%97%E3%82%92%E6%B6%88%E3%81%99">見出しを消す</a></h2> <h3 id="よしっ!"><a href="#%E3%82%88%E3%81%97%E3%81%A3%EF%BC%81">よしっ!</a></h3> <p>(ヘルメットを被った猫の絵は省略)</p> <p>あとは大見出し以外を消すなり、大見出しを書き直したら、大分いい感じになってるはずだ。</p> <h3 id="Orgで書いたテキストを変換。"><a href="#Org%E3%81%A7%E6%9B%B8%E3%81%84%E3%81%9F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%A4%89%E6%8F%9B%E3%80%82">Orgで書いたテキストを変換。</a></h3> <p>とはいえ、書いたテキストを他の人が見やすいフォーマットにできないと、<br /> なかなか見せづらくて寂しいと思われる。</p> <p>EmacsとOrg-mode標準でもいくつかのファイルフォーマットに出力できるが、<a target="_blank" rel="nofollow noopener" href="https://pandoc.org">Pandoc</a>などのツールを使うと、<br /> 更に幅が広がる。</p> <p>LaTeX形式に一度吐き出して、PDF形式に変換することも可能だ 。</p> <h1 id="Git(とMagit)を合わせると鬼に金棒。"><a href="#Git%EF%BC%88%E3%81%A8Magit%EF%BC%89%E3%82%92%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%81%A8%E9%AC%BC%E3%81%AB%E9%87%91%E6%A3%92%E3%80%82">Git(とMagit)を合わせると鬼に金棒。</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://git-scm.com">Git</a>と<a target="_blank" rel="nofollow noopener" href="https://magit.vc">Magit</a>を使って共同執筆する方法についても書きたかったが、私個人の時間切れに付き、ここまで。</p> <p>Gitを使った執筆活動の方法は他の方も各所で書いているので、興味のある方はぜひ調べてみるといいだろう。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>私の眠気もいい具合にキマってきた午前0時40分。</p> <p>割と思いついたことは書き留めれたはず。</p> <p>なお、この記事を書くに当たって、<a target="_blank" rel="nofollow noopener" href="http://www.mhatta.org/wp/category/org-mode/">八田真行さんの「モーレツ! Org<br /> mode教室」</a>を多大に参考にさせていただいた。<br /> ちょっとでもEmacsとOrg-modeに興味を抱いた方は、ぜひ確認していただきたい。</p> <h1 id="Emacsディストリビューション"><a href="#Emacs%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">Emacsディストリビューション</a></h1> <p>しかしながら、この記事の最初でも記したとおり、Emacsは素のままでは結構難解なテキストエディタである。</p> <p>そこで、そんなEmacsにパッケージを追加して使いやすくしたEmacs達を紹介して話を締めたいと思う。</p> <dl> <dt>Graphene</dt> <dd>比較的優しそうな見た目</dd> <dt>Emacs Prelude</dt> <dd>ディストリビューションでは結構人気</dd> <dt>Spacemacs</dt> <dd>ちょっと重くて音沙汰ないけど、元祖Emacs + Vim</dd> <dt>DOOM Emacs</dt> <dd>Spacemacsの意志を受け継いだ? チョットワカル人向け。とはいえ自分みたいなニワカでも割と扱える。</dd> <dt>Emacs</dt> <dd>弘法は筆を選ぶのではない。作るのだ。</dd> <dt>Vim-Org-mode</dt> <dd>VimでもOrg-mode</dd> <dt>VSCode + VS Code Org Mode</dt> <dd>Visual Studio CodeでもOrg-mode。すげぇな。</dd> </dl> <h1 id="P.S."><a href="#P.S.">P.S.</a></h1> <p>このテキストの原稿もOrg-modeで書きました。<br /> <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/manzyun/63768a11fde889e090ffe16c785425a6">GIstに原稿を上げてます</a>Rawボタンを見ると、生テキストファイルが見れます。<br /> 参考になれば幸いです。</p> まんじゅ(´ん`)