{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/special-chars-for-cli/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"3052a084-9894-5853-9cf3-8909a2ca65b0","excerpt":"こんにちは。 Githubのトレンドにvadimdemedes/inkというツールが上がっており、CLIといえばchjj/blessedやReact版のYomguithereal/react-blessedとかあったなぁ、と懐かしみつつ そういえばPowerline…","html":"<p>こんにちは。<br>\nGithubのトレンドに<a href=\"https://github.com/vadimdemedes/ink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">vadimdemedes/ink</a>というツールが上がっており、CLIといえば<a href=\"https://github.com/chjj/blessed\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">chjj/blessed</a>やReact版の<a href=\"https://github.com/Yomguithereal/react-blessed\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Yomguithereal/react-blessed</a>とかあったなぁ、と懐かしみつつ</p>\n<p>そういえばPowerlineもシェルのアスキーアート的に表現されてるんだよな、<br>\nどうやってパンくずっぽいもの描画してるんだろう？</p>\n<p>というのが気になったので調べてみたらおもったより面白そうだったので遊んでみました。</p>\n<!--more-->\n<h2 id=\"作ったもの\" style=\"position:relative;\"><a href=\"#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE\" aria-label=\"作ったもの permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>作ったもの</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/60c96b65ea7a4eb6a626160002672438/48ca3/eyecatch-special-chars-for-cli.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 29.34131736526946%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'117\\'%20viewBox=\\'0%200%20400%20117\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2059v58h401V0H0v59m202-6L81%2054l2%202%203%202-3%204-3%203h83a1979%201979%200%200080-2c2%200%202-1%202-3l1-3%201%204v4h122l4-3%203-3-3-4-3-3h-23l-145%201\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/60c96b65ea7a4eb6a626160002672438/5251b/eyecatch-special-chars-for-cli.webp 167w,\n/static/60c96b65ea7a4eb6a626160002672438/7390e/eyecatch-special-chars-for-cli.webp 334w,\n/static/60c96b65ea7a4eb6a626160002672438/7c056/eyecatch-special-chars-for-cli.webp 668w,\n/static/60c96b65ea7a4eb6a626160002672438/0a92e/eyecatch-special-chars-for-cli.webp 1002w,\n/static/60c96b65ea7a4eb6a626160002672438/dac76/eyecatch-special-chars-for-cli.webp 1084w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/60c96b65ea7a4eb6a626160002672438/21521/eyecatch-special-chars-for-cli.png 167w,\n/static/60c96b65ea7a4eb6a626160002672438/86d36/eyecatch-special-chars-for-cli.png 334w,\n/static/60c96b65ea7a4eb6a626160002672438/74866/eyecatch-special-chars-for-cli.png 668w,\n/static/60c96b65ea7a4eb6a626160002672438/d69c4/eyecatch-special-chars-for-cli.png 1002w,\n/static/60c96b65ea7a4eb6a626160002672438/48ca3/eyecatch-special-chars-for-cli.png 1084w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/60c96b65ea7a4eb6a626160002672438/74866/eyecatch-special-chars-for-cli.png\"\n            alt=\"成果物\"\n            title=\"成果物\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>記事にも貼っていきますが、ソースはこちら（TODO）から確認できます。<br>\n上記画像のようなものを１つずつ作っていきます</p>\n<h2 id=\"フォントに注意\" style=\"position:relative;\"><a href=\"#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AB%E6%B3%A8%E6%84%8F\" aria-label=\"フォントに注意 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>フォントに注意</h2>\n<p>その前に注意点です。<br>\n以下の文字は文字化けせずに表示されてますでしょうか。この後の内容に欠かせない重要パーツたちです。</p>\n<p><code></code>, <code></code>, <code>░</code>, <code>⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏</code></p>\n<p>画像として表示するとこんな感じです。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 332px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1359cc5b0b45ba243488d48074e371d5/f8dc5/special-chars-for-cli-fonts.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 20.35928143712575%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'82\\'%20viewBox=\\'0%200%20400%2082\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2041v41h401V0H0v41m10%200v22l7-7%2013-16-19-21-1%2022m71-15L71%2037l-3%204%2010%2010%2010%2011%201-21-1-22-7%207\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/1359cc5b0b45ba243488d48074e371d5/5251b/special-chars-for-cli-fonts.webp 167w,\n/static/1359cc5b0b45ba243488d48074e371d5/b76f7/special-chars-for-cli-fonts.webp 332w\"\n              sizes=\"(max-width: 332px) 100vw, 332px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/1359cc5b0b45ba243488d48074e371d5/21521/special-chars-for-cli-fonts.png 167w,\n/static/1359cc5b0b45ba243488d48074e371d5/f8dc5/special-chars-for-cli-fonts.png 332w\"\n            sizes=\"(max-width: 332px) 100vw, 332px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/1359cc5b0b45ba243488d48074e371d5/f8dc5/special-chars-for-cli-fonts.png\"\n            alt=\"フォント\"\n            title=\"フォント\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>では、これらの文字をコピーしてターミナルに貼り付けても表示できていますでしょうか。<br>\n他にもこれらの文字を表示できるフォントあると思いますが、フォント設定が<code>Source Code Pro</code>であればおそらく表示できていると思います。<br>\nGoogleフォントとかから読み込めるWebフォント版のSource Code Proだとマルチバイトが省略されているそうで、文字化けします。</p>\n<p><a href=\"https://www.iterm2.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">iTerm2</a>をお使いの場合は、以下の画像のようにフォントを設定すればおそらく表示できると思います。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/eb848ef5d5d0f77a35b055474abb12b0/28e7f/special-chars-for-cli-fontconfig.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.67664670658682%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'246\\'%20viewBox=\\'0%200%20400%20246\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%20123v123h401V0H0v123m0%201a4719%204719%200%20002%20120c1%201%20395%202%20396%200V2A16156%2016156%200%20001%202C0%201%200%2044%200%20124m213-84l-1%205v3h21v-9h-10l-10%201m26%2015c0%203%207%204%208%202h1l5%201%205-1h1l4%201c4%201%204%201%204-1s-1-2-4-2l-3-1h-19c-1-2-2-1-2%201M11%2071l1%205h133v-9H11v4m302%2056l1%202h26l7%201c5%200%206%200%206-2a252%20252%200%2000-40-1m-159%2039v17h127v-33H154v16m3%200v13h120v-25H157v12m-3%2045v18h127v-36H154v18m3%200l1%2014%201-1%203-1%202%201%2057%201h56v-28H157v14m2-8c0%202%200%202%201%201h1l14%201c13%200%2013%200%2013-2s-1-3-5-3l-7%201h-2l-2%201-5-1h-6c-2-1-2%200-2%202\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/eb848ef5d5d0f77a35b055474abb12b0/5251b/special-chars-for-cli-fontconfig.webp 167w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/7390e/special-chars-for-cli-fontconfig.webp 334w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/7c056/special-chars-for-cli-fontconfig.webp 668w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/0a92e/special-chars-for-cli-fontconfig.webp 1002w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/7fa3c/special-chars-for-cli-fontconfig.webp 1336w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/6e429/special-chars-for-cli-fontconfig.webp 1848w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/eb848ef5d5d0f77a35b055474abb12b0/21521/special-chars-for-cli-fontconfig.png 167w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/86d36/special-chars-for-cli-fontconfig.png 334w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/74866/special-chars-for-cli-fontconfig.png 668w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/d69c4/special-chars-for-cli-fontconfig.png 1002w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/9685e/special-chars-for-cli-fontconfig.png 1336w,\n/static/eb848ef5d5d0f77a35b055474abb12b0/28e7f/special-chars-for-cli-fontconfig.png 1848w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/eb848ef5d5d0f77a35b055474abb12b0/74866/special-chars-for-cli-fontconfig.png\"\n            alt=\"iTermの設定\"\n            title=\"iTermの設定\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>表示できていたら、フォントを適当に変えてみてください。だいたい文字化けすると思います。<br>\nこれらの<strong>特殊文字は対応しているフォントが少ないため、ターミナルのフォント設定に強く依存する</strong>という点にご注意ください。</p>\n<h2 id=\"ターミナルで色付き文字を出力する\" style=\"position:relative;\"><a href=\"#%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E8%89%B2%E4%BB%98%E3%81%8D%E6%96%87%E5%AD%97%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B\" aria-label=\"ターミナルで色付き文字を出力する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ターミナルで色付き文字を出力する</h2>\n<p>bash_profileとかをいじったことある人ならおそらく触れたことあると思いますが、<code>[\\e[00;34m]</code>とかそういうやつです。</p>\n<blockquote>\n<p>— <a href=\"http://vorfee.hatenablog.jp/entry/2015/03/17/173635\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ターミナルのechoやprintfに256色で色をつける 完全版 - vorfee’s Tech Blog</a></p>\n</blockquote>\n<p>そのままechoしてもいいのですが、コードとして分かりにくいので、npmの<a href=\"https://www.npmjs.com/package/chalk\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">chalk</a>というパッケージを使用して色名を使ってコードを書いていきます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> chalk <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chalk'</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n  chalk<span class=\"token punctuation\">.</span><span class=\"token function\">red</span><span class=\"token punctuation\">(</span><span class=\"token string\">'H'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">magenta</span><span class=\"token punctuation\">(</span><span class=\"token string\">'e'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">yellow</span><span class=\"token punctuation\">(</span><span class=\"token string\">'l'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">green</span><span class=\"token punctuation\">(</span><span class=\"token string\">'l'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">blue</span><span class=\"token punctuation\">(</span><span class=\"token string\">'o'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> <span class=\"token string\">' '</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">cyan</span><span class=\"token punctuation\">(</span><span class=\"token string\">'w'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">white</span><span class=\"token punctuation\">(</span><span class=\"token string\">'o'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">yellowBright</span><span class=\"token punctuation\">(</span><span class=\"token string\">'r'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">greenBright</span><span class=\"token punctuation\">(</span><span class=\"token string\">'l'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">blueBright</span><span class=\"token punctuation\">(</span><span class=\"token string\">'d'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">cyanBright</span><span class=\"token punctuation\">(</span><span class=\"token string\">'!'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">whiteBright</span><span class=\"token punctuation\">(</span><span class=\"token string\">'!'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4c3232d0229e519bb86dc5b0d5637c1e/0b533/special-chars-for-cli-hello-world.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 14.970059880239523%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'61\\'%20viewBox=\\'0%200%20400%2061\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2031v30h401V0H0v31M183%207l-1%203c0%201%200%202-2%201-3%200-6%203-6%206%200%204%203%206%207%206h3v-9c0-8%200-9-1-7m166%202c0%203%200%203-2%202-3%200-6%202-6%206s2%206%206%206l4-1v-7l-1-8c-1-1-1%200-1%202M112%209c-4%204-2%2014%203%2014%204%200%206-3%206-8%200-4-3-8-5-8l-4%202m-12%203c-3%202-3%207-1%209s5%203%207%200c5-5-1-13-6-9m64%200c-3%202-3%207-1%209s5%203%207%200c5-5-1-13-6-9m102%201c-4%203-1%2010%203%2010%203%200%206-4%206-7-2-5-6-7-9-3m38%200c-4%203-2%2010%204%2010%204%200%207-7%203-10-2-2-4-2-7%200M144%2038c0%202%200%203-2%202-3%200-6%202-6%206s3%206%205%206l4-1%201-8-1-8-1%203m-45%204c-4%204-1%2010%204%2010%204%200%207-7%204-10-2-3-6-2-8%200\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/4c3232d0229e519bb86dc5b0d5637c1e/5251b/special-chars-for-cli-hello-world.webp 167w,\n/static/4c3232d0229e519bb86dc5b0d5637c1e/7390e/special-chars-for-cli-hello-world.webp 334w,\n/static/4c3232d0229e519bb86dc5b0d5637c1e/b0a15/special-chars-for-cli-hello-world.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/4c3232d0229e519bb86dc5b0d5637c1e/21521/special-chars-for-cli-hello-world.png 167w,\n/static/4c3232d0229e519bb86dc5b0d5637c1e/86d36/special-chars-for-cli-hello-world.png 334w,\n/static/4c3232d0229e519bb86dc5b0d5637c1e/0b533/special-chars-for-cli-hello-world.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/4c3232d0229e519bb86dc5b0d5637c1e/0b533/special-chars-for-cli-hello-world.png\"\n            alt=\"hello-world\"\n            title=\"hello-world\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<h2 id=\"スピナーに使えそうな文字\" style=\"position:relative;\"><a href=\"#%E3%82%B9%E3%83%94%E3%83%8A%E3%83%BC%E3%81%AB%E4%BD%BF%E3%81%88%E3%81%9D%E3%81%86%E3%81%AA%E6%96%87%E5%AD%97\" aria-label=\"スピナーに使えそうな文字 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>スピナーに使えそうな文字</h2>\n<p>npm本家のスピナーが好きなので、それの簡易版を作ってみます。<br>\nnpmのソースを見てみたところ、内部で使用しているのは<a href=\"https://github.com/iarna/gauge/blob/master/themes.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">iarna/gauge</a>というライブラリでした。<br>\n<a href=\"https://github.com/iarna/gauge/blob/master/themes.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ソースの中を追っていったところ</a>、先程例に出したこれらの文字（<code>⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏</code>）が見つかりました。</p>\n<p>これらの文字をくり返し表示することで、ぐるぐる回っているっぽいアニメーションを作ります。</p>\n<h2 id=\"スピナーを作る下準備\" style=\"position:relative;\"><a href=\"#%E3%82%B9%E3%83%94%E3%83%8A%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B%E4%B8%8B%E6%BA%96%E5%82%99\" aria-label=\"スピナーを作る下準備 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>スピナーを作る下準備</h2>\n<p>さっそくアニメーションを実装する前に。<br>\n昔<a href=\"https://gist.github.com/Leko/0f6865648a34f233f047\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CLIでマリオが走るアニメーション</a>を実装したことがありましたが、<br>\nそのときは複数行をアニメーションさせるためにカーソル操作もやってました。</p>\n<p><img src=\"/140c5e0c8686fd38550f704a516d1591/special-chars-for-cli-mario.gif\" alt=\"マリオ\"></p>\n<p>今回は1行だけをアニメーションさせればいいので、簡単に<code>\\r</code>と空白を出力することで、その行の表示済みの内容をクリアする手法をとります。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// \\r ≒ 行頭にカーソル移動</span>\n<span class=\"token comment\">// スペースは消したい文字の数分だけ入れる。今回は1文字のアニメーションなので１文字で足りる。</span>\n<span class=\"token comment\">// `process.stdout.columns`でウィンドウ幅を取得して、その分だけスペースを出力すると行の内容がすべてクリアできる</span>\n<span class=\"token comment\">// https://stackoverflow.com/questions/30335637/get-width-of-terminal-in-node-js</span>\nprocess<span class=\"token punctuation\">.</span>stdout<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\\r \\r'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>なお、<code>console.log</code>だと改行されてしまって予期したとおり動いてくれないので、<code>process.stdout.write</code>を使用しています</p>\n<h2 id=\"スピナーを作ってみる\" style=\"position:relative;\"><a href=\"#%E3%82%B9%E3%83%94%E3%83%8A%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"スピナーを作ってみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>スピナーを作ってみる</h2>\n<p>ではアニメーションを実装してみます。<br>\n最近は<a href=\"https://github.com/vadimdemedes/ink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ink</a>などのCLIに向けたライブラリが色々出てますが、今回はシンプルに原理を理解するため愚直に書きます。<br>\nコードは<a href=\"https://gist.github.com/Leko/76727c0c4634b57de7231ba4427d5ed1#file-spinner-js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>からも確認できます</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> chalk <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chalk'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">FPS</span> <span class=\"token operator\">=</span> <span class=\"token number\">20</span>\n<span class=\"token keyword\">const</span> colors <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token string\">'red'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'magenta'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'yellow'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'green'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'blue'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'cyan'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'yellowBright'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'greenBright'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'blueBright'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'cyanBright'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'whiteBright'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> frames <span class=\"token operator\">=</span> <span class=\"token string\">'⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">let</span> cursor <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n<span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cursor <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>cursor <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> frames<span class=\"token punctuation\">.</span>length\n  process<span class=\"token punctuation\">.</span>stdout<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\r \\r</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>chalk<span class=\"token punctuation\">[</span>colors<span class=\"token punctuation\">[</span>cursor<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span>frames<span class=\"token punctuation\">[</span>cursor<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span> <span class=\"token operator\">/</span> <span class=\"token constant\">FPS</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>動かしてみるとこんな感じです。</p>\n<p><img src=\"/f7d226de4e7794de7eb89a8a7886b76d/special-chars-for-cli-spinner.gif\" alt=\"spinner\"></p>\n<h2 id=\"powerline的なuiに使えそうな文字\" style=\"position:relative;\"><a href=\"#powerline%E7%9A%84%E3%81%AAui%E3%81%AB%E4%BD%BF%E3%81%88%E3%81%9D%E3%81%86%E3%81%AA%E6%96%87%E5%AD%97\" aria-label=\"powerline的なuiに使えそうな文字 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Powerline的なUIに使えそうな文字</h2>\n<p>さて、本題のPowerlineです。<br>\nこれも<a href=\"https://github.com/powerline/powerline/blob/01d28baf72bb90a8ecd8a242f3578bcf6adc2705/powerline/config_files/themes/powerline.json\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ソースを追っていったところ</a>、先程例に出した文字（<code></code>, <code></code>）や他にもアイコン相当の文字などが見つかりました。</p>\n<p>こんな文字どこから見つけてきたんだよ。というツッコミを入れたくなるほどレパートリーがあります。<br>\nちなみに、普通に「さんかく」と打って変換できる文字では文字サイズがテキストと同じなのでパンくずっぽい見た目になりませんでした。</p>\n<p>これらの文字と背景色を組み合わせて、PowerlineっぽいUIを実装してみます。<br>\nまずは背景色を理解しないとそれっぽいUIにならないので、それを説明します。</p>\n<h2 id=\"ターミナルで文字に背景色をつける\" style=\"position:relative;\"><a href=\"#%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E6%96%87%E5%AD%97%E3%81%AB%E8%83%8C%E6%99%AF%E8%89%B2%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B\" aria-label=\"ターミナルで文字に背景色をつける permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ターミナルで文字に背景色をつける</h2>\n<p>先程リンクを貼ったCLIでマリオが走るアニメーションでは、半角スペースに背景色を付けてドットっぽく扱っています。</p>\n<p>今回はそれよりもう少し難しいですが、概念は同じです。今回作りたいモノは</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/60c96b65ea7a4eb6a626160002672438/48ca3/eyecatch-special-chars-for-cli.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 29.34131736526946%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'117\\'%20viewBox=\\'0%200%20400%20117\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2059v58h401V0H0v59m202-6L81%2054l2%202%203%202-3%204-3%203h83a1979%201979%200%200080-2c2%200%202-1%202-3l1-3%201%204v4h122l4-3%203-3-3-4-3-3h-23l-145%201\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/60c96b65ea7a4eb6a626160002672438/5251b/eyecatch-special-chars-for-cli.webp 167w,\n/static/60c96b65ea7a4eb6a626160002672438/7390e/eyecatch-special-chars-for-cli.webp 334w,\n/static/60c96b65ea7a4eb6a626160002672438/7c056/eyecatch-special-chars-for-cli.webp 668w,\n/static/60c96b65ea7a4eb6a626160002672438/0a92e/eyecatch-special-chars-for-cli.webp 1002w,\n/static/60c96b65ea7a4eb6a626160002672438/dac76/eyecatch-special-chars-for-cli.webp 1084w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/60c96b65ea7a4eb6a626160002672438/21521/eyecatch-special-chars-for-cli.png 167w,\n/static/60c96b65ea7a4eb6a626160002672438/86d36/eyecatch-special-chars-for-cli.png 334w,\n/static/60c96b65ea7a4eb6a626160002672438/74866/eyecatch-special-chars-for-cli.png 668w,\n/static/60c96b65ea7a4eb6a626160002672438/d69c4/eyecatch-special-chars-for-cli.png 1002w,\n/static/60c96b65ea7a4eb6a626160002672438/48ca3/eyecatch-special-chars-for-cli.png 1084w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/60c96b65ea7a4eb6a626160002672438/74866/eyecatch-special-chars-for-cli.png\"\n            alt=\"成果物\"\n            title=\"成果物\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>のように、パンくずリストっぽいものです。色の変わり目がミソです。<br>\nなぜこういう見た目になるかというと、<code></code>の文字色と背景色を設定することでレイヤーっぽく扱っているからです。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">(白文字背景黒) (白文字背景赤) (白文字背景緑)...</code></pre></div>\n<p>という全体構成になってます。<br>\n例えば１つ目のつなぎ目（<code></code>）であれば、「文字色＝黒、背景色＝赤」で表示することでいい感じに繋がります。<br>\n<code></code>を使ってしまうとどうしても図形っぽく認識してしまうと思うので、スペースを開けたりつなぎ文字を変更してみると、イメージが付きやすいかもしれません。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> chalk <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'chalk'</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>\n  chalk<span class=\"token punctuation\">.</span>white<span class=\"token punctuation\">.</span><span class=\"token function\">bgRed</span><span class=\"token punctuation\">(</span><span class=\"token string\">' Hello '</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> <span class=\"token string\">' '</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span>red<span class=\"token punctuation\">.</span><span class=\"token function\">bgBlack</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> <span class=\"token string\">' '</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">bgBlack</span><span class=\"token punctuation\">(</span><span class=\"token string\">' world!! '</span><span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">+</span> <span class=\"token string\">' '</span>\n  <span class=\"token operator\">+</span> chalk<span class=\"token punctuation\">.</span><span class=\"token function\">black</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 580px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/196bf5ad561b5e94576829bdf535f83e/b6272/special-chars-for-cli-powerline-spaced.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 14.970059880239523%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'59\\'%20viewBox=\\'0%200%20400%2059\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2030v29h401V0H0v30m113%209v12h99V26h-99v13m110-1l1%2012%206-6%205-6-5-6-6-6-1%2012\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/196bf5ad561b5e94576829bdf535f83e/5251b/special-chars-for-cli-powerline-spaced.webp 167w,\n/static/196bf5ad561b5e94576829bdf535f83e/7390e/special-chars-for-cli-powerline-spaced.webp 334w,\n/static/196bf5ad561b5e94576829bdf535f83e/4fac6/special-chars-for-cli-powerline-spaced.webp 580w\"\n              sizes=\"(max-width: 580px) 100vw, 580px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/196bf5ad561b5e94576829bdf535f83e/21521/special-chars-for-cli-powerline-spaced.png 167w,\n/static/196bf5ad561b5e94576829bdf535f83e/86d36/special-chars-for-cli-powerline-spaced.png 334w,\n/static/196bf5ad561b5e94576829bdf535f83e/b6272/special-chars-for-cli-powerline-spaced.png 580w\"\n            sizes=\"(max-width: 580px) 100vw, 580px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/196bf5ad561b5e94576829bdf535f83e/b6272/special-chars-for-cli-powerline-spaced.png\"\n            alt=\"powerline-spaced\"\n            title=\"powerline-spaced\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>背景色の設定は、先ほど紹介した<code>chalk</code>でできます</p>\n<p><code>chalk.black.bgRed('')</code>と言った具合に。</p>\n<h2 id=\"powerline的なuiを作ってみる\" style=\"position:relative;\"><a href=\"#powerline%E7%9A%84%E3%81%AAui%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"powerline的なuiを作ってみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Powerline的なUIを作ってみる</h2>\n<p>概念的な部分はお話したので、コードに移ります。<br>\nとはいえ、つなぎ目の文字色と背景色をハードコードせずに計算したり、多少クラスに分けたりした程度です。</p>\n<p>コードの全文を載せると長いので<a href=\"https://gist.github.com/Leko/76727c0c4634b57de7231ba4427d5ed1#file-powerline-js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>を参照して下さい。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// ... 略</span>\n<span class=\"token keyword\">const</span> powerline <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Powerline</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> stack <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IndicatorStack</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'White'</span><span class=\"token punctuation\">,</span>   color<span class=\"token operator\">:</span> <span class=\"token string\">'red'</span><span class=\"token punctuation\">,</span>   backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span>   icon<span class=\"token operator\">:</span> <span class=\"token string\">'✉'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Cyan'</span><span class=\"token punctuation\">,</span>    color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'cyan'</span><span class=\"token punctuation\">,</span>    icon<span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Blue'</span><span class=\"token punctuation\">,</span>    color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'blue'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Magenta'</span><span class=\"token punctuation\">,</span> color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'magenta'</span><span class=\"token punctuation\">,</span> icon<span class=\"token operator\">:</span> <span class=\"token string\">'♥'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Red'</span><span class=\"token punctuation\">,</span>     color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'red'</span><span class=\"token punctuation\">,</span>     icon<span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Yellow'</span><span class=\"token punctuation\">,</span>  color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'yellow'</span><span class=\"token punctuation\">,</span>  icon<span class=\"token operator\">:</span> <span class=\"token string\">'⚡︎'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nstack<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Indicator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> text<span class=\"token operator\">:</span> <span class=\"token string\">'Green'</span><span class=\"token punctuation\">,</span>   color<span class=\"token operator\">:</span> <span class=\"token string\">'white'</span><span class=\"token punctuation\">,</span> backgroundColor<span class=\"token operator\">:</span> <span class=\"token string\">'green'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\npowerline<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>stack<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\\n\\n\\n'</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>powerline<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\\n\\n\\n'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/84593f0baefc34af04b4f097f3529fbe/302a4/special-chars-for-cli-powerline.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 7.18562874251497%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'30\\'%20viewBox=\\'0%200%20400%2030\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M1%2015v15h399V0H1v15m3%200v7l75-1c66%200%2075%200%2076-2%204-3%204-4%202-7l-3-3H79L4%208v7m300-6l-31%201%202%202%202%203-2%203-3%203h112l3-3%203-3-3-3-3-3h-80m-97%204h-4c-1%200-2%200-2%202l-1-1h-6c0-3-5%200-5%203l-1%203v-3c-1-5-4-5-5-1%200%203%200%203%202%203l4%201h5l-1-2v-1h2c1%203%207%202%207%200l1-2%201%202%201%202%201-2%201-2%201%202%202%202c2%200%202%200%201-1-2-1-3-3%200-3l1-1c0-1-4-2-5-1\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/84593f0baefc34af04b4f097f3529fbe/5251b/special-chars-for-cli-powerline.webp 167w,\n/static/84593f0baefc34af04b4f097f3529fbe/7390e/special-chars-for-cli-powerline.webp 334w,\n/static/84593f0baefc34af04b4f097f3529fbe/7c056/special-chars-for-cli-powerline.webp 668w,\n/static/84593f0baefc34af04b4f097f3529fbe/0a92e/special-chars-for-cli-powerline.webp 1002w,\n/static/84593f0baefc34af04b4f097f3529fbe/260c2/special-chars-for-cli-powerline.webp 1080w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/84593f0baefc34af04b4f097f3529fbe/21521/special-chars-for-cli-powerline.png 167w,\n/static/84593f0baefc34af04b4f097f3529fbe/86d36/special-chars-for-cli-powerline.png 334w,\n/static/84593f0baefc34af04b4f097f3529fbe/74866/special-chars-for-cli-powerline.png 668w,\n/static/84593f0baefc34af04b4f097f3529fbe/d69c4/special-chars-for-cli-powerline.png 1002w,\n/static/84593f0baefc34af04b4f097f3529fbe/302a4/special-chars-for-cli-powerline.png 1080w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/84593f0baefc34af04b4f097f3529fbe/74866/special-chars-for-cli-powerline.png\"\n            alt=\"powerline\"\n            title=\"powerline\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>適当にアイコンとかも公式のソースから引っ張ってきてみました。</p>\n<h2 id=\"あとがき\" style=\"position:relative;\"><a href=\"#%E3%81%82%E3%81%A8%E3%81%8C%E3%81%8D\" aria-label=\"あとがき permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>あとがき</h2>\n<p>「なんでそんな文字あるんだよ…」という文字が思っていたより色々あって、夢が広がると思います。<br>\nHTMLの実体参照なんかもかなりの種類があるので、ユースケースによっては画像やフォントアイコンではなくそれらを使ってみるのも面白いかもしれませんね。</p>\n<blockquote>\n<p>— <a href=\"http://www.benricho.org/symbol/tokusyu_02_arrow.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">【みんなの知識 ちょっと便利帳】使いたいときの HTML特殊文字 &#x26; 機種依存文字 - 矢印 &#x26; 矢印に使える記号、使えそうな記号</a></p>\n</blockquote>","timeToRead":10,"frontmatter":{"title":"CLIアプリに使えそうな特殊文字たちで遊んでみた","tags":["Nodejs","JavaScript","CLI"],"date":"August 01, 2017","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='117'%20viewBox='0%200%20400%20117'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2059v58h401V0H0v59m202-6L81%2054l2%202%203%202-3%204-3%203h83a1979%201979%200%200080-2c2%200%202-1%202-3l1-3%201%204v4h122l4-3%203-3-3-4-3-3h-23l-145%201'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":3.443298969072165,"src":"/static/60c96b65ea7a4eb6a626160002672438/e22c1/featured-image.png","srcSet":"/static/60c96b65ea7a4eb6a626160002672438/1ec58/featured-image.png 334w,\n/static/60c96b65ea7a4eb6a626160002672438/ccb4a/featured-image.png 668w,\n/static/60c96b65ea7a4eb6a626160002672438/e22c1/featured-image.png 1084w","srcWebp":"/static/60c96b65ea7a4eb6a626160002672438/507a1/featured-image.webp","srcSetWebp":"/static/60c96b65ea7a4eb6a626160002672438/cd98f/featured-image.webp 334w,\n/static/60c96b65ea7a4eb6a626160002672438/7535d/featured-image.webp 668w,\n/static/60c96b65ea7a4eb6a626160002672438/507a1/featured-image.webp 1084w","sizes":"(max-width: 1084px) 100vw, 1084px"}}}}}},"pageContext":{"slug":"/special-chars-for-cli/","previous":{"fields":{"slug":"/rn-audio-record/"},"frontmatter":{"title":"React nativeで音声を録音する","tags":["JavaScript","React","React Native","iOS","Android"]}},"next":{"fields":{"slug":"/how-to-convert-pcm-to-wav-with-ffmpeg/"},"frontmatter":{"title":"ffmpegでPCM音源をWAVE形式に変換するときにハマったこと","tags":["ffmpeg","Nodejs"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}